182 if(
t && !g_strcmp0(
t + 1, subkey))
203 char *setting = g_strdup_printf(
"plugins/lighttable/metadata/%s_flag",
name);
228 for(GList *
i = list;
i;
i = g_list_next(
i))
230 if(
i->data && !g_strcmp0(
i->data, data))
241 gchar *metadata_list = NULL;
246 GList *b2 = g_list_next(b);
247 gboolean different_value =
FALSE;
248 const char *
value = (
char *)b2->data;
251 GList *same2 = g_list_next(same_key);
252 different_value = g_strcmp0(same2->data, b2->data);
254 if(!same_key || different_value || !
value[0])
261 if(metadata_list) metadata_list[strlen(metadata_list) - 1] =
'\0';
262 return metadata_list;
269 gchar *metadata_list = NULL;
274 GList *a2 = g_list_next(a);
275 gboolean different_value =
FALSE;
276 const char *
value = (
char *)a2->data;
279 GList *same2 = g_list_next(same_key);
280 different_value = g_strcmp0(same2->data, a2->data);
282 if((!same_key || different_value) &&
value[0])
284 char *escaped_text = sqlite3_mprintf(
"%q",
value);
285 metadata_list =
dt_util_dstrcat(metadata_list,
"(%d,%d,'%s'),", GPOINTER_TO_INT(img), atoi(a->data), escaped_text);
286 sqlite3_free(escaped_text);
291 if(metadata_list) metadata_list[strlen(metadata_list) - 1] =
'\0';
292 return metadata_list;
297 if(img > 0 && metadata_list)
300 gchar *query = g_strdup_printf(
"DELETE FROM main.meta_data WHERE id = %d AND key IN (%s)", img, metadata_list);
303 sqlite3_finalize(stmt);
313 gchar *query = g_strdup_printf(
"INSERT INTO main.meta_data (id, key, value) VALUES %s", metadata_list);
316 sqlite3_finalize(stmt);
337 for(GList *list = (GList *)data; list; list = g_list_next(list))
344 *imgs = g_list_prepend(*imgs, GINT_TO_POINTER(undometadata->
imgid));
351 GList *metadata = NULL;
354 "SELECT key, value FROM main.meta_data WHERE id=?1", -1, &stmt, NULL);
356 while(sqlite3_step(stmt) == SQLITE_ROW)
358 const gchar *
value = (
const char *)sqlite3_column_text(stmt, 1);
359 gchar *ckey = g_strdup_printf(
"%d", sqlite3_column_int(stmt, 0));
361 metadata = g_list_append(metadata, (gpointer)ckey);
362 metadata = g_list_append(metadata, (gpointer)cvalue);
364 sqlite3_finalize(stmt);
374 metadata->
after = NULL;
380 GList *l = (GList *)data;
392 c =
v + strlen(
v) - 1;
393 while(c >=
v && *c ==
' ') *c-- =
'\0';
395 while(*c ==
' ') c++;
397 c = g_strdup(c ? c :
"");
404 GList *result = NULL;
406 uint32_t local_count = 0;
412 if(strncmp(
key,
"Xmp.xmp.Rating", 14) == 0)
418 "(SELECT imgid FROM main.selected_images)",
428 while(sqlite3_step(stmt) == SQLITE_ROW)
431 int stars = sqlite3_column_int(stmt, 0);
432 stars = (stars & 0x7) - 1;
433 result = g_list_prepend(result, GINT_TO_POINTER(stars));
435 sqlite3_finalize(stmt);
437 else if(strncmp(
key,
"Xmp.dc.subject", 14) == 0)
443 "SELECT name FROM data.tags t JOIN main.tagged_images i ON "
444 "i.tagid = t.id WHERE imgid IN "
445 "(SELECT imgid FROM main.selected_images)",
453 "SELECT name FROM data.tags t JOIN main.tagged_images i ON "
454 "i.tagid = t.id WHERE imgid = ?1",
459 while(sqlite3_step(stmt) == SQLITE_ROW)
462 result = g_list_prepend(result, g_strdup((
char *)sqlite3_column_text(stmt, 0)));
464 sqlite3_finalize(stmt);
466 else if(strncmp(
key,
"Xmp.darktable.colorlabels", 25) == 0)
472 "SELECT color FROM main.color_labels WHERE imgid IN "
473 "(SELECT imgid FROM main.selected_images)",
480 "SELECT color FROM main.color_labels WHERE imgid=?1 ORDER BY color",
484 while(sqlite3_step(stmt) == SQLITE_ROW)
487 result = g_list_prepend(result, GINT_TO_POINTER(sqlite3_column_int(stmt, 0)));
489 sqlite3_finalize(stmt);
492 return g_list_reverse(result);
502 "SELECT value FROM main.meta_data WHERE id IN "
503 "(SELECT imgid FROM main.selected_images) AND key = ?1 ORDER BY value",
509 sqlite3_clear_bindings(stmt);
517 "SELECT value FROM main.meta_data WHERE id = ?1 AND key = ?2 ORDER BY value", -1,
522 sqlite3_clear_bindings(stmt);
526 while(sqlite3_step(stmt) == SQLITE_ROW)
529 char *
value = (
char *)sqlite3_column_text(stmt, 0);
530 result = g_list_prepend(result, g_strdup(
value ?
value :
""));
533 return g_list_reverse(result);
552 const GList *
m = metadata;
555 GList *m2 = g_list_next(
m);
557 GList *same2 = g_list_next(same_key);
558 gboolean different_value =
FALSE;
559 if(same_key) different_value = g_strcmp0(same2->data, m2->data);
560 if(same_key && different_value)
564 same2->data = g_strdup(m2->data);
569 *list = g_list_append(*list, g_strdup(
m->data));
570 *list = g_list_append(*list, g_strdup(m2->data));
580 for(
const GList *
m = metadata;
m;
m = g_list_next(
m))
586 GList *same2 = g_list_next(same_key);
587 *list = g_list_remove_link(*list, same_key);
589 g_list_free(same_key);
591 *list = g_list_remove_link(*list, same2);
607 const gboolean undo_on,
const gint action)
609 for(
const GList *images = imgs; images; images = g_list_next(images))
611 const int32_t image_id = GPOINTER_TO_INT(images->data);
614 undometadata->
imgid = image_id;
619 undometadata->
after = metadata ? g_list_copy_deep((GList *)metadata, (GCopyFunc)g_strdup, NULL) : NULL;
622 undometadata->
after = g_list_copy_deep(undometadata->
before, (GCopyFunc)g_strdup, NULL);
626 undometadata->
after = g_list_copy_deep(undometadata->
before, (GCopyFunc)g_strdup, NULL);
630 undometadata->
after = g_list_copy_deep(undometadata->
before, (GCopyFunc)g_strdup, NULL);
637 *undo = g_list_append(*undo, undometadata);
654 imgs = g_list_prepend(imgs, GINT_TO_POINTER(imgid));
660 const gchar *ckey = g_strdup_printf(
"%d", keyid);
662 GList *metadata = NULL;
663 metadata = g_list_append(metadata, (gpointer)ckey);
664 metadata = g_list_append(metadata, (gpointer)cvalue);
694 char *setting = g_strdup_printf(
"plugins/lighttable/metadata/%s_flag",
name);
701 imgs = g_list_prepend(imgs, GINT_TO_POINTER(imgid));
706 const gchar *ckey = g_strdup_printf(
"%d", keyid);
708 GList *metadata = NULL;
709 metadata = g_list_append(metadata, (gpointer)ckey);
710 metadata = g_list_append(metadata, (gpointer)cvalue);
725 GList *metadata = NULL;
726 GList *kv = key_value;
729 const gchar *
key = (
const gchar *)kv->data;
733 const gchar *ckey = g_strdup_printf(
"%d", keyid);
734 kv = g_list_next(kv);
735 const gchar *
value = (
const gchar *)kv->data;
736 kv = g_list_next(kv);
739 metadata = g_list_append(metadata, (gchar *)ckey);
745 kv = g_list_next(kv);
746 kv = g_list_next(kv);
771 GList *metadata = NULL;
777 char *setting = g_strdup_printf(
"plugins/lighttable/metadata/%s_flag",
name);
783 metadata = g_list_prepend(metadata, g_strdup_printf(
"%d",
i));
790 metadata = g_list_reverse(metadata);
808 const gboolean undo_on)
829 char *
id = g_strconcat(filename,
"-", datetime, NULL);
832 "SELECT id FROM main.meta_data WHERE value=?1",
836 if(sqlite3_step(stmt) == SQLITE_ROW && sqlite3_column_int(stmt, 0) > -1)
837 imgid = sqlite3_column_int(stmt, 0);
838 sqlite3_finalize(stmt);
GList * dt_act_on_get_images()
gboolean dt_image_get_xmp_mode()
int dt_conf_key_exists(const char *key)
void dt_conf_set_int(const char *name, int val)
int dt_conf_get_int(const char *name)
static void dt_free_gpointer(gpointer ptr)
static const dt_aligned_pixel_simd_t value
#define IS_NULL_PTR(p)
C is way too permissive with !=, == and if(var) checks, which can mean too many things depending on w...
sqlite3 * dt_database_get(const dt_database_t *db)
#define DT_DEBUG_SQLITE3_PREPARE_V2(a, b, c, d, e)
#define DT_DEBUG_SQLITE3_BIND_TEXT(a, b, c, d, e)
#define DT_DEBUG_SQLITE3_BIND_INT(a, b, c)
const struct dt_database_t * db
void dt_undo_end_group(dt_undo_t *self)
void dt_undo_start_group(dt_undo_t *self, dt_undo_type_t type)
void dt_undo_record(dt_undo_t *self, gpointer user_data, dt_undo_type_t type, dt_undo_data_t data, void(*undo)(gpointer user_data, dt_undo_type_t type, dt_undo_data_t item, dt_undo_action_t action, GList **imgs), void(*free_data)(gpointer data))
gchar * dt_util_dstrcat(gchar *str, const gchar *format,...)