Example #1
0
File: library.c Project: EQ4/musicd
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());
}
Example #2
0
File: library.c Project: EQ4/musicd
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;
}
Example #3
0
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;
}
Example #4
0
/* 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;
}
Example #5
0
File: library.c Project: EQ4/musicd
/**
 * @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;
}
Example #6
0
File: library.c Project: EQ4/musicd
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());
}
Example #7
0
File: library.c Project: EQ4/musicd
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());
}
Example #8
0
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;
}
Example #9
0
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;
}
Example #10
0
File: library.c Project: EQ4/musicd
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());
}