Author: akv
Date: 2010-01-26 20:58:37 +0100 (Tue, 26 Jan 2010)
New Revision: 3078
Modified:
branches/rawstudio-ng-color/src/rs-library.c
branches/rawstudio-ng-color/src/rs-library.h
Log:
Added library_backup_tags() and rs_library_restore_tags() to backup and restore
tags in photodir/.rawstudio/ directory. This will load tags if directory is
moved to a different workstation.
Modified: branches/rawstudio-ng-color/src/rs-library.c
===================================================================
--- branches/rawstudio-ng-color/src/rs-library.c 2010-01-25 21:43:17 UTC
(rev 3077)
+++ branches/rawstudio-ng-color/src/rs-library.c 2010-01-26 19:58:37 UTC
(rev 3078)
@@ -58,6 +58,8 @@
#include "conf_interface.h"
#include "config.h"
#include "gettext.h"
+#include <libxml/encoding.h>
+#include <libxml/xmlwriter.h>
#define LIBRARY_VERSION 1
@@ -89,6 +91,7 @@
static void library_tag_delete_photos(RSLibrary *library, const gint tag_id);
static gboolean library_tag_is_used(RSLibrary *library, const gint tag_id);
static void library_photo_default_tags(RSLibrary *library, const gint
photo_id, RSMetadata *metadata);
+static void library_backup_tags(RSLibrary *library, const gchar *directory);
static GtkWidget *tag_search_entry = NULL;
@@ -1059,3 +1062,129 @@
library_photo_default_tags(library, photo_id, metadata);
}
+static void
+library_backup_tags(RSLibrary *library, const gchar *directory)
+{
+ sqlite3 *db = library->db;
+ sqlite3_stmt *stmt;
+ gint rc;
+ gchar *filename = NULL, *checksum, *tag, *t_filename;
+ gint autotag;
+
+ const gchar *tagfile = g_build_filename(directory,
"/.rawstudio/tags.xml", NULL);
+ xmlTextWriterPtr writer;
+
+ writer = xmlNewTextWriterFilename(tagfile, 0);
+ xmlTextWriterSetIndent(writer, 1);
+ xmlTextWriterStartDocument(writer, NULL, "ISO-8859-1", NULL);
+ xmlTextWriterStartElement(writer, BAD_CAST "rawstudio-tags");
+ xmlTextWriterWriteFormatAttribute(writer, BAD_CAST "version", "%d",
LIBRARY_VERSION);
+
+ const gchar *temp = g_strdup_printf("%s/%%", directory);
+ rc = sqlite3_prepare_v2(db, "select
library.filename,library.identifier,tags.tagname,phototags.autotag from
library,phototags,tags where library.filename like ?1 and phototags.photo =
library.id and tags.id = phototags.tag order by library.filename;", -1, &stmt,
NULL);
+ rc = sqlite3_bind_text(stmt, 1, temp, strlen(temp), SQLITE_TRANSIENT);
+ library_sqlite_error(db, rc);
+ while (sqlite3_step(stmt) == SQLITE_ROW)
+ {
+ t_filename = g_path_get_basename(g_strdup((gchar *)
sqlite3_column_text(stmt, 0)));
+ if (g_strcmp0(t_filename, filename) != 0 || filename == NULL)
+ {
+ if (filename != NULL)
+ xmlTextWriterEndElement(writer);
+ filename = t_filename;
+ xmlTextWriterStartElement(writer, BAD_CAST "file");
+ xmlTextWriterWriteFormatAttribute(writer, BAD_CAST
"name", "%s", filename);
+ checksum = g_strdup((gchar *) sqlite3_column_text(stmt,
1));
+ xmlTextWriterWriteFormatAttribute(writer, BAD_CAST
"checksum", "%s", checksum);
+ }
+
+ tag = g_strdup((gchar *) sqlite3_column_text(stmt, 2));
+ autotag = (gint) sqlite3_column_int(stmt, 3);
+ xmlTextWriterStartElement(writer, BAD_CAST "tag");
+ xmlTextWriterWriteFormatAttribute(writer, BAD_CAST "name",
"%s", tag);
+ xmlTextWriterWriteFormatAttribute(writer, BAD_CAST "auto",
"%d", autotag);
+ xmlTextWriterEndElement(writer);
+ }
+ xmlTextWriterEndElement(writer);
+
+ rc = sqlite3_finalize(stmt);
+
+ xmlTextWriterEndDocument(writer);
+ xmlFreeTextWriter(writer);
+ return;
+}
+
+void
+rs_library_restore_tags(const gchar *directory)
+{
+ RSLibrary *library = rs_library_get_singleton();
+ const gchar *tagfile = g_build_filename(directory,
"/.rawstudio/tags.xml", NULL);
+
+ xmlDocPtr doc;
+ xmlNodePtr cur, cur2;
+ xmlChar *val;
+ gint version;
+
+ gchar *filename, *identifier, *tagname;
+ gint autotag, photoid, tagid;
+
+ doc = xmlParseFile(tagfile);
+ cur = xmlDocGetRootElement(doc);
+
+ if ((!xmlStrcmp(cur->name, BAD_CAST "rawstudio-tags")))
+ {
+ val = xmlGetProp(cur, BAD_CAST "version");
+ if (val)
+ version = atoi((gchar *) val);
+ }
+
+ cur = cur->xmlChildrenNode;
+ while(cur)
+ {
+ if ((!xmlStrcmp(cur->name, BAD_CAST "file")))
+ {
+ val = xmlGetProp(cur, BAD_CAST "name");
+ filename = g_build_filename(directory, val, NULL);
+ xmlFree(val);
+
+ photoid = library_find_photo_id(library, filename);
+ if ( photoid == -1)
+ {
+ photoid = rs_library_add_photo(library,
filename);
+
+ val = xmlGetProp(cur, BAD_CAST "checksum");
+ identifier = g_strdup((gchar*) val);
+ xmlFree(val);
+
+ cur2 = cur->xmlChildrenNode;
+ while(cur2)
+ {
+ if ((!xmlStrcmp(cur2->name, BAD_CAST
"tag")))
+ {
+ val = xmlGetProp(cur2, BAD_CAST
"name");
+ tagname = g_strdup((gchar*)
val);
+ xmlFree(val);
+ tagid =
library_find_tag_id(library, tagname);
+ if ( tagid == -1)
+ tagid =
rs_library_add_tag(library, tagname);
+
+ val = xmlGetProp(cur2, BAD_CAST
"auto");
+ autotag = atoi((gchar *) val);
+ xmlFree(val);
+
+ library_photo_add_tag(library,
photoid, tagid, (autotag == 1));
+
+ g_free(tagname);
+ }
+ cur2 = cur2->next;
+ }
+ g_free(identifier);
+ }
+ g_free(filename);
+ }
+ cur = cur->next;
+ }
+
+ xmlFreeDoc(doc);
+ return;
+}
Modified: branches/rawstudio-ng-color/src/rs-library.h
===================================================================
--- branches/rawstudio-ng-color/src/rs-library.h 2010-01-25 21:43:17 UTC
(rev 3077)
+++ branches/rawstudio-ng-color/src/rs-library.h 2010-01-26 19:58:37 UTC
(rev 3078)
@@ -56,6 +56,7 @@
GtkWidget *rs_library_tag_entry_new(RSLibrary *library);
gboolean rs_library_set_tag_search(gchar *str);
void rs_library_add_photo_with_metadata(RSLibrary *library, const gchar
*photo, RSMetadata *metadata);
+void rs_library_restore_tags(const gchar *directory);
G_END_DECLS
_______________________________________________
Rawstudio-commit mailing list
[email protected]
http://rawstudio.org/cgi-bin/mailman/listinfo/rawstudio-commit