diff options
Diffstat (limited to 'src/pke-at-storage-sql.cpp')
| -rw-r--r-- | src/pke-at-storage-sql.cpp | 139 |
1 files changed, 137 insertions, 2 deletions
diff --git a/src/pke-at-storage-sql.cpp b/src/pke-at-storage-sql.cpp index 8efdd8c..6689314 100644 --- a/src/pke-at-storage-sql.cpp +++ b/src/pke-at-storage-sql.cpp @@ -3,15 +3,18 @@ #include "pke-at-settings.hpp" #include "sql/schema_000_000_sql.h" +#include "sql/ext_mapping_delete_sql.h" +#include "sql/ext_mapping_get_sql.h" +#include "sql/ext_mapping_upsert_sql.h" #include "sql/section_delete_sql.h" #include "sql/section_get_sql.h" #include "sql/section_upsert_sql.h" #include "sql/setlist_delete_sql.h" #include "sql/setlist_get_sql.h" -#include "sql/setlist_upsert_sql.h" #include "sql/setlist_song_delete_sql.h" #include "sql/setlist_song_get_sql.h" #include "sql/setlist_song_upsert_sql.h" +#include "sql/setlist_upsert_sql.h" #include "sql/song_delete_sql.h" #include "sql/song_get_sql.h" #include "sql/song_upsert_sql.h" @@ -25,7 +28,7 @@ #define PASIS_RES(R) { .result_code = pke_at_storage_interface_result_code(R) } #define PASIS_REST(R,V) { .result_code = pke_at_storage_interface_result_code(R), .value = V } -constexpr unsigned long query_text_length = 1024; +constexpr unsigned long query_text_length = 2048; static const char *SQLITE_DB_PATH = "pke-at.sqlite3"; @@ -593,3 +596,135 @@ cleanup: if (db != nullptr) sqlite3_close(db); return PASIS_RES(ret); } + +pke_at_storage_interface_response +pke_at_storage_sql::pke_at_storage_interface_ext_mapping_delete(pke_at_ext_mapping_details extern_id) +const { + int res, ret = 1; + size_t len = 0; + sqlite3 *db = nullptr; + char *sql_err_string = nullptr; + res = sqlite3_open(SQLITE_DB_PATH, &db); + assert(res == SQLITE_OK); + { + len = snprintf(sql_mstr.query_text, query_text_length, + "%.*s WHERE source_id='%u'", + src_sql_ext_mapping_delete_sql_len, src_sql_ext_mapping_delete_sql, extern_id.mapping_source); + switch (extern_id.mapping_type) { + case PKE_AT_EXT_MAPPING_TYPE_LONG: + len += snprintf(sql_mstr.query_text + len, query_text_length - len, " AND id_external_integer='%li'", extern_id.id.id_long); + break; + default: + fprintf(stderr, "[pke_at_storage_sql::pke_at_storage_interface_song_delete] Failed, Unhandled PKE_AT_EXT_MAPPING_TYPE: %i\n", extern_id.mapping_type); + ret= 2; + goto cleanup; + } + res = sqlite3_exec(db, sql_mstr.query_text, nullptr, nullptr, &sql_err_string); + if (res != SQLITE_OK) { + fprintf(stderr, "[pke_at_storage_sql::pke_at_storage_interface_song_delete] Failed, sqlite err: %i, %s\n", res, sql_err_string); + ret = 2; + goto cleanup; + } + } +cleanup: + if (db != nullptr) sqlite3_close(db); + return PASIS_RES(ret); +} + +pke_at_storage_interface_response_t<pke_at_ext_mappings> +pke_at_storage_sql::pke_at_storage_interface_ext_mapping_get(pke_at_ext_mapping_details extern_id) +const { + int res, ret = 1; + size_t len = 0; + sqlite3 *db = nullptr; + char *sql_err_string = nullptr; + pke_at_ext_mappings *details = nullptr; + res = sqlite3_open(SQLITE_DB_PATH, &db); + assert(res == SQLITE_OK); + { + len = snprintf(sql_mstr.query_text, query_text_length, + "%.*s WHERE source_id='%u'", + src_sql_ext_mapping_get_sql_len, src_sql_ext_mapping_get_sql, extern_id.mapping_source); + switch (extern_id.mapping_type) { + case PKE_AT_EXT_MAPPING_TYPE_LONG: + len += snprintf(sql_mstr.query_text + len, query_text_length - len, " AND id_external_integer='%li'", extern_id.id.id_long); + break; + default: + fprintf(stderr, "[pke_at_storage_sql::pke_at_storage_interface_ext_mapping_get] Failed, Unhandled PKE_AT_EXT_MAPPING_TYPE: %i\n", extern_id.mapping_type); + ret= 2; + goto cleanup; + } + auto fn = [](void *user_data, int column_count, char **argv, char **colname) -> int { + unsigned int u; + int i; + (void)colname; + PK_STN_RES stn_res; + auto **deets = reinterpret_cast<pke_at_ext_mappings**>(user_data); + if (*deets == nullptr) { + *deets = pk_new<pke_at_ext_mappings>(pkeSettings.mem_bkt.game_transient); + (*deets)->details = pk_arr_t<pke_at_ext_mapping_details>(pkeSettings.mem_bkt.game_transient); + } + pke_at_ext_mapping_details d{}; + for (i = 0; i < column_count; ++i) { + if (i == 0) { + stn_res = pk_stn(&u, argv[i], nullptr); + if (stn_res != PK_STN_RES_SUCCESS) { + fprintf(stderr, "[pke_at_storage_sql::pke_at_storage_interface_ext_mapping_get::fn] source_id STN err: %i.\n", stn_res); + return SQLITE_ERROR; + } + d.mapping_source = (PKE_AT_EXT_MAPPING_SOURCE)u; + } + if (i == 1) { + stn_res = pk_stn(&u, argv[i], nullptr); + if (stn_res != PK_STN_RES_SUCCESS) { + fprintf(stderr, "[pke_at_storage_sql::pke_at_storage_interface_ext_mapping_get::fn] id_external_integer STN err: %i.\n", stn_res); + return SQLITE_ERROR; + } + if (u != 0) { + d.mapping_type = PKE_AT_EXT_MAPPING_TYPE_LONG; + d.id.id_long = (PKE_AT_EXT_MAPPING_TYPE)u; + } + } + if (i == 2) { + d.uuid << argv[i]; + } + } + pk_arr_append_t<pke_at_ext_mapping_details>(&(*deets)->details, d); + return SQLITE_OK; + }; + res = sqlite3_exec(db, sql_mstr.query_text, fn, &details, &sql_err_string); + if (res != SQLITE_OK) { + fprintf(stderr, "[pke_at_storage_sql::pke_at_storage_interface_ext_mapping_get] Failed, sqlite err: %i, %s\n", res, sql_err_string); + ret = 2; + goto cleanup; + } + } +cleanup: + if (db != nullptr) sqlite3_close(db); + return PASIS_REST(ret, details); +} + +pke_at_storage_interface_response +pke_at_storage_sql::pke_at_storage_interface_ext_mapping_upsert(const pke_at_ext_mapping_details &external_id) +const { + int res, ret = 1; + sqlite3 *db = nullptr; + char *sql_err_string = nullptr; + res = sqlite3_open(SQLITE_DB_PATH, &db); + assert(res == SQLITE_OK); + { + char uuid[59]; + snprintf(uuid, 59, pk_uuid_printf_format, pk_uuid_printf_var(external_id.uuid)); + snprintf(sql_mstr.query_text, query_text_length, + (char*)src_sql_ext_mapping_upsert_sql, external_id.mapping_source, external_id.id.id_long, uuid); + res = sqlite3_exec(db, sql_mstr.query_text, nullptr, nullptr, &sql_err_string); + if (res != SQLITE_OK) { + fprintf(stderr, "[pke_at_storage_sql::pke_at_storage_interface_ext_mapping_upsert] Failed, sqlite err: %i, %s\n", res, sql_err_string); + ret = 2; + goto cleanup; + } + } +cleanup: + if (db != nullptr) sqlite3_close(db); + return PASIS_RES(ret); +} |
