/* this should be run within a transaction */ static int db_find_or_create_tag(const char *tag) { int tid; sqlite3_stmt *stmt; if( (tid = db_tag_id(tag)) > 0) { return tid; } DB_STMT_PREP("INSERT INTO tags (name) VALUES (?)", &stmt); DB_BIND_TEXT(stmt, 1, tag); DB_STMT_EXEC(stmt); tid = sqlite3_last_insert_rowid(g.handle); return tid; }
static int db_tag_id(const char *tag) { sqlite3_stmt *stmt; int id; id = 0; DB_STMT_PREP("SELECT id FROM tags WHERE name = ?", &stmt); DB_BIND_TEXT(stmt, 1, tag); if(db_stmt_step(stmt) != 0) goto done; /* no rows in the tags table */ id = sqlite3_column_int(stmt, 0); done: DB_STMT_FINALIZE(stmt); return id; }
static int beatmap_insert(osux_beatmap_db *db, osux_beatmap *bm) { int ret; if (!db->insert_prepared) { ret = osux_database_prepare_query( &db->base, "INSERT INTO beatmap " "(osu_beatmap_id, game_mode, audio_filename, diff_name," "md5_hash, osu_filename, file_path," "circles, sliders, spinners, last_modification, last_checked," "approach_rate, circle_size, hp_drain, overall_diff," "slider_velocity, stack_leniency, drain_time, total_time," "preview_time, bpm_avg, bpm_max, bpm_min, local_offset," "online_offset, already_played, last_played, ignore_hitsound," "ignore_skin, disable_sb, disable_video, visual_override," "mania_scroll_speed)" " VALUES" "(:osu_beatmap_id, :game_mode, :audio_filename, :diff_name," ":md5_hash, :osu_filename, :file_path," ":circles, :sliders, :spinners, :last_modification, :last_checked," ":approach_rate, :circle_size, :hp_drain, :overall_diff," ":slider_velocity, :stack_leniency, :drain_time, :total_time," ":preview_time, :bpm_avg, :bpm_max, :bpm_min, :local_offset," ":online_offset, :already_played, :last_played, :ignore_hitsound," ":ignore_skin, :disable_sb, :disable_video, :visual_override," ":mania_scroll_speed)"); if (ret < 0) return ret; db->insert_prepared = true; } DB_BIND_INT(db, "osu_beatmap_id", bm->BeatmapID); DB_BIND_INT(db, "game_mode", bm->Mode); DB_BIND_TEXT(db, "audio_filename", bm->AudioFilename); DB_BIND_TEXT(db, "md5_hash", bm->md5_hash); DB_BIND_TEXT(db, "osu_filename", bm->osu_filename); DB_BIND_TEXT(db, "file_path", bm->file_path); DB_BIND_TEXT(db, "diff_name", bm->Version); DB_BIND_INT(db, "circles", bm->circles); DB_BIND_INT(db, "sliders", bm->sliders); DB_BIND_INT(db, "spinners", bm->spinners); DB_BIND_INT(db, "last_modification", bm->last_modification); DB_BIND_INT(db, "last_checked", bm->last_checked); DB_BIND_DOUBLE(db, "approach_rate", bm->ApproachRate); DB_BIND_DOUBLE(db, "circle_size", bm->CircleSize); DB_BIND_DOUBLE(db, "hp_drain", bm->HPDrainRate); DB_BIND_DOUBLE(db, "overall_diff", bm->OverallDifficulty); DB_BIND_DOUBLE(db, "slider_velocity", bm->SliderMultiplier); DB_BIND_DOUBLE(db, "stack_leniency", bm->StackLeniency); DB_BIND_INT(db, "drain_time", bm->drain_time); DB_BIND_INT(db, "total_time", bm->total_time); DB_BIND_INT(db, "preview_time", bm->PreviewTime); DB_BIND_INT(db, "bpm_avg", bm->bpm_avg); DB_BIND_INT(db, "bpm_min", bm->bpm_min); DB_BIND_INT(db, "bpm_max", bm->bpm_max); DB_BIND_INT(db, "local_offset", bm->local_offset); DB_BIND_INT(db, "online_offset", bm->online_offset); DB_BIND_INT(db, "already_played", bm->already_played); DB_BIND_INT(db, "last_played", bm->last_played); DB_BIND_INT(db, "ignore_hitsound", bm->ignore_hitsound); DB_BIND_INT(db, "ignore_skin", bm->ignore_skin); DB_BIND_INT(db, "disable_sb", bm->disable_sb); DB_BIND_INT(db, "disable_video", bm->disable_video); DB_BIND_INT(db, "visual_override", bm->visual_override); DB_BIND_INT(db, "mania_scroll_speed", bm->mania_scroll_speed); return osux_database_exec_prepared_query(&db->base, NULL); }