Add functions missing in older SQLite3 versions (maemo bora uses it).
authorGustavo Sverzut Barbieri <barbieri@gmail.com>
Tue, 20 Nov 2007 20:14:37 +0000 (17:14 -0300)
committerGustavo Sverzut Barbieri <barbieri@gmail.com>
Wed, 21 Nov 2007 00:32:12 +0000 (21:32 -0300)
src/lib/lightmediascanner_db_common.c
src/lib/lightmediascanner_db_image.c
src/lib/lightmediascanner_db_private.h

index 2fd9d7f..e7a4b0c 100644 (file)
@@ -1,6 +1,81 @@
 #include "lightmediascanner_db_private.h"
 #include <stdlib.h>
 #include <stdio.h>
+#include <string.h>
+
+#if SQLITE_VERSION_NUMBER < 3003009
+int
+sqlite3_prepare_v2(sqlite3 *db, const char *sql, int len, sqlite3_stmt **stmt, const char **tail)
+{
+    return sqlite3_prepare(db, sql, len, stmt, tail);
+}
+#endif /* SQLITE_VERSION_NUMBER < 3003009 */
+
+#if SQLITE_VERSION_NUMBER < 3003007
+int
+sqlite3_clear_bindings(sqlite3_stmt *stmt)
+{
+    int i, last;
+    int rc;
+
+    rc = SQLITE_OK;
+    last = sqlite3_bind_parameter_count(stmt);
+    for(i = 1; rc == SQLITE_OK && i <= last; i++) {
+        rc = sqlite3_bind_null(stmt, i);
+    }
+    return rc;
+}
+#endif /* SQLITE_VERSION_NUMBER < 3003007 */
+
+#if SQLITE_VERSION_NUMBER < 3003008
+/* Until 3.3.8 it doesn't support CREATE TRIGGER IF NOT EXISTS, so
+ * just ignore errors :-(
+ */
+int
+lms_db_create_trigger_if_not_exists(sqlite3 *db, const char *sql)
+{
+    char *errmsg, *query;
+    int r, sql_len, prefix_len;
+
+    prefix_len = sizeof("CREATE TRIGGER ") - 1;
+    sql_len = strlen(sql);
+    query = malloc((prefix_len + sql_len + 1) * sizeof(char));
+    if (!query)
+        return -1;
+
+    memcpy(query, "CREATE TRIGGER ", prefix_len);
+    memcpy(query + prefix_len, sql, sql_len + 1);
+    r = sqlite3_exec(db, query, NULL, NULL, &errmsg);
+    free(query);
+    if (r != SQLITE_OK)
+        sqlite3_free(errmsg);
+    return 0;
+}
+#else /* SQLITE_VERSION_NUMBER < 3003008 */
+int
+lms_db_create_trigger_if_not_exists(sqlite3 *db, const char *sql)
+{
+    char *errmsg, *query;
+    int r, sql_len, prefix_len;
+
+    prefix_len = sizeof("CREATE TRIGGER IF NOT EXISTS ") - 1;
+    sql_len = strlen(sql);
+    query = malloc((prefix_len + sql_len + 1) * sizeof(char));
+    if (!query)
+        return -1;
+
+    memcpy(query, "CREATE TRIGGER IF NOT EXISTS ", prefix_len);
+    memcpy(query + prefix_len, sql, sql_len + 1);
+    r = sqlite3_exec(db, query, NULL, NULL, &errmsg);
+    free(query);
+    if (r != SQLITE_OK) {
+        fprintf(stderr, "ERROR: could not create trigger: %s\n", errmsg);
+        sqlite3_free(errmsg);
+        return -2;
+    }
+    return 0;
+}
+#endif /* SQLITE_VERSION_NUMBER < 3003008 */
 
 sqlite3_stmt *
 lms_db_compile_stmt(sqlite3 *db, const char *sql)
index 0817382..55cd00f 100644 (file)
@@ -15,7 +15,7 @@ static int
 _db_create_table_if_required(sqlite3 *db)
 {
     char *errmsg;
-    int r;
+    int r, ret;
 
     errmsg = NULL;
     r = sqlite3_exec(db,
@@ -52,39 +52,20 @@ _db_create_table_if_required(sqlite3 *db)
         return -2;
     }
 
-    r = sqlite3_exec(db,
-                     "CREATE TRIGGER IF NOT EXISTS"
-                     "   delete_images_on_files_deleted "
-                     "DELETE ON files "
-                     "FOR EACH ROW BEGIN "
-                     "   DELETE FROM images WHERE id = OLD.id;"
-                     "END;",
-                     NULL, NULL, &errmsg);
-    if (r != SQLITE_OK) {
-        fprintf(stderr, "ERROR: could not create trigger to delete images on "
-                "files deletion: %s\n",
-                errmsg);
-        sqlite3_free(errmsg);
-        return -2;
-    }
+    ret = lms_db_create_trigger_if_not_exists(db,
+        "   delete_images_on_files_deleted "
+        "DELETE ON files FOR EACH ROW BEGIN "
+        "   DELETE FROM images WHERE id = OLD.id; END;");
+    if (ret != 0)
+        goto done;
 
-    r = sqlite3_exec(db,
-                     "CREATE TRIGGER IF NOT EXISTS"
-                     "   delete_files_on_images_deleted "
-                     "DELETE ON images "
-                     "FOR EACH ROW BEGIN "
-                     "   DELETE FROM files WHERE id = OLD.id;"
-                     "END;",
-                     NULL, NULL, &errmsg);
-    if (r != SQLITE_OK) {
-        fprintf(stderr, "ERROR: could not create trigger to delete files on "
-                "images deletion: %s\n",
-                errmsg);
-        sqlite3_free(errmsg);
-        return -2;
-    }
+    ret = lms_db_create_trigger_if_not_exists(db,
+        "   delete_files_on_images_deleted "
+        "DELETE ON images FOR EACH ROW BEGIN "
+        "   DELETE FROM files WHERE id = OLD.id; END;");
 
-    return 0;
+  done:
+    return ret;
 }
 
 static int
index 534b704..7693a0b 100644 (file)
@@ -45,5 +45,6 @@ int lms_db_bind_text(sqlite3_stmt *stmt, int col, const char *text, int len) GNU
 int lms_db_bind_int64(sqlite3_stmt *stmt, int col, int64_t value) GNUC_NON_NULL(1);
 int lms_db_bind_int(sqlite3_stmt *stmt, int col, int value) GNUC_NON_NULL(1);
 int lms_db_bind_double(sqlite3_stmt *stmt, int col, double value) GNUC_NON_NULL(1);
+int lms_db_create_trigger_if_not_exists(sqlite3 *db, const char *sql) GNUC_NON_NULL(1, 2);
 
 #endif /* _LIGHTMEDIASCANNER_DB_PRIVATE_H_ */