Refactored MODB management
This commit is contained in:
@@ -16,11 +16,11 @@ int modbUse(stored_conn *sconn, modb_ref *modb, int override)
|
|||||||
}
|
}
|
||||||
int modbFindUse(stored_conn *sconn, modb_ref *modb)
|
int modbFindUse(stored_conn *sconn, modb_ref *modb)
|
||||||
{
|
{
|
||||||
return connectionGetUse(sconn, modb) == 1;
|
return connectionGetMODB(sconn, modb) == 1;
|
||||||
}
|
}
|
||||||
void modbReleaseUse(stored_conn *sconn)
|
void modbReleaseUse(stored_conn *sconn)
|
||||||
{
|
{
|
||||||
connectionReleaseMODB(sconn);
|
connectionUnuseMODB(sconn);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -30,18 +30,18 @@ int modbCreate(stored_conn *sconn, modb_ref *modb)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
if (createMetaTable(sconn, modb) == (uint64_t)-1) {
|
if (createMetaTable(sconn, modb) == (uint64_t)-1) {
|
||||||
destroyTable(sconn, modb, SYS_TABLE, STR_LEN(SYS_TABLE));
|
destroyMODBTable(sconn, modb, SYS_TABLE, STR_LEN(SYS_TABLE));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
if (createObjectsTable(sconn, modb) == (uint64_t)-1) {
|
if (createObjectsTable(sconn, modb) == (uint64_t)-1) {
|
||||||
destroyTable(sconn, modb, META_TABLE, STR_LEN(META_TABLE));
|
destroyMODBTable(sconn, modb, META_TABLE, STR_LEN(META_TABLE));
|
||||||
destroyTable(sconn, modb, SYS_TABLE, STR_LEN(SYS_TABLE));
|
destroyMODBTable(sconn, modb, SYS_TABLE, STR_LEN(SYS_TABLE));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
if (createMDOGroupsTable(sconn, modb) == (uint64_t)-1) {
|
if (createMDOGroupsTable(sconn, modb) == (uint64_t)-1) {
|
||||||
destroyTable(sconn, modb, OBJECTS_TABLE, STR_LEN(OBJECTS_TABLE));
|
destroyMODBTable(sconn, modb, OBJECTS_TABLE, STR_LEN(OBJECTS_TABLE));
|
||||||
destroyTable(sconn, modb, META_TABLE, STR_LEN(META_TABLE));
|
destroyMODBTable(sconn, modb, META_TABLE, STR_LEN(META_TABLE));
|
||||||
destroyTable(sconn, modb, SYS_TABLE, STR_LEN(SYS_TABLE));
|
destroyMODBTable(sconn, modb, SYS_TABLE, STR_LEN(SYS_TABLE));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -49,15 +49,15 @@ int modbCreate(stored_conn *sconn, modb_ref *modb)
|
|||||||
}
|
}
|
||||||
int modbExists(stored_conn *sconn, modb_ref *modb)
|
int modbExists(stored_conn *sconn, modb_ref *modb)
|
||||||
{
|
{
|
||||||
return tableExists(sconn, modb, META_TABLE, STR_LEN(META_TABLE));
|
return MODBTableExists(sconn, modb, META_TABLE, STR_LEN(META_TABLE));
|
||||||
}
|
}
|
||||||
int modbDestroy(stored_conn *sconn, modb_ref *modb)
|
int modbDestroy(stored_conn *sconn, modb_ref *modb)
|
||||||
{
|
{
|
||||||
uint64_t err = 0
|
uint64_t err = 0
|
||||||
| destroyTable(sconn, modb, MDO_GROUPS_TABLE, STR_LEN(MDO_GROUPS_TABLE))
|
| destroyMODBTable(sconn, modb, MDO_GROUPS_TABLE, STR_LEN(MDO_GROUPS_TABLE))
|
||||||
| destroyTable(sconn, modb, OBJECTS_TABLE, STR_LEN(OBJECTS_TABLE))
|
| destroyMODBTable(sconn, modb, OBJECTS_TABLE, STR_LEN(OBJECTS_TABLE))
|
||||||
| destroyTable(sconn, modb, META_TABLE, STR_LEN(META_TABLE))
|
| destroyMODBTable(sconn, modb, META_TABLE, STR_LEN(META_TABLE))
|
||||||
| destroyTable(sconn, modb, SYS_TABLE, STR_LEN(SYS_TABLE));
|
| destroyMODBTable(sconn, modb, SYS_TABLE, STR_LEN(SYS_TABLE));
|
||||||
return err == 0;
|
return err == 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -67,12 +67,12 @@ int modbAccountingCreate(stored_conn *sconn, modb_ref *modb)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
if (createGroupsTable(sconn, modb) == (uint64_t)-1) {
|
if (createGroupsTable(sconn, modb) == (uint64_t)-1) {
|
||||||
destroyTable(sconn, modb, USERS_TABLE, STR_LEN(USERS_TABLE));
|
destroyMODBTable(sconn, modb, USERS_TABLE, STR_LEN(USERS_TABLE));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
if (createUserGroupsTable(sconn, modb) == (uint64_t)-1) {
|
if (createUserGroupsTable(sconn, modb) == (uint64_t)-1) {
|
||||||
destroyTable(sconn, modb, GROUPS_TABLE, STR_LEN(GROUPS_TABLE));
|
destroyMODBTable(sconn, modb, GROUPS_TABLE, STR_LEN(GROUPS_TABLE));
|
||||||
destroyTable(sconn, modb, USERS_TABLE, STR_LEN(USERS_TABLE));
|
destroyMODBTable(sconn, modb, USERS_TABLE, STR_LEN(USERS_TABLE));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -80,14 +80,14 @@ int modbAccountingCreate(stored_conn *sconn, modb_ref *modb)
|
|||||||
}
|
}
|
||||||
int modbAccountingExists(stored_conn *sconn, modb_ref *modb)
|
int modbAccountingExists(stored_conn *sconn, modb_ref *modb)
|
||||||
{
|
{
|
||||||
return tableExists(sconn, modb, USERS_TABLE, STR_LEN(USERS_TABLE));
|
return MODBTableExists(sconn, modb, USERS_TABLE, STR_LEN(USERS_TABLE));
|
||||||
}
|
}
|
||||||
int modbAccountingDestroy(stored_conn *sconn, modb_ref *modb)
|
int modbAccountingDestroy(stored_conn *sconn, modb_ref *modb)
|
||||||
{
|
{
|
||||||
uint64_t err = 0
|
uint64_t err = 0
|
||||||
| destroyTable(sconn, modb, USER_GROUPS_TABLE, STR_LEN(USER_GROUPS_TABLE))
|
| destroyMODBTable(sconn, modb, USER_GROUPS_TABLE, STR_LEN(USER_GROUPS_TABLE))
|
||||||
| destroyTable(sconn, modb, GROUPS_TABLE, STR_LEN(GROUPS_TABLE))
|
| destroyMODBTable(sconn, modb, GROUPS_TABLE, STR_LEN(GROUPS_TABLE))
|
||||||
| destroyTable(sconn, modb, USERS_TABLE, STR_LEN(USERS_TABLE));
|
| destroyMODBTable(sconn, modb, USERS_TABLE, STR_LEN(USERS_TABLE));
|
||||||
return err == 0;
|
return err == 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -100,11 +100,11 @@ int modbMetaExtCreate(stored_conn *sconn, modb_ref *modb,
|
|||||||
}
|
}
|
||||||
int modbMetaExtExists(stored_conn *sconn, modb_ref *modb)
|
int modbMetaExtExists(stored_conn *sconn, modb_ref *modb)
|
||||||
{
|
{
|
||||||
return tableExists(sconn, modb, META_EXT_TABLE, STR_LEN(META_EXT_TABLE));
|
return MODBTableExists(sconn, modb, META_EXT_TABLE, STR_LEN(META_EXT_TABLE));
|
||||||
}
|
}
|
||||||
int modbMetaExtDestroy(stored_conn *sconn, modb_ref *modb)
|
int modbMetaExtDestroy(stored_conn *sconn, modb_ref *modb)
|
||||||
{
|
{
|
||||||
uint64_t err = 0
|
uint64_t err = 0
|
||||||
| destroyTable(sconn, modb, META_EXT_TABLE, STR_LEN(META_EXT_TABLE));
|
| destroyMODBTable(sconn, modb, META_EXT_TABLE, STR_LEN(META_EXT_TABLE));
|
||||||
return err == 0;
|
return err == 0;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -20,302 +20,6 @@ struct sconn_modb_use_t {
|
|||||||
static struct sconn_modb_use_t *storedUses = 0;
|
static struct sconn_modb_use_t *storedUses = 0;
|
||||||
|
|
||||||
|
|
||||||
uint64_t createSysTable(stored_conn *sconn, modb_ref *modb)
|
|
||||||
{
|
|
||||||
char *qry;
|
|
||||||
uint64_t res;
|
|
||||||
size_t qry_len;
|
|
||||||
str_builder *sb;
|
|
||||||
|
|
||||||
if ((sb = strbld_create()) == 0) {
|
|
||||||
return (uint64_t)-1;
|
|
||||||
}
|
|
||||||
strbld_str(sb, "CREATE TABLE ", 0);
|
|
||||||
modbTableName_sb(sb, modb, SYS_TABLE, STR_LEN(SYS_TABLE), '`');
|
|
||||||
strbld_str(sb, " ("
|
|
||||||
"`key` VARCHAR(255) NULL, "
|
|
||||||
"`value` VARCHAR(255) NULL, "
|
|
||||||
"UNIQUE(`key`)"
|
|
||||||
")", 0);
|
|
||||||
if (strbld_finalize_or_destroy(&sb, &qry, &qry_len) != 0) {
|
|
||||||
return (uint64_t)-1;
|
|
||||||
}
|
|
||||||
|
|
||||||
res = simpleQuery(sconn, qry, qry_len);
|
|
||||||
free(qry);
|
|
||||||
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
uint64_t createMetaTable(stored_conn *sconn, modb_ref *modb)
|
|
||||||
{
|
|
||||||
char *qry;
|
|
||||||
uint64_t res;
|
|
||||||
size_t qry_len;
|
|
||||||
str_builder *sb;
|
|
||||||
|
|
||||||
if ((sb = strbld_create()) == 0) {
|
|
||||||
return (uint64_t)-1;
|
|
||||||
}
|
|
||||||
strbld_str(sb, "CREATE TABLE ", 0);
|
|
||||||
modbTableName_sb(sb, modb, META_TABLE, STR_LEN(META_TABLE), '`');
|
|
||||||
strbld_str(sb, " ("
|
|
||||||
"`mdo_id` INT UNSIGNED NOT NULL AUTO_INCREMENT, "
|
|
||||||
"`title` VARCHAR(255) NOT NULL, "
|
|
||||||
"`owner` INT UNSIGNED NOT NULL, "
|
|
||||||
"`created` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, "
|
|
||||||
"`updated` TIMESTAMP on update CURRENT_TIMESTAMP NULL DEFAULT NULL, "
|
|
||||||
"`deleted` TIMESTAMP NULL DEFAULT NULL, "
|
|
||||||
"PRIMARY KEY(`mdo_id`)"
|
|
||||||
")", 0);
|
|
||||||
if (strbld_finalize_or_destroy(&sb, &qry, &qry_len) != 0) {
|
|
||||||
return (uint64_t)-1;
|
|
||||||
}
|
|
||||||
|
|
||||||
res = simpleQuery(sconn, qry, qry_len);
|
|
||||||
free(qry);
|
|
||||||
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
uint64_t createObjectsTable(stored_conn *sconn, modb_ref *modb)
|
|
||||||
{
|
|
||||||
char *qry;
|
|
||||||
uint64_t res;
|
|
||||||
size_t qry_len;
|
|
||||||
str_builder *sb;
|
|
||||||
|
|
||||||
if ((sb = strbld_create()) == 0) {
|
|
||||||
return (uint64_t)-1;
|
|
||||||
}
|
|
||||||
strbld_str(sb, "CREATE TABLE ", 0);
|
|
||||||
modbTableName_sb(sb, modb, OBJECTS_TABLE, STR_LEN(OBJECTS_TABLE), '`');
|
|
||||||
strbld_str(sb, " ("
|
|
||||||
"`mdo_id` INT UNSIGNED NOT NULL, "
|
|
||||||
"`object` MEDIUMBLOB NOT NULL, "
|
|
||||||
"PRIMARY KEY (`mdo_id`)"
|
|
||||||
")", 0);
|
|
||||||
if (strbld_finalize_or_destroy(&sb, &qry, &qry_len) != 0) {
|
|
||||||
return (uint64_t)-1;
|
|
||||||
}
|
|
||||||
|
|
||||||
res = simpleQuery(sconn, qry, qry_len);
|
|
||||||
free(qry);
|
|
||||||
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
uint64_t createMDOGroupsTable(stored_conn *sconn, modb_ref *modb)
|
|
||||||
{
|
|
||||||
char *qry;
|
|
||||||
uint64_t res;
|
|
||||||
size_t qry_len;
|
|
||||||
str_builder *sb;
|
|
||||||
|
|
||||||
if ((sb = strbld_create()) == 0) {
|
|
||||||
return (uint64_t)-1;
|
|
||||||
}
|
|
||||||
strbld_str(sb, "CREATE TABLE ", 0);
|
|
||||||
modbTableName_sb(sb, modb, MDO_GROUPS_TABLE, STR_LEN(MDO_GROUPS_TABLE), '`');
|
|
||||||
strbld_str(sb, " ("
|
|
||||||
"`mdo_id` INT UNSIGNED NOT NULL, "
|
|
||||||
"`group_id` INT UNSIGNED NOT NULL, "
|
|
||||||
"INDEX(`mdo_id`), "
|
|
||||||
"INDEX(`group_id`)"
|
|
||||||
")", 0);
|
|
||||||
if (strbld_finalize_or_destroy(&sb, &qry, &qry_len) != 0) {
|
|
||||||
return (uint64_t)-1;
|
|
||||||
}
|
|
||||||
|
|
||||||
res = simpleQuery(sconn, qry, qry_len);
|
|
||||||
free(qry);
|
|
||||||
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
|
|
||||||
uint64_t createUsersTable(stored_conn *sconn, modb_ref *modb)
|
|
||||||
{
|
|
||||||
char *qry;
|
|
||||||
uint64_t res;
|
|
||||||
size_t qry_len;
|
|
||||||
str_builder *sb;
|
|
||||||
|
|
||||||
if ((sb = strbld_create()) == 0) {
|
|
||||||
return (uint64_t)-1;
|
|
||||||
}
|
|
||||||
strbld_str(sb, "CREATE TABLE ", 0);
|
|
||||||
modbTableName_sb(sb, modb, USERS_TABLE, STR_LEN(USERS_TABLE), '`');
|
|
||||||
strbld_str(sb, " ("
|
|
||||||
"`id` INT UNSIGNED NOT NULL AUTO_INCREMENT, "
|
|
||||||
"`username` VARCHAR(255) NOT NULL, "
|
|
||||||
"`email` VARCHAR(255) NOT NULL, "
|
|
||||||
"`created` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, "
|
|
||||||
"`updated` TIMESTAMP on update CURRENT_TIMESTAMP NULL DEFAULT NULL, "
|
|
||||||
"`deleted` TIMESTAMP NULL DEFAULT NULL, "
|
|
||||||
"PRIMARY KEY (`id`), "
|
|
||||||
"UNIQUE(`username`), "
|
|
||||||
"UNIQUE(`email`)"
|
|
||||||
")", 0);
|
|
||||||
if (strbld_finalize_or_destroy(&sb, &qry, &qry_len) != 0) {
|
|
||||||
return (uint64_t)-1;
|
|
||||||
}
|
|
||||||
|
|
||||||
res = simpleQuery(sconn, qry, qry_len);
|
|
||||||
free(qry);
|
|
||||||
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
uint64_t createGroupsTable(stored_conn *sconn, modb_ref *modb)
|
|
||||||
{
|
|
||||||
char *qry;
|
|
||||||
uint64_t res;
|
|
||||||
size_t qry_len;
|
|
||||||
str_builder *sb;
|
|
||||||
|
|
||||||
if ((sb = strbld_create()) == 0) {
|
|
||||||
return (uint64_t)-1;
|
|
||||||
}
|
|
||||||
strbld_str(sb, "CREATE TABLE ", 0);
|
|
||||||
modbTableName_sb(sb, modb, GROUPS_TABLE, STR_LEN(GROUPS_TABLE), '`');
|
|
||||||
strbld_str(sb, " ("
|
|
||||||
"`id` INT UNSIGNED NOT NULL AUTO_INCREMENT, "
|
|
||||||
"`name` VARCHAR(255) NOT NULL, "
|
|
||||||
"`created` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, "
|
|
||||||
"`updated` TIMESTAMP on update CURRENT_TIMESTAMP NULL DEFAULT NULL, "
|
|
||||||
"`deleted` TIMESTAMP NULL DEFAULT NULL, "
|
|
||||||
"PRIMARY KEY (`id`), "
|
|
||||||
"UNIQUE(`name`)"
|
|
||||||
")", 0);
|
|
||||||
if (strbld_finalize_or_destroy(&sb, &qry, &qry_len) != 0) {
|
|
||||||
return (uint64_t)-1;
|
|
||||||
}
|
|
||||||
|
|
||||||
res = simpleQuery(sconn, qry, qry_len);
|
|
||||||
free(qry);
|
|
||||||
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
uint64_t createUserGroupsTable(stored_conn *sconn, modb_ref *modb)
|
|
||||||
{
|
|
||||||
char *qry;
|
|
||||||
uint64_t res;
|
|
||||||
size_t qry_len;
|
|
||||||
str_builder *sb;
|
|
||||||
|
|
||||||
if ((sb = strbld_create()) == 0) {
|
|
||||||
return (uint64_t)-1;
|
|
||||||
}
|
|
||||||
strbld_str(sb, "CREATE TABLE ", 0);
|
|
||||||
modbTableName_sb(sb, modb, USER_GROUPS_TABLE, STR_LEN(USER_GROUPS_TABLE), '`');
|
|
||||||
strbld_str(sb, " ("
|
|
||||||
"`user_id` INT UNSIGNED NOT NULL, "
|
|
||||||
"`group_id` INT UNSIGNED NOT NULL, "
|
|
||||||
"INDEX(`user_id`), "
|
|
||||||
"INDEX(`group_id`)"
|
|
||||||
")", 0);
|
|
||||||
if (strbld_finalize_or_destroy(&sb, &qry, &qry_len) != 0) {
|
|
||||||
return (uint64_t)-1;
|
|
||||||
}
|
|
||||||
|
|
||||||
res = simpleQuery(sconn, qry, qry_len);
|
|
||||||
free(qry);
|
|
||||||
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
uint64_t createMetaExtTable(stored_conn *sconn, modb_ref *modb,
|
|
||||||
column_data **col_data, size_t cols)
|
|
||||||
{
|
|
||||||
char *qry;
|
|
||||||
uint64_t res;
|
|
||||||
size_t qry_len;
|
|
||||||
str_builder *sb;
|
|
||||||
|
|
||||||
if ((sb = strbld_create()) == 0) {
|
|
||||||
return (uint64_t)-1;
|
|
||||||
}
|
|
||||||
strbld_str(sb, "CREATE TABLE ", 0);
|
|
||||||
modbTableName_sb(sb, modb, META_EXT_TABLE, STR_LEN(META_EXT_TABLE), '`');
|
|
||||||
strbld_str(sb, " ("
|
|
||||||
"`mdo_id` INT UNSIGNED NOT NULL", 0);
|
|
||||||
for (size_t c = 0; c < cols; c++) {
|
|
||||||
createColumn_sb(sb, *(col_data + c));
|
|
||||||
}
|
|
||||||
strbld_str(sb, ", INDEX (`mdo_id`))", 0);
|
|
||||||
if (strbld_finalize_or_destroy(&sb, &qry, &qry_len) != 0) {
|
|
||||||
return (uint64_t)-1;
|
|
||||||
}
|
|
||||||
|
|
||||||
res = simpleQuery(sconn, qry, qry_len);
|
|
||||||
free(qry);
|
|
||||||
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
int tableExists(stored_conn *sconn, modb_ref *modb, const char *suffix, size_t suffix_len)
|
|
||||||
{
|
|
||||||
char *qry, *res;
|
|
||||||
size_t qry_len;
|
|
||||||
str_builder *sb;
|
|
||||||
int retval = 0;
|
|
||||||
|
|
||||||
if ((sb = strbld_create()) == 0) {
|
|
||||||
return -errno;
|
|
||||||
}
|
|
||||||
strbld_str(sb, "SHOW TABLES LIKE ", 0);
|
|
||||||
modbTableName_sb(sb, modb, suffix, suffix_len, '\'');
|
|
||||||
if (strbld_finalize_or_destroy(&sb, &qry, &qry_len) != 0) {
|
|
||||||
return -errno;
|
|
||||||
}
|
|
||||||
|
|
||||||
res = scalarString(sconn, qry, qry_len, "Z");
|
|
||||||
/* Result:
|
|
||||||
* 0: query success, no result returned
|
|
||||||
* 1: query failed, default ("Z") returned
|
|
||||||
* 2: query success, result does not match required length
|
|
||||||
* 3: query success, result matches required length (check content)
|
|
||||||
*/
|
|
||||||
if (res == 0) {
|
|
||||||
retval = 0;
|
|
||||||
} else if (strlen(res) == 1 && strncmp(res, "Z", 1) == 0) {
|
|
||||||
retval = -1;
|
|
||||||
} else if (strlen(res) != (modb->name_len + suffix_len)) {
|
|
||||||
retval = 0;
|
|
||||||
} else {
|
|
||||||
retval = strncmp(res, modb->name, modb->name_len) == 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (res != 0) {
|
|
||||||
free(res);
|
|
||||||
}
|
|
||||||
free(qry);
|
|
||||||
|
|
||||||
return retval;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
uint64_t destroyTable(stored_conn *sconn, modb_ref *modb, const char *suffix, size_t suffix_len)
|
|
||||||
{
|
|
||||||
char *qry;
|
|
||||||
uint64_t res;
|
|
||||||
size_t qry_len;
|
|
||||||
str_builder *sb;
|
|
||||||
|
|
||||||
if ((sb = strbld_create()) == 0) {
|
|
||||||
return (uint64_t)-1;
|
|
||||||
}
|
|
||||||
strbld_str(sb, "DROP TABLE ", 0);
|
|
||||||
modbTableName_sb(sb, modb, suffix, suffix_len, '`');
|
|
||||||
if (strbld_finalize_or_destroy(&sb, &qry, &qry_len) != 0) {
|
|
||||||
return (uint64_t)-1;
|
|
||||||
}
|
|
||||||
|
|
||||||
res = simpleQuery(sconn, qry, qry_len);
|
|
||||||
free(qry);
|
|
||||||
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
struct sconn_modb_use_t *allocUse(stored_conn *sconn, modb_ref *modb)
|
struct sconn_modb_use_t *allocUse(stored_conn *sconn, modb_ref *modb)
|
||||||
{
|
{
|
||||||
struct sconn_modb_use_t *ptr = 0;
|
struct sconn_modb_use_t *ptr = 0;
|
||||||
@@ -408,7 +112,7 @@ int connectionUseMODB(stored_conn *sconn, modb_ref *modb, int override)
|
|||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
int connectionGetUse(stored_conn *sconn, modb_ref *modb)
|
int connectionGetMODB(stored_conn *sconn, modb_ref *modb)
|
||||||
{
|
{
|
||||||
struct sconn_modb_use_t *ptr = storedUses;
|
struct sconn_modb_use_t *ptr = storedUses;
|
||||||
|
|
||||||
@@ -425,7 +129,7 @@ int connectionGetUse(stored_conn *sconn, modb_ref *modb)
|
|||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
void connectionReleaseMODB(stored_conn *sconn)
|
void connectionUnuseMODB(stored_conn *sconn)
|
||||||
{
|
{
|
||||||
struct sconn_modb_use_t *ptr = storedUses;
|
struct sconn_modb_use_t *ptr = storedUses;
|
||||||
|
|
||||||
@@ -442,3 +146,229 @@ void connectionReleaseMODB(stored_conn *sconn)
|
|||||||
|
|
||||||
freeUse(ptr);
|
freeUse(ptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
uint64_t createMODBTable(stored_conn *sconn, modb_ref *modb, const char *suffix, size_t suffix_len,
|
||||||
|
const char *table_def, size_t table_def_len)
|
||||||
|
{
|
||||||
|
char *qry;
|
||||||
|
uint64_t res;
|
||||||
|
size_t qry_len;
|
||||||
|
str_builder *sb;
|
||||||
|
|
||||||
|
if ((sb = strbld_create()) == 0) {
|
||||||
|
return (uint64_t)-1;
|
||||||
|
}
|
||||||
|
strbld_str(sb, "CREATE TABLE ", 0);
|
||||||
|
modbTableName_sb(sb, modb, suffix, suffix_len, '`');
|
||||||
|
strbld_char(sb, ' ');
|
||||||
|
strbld_str(sb, table_def, table_def_len);
|
||||||
|
if (strbld_finalize_or_destroy(&sb, &qry, &qry_len) != 0) {
|
||||||
|
return (uint64_t)-1;
|
||||||
|
}
|
||||||
|
|
||||||
|
res = simpleQuery(sconn, qry, qry_len);
|
||||||
|
free(qry);
|
||||||
|
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
int MODBTableExists(stored_conn *sconn, modb_ref *modb, const char *suffix, size_t suffix_len)
|
||||||
|
{
|
||||||
|
char *qry, *res;
|
||||||
|
size_t qry_len;
|
||||||
|
str_builder *sb;
|
||||||
|
int retval = 0;
|
||||||
|
|
||||||
|
if ((sb = strbld_create()) == 0) {
|
||||||
|
return -errno;
|
||||||
|
}
|
||||||
|
strbld_str(sb, "SHOW TABLES LIKE ", 0);
|
||||||
|
modbTableName_sb(sb, modb, suffix, suffix_len, '\'');
|
||||||
|
if (strbld_finalize_or_destroy(&sb, &qry, &qry_len) != 0) {
|
||||||
|
return -errno;
|
||||||
|
}
|
||||||
|
|
||||||
|
res = scalarString(sconn, qry, qry_len, "Z");
|
||||||
|
/* Result:
|
||||||
|
* 0: query success, no result returned
|
||||||
|
* 1: query failed, default ("Z") returned
|
||||||
|
* 2: query success, result does not match required length
|
||||||
|
* 3: query success, result matches required length (check content)
|
||||||
|
*/
|
||||||
|
if (res == 0) {
|
||||||
|
retval = 0;
|
||||||
|
} else if (strlen(res) == 1 && strncmp(res, "Z", 1) == 0) {
|
||||||
|
retval = -1;
|
||||||
|
} else if (strlen(res) != (modb->name_len + suffix_len)) {
|
||||||
|
retval = 0;
|
||||||
|
} else {
|
||||||
|
retval = strncmp(res, modb->name, modb->name_len) == 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (res != 0) {
|
||||||
|
free(res);
|
||||||
|
}
|
||||||
|
free(qry);
|
||||||
|
|
||||||
|
return retval;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint64_t destroyMODBTable(stored_conn *sconn, modb_ref *modb, const char *suffix, size_t suffix_len)
|
||||||
|
{
|
||||||
|
char *qry;
|
||||||
|
uint64_t res;
|
||||||
|
size_t qry_len;
|
||||||
|
str_builder *sb;
|
||||||
|
|
||||||
|
if ((sb = strbld_create()) == 0) {
|
||||||
|
return (uint64_t)-1;
|
||||||
|
}
|
||||||
|
strbld_str(sb, "DROP TABLE ", 0);
|
||||||
|
modbTableName_sb(sb, modb, suffix, suffix_len, '`');
|
||||||
|
if (strbld_finalize_or_destroy(&sb, &qry, &qry_len) != 0) {
|
||||||
|
return (uint64_t)-1;
|
||||||
|
}
|
||||||
|
|
||||||
|
res = simpleQuery(sconn, qry, qry_len);
|
||||||
|
free(qry);
|
||||||
|
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
uint64_t createSysTable(stored_conn *sconn, modb_ref *modb)
|
||||||
|
{
|
||||||
|
return createMODBTable(
|
||||||
|
sconn, modb,
|
||||||
|
SYS_TABLE, STR_LEN(SYS_TABLE),
|
||||||
|
"("
|
||||||
|
"`key` VARCHAR(255) NULL, "
|
||||||
|
"`value` VARCHAR(255) NULL, "
|
||||||
|
"UNIQUE(`key`)"
|
||||||
|
")", 0
|
||||||
|
);
|
||||||
|
}
|
||||||
|
uint64_t createMetaTable(stored_conn *sconn, modb_ref *modb)
|
||||||
|
{
|
||||||
|
return createMODBTable(
|
||||||
|
sconn, modb,
|
||||||
|
META_TABLE, STR_LEN(META_TABLE),
|
||||||
|
"("
|
||||||
|
"`mdo_id` INT UNSIGNED NOT NULL AUTO_INCREMENT, "
|
||||||
|
"`title` VARCHAR(255) NOT NULL, "
|
||||||
|
"`owner` INT UNSIGNED NOT NULL, "
|
||||||
|
"`created` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, "
|
||||||
|
"`updated` TIMESTAMP on update CURRENT_TIMESTAMP NULL DEFAULT NULL, "
|
||||||
|
"`deleted` TIMESTAMP NULL DEFAULT NULL, "
|
||||||
|
"PRIMARY KEY(`mdo_id`)"
|
||||||
|
")", 0
|
||||||
|
);
|
||||||
|
}
|
||||||
|
uint64_t createObjectsTable(stored_conn *sconn, modb_ref *modb)
|
||||||
|
{
|
||||||
|
return createMODBTable(
|
||||||
|
sconn, modb,
|
||||||
|
OBJECTS_TABLE, STR_LEN(OBJECTS_TABLE),
|
||||||
|
"("
|
||||||
|
"`mdo_id` INT UNSIGNED NOT NULL, "
|
||||||
|
"`object` MEDIUMBLOB NOT NULL, "
|
||||||
|
"PRIMARY KEY (`mdo_id`)"
|
||||||
|
")", 0
|
||||||
|
);
|
||||||
|
}
|
||||||
|
uint64_t createMDOGroupsTable(stored_conn *sconn, modb_ref *modb)
|
||||||
|
{
|
||||||
|
return createMODBTable(
|
||||||
|
sconn, modb,
|
||||||
|
MDO_GROUPS_TABLE, STR_LEN(MDO_GROUPS_TABLE),
|
||||||
|
"("
|
||||||
|
"`mdo_id` INT UNSIGNED NOT NULL, "
|
||||||
|
"`group_id` INT UNSIGNED NOT NULL, "
|
||||||
|
"INDEX(`mdo_id`), "
|
||||||
|
"INDEX(`group_id`)"
|
||||||
|
")", 0
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint64_t createUsersTable(stored_conn *sconn, modb_ref *modb)
|
||||||
|
{
|
||||||
|
return createMODBTable(
|
||||||
|
sconn, modb,
|
||||||
|
USERS_TABLE, STR_LEN(USERS_TABLE),
|
||||||
|
"("
|
||||||
|
"`id` INT UNSIGNED NOT NULL AUTO_INCREMENT, "
|
||||||
|
"`username` VARCHAR(255) NOT NULL, "
|
||||||
|
"`email` VARCHAR(255) NOT NULL, "
|
||||||
|
"`created` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, "
|
||||||
|
"`updated` TIMESTAMP on update CURRENT_TIMESTAMP NULL DEFAULT NULL, "
|
||||||
|
"`deleted` TIMESTAMP NULL DEFAULT NULL, "
|
||||||
|
"PRIMARY KEY (`id`), "
|
||||||
|
"UNIQUE(`username`), "
|
||||||
|
"UNIQUE(`email`)"
|
||||||
|
")", 0
|
||||||
|
);
|
||||||
|
}
|
||||||
|
uint64_t createGroupsTable(stored_conn *sconn, modb_ref *modb)
|
||||||
|
{
|
||||||
|
return createMODBTable(
|
||||||
|
sconn, modb,
|
||||||
|
GROUPS_TABLE, STR_LEN(GROUPS_TABLE),
|
||||||
|
"("
|
||||||
|
"`id` INT UNSIGNED NOT NULL AUTO_INCREMENT, "
|
||||||
|
"`name` VARCHAR(255) NOT NULL, "
|
||||||
|
"`created` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, "
|
||||||
|
"`updated` TIMESTAMP on update CURRENT_TIMESTAMP NULL DEFAULT NULL, "
|
||||||
|
"`deleted` TIMESTAMP NULL DEFAULT NULL, "
|
||||||
|
"PRIMARY KEY (`id`), "
|
||||||
|
"UNIQUE(`name`)"
|
||||||
|
")", 0
|
||||||
|
);
|
||||||
|
}
|
||||||
|
uint64_t createUserGroupsTable(stored_conn *sconn, modb_ref *modb)
|
||||||
|
{
|
||||||
|
return createMODBTable(
|
||||||
|
sconn, modb,
|
||||||
|
USER_GROUPS_TABLE, STR_LEN(USER_GROUPS_TABLE),
|
||||||
|
"("
|
||||||
|
"`user_id` INT UNSIGNED NOT NULL, "
|
||||||
|
"`group_id` INT UNSIGNED NOT NULL, "
|
||||||
|
"INDEX(`user_id`), "
|
||||||
|
"INDEX(`group_id`)"
|
||||||
|
")", 0
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint64_t createMetaExtTable(stored_conn *sconn, modb_ref *modb,
|
||||||
|
column_data **col_data, size_t cols)
|
||||||
|
{
|
||||||
|
char *table_def;
|
||||||
|
size_t table_def_len;
|
||||||
|
uint64_t ret_val;
|
||||||
|
|
||||||
|
str_builder *sb;
|
||||||
|
|
||||||
|
if ((sb = strbld_create()) == 0) {
|
||||||
|
return (uint64_t)-1;
|
||||||
|
}
|
||||||
|
strbld_str(sb, "("
|
||||||
|
"`mdo_id` INT UNSIGNED NOT NULL", 0);
|
||||||
|
for (size_t c = 0; c < cols; c++) {
|
||||||
|
createColumn_sb(sb, *(col_data + c));
|
||||||
|
}
|
||||||
|
strbld_str(sb, ", INDEX (`mdo_id`)"
|
||||||
|
")", 0);
|
||||||
|
if (strbld_finalize_or_destroy(&sb, &table_def, &table_def_len) != 0) {
|
||||||
|
return (uint64_t)-1;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret_val = createMODBTable(
|
||||||
|
sconn, modb,
|
||||||
|
META_EXT_TABLE, STR_LEN(META_EXT_TABLE),
|
||||||
|
table_def, table_def_len
|
||||||
|
);
|
||||||
|
free(table_def);
|
||||||
|
|
||||||
|
return ret_val;
|
||||||
|
}
|
||||||
|
|||||||
@@ -8,6 +8,15 @@
|
|||||||
#include "modb_types.h"
|
#include "modb_types.h"
|
||||||
|
|
||||||
|
|
||||||
|
int connectionUseMODB(stored_conn *sconn, modb_ref *modb, int override);
|
||||||
|
int connectionGetMODB(stored_conn *sconn, modb_ref *modb);
|
||||||
|
void connectionUnuseMODB(stored_conn *sconn);
|
||||||
|
|
||||||
|
uint64_t createMODBTable(stored_conn *sconn, modb_ref *modb, const char *suffix, size_t suffix_len,
|
||||||
|
const char *table_def, size_t table_def_len);
|
||||||
|
int MODBTableExists(stored_conn *sconn, modb_ref *modb, const char *suffix, size_t suffix_len);
|
||||||
|
uint64_t destroyMODBTable(stored_conn *sconn, modb_ref *modb, const char *suffix, size_t suffix_len);
|
||||||
|
|
||||||
uint64_t createSysTable(stored_conn *sconn, modb_ref *modb);
|
uint64_t createSysTable(stored_conn *sconn, modb_ref *modb);
|
||||||
uint64_t createMetaTable(stored_conn *sconn, modb_ref *modb);
|
uint64_t createMetaTable(stored_conn *sconn, modb_ref *modb);
|
||||||
uint64_t createObjectsTable(stored_conn *sconn, modb_ref *modb);
|
uint64_t createObjectsTable(stored_conn *sconn, modb_ref *modb);
|
||||||
@@ -20,12 +29,4 @@ uint64_t createUserGroupsTable(stored_conn *sconn, modb_ref *modb);
|
|||||||
uint64_t createMetaExtTable(stored_conn *sconn, modb_ref *modb,
|
uint64_t createMetaExtTable(stored_conn *sconn, modb_ref *modb,
|
||||||
column_data **col_data, size_t cols);
|
column_data **col_data, size_t cols);
|
||||||
|
|
||||||
int tableExists(stored_conn *sconn, modb_ref *modb, const char *suffix, size_t suffix_len);
|
|
||||||
|
|
||||||
uint64_t destroyTable(stored_conn *sconn, modb_ref *modb, const char *suffix, size_t suffix_len);
|
|
||||||
|
|
||||||
int connectionUseMODB(stored_conn *sconn, modb_ref *modb, int override);
|
|
||||||
int connectionGetUse(stored_conn *sconn, modb_ref *modb);
|
|
||||||
void connectionReleaseMODB(stored_conn *sconn);
|
|
||||||
|
|
||||||
#endif // H__MODB_MANAGEMENT_P__
|
#endif // H__MODB_MANAGEMENT_P__
|
||||||
|
|||||||
Reference in New Issue
Block a user