// helper used to synch a single history item with db int dt_dev_write_history_item(const dt_image_t *image, dt_dev_history_item_t *h, int32_t num) { if(!image) return 1; sqlite3_stmt *stmt; DT_DEBUG_SQLITE3_PREPARE_V2(dt_database_get(darktable.db), "select num from history where imgid = ?1 and num = ?2", -1, &stmt, NULL); DT_DEBUG_SQLITE3_BIND_INT(stmt, 1, image->id); DT_DEBUG_SQLITE3_BIND_INT(stmt, 2, num); if(sqlite3_step(stmt) != SQLITE_ROW) { sqlite3_finalize(stmt); DT_DEBUG_SQLITE3_PREPARE_V2(dt_database_get(darktable.db), "insert into history (imgid, num) values (?1, ?2)", -1, &stmt, NULL); DT_DEBUG_SQLITE3_BIND_INT(stmt, 1, image->id); DT_DEBUG_SQLITE3_BIND_INT(stmt, 2, num); sqlite3_step (stmt); } // printf("[dev write history item] writing %d - %s params %f %f\n", h->module->instance, h->module->op, *(float *)h->params, *(((float *)h->params)+1)); sqlite3_finalize (stmt); DT_DEBUG_SQLITE3_PREPARE_V2(dt_database_get(darktable.db), "update history set operation = ?1, op_params = ?2, module = ?3, enabled = ?4, blendop_params = ?7, blendop_version = ?8 where imgid = ?5 and num = ?6", -1, &stmt, NULL); DT_DEBUG_SQLITE3_BIND_TEXT(stmt, 1, h->module->op, strlen(h->module->op), SQLITE_TRANSIENT); DT_DEBUG_SQLITE3_BIND_BLOB(stmt, 2, h->params, h->module->params_size, SQLITE_TRANSIENT); DT_DEBUG_SQLITE3_BIND_INT(stmt, 3, h->module->version()); DT_DEBUG_SQLITE3_BIND_INT(stmt, 4, h->enabled); DT_DEBUG_SQLITE3_BIND_INT(stmt, 5, image->id); DT_DEBUG_SQLITE3_BIND_INT(stmt, 6, num); DT_DEBUG_SQLITE3_BIND_BLOB(stmt, 7, h->blend_params, sizeof(dt_develop_blend_params_t), SQLITE_TRANSIENT); DT_DEBUG_SQLITE3_BIND_INT(stmt, 8, dt_develop_blend_version()); sqlite3_step (stmt); sqlite3_finalize (stmt); return 0; }
static void dt_add_hist (int imgid, char *operation, dt_iop_params_t *params, int params_size, char *imported, size_t imported_len, int version, int *import_count) { int32_t num = 0; dt_develop_blend_params_t blend_params; memset(&blend_params, 0, sizeof(dt_develop_blend_params_t)); // get current num if any sqlite3_stmt *stmt; DT_DEBUG_SQLITE3_PREPARE_V2(dt_database_get(darktable.db), "select count(num) from history where imgid = ?1", -1, &stmt, NULL); DT_DEBUG_SQLITE3_BIND_INT(stmt, 1, imgid); if(sqlite3_step(stmt) == SQLITE_ROW) { num = sqlite3_column_int(stmt, 0); } sqlite3_finalize(stmt); // add new history info DT_DEBUG_SQLITE3_PREPARE_V2(dt_database_get(darktable.db), "insert into history (imgid, num, module, operation, op_params, enabled, blendop_params, blendop_version) values (?1, ?2, ?3, ?4, ?5, 1, ?6, ?7)", -1, &stmt, NULL); DT_DEBUG_SQLITE3_BIND_INT(stmt, 1, imgid); DT_DEBUG_SQLITE3_BIND_INT(stmt, 2, num); DT_DEBUG_SQLITE3_BIND_INT(stmt, 3, version); DT_DEBUG_SQLITE3_BIND_TEXT(stmt, 4, operation, -1, SQLITE_TRANSIENT); DT_DEBUG_SQLITE3_BIND_BLOB(stmt, 5, params, params_size, SQLITE_TRANSIENT); DT_DEBUG_SQLITE3_BIND_BLOB(stmt, 6, &blend_params, sizeof(dt_develop_blend_params_t), SQLITE_TRANSIENT); DT_DEBUG_SQLITE3_BIND_INT(stmt, 7, LRDT_BLEND_VERSION); sqlite3_step (stmt); sqlite3_finalize (stmt); if (imported[0]) g_strlcat(imported, ", ", imported_len); g_strlcat(imported, dt_iop_get_localized_name(operation), imported_len); (*import_count)++; }
static void dt_style_plugin_save(StylePluginData *plugin,gpointer styleId) { int id = GPOINTER_TO_INT(styleId); sqlite3_stmt *stmt; DT_DEBUG_SQLITE3_PREPARE_V2(dt_database_get(darktable.db), "insert into style_items (styleid,num,module,operation,op_params,enabled,blendop_params,blendop_version,multi_priority,multi_name) values(?1,?2,?3,?4,?5,?6,?7,?8,?9,?10)", -1, &stmt, NULL); DT_DEBUG_SQLITE3_BIND_INT(stmt, 1, id); DT_DEBUG_SQLITE3_BIND_INT(stmt, 2, plugin->num); DT_DEBUG_SQLITE3_BIND_INT(stmt, 3, plugin->module); DT_DEBUG_SQLITE3_BIND_TEXT(stmt, 4, plugin->operation->str, plugin->operation->len, SQLITE_TRANSIENT); // const char *param_c = plugin->op_params->str; const int param_c_len = strlen(param_c); int params_len = 0; unsigned char *params = dt_exif_xmp_decode(param_c, param_c_len, ¶ms_len); DT_DEBUG_SQLITE3_BIND_BLOB(stmt, 5, params, params_len, SQLITE_TRANSIENT); // DT_DEBUG_SQLITE3_BIND_INT(stmt, 6, plugin->enabled); /* decode and store blendop params */ int blendop_params_len = 0; unsigned char *blendop_params = dt_exif_xmp_decode(plugin->blendop_params->str, strlen(plugin->blendop_params->str), &blendop_params_len); DT_DEBUG_SQLITE3_BIND_BLOB(stmt, 7, blendop_params, blendop_params_len, SQLITE_TRANSIENT); DT_DEBUG_SQLITE3_BIND_INT(stmt, 8, plugin->blendop_version); DT_DEBUG_SQLITE3_BIND_INT(stmt, 9, plugin->multi_priority); DT_DEBUG_SQLITE3_BIND_TEXT(stmt, 10, plugin->multi_name->str, plugin->multi_name->len, SQLITE_TRANSIENT); sqlite3_step(stmt); sqlite3_finalize(stmt); free(params); }
static void menuitem_new_preset (GtkMenuItem *menuitem, dt_lib_module_info_t *minfo) { // add new preset sqlite3_stmt *stmt; DT_DEBUG_SQLITE3_PREPARE_V2(dt_database_get(darktable.db), "delete from presets where name=?1 and operation=?2 and op_version=?3", -1, &stmt, NULL); DT_DEBUG_SQLITE3_BIND_TEXT(stmt, 1, _("new preset"), strlen(_("new preset")), SQLITE_STATIC); DT_DEBUG_SQLITE3_BIND_TEXT(stmt, 2, minfo->plugin_name, strlen(minfo->plugin_name), SQLITE_TRANSIENT); DT_DEBUG_SQLITE3_BIND_INT(stmt, 3, minfo->version); sqlite3_step(stmt); sqlite3_finalize(stmt); DT_DEBUG_SQLITE3_PREPARE_V2(dt_database_get(darktable.db), "insert into presets (name, description, operation, op_version, op_params, blendop_params, blendop_version, enabled, model, maker, lens, " "iso_min, iso_max, exposure_min, exposure_max, aperture_min, aperture_max, focal_length_min, focal_length_max, writeprotect, " "autoapply, filter, def, isldr) values (?1, '', ?2, ?3, ?4, null, 0, 1, '%', '%', '%', 0, 51200, 0, 100000000, 0, 100000000, 0, 1000, 0, 0, 0, 0, 0)", -1, &stmt, NULL); DT_DEBUG_SQLITE3_BIND_TEXT(stmt, 1, _("new preset"), strlen(_("new preset")), SQLITE_STATIC); DT_DEBUG_SQLITE3_BIND_TEXT(stmt, 2, minfo->plugin_name, strlen(minfo->plugin_name), SQLITE_TRANSIENT); DT_DEBUG_SQLITE3_BIND_INT(stmt, 3, minfo->version); DT_DEBUG_SQLITE3_BIND_BLOB(stmt, 4, minfo->params, minfo->params_size, SQLITE_TRANSIENT); sqlite3_step(stmt); sqlite3_finalize(stmt); // create a shortcut for the new entry char path[1024]; snprintf(path,1024,"%s/%s",_("preset"), _("new preset")); dt_accel_register_lib(minfo->module,path,0,0); dt_accel_connect_preset_lib(minfo->module,_("new preset")); // then show edit dialog edit_preset (_("new preset"), minfo); }
void dt_image_set_flip(const int32_t imgid, const int32_t orientation) { sqlite3_stmt *stmt; // push new orientation to sql via additional history entry: DT_DEBUG_SQLITE3_PREPARE_V2(dt_database_get(darktable.db), "select MAX(num) from history where imgid = ?1", -1, &stmt, NULL); DT_DEBUG_SQLITE3_BIND_INT(stmt, 1, imgid); int num = 0; if(sqlite3_step(stmt) == SQLITE_ROW) { num = 1 + sqlite3_column_int(stmt, 0); } sqlite3_finalize(stmt); DT_DEBUG_SQLITE3_PREPARE_V2(dt_database_get(darktable.db), "insert into history (imgid, num, module, operation, op_params, enabled, " "blendop_params, blendop_version) values" " (?1, ?2, 1, 'flip', ?3, 1, null, 0) ", -1, &stmt, NULL); DT_DEBUG_SQLITE3_BIND_INT(stmt, 1, imgid); DT_DEBUG_SQLITE3_BIND_INT(stmt, 2, num); DT_DEBUG_SQLITE3_BIND_BLOB(stmt, 3, &orientation, sizeof(int32_t), SQLITE_TRANSIENT); sqlite3_step (stmt); sqlite3_finalize(stmt); dt_mipmap_cache_remove(darktable.mipmap_cache, imgid); // write that through to xmp: dt_image_write_sidecar_file(imgid); }
void dt_lib_presets_add(const char *name, const char *plugin_name, const int32_t version, const void *params, const int32_t params_size) { sqlite3_stmt *stmt; DT_DEBUG_SQLITE3_PREPARE_V2(dt_database_get(darktable.db), "DELETE FROM data.presets WHERE name=?1 AND operation=?2 AND op_version=?3", -1, &stmt, NULL); DT_DEBUG_SQLITE3_BIND_TEXT(stmt, 1, name, -1, SQLITE_TRANSIENT); DT_DEBUG_SQLITE3_BIND_TEXT(stmt, 2, plugin_name, -1, SQLITE_TRANSIENT); DT_DEBUG_SQLITE3_BIND_INT(stmt, 3, version); sqlite3_step(stmt); sqlite3_finalize(stmt); DT_DEBUG_SQLITE3_PREPARE_V2(dt_database_get(darktable.db), "INSERT INTO data.presets (name, description, operation, op_version, op_params, " "blendop_params, blendop_version, enabled, model, maker, lens, " "iso_min, iso_max, exposure_min, exposure_max, aperture_min, aperture_max, " "focal_length_min, focal_length_max, writeprotect, " "autoapply, filter, def, format) VALUES (?1, '', ?2, ?3, ?4, NULL, 0, 1, '%', " "'%', '%', 0, 51200, 0, 10000000, 0, 100000000, 0, 1000, 1, 0, 0, 0, 0)", -1, &stmt, NULL); DT_DEBUG_SQLITE3_BIND_TEXT(stmt, 1, name, -1, SQLITE_TRANSIENT); DT_DEBUG_SQLITE3_BIND_TEXT(stmt, 2, plugin_name, -1, SQLITE_TRANSIENT); DT_DEBUG_SQLITE3_BIND_INT(stmt, 3, version); DT_DEBUG_SQLITE3_BIND_BLOB(stmt, 4, params, params_size, SQLITE_TRANSIENT); sqlite3_step(stmt); sqlite3_finalize(stmt); }
void dt_similarity_lightmap_store(uint32_t imgid, const dt_similarity_lightmap_t *lightmap) { sqlite3_stmt *stmt; DT_DEBUG_SQLITE3_PREPARE_V2(dt_database_get(darktable.db), "update images set lightmap =?1 where id = ?2", -1, &stmt, NULL); DT_DEBUG_SQLITE3_BIND_BLOB(stmt, 1, lightmap,sizeof(dt_similarity_lightmap_t),SQLITE_TRANSIENT); DT_DEBUG_SQLITE3_BIND_INT(stmt, 2, imgid); sqlite3_step(stmt); sqlite3_finalize (stmt); }
void dt_similarity_histogram_store(uint32_t imgid, const dt_similarity_histogram_t *histogram) { sqlite3_stmt *stmt; DT_DEBUG_SQLITE3_PREPARE_V2(dt_database_get(darktable.db), "update images set histogram =?1 where id = ?2", -1, &stmt, NULL); DT_DEBUG_SQLITE3_BIND_BLOB(stmt, 1, histogram,sizeof(dt_similarity_histogram_t),SQLITE_TRANSIENT); DT_DEBUG_SQLITE3_BIND_INT(stmt, 2, imgid); sqlite3_step(stmt); sqlite3_finalize (stmt); #ifdef _DEBUG _similarity_dump_histogram(imgid,histogram); #endif }
static void menuitem_update_preset(GtkMenuItem *menuitem, dt_iop_module_t *module) { gchar *name = get_preset_name(menuitem); // commit all the module fields sqlite3_stmt *stmt; DT_DEBUG_SQLITE3_PREPARE_V2(dt_database_get(darktable.db), "UPDATE presets SET op_version=?2, op_params=?3, enabled=?4, " "blendop_params=?5, blendop_version=?6 WHERE name=?7 AND operation=?1", -1, &stmt, NULL); DT_DEBUG_SQLITE3_BIND_TEXT(stmt, 1, module->op, -1, SQLITE_TRANSIENT); DT_DEBUG_SQLITE3_BIND_INT(stmt, 2, module->version()); DT_DEBUG_SQLITE3_BIND_BLOB(stmt, 3, module->params, module->params_size, SQLITE_TRANSIENT); DT_DEBUG_SQLITE3_BIND_INT(stmt, 4, module->enabled); DT_DEBUG_SQLITE3_BIND_BLOB(stmt, 5, module->blend_params, sizeof(dt_develop_blend_params_t), SQLITE_TRANSIENT); DT_DEBUG_SQLITE3_BIND_INT(stmt, 6, dt_develop_blend_version()); DT_DEBUG_SQLITE3_BIND_TEXT(stmt, 7, name, -1, SQLITE_TRANSIENT); sqlite3_step(stmt); sqlite3_finalize(stmt); }
void dt_gui_presets_add_generic(const char *name, dt_dev_operation_t op, const int32_t version, const void *params, const int32_t params_size, const int32_t enabled) { sqlite3_stmt *stmt; dt_develop_blend_params_t default_blendop_params = { DEVELOP_MASK_DISABLED, DEVELOP_BLEND_NORMAL2, 100.0f, DEVELOP_COMBINE_NORM_EXCL, 0, 0, 0.0f, { 0, 0, 0, 0 }, { 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f } }; DT_DEBUG_SQLITE3_PREPARE_V2( dt_database_get(darktable.db), "INSERT OR REPLACE INTO presets (name, description, operation, op_version, op_params, enabled, " "blendop_params, blendop_version, multi_priority, multi_name, model, maker, lens, " "iso_min, iso_max, exposure_min, exposure_max, aperture_min, aperture_max, focal_length_min, " "focal_length_max, " "writeprotect, autoapply, filter, def, format) " "VALUES (?1, '', ?2, ?3, ?4, ?5, ?6, ?7, 0, '', '%', '%', '%', 0, 51200, 0, 10000000, 0, 100000000, 0, " "1000, 1, 0, 0, 0, 0)", -1, &stmt, NULL); DT_DEBUG_SQLITE3_BIND_TEXT(stmt, 1, name, -1, SQLITE_TRANSIENT); DT_DEBUG_SQLITE3_BIND_TEXT(stmt, 2, op, -1, SQLITE_TRANSIENT); DT_DEBUG_SQLITE3_BIND_INT(stmt, 3, version); DT_DEBUG_SQLITE3_BIND_BLOB(stmt, 4, params, params_size, SQLITE_TRANSIENT); DT_DEBUG_SQLITE3_BIND_INT(stmt, 5, enabled); DT_DEBUG_SQLITE3_BIND_BLOB(stmt, 6, &default_blendop_params, sizeof(dt_develop_blend_params_t), SQLITE_TRANSIENT); DT_DEBUG_SQLITE3_BIND_INT(stmt, 7, dt_develop_blend_version()); sqlite3_step(stmt); sqlite3_finalize(stmt); }
// drops the write privileges on an image struct. // this triggers a write-through to sql, and if the setting // is present, also to xmp sidecar files (safe setting). void dt_image_cache_write_release(dt_image_cache_t *cache, dt_image_t *img, dt_image_cache_write_mode_t mode) { if(img->id <= 0) return; sqlite3_stmt *stmt; DT_DEBUG_SQLITE3_PREPARE_V2( dt_database_get(darktable.db), "UPDATE main.images SET width = ?1, height = ?2, maker = ?3, model = ?4, " "lens = ?5, exposure = ?6, aperture = ?7, iso = ?8, focal_length = ?9, " "focus_distance = ?10, film_id = ?11, datetime_taken = ?12, flags = ?13, " "crop = ?14, orientation = ?15, raw_parameters = ?16, group_id = ?17, longitude = ?18, " "latitude = ?19, altitude = ?20, color_matrix = ?21, colorspace = ?22, raw_black = ?23, " "raw_maximum = ?24 WHERE id = ?25", -1, &stmt, NULL); DT_DEBUG_SQLITE3_BIND_INT(stmt, 1, img->width); DT_DEBUG_SQLITE3_BIND_INT(stmt, 2, img->height); DT_DEBUG_SQLITE3_BIND_TEXT(stmt, 3, img->exif_maker, -1, SQLITE_STATIC); DT_DEBUG_SQLITE3_BIND_TEXT(stmt, 4, img->exif_model, -1, SQLITE_STATIC); DT_DEBUG_SQLITE3_BIND_TEXT(stmt, 5, img->exif_lens, -1, SQLITE_STATIC); DT_DEBUG_SQLITE3_BIND_DOUBLE(stmt, 6, img->exif_exposure); DT_DEBUG_SQLITE3_BIND_DOUBLE(stmt, 7, img->exif_aperture); DT_DEBUG_SQLITE3_BIND_DOUBLE(stmt, 8, img->exif_iso); DT_DEBUG_SQLITE3_BIND_DOUBLE(stmt, 9, img->exif_focal_length); DT_DEBUG_SQLITE3_BIND_DOUBLE(stmt, 10, img->exif_focus_distance); DT_DEBUG_SQLITE3_BIND_INT(stmt, 11, img->film_id); DT_DEBUG_SQLITE3_BIND_TEXT(stmt, 12, img->exif_datetime_taken, -1, SQLITE_STATIC); DT_DEBUG_SQLITE3_BIND_INT(stmt, 13, img->flags); DT_DEBUG_SQLITE3_BIND_DOUBLE(stmt, 14, img->exif_crop); DT_DEBUG_SQLITE3_BIND_INT(stmt, 15, img->orientation); DT_DEBUG_SQLITE3_BIND_INT(stmt, 16, *(uint32_t *)(&img->legacy_flip)); DT_DEBUG_SQLITE3_BIND_INT(stmt, 17, img->group_id); DT_DEBUG_SQLITE3_BIND_DOUBLE(stmt, 18, img->longitude); DT_DEBUG_SQLITE3_BIND_DOUBLE(stmt, 19, img->latitude); DT_DEBUG_SQLITE3_BIND_DOUBLE(stmt, 20, img->elevation); DT_DEBUG_SQLITE3_BIND_BLOB(stmt, 21, &img->d65_color_matrix, sizeof(img->d65_color_matrix), SQLITE_STATIC); DT_DEBUG_SQLITE3_BIND_INT(stmt, 22, img->colorspace); DT_DEBUG_SQLITE3_BIND_INT(stmt, 23, img->raw_black_level); DT_DEBUG_SQLITE3_BIND_INT(stmt, 24, img->raw_white_point); DT_DEBUG_SQLITE3_BIND_INT(stmt, 25, img->id); int rc = sqlite3_step(stmt); if(rc != SQLITE_DONE) fprintf(stderr, "[image_cache_write_release] sqlite3 error %d\n", rc); sqlite3_finalize(stmt); // TODO: make this work in relaxed mode, too. if(mode == DT_IMAGE_CACHE_SAFE) { // rest about sidecars: // also synch dttags file: dt_image_write_sidecar_file(img->id); } dt_cache_release(&cache->cache, img->cache_entry); }
static void dt_add_hist(int imgid, char *operation, dt_iop_params_t *params, int params_size, char *imported, size_t imported_len, int version, int *import_count) { int32_t num = 0; dt_develop_blend_params_t blend_params = { 0 }; // get current num if any sqlite3_stmt *stmt; DT_DEBUG_SQLITE3_PREPARE_V2(dt_database_get(darktable.db), "SELECT count(num) FROM history WHERE imgid = ?1", -1, &stmt, NULL); DT_DEBUG_SQLITE3_BIND_INT(stmt, 1, imgid); if(sqlite3_step(stmt) == SQLITE_ROW) { num = sqlite3_column_int(stmt, 0); } sqlite3_finalize(stmt); // add new history info DT_DEBUG_SQLITE3_PREPARE_V2(dt_database_get(darktable.db), "INSERT INTO history (imgid, num, module, operation, op_params, enabled, " "blendop_params, blendop_version, multi_priority, multi_name) " "VALUES (?1, ?2, ?3, ?4, ?5, 1, ?6, ?7, 0, ' ')", -1, &stmt, NULL); DT_DEBUG_SQLITE3_BIND_INT(stmt, 1, imgid); DT_DEBUG_SQLITE3_BIND_INT(stmt, 2, num); DT_DEBUG_SQLITE3_BIND_INT(stmt, 3, version); DT_DEBUG_SQLITE3_BIND_TEXT(stmt, 4, operation, -1, SQLITE_TRANSIENT); DT_DEBUG_SQLITE3_BIND_BLOB(stmt, 5, params, params_size, SQLITE_TRANSIENT); DT_DEBUG_SQLITE3_BIND_BLOB(stmt, 6, &blend_params, sizeof(dt_develop_blend_params_t), SQLITE_TRANSIENT); DT_DEBUG_SQLITE3_BIND_INT(stmt, 7, LRDT_BLEND_VERSION); sqlite3_step(stmt); sqlite3_finalize(stmt); if(imported[0]) g_strlcat(imported, ", ", imported_len); g_strlcat(imported, dt_iop_get_localized_name(operation), imported_len); (*import_count)++; }
static void menuitem_update_preset (GtkMenuItem *menuitem, dt_lib_module_info_t *minfo) { gchar *name = get_preset_name(menuitem); // commit all the module fields sqlite3_stmt *stmt; DT_DEBUG_SQLITE3_PREPARE_V2(dt_database_get(darktable.db), "update presets set operation=?1, op_version=?2, op_params=?3 where name=?4", -1, &stmt, NULL); DT_DEBUG_SQLITE3_BIND_TEXT(stmt, 1, minfo->plugin_name, strlen(minfo->plugin_name), SQLITE_TRANSIENT); DT_DEBUG_SQLITE3_BIND_INT(stmt, 2, minfo->version); DT_DEBUG_SQLITE3_BIND_BLOB(stmt, 3, minfo->params, minfo->params_size, SQLITE_TRANSIENT); DT_DEBUG_SQLITE3_BIND_TEXT(stmt, 4, name, strlen(name), SQLITE_TRANSIENT); sqlite3_step(stmt); sqlite3_finalize(stmt); }
void dt_lib_presets_add(const char *name, const char *plugin_name, const int32_t version, const void *params, const int32_t params_size) { sqlite3_stmt *stmt; DT_DEBUG_SQLITE3_PREPARE_V2(dt_database_get(darktable.db), "delete from presets where name=?1 and operation=?2 and op_version=?3", -1, &stmt, NULL); DT_DEBUG_SQLITE3_BIND_TEXT(stmt, 1, name, strlen(name), SQLITE_TRANSIENT); DT_DEBUG_SQLITE3_BIND_TEXT(stmt, 2, plugin_name, strlen(plugin_name), SQLITE_TRANSIENT); DT_DEBUG_SQLITE3_BIND_INT(stmt, 3, version); sqlite3_step(stmt); sqlite3_finalize(stmt); DT_DEBUG_SQLITE3_PREPARE_V2(dt_database_get(darktable.db), "insert into presets (name, description, operation, op_version, op_params, blendop_params, blendop_version, enabled, model, maker, lens, " "iso_min, iso_max, exposure_min, exposure_max, aperture_min, aperture_max, focal_length_min, focal_length_max, writeprotect, " "autoapply, filter, def, isldr) values (?1, '', ?2, ?3, ?4, null, 0, 1, '%', '%', '%', 0, 51200, 0, 10000000, 0, 100000000, 0, 1000, 1, 0, 0, 0, 0)", -1, &stmt, NULL); DT_DEBUG_SQLITE3_BIND_TEXT(stmt, 1, name, strlen(name), SQLITE_TRANSIENT); DT_DEBUG_SQLITE3_BIND_TEXT(stmt, 2, plugin_name, strlen(plugin_name), SQLITE_TRANSIENT); DT_DEBUG_SQLITE3_BIND_INT(stmt, 3, version); DT_DEBUG_SQLITE3_BIND_BLOB(stmt, 4, params, params_size, SQLITE_TRANSIENT); sqlite3_step(stmt); sqlite3_finalize(stmt); }
void dt_lib_init_presets(dt_lib_module_t *module) { // since lighttable presets can't end up in styles or any other place outside of the presets table it is // sufficient // to update that very table here and assume that everything is up to date elsewhere. // the intended logic is as follows: // - no set_params -> delete all presets // - op_version >= module_version -> done // - op_version < module_version -> // - module has legacy_params -> try to update // - module doesn't have legacy_params -> delete it if(module->set_params == NULL) { sqlite3_stmt *stmt; DT_DEBUG_SQLITE3_PREPARE_V2(dt_database_get(darktable.db), "DELETE FROM data.presets WHERE operation=?1", -1, &stmt, NULL); DT_DEBUG_SQLITE3_BIND_TEXT(stmt, 1, module->plugin_name, -1, SQLITE_TRANSIENT); sqlite3_step(stmt); sqlite3_finalize(stmt); } else { sqlite3_stmt *stmt; DT_DEBUG_SQLITE3_PREPARE_V2(dt_database_get(darktable.db), "SELECT rowid, op_version, op_params, name FROM data.presets WHERE operation=?1", -1, &stmt, NULL); DT_DEBUG_SQLITE3_BIND_TEXT(stmt, 1, module->plugin_name, -1, SQLITE_TRANSIENT); while(sqlite3_step(stmt) == SQLITE_ROW) { int rowid = sqlite3_column_int(stmt, 0); int op_version = sqlite3_column_int(stmt, 1); void *op_params = (void *)sqlite3_column_blob(stmt, 2); size_t op_params_size = sqlite3_column_bytes(stmt, 2); const char *name = (char *)sqlite3_column_text(stmt, 3); int version = module->version(module); if(op_version < version) { size_t new_params_size = 0; void *new_params = NULL; if(module->legacy_params && (new_params = _update_params(module, op_params, op_params_size, op_version, version, &new_params_size))) { // write the updated preset back to db fprintf(stderr, "[lighttable_init_presets] updating '%s' preset '%s' from version %d to version %d\n", module->plugin_name, name, op_version, version); sqlite3_stmt *innerstmt; DT_DEBUG_SQLITE3_PREPARE_V2(dt_database_get(darktable.db), "UPDATE data.presets SET op_version=?1, op_params=?2 WHERE rowid=?3", -1, &innerstmt, NULL); DT_DEBUG_SQLITE3_BIND_INT(innerstmt, 1, version); DT_DEBUG_SQLITE3_BIND_BLOB(innerstmt, 2, new_params, new_params_size, SQLITE_TRANSIENT); DT_DEBUG_SQLITE3_BIND_INT(innerstmt, 3, rowid); sqlite3_step(innerstmt); sqlite3_finalize(innerstmt); } else { // delete the preset fprintf(stderr, "[lighttable_init_presets] Can't upgrade '%s' preset '%s' from version %d to %d, " "no legacy_params() implemented or unable to update\n", module->plugin_name, name, op_version, version); sqlite3_stmt *innerstmt; DT_DEBUG_SQLITE3_PREPARE_V2(dt_database_get(darktable.db), "DELETE FROM data.presets WHERE rowid=?1", -1, &innerstmt, NULL); DT_DEBUG_SQLITE3_BIND_INT(innerstmt, 1, rowid); sqlite3_step(innerstmt); sqlite3_finalize(innerstmt); } free(new_params); } } sqlite3_finalize(stmt); } if(module->init_presets) module->init_presets(module); }
static void edit_preset_response(GtkDialog *dialog, gint response_id, dt_gui_presets_edit_dialog_t *g) { gint is_new = 0; if(response_id == GTK_RESPONSE_ACCEPT) { sqlite3_stmt *stmt; const gchar *name = gtk_entry_get_text(g->name); if(((g->old_id >= 0) && (strcmp(g->original_name, name) != 0)) || (g->old_id < 0)) { if(strcmp(_("new preset"), name) == 0 || !(name && *name)) { // show error dialog GtkWidget *window = dt_ui_main_window(darktable.gui->ui); GtkWidget *dlg_changename = gtk_message_dialog_new(GTK_WINDOW(window), GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_WARNING, GTK_BUTTONS_OK, _("please give preset a name")); gtk_window_set_title(GTK_WINDOW(dlg_changename), _("unnamed preset")); gtk_dialog_run(GTK_DIALOG(dlg_changename)); gtk_widget_destroy(dlg_changename); return; } // editing existing preset with different name or store new preset -> check for a preset with the same // name: DT_DEBUG_SQLITE3_PREPARE_V2( dt_database_get(darktable.db), "select name from presets where name = ?1 and operation=?2 and op_version=?3", -1, &stmt, NULL); DT_DEBUG_SQLITE3_BIND_TEXT(stmt, 1, name, -1, SQLITE_TRANSIENT); DT_DEBUG_SQLITE3_BIND_TEXT(stmt, 2, g->module->op, -1, SQLITE_TRANSIENT); DT_DEBUG_SQLITE3_BIND_INT(stmt, 3, g->module->version()); if(sqlite3_step(stmt) == SQLITE_ROW) { sqlite3_finalize(stmt); // show overwrite question dialog GtkWidget *window = dt_ui_main_window(darktable.gui->ui); GtkWidget *dlg_overwrite = gtk_message_dialog_new( GTK_WINDOW(window), GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_WARNING, GTK_BUTTONS_YES_NO, _("preset `%s' already exists.\ndo you want to overwrite?"), name); gtk_window_set_title(GTK_WINDOW(dlg_overwrite), _("overwrite preset?")); gint dlg_ret = gtk_dialog_run(GTK_DIALOG(dlg_overwrite)); gtk_widget_destroy(dlg_overwrite); // if result is BUTTON_NO exit without destroy dialog, to permit other name if(dlg_ret == GTK_RESPONSE_NO) return; } else { is_new = 1; sqlite3_finalize(stmt); } } if(g->old_id >= 0) { // now delete old preset: DT_DEBUG_SQLITE3_PREPARE_V2(dt_database_get(darktable.db), "delete from presets where name=?1 and operation=?2 and op_version=?3", -1, &stmt, NULL); DT_DEBUG_SQLITE3_BIND_TEXT(stmt, 1, g->original_name, -1, SQLITE_TRANSIENT); DT_DEBUG_SQLITE3_BIND_TEXT(stmt, 2, g->module->op, -1, SQLITE_TRANSIENT); DT_DEBUG_SQLITE3_BIND_INT(stmt, 3, g->module->version()); sqlite3_step(stmt); sqlite3_finalize(stmt); } if(is_new == 0) { // delete preset, so we can re-insert the new values: DT_DEBUG_SQLITE3_PREPARE_V2(dt_database_get(darktable.db), "delete from presets where name=?1 and operation=?2 and op_version=?3", -1, &stmt, NULL); DT_DEBUG_SQLITE3_BIND_TEXT(stmt, 1, name, -1, SQLITE_TRANSIENT); DT_DEBUG_SQLITE3_BIND_TEXT(stmt, 2, g->module->op, -1, SQLITE_TRANSIENT); DT_DEBUG_SQLITE3_BIND_INT(stmt, 3, g->module->version()); sqlite3_step(stmt); sqlite3_finalize(stmt); } // rename accelerators char path[1024]; snprintf(path, sizeof(path), "%s/%s", _("preset"), g->original_name); dt_accel_rename_preset_iop(g->module, path, name); // commit all the user input fields DT_DEBUG_SQLITE3_PREPARE_V2( dt_database_get(darktable.db), "INSERT INTO presets (name, description, operation, op_version, op_params, enabled, " "blendop_params, blendop_version, multi_priority, multi_name, " "model, maker, lens, iso_min, iso_max, exposure_min, exposure_max, aperture_min, aperture_max, " "focal_length_min, focal_length_max, writeprotect, autoapply, filter, def, format) " "VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, 0, '', ?9, ?10, ?11, ?12, ?13, ?14, ?15, ?16, ?17, ?18, " "?19, 0, ?20, ?21, 0, ?22)", -1, &stmt, NULL); DT_DEBUG_SQLITE3_BIND_TEXT(stmt, 1, name, -1, SQLITE_TRANSIENT); DT_DEBUG_SQLITE3_BIND_TEXT(stmt, 2, gtk_entry_get_text(g->description), -1, SQLITE_TRANSIENT); DT_DEBUG_SQLITE3_BIND_TEXT(stmt, 3, g->module->op, -1, SQLITE_TRANSIENT); DT_DEBUG_SQLITE3_BIND_INT(stmt, 4, g->module->version()); DT_DEBUG_SQLITE3_BIND_BLOB(stmt, 5, g->module->params, g->module->params_size, SQLITE_TRANSIENT); DT_DEBUG_SQLITE3_BIND_INT(stmt, 6, g->module->enabled); DT_DEBUG_SQLITE3_BIND_BLOB(stmt, 7, g->module->blend_params, sizeof(dt_develop_blend_params_t), SQLITE_TRANSIENT); DT_DEBUG_SQLITE3_BIND_INT(stmt, 8, dt_develop_blend_version()); DT_DEBUG_SQLITE3_BIND_TEXT(stmt, 9, gtk_entry_get_text(GTK_ENTRY(g->model)), -1, SQLITE_TRANSIENT); DT_DEBUG_SQLITE3_BIND_TEXT(stmt, 10, gtk_entry_get_text(GTK_ENTRY(g->maker)), -1, SQLITE_TRANSIENT); DT_DEBUG_SQLITE3_BIND_TEXT(stmt, 11, gtk_entry_get_text(GTK_ENTRY(g->lens)), -1, SQLITE_TRANSIENT); DT_DEBUG_SQLITE3_BIND_DOUBLE(stmt, 12, gtk_spin_button_get_value(GTK_SPIN_BUTTON(g->iso_min))); DT_DEBUG_SQLITE3_BIND_DOUBLE(stmt, 13, gtk_spin_button_get_value(GTK_SPIN_BUTTON(g->iso_max))); DT_DEBUG_SQLITE3_BIND_DOUBLE(stmt, 14, dt_gui_presets_exposure_value[dt_bauhaus_combobox_get(g->exposure_min)]); DT_DEBUG_SQLITE3_BIND_DOUBLE(stmt, 15, dt_gui_presets_exposure_value[dt_bauhaus_combobox_get(g->exposure_max)]); DT_DEBUG_SQLITE3_BIND_DOUBLE(stmt, 16, dt_gui_presets_aperture_value[dt_bauhaus_combobox_get(g->aperture_min)]); DT_DEBUG_SQLITE3_BIND_DOUBLE(stmt, 17, dt_gui_presets_aperture_value[dt_bauhaus_combobox_get(g->aperture_max)]); DT_DEBUG_SQLITE3_BIND_DOUBLE(stmt, 18, gtk_spin_button_get_value(GTK_SPIN_BUTTON(g->focal_length_min))); DT_DEBUG_SQLITE3_BIND_DOUBLE(stmt, 19, gtk_spin_button_get_value(GTK_SPIN_BUTTON(g->focal_length_max))); DT_DEBUG_SQLITE3_BIND_INT(stmt, 20, gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(g->autoapply))); DT_DEBUG_SQLITE3_BIND_INT(stmt, 21, gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(g->filter))); int format = 0; for(int k = 0; k < 3; k++) format += gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(g->format_btn[k])) * dt_gui_presets_format_flag[k]; DT_DEBUG_SQLITE3_BIND_INT(stmt, 22, format); sqlite3_step(stmt); sqlite3_finalize(stmt); dt_gui_store_last_preset(name); } gtk_widget_destroy(GTK_WIDGET(dialog)); g_free(g->original_name); free(g); }
static void edit_preset_response(GtkDialog *dialog, gint response_id, dt_lib_presets_edit_dialog_t *g) { gint dlg_ret; gint is_new = 0; if(response_id == GTK_RESPONSE_ACCEPT) { sqlite3_stmt *stmt; // now delete preset, so we can re-insert the new values: DT_DEBUG_SQLITE3_PREPARE_V2(dt_database_get(darktable.db), "delete from presets where name=?1 and operation=?2 and op_version=?3", -1, &stmt, NULL); DT_DEBUG_SQLITE3_BIND_TEXT(stmt, 1, g->original_name, -1, SQLITE_TRANSIENT); DT_DEBUG_SQLITE3_BIND_TEXT(stmt, 2, g->plugin_name, -1, SQLITE_TRANSIENT); DT_DEBUG_SQLITE3_BIND_INT(stmt, 3, g->version); sqlite3_step(stmt); sqlite3_finalize(stmt); if ( ((g->old_id >= 0) && (strcmp(g->original_name, gtk_entry_get_text(g->name)) != 0)) || (g->old_id < 0) ) { // editing existing preset with different name or store new preset -> check for a preset with the same name: DT_DEBUG_SQLITE3_PREPARE_V2(dt_database_get(darktable.db), "select name from presets where name = ?1 and operation=?2 and op_version=?3", -1, &stmt, NULL); DT_DEBUG_SQLITE3_BIND_TEXT(stmt, 1, gtk_entry_get_text(g->name), strlen(gtk_entry_get_text(g->name)), SQLITE_TRANSIENT); DT_DEBUG_SQLITE3_BIND_TEXT(stmt, 2, g->plugin_name, strlen(g->plugin_name), SQLITE_TRANSIENT); DT_DEBUG_SQLITE3_BIND_INT(stmt, 3, g->version); if(sqlite3_step(stmt) == SQLITE_ROW) { sqlite3_finalize(stmt); GtkWidget *window = dt_ui_main_window(darktable.gui->ui); GtkWidget *dlg_overwrite = gtk_message_dialog_new (GTK_WINDOW(window), GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_WARNING, GTK_BUTTONS_YES_NO, _("preset `%s' already exists.\ndo you want to overwrite?"), gtk_entry_get_text(g->name) ); gtk_window_set_title(GTK_WINDOW (dlg_overwrite), _("overwrite preset?")); dlg_ret = gtk_dialog_run (GTK_DIALOG (dlg_overwrite)); gtk_widget_destroy (dlg_overwrite); // if result is BUTTON_NO exit without destroy dialog, to permit other name if (dlg_ret == GTK_RESPONSE_NO) return; } else { is_new = 1; sqlite3_finalize(stmt); } } if (is_new == 0) { // delete preset, so we can re-insert the new values: DT_DEBUG_SQLITE3_PREPARE_V2(dt_database_get(darktable.db), "delete from presets where name=?1 and operation=?2 and op_version=?3", -1, &stmt, NULL); DT_DEBUG_SQLITE3_BIND_TEXT(stmt, 1, gtk_entry_get_text(g->name), strlen(gtk_entry_get_text(g->name)), SQLITE_TRANSIENT); DT_DEBUG_SQLITE3_BIND_TEXT(stmt, 2, g->plugin_name, strlen(g->plugin_name), SQLITE_TRANSIENT); DT_DEBUG_SQLITE3_BIND_INT(stmt, 3, g->version); sqlite3_step(stmt); sqlite3_finalize(stmt); } // commit all the user input fields char path[1024]; snprintf(path,1024,"preset/%s",g->original_name); dt_accel_rename_preset_lib(g->module,path,gtk_entry_get_text(g->name)); DT_DEBUG_SQLITE3_PREPARE_V2(dt_database_get(darktable.db), "insert into presets (name, description, operation, op_version, op_params, blendop_params, blendop_version, enabled, model, maker, lens, " "iso_min, iso_max, exposure_min, exposure_max, aperture_min, aperture_max, focal_length_min, focal_length_max, writeprotect, " "autoapply, filter, def, isldr) values (?1, ?2, ?3, ?4, ?5, null, 0, 1, '%', '%', '%', 0, 51200, 0, 100000000, 0, 100000000, 0, 1000, 0, 0, 0, 0, 0)", -1, &stmt, NULL); DT_DEBUG_SQLITE3_BIND_TEXT(stmt, 1, gtk_entry_get_text(g->name), strlen(gtk_entry_get_text(g->name)), SQLITE_TRANSIENT); DT_DEBUG_SQLITE3_BIND_TEXT(stmt, 2, gtk_entry_get_text(g->description), strlen(gtk_entry_get_text(g->description)), SQLITE_TRANSIENT); DT_DEBUG_SQLITE3_BIND_TEXT(stmt, 3, g->plugin_name, strlen(g->plugin_name), SQLITE_TRANSIENT); DT_DEBUG_SQLITE3_BIND_INT(stmt, 4, g->version); DT_DEBUG_SQLITE3_BIND_BLOB(stmt, 5, g->params, g->params_size, SQLITE_TRANSIENT); sqlite3_step(stmt); sqlite3_finalize(stmt); dt_gui_store_last_preset (gtk_entry_get_text(g->name)); } gtk_widget_destroy(GTK_WIDGET(dialog)); g_free(g->original_name); free(g); }