292 const char *base_xml_dir,
const char *xml_dir)
298 fprintf(stderr,
"import: cannot read schema `%s' (expected %s)\n",
305 lfDatabase *ldb = lf_db_new();
306 if(!ldb)
die(
"lf_db_new", NULL);
324 fprintf(stderr,
"import: warning: no baseline loaded from `%s'\n", base_xml_dir);
332 fprintf(stderr,
"import: no database loaded from `%s'\n", xml_dir);
336 else if(lf_db_load(ldb) == LF_NO_ERROR)
341 fprintf(stderr,
"import: no lensfun database found\n");
345 const lfCamera *
const *cameras = lf_db_get_cameras(ldb);
346 const lfLens *
const *lenses = lf_db_get_lenses(ldb);
347 const lfMount *
const *mounts = lf_db_get_mounts(ldb);
352 snprintf(tmp_path,
sizeof(tmp_path),
"%s.tmp-%ld", out_path, (
long)getpid());
356 if(sqlite3_open_v2(tmp_path, &db, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, NULL) != SQLITE_OK)
357 die(
"open output", db);
367 sqlite3_stmt *ins_meta =
prep(db,
"INSERT INTO meta(key, value) VALUES (?1, ?2)");
368 sqlite3_stmt *sel_mount =
prep(db,
"SELECT id FROM mount WHERE name = ?1");
369 sqlite3_stmt *ins_mount =
prep(db,
"INSERT INTO mount(name) VALUES (?1)");
370 sqlite3_stmt *ins_compat =
prep(db,
"INSERT OR IGNORE INTO mount_compat(mount_id, compat_id) VALUES (?1, ?2)");
371 sqlite3_stmt *ins_cam =
prep(db,
"INSERT INTO camera(maker, model, variant, mount_id, crop_factor)"
372 " VALUES (?1, ?2, ?3, ?4, ?5)");
373 sqlite3_stmt *ins_cam_name =
prep(db,
"INSERT INTO camera_name(camera_id, kind, lang, value, norm)"
374 " VALUES (?1, ?2, ?3, ?4, ?5)");
375 sqlite3_stmt *ins_lens =
prep(db,
"INSERT INTO lens(maker, model, type, crop_factor, aspect_ratio,"
376 " center_x, center_y, min_focal, max_focal, min_aperture, max_aperture)"
377 " VALUES (?1,?2,?3,?4,?5,?6,?7,?8,?9,?10,?11)");
378 sqlite3_stmt *ins_lens_name =
prep(db,
"INSERT INTO lens_name(lens_id, kind, lang, value, norm, tokens)"
379 " VALUES (?1, ?2, ?3, ?4, ?5, ?6)");
380 sqlite3_stmt *ins_token =
prep(db,
"INSERT INTO lens_token(lens_id, kind, token)"
381 " VALUES (?1, ?2, ?3)");
382 sqlite3_stmt *ins_lens_mount =
prep(db,
"INSERT OR IGNORE INTO lens_mount(lens_id, mount_id) VALUES (?1, ?2)");
383 sqlite3_stmt *ins_dist =
prep(db,
"INSERT INTO calib_distortion(lens_id, ord, model, focal, t0, t1, t2)"
384 " VALUES (?1,?2,?3,?4,?5,?6,?7)");
385 sqlite3_stmt *ins_tca =
prep(db,
"INSERT INTO calib_tca(lens_id, ord, model, focal, t0,t1,t2,t3,t4,t5)"
386 " VALUES (?1,?2,?3,?4,?5,?6,?7,?8,?9,?10)");
387 sqlite3_stmt *ins_vig =
prep(db,
"INSERT INTO calib_vignetting(lens_id, ord, model, focal, aperture,"
388 " distance, t0, t1, t2) VALUES (?1,?2,?3,?4,?5,?6,?7,?8,?9)");
389 sqlite3_stmt *ins_real_focal =
prep(db,
"INSERT INTO lens_real_focal(lens_id, focal, real_focal)"
390 " VALUES (?1, ?2, ?3)");
394 for(
const lfMount *
const *m = mounts; m && *m; m++, n_mounts++)
395 mount_id_for(db, sel_mount, ins_mount, lf_mlstr_get((*m)->Name));
397 for(
const lfMount *
const *m = mounts; m && *m; m++)
399 const long long id =
mount_id_for(db, sel_mount, ins_mount, lf_mlstr_get((*m)->Name));
400 if(!
id || !(*m)->Compat)
continue;
401 for(
char **c = (*m)->Compat; *c; c++)
403 const long long cid =
mount_id_for(db, sel_mount, ins_mount, *c);
405 sqlite3_bind_int64(ins_compat, 1,
id);
406 sqlite3_bind_int64(ins_compat, 2, cid);
412 for(
const lfCamera *
const *c = cameras; c && *c; c++, n_cameras++)
414 const lfCamera *cam = *c;
415 const long long mid =
mount_id_for(db, sel_mount, ins_mount, cam->Mount);
417 sqlite3_bind_text(ins_cam, 1, lf_mlstr_get(cam->Maker), -1, SQLITE_TRANSIENT);
418 sqlite3_bind_text(ins_cam, 2, lf_mlstr_get(cam->Model), -1, SQLITE_TRANSIENT);
419 if(cam->Variant) sqlite3_bind_text(ins_cam, 3, lf_mlstr_get(cam->Variant), -1, SQLITE_TRANSIENT);
420 else sqlite3_bind_null(ins_cam, 3);
421 if(mid) sqlite3_bind_int64(ins_cam, 4, mid);
else sqlite3_bind_null(ins_cam, 4);
422 sqlite3_bind_double(ins_cam, 5, cam->CropFactor);
425 const long long id = sqlite3_last_insert_rowid(db);
426 name_ctx_t ctx = { db, ins_cam_name, NULL, id,
"maker" };
432 int n_lenses = 0, n_dist = 0, n_tca = 0, n_vig = 0;
433 for(
const lfLens *
const *l = lenses; l && *l; l++, n_lenses++)
435 const lfLens *lens = *l;
437 sqlite3_bind_text(ins_lens, 1, lf_mlstr_get(lens->Maker), -1, SQLITE_TRANSIENT);
438 sqlite3_bind_text(ins_lens, 2, lf_mlstr_get(lens->Model), -1, SQLITE_TRANSIENT);
439 sqlite3_bind_int(ins_lens, 3,
lens_type(lens->Type));
440 sqlite3_bind_double(ins_lens, 4, lens->CropFactor);
441 sqlite3_bind_double(ins_lens, 5, lens->AspectRatio);
442 sqlite3_bind_double(ins_lens, 6, lens->CenterX);
443 sqlite3_bind_double(ins_lens, 7, lens->CenterY);
444 sqlite3_bind_double(ins_lens, 8, lens->MinFocal);
445 sqlite3_bind_double(ins_lens, 9, lens->MaxFocal);
446 sqlite3_bind_double(ins_lens, 10, lens->MinAperture);
447 sqlite3_bind_double(ins_lens, 11, lens->MaxAperture);
450 const long long id = sqlite3_last_insert_rowid(db);
452 name_ctx_t ctx = { db, ins_lens_name, ins_token, id,
"maker" };
458 for(
char **m = lens->Mounts; *m; m++)
460 const long long mid =
mount_id_for(db, sel_mount, ins_mount, *m);
462 sqlite3_bind_int64(ins_lens_mount, 1,
id);
463 sqlite3_bind_int64(ins_lens_mount, 2, mid);
467 if(lens->CalibDistortion)
468 for(lfLensCalibDistortion **c = lens->CalibDistortion; *c; c++, n_dist++)
470 sqlite3_bind_int64(ins_dist, 1,
id);
471 sqlite3_bind_int(ins_dist, 2, (
int)(c - lens->CalibDistortion));
472 sqlite3_bind_int(ins_dist, 3,
dist_model((*c)->Model));
473 sqlite3_bind_double(ins_dist, 4, (*c)->Focal);
474 for(
int t = 0; t < 3; t++) sqlite3_bind_double(ins_dist, 5 + t, (*c)->Terms[t]);
479 for(lfLensCalibTCA **c = lens->CalibTCA; *c; c++, n_tca++)
481 sqlite3_bind_int64(ins_tca, 1,
id);
482 sqlite3_bind_int(ins_tca, 2, (
int)(c - lens->CalibTCA));
483 sqlite3_bind_int(ins_tca, 3,
tca_model((*c)->Model));
484 sqlite3_bind_double(ins_tca, 4, (*c)->Focal);
485 for(
int t = 0; t < 6; t++) sqlite3_bind_double(ins_tca, 5 + t, (*c)->Terms[t]);
489 if(lens->CalibVignetting)
490 for(lfLensCalibVignetting **c = lens->CalibVignetting; *c; c++, n_vig++)
492 sqlite3_bind_int64(ins_vig, 1,
id);
493 sqlite3_bind_int(ins_vig, 2, (
int)(c - lens->CalibVignetting));
495 sqlite3_bind_double(ins_vig, 4, (*c)->Focal);
496 sqlite3_bind_double(ins_vig, 5, (*c)->Aperture);
497 sqlite3_bind_double(ins_vig, 6, (*c)->Distance);
498 for(
int t = 0; t < 3; t++) sqlite3_bind_double(ins_vig, 7 + t, (*c)->Terms[t]);
506 if(lens->CalibRealFocal)
507 for(lfLensCalibRealFocal **c = lens->CalibRealFocal; *c; c++)
509 if((*c)->RealFocal == 0.f)
continue;
510 sqlite3_bind_int64(ins_real_focal, 1,
id);
511 sqlite3_bind_double(ins_real_focal, 2, (*c)->Focal);
512 sqlite3_bind_double(ins_real_focal, 3, (*c)->RealFocal);
520 const time_t now = time(NULL);
526 const struct tm *tm_utc = gmtime(&now);
528 strftime(buf,
sizeof(buf),
"%Y-%m-%dT%H:%M:%SZ", tm_utc);
530 snprintf(buf,
sizeof(buf),
"unknown");
533 snprintf(lf_version,
sizeof(lf_version),
"lensfun %d.%d.%d.%d",
534 LF_VERSION_MAJOR, LF_VERSION_MINOR, LF_VERSION_MICRO, LF_VERSION_BUGFIX);
536 const struct {
const char *k;
const char *v; } rows[] = {
537 {
"built_utc", buf },
538 {
"source", xml_dir ? xml_dir :
"system lensfun database" },
539 {
"importer", lf_version },
541 for(
size_t i = 0; i <
sizeof(rows) /
sizeof(rows[0]); i++)
543 sqlite3_bind_text(ins_meta, 1, rows[i].k, -1, SQLITE_STATIC);
544 sqlite3_bind_text(ins_meta, 2, rows[i].v, -1, SQLITE_TRANSIENT);
551 exec_or_die(db,
"INSERT INTO token_df(kind, token, df)"
552 " SELECT kind, token, COUNT(DISTINCT lens_id) FROM lens_token"
553 " GROUP BY kind, token");
561 sqlite3_finalize(ins_meta);
562 sqlite3_finalize(sel_mount);
563 sqlite3_finalize(ins_mount);
564 sqlite3_finalize(ins_compat);
565 sqlite3_finalize(ins_cam);
566 sqlite3_finalize(ins_cam_name);
567 sqlite3_finalize(ins_lens);
568 sqlite3_finalize(ins_lens_name);
569 sqlite3_finalize(ins_token);
570 sqlite3_finalize(ins_lens_mount);
571 sqlite3_finalize(ins_dist);
572 sqlite3_finalize(ins_real_focal);
573 sqlite3_finalize(ins_tca);
574 sqlite3_finalize(ins_vig);
575 if(sqlite3_close(db) != SQLITE_OK)
die(
"close output", db);
590 if(rename(tmp_path, out_path) != 0)
592 fprintf(stderr,
"import: cannot rename `%s' to `%s': %s\n",
593 tmp_path, out_path, strerror(errno));
598 printf(
"import: %d mounts, %d cameras, %d lenses "
599 "(%d distortion, %d tca, %d vignetting calibrations) -> %s\n",
600 n_mounts, n_cameras, n_lenses, n_dist, n_tca, n_vig, out_path);