Ansel 0.0
A darktable fork - bloat + design vision
Loading...
Searching...
No Matches
database.c File Reference
#include "common/atomic.h"
#include "common/database.h"
#include "common/darktable.h"
#include "common/datetime.h"
#include "common/debug.h"
#include "common/file_location.h"
#include "common/iop_order.h"
#include "common/styles.h"
#include "common/history.h"
#include "control/conf.h"
#include "control/control.h"
#include "gui/legacy_presets.h"
#include <gio/gio.h>
#include <glib.h>
#include <glib/gstdio.h>
#include <errno.h>
#include <fcntl.h>
#include <signal.h>
#include <sys/stat.h>
#include <sys/types.h>
+ Include dependency graph for common/database.c:

Data Structures

struct  dt_database_t
 

Macros

#define CURRENT_DATABASE_VERSION_LIBRARY   36
 
#define CURRENT_DATABASE_VERSION_DATA   9
 
#define MAX_NESTED_TRANSACTIONS   0
 
#define _SQLITE3_EXEC(a, b, c, d, e)
 
#define TRY_EXEC(_query, _message)
 
#define TRY_STEP(_stmt, _expected, _message)
 
#define TRY_PREPARE(_stmt, _query, _message)
 
#define FINALIZE
 
#define FINALIZE
 
#define FINALIZE
 
#define FINALIZE
 
#define TRY_EXEC(_query, _message)
 
#define TRY_STEP(_stmt, _expected, _message)
 
#define TRY_PREPARE(_stmt, _query, _message)
 
#define FINALIZE
 
#define ERRCHECK   {if (err!=NULL) {dt_print(DT_DEBUG_SQL, "[db maintenance] maintenance error: '%s'\n",err); sqlite3_free(err); err=NULL;}}
 

Typedefs

typedef struct dt_database_t dt_database_t
 

Functions

static void _database_migrate_to_xdg_structure ()
 
static void _database_delete_mipmaps_files ()
 
static gboolean _migrate_schema (dt_database_t *db, int version)
 
static int _upgrade_library_schema_step (dt_database_t *db, int version)
 
static int _upgrade_data_schema_step (dt_database_t *db, int version)
 
static gboolean _upgrade_library_schema (dt_database_t *db, int version)
 
static gboolean _upgrade_data_schema (dt_database_t *db, int version)
 
static void _create_library_schema (dt_database_t *db)
 
static void _create_data_schema (dt_database_t *db)
 
static void _create_memory_schema (dt_database_t *db)
 
static void _sanitize_db (dt_database_t *db)
 
void dt_database_show_error (const dt_database_t *db)
 
static gboolean pid_is_alive (int pid)
 
static gboolean _lock_single_database (dt_database_t *db, const char *dbfilename, char **lockfile)
 
static gboolean _lock_databases (dt_database_t *db)
 
void ask_for_upgrade (const gchar *dbname, const gboolean has_gui)
 
void dt_database_backup (const char *filename)
 
int _get_pragma_int_val (sqlite3 *db, const char *pragma)
 
gchar * _get_pragma_string_val (sqlite3 *db, const char *pragma)
 
dt_database_tdt_database_init (const char *alternative, const gboolean load_data, const gboolean has_gui)
 
void dt_database_destroy (const dt_database_t *db)
 
sqlite3 * dt_database_get (const dt_database_t *db)
 
const gchar * dt_database_get_path (const struct dt_database_t *db)
 
gboolean dt_database_get_lock_acquired (const dt_database_t *db)
 
void dt_database_cleanup_busy_statements (const struct dt_database_t *db)
 
void dt_database_perform_maintenance (const struct dt_database_t *db)
 
gboolean _ask_for_maintenance (const gboolean has_gui, const gboolean closing_time, const guint64 size)
 
static gboolean _is_mem_db (const struct dt_database_t *db)
 
gboolean dt_database_maybe_maintenance (const struct dt_database_t *db, const gboolean has_gui, const gboolean closing_time)
 
void dt_database_optimize (const struct dt_database_t *db)
 
static void _print_backup_progress (int remaining, int total)
 
static int _backup_db (sqlite3 *src_db, const char *src_db_name, const char *dest_filename, void(*xProgress)(int, int))
 
gboolean dt_database_snapshot (const struct dt_database_t *db)
 
gboolean dt_database_maybe_snapshot (const struct dt_database_t *db)
 
static gboolean _get_iso8601_int (const gchar *text, gsize length, gint *value)
 
static gint _db_snap_sort (gconstpointer a, gconstpointer b, gpointer user_data)
 
char ** dt_database_snaps_to_remove (const struct dt_database_t *db)
 
gchar * dt_database_get_most_recent_snap (const char *db_filename)
 
void dt_database_start_transaction_debug (const struct dt_database_t *db)
 
void dt_database_release_transaction_debug (const struct dt_database_t *db)
 
void dt_database_rollback_transaction (const struct dt_database_t *db)
 

Variables

static dt_atomic_int _trxid
 

Macro Definition Documentation

◆ _SQLITE3_EXEC

#define _SQLITE3_EXEC (   a,
  b,
  c,
  d,
 
)
Value:
if(sqlite3_exec(a, b, c, d, e) != SQLITE_OK) \
{ \
all_ok = FALSE; \
failing_query = b; \
goto end; \
}
#define FALSE
Definition ashift_lsd.c:147

◆ CURRENT_DATABASE_VERSION_DATA

#define CURRENT_DATABASE_VERSION_DATA   9

◆ CURRENT_DATABASE_VERSION_LIBRARY

#define CURRENT_DATABASE_VERSION_LIBRARY   36

◆ ERRCHECK

#define ERRCHECK   {if (err!=NULL) {dt_print(DT_DEBUG_SQL, "[db maintenance] maintenance error: '%s'\n",err); sqlite3_free(err); err=NULL;}}

◆ FINALIZE [1/5]

#define FINALIZE

◆ FINALIZE [2/5]

#define FINALIZE
Value:
do \
{ \
sqlite3_finalize(stmt); \
sqlite3_finalize(select_stmt); \
sqlite3_finalize(count_clashes_stmt); \
sqlite3_finalize(update_name_stmt); \
sqlite3_finalize(insert_stmt); \
sqlite3_finalize(delete_stmt); \
} while(0)

◆ FINALIZE [3/5]

#define FINALIZE
Value:
do \
{ \
sqlite3_finalize(stmt); \
sqlite3_finalize(insert_stmt); \
sqlite3_finalize(select_stmt); \
sqlite3_finalize(delete_stmt); \
sqlite3_finalize(update_name_stmt); \
sqlite3_finalize(select_new_stmt); \
sqlite3_finalize(copy_style_items_stmt); \
sqlite3_finalize(delete_style_items_stmt); \
} while(0)

◆ FINALIZE [4/5]

#define FINALIZE

◆ FINALIZE [5/5]

#define FINALIZE
Value:
do \
{ \
sqlite3_finalize(stmt); stmt = NULL; /* NULL so that finalize becomes a NOP */ \
} while(0)

◆ MAX_NESTED_TRANSACTIONS

#define MAX_NESTED_TRANSACTIONS   0

◆ TRY_EXEC [1/2]

#define TRY_EXEC (   _query,
  _message 
)
Value:
do \
{ \
if(sqlite3_exec(db->handle, _query, NULL, NULL, NULL) != SQLITE_OK) \
{ \
fprintf(stderr, _message); \
fprintf(stderr, "[init] %s\n", sqlite3_errmsg(db->handle)); \
sqlite3_exec(db->handle, "ROLLBACK TRANSACTION", NULL, NULL, NULL); \
return version; \
} \
} while(0)
#define FINALIZE
Definition common/database.c:443

◆ TRY_EXEC [2/2]

#define TRY_EXEC (   _query,
  _message 
)
Value:
do \
{ \
if(sqlite3_exec(db->handle, _query, NULL, NULL, NULL) != SQLITE_OK) \
{ \
fprintf(stderr, _message); \
fprintf(stderr, "[init] %s\n", sqlite3_errmsg(db->handle)); \
sqlite3_exec(db->handle, "ROLLBACK TRANSACTION", NULL, NULL, NULL); \
return FALSE; \
} \
} while(0)

◆ TRY_PREPARE [1/2]

#define TRY_PREPARE (   _stmt,
  _query,
  _message 
)
Value:
do \
{ \
if(sqlite3_prepare_v2(db->handle, _query, -1, &_stmt, NULL) != SQLITE_OK) \
{ \
fprintf(stderr, _message); \
fprintf(stderr, "[init] %s\n", sqlite3_errmsg(db->handle)); \
sqlite3_exec(db->handle, "ROLLBACK TRANSACTION", NULL, NULL, NULL); \
return version; \
} \
} while(0)

◆ TRY_PREPARE [2/2]

#define TRY_PREPARE (   _stmt,
  _query,
  _message 
)
Value:
do \
{ \
if(sqlite3_prepare_v2(db->handle, _query, -1, &_stmt, NULL) != SQLITE_OK) \
{ \
fprintf(stderr, _message); \
fprintf(stderr, "[init] %s\n", sqlite3_errmsg(db->handle)); \
sqlite3_exec(db->handle, "ROLLBACK TRANSACTION", NULL, NULL, NULL); \
return FALSE; \
} \
} while(0)

◆ TRY_STEP [1/2]

#define TRY_STEP (   _stmt,
  _expected,
  _message 
)
Value:
do \
{ \
if(sqlite3_step(_stmt) != _expected) \
{ \
fprintf(stderr, _message); \
fprintf(stderr, "[init] %s\n", sqlite3_errmsg(db->handle)); \
sqlite3_exec(db->handle, "ROLLBACK TRANSACTION", NULL, NULL, NULL); \
return version; \
} \
} while(0)

◆ TRY_STEP [2/2]

#define TRY_STEP (   _stmt,
  _expected,
  _message 
)
Value:
do \
{ \
if(sqlite3_step(_stmt) != _expected) \
{ \
fprintf(stderr, _message); \
fprintf(stderr, "[init] %s\n", sqlite3_errmsg(db->handle)); \
sqlite3_exec(db->handle, "ROLLBACK TRANSACTION", NULL, NULL, NULL); \
return FALSE; \
} \
} while(0)

Typedef Documentation

◆ dt_database_t

typedef struct dt_database_t dt_database_t

Function Documentation

◆ _ask_for_maintenance()

gboolean _ask_for_maintenance ( const gboolean  has_gui,
const gboolean  closing_time,
const guint64  size 
)

◆ _backup_db()

static int _backup_db ( sqlite3 *  src_db,
const char *  src_db_name,
const char *  dest_filename,
void(*)(int, int)  xProgress 
)
static

◆ _create_data_schema()

static void _create_data_schema ( dt_database_t db)
static

◆ _create_library_schema()

static void _create_library_schema ( dt_database_t db)
static
Todo:
: make sure to bump CURRENT_DATABASE_VERSION_LIBRARY and add a

References CURRENT_DATABASE_VERSION_LIBRARY, and dt_database_t::handle.

Referenced by dt_database_init().

◆ _create_memory_schema()

static void _create_memory_schema ( dt_database_t db)
static

References dt_database_t::handle.

Referenced by dt_database_init().

◆ _database_delete_mipmaps_files()

static void _database_delete_mipmaps_files ( )
static

References dt_loc_get_user_cache_dir(), and PATH_MAX.

Referenced by dt_database_init().

◆ _database_migrate_to_xdg_structure()

static void _database_migrate_to_xdg_structure ( )
static

◆ _db_snap_sort()

static gint _db_snap_sort ( gconstpointer  a,
gconstpointer  b,
gpointer  user_data 
)
static

References _get_iso8601_int(), and day.

Referenced by dt_database_snaps_to_remove().

◆ _get_iso8601_int()

static gboolean _get_iso8601_int ( const gchar *  text,
gsize  length,
gint *  value 
)
static

References FALSE, and TRUE.

Referenced by _db_snap_sort().

◆ _get_pragma_int_val()

int _get_pragma_int_val ( sqlite3 *  db,
const char *  pragma 
)

◆ _get_pragma_string_val()

gchar * _get_pragma_string_val ( sqlite3 *  db,
const char *  pragma 
)

Referenced by dt_database_init().

◆ _is_mem_db()

◆ _lock_databases()

◆ _lock_single_database()

static gboolean _lock_single_database ( dt_database_t db,
const char *  dbfilename,
char **  lockfile 
)
static

◆ _migrate_schema()

static gboolean _migrate_schema ( dt_database_t db,
int  version 
)
static

◆ _print_backup_progress()

static void _print_backup_progress ( int  remaining,
int  total 
)
static
Todo:
if we have closing splashpage - this can be used to advance progressbar :)

References DT_DEBUG_SQL, and dt_print().

Referenced by dt_database_snapshot().

◆ _sanitize_db()

static void _sanitize_db ( dt_database_t db)
static

◆ _upgrade_data_schema()

static gboolean _upgrade_data_schema ( dt_database_t db,
int  version 
)
static

◆ _upgrade_data_schema_step()

◆ _upgrade_library_schema()

static gboolean _upgrade_library_schema ( dt_database_t db,
int  version 
)
static

◆ _upgrade_library_schema_step()

◆ ask_for_upgrade()

void ask_for_upgrade ( const gchar *  dbname,
const gboolean  has_gui 
)

◆ dt_database_backup()

void dt_database_backup ( const char *  filename)

References darktable_package_version, FALSE, and TRUE.

Referenced by dt_database_init().

◆ dt_database_cleanup_busy_statements()

void dt_database_cleanup_busy_statements ( const struct dt_database_t db)

cleanup busy statements on closing dt, just before performing maintenance

References DT_DEBUG_SQL, dt_print(), and dt_database_t::handle.

Referenced by dt_cleanup().

◆ dt_database_destroy()

◆ dt_database_get()

sqlite3 * dt_database_get ( const dt_database_t db)

References dt_database_t::handle.

Referenced by _bulk_add_metadata(), _bulk_add_tags(), _bulk_remove_metadata(), _bulk_remove_tags(), _clean_missing_ids(), _cleanup_history(), _clear_undo_snapshot(), _concatenate_multiple_images(), _create_filtered_model(), _db_update_timestamp(), _dev_auto_apply_presets(), _dt_collection_compute_count(), _dt_collection_lut(), _dt_style_cleanup_multi_instance(), _dt_style_update_from_image(), _dt_style_update_iop_order(), _edit_preset_response(), _exif_import_tags(), _exif_xmp_read_data(), _exif_xmp_read_data_export(), _film_strip_activated(), _get_active_preset_name(), _get_base_value(), _get_full_pathname(), _gui_presets_popup_menu_show_internal(), _history_hash_compute_from_db(), _history_snapshot_undo_restore(), _image_altered_deprecated(), _image_duplicate_with_version_ext(), _image_import_internal(), _image_local_copy_full_path(), _image_update_group_tooltip(), _init_presets(), _jump_to(), _lib_duplicate_init_callback(), _map_location_find_images(), _menuitem_update_preset(), _nb_other_local_copy_for(), _pop_menu_dictionary_delete_tag(), _presets_show_edit_dialog(), _selection_database_to_glist(), _selection_deselect(), _selection_select(), _set_remove_flag(), _setup_selected_images_list(), _single_selected_imgid(), _tag_get_attached_export(), _tag_get_tags(), _update(), _view_map_center_on_image_list(), add_mask_entry_to_db(), database_get_image(), database_len(), database_numindex(), dt_add_hist(), dt_collection_get(), dt_collection_get_makermodels(), dt_collection_get_nth(), dt_collection_image_offset_with_collection(), dt_collection_memory_update(), dt_collection_update_query(), dt_colorlabels_check_label(), dt_colorlabels_get_labels(), dt_colorlabels_remove_label(), dt_colorlabels_remove_labels(), dt_colorlabels_set_label(), dt_colorspaces_get_work_profile(), dt_control_crawler_run(), dt_control_delete_images_job_run(), dt_control_image_enumerator_job_film_init(), dt_control_remove_images_job_run(), dt_control_write_sidecar_files_job_run(), dt_database_release_transaction_debug(), dt_database_rollback_transaction(), dt_database_start_transaction_debug(), dt_dev_read_history_ext(), dt_dev_write_history_end_ext(), dt_dev_write_history_item(), dt_exif_xmp_read(), dt_film_get_id(), dt_film_get_image_ids(), dt_film_is_empty(), dt_film_new(), dt_film_open(), dt_film_remove(), dt_film_remove_empty(), dt_film_set_folder_status(), dt_film_set_query(), dt_grouping_add_grouped_images(), dt_grouping_change_representative(), dt_grouping_get_group_images(), dt_grouping_remove_from_group(), dt_gui_presets_add_with_blendop(), dt_gui_presets_apply_preset(), dt_gui_presets_autoapply_for_module(), dt_gui_presets_confirm_and_delete(), dt_gui_presets_init(), dt_gui_presets_show_edit_dialog(), dt_gui_presets_update_autoapply(), dt_gui_presets_update_av(), dt_gui_presets_update_filter(), dt_gui_presets_update_fl(), dt_gui_presets_update_iso(), dt_gui_presets_update_ldr(), dt_gui_presets_update_mml(), dt_gui_presets_update_tv(), dt_history_check_module_exists(), dt_history_compress_on_image(), dt_history_compress_on_list(), dt_history_delete_on_image_ext(), dt_history_end_attop(), dt_history_get_items(), dt_history_get_items_as_string(), dt_history_hash_is_mipmap_synced(), dt_history_hash_read(), dt_history_hash_set_mipmap(), dt_history_hash_write(), dt_history_hash_write_from_history(), dt_history_snapshot_undo_create(), dt_history_truncate_on_image(), dt_image_altered(), dt_image_cache_allocate(), dt_image_cache_write_release(), dt_image_copy_rename(), dt_image_film_roll(), dt_image_film_roll_directory(), dt_image_full_path(), dt_image_get_id(), dt_image_get_id_full_path(), dt_image_get_orientation(), dt_image_local_copy_synch(), dt_image_path_append_version(), dt_image_read_duplicates(), dt_image_remove(), dt_image_rename(), dt_image_set_flip(), dt_image_write_sidecar_file(), dt_iop_set_darktable_iop_table(), dt_ioppr_get_iop_order_list(), dt_ioppr_get_iop_order_version(), dt_ioppr_has_iop_order_list(), dt_ioppr_write_iop_order(), dt_is_tag_attached(), dt_legacy_presets_create(), dt_lib_init_presets(), dt_lib_presets_add(), dt_lib_presets_apply(), dt_lib_presets_duplicate(), dt_lib_presets_popup_menu_show(), dt_lib_presets_remove(), dt_lib_presets_update(), dt_lua_image_push(), dt_lua_tag_get_attached(), dt_lua_tag_get_tagged_images(), dt_map_location_delete(), dt_map_location_find_locations(), dt_map_location_get_data(), dt_map_location_get_images_count(), dt_map_location_get_locations_by_path(), dt_map_location_get_locations_on_map(), dt_map_location_get_polygons(), dt_map_location_set_data(), dt_map_location_update_locations(), dt_masks_read_masks_history(), dt_masks_write_masks_history_item(), dt_metadata_already_imported(), dt_metadata_get(), dt_metadata_get_list_id(), dt_pop_collection(), dt_presets_import_from_file(), dt_presets_save_to_file(), dt_push_collection(), dt_selection_clear(), dt_selection_deselect_list(), dt_selection_pop(), dt_selection_push(), dt_selection_select_list(), dt_selection_to_culling_mode(), dt_set_darktable_tags(), dt_set_xmp_dt_history(), dt_set_xmp_dt_metadata(), dt_style_plugin_save(), dt_styles_apply_to_image(), dt_styles_create_from_image(), dt_styles_create_from_style(), dt_styles_create_style_header(), dt_styles_delete_by_name_adv(), dt_styles_get_by_name(), dt_styles_get_description(), dt_styles_get_id_by_name(), dt_styles_get_item_list(), dt_styles_get_list(), dt_styles_has_module_order(), dt_styles_module_order_list(), dt_styles_save_to_file(), dt_styles_update(), dt_tag_add_synonym(), dt_tag_count_tags_images(), dt_tag_delete_tag_batch(), dt_tag_exists(), dt_tag_get_attached(), dt_tag_get_flags(), dt_tag_get_images(), dt_tag_get_images_from_list(), dt_tag_get_name(), dt_tag_get_subtags(), dt_tag_get_suggestions(), dt_tag_get_synonyms(), dt_tag_get_tag_id_by_name(), dt_tag_get_tag_order_by_id(), dt_tag_get_tags_images(), dt_tag_get_with_usage(), dt_tag_images_count(), dt_tag_new(), dt_tag_remove(), dt_tag_rename(), dt_tag_set_flags(), dt_tag_set_synonyms(), dt_tag_set_tag_order_by_id(), edit_preset(), enter(), export_preset(), film_getnum(), film_len(), film_tostring(), films_index(), films_len(), generate_thumbnail_cache(), get_active_preset_name(), get_group(), group_images_callback(), init_presets(), list_view(), menuitem_new_preset(), menuitem_update_preset(), path_member(), process_image(), reload_defaults(), set_xmp_timestamps(), style_table_index(), style_table_len(), tag_delete(), tag_index(), tag_length(), tag_lib_index(), tag_lib_length(), tree_insert_presets(), tree_key_press_presets(), tree_view(), ungroup_images_callback(), update(), view_popup_menu_onRemove(), and view_popup_menu_onSearchFilmroll().

◆ dt_database_get_lock_acquired()

gboolean dt_database_get_lock_acquired ( const dt_database_t db)

References dt_database_t::lock_acquired.

Referenced by dt_init().

◆ dt_database_get_most_recent_snap()

gchar * dt_database_get_most_recent_snap ( const char *  db_filename)

get possibly the freshest snapshot to restore

References DT_DEBUG_SQL, dt_print(), and error().

Referenced by dt_database_init().

◆ dt_database_get_path()

const gchar * dt_database_get_path ( const struct dt_database_t db)

Returns database path

References dt_database_t::dbfilename_library.

Referenced by dt_mipmap_cache_get_filename().

◆ dt_database_init()

◆ dt_database_maybe_maintenance()

gboolean dt_database_maybe_maintenance ( const struct dt_database_t db,
const gboolean  has_gui,
const gboolean  closing_time 
)

◆ dt_database_maybe_snapshot()

gboolean dt_database_maybe_snapshot ( const struct dt_database_t db)

check if creating database snapshot is recommended

References _is_mem_db(), dt_database_t::dbfilename_library, dt_conf_get_string_const(), DT_DEBUG_SQL, dt_print(), error(), FALSE, and TRUE.

Referenced by dt_cleanup().

◆ dt_database_optimize()

void dt_database_optimize ( const struct dt_database_t db)

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

References _is_mem_db(), DT_DEBUG_SQLITE3_EXEC, and dt_database_t::handle.

Referenced by dt_cleanup().

◆ dt_database_perform_maintenance()

void dt_database_perform_maintenance ( const struct dt_database_t db)

◆ dt_database_release_transaction_debug()

void dt_database_release_transaction_debug ( const struct dt_database_t db)

◆ dt_database_rollback_transaction()

◆ dt_database_show_error()

◆ dt_database_snaps_to_remove()

char ** dt_database_snaps_to_remove ( const struct dt_database_t db)

get list of snapshot files to remove after successful snapshot

References _db_snap_sort(), _is_mem_db(), dt_database_t::dbfilename_data, dt_database_t::dbfilename_library, dt_conf_get_int(), DT_DEBUG_SQL, dt_print(), error(), and FALSE.

Referenced by dt_cleanup().

◆ dt_database_snapshot()

gboolean dt_database_snapshot ( const struct dt_database_t db)

◆ dt_database_start_transaction_debug()

void dt_database_start_transaction_debug ( const struct dt_database_t db)

◆ pid_is_alive()

static gboolean pid_is_alive ( int  pid)
static

References FALSE, pid_is_alive(), and TRUE.

Referenced by _lock_single_database(), and pid_is_alive().

Variable Documentation

◆ _trxid