summaryrefslogtreecommitdiff
path: root/src/pke-at-storage-sql.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/pke-at-storage-sql.cpp')
-rw-r--r--src/pke-at-storage-sql.cpp139
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);
+}