准备放弃sqlite,改用multimap。sqlite必须集中提交以获得高性能,这将不利于Maat进行异常处理。同时考察了以下key value stores:

* LevelDB和RocksDB太重了
* Berkeley DB也有点重,而且免费版使用类似AGPL的高传染性License,收费版一个Processor就要1000-13000美元。它提供的bdbfirewallexample很有意思,以后可能有机会使用。
* LMDB轻量、快速,Mark下,以后有机会使用。
This commit is contained in:
zhengchao
2020-06-07 11:23:08 +08:00
parent 6b3dd3d0b6
commit c083777f3b

View File

@@ -5,10 +5,9 @@
const char* sql_create_hier_table[]={"create table MAAT_HIERARCHY_REGION(region_id interger PRIMARY KEY, group_id interger, district_id interger, table_id interger, expr_id_lb interger, expr_id_ub interger)",
"create table MAAT_HIERARCHY_GROUP(group_id interger PRIMARY KEY, vertex_id interger)",
"create table MAAT_HIERARCHY_COMPILE(compile_id interger PRIMARY KEY, declared_clause_num interger, user_data_pointer interger)",
"create table MAAT_HIERARCHY_CLAUSE(clause_id interger PRIMARY KEY, compile_id interger, nth_clause interger, not_flag interger)",
"create table MAAT_HIERARCHY_CLAUSE(compile_id interger, nth_clause interger, not_flag interger, UNIQUE(compile_id, nth_clause))",
"create table MAAT_HIERARCHY_LITERAL(group_id interger, virtual_table_id interger, clause_id interger)",
NULL,
};
NULL};
struct Maat_hierarchy_region
{
@@ -65,9 +64,21 @@ struct Maat_hierarchy_compile
{
int compile_id;
int declared_clause_number;
struct Maat_hierarchy_clause clauses[MAX_ITEMS_PER_BOOL_EXPR];
void* user_tag;
};
int wrap_sqlite_exec(sqlite3* db, const char* sql, void* logger)
{
char* errmsg;
int ret = sqlite3_exec(db, sql, NULL, NULL, &errmsg);
if(ret!=SQLITE_OK)
{
MESA_handle_runtime_log(logger, RLOG_LV_FATAL, module_maat_hierarchy, "sqlite3_exec %s failed, err: %s", sql, errmsg);
sqlite3_free(errmsg);
}
return ret;
}
struct Maat_hierarchy
{
@@ -164,6 +175,10 @@ struct Maat_hierarchy* Maat_hierarchy_new(int thread_num, struct Maat_garbage_bi
}
void Maat_hierarchy_free(struct Maat_hierarchy* hier)
{
int ret=0;
//todo free memory of compile user data;
ret=sqlite3_close(hier->sqlite_db);
assert(ret==SQLITE_OK);
MESA_htable_destroy(hier->literal2clause_list_hash, NULL);
MESA_htable_destroy(hier->cnf_hash, NULL);
@@ -178,8 +193,76 @@ void Maat_hierarchy_free(struct Maat_hierarchy* hier)
#define TO_CLAUSE_ID_COMPATBILE(vid, gid) ((unsigned long long)vid<<32|gid)
#define TO_LITERAL_ID(vt_id, group_id) ((long long)vt_id<<32|group_id)
static const char* sql_compile_query="SELECT compile_id, declared_clause_num, user_data_pointer FROM MAAT_HIERARCHY_COMPILE"
"WHERE compile_id = %d";
static const char* sql_compile_add= "INSERT INTO MAAT_HIERARCHY_COMPILE (compile_id,declared_clause_num,user_data_pointer) " \
"VALUES (%d, %d, %s); ";
static const char* sql_compile_is_exisit="SELECT COUNT(*) FROM MAAT_HIERARCHY_COMPILE"\
"WHERE compile_id=%d";
typedef int (*sqlite3_callback)(
void*, /* Data provided in the 4th argument of sqlite3_exec() */
int, /* The number of columns in row */
char**, /* An array of strings representing fields in the row */
char** /* An array of strings representing column names */
);
static int sqlite_cb_get_compile(void* user_data, int column_num, char** column_val, char** column_name)
{
struct Maat_hierarchy_compile* compile=(struct Maat_hierarchy_compile*)user_data;
assert(column_num==3);
sscanf(column_val[0], "%d", &compile->compile_id);
return 0;
}
int Maat_hierarchy_add_compile(struct Maat_hierarchy* hier, int compile_id, int clause_num, void* user)
{
int ret=0;
char sql[1024];
char *err_msg = 0;
sqlite3_stmt *stmt;
snprinf(sql, sizeof(sql), sql_compile_is_exisit, compile_id);
ret=sqlite3_prepare_v2(hier->sqlite_db, sql, -1, &stmt, NULL);
assert(ret=SQLITE_OK);
if(SQLITE_DONE!=sqlite3_step(stmt))
while (sqlite3_step(stmt) != SQLITE_DONE)
{
int i;
int num_cols = sqlite3_column_count(stmt);
for (i = 0; i < num_cols; i++)
{
switch (sqlite3_column_type(stmt, i))
{
case (SQLITE3_TEXT):
printf("%s, ", sqlite3_column_text(stmt, i));
break;
case (SQLITE_INTEGER):
printf("%d, ", sqlite3_column_int(stmt, i));
break;
case (SQLITE_FLOAT):
printf("%g, ", sqlite3_column_double(stmt, i));
break;
default:
break;
}
}
printf("\n");
}
ret=sqlite3_exec(hier->sqlite_db, hier_sql, sqlite_cb_get_compile, &compile, &err_msg);
assert(ret==SQLITE_OK);
if(compile->compile_id>0)
{
MESA_handle_runtime_log(hier->logger, RLOG_LV_FATAL, maat_module,
"Add compile %d failed, compile is already exisited.",
compile_id);
return -1;
}
struct Maat_hierarchy_compile* cnf=NULL;
cnf=MESA_htable_search(hier->cnf_hash, &compile_id, sizeof(compile_id));
if(cnf)//duplicated