From eff16310fcf602bbe93a9531956dd139b195053a Mon Sep 17 00:00:00 2001 From: avsdev-cw Date: Mon, 5 Oct 2020 17:02:52 +0100 Subject: [PATCH] Link an MODB name to a stored connection for easier usage --- src/modb.c | 14 ++++++ src/modb.h | 8 +++ src/modb_p.c | 139 +++++++++++++++++++++++++++++++++++++++++++++++++++ src/modb_p.h | 3 ++ 4 files changed, 164 insertions(+) diff --git a/src/modb.c b/src/modb.c index e66e704..7391517 100644 --- a/src/modb.c +++ b/src/modb.c @@ -9,6 +9,20 @@ #include "modb_p.h" +int modbUse(struct stored_conn_t *sconn, struct modb_t *modb, int override) +{ + return connectionUseMODB(sconn, modb, override) == 0; +} +int modbFindUse(struct stored_conn_t *sconn, struct modb_t *modb) +{ + return connectionGetUse(sconn, modb) == 1; +} +void modbReleaseUse(struct stored_conn_t *sconn) +{ + connectionReleaseMODB(sconn); +} + + int modbCreate(struct stored_conn_t *sconn, struct modb_t *modb) { if (createSysTable(sconn, modb) == (uint64_t)-1) { diff --git a/src/modb.h b/src/modb.h index a8a55b5..ba54ccb 100644 --- a/src/modb.h +++ b/src/modb.h @@ -5,6 +5,13 @@ #include "modb_types.h" +// Connection reference +int modbUse(struct stored_conn_t *sconn, struct modb_t *modb, int override); +int modbFindUse(struct stored_conn_t *sconn, struct modb_t *modb); +void modbReleaseUse(struct stored_conn_t *sconn); + + +// MODB instance int modbCreate(struct stored_conn_t *sconn, struct modb_t *modb); int modbExists(struct stored_conn_t *sconn, struct modb_t *modb); int modbDestroy(struct stored_conn_t *sconn, struct modb_t *modb); @@ -18,4 +25,5 @@ int modbMetaExtCreate(struct stored_conn_t *sconn, struct modb_t *modb, int modbMetaExtExists(struct stored_conn_t *sconn, struct modb_t *modb); int modbMetaExtDestroy(struct stored_conn_t *sconn, struct modb_t *modb); + #endif // H__MODB__ diff --git a/src/modb_p.c b/src/modb_p.c index 9ee57f6..5d05922 100644 --- a/src/modb_p.c +++ b/src/modb_p.c @@ -7,6 +7,18 @@ #include "strext.h" +struct sconn_modb_use_t { + struct stored_conn_t *sconn; + char *modb_name; + size_t modb_name_len; + + struct sconn_modb_use_t *next; + struct sconn_modb_use_t *prev; +}; + +static struct sconn_modb_use_t *storedUses = 0; + + uint64_t createSysTable(struct stored_conn_t *sconn, struct modb_t *modb) { char *qry; @@ -386,3 +398,130 @@ uint64_t destroyTable(struct stored_conn_t *sconn, struct modb_t *modb, return res; } + +struct sconn_modb_use_t *allocUse(struct stored_conn_t *sconn, struct modb_t *modb) +{ + struct sconn_modb_use_t *ptr = 0; + struct sconn_modb_use_t *tail; + + ptr = (struct sconn_modb_use_t *)malloc(sizeof(struct sconn_modb_use_t)); + if (ptr == 0) { + fprintf(stderr, "[%d]malloc: (%d) %s\n", __LINE__, errno, strerror(errno)); + return 0; + } + memset(ptr, 0, sizeof(struct sconn_modb_use_t)); + + ptr->sconn = sconn; + if (strmemcpy(modb->name, modb->name_len, &ptr->modb_name, &ptr->modb_name_len) == 0) { + fprintf(stderr, "[%d]malloc: (%d) %s\n", __LINE__, errno, strerror(errno)); + free(ptr); + return 0; + } + + if (storedUses == 0) { + storedUses = ptr; + } else { + tail = storedUses; + while (tail->next != 0) { + tail = tail->next; + } + tail->next = ptr; + ptr->prev = tail; + } + + return ptr; +} +void freeUse(struct sconn_modb_use_t *ptr) +{ + if (ptr->prev) { + ptr->prev->next = ptr->next; + } else { + storedUses = ptr->next; + } + + if (ptr->next) { + ptr->next->prev = ptr->prev; + } + + free(ptr->modb_name); + free(ptr); +} + +int connectionUseMODB(struct stored_conn_t *sconn, struct modb_t *modb, int override) +{ + struct sconn_modb_use_t *ptr = storedUses; + char *old_name; + + while (ptr != 0) { + if (ptr->sconn == sconn) { + break; + } + ptr = ptr->next; + } + + if (ptr != 0) { + if (ptr->modb_name_len != modb->name_len + && strncmp(ptr->modb_name, modb->name, modb->name_len) == 0) { + return 0; + } else { + if (override == 0) { + fprintf( + stderr, + "[%d]useMODB: Connection is already using MODB '%s'\n", + __LINE__, ptr->modb_name + ); + return -1; + } + + old_name = ptr->modb_name; + ptr->modb_name = (char *)realloc(ptr->modb_name, modb->name_len); + if (ptr->modb_name == 0) { + fprintf(stderr, "[%d]realloc: (%d) %s\n", __LINE__, errno, strerror(errno)); + ptr->modb_name = old_name; + return -1; + } + memcpy(ptr->modb_name, modb->name, modb->name_len); + return 0; + } + } + + if (allocUse(sconn, modb) == 0) { + return -1; + } + + return 0; +} +int connectionGetUse(struct stored_conn_t *sconn, struct modb_t *modb) +{ + struct sconn_modb_use_t *ptr = storedUses; + + while (ptr != 0) { + if (ptr->sconn == sconn) { + if (modb != 0) { + modb->name = ptr->modb_name; + modb->name_len = ptr->modb_name_len; + return 1; + } + } + ptr = ptr->next; + } + + return 0; +} +void connectionReleaseMODB(struct stored_conn_t *sconn) +{ + struct sconn_modb_use_t *ptr = storedUses; + + while (ptr != 0) { + if (ptr->sconn == sconn) { + break; + } + ptr = ptr->next; + } + + if (ptr == 0) { + return; + } + + freeUse(ptr); +} diff --git a/src/modb_p.h b/src/modb_p.h index 8ec43f1..ca125eb 100644 --- a/src/modb_p.h +++ b/src/modb_p.h @@ -38,5 +38,8 @@ int tableExists(struct stored_conn_t *sconn, struct modb_t *modb, uint64_t destroyTable(struct stored_conn_t *sconn, struct modb_t *modb, const char *suffix, size_t suffix_len); +int connectionUseMODB(struct stored_conn_t *sconn, struct modb_t *modb, int override); +int connectionGetUse(struct stored_conn_t *sconn, struct modb_t *modb); +void connectionReleaseMODB(struct stored_conn_t *sconn); #endif // H__MODB_P__