int
lms_db_table_version_set(sqlite3 *db, const char *table, unsigned int version)
{
    int r, ret;
    sqlite3_stmt *stmt;

    stmt = lms_db_compile_stmt(db,
        "INSERT OR REPLACE INTO lms_internal (tab, version) VALUES (?, ?)");
    if (!stmt)
        return -1;

    ret = lms_db_bind_text(stmt, 1, table, -1);
    if (ret != 0)
        goto done;

    ret = lms_db_bind_int(stmt, 2, version);
    if (ret != 0)
        goto done;

    r = sqlite3_step(stmt);
    if (r != SQLITE_DONE) {
        ret = -1;
        fprintf(stderr, "ERROR: could not set table '%s' version: %s\n",
                table, sqlite3_errmsg(db));
    }

  done:
    lms_db_reset_stmt(stmt);
    lms_db_finalize_stmt(stmt, "table_version_set");

    return ret;
}
int
lms_db_table_version_get(sqlite3 *db, const char *table)
{
    int r, version;
    sqlite3_stmt *stmt;

    stmt = lms_db_compile_stmt(db,
         "SELECT version FROM lms_internal WHERE tab = ?");
    if (!stmt)
        return -1;

    if (lms_db_bind_text(stmt, 1, table, -1) != 0) {
        version = -1;
        goto done;
    }

    r = sqlite3_step(stmt);
    if (r == SQLITE_DONE)
        version = 0;
    else if (r == SQLITE_ROW)
        version = sqlite3_column_int(stmt, 0);
    else {
        version = -1;
        fprintf(stderr, "ERROR: could not get table '%s' version: %s\n",
                table, sqlite3_errmsg(db));
    }

  done:
    lms_db_reset_stmt(stmt);
    lms_db_finalize_stmt(stmt, "table_version_get");

    return version;
}
/**
 * Start playlist DB access tool.
 *
 * Compile SQL statements and other initialization functions.
 *
 * This is usually called from plugin's @b start() callback.
 *
 * @param ldp handle returned by lms_db_playlist_new().
 *
 * @return On success 0 is returned.
 * @ingroup LMS_Plugins
 */
int
lms_db_playlist_start(lms_db_playlist_t *ldp)
{
    if (!ldp)
        return -1;
    if (ldp->_is_started)
        return 0;

    ldp->insert = lms_db_compile_stmt(ldp->db,
        "INSERT OR REPLACE INTO playlists (id, title, n_entries) "
        "VALUES (?, ?, ?)");
    if (!ldp->insert)
        return -2;

    ldp->_is_started = 1;
    return 0;
}
/**
 * Start image DB access tool.
 *
 * Compile SQL statements and other initialization functions.
 *
 * This is usually called from plugin's @b start() callback.
 *
 * @param ldi handle returned by lms_db_image_new().
 *
 * @return On success 0 is returned.
 * @ingroup LMS_Plugins
 */
int
lms_db_image_start(lms_db_image_t *ldi)
{
    if (!ldi)
        return -1;
    if (ldi->_is_started)
        return 0;

    ldi->insert = lms_db_compile_stmt(ldi->db,
                                      "INSERT OR REPLACE INTO images ("
                                      "id, title, artist, date, width, height, orientation, "
                                      "gps_lat, gps_long, gps_alt, dlna_profile, dlna_mime, container) "
                                      "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
    if (!ldi->insert)
        return -2;

    ldi->_is_started = 1;
    return 0;
}
sqlite3_stmt *
lms_db_compile_stmt_get_files(sqlite3 *db)
{
    return lms_db_compile_stmt(db,
        "SELECT id, path, mtime, dtime, itime, size FROM files WHERE path LIKE ?");
}
sqlite3_stmt *
lms_db_compile_stmt_set_file_dtime(sqlite3 *db)
{
    return lms_db_compile_stmt(db, "UPDATE files SET dtime = ?, itime = ? WHERE id = ?");
}
sqlite3_stmt *
lms_db_compile_stmt_delete_file_info(sqlite3 *db)
{
    return lms_db_compile_stmt(db, "DELETE FROM files WHERE id = ?");
}
sqlite3_stmt *
lms_db_compile_stmt_insert_file_info(sqlite3 *db)
{
    return lms_db_compile_stmt(db,
        "INSERT INTO files (path, mtime, dtime, itime, size, update_id) VALUES(?, ?, ?, ?, ?, ?)");
}
sqlite3_stmt *
lms_db_compile_stmt_update_file_info(sqlite3 *db)
{
    return lms_db_compile_stmt(db,
        "UPDATE files SET mtime = ?, dtime = ?, itime = ?, size = ?, update_id = ? WHERE id = ?");
}
sqlite3_stmt *
lms_db_compile_stmt_end_transaction(sqlite3 *db)
{
    return lms_db_compile_stmt(db, "COMMIT");
}
sqlite3_stmt *
lms_db_compile_stmt_begin_transaction(sqlite3 *db)
{
    return lms_db_compile_stmt(db, "BEGIN TRANSACTION");
}