![]() |
Ansel 0.0
A darktable fork - bloat + design vision
|
Include dependency graph for database.h:
This graph shows which files directly or indirectly include this file:Go to the source code of this file.
Data Structures | |
| struct | dt_database_params_t |
| struct | dt_database_settings_t |
| struct | dt_database_error_t |
| struct | dt_database_prompt_context_t |
Typedefs | |
| typedef struct dt_database_params_t | dt_database_params_t |
| typedef enum dt_database_open_result_t | dt_database_open_result_t |
| typedef struct dt_database_settings_t | dt_database_settings_t |
| typedef void(* | dt_database_renamed_handler_t) (const char *new_library_name) |
| typedef struct dt_database_error_t | dt_database_error_t |
| typedef enum dt_database_prompt_t | dt_database_prompt_t |
| typedef enum dt_database_response_t | dt_database_response_t |
| typedef struct dt_database_prompt_context_t | dt_database_prompt_context_t |
| typedef dt_database_response_t(* | dt_database_prompt_handler_t) (const dt_database_prompt_context_t *context) |
| #define dt_database_release_transaction | ( | ) | DT_DEBUG_TRACE_WRAPPER_VOID(DT_DEBUG_SQL, dt_database_release_transaction_debug) |
Definition at line 291 of file database.h.
| #define dt_database_start_transaction | ( | ) | DT_DEBUG_TRACE_WRAPPER_VOID(DT_DEBUG_SQL, dt_database_start_transaction_debug) |
Definition at line 290 of file database.h.
| typedef struct dt_database_error_t dt_database_error_t |
| typedef enum dt_database_open_result_t dt_database_open_result_t |
| typedef struct dt_database_params_t dt_database_params_t |
What identifies a connection. Fixed for as long as one is open; a different workspace means closing and opening again with a different set.
| typedef struct dt_database_prompt_context_t dt_database_prompt_context_t |
What the handler is told. Every field is a fact about the database; none of it is user-facing text. Fields not relevant to ::prompt are zero.
| typedef dt_database_response_t(* dt_database_prompt_handler_t) (const dt_database_prompt_context_t *context) |
Put a question to the user and return their answer.
Definition at line 245 of file database.h.
| typedef enum dt_database_prompt_t dt_database_prompt_t |
| typedef void(* dt_database_renamed_handler_t) (const char *new_library_name) |
The module settled on a different library file than the params named, because the legacy ~/.darktablerc database was migrated into the XDG directory. The orchestrator persists the new name; the module does not write conf. NULL removes the handler.
Definition at line 158 of file database.h.
| typedef enum dt_database_response_t dt_database_response_t |
| typedef struct dt_database_settings_t dt_database_settings_t |
| Enumerator | |
|---|---|
| DT_DATABASE_OPEN_FAILED | Nothing usable came back. The caller should abort startup. |
| DT_DATABASE_OPEN_OK | Open, and the lock files are ours. |
| DT_DATABASE_OPEN_LOCKED | The files opened but another process holds the lock. Take the error with dt_database_take_error() to find out which, then decide whether to break the lock and call dt_database_open() again. |
Definition at line 73 of file database.h.
| enum dt_database_prompt_t |
Definition at line 194 of file database.h.
Definition at line 208 of file database.h.
Definition at line 4906 of file database.c.
References _db, _db_lock, _trx_batch_level, _trx_batch_owner, _trx_owner, dt_atomic_add_int(), DT_DEBUG_SQLITE3_EXEC, dt_pthread_rwlock_wrlock(), and dt_database_t::handle.
Referenced by dt_iop_load_modules_so().
cleanup busy statements on closing dt, just before performing maintenance
Definition at line 3833 of file database.c.
References _db, _db_print, dt_database_t::handle, and IS_NULL_PTR.
Referenced by dt_cleanup().
Close the connection and release the lock files. Safe to call when nothing is open.
src/database expose a *_cleanup() each. A connection cannot be closed out from under a sqlite3_stmt still held elsewhere – and that is the reason this pair is not yet a dt_database_swap(). See src/database/README.md. Definition at line 3721 of file database.c.
References _database_free(), _db, _db_lock, _db_lock_inited, dt_pthread_rwlock_unlock(), dt_pthread_rwlock_wrlock(), and IS_NULL_PTR.
Referenced by dt_cleanup(), dt_init(), and testdb_teardown().
| int dt_database_delete_lock_files | ( | const char * | dbfilename | ) |
Delete data.db.lock and library.db.lock beside dbfilename. Returns 0 when every lock file that existed was removed. Call only once the user has agreed.
Definition at line 2732 of file database.c.
References dt_free, i, IS_NULL_PTR, names, and status.
Referenced by dt_database_show_error().
Definition at line 4928 of file database.c.
References _db, _db_lock, _db_print, _trx_batch_level, _trx_batch_owner, _trx_owner, dt_atomic_set_int(), dt_atomic_sub_int(), DT_DEBUG_SQLITE3_EXEC, dt_pthread_rwlock_unlock(), and dt_database_t::handle.
Referenced by dt_iop_load_modules_so().
| void dt_database_error_free | ( | dt_database_error_t * | error | ) |
Release the strings owned by error.
Definition at line 2723 of file database.c.
References dt_free, error(), and IS_NULL_PTR.
Referenced by dt_database_show_error().
| const char * dt_database_get_last_error | ( | void | ) |
The message for the most recent failed call on the connection.
Exists so that reporting an error does not require the handle. Valid until the next call into the database from any thread – copy it if you keep it.
Definition at line 3748 of file database.c.
References _db, dt_database_t::handle, and IS_NULL_PTR.
Referenced by dt_exif_xmp_read(), and dt_film_new().
| gchar * dt_database_get_most_recent_snap | ( | const char * | db_filename | ) |
get possibly the freshest snapshot to restore
Definition at line 4671 of file database.c.
References _db_print, dt_free, error(), and IS_NULL_PTR.
Referenced by _database_init().
| const gchar * dt_database_get_path | ( | void | ) |
Absolute path of the library file currently open, or NULL. Valid until the next dt_database_close(); copy it if you need to outlive that.
Definition at line 3759 of file database.c.
References _db, and dt_database_t::dbfilename_library.
Referenced by dt_mipmap_cache_get_filename().
| void dt_database_get_settings | ( | dt_database_settings_t * | settings | ) |
Take a copy of the policy. Strings are newly allocated – release with dt_database_settings_free(). Read as one snapshot under the module's lock: the GUI thread can replace these while a maintenance decision is being made, and four fields read one at a time can be a mix of old and new.
Definition at line 3657 of file database.c.
References _settings, _settings_lock, _settings_lock_inited, dt_database_settings_t::create_snapshot, dt_pthread_mutex_lock(), dt_pthread_mutex_unlock(), IS_NULL_PTR, dt_database_settings_t::keep_snapshots, dt_database_settings_t::maintenance_check, and dt_database_settings_t::maintenance_freepage_ratio.
Referenced by _snapshot_policy_decides(), dt_database_maybe_maintenance(), and dt_database_snaps_to_remove().
| sqlite3 * dt_database_get_sqlite3_global | ( | void | ) |
The connection itself.
sqlite3 * that the module cannot account for, cannot serialise against a close, and cannot trace. tools/check_module_boundaries.sh ratchets the number of call sites downwards and it is deleted at zero – at which point the private lock below actually guarantees something and swapping workspaces at runtime becomes implementable.Do not call it from new code: put the query in a repository under src/database and give it a name. See src/database/README.md.
Definition at line 3754 of file database.c.
References _db, and dt_database_t::handle.
Referenced by _clear_similar_tags(), _compute_count(), _fill_similar_tags(), _first_id_for_text(), _image_get_stmt(), _image_write_history_hash(), _prepared(), _run_for_id(), _run_snap_imgid(), _scalar(), dt_collection_query_find_neighbour(), dt_collection_query_get_group_members(), dt_collection_query_get_images(), dt_collection_query_get_images_for_rule(), dt_collection_query_get_makermodels(), dt_collection_query_get_nth(), dt_collection_query_get_property_values(), dt_collection_query_image_offset(), dt_collection_query_pop(), dt_collection_query_push(), dt_collection_query_refresh_memory_table(), dt_collection_query_restrict_to_selection(), dt_collection_query_set_iop_names(), dt_colorlabel_repository_foreach(), dt_colorlabel_repository_get_list(), dt_colorlabel_repository_has(), dt_film_repository_delete(), dt_film_repository_find_by_folder(), dt_film_repository_folder_status_clear(), dt_film_repository_folder_status_set(), dt_film_repository_foreach(), dt_film_repository_foreach_empty(), dt_film_repository_foreach_under(), dt_film_repository_get_folder(), dt_film_repository_get_image_ids(), dt_film_repository_has_images(), dt_film_repository_insert(), dt_film_repository_set_folder(), dt_film_repository_touch_access(), dt_history_repository_count_items(), dt_history_repository_count_mask_items(), dt_history_repository_delete_all_for_image(), dt_history_repository_delete_history(), dt_history_repository_delete_masks_history(), dt_history_repository_find_version_for_params(), dt_history_repository_foreach_active_module(), dt_history_repository_foreach_auto_preset_row(), dt_history_repository_foreach_item(), dt_history_repository_foreach_last_item(), dt_history_repository_foreach_mask_item(), dt_history_repository_foreach_row(), dt_history_repository_get_autoapply_ioporder_params(), dt_history_repository_get_end(), dt_history_repository_get_last_enabled_params(), dt_history_repository_get_module_order(), dt_history_repository_get_module_order_version(), dt_history_repository_get_next_num(), dt_history_repository_module_exists(), dt_history_repository_set_end(), dt_history_repository_set_module_order(), dt_history_repository_shift_nums(), dt_history_repository_write_item(), dt_history_repository_write_mask_item(), dt_history_snapshot_repository_next_id(), dt_image_repository_copy_to_film(), dt_image_repository_count_distinct_fields(), dt_image_repository_count_in_id_range(), dt_image_repository_count_others_with_flag(), dt_image_repository_delete(), dt_image_repository_duplicate(), dt_image_repository_find_by_film_and_filename(), dt_image_repository_find_by_folder_and_filename(), dt_image_repository_find_group_for_pattern(), dt_image_repository_foreach_collected(), dt_image_repository_foreach_in_id_range(), dt_image_repository_foreach_with_path(), dt_image_repository_get_collected_geo_bounds(), dt_image_repository_get_collected_geo_points(), dt_image_repository_get_duplicate_ids(), dt_image_repository_get_full_paths(), dt_image_repository_get_group_member_rows(), dt_image_repository_get_group_members(), dt_image_repository_get_ids_with_flag(), dt_image_repository_get_ids_with_flag_among(), dt_image_repository_get_ratings(), dt_image_repository_get_timestamps(), dt_image_repository_get_version(), dt_image_repository_get_versions(), dt_image_repository_get_write_timestamp(), dt_image_repository_get_xmp_row(), dt_image_repository_insert_import(), dt_image_repository_load(), dt_image_repository_reassign_group(), dt_image_repository_set_flag_among(), dt_image_repository_set_flags(), dt_image_repository_set_group(), dt_image_repository_set_version(), dt_image_repository_set_write_timestamp(), dt_image_repository_store(), dt_image_repository_touch_write_timestamp(), dt_location_repository_delete(), dt_location_repository_find_images_for_location(), dt_location_repository_find_locations_for_image(), dt_location_repository_get_data(), dt_location_repository_get_image_locations(), dt_location_repository_get_in_bbox(), dt_location_repository_get_polygon(), dt_location_repository_set_data(), dt_metadata_repository_add(), dt_metadata_repository_find_image_by_value(), dt_metadata_repository_foreach(), dt_metadata_repository_foreach_selected(), dt_metadata_repository_get_all(), dt_metadata_repository_get_values(), dt_metadata_repository_remove(), dt_preset_repository_add_iop_preset(), dt_preset_repository_add_module_preset(), dt_preset_repository_add_shipped_preset(), dt_preset_repository_delete_all_for_module(), dt_preset_repository_delete_by_rowid(), dt_preset_repository_delete_by_rowid_unprotected(), dt_preset_repository_delete_module_preset(), dt_preset_repository_delete_shipped(), dt_preset_repository_duplicate_module_preset(), dt_preset_repository_find_autoapply(), dt_preset_repository_find_rowid(), dt_preset_repository_get_by_rowid(), dt_preset_repository_get_conditions(), dt_preset_repository_get_identity(), dt_preset_repository_get_iop_preset(), dt_preset_repository_get_module_preset(), dt_preset_repository_insert(), dt_preset_repository_insert_with_conditions(), dt_preset_repository_list_all(), dt_preset_repository_list_all_versions(), dt_preset_repository_list_editable(), dt_preset_repository_list_for_iop(), dt_preset_repository_list_for_menu(), dt_preset_repository_list_for_module(), dt_preset_repository_list_for_upgrade(), dt_preset_repository_list_for_version(), dt_preset_repository_module_preset_exists(), dt_preset_repository_rename_module_preset(), dt_preset_repository_set_blend_params(), dt_preset_repository_set_module_version(), dt_preset_repository_update_camera(), dt_preset_repository_update_conditions(), dt_preset_repository_update_flag(), dt_preset_repository_update_iop_params(), dt_preset_repository_update_module_params(), dt_preset_repository_update_params_by_rowid(), dt_preset_repository_update_range(), dt_selection_repository_clear(), dt_selection_repository_deselect(), dt_selection_repository_deselect_list(), dt_selection_repository_drop_uncollected(), dt_selection_repository_get_all(), dt_selection_repository_get_lowest_id(), dt_selection_repository_pop(), dt_selection_repository_push(), dt_selection_repository_select(), dt_selection_repository_select_list(), dt_style_repository_append_item_from_history(), dt_style_repository_copy_items_from_history(), dt_style_repository_copy_items_from_style(), dt_style_repository_delete(), dt_style_repository_delete_items_except(), dt_style_repository_foreach_apply_item(), dt_style_repository_foreach_item(), dt_style_repository_foreach_item_against_image(), dt_style_repository_foreach_item_for_export(), dt_style_repository_foreach_item_with_params(), dt_style_repository_foreach_style(), dt_style_repository_get_description(), dt_style_repository_get_id_by_name(), dt_style_repository_get_iop_list(), dt_style_repository_get_style(), dt_style_repository_insert_header(), dt_style_repository_insert_item(), dt_style_repository_normalize_multi_priority(), dt_style_repository_set_iop_list(), dt_style_repository_update_header(), dt_style_repository_update_item_from_history(), dt_tag_repository_attach(), dt_tag_repository_attach_batch(), dt_tag_repository_count_attachments(), dt_tag_repository_count_distinct_images(), dt_tag_repository_delete_batch(), dt_tag_repository_detach_batch(), dt_tag_repository_get_agreement(), dt_tag_repository_get_attached(), dt_tag_repository_get_attached_for_export(), dt_tag_repository_get_attached_names(), dt_tag_repository_get_by_path_with_counts(), dt_tag_repository_get_collection_tags(), dt_tag_repository_get_flags(), dt_tag_repository_get_ids_for_images(), dt_tag_repository_get_images(), dt_tag_repository_get_images_in_list(), dt_tag_repository_get_name(), dt_tag_repository_get_names_under(), dt_tag_repository_get_similar(), dt_tag_repository_get_suggestions(), dt_tag_repository_get_synonyms(), dt_tag_repository_get_with_usage(), dt_tag_repository_insert(), dt_tag_repository_is_attached(), dt_tag_repository_rebuild_internal(), dt_tag_repository_rename(), dt_tag_repository_set_flags(), dt_tag_repository_set_synonyms(), dt_tag_repository_update_flags(), imported_style_name(), max_style_id(), print_enabled_state_summary(), print_module_order_summary(), and sql_int_for_bound_images().
| gboolean dt_database_is_open | ( | void | ) |
TRUE between a successful dt_database_open() and dt_database_close().
Definition at line 3743 of file database.c.
References _db, and IS_NULL_PTR.
Referenced by dt_collection_query_refresh_memory_table().
| gboolean dt_database_maybe_maintenance | ( | const gboolean | closing_time | ) |
Ask the user whether to VACUUM, if the policy and the free-page ratio both say it is worth it. closing_time distinguishes the startup check from the shutdown one.
Definition at line 3942 of file database.c.
References _ask_for_maintenance(), _db, _db_print, _get_pragma_int_val(), _is_mem_db(), dt_database_get_settings(), dt_database_settings_free(), FALSE, dt_database_t::handle, IS_NULL_PTR, dt_database_settings_t::maintenance_check, dt_database_settings_t::maintenance_freepage_ratio, and TRUE.
Referenced by dt_cleanup(), and dt_init().
| gboolean dt_database_maybe_snapshot | ( | void | ) |
check if creating database snapshot is recommended
Definition at line 4199 of file database.c.
References _db, _db_print, _is_mem_db(), _snapshot_policy_decides(), dt_database_t::dbfilename_library, dt_free, error(), FALSE, and IS_NULL_PTR.
Referenced by dt_cleanup().
| dt_database_open_result_t dt_database_open | ( | const dt_database_params_t * | params | ) |
Open the one connection. Fails if one is already open – call dt_database_close() first.
Definition at line 3604 of file database.c.
References _database_init(), _db, _db_lock, _db_lock_inited, _has_gui, _settings_lock, _settings_lock_inited, _verbose, DT_DATABASE_OPEN_FAILED, DT_DATABASE_OPEN_LOCKED, DT_DATABASE_OPEN_OK, dt_pthread_mutex_init(), dt_pthread_rwlock_init(), IS_NULL_PTR, dt_database_t::lock_acquired, and TRUE.
Referenced by dt_init(), and testdb_setup().
perform pre-db-close optimizations (always call when quiting darktable)
Definition at line 4022 of file database.c.
References _db, _is_mem_db(), DT_DEBUG_SQLITE3_EXEC, dt_database_t::handle, and IS_NULL_PTR.
Referenced by dt_cleanup().
Definition at line 3855 of file database.c.
References _db, _db_print, _get_pragma_int_val(), DT_DEBUG_SQLITE3_EXEC, ERRCHECK, dt_database_t::handle, and IS_NULL_PTR.
Referenced by dt_cleanup(), dt_init(), and optimize_database_callback().
Definition at line 4829 of file database.c.
References _db, _db_lock, _trx_batch_level, _trx_batch_owner, _trx_owner, _trxid, dt_atomic_get_int(), dt_atomic_sub_int(), DT_DEBUG_SQLITE3_EXEC, dt_pthread_rwlock_unlock(), and dt_database_t::handle.
Definition at line 4871 of file database.c.
References _db, _db_lock, _trx_batch_level, _trx_batch_owner, _trx_owner, _trxid, dt_atomic_set_int(), dt_atomic_sub_int(), DT_DEBUG_SQLITE3_EXEC, dt_pthread_rwlock_unlock(), and dt_database_t::handle.
Referenced by _history_snapshot_undo_restore(), dt_exif_xmp_read(), and dt_history_snapshot_repository_create().
| void dt_database_set_prompt_handler | ( | dt_database_prompt_handler_t | handler | ) |
Install the handler the module asks through. NULL removes it.
Must be registered BEFORE dt_database_open() runs – which is before dt_gui_gtk_init(), so this one cannot go where the film/collection/folder-survey handlers go. darktable.c registers it, being the only thing that knows this early whether there will be a GUI.
With no handler, every prompt answers CLOSE: a corrupt database is not deleted or restored, and a schema is not migrated, on the strength of a question nobody was asked. That is also what makes a headless run safe – these dialogs used to be built unconditionally, with no has_gui guard, on a GTK that ansel-cli never initialises.
Definition at line 3034 of file database.c.
References _prompt_handler.
Referenced by dt_database_gui_register_handlers().
| void dt_database_set_renamed_handler | ( | dt_database_renamed_handler_t | handler | ) |
| void dt_database_set_settings | ( | const dt_database_settings_t * | settings | ) |
Replace the policy. Strings are copied; the caller keeps ownership of what it passed.
Definition at line 3638 of file database.c.
References _settings, _settings_lock, _settings_lock_inited, dt_database_settings_t::create_snapshot, dt_free, dt_pthread_mutex_init(), dt_pthread_mutex_lock(), dt_pthread_mutex_unlock(), IS_NULL_PTR, dt_database_settings_t::keep_snapshots, dt_database_settings_t::maintenance_check, dt_database_settings_t::maintenance_freepage_ratio, and TRUE.
Referenced by _database_settings_from_conf().
| void dt_database_settings_free | ( | dt_database_settings_t * | settings | ) |
Release the strings owned by settings (not settings itself).
Definition at line 3683 of file database.c.
References dt_database_settings_t::create_snapshot, dt_free, IS_NULL_PTR, and dt_database_settings_t::maintenance_check.
Referenced by _snapshot_policy_decides(), dt_database_maybe_maintenance(), and dt_database_snaps_to_remove().
| char ** dt_database_snaps_to_remove | ( | void | ) |
get list of snapshot files to remove after successful snapshot
Definition at line 4380 of file database.c.
References _db, _db_print, _db_snap_sort(), _is_mem_db(), dt_database_t::dbfilename_data, dt_database_t::dbfilename_library, dt_database_get_settings(), dt_database_settings_free(), dt_free, error(), FALSE, IS_NULL_PTR, and dt_database_settings_t::keep_snapshots.
Referenced by dt_cleanup().
| gboolean dt_database_snapshot | ( | void | ) |
simply create db snapshot of both library and data
Definition at line 4090 of file database.c.
References _backup_db(), _db, _is_mem_db(), _print_backup_progress(), dt_database_t::dbfilename_data, dt_database_t::dbfilename_library, dt_free, FALSE, dt_database_t::handle, IS_NULL_PTR, and TRUE.
Referenced by backup_database_callback(), and dt_cleanup().
Definition at line 4777 of file database.c.
References _db, _db_lock, _trx_batch_level, _trx_batch_owner, _trx_owner, _trxid, dt_atomic_add_int(), dt_atomic_get_int(), DT_DEBUG_SQLITE3_EXEC, dt_pthread_rwlock_wrlock(), dt_database_t::handle, and MAX_NESTED_TRANSACTIONS.
| void dt_database_take_error | ( | dt_database_error_t * | error | ) |
Move the pending error out of the module into error, clearing it. Consumes it: a second call reports no error.
Definition at line 2706 of file database.c.
References _db, error(), dt_database_t::error_dbfilename, dt_database_t::error_message, dt_database_t::error_other_pid, IS_NULL_PTR, and dt_database_t::lock_acquired.
Referenced by dt_database_show_error().