Ansel 0.0
A darktable fork - bloat + design vision
Loading...
Searching...
No Matches
database.h File Reference
#include "common/debug.h"
#include <glib.h>
#include <sqlite3.h>
+ 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
 

Macros

#define dt_database_start_transaction()   DT_DEBUG_TRACE_WRAPPER_VOID(DT_DEBUG_SQL, dt_database_start_transaction_debug)
 
#define dt_database_release_transaction()   DT_DEBUG_TRACE_WRAPPER_VOID(DT_DEBUG_SQL, dt_database_release_transaction_debug)
 

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)
 

Enumerations

enum  dt_database_open_result_t {
  DT_DATABASE_OPEN_FAILED = 0 ,
  DT_DATABASE_OPEN_OK ,
  DT_DATABASE_OPEN_LOCKED
}
 
enum  dt_database_prompt_t {
  DT_DATABASE_PROMPT_READONLY = 0 ,
  DT_DATABASE_PROMPT_CORRUPTED ,
  DT_DATABASE_PROMPT_UPGRADE ,
  DT_DATABASE_PROMPT_MAINTENANCE
}
 
enum  dt_database_response_t {
  DT_DATABASE_RESPONSE_CLOSE = 0 ,
  DT_DATABASE_RESPONSE_RESTORE ,
  DT_DATABASE_RESPONSE_DELETE ,
  DT_DATABASE_RESPONSE_PROCEED
}
 

Functions

dt_database_open_result_t dt_database_open (const dt_database_params_t *params)
 
void dt_database_close (void)
 
gboolean dt_database_is_open (void)
 
const gchar * dt_database_get_path (void)
 
sqlite3 * dt_database_get_sqlite3_global (void)
 
const char * dt_database_get_last_error (void)
 
void dt_database_set_settings (const dt_database_settings_t *settings)
 
void dt_database_get_settings (dt_database_settings_t *settings)
 
void dt_database_settings_free (dt_database_settings_t *settings)
 
void dt_database_set_renamed_handler (dt_database_renamed_handler_t handler)
 
void dt_database_take_error (dt_database_error_t *error)
 
void dt_database_error_free (dt_database_error_t *error)
 
void dt_database_set_prompt_handler (dt_database_prompt_handler_t handler)
 
int dt_database_delete_lock_files (const char *dbfilename)
 
void dt_database_optimize (void)
 
gboolean dt_database_maybe_maintenance (const gboolean closing_time)
 
void dt_database_perform_maintenance (void)
 
void dt_database_cleanup_busy_statements (void)
 
gboolean dt_database_snapshot (void)
 
gboolean dt_database_maybe_snapshot (void)
 
char ** dt_database_snaps_to_remove (void)
 
gchar * dt_database_get_most_recent_snap (const char *db_filename)
 
void dt_database_start_transaction_debug (void)
 
void dt_database_release_transaction_debug (void)
 
void dt_database_rollback_transaction (void)
 
void dt_database_begin_transaction_batch (void)
 
void dt_database_end_transaction_batch (void)
 

Macro Definition Documentation

◆ dt_database_release_transaction

#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.

◆ dt_database_start_transaction

#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 Documentation

◆ dt_database_error_t

◆ dt_database_open_result_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.

◆ 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.

◆ dt_database_prompt_handler_t

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.

◆ dt_database_prompt_t

◆ dt_database_renamed_handler_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.

◆ dt_database_response_t

◆ dt_database_settings_t

Enumeration Type Documentation

◆ dt_database_open_result_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.

◆ dt_database_prompt_t

Enumerator
DT_DATABASE_PROMPT_READONLY 

The library database cannot be written to. Informational: nothing to decide.

DT_DATABASE_PROMPT_CORRUPTED 

The database is corrupt. Offer to close, restore a snapshot, or delete and start over.

DT_DATABASE_PROMPT_UPGRADE 

The schema is older than this build and must be migrated before anything else can happen. PROCEED migrates, CLOSE aborts startup so the user can back up first.

DT_DATABASE_PROMPT_MAINTENANCE 

Enough of the file is free pages to be worth a VACUUM. PROCEED runs it now, CLOSE defers; ::ask_on_startup / ::ask_on_close say when the user would be asked again.

Definition at line 194 of file database.h.

◆ dt_database_response_t

Enumerator
DT_DATABASE_RESPONSE_CLOSE 

Do not do the thing. Abort startup, or defer the maintenance. Also what a caller with no handler gets, for every prompt.

DT_DATABASE_RESPONSE_RESTORE 

Delete the corrupt file and restore the most recent snapshot over it.

DT_DATABASE_RESPONSE_DELETE 

Delete the corrupt file and start with a fresh database.

DT_DATABASE_RESPONSE_PROCEED 

Go ahead: migrate the schema, or run the maintenance.

Definition at line 208 of file database.h.

Function Documentation

◆ dt_database_begin_transaction_batch()

void dt_database_begin_transaction_batch ( void  )

◆ dt_database_cleanup_busy_statements()

void dt_database_cleanup_busy_statements ( void  )

cleanup busy statements on closing dt, just before performing maintenance

Definition at line 3861 of file database.c.

References _db, _db_print, dt_database_t::handle, and IS_NULL_PTR.

Referenced by dt_cleanup().

◆ dt_database_close()

void dt_database_close ( void  )

Close the connection and release the lock files. Safe to call when nothing is open.

Warning
Every statement must be finalised before this returns, which is why the repositories under 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 3749 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().

◆ dt_database_delete_lock_files()

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 2760 of file database.c.

References dt_free, i, IS_NULL_PTR, names, and status.

Referenced by dt_database_show_error().

◆ dt_database_end_transaction_batch()

◆ dt_database_error_free()

void dt_database_error_free ( dt_database_error_t error)

Release the strings owned by error.

Definition at line 2751 of file database.c.

References dt_free, error(), and IS_NULL_PTR.

Referenced by dt_database_show_error().

◆ dt_database_get_last_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 3776 of file database.c.

References _db, dt_database_t::handle, and IS_NULL_PTR.

Referenced by dt_exif_xmp_read(), and dt_film_new().

◆ dt_database_get_most_recent_snap()

gchar * dt_database_get_most_recent_snap ( const char *  db_filename)

get possibly the freshest snapshot to restore

Definition at line 4699 of file database.c.

References _db_print, dt_free, error(), and IS_NULL_PTR.

Referenced by _database_init().

◆ dt_database_get_path()

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 3787 of file database.c.

References _db, and dt_database_t::dbfilename_library.

Referenced by dt_mipmap_cache_get_filename().

◆ dt_database_get_settings()

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 3685 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().

◆ dt_database_get_sqlite3_global()

sqlite3 * dt_database_get_sqlite3_global ( void  )

The connection itself.

Warning
This is the escape hatch, and it is counted. Every caller of this holds a raw 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 3782 of file database.c.

References _db, and dt_database_t::handle.

Referenced by _clear_similar_tags(), _columns_of(), _compute_count(), _fill_similar_tags(), _first_id_for_text(), _image_get_stmt(), _image_write_history_hash(), _next_id(), _prepared(), _run(), _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_clear_flag_among(), 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_flags_masked(), 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_removed_image_repository_restore(), 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().

◆ dt_database_is_open()

gboolean dt_database_is_open ( void  )

TRUE between a successful dt_database_open() and dt_database_close().

Definition at line 3771 of file database.c.

References _db, and IS_NULL_PTR.

Referenced by _remove_undo_data_free(), and dt_collection_query_refresh_memory_table().

◆ dt_database_maybe_maintenance()

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 3970 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().

◆ dt_database_maybe_snapshot()

gboolean dt_database_maybe_snapshot ( void  )

check if creating database snapshot is recommended

Definition at line 4227 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()

◆ dt_database_optimize()

void dt_database_optimize ( void  )

perform pre-db-close optimizations (always call when quiting darktable)

Definition at line 4050 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().

◆ dt_database_perform_maintenance()

void dt_database_perform_maintenance ( void  )

◆ dt_database_release_transaction_debug()

◆ dt_database_rollback_transaction()

◆ dt_database_set_prompt_handler()

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 3062 of file database.c.

References _prompt_handler.

Referenced by dt_database_gui_register_handlers().

◆ dt_database_set_renamed_handler()

void dt_database_set_renamed_handler ( dt_database_renamed_handler_t  handler)

Definition at line 3627 of file database.c.

References _renamed_handler.

Referenced by dt_init().

◆ dt_database_set_settings()

◆ dt_database_settings_free()

void dt_database_settings_free ( dt_database_settings_t settings)

Release the strings owned by settings (not settings itself).

Definition at line 3711 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().

◆ dt_database_snaps_to_remove()

char ** dt_database_snaps_to_remove ( void  )

◆ dt_database_snapshot()

gboolean dt_database_snapshot ( void  )

◆ dt_database_start_transaction_debug()

◆ dt_database_take_error()

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 2734 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().