int64_t library_directory(const char* path, int64_t parent) { static const char *sql = "INSERT INTO directories (path, parentid) VALUES(?, ?)"; sqlite3_stmt *query; int64_t result; result = field_rowid("directories", "path", path); /* Result is nonzero (found or error) or parent < 0. */ if (result != 0 || parent < 0) { return result; } if (!prepare_query(sql, &query)) { return -1; } sqlite3_bind_text(query, 1, path, -1, NULL); sqlite3_bind_int64(query, 2, parent); result = execute_scalar(query); return result ? result : sqlite3_last_insert_rowid(db_handle()); }
static bool prepare_query(const char *sql, sqlite3_stmt **query) { if (sqlite3_prepare_v2(db_handle(), sql, -1, query, NULL) != SQLITE_OK) { musicd_log(LOG_ERROR, "library", "can't prepare '%s': %s", sql, db_error()); return false; } return true; }
int64_t query_index(query_t *query, int64_t id) { string_t *sql = string_new(); char *where = build_filters(query); sqlite3_stmt *stmt; int64_t result; int64_t index = 1; string_append(sql, query->format->index); string_append(sql, query->format->from); string_append(sql, query->format->join); string_append(sql, where); free(where); if (string_size(query->order) > 0) { string_appendf(sql, " ORDER BY %s", string_string(query->order)); } musicd_log(LOG_DEBUG, "query", "%s", string_string(sql)); if (sqlite3_prepare_v2(db_handle(), string_string(sql), -1, &stmt, NULL) != SQLITE_OK) { musicd_log(LOG_ERROR, "query", "can't prepare '%s': %s", string_string(sql), db_error()); string_free(sql); return -1; } string_free(sql); bind_filters(query, stmt); while (1) { result = sqlite3_step(stmt); if (result == SQLITE_DONE) { result = 0; goto finish; } if (result != SQLITE_ROW) { musicd_log(LOG_ERROR, "query", "query_count: sqlite3_step failed"); result = -1; goto finish; } if (sqlite3_column_int64(stmt, 0) == id) { result = index; goto finish; } ++index; } finish: sqlite3_finalize(stmt); return result; }
/* Returns TRUE if row was inserted */ int bind_id_of(DBStatement *stmt, int i, const char *table, const char *column, const char *value) { DB *db; int inserted; db = db_handle(stmt); if (value && strlen(value)) { db_bind_int64(stmt, i, id_of_with_insert(db, table, column, value, &inserted)); } else { db_bind_null(stmt, i); } return inserted; }
/** * @todo FIXME More or less ugly value duplication. */ track_t *library_track_by_id(int64_t id) { sqlite3_stmt *stmt; track_t *track; int result; static const char *sql = "SELECT rowid AS id, fileid, file, cuefileid, cuefile, track, title, artistid, artist, albumid, album, start, duration, trackindex FROM tracks WHERE rowid = ?"; if (sqlite3_prepare_v2(db_handle(), sql, -1, &stmt, NULL) != SQLITE_OK) { musicd_log(LOG_ERROR, "library", "can't prepare '%s': %s", sql, db_error()); return NULL; } sqlite3_bind_int(stmt, 1, id); result = sqlite3_step(stmt); if (result == SQLITE_DONE) { return NULL; } else if (result != SQLITE_ROW) { musicd_log(LOG_ERROR, "library", "library_track_by_id: sqlite3_step failed"); return NULL; } track = track_new(); track->id = sqlite3_column_int64(stmt, 0); track->fileid = sqlite3_column_int64(stmt, 1); track->file = strcopy((const char *)sqlite3_column_text(stmt, 2)); track->cuefileid = sqlite3_column_int64(stmt, 3); track->cuefile = strcopy((const char *)sqlite3_column_text(stmt, 4)); track->track = sqlite3_column_int(stmt, 5); track->title = strcopy((const char *)sqlite3_column_text(stmt, 6)); track->artistid = sqlite3_column_int64(stmt, 7); track->artist = strcopy((const char *)sqlite3_column_text(stmt, 8)); track->albumid = sqlite3_column_int64(stmt, 9); track->album = strcopy((const char *)sqlite3_column_text(stmt, 10)); track->start = sqlite3_column_double(stmt, 11); track->duration = sqlite3_column_double(stmt, 12); track->trackindex = sqlite3_column_double(stmt, 13); /*musicd_log(LOG_DEBUG, "library", "%" PRId64 " %s %s %d %s %s %s %lf %lf", track->id, track->file, track->cuefile, track->track, track->title, track->artist, track->album, track->start, track->duration);*/ sqlite3_finalize(stmt); return track; }
int64_t library_track_add(track_t *track, int64_t directory) { static const char *sql = "INSERT INTO tracks (fileid, file, cuefileid, cuefile, track, title, artistid, artist, albumid, album, start, duration, trackindex) VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"; sqlite3_stmt *query; if (!prepare_query(sql, &query)) { return -1; } track->fileid = library_file(track->file, directory); if (track->cuefile) { track->cuefileid = library_file(track->cuefile, directory); } if (track->artist) { track->artistid = field_rowid_create("artists", "name", track->artist); } if (track->album) { track->albumid = field_rowid_create("albums", "name", track->album); } sqlite3_bind_int64(query, 1, track->fileid); sqlite3_bind_text(query, 2, track->file, -1, NULL); sqlite3_bind_int64(query, 3, track->cuefileid); sqlite3_bind_text(query, 4, track->cuefile, -1, NULL); sqlite3_bind_int(query, 5, track->track); sqlite3_bind_text(query, 6, track->title, -1, NULL); sqlite3_bind_int64(query, 7, track->artistid); sqlite3_bind_text(query, 8, track->artist, -1, NULL); sqlite3_bind_int64(query, 9, track->albumid); sqlite3_bind_text(query, 10, track->album, -1, NULL); sqlite3_bind_double(query, 11, track->start); sqlite3_bind_double(query, 12, track->duration); sqlite3_bind_double(query, 13, track->trackindex); if (!execute(query)) { return -1; } if (track->album) { increment_album_tracks(track->albumid); } return sqlite3_last_insert_rowid(db_handle()); }
int64_t library_image_add(int64_t file) { static const char *sql = "INSERT INTO images (fileid) VALUES(?)"; sqlite3_stmt *query; if (!prepare_query(sql, &query)) { return -1; } sqlite3_bind_int64(query, 1, file); if (!execute(query)) { return -1; } return sqlite3_last_insert_rowid(db_handle()); }
int64_t query_count(query_t *query) { string_t *sql = string_new(); char *where = build_filters(query); sqlite3_stmt *stmt; int64_t result; string_append(sql, query->format->count); string_append(sql, query->format->from); string_append(sql, query->format->join); string_append(sql, where); free(where); musicd_log(LOG_DEBUG, "query", "%s", string_string(sql)); if (sqlite3_prepare_v2(db_handle(), string_string(sql), -1, &stmt, NULL) != SQLITE_OK) { musicd_log(LOG_ERROR, "query", "can't prepare '%s': %s", string_string(sql), db_error()); string_free(sql); return -1; } string_free(sql); bind_filters(query, stmt); result = sqlite3_step(stmt); if (result != SQLITE_ROW) { musicd_log(LOG_ERROR, "query", "query_count: sqlite3_step failed"); result = -1; goto finish; } result = sqlite3_column_int64(stmt, 0); finish: sqlite3_finalize(stmt); return result; }
int query_start(query_t *query) { string_t *sql = string_new(); char *where = build_filters(query); sqlite3_stmt *stmt; string_append(sql, query->format->body); string_append(sql, query->format->from); string_append(sql, query->format->join); string_append(sql, where); free(where); if (string_size(query->order) > 0) { string_appendf(sql, " ORDER BY %s", string_string(query->order)); } if (query->limit > 0 || query->offset > 0) { string_appendf(sql, " LIMIT %" PRId64 " OFFSET %" PRId64 "", query->limit, query->offset); } musicd_log(LOG_DEBUG, "query", "%s", string_string(sql)); if (sqlite3_prepare_v2(db_handle(), string_string(sql), -1, &stmt, NULL) != SQLITE_OK) { musicd_log(LOG_ERROR, "query", "can't prepare '%s': %s", string_string(sql), db_error()); string_free(sql); return -1; } string_free(sql); bind_filters(query, stmt); query->stmt = stmt; return 0; }
static int64_t field_rowid_create(const char *table, const char *field, const char *value) { sqlite3_stmt *query; int64_t result; char *sql; result = field_rowid(table, field, value); if (result > 0) { return result; } sql = malloc(strlen(table) + strlen(field) + 32); sprintf(sql, "INSERT INTO %s (%s) VALUES (?)", table, field); if (!prepare_query(sql, &query)) { result = -1; } else { sqlite3_bind_text(query, 1, value, -1, NULL); result = execute_scalar(query); } free(sql); return sqlite3_last_insert_rowid(db_handle()); }