#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)
_db_create_table_if_required(sqlite3 *db)
{
char *errmsg;
- int r;
+ int r, ret;
errmsg = NULL;
r = sqlite3_exec(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