void dt_view_filmstrip_prefetch() { const gchar *qin = dt_collection_get_query (darktable.collection); if(!qin) return; char query[1024]; int offset = 0; if(qin) { int imgid = -1; sqlite3_stmt *stmt; DT_DEBUG_SQLITE3_PREPARE_V2(dt_database_get(darktable.db), "select imgid from selected_images", -1, &stmt, NULL); if(sqlite3_step(stmt) == SQLITE_ROW) imgid = sqlite3_column_int(stmt, 0); sqlite3_finalize(stmt); snprintf(query, 1024, "select rowid from (%s) where id=?3", qin); DT_DEBUG_SQLITE3_PREPARE_V2(dt_database_get(darktable.db), query, -1, &stmt, NULL); DT_DEBUG_SQLITE3_BIND_INT(stmt, 1, 0); DT_DEBUG_SQLITE3_BIND_INT(stmt, 2, -1); DT_DEBUG_SQLITE3_BIND_INT(stmt, 3, imgid); if(sqlite3_step(stmt) == SQLITE_ROW) offset = sqlite3_column_int(stmt, 0) - 1; sqlite3_finalize(stmt); } sqlite3_stmt *stmt; DT_DEBUG_SQLITE3_PREPARE_V2(dt_database_get(darktable.db), qin, -1, &stmt, NULL); // only get one more image: DT_DEBUG_SQLITE3_BIND_INT(stmt, 1, offset+1); DT_DEBUG_SQLITE3_BIND_INT(stmt, 2, offset+2); if(sqlite3_step(stmt) == SQLITE_ROW) { const uint32_t prefetchid = sqlite3_column_int(stmt, 0); // dt_control_log("prefetching image %u", prefetchid); dt_mipmap_cache_read_get(darktable.mipmap_cache, NULL, prefetchid, DT_MIPMAP_FULL, DT_MIPMAP_PREFETCH); } sqlite3_finalize(stmt); }
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); }
void dt_image_full_path(const int imgid, char *pathname, int len) { sqlite3_stmt *stmt; DT_DEBUG_SQLITE3_PREPARE_V2(dt_database_get(darktable.db), "select folder || '/' || filename from images, film_rolls where " "images.film_id = film_rolls.id and images.id = ?1", -1, &stmt, NULL); DT_DEBUG_SQLITE3_BIND_INT(stmt, 1, imgid); if(sqlite3_step(stmt) == SQLITE_ROW) { g_strlcpy(pathname, (char *)sqlite3_column_text(stmt, 0), len); } sqlite3_finalize(stmt); }
/** * \brief Set the selection bit to a given value for the specified image * \param[in] imgid The image id * \param[in] value The boolean value for the bit */ void dt_view_set_selection(int imgid, int value) { /* clear and reset statement */ DT_DEBUG_SQLITE3_CLEAR_BINDINGS(darktable.view_manager->statements.is_selected); DT_DEBUG_SQLITE3_RESET(darktable.view_manager->statements.is_selected); /* setup statement and iterate over rows */ DT_DEBUG_SQLITE3_BIND_INT(darktable.view_manager->statements.is_selected, 1, imgid); if(sqlite3_step(darktable.view_manager->statements.is_selected) == SQLITE_ROW) { if(!value) { /* Value is set and should be unset; get rid of it */ /* clear and reset statement */ DT_DEBUG_SQLITE3_CLEAR_BINDINGS(darktable.view_manager->statements.delete_from_selected); DT_DEBUG_SQLITE3_RESET(darktable.view_manager->statements.delete_from_selected); /* setup statement and execute */ DT_DEBUG_SQLITE3_BIND_INT(darktable.view_manager->statements.delete_from_selected, 1, imgid); sqlite3_step(darktable.view_manager->statements.delete_from_selected); } } else if(value) { /* Select bit is unset and should be set; add it */ /* clear and reset statement */ DT_DEBUG_SQLITE3_CLEAR_BINDINGS(darktable.view_manager->statements.make_selected); DT_DEBUG_SQLITE3_RESET(darktable.view_manager->statements.make_selected); /* setup statement and execute */ DT_DEBUG_SQLITE3_BIND_INT(darktable.view_manager->statements.make_selected, 1, imgid); sqlite3_step(darktable.view_manager->statements.make_selected); } }
static void _lib_filmstrip_scroll_to_image(dt_lib_module_t *self, gint imgid, gboolean activate) { dt_lib_filmstrip_t *strip = (dt_lib_filmstrip_t *)self->data; /* if no imgid just bail out */ if(imgid <= 0) return; strip->activated_image = imgid; char query[1024]; const gchar *qin = dt_collection_get_query (darktable.collection); if(qin) { snprintf(query, 1024, "select rowid from (%s) where id=?3", qin); sqlite3_stmt *stmt; DT_DEBUG_SQLITE3_PREPARE_V2(dt_database_get(darktable.db), query, -1, &stmt, NULL); DT_DEBUG_SQLITE3_BIND_INT(stmt, 1, 0); DT_DEBUG_SQLITE3_BIND_INT(stmt, 2, -1); DT_DEBUG_SQLITE3_BIND_INT(stmt, 3, imgid); if(sqlite3_step(stmt) == SQLITE_ROW) { strip->offset = sqlite3_column_int(stmt, 0) - 1; } sqlite3_finalize(stmt); } /* activate the image if requested */ if (activate) { strip->activated_image = imgid; dt_control_signal_raise(darktable.signals, DT_SIGNAL_VIEWMANAGER_FILMSTRIP_ACTIVATE); } /* redraw filmstrip */ gboolean owns_lock = dt_control_gdk_lock(); gtk_widget_queue_draw(self->widget); if(owns_lock) dt_control_gdk_unlock(); }
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)++; }
void dt_image_remove(const int32_t imgid) { sqlite3_stmt *stmt; const dt_image_t *img = dt_image_cache_read_get(darktable.image_cache, imgid); int old_group_id = img->group_id; dt_image_cache_read_release(darktable.image_cache, img); int new_group_id = dt_grouping_remove_from_group(imgid); if(darktable.gui && darktable.gui->expanded_group_id == old_group_id) darktable.gui->expanded_group_id = new_group_id; DT_DEBUG_SQLITE3_PREPARE_V2(dt_database_get(darktable.db), "delete from images where id = ?1", -1, &stmt, NULL); DT_DEBUG_SQLITE3_BIND_INT(stmt, 1, imgid); sqlite3_step(stmt); sqlite3_finalize(stmt); DT_DEBUG_SQLITE3_PREPARE_V2(dt_database_get(darktable.db), "update tagxtag set count = count - 1 where " "(id2 in (select tagid from tagged_images where imgid = ?1)) or " "(id1 in (select tagid from tagged_images where imgid = ?1))", -1, &stmt, NULL); DT_DEBUG_SQLITE3_BIND_INT(stmt, 1, imgid); sqlite3_step(stmt); sqlite3_finalize(stmt); DT_DEBUG_SQLITE3_PREPARE_V2(dt_database_get(darktable.db), "delete from tagged_images where imgid = ?1", -1, &stmt, NULL); DT_DEBUG_SQLITE3_BIND_INT(stmt, 1, imgid); sqlite3_step(stmt); sqlite3_finalize(stmt); DT_DEBUG_SQLITE3_PREPARE_V2(dt_database_get(darktable.db), "delete from history where imgid = ?1", -1, &stmt, NULL); DT_DEBUG_SQLITE3_BIND_INT(stmt, 1, imgid); sqlite3_step(stmt); sqlite3_finalize(stmt); DT_DEBUG_SQLITE3_PREPARE_V2(dt_database_get(darktable.db), "delete from color_labels where imgid = ?1", -1, &stmt, NULL); DT_DEBUG_SQLITE3_BIND_INT(stmt, 1, imgid); sqlite3_step(stmt); sqlite3_finalize(stmt); DT_DEBUG_SQLITE3_PREPARE_V2(dt_database_get(darktable.db), "delete from meta_data where id = ?1", -1, &stmt, NULL); DT_DEBUG_SQLITE3_BIND_INT(stmt, 1, imgid); sqlite3_step(stmt); sqlite3_finalize(stmt); DT_DEBUG_SQLITE3_PREPARE_V2(dt_database_get(darktable.db), "delete from selected_images where imgid = ?1", -1, &stmt, NULL); DT_DEBUG_SQLITE3_BIND_INT(stmt, 1, imgid); sqlite3_step(stmt); sqlite3_finalize(stmt); // also clear all thumbnails in mipmap_cache. dt_image_cache_remove(darktable.image_cache, imgid); dt_mipmap_cache_remove(darktable.mipmap_cache, imgid); }
/** open film with given id. */ int dt_film_open2 (dt_film_t *film) { /* check if we got a decent film id */ if(film->id<0) return 1; /* query database for id and folder */ sqlite3_stmt *stmt; DT_DEBUG_SQLITE3_PREPARE_V2(dt_database_get(darktable.db), "select id, folder from film_rolls where id = ?1", -1, &stmt, NULL); DT_DEBUG_SQLITE3_BIND_INT(stmt, 1, film->id); if(sqlite3_step(stmt) == SQLITE_ROW) { /* fill out the film dirname */ sprintf (film->dirname,"%s",(gchar *)sqlite3_column_text (stmt, 1)); sqlite3_finalize (stmt); char datetime[20]; dt_gettime (datetime); DT_DEBUG_SQLITE3_PREPARE_V2(dt_database_get(darktable.db), "update film_rolls set datetime_accessed = ?1 where id = ?2", -1, &stmt, NULL); DT_DEBUG_SQLITE3_BIND_TEXT(stmt, 1, datetime, strlen(datetime), SQLITE_STATIC); DT_DEBUG_SQLITE3_BIND_INT(stmt, 2, film->id); sqlite3_step (stmt); sqlite3_finalize (stmt); dt_film_set_query (film->id); dt_control_queue_redraw_center (); dt_view_manager_reset (darktable.view_manager); return 0; } else sqlite3_finalize (stmt); /* failure */ return 1; }
// drops the write priviledges 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 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, color_matrix = ?20 where id = ?21", -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, strlen(img->exif_maker), SQLITE_STATIC); DT_DEBUG_SQLITE3_BIND_TEXT(stmt, 4, img->exif_model, strlen(img->exif_model), SQLITE_STATIC); DT_DEBUG_SQLITE3_BIND_TEXT(stmt, 5, img->exif_lens, strlen(img->exif_lens), 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, strlen(img->exif_datetime_taken), 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_BLOB(stmt, 20, &img->d65_color_matrix, sizeof(img->d65_color_matrix), SQLITE_STATIC); DT_DEBUG_SQLITE3_BIND_INT(stmt, 21, 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_write_release(&cache->cache, img->id); }
static void select_this_image(const int imgid) { // select this image, if no multiple selection: if(dt_collection_get_selected_count(NULL) < 2) { sqlite3_stmt *stmt; DT_DEBUG_SQLITE3_EXEC(dt_database_get(darktable.db), "delete from selected_images", NULL, NULL, NULL); DT_DEBUG_SQLITE3_PREPARE_V2(dt_database_get(darktable.db), "insert or ignore into selected_images values (?1)", -1, &stmt, NULL); DT_DEBUG_SQLITE3_BIND_INT(stmt, 1, imgid); sqlite3_step(stmt); sqlite3_finalize(stmt); } }
static void menuitem_pick_preset(GtkMenuItem *menuitem, dt_iop_module_t *module) { gchar *name = get_preset_name(menuitem); sqlite3_stmt *stmt; DT_DEBUG_SQLITE3_PREPARE_V2(dt_database_get(darktable.db), "select op_params, enabled, blendop_params, blendop_version, writeprotect from " "presets where operation = ?1 and op_version = ?2 and name = ?3", -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_TEXT(stmt, 3, name, -1, SQLITE_TRANSIENT); if(sqlite3_step(stmt) == SQLITE_ROW) { const void *op_params = sqlite3_column_blob(stmt, 0); int op_length = sqlite3_column_bytes(stmt, 0); int enabled = sqlite3_column_int(stmt, 1); const void *blendop_params = sqlite3_column_blob(stmt, 2); int bl_length = sqlite3_column_bytes(stmt, 2); int blendop_version = sqlite3_column_int(stmt, 3); int writeprotect = sqlite3_column_int(stmt, 4); if(op_params && (op_length == module->params_size)) { memcpy(module->params, op_params, op_length); module->enabled = enabled; } if(blendop_params && (blendop_version == dt_develop_blend_version()) && (bl_length == sizeof(dt_develop_blend_params_t))) { memcpy(module->blend_params, blendop_params, sizeof(dt_develop_blend_params_t)); } else if(blendop_params && dt_develop_blend_legacy_params(module, blendop_params, blendop_version, module->blend_params, dt_develop_blend_version(), bl_length) == 0) { // do nothing } else { memcpy(module->blend_params, module->default_blendop_params, sizeof(dt_develop_blend_params_t)); } if(!writeprotect) dt_gui_store_last_preset(name); } sqlite3_finalize(stmt); g_free(name); dt_iop_gui_update(module); dt_dev_add_history_item(darktable.develop, module, FALSE); gtk_widget_queue_draw(module->widget); }
GList * dt_styles_get_item_list (const char *name, gboolean params) { GList *result=NULL; sqlite3_stmt *stmt; int id=0; if ((id=dt_styles_get_id_by_name(name)) != 0) { if (params) DT_DEBUG_SQLITE3_PREPARE_V2(dt_database_get(darktable.db), "select num, operation, enabled, op_params, blendop_params from style_items where styleid=?1 order by num desc", -1, &stmt, NULL); else DT_DEBUG_SQLITE3_PREPARE_V2(dt_database_get(darktable.db), "select num, operation, enabled from style_items where styleid=?1 order by num desc", -1, &stmt, NULL); DT_DEBUG_SQLITE3_BIND_INT(stmt, 1, id); while (sqlite3_step(stmt) == SQLITE_ROW) { char name[512]= {0}; dt_style_item_t *item=g_malloc (sizeof (dt_style_item_t)); item->num = sqlite3_column_int (stmt, 0); if (params) { // when we get the parameters we do not want to get the operation localized as this // is used to compare against the internal module name. g_snprintf(name,512,"%s",sqlite3_column_text (stmt, 1)); const unsigned char *op_blob = sqlite3_column_blob(stmt, 3); const int32_t op_len = sqlite3_column_bytes(stmt, 3); const unsigned char *bop_blob = sqlite3_column_blob(stmt, 4); const int32_t bop_len = sqlite3_column_bytes(stmt, 4); item->params = malloc(op_len); memcpy(item->params, op_blob, op_len); item->blendop_params = malloc(bop_len); memcpy(item->blendop_params, bop_blob, bop_len); } else { g_snprintf(name,512,"%s (%s)",dt_iop_get_localized_name((gchar *)sqlite3_column_text (stmt, 1)),(sqlite3_column_int (stmt, 2)!=0)?_("on"):_("off")); item->params = NULL; item->blendop_params = NULL; } item->name = g_strdup (name); result = g_list_append (result,item); } sqlite3_finalize(stmt); } return result; }
GList *dt_film_get_image_ids(const int filmid) { GList *result = NULL; sqlite3_stmt *stmt; DT_DEBUG_SQLITE3_PREPARE_V2(dt_database_get(darktable.db), "SELECT id FROM main.images WHERE film_id = ?1", -1, &stmt, NULL); DT_DEBUG_SQLITE3_BIND_INT(stmt, 1, filmid); while(sqlite3_step(stmt) == SQLITE_ROW) { int id = sqlite3_column_int(stmt, 0); result = g_list_append(result, GINT_TO_POINTER(id)); } return result; }
int dt_image_altered(const uint32_t imgid) { int altered = 0; sqlite3_stmt *stmt; DT_DEBUG_SQLITE3_PREPARE_V2(dt_database_get(darktable.db), "select num from history where imgid = ?1", -1, &stmt, NULL); DT_DEBUG_SQLITE3_BIND_INT(stmt, 1, imgid); if(sqlite3_step(stmt) == SQLITE_ROW) altered = 1; sqlite3_finalize(stmt); if(altered) return 1; return altered; }
void dt_colorlabels_toggle_label_selection(const int color) { sqlite3_stmt *stmt, *stmt2; // check if all images in selection have that color label, i.e. try to get those which do not have the label DT_DEBUG_SQLITE3_PREPARE_V2(dt_database_get(darktable.db), "select * from selected_images where imgid not " "in (select a.imgid from selected_images as a " "join color_labels as b on a.imgid = b.imgid " "where b.color = ?1)", -1, &stmt, NULL); DT_DEBUG_SQLITE3_BIND_INT(stmt, 1, color); if(sqlite3_step(stmt) == SQLITE_ROW) { // none or only part of images have that color label, so label them all DT_DEBUG_SQLITE3_PREPARE_V2( dt_database_get(darktable.db), "insert or ignore into color_labels (imgid, color) select imgid, ?1 from selected_images", -1, &stmt2, NULL); DT_DEBUG_SQLITE3_BIND_INT(stmt2, 1, color); sqlite3_step(stmt2); sqlite3_finalize(stmt2); } else { // none of the selected images without that color label, so delete them all DT_DEBUG_SQLITE3_PREPARE_V2( dt_database_get(darktable.db), "delete from color_labels where imgid in (select imgid from selected_images) and color=?1", -1, &stmt2, NULL); DT_DEBUG_SQLITE3_BIND_INT(stmt2, 1, color); sqlite3_step(stmt2); sqlite3_finalize(stmt2); } sqlite3_finalize(stmt); dt_collection_hint_message(darktable.collection); }
void dt_colorlabels_toggle_label_selection(const int color) { sqlite3_stmt *stmt, *stmt2; // check if all images in selection have that color label, i.e. try to get those which do not have the label DT_DEBUG_SQLITE3_PREPARE_V2(dt_database_get(darktable.db), "SELECT imgid FROM main.selected_images WHERE imgid " "NOT IN (SELECT a.imgid FROM main.selected_images AS " "a JOIN main.color_labels AS b ON a.imgid = b.imgid " "WHERE b.color = ?1)", -1, &stmt, NULL); DT_DEBUG_SQLITE3_BIND_INT(stmt, 1, color); if(sqlite3_step(stmt) == SQLITE_ROW) { // none or only part of images have that color label, so label them all DT_DEBUG_SQLITE3_PREPARE_V2( dt_database_get(darktable.db), "INSERT OR IGNORE INTO main.color_labels (imgid, color) SELECT imgid, ?1 FROM main.selected_images", -1, &stmt2, NULL); DT_DEBUG_SQLITE3_BIND_INT(stmt2, 1, color); sqlite3_step(stmt2); sqlite3_finalize(stmt2); } else { // none of the selected images without that color label, so delete them all DT_DEBUG_SQLITE3_PREPARE_V2( dt_database_get(darktable.db), "DELETE FROM main.color_labels WHERE imgid IN (SELECT imgid FROM main.selected_images) AND color=?1", -1, &stmt2, NULL); DT_DEBUG_SQLITE3_BIND_INT(stmt2, 1, color); sqlite3_step(stmt2); sqlite3_finalize(stmt2); } sqlite3_finalize(stmt); dt_collection_hint_message(darktable.collection); }
void dt_lua_image_push(lua_State * L,int imgid) { // check that id is valid sqlite3_stmt *stmt; DT_DEBUG_SQLITE3_PREPARE_V2(dt_database_get(darktable.db), "select id from images where id = ?1", -1, &stmt, NULL); DT_DEBUG_SQLITE3_BIND_INT(stmt, 1, imgid); if(sqlite3_step(stmt) != SQLITE_ROW) { sqlite3_finalize(stmt); luaL_error(L,"invalid id for image : %d",imgid); return; } sqlite3_finalize(stmt); luaA_push(L,dt_lua_image_t,&imgid); }
void dt_view_filmstrip_set_active_image(dt_view_manager_t *vm,int iid) { /* First off clear all selected images... */ DT_DEBUG_SQLITE3_EXEC(dt_database_get(darktable.db), "delete from selected_images", NULL, NULL, NULL); /* clear and reset statement */ DT_DEBUG_SQLITE3_CLEAR_BINDINGS(darktable.view_manager->statements.make_selected); DT_DEBUG_SQLITE3_RESET(darktable.view_manager->statements.make_selected); /* setup statement and execute */ DT_DEBUG_SQLITE3_BIND_INT(darktable.view_manager->statements.make_selected, 1, iid); sqlite3_step(darktable.view_manager->statements.make_selected); dt_view_filmstrip_scroll_to_image(vm, iid, TRUE); }
void dt_colorlabels_toggle_label_selection (const int color) { sqlite3_stmt *stmt; // store away all previously unlabeled images in selection: DT_DEBUG_SQLITE3_PREPARE_V2(dt_database_get(darktable.db), "insert into memory.color_labels_temp select a.imgid from selected_images as a join color_labels as b on a.imgid = b.imgid where b.color = ?1", -1, &stmt, NULL); DT_DEBUG_SQLITE3_BIND_INT(stmt, 1, color); sqlite3_step(stmt); sqlite3_finalize(stmt); // delete all currently colored image labels in selection DT_DEBUG_SQLITE3_PREPARE_V2(dt_database_get(darktable.db), "delete from color_labels where imgid in (select imgid from selected_images) and color=?1", -1, &stmt, NULL); DT_DEBUG_SQLITE3_BIND_INT(stmt, 1, color); sqlite3_step(stmt); sqlite3_finalize(stmt); // label all previously unlabeled images: DT_DEBUG_SQLITE3_PREPARE_V2(dt_database_get(darktable.db), "insert into color_labels select imgid, ?1 from selected_images where imgid not in (select imgid from memory.color_labels_temp)", -1, &stmt, NULL); DT_DEBUG_SQLITE3_BIND_INT(stmt, 1, color); sqlite3_step(stmt); sqlite3_finalize(stmt); // clean up DT_DEBUG_SQLITE3_EXEC(dt_database_get(darktable.db), "delete from memory.color_labels_temp", NULL, NULL, NULL); }
void dt_styles_delete_by_name(const char *name) { int id=0; if ((id=dt_styles_get_id_by_name(name)) != 0) { /* delete the style */ sqlite3_stmt *stmt; DT_DEBUG_SQLITE3_PREPARE_V2(dt_database_get(darktable.db), "DELETE FROM styles WHERE id = ?1", -1, &stmt, NULL); DT_DEBUG_SQLITE3_BIND_INT(stmt, 1, id); sqlite3_step (stmt); sqlite3_finalize (stmt); /* delete style_items belonging to style */ DT_DEBUG_SQLITE3_PREPARE_V2(dt_database_get(darktable.db), "delete from style_items where styleid = ?1", -1, &stmt, NULL); DT_DEBUG_SQLITE3_BIND_INT(stmt, 1, id); sqlite3_step (stmt); sqlite3_finalize (stmt); char tmp_accel[1024]; snprintf(tmp_accel,1024,C_("accel", "styles/apply %s"),name); dt_accel_deregister_global(tmp_accel); } }
static void _dt_style_cleanup_multi_instance(int id) { sqlite3_stmt *stmt; /* let's clean-up the style multi-instance. What we want to do is have a unique multi_priority value for each iop. Furthermore this value must start to 0 and increment one by one for each multi-instance of the same module. On SQLite there is no notion of ROW_NUMBER, so we use rather resource consuming SQL statement, but as a style has never a huge number of items that's not a real issue. */ DT_DEBUG_SQLITE3_PREPARE_V2(dt_database_get(darktable.db), "update style_items set multi_priority=(select COUNT(0)-1 from style_items sty2 where sty2.num<=style_items.num and sty2.operation=style_items.operation and sty2.styleid=?1), multi_name=multi_priority where styleid=?1", -1, &stmt, NULL); DT_DEBUG_SQLITE3_BIND_INT(stmt, 1, id); sqlite3_step (stmt); sqlite3_finalize (stmt); }
static int film_len(lua_State*L) { dt_lua_film_t film_id; luaA_to(L,dt_lua_film_t,&film_id,-1); sqlite3_stmt *stmt = NULL; DT_DEBUG_SQLITE3_PREPARE_V2(dt_database_get(darktable.db),"select count(*) from images where film_id = ?1 ", -1, &stmt, NULL); DT_DEBUG_SQLITE3_BIND_INT(stmt, 1, film_id); if(sqlite3_step(stmt) == SQLITE_ROW) { lua_pushnumber(L,sqlite3_column_int(stmt, 0)); }else{ lua_pushnumber(L,0); } sqlite3_finalize(stmt); return 1; }
static int collection_numindex(lua_State *L) { int index = luaL_checkinteger(L, -1); if(index < 1) { return luaL_error(L, "incorrect index in database"); } gchar *query = NULL; gchar *sq = NULL; /* get collection order */ if((darktable.collection->params.query_flags & COLLECTION_QUERY_USE_SORT)) sq = dt_collection_get_sort_query(darktable.collection); sqlite3_stmt *stmt = NULL; /* build the query string */ query = dt_util_dstrcat(query, "select distinct id from images "); if(darktable.collection->params.sort == DT_COLLECTION_SORT_COLOR && (darktable.collection->params.query_flags & COLLECTION_QUERY_USE_SORT)) query = dt_util_dstrcat(query, "as a left outer join color_labels as b on a.id = b.imgid "); query = dt_util_dstrcat(query, "%s limit -1 offset ?1", sq); DT_DEBUG_SQLITE3_PREPARE_V2(dt_database_get(darktable.db), query, -1, &stmt, NULL); DT_DEBUG_SQLITE3_BIND_INT(stmt, 1, index -1); if(sqlite3_step(stmt) == SQLITE_ROW) { int imgid = sqlite3_column_int(stmt, 0); luaA_push(L, dt_lua_image_t, &imgid); sqlite3_finalize(stmt); } else { g_free(sq); g_free(query); sqlite3_finalize(stmt); return luaL_error(L, "incorrect index in database"); } g_free(sq); g_free(query); return 1; }
void dt_history_snapshot_undo_create(int32_t imgid, int *snap_id, int *history_end) { // create history & mask snapshots for imgid, return the snapshot id sqlite3_stmt *stmt; gboolean all_ok = TRUE; // get current history end *history_end = 0; DT_DEBUG_SQLITE3_PREPARE_V2(dt_database_get(darktable.db), "SELECT history_end FROM main.images WHERE id=?1", -1, &stmt, NULL); DT_DEBUG_SQLITE3_BIND_INT(stmt, 1, imgid); if (sqlite3_step(stmt) == SQLITE_ROW) *history_end = sqlite3_column_int(stmt, 0); sqlite3_finalize(stmt); // get max snapshot *snap_id = 0; DT_DEBUG_SQLITE3_PREPARE_V2(dt_database_get(darktable.db), "SELECT MAX(id) FROM memory.undo_history WHERE imgid=?1", -1, &stmt, NULL); DT_DEBUG_SQLITE3_BIND_INT(stmt, 1, imgid); if (sqlite3_step(stmt) == SQLITE_ROW) *snap_id = sqlite3_column_int(stmt, 0) + 1; sqlite3_finalize(stmt); sqlite3_exec(dt_database_get(darktable.db), "BEGIN TRANSACTION", NULL, NULL, NULL); // copy current state into undo_history DT_DEBUG_SQLITE3_PREPARE_V2(dt_database_get(darktable.db), "INSERT INTO memory.undo_history SELECT ?1, imgid, num, module, operation, op_params, enabled, " "blendop_params, blendop_version, multi_priority, multi_name, iop_order " " FROM main.history WHERE imgid=?2", -1, &stmt, NULL); DT_DEBUG_SQLITE3_BIND_INT(stmt, 1, *snap_id); DT_DEBUG_SQLITE3_BIND_INT(stmt, 2, imgid); all_ok = all_ok && (sqlite3_step(stmt) == SQLITE_DONE); sqlite3_finalize(stmt); // copy current state into undo_masks_history DT_DEBUG_SQLITE3_PREPARE_V2(dt_database_get(darktable.db), "INSERT INTO memory.undo_masks_history SELECT ?1, imgid, num, formid, form, name, version, " "points, points_count, source FROM main.masks_history WHERE imgid=?2", -1, &stmt, NULL); DT_DEBUG_SQLITE3_BIND_INT(stmt, 1, *snap_id); DT_DEBUG_SQLITE3_BIND_INT(stmt, 2, imgid); all_ok = all_ok && (sqlite3_step(stmt) == SQLITE_DONE); sqlite3_finalize(stmt); if(all_ok) sqlite3_exec(dt_database_get(darktable.db), "COMMIT", NULL, NULL, NULL); else sqlite3_exec(dt_database_get(darktable.db), "ROLLBACK_TRANSACTION", NULL, NULL, NULL); }
void dt_gui_presets_update_tv(const char *name, dt_dev_operation_t op, const int32_t version, const float min, const float max) { sqlite3_stmt *stmt; DT_DEBUG_SQLITE3_PREPARE_V2( dt_database_get(darktable.db), "update presets set exposure_min=?1, exposure_max=?2 where operation=?3 and op_version=?4 and name=?5", -1, &stmt, NULL); DT_DEBUG_SQLITE3_BIND_DOUBLE(stmt, 1, min); DT_DEBUG_SQLITE3_BIND_DOUBLE(stmt, 2, max); DT_DEBUG_SQLITE3_BIND_TEXT(stmt, 3, op, -1, SQLITE_TRANSIENT); DT_DEBUG_SQLITE3_BIND_INT(stmt, 4, version); DT_DEBUG_SQLITE3_BIND_TEXT(stmt, 5, name, -1, SQLITE_TRANSIENT); sqlite3_step(stmt); sqlite3_finalize(stmt); }
/* enumerator of images from filmroll */ void dt_control_image_enumerator_job_film_init(dt_control_image_enumerator_t *t, int32_t filmid) { sqlite3_stmt *stmt; /* get a list of images in filmroll */ DT_DEBUG_SQLITE3_PREPARE_V2(dt_database_get(darktable.db), "select * from images where film_id = ?1", -1, &stmt, NULL); DT_DEBUG_SQLITE3_BIND_INT(stmt, 1, filmid); while (sqlite3_step(stmt) == SQLITE_ROW) { long int imgid = sqlite3_column_int(stmt, 0); t->index = g_list_append(t->index, (gpointer)imgid); } sqlite3_finalize(stmt); }
static void _lib_history_compress_clicked_callback (GtkWidget *widget, gpointer user_data) { const int imgid = darktable.develop->image_storage.id; if(!imgid) return; // make sure the right history is in there: dt_dev_write_history(darktable.develop); sqlite3_stmt *stmt; DT_DEBUG_SQLITE3_PREPARE_V2(dt_database_get(darktable.db), "delete from history where imgid = ?1 and num not in (select MAX(num) from history where imgid = ?1 group by operation,multi_priority)", -1, &stmt, NULL); DT_DEBUG_SQLITE3_BIND_INT(stmt, 1, imgid); sqlite3_step(stmt); sqlite3_finalize(stmt); dt_dev_reload_history_items(darktable.develop); dt_dev_modulegroups_set(darktable.develop, dt_dev_modulegroups_get(darktable.develop)); }
void dt_film_set_query(const int32_t id) { /* enable film id filter and set film id */ dt_conf_set_int("plugins/lighttable/collect/num_rules", 1); dt_conf_set_int("plugins/lighttable/collect/item0", 0); sqlite3_stmt *stmt; DT_DEBUG_SQLITE3_PREPARE_V2(dt_database_get(darktable.db), "SELECT id, folder FROM main.film_rolls WHERE id = ?1", -1, &stmt, NULL); DT_DEBUG_SQLITE3_BIND_INT(stmt, 1, id); if(sqlite3_step(stmt) == SQLITE_ROW) { dt_conf_set_string("plugins/lighttable/collect/string0", (gchar *)sqlite3_column_text(stmt, 1)); } sqlite3_finalize(stmt); dt_collection_update_query(darktable.collection); }
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); }