summaryrefslogtreecommitdiff
path: root/src/db
diff options
context:
space:
mode:
Diffstat (limited to 'src/db')
-rw-r--r--src/db/DatabaseTable.vala51
-rw-r--r--src/db/Db.vala4
-rw-r--r--src/db/PhotoTable.vala7
-rw-r--r--src/db/VideoTable.vala7
4 files changed, 69 insertions, 0 deletions
diff --git a/src/db/DatabaseTable.vala b/src/db/DatabaseTable.vala
index dea797a..be45e5e 100644
--- a/src/db/DatabaseTable.vala
+++ b/src/db/DatabaseTable.vala
@@ -29,10 +29,61 @@ public abstract class DatabaseTable {
public string table_name = null;
+ static Gee.HashMap<string, Regex> regex_map;
+
+ private static void regexp_replace(Sqlite.Context context, Sqlite.Value[] args) {
+ var pattern = args[0].to_text();
+ if (pattern == null) {
+ context.result_error("Missing regular expression", Sqlite.ERROR);
+ return;
+ }
+
+ var text = args[1].to_text();
+ if (text == null) {
+ return;
+ }
+
+ var replacement = args[2].to_text();
+ if (replacement == null) {
+ context.result_value(args[1]);
+ return;
+ }
+
+ Regex re;
+ if (regex_map == null) {
+ regex_map = new Gee.HashMap<string, Regex>();
+ }
+ if (regex_map.has_key(pattern)) {
+ re = regex_map[pattern];
+ } else {
+ try {
+ re = new Regex(pattern, RegexCompileFlags.DEFAULT, RegexMatchFlags.DEFAULT);
+ regex_map[pattern] = re;
+ } catch (Error err) {
+ context.result_error("Invalid pattern: %s".printf(err.message), Sqlite.ERROR);
+ return;
+ }
+ }
+
+ try {
+ var result = re.replace(text, -1, 0, replacement, RegexMatchFlags.DEFAULT);
+ context.result_text(result);
+ } catch (Error err) {
+ context.result_error("Replacement failed: %s".printf(err.message), Sqlite.ERROR);
+ }
+ }
+
+ [CCode (cname="SQLITE_DETERMINISTIC", cheader_filename="sqlite3.h")]
+ extern static int SQLITE_DETERMINISTIC;
+
private static void prepare_db(string filename) {
// Open DB.
int res = Sqlite.Database.open_v2(filename, out db, Sqlite.OPEN_READWRITE | Sqlite.OPEN_CREATE,
null);
+
+ db.create_function("regexp_replace", 3, Sqlite.UTF8 | SQLITE_DETERMINISTIC, null,
+ DatabaseTable.regexp_replace, null, null);
+
if (res != Sqlite.OK)
AppWindow.panic(_("Unable to open/create photo database %s: error code %d").printf(filename,
res));
diff --git a/src/db/Db.vala b/src/db/Db.vala
index 5072967..7f76f2d 100644
--- a/src/db/Db.vala
+++ b/src/db/Db.vala
@@ -55,6 +55,10 @@ public VerifyResult verify_database(out string app_version, out int schema_versi
if (result != VerifyResult.OK)
return result;
}
+
+ PhotoTable.clean_comments();
+ VideoTable.clean_comments();
+
return VerifyResult.OK;
}
diff --git a/src/db/PhotoTable.vala b/src/db/PhotoTable.vala
index 420b209..d74cbd1 100644
--- a/src/db/PhotoTable.vala
+++ b/src/db/PhotoTable.vala
@@ -1123,6 +1123,13 @@ public class PhotoTable : DatabaseTable {
throw_error("PhotoTable.upgrade_for_unset_timestamp", res);
}
}
+
+ public static void clean_comments() throws DatabaseError {
+ var result = db.exec("UPDATE PhotoTable SET comment = regexp_replace('^charset=\\w+\\s*', comment, '') WHERE comment like 'charset=%'");
+ if (result != Sqlite.OK) {
+ throw_error("Cleaning comments from charset", result);
+ }
+ }
}
diff --git a/src/db/VideoTable.vala b/src/db/VideoTable.vala
index 8af1278..67c50ba 100644
--- a/src/db/VideoTable.vala
+++ b/src/db/VideoTable.vala
@@ -480,5 +480,12 @@ public class VideoTable : DatabaseTable {
}
}
+ public static void clean_comments() throws DatabaseError {
+ var result = db.exec("UPDATE VideoTable SET comment = regexp_replace('^charset=\\w+\\s*', comment, '') WHERE comment like 'charset=%'");
+ if (result != Sqlite.OK) {
+ throw_error("Cleaning comments from charset", result);
+ }
+ }
+
}