完成Maat_hierarchy规则加载重构的代码编写,未编译。
This commit is contained in:
@@ -1,14 +1,14 @@
|
|||||||
cmake_minimum_required(VERSION 3.5)
|
cmake_minimum_required(VERSION 3.5)
|
||||||
|
|
||||||
set(MAAT_FRAME_MAJOR_VERSION 2)
|
set(MAAT_FRAME_MAJOR_VERSION 3)
|
||||||
set(MAAT_FRAME_MINOR_VERSION 9)
|
set(MAAT_FRAME_MINOR_VERSION 0)
|
||||||
set(MAAT_FRAME_PATCH_VERSION 0)
|
set(MAAT_FRAME_PATCH_VERSION 0)
|
||||||
set(MAAT_FRAME_VERSION ${MAAT_FRAME_MAJOR_VERSION}.${MAAT_FRAME_MINOR_VERSION}.${MAAT_FRAME_PATCH_VERSION})
|
set(MAAT_FRAME_VERSION ${MAAT_FRAME_MAJOR_VERSION}.${MAAT_FRAME_MINOR_VERSION}.${MAAT_FRAME_PATCH_VERSION})
|
||||||
|
|
||||||
message(STATUS "Maat Frame, Version: ${MAAT_FRAME_VERSION}")
|
message(STATUS "Maat Frame, Version: ${MAAT_FRAME_VERSION}")
|
||||||
|
|
||||||
add_definitions(-fPIC)
|
add_definitions(-fPIC)
|
||||||
set(MAAT_SRC entry/cJSON.c entry/config_monitor.cpp entry/dynamic_array.cpp entry/gram_index_engine.c entry/interval_index.c entry/json2iris.cpp entry/Maat_utils.cpp entry/Maat_api.cpp entry/Maat_command.cpp entry/Maat_rule.cpp entry/Maat_table.cpp entry/Maat_table_runtime.cpp entry/Maat_stat.cpp entry/map_str2int.cpp entry/rbtree.c entry/stream_fuzzy_hash.c entry/bool_matcher.cpp entry/Maat_ex_data.cpp)
|
set(MAAT_SRC entry/cJSON.c entry/config_monitor.cpp entry/dynamic_array.cpp entry/gram_index_engine.c entry/interval_index.c entry/json2iris.cpp entry/Maat_utils.cpp entry/Maat_api.cpp entry/Maat_command.cpp entry/Maat_rule.cpp entry/Maat_table.cpp entry/Maat_table_runtime.cpp entry/Maat_stat.cpp entry/map_str2int.cpp entry/rbtree.c entry/stream_fuzzy_hash.c entry/bool_matcher.cpp entry/Maat_ex_data.cpp entry/Maat_hierarchy.cpp entry/Maat_garbage_collection.cpp)
|
||||||
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/../inc/)
|
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/../inc/)
|
||||||
include_directories(/opt/MESA/include/MESA/)
|
include_directories(/opt/MESA/include/MESA/)
|
||||||
|
|
||||||
|
|||||||
@@ -100,15 +100,15 @@ void fill_maat_rule(struct Maat_rule_t *rule, const struct Maat_rule_head* rule_
|
|||||||
struct compile_sort_para
|
struct compile_sort_para
|
||||||
{
|
{
|
||||||
double evaluation_order;
|
double evaluation_order;
|
||||||
int group_cnt;
|
int declared_clause_num;
|
||||||
int compile_id;
|
int compile_id;
|
||||||
void* user;
|
void* user;
|
||||||
};
|
};
|
||||||
static void compile_sort_para_set(struct compile_sort_para* para, const struct Maat_compile_inner* compile_relation, void* user)
|
static void compile_sort_para_set(struct compile_sort_para* para, const struct Maat_compile_rule* compile_relation, void* user)
|
||||||
{
|
{
|
||||||
para->compile_id=compile_relation->compile_id;
|
para->compile_id=compile_relation->compile_id;
|
||||||
para->evaluation_order=compile_relation->compile->evaluation_order;
|
para->evaluation_order=compile_relation->evaluation_order;
|
||||||
para->group_cnt=compile_relation->group_cnt;
|
para->declared_clause_num=compile_relation->declared_clause_num;
|
||||||
para->user=user;
|
para->user=user;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -132,9 +132,9 @@ static int compile_sort_para_compare(const struct compile_sort_para* a, const st
|
|||||||
return (a->evaluation_order - b->evaluation_order >0) ? -1 : 1;
|
return (a->evaluation_order - b->evaluation_order >0) ? -1 : 1;
|
||||||
}
|
}
|
||||||
//If compile rule's execute sequences are not specified or equal.
|
//If compile rule's execute sequences are not specified or equal.
|
||||||
if(a->group_cnt!=b->group_cnt)
|
if(a->declared_clause_num!=b->declared_clause_num)
|
||||||
{
|
{
|
||||||
return (a->group_cnt-b->group_cnt);
|
return (a->declared_clause_num-b->declared_clause_num);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -142,10 +142,10 @@ static int compile_sort_para_compare(const struct compile_sort_para* a, const st
|
|||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
static int compare_compile_inner(const void *a, const void *b)
|
static int compare_compile_rule(const void *a, const void *b)
|
||||||
{
|
{
|
||||||
const struct Maat_compile_inner *ra=*(const struct Maat_compile_inner **)a;
|
const struct Maat_compile_rule *ra=*(const struct Maat_compile_rule **)a;
|
||||||
const struct Maat_compile_inner *rb=*(const struct Maat_compile_inner **)b;
|
const struct Maat_compile_rule *rb=*(const struct Maat_compile_rule **)b;
|
||||||
|
|
||||||
struct compile_sort_para sa, sb;
|
struct compile_sort_para sa, sb;
|
||||||
compile_sort_para_set(&sa, ra, NULL);
|
compile_sort_para_set(&sa, ra, NULL);
|
||||||
@@ -229,7 +229,7 @@ void hit_path_init(struct Maat_hit_path_t* hit_path)
|
|||||||
hit_path->region_id=-1;
|
hit_path->region_id=-1;
|
||||||
hit_path->sub_group_id=-1;
|
hit_path->sub_group_id=-1;
|
||||||
hit_path->top_group_id=-1;
|
hit_path->top_group_id=-1;
|
||||||
hit_path->virtual_table_id=-1;
|
hit_path->vt_id=-1;
|
||||||
hit_path->compile_id=-1;
|
hit_path->compile_id=-1;
|
||||||
}
|
}
|
||||||
size_t scan_hit_status_select_hit_path_inner(const struct hit_path_q *hit_path_qhead, struct Maat_hit_path_t* condition,
|
size_t scan_hit_status_select_hit_path_inner(const struct hit_path_q *hit_path_qhead, struct Maat_hit_path_t* condition,
|
||||||
@@ -275,7 +275,7 @@ void scan_hit_status_update_by_group(struct scan_hit_status* hit_status, struct
|
|||||||
hit_path->path.Nth_scan=Nth_scan;
|
hit_path->path.Nth_scan=Nth_scan;
|
||||||
hit_path->path.region_id=region_id;
|
hit_path->path.region_id=region_id;
|
||||||
hit_path->path.sub_group_id=group_rule->group_id;
|
hit_path->path.sub_group_id=group_rule->group_id;
|
||||||
hit_path->path.virtual_table_id=virtual_table_id;
|
hit_path->path.vt_id=virtual_table_id;
|
||||||
TAILQ_INSERT_TAIL(&hit_status->hit_path_qhead, hit_path, entries);
|
TAILQ_INSERT_TAIL(&hit_status->hit_path_qhead, hit_path, entries);
|
||||||
hit_status->hit_path_cnt++;
|
hit_status->hit_path_cnt++;
|
||||||
}
|
}
|
||||||
@@ -290,7 +290,7 @@ void scan_hit_status_update_by_group(struct scan_hit_status* hit_status, struct
|
|||||||
hit_path->path.region_id=region_id;
|
hit_path->path.region_id=region_id;
|
||||||
hit_path->path.sub_group_id=group_rule->group_id;
|
hit_path->path.sub_group_id=group_rule->group_id;
|
||||||
hit_path->path.top_group_id=group_rule->top_groups[i];
|
hit_path->path.top_group_id=group_rule->top_groups[i];
|
||||||
hit_path->path.virtual_table_id=virtual_table_id;
|
hit_path->path.vt_id=virtual_table_id;
|
||||||
TAILQ_INSERT_TAIL(&hit_status->hit_path_qhead, hit_path, entries);
|
TAILQ_INSERT_TAIL(&hit_status->hit_path_qhead, hit_path, entries);
|
||||||
hit_status->hit_path_cnt++;
|
hit_status->hit_path_cnt++;
|
||||||
ret=insert_set_id(&(hit_status->all_hit_group_array),
|
ret=insert_set_id(&(hit_status->all_hit_group_array),
|
||||||
@@ -319,7 +319,7 @@ size_t scan_hit_status_update_by_compile(struct scan_hit_status* hit_status, str
|
|||||||
TAILQ_FOREACH(p, &hit_status->hit_path_qhead, entries)
|
TAILQ_FOREACH(p, &hit_status->hit_path_qhead, entries)
|
||||||
{
|
{
|
||||||
n_exsited_path=0;
|
n_exsited_path=0;
|
||||||
if(TO_RELATION_ID(p->path.virtual_table_id, p->path.top_group_id)==a_set.items[i].item_id
|
if(TO_RELATION_ID(p->path.vt_id, p->path.top_group_id)==a_set.items[i].item_id
|
||||||
&& p->path.compile_id!=compile_rule->compile_id)
|
&& p->path.compile_id!=compile_rule->compile_id)
|
||||||
{
|
{
|
||||||
if(p->path.compile_id<0)
|
if(p->path.compile_id<0)
|
||||||
@@ -393,7 +393,7 @@ void scan_region_hit_wraper_build_with_GIE(struct scan_region_hit_wraper* region
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
int region_compile(_Maat_feather_t*feather, struct scan_hit_status *_mid, const struct scan_region_hit_wraper* region_hit_wraper, struct Maat_rule_t* result, int size,int thread_num)
|
int region_compile(_Maat_feather_t*feather, struct scan_hit_status *_mid, struct Maat_hierarchy_compile_mid* compile_mid, const struct scan_region_hit_wraper* region_hit_wraper, struct Maat_rule_t* result, int size,int thread_num)
|
||||||
{
|
{
|
||||||
int is_last_region=region_hit_wraper->is_last_region;
|
int is_last_region=region_hit_wraper->is_last_region;
|
||||||
void* region_hit=region_hit_wraper->elem_array;
|
void* region_hit=region_hit_wraper->elem_array;
|
||||||
@@ -408,25 +408,20 @@ int region_compile(_Maat_feather_t*feather, struct scan_hit_status *_mid, const
|
|||||||
int tmp=0;
|
int tmp=0;
|
||||||
size_t i=0;
|
size_t i=0;
|
||||||
size_t r_in_c_cnt=0;
|
size_t r_in_c_cnt=0;
|
||||||
struct bool_matcher* bm=feather->scanner->bool_matcher_expr_compiler;
|
|
||||||
struct Maat_group_inner* group_rule=NULL;
|
struct Maat_compile_rule* compile_rule_array[MAX_SCANNER_HIT_NUM];
|
||||||
struct Maat_compile_inner* compile_inner_array[MAX_SCANNER_HIT_NUM];
|
struct Maat_compile_rule* compile_rule=NULL;
|
||||||
struct Maat_compile_inner* compile_inner=NULL;
|
|
||||||
int virtual_table_id=0;
|
int virtual_table_id=0;
|
||||||
const unsigned long long* hit_group_ids=NULL;
|
const unsigned long long* hit_group_ids=NULL;
|
||||||
size_t hit_group_id_cnt=0;
|
size_t hit_group_id_cnt=0;
|
||||||
|
|
||||||
|
struct Maat_region_inner* region=NULL;
|
||||||
|
int region_ids[MAX_SCANNER_HIT_NUM];
|
||||||
|
|
||||||
for(i=0;i<region_hit_num;i++)
|
for(i=0;i<region_hit_num;i++)
|
||||||
{
|
{
|
||||||
group_rule=*(struct Maat_group_inner**)((char*)region_hit+region_type_size*i+group_offset);
|
region=*(struct Maat_region_inner**)((char*)region_hit+region_type_size*i+group_offset);
|
||||||
if(group_rule->group_id<0)
|
region_ids[i]=region->region_id;
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
assert(group_rule->ref_by_children_cnt>=0);
|
|
||||||
assert(group_rule->ref_by_parent_cnt>=0);
|
|
||||||
expr_id=*(unsigned int*)((char*)region_hit+region_type_size*i+expr_id_offset);
|
|
||||||
region_id=exprid2region_id(group_rule, expr_id, &tmp, feather->scanner);
|
|
||||||
if(region_hit_wraper->virtual_table_ids)
|
if(region_hit_wraper->virtual_table_ids)
|
||||||
{
|
{
|
||||||
virtual_table_id=region_hit_wraper->virtual_table_ids[i];
|
virtual_table_id=region_hit_wraper->virtual_table_ids[i];
|
||||||
@@ -435,56 +430,38 @@ int region_compile(_Maat_feather_t*feather, struct scan_hit_status *_mid, const
|
|||||||
{
|
{
|
||||||
virtual_table_id=region_hit_wraper->virtual_table_id;
|
virtual_table_id=region_hit_wraper->virtual_table_id;
|
||||||
}
|
}
|
||||||
scan_hit_status_update_by_group(_mid, group_rule, region_id,
|
Maat_hierarchy_compile_mid_udpate(compile_mid, region_id, virtual_table_id, region_hit_wraper->Nth_scan, i);
|
||||||
virtual_table_id, region_hit_wraper->Nth_scan, i);
|
|
||||||
}
|
|
||||||
|
|
||||||
if(bm)
|
|
||||||
{
|
|
||||||
hit_group_id_cnt=scan_hit_status_read_group_ids(_mid, &hit_group_ids);
|
|
||||||
scan_ret=bool_matcher_match(bm, thread_num,
|
|
||||||
hit_group_ids, hit_group_id_cnt,
|
|
||||||
(void **)compile_inner_array, MAX_SCANNER_HIT_NUM);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
scan_ret=0;
|
|
||||||
}
|
}
|
||||||
|
scan_ret=Maat_hierarchy_region_compile(compile_mid, int * region_ids, int * virtual_tables, size_t n_region, int Nth_scan, compile_rule_array, MAX_SCANNER_HIT_NUM);
|
||||||
|
|
||||||
if(scan_ret>1)
|
if(scan_ret>1)
|
||||||
{
|
{
|
||||||
qsort(compile_inner_array, scan_ret, sizeof(struct Maat_compile_inner*),
|
qsort(compile_rule_array, scan_ret, sizeof(struct Maat_compile_rule*),
|
||||||
compare_compile_inner);
|
compare_compile_rule);
|
||||||
}
|
}
|
||||||
for(i=0; i<(unsigned int)scan_ret&&result_cnt<size; i++)
|
for(i=0; i<(unsigned int)scan_ret&&result_cnt<size; i++)
|
||||||
{
|
{
|
||||||
compile_inner=compile_inner_array[i];
|
compile_rule=compile_rule_array[i];
|
||||||
if(compile_inner==NULL)
|
assert(compile_rule->magic_num==COMPILE_RULE_MAGIC);
|
||||||
|
|
||||||
|
if(compile_rule->not_group_cnt>0 && !is_last_region)
|
||||||
{
|
{
|
||||||
continue;
|
_mid->not_grp_compile_hitted_flag=1;
|
||||||
}
|
}
|
||||||
assert(compile_inner->magic_num==COMPILE_INNER_MAGIC);
|
else
|
||||||
if(0==pthread_rwlock_tryrdlock(&(compile_inner->rwlock)))
|
|
||||||
{
|
{
|
||||||
if(compile_inner->compile)
|
r_in_c_cnt=scan_hit_status_update_by_compile(_mid, compile_rule, region_hit_wraper->Nth_scan);
|
||||||
{
|
if(r_in_c_cnt>0 || //compile hitted becasue of new reigon
|
||||||
if(compile_inner->not_group_cnt>0 && !is_last_region)
|
region_hit_num==0) //or hit a compile that refer a NOT-logic group in previous scan.
|
||||||
{
|
{
|
||||||
_mid->not_grp_compile_hitted_flag=1;
|
fill_maat_rule(&(result[result_cnt]), &(compile_rule->compile->head),
|
||||||
}
|
compile_rule->compile->service_defined, compile_rule->compile->head.serv_def_len);
|
||||||
else
|
result_cnt++;
|
||||||
{
|
}
|
||||||
r_in_c_cnt=scan_hit_status_update_by_compile(_mid, compile_inner, region_hit_wraper->Nth_scan);
|
|
||||||
if(r_in_c_cnt>0 || //compile hitted becasue of new reigon
|
|
||||||
region_hit_num==0) //or hit a compile that refer a NOT-logic group in previous scan.
|
|
||||||
{
|
|
||||||
fill_maat_rule(&(result[result_cnt]), &(compile_inner->compile->head),
|
|
||||||
compile_inner->compile->service_defined, compile_inner->compile->head.serv_def_len);
|
|
||||||
result_cnt++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
pthread_rwlock_unlock(&(compile_inner->rwlock));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if(result_cnt>0)
|
if(result_cnt>0)
|
||||||
@@ -672,6 +649,7 @@ struct _OUTER_scan_status_t* grab_mid(scan_status_t* raw_mid,_Maat_feather_t* fe
|
|||||||
{
|
{
|
||||||
if(_mid->inner==NULL)
|
if(_mid->inner==NULL)
|
||||||
{
|
{
|
||||||
|
_mid->compile_mid=Maat_hierarchy_compile_mid_new(feather->scanner->hier, thread_num);
|
||||||
_mid->inner=scan_hit_status_new();
|
_mid->inner=scan_hit_status_new();
|
||||||
alignment_int64_array_add(feather->inner_mid_cnt,thread_num,1);
|
alignment_int64_array_add(feather->inner_mid_cnt,thread_num,1);
|
||||||
}
|
}
|
||||||
@@ -774,6 +752,7 @@ Maat_feather_t Maat_feather(int max_thread_num,const char* table_info_path,void*
|
|||||||
|
|
||||||
feather->logger=logger;
|
feather->logger=logger;
|
||||||
feather->scan_thread_num=max_thread_num;
|
feather->scan_thread_num=max_thread_num;
|
||||||
|
|
||||||
feather->garbage_q=MESA_lqueue_create(0,0);
|
feather->garbage_q=MESA_lqueue_create(0,0);
|
||||||
feather->effect_interval_ms=60*1000;
|
feather->effect_interval_ms=60*1000;
|
||||||
feather->scan_interval_ms=1*1000;
|
feather->scan_interval_ms=1*1000;
|
||||||
@@ -1074,6 +1053,7 @@ void maat_read_full_config(_Maat_feather_t* _feather)
|
|||||||
int Maat_initiate_feather(Maat_feather_t feather)
|
int Maat_initiate_feather(Maat_feather_t feather)
|
||||||
{
|
{
|
||||||
_Maat_feather_t* _feather=(_Maat_feather_t*)feather;
|
_Maat_feather_t* _feather=(_Maat_feather_t*)feather;
|
||||||
|
_feather->garbage_bin=Maat_garbage_bin_new(_feather->effect_interval_ms/1000+10);
|
||||||
system_cmd_mkdir(_feather->foreign_cont_dir);
|
system_cmd_mkdir(_feather->foreign_cont_dir);
|
||||||
if(_feather->DEFERRED_LOAD_ON==0)
|
if(_feather->DEFERRED_LOAD_ON==0)
|
||||||
{
|
{
|
||||||
@@ -1534,6 +1514,7 @@ int Maat_full_scan_string_detail(Maat_feather_t feather,int table_id
|
|||||||
®ion_hit_wraper,
|
®ion_hit_wraper,
|
||||||
result, rule_num,
|
result, rule_num,
|
||||||
thread_num);
|
thread_num);
|
||||||
|
Maat_hierarchy_region_compile(struct Maat_hierarchy_compile_mid * mid, int * region_ids, int * virtual_tables, size_t n_region, int Nth_scan, void * * user_data_array, size_t ud_array_sz)
|
||||||
assert(_mid->is_last_region<2);
|
assert(_mid->is_last_region<2);
|
||||||
if(_mid->is_last_region==1)
|
if(_mid->is_last_region==1)
|
||||||
{
|
{
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -224,7 +224,7 @@ void maat_stat_output(struct _Maat_feather_t* feather)
|
|||||||
break;
|
break;
|
||||||
case TABLE_TYPE_GROUP:
|
case TABLE_TYPE_GROUP:
|
||||||
group_rule_num+=table_rt->origin_rule_num;
|
group_rule_num+=table_rt->origin_rule_num;
|
||||||
not_group_rule_num+=table_rt->group.not_flag_group;
|
not_group_rule_num+=table_rt->group2compile.not_flag_group;
|
||||||
break;
|
break;
|
||||||
case TABLE_TYPE_COMPILE:
|
case TABLE_TYPE_COMPILE:
|
||||||
compile_rule_num+=table_rt->origin_rule_num;
|
compile_rule_num+=table_rt->origin_rule_num;
|
||||||
|
|||||||
@@ -495,6 +495,8 @@ struct Maat_table_manager* Maat_table_manager_create(const char* table_info_path
|
|||||||
map_register(string2int_map,"digest", TABLE_TYPE_DIGEST);
|
map_register(string2int_map,"digest", TABLE_TYPE_DIGEST);
|
||||||
map_register(string2int_map,"expr_plus", TABLE_TYPE_EXPR_PLUS);
|
map_register(string2int_map,"expr_plus", TABLE_TYPE_EXPR_PLUS);
|
||||||
map_register(string2int_map,"group", TABLE_TYPE_GROUP);
|
map_register(string2int_map,"group", TABLE_TYPE_GROUP);
|
||||||
|
map_register(string2int_map,"group2group", TABLE_TYPE_GROUP2GROUP);
|
||||||
|
map_register(string2int_map,"group2compile", TABLE_TYPE_GROUP2COMPILE);
|
||||||
map_register(string2int_map,"similar", TABLE_TYPE_SIMILARITY);
|
map_register(string2int_map,"similar", TABLE_TYPE_SIMILARITY);
|
||||||
map_register(string2int_map,"virtual", TABLE_TYPE_VIRTUAL);
|
map_register(string2int_map,"virtual", TABLE_TYPE_VIRTUAL);
|
||||||
map_register(string2int_map,"composition", TABLE_TYPE_COMPOSITION);
|
map_register(string2int_map,"composition", TABLE_TYPE_COMPOSITION);
|
||||||
|
|||||||
@@ -4,5 +4,5 @@ struct Maat_garbage_bin{};
|
|||||||
struct Maat_garbage_bin* Maat_garbage_bin_new(void);
|
struct Maat_garbage_bin* Maat_garbage_bin_new(void);
|
||||||
void Maat_garbage_bin_free(struct Maat_garbage_bin* bin);
|
void Maat_garbage_bin_free(struct Maat_garbage_bin* bin);
|
||||||
void Maat_garbage_bag(struct Maat_garbage_bin* bin, void* garbage, int timeout, void (* func)(void *));
|
void Maat_garbage_bag(struct Maat_garbage_bin* bin, void* garbage, int timeout, void (* func)(void *));
|
||||||
void Maat_garbage_collect(struct Maat_garbage_bin* bin);
|
void Maat_garbage_collect_routine(struct Maat_garbage_bin* bin);
|
||||||
|
|
||||||
|
|||||||
6
src/inc_internal/Maat_hierarchy.h
Normal file
6
src/inc_internal/Maat_hierarchy.h
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
|
||||||
|
struct Maat_hierarchy;
|
||||||
|
struct Maat_hierarchy_compile_mid;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -89,8 +89,11 @@ struct Maat_rule_head
|
|||||||
char resevered;
|
char resevered;
|
||||||
int serv_def_len;
|
int serv_def_len;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#define COMPILE_RULE_MAGIC 0x1a2b3c4d
|
||||||
struct Maat_compile_rule
|
struct Maat_compile_rule
|
||||||
{
|
{
|
||||||
|
long long magic_num;
|
||||||
struct Maat_rule_head head;// fix len of Maat_rule_t
|
struct Maat_rule_head head;// fix len of Maat_rule_t
|
||||||
char* service_defined;
|
char* service_defined;
|
||||||
int is_valid;
|
int is_valid;
|
||||||
@@ -98,8 +101,24 @@ struct Maat_compile_rule
|
|||||||
double evaluation_order;
|
double evaluation_order;
|
||||||
const struct Maat_table_schema* ref_table;
|
const struct Maat_table_schema* ref_table;
|
||||||
MAAT_RULE_EX_DATA* ads;
|
MAAT_RULE_EX_DATA* ads;
|
||||||
|
int compile_id;
|
||||||
|
pthread_rwlock_t rwlock;
|
||||||
|
};
|
||||||
|
struct db_group2group_rule
|
||||||
|
{
|
||||||
|
int group_id;
|
||||||
|
int superior_group_id;
|
||||||
|
int is_valid;
|
||||||
|
};
|
||||||
|
struct db_group2compile_rule
|
||||||
|
{
|
||||||
|
int group_id;
|
||||||
|
int compile_id;
|
||||||
|
int is_valid;
|
||||||
|
int not_flag;
|
||||||
|
int virtual_table_id;
|
||||||
|
int Nth_clause;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct db_group_rule_t
|
struct db_group_rule_t
|
||||||
{
|
{
|
||||||
int group_id;
|
int group_id;
|
||||||
@@ -130,6 +149,7 @@ struct region_group_relation
|
|||||||
struct Maat_region_inner
|
struct Maat_region_inner
|
||||||
{
|
{
|
||||||
int region_id;
|
int region_id;
|
||||||
|
int group_id;
|
||||||
int district_id;
|
int district_id;
|
||||||
int table_id;
|
int table_id;
|
||||||
int expr_id_cnt;
|
int expr_id_cnt;
|
||||||
@@ -158,25 +178,6 @@ struct Maat_group_inner
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
#define COMPILE_INNER_MAGIC 0x1a2b3c4d
|
|
||||||
struct Maat_compile_inner
|
|
||||||
{
|
|
||||||
long long magic_num; //shoulde be COMPILE_INNER_MAGIC
|
|
||||||
struct Maat_compile_rule *compile;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
dynamic_array_t *groups; //element is struct Maat_group_inner*
|
|
||||||
int virtual_table_id[MAX_ITEMS_PER_BOOL_EXPR];
|
|
||||||
char not_flag[MAX_ITEMS_PER_BOOL_EXPR];
|
|
||||||
int compile_id;//equal to compile->m_rule.config_id
|
|
||||||
int group_boundary;
|
|
||||||
int group_cnt;
|
|
||||||
int not_group_cnt;
|
|
||||||
pthread_rwlock_t rwlock;//reading compile rule is safe in update thread, rwlock lock called when delete or scan thread read
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
struct _compile_result_t
|
struct _compile_result_t
|
||||||
{
|
{
|
||||||
@@ -211,6 +212,7 @@ struct _OUTER_scan_status_t
|
|||||||
unsigned char is_last_region;
|
unsigned char is_last_region;
|
||||||
int district_id;
|
int district_id;
|
||||||
int scan_cnt;
|
int scan_cnt;
|
||||||
|
struct Maat_hierarchy_compile_mid* compile_mid;
|
||||||
struct scan_hit_status* inner;
|
struct scan_hit_status* inner;
|
||||||
};
|
};
|
||||||
enum maat_garbage_type
|
enum maat_garbage_type
|
||||||
@@ -267,27 +269,15 @@ struct Maat_scanner
|
|||||||
|
|
||||||
struct Maat_table_runtime_manager* table_rt_mgr;
|
struct Maat_table_runtime_manager* table_rt_mgr;
|
||||||
size_t max_table_num;
|
size_t max_table_num;
|
||||||
|
|
||||||
//Access in both UPDATE thread and SCAN thread
|
|
||||||
MESA_htable_handle exprid_hash; //key: expr_id, value: int array_idx of Maat_group_inner->regions;
|
|
||||||
MESA_htable_handle compile_hash;//key: compile_id, value: struct Maat_compile_inner *
|
|
||||||
MESA_htable_handle grp_and_vt2clause_id_hash; //key: virtual_table<<32|group_id, value: struct Maat_clause_id_list*
|
|
||||||
|
|
||||||
//Access in UPDATE thread ONLY.
|
|
||||||
MESA_htable_handle region_hash; //key: region_id, value: struct region_group_relation*
|
|
||||||
MESA_htable_handle group_hash; //key: group_id, value: struct Maat_group_inner*
|
|
||||||
|
|
||||||
|
struct Maat_hierarchy * hier;
|
||||||
|
struct Maat_garbage_bin* ref_garbage_bin;
|
||||||
|
|
||||||
|
|
||||||
MESA_htable_handle district_map;
|
MESA_htable_handle district_map;
|
||||||
MESA_htable_handle tmp_district_map;
|
MESA_htable_handle tmp_district_map;
|
||||||
MESA_htable_handle vertex_id2group;//key:vertex_id, value: struct Maat_hierarchy_element*
|
|
||||||
|
|
||||||
igraph_t hierarchy_graph;
|
|
||||||
igraph_integer_t group_graph_vcount;
|
|
||||||
igraph_vector_t dfs_vids;
|
|
||||||
|
|
||||||
int grp_vertex_id_generator;
|
|
||||||
int most_popular_sub_group;
|
int most_popular_sub_group;
|
||||||
unsigned long long max_presented_top_group_cnt;
|
unsigned long long max_presented_top_group_cnt;
|
||||||
|
|
||||||
@@ -296,11 +286,10 @@ struct Maat_scanner
|
|||||||
unsigned int exprid_generator;
|
unsigned int exprid_generator;
|
||||||
unsigned int dedup_expr_num;
|
unsigned int dedup_expr_num;
|
||||||
MESA_lqueue_head region_update_q;
|
MESA_lqueue_head region_update_q;
|
||||||
struct bool_matcher * bool_matcher_expr_compiler;
|
|
||||||
scan_result_t *region_rslt_buff;
|
scan_result_t *region_rslt_buff;
|
||||||
GIE_result_t* gie_rslt_buff;
|
GIE_result_t* gie_rslt_buff;
|
||||||
void* logger_ref;
|
void* logger_ref;
|
||||||
MESA_lqueue_head tomb_ref;//reference of g_feather->garbage_q
|
|
||||||
|
|
||||||
int max_thread_num;
|
int max_thread_num;
|
||||||
iconv_t iconv_handle[MAX_CHARSET_NUM][MAX_CHARSET_NUM];//iconv_handle[to][from]
|
iconv_t iconv_handle[MAX_CHARSET_NUM][MAX_CHARSET_NUM];//iconv_handle[to][from]
|
||||||
@@ -338,6 +327,7 @@ struct _Maat_feather_t
|
|||||||
struct Maat_scanner *scanner;
|
struct Maat_scanner *scanner;
|
||||||
struct Maat_scanner *update_tmp_scanner;
|
struct Maat_scanner *update_tmp_scanner;
|
||||||
MESA_lqueue_head garbage_q;
|
MESA_lqueue_head garbage_q;
|
||||||
|
struct Maat_garbage_bin * garbage_bin;
|
||||||
struct Maat_table_manager* table_mgr;
|
struct Maat_table_manager* table_mgr;
|
||||||
|
|
||||||
int DEFERRED_LOAD_ON;
|
int DEFERRED_LOAD_ON;
|
||||||
|
|||||||
@@ -30,6 +30,8 @@ enum MAAT_TABLE_TYPE
|
|||||||
TABLE_TYPE_SIMILARITY,
|
TABLE_TYPE_SIMILARITY,
|
||||||
TABLE_TYPE_VIRTUAL,
|
TABLE_TYPE_VIRTUAL,
|
||||||
TABLE_TYPE_COMPOSITION,
|
TABLE_TYPE_COMPOSITION,
|
||||||
|
TABLE_TYPE_GROUP2GROUP,
|
||||||
|
TABLE_TYPE_GROUP2COMPILE,
|
||||||
TABLE_TYPE_GROUP,
|
TABLE_TYPE_GROUP,
|
||||||
TABLE_TYPE_COMPILE,
|
TABLE_TYPE_COMPILE,
|
||||||
TABLE_TYPE_PLUGIN,
|
TABLE_TYPE_PLUGIN,
|
||||||
|
|||||||
@@ -36,7 +36,7 @@ struct ip_runtime
|
|||||||
long long ipv6_rule_cnt;
|
long long ipv6_rule_cnt;
|
||||||
|
|
||||||
};
|
};
|
||||||
struct group_runtime
|
struct group2compile_runtime
|
||||||
{
|
{
|
||||||
long long not_flag_group;
|
long long not_flag_group;
|
||||||
};
|
};
|
||||||
@@ -51,7 +51,7 @@ struct Maat_table_runtime
|
|||||||
struct ip_plugin_runtime ip_plugin;
|
struct ip_plugin_runtime ip_plugin;
|
||||||
struct expr_runtime expr;
|
struct expr_runtime expr;
|
||||||
struct ip_runtime ip;
|
struct ip_runtime ip;
|
||||||
struct group_runtime group;
|
struct group2compile_runtime group2compile;
|
||||||
void * other;
|
void * other;
|
||||||
};
|
};
|
||||||
mcore_long_t scan_cnt;
|
mcore_long_t scan_cnt;
|
||||||
|
|||||||
247
src/inc_internal/uthash/utarray.h
Normal file
247
src/inc_internal/uthash/utarray.h
Normal file
@@ -0,0 +1,247 @@
|
|||||||
|
/*
|
||||||
|
Copyright (c) 2008-2018, Troy D. Hanson http://troydhanson.github.com/uthash/
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without
|
||||||
|
modification, are permitted provided that the following conditions are met:
|
||||||
|
|
||||||
|
* Redistributions of source code must retain the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
|
||||||
|
IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||||
|
TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
|
||||||
|
PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
|
||||||
|
OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* a dynamic array implementation using macros
|
||||||
|
*/
|
||||||
|
#ifndef UTARRAY_H
|
||||||
|
#define UTARRAY_H
|
||||||
|
|
||||||
|
#define UTARRAY_VERSION 2.1.0
|
||||||
|
|
||||||
|
#include <stddef.h> /* size_t */
|
||||||
|
#include <string.h> /* memset, etc */
|
||||||
|
#include <stdlib.h> /* exit */
|
||||||
|
|
||||||
|
#ifdef __GNUC__
|
||||||
|
#define UTARRAY_UNUSED __attribute__((__unused__))
|
||||||
|
#else
|
||||||
|
#define UTARRAY_UNUSED
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef oom
|
||||||
|
#error "The name of macro 'oom' has been changed to 'utarray_oom'. Please update your code."
|
||||||
|
#define utarray_oom() oom()
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef utarray_oom
|
||||||
|
#define utarray_oom() exit(-1)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
typedef void (ctor_f)(void *dst, const void *src);
|
||||||
|
typedef void (dtor_f)(void *elt);
|
||||||
|
typedef void (init_f)(void *elt);
|
||||||
|
typedef struct {
|
||||||
|
size_t sz;
|
||||||
|
init_f *init;
|
||||||
|
ctor_f *copy;
|
||||||
|
dtor_f *dtor;
|
||||||
|
} UT_icd;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
unsigned i,n;/* i: index of next available slot, n: num slots */
|
||||||
|
UT_icd icd; /* initializer, copy and destructor functions */
|
||||||
|
char *d; /* n slots of size icd->sz*/
|
||||||
|
} UT_array;
|
||||||
|
|
||||||
|
#define utarray_init(a,_icd) do { \
|
||||||
|
memset(a,0,sizeof(UT_array)); \
|
||||||
|
(a)->icd = *(_icd); \
|
||||||
|
} while(0)
|
||||||
|
|
||||||
|
#define utarray_done(a) do { \
|
||||||
|
if ((a)->n) { \
|
||||||
|
if ((a)->icd.dtor) { \
|
||||||
|
unsigned _ut_i; \
|
||||||
|
for(_ut_i=0; _ut_i < (a)->i; _ut_i++) { \
|
||||||
|
(a)->icd.dtor(utarray_eltptr(a,_ut_i)); \
|
||||||
|
} \
|
||||||
|
} \
|
||||||
|
free((a)->d); \
|
||||||
|
} \
|
||||||
|
(a)->n=0; \
|
||||||
|
} while(0)
|
||||||
|
|
||||||
|
#define utarray_new(a,_icd) do { \
|
||||||
|
(a) = (UT_array*)malloc(sizeof(UT_array)); \
|
||||||
|
if ((a) == NULL) { \
|
||||||
|
utarray_oom(); \
|
||||||
|
} \
|
||||||
|
utarray_init(a,_icd); \
|
||||||
|
} while(0)
|
||||||
|
|
||||||
|
#define utarray_free(a) do { \
|
||||||
|
utarray_done(a); \
|
||||||
|
free(a); \
|
||||||
|
} while(0)
|
||||||
|
|
||||||
|
#define utarray_reserve(a,by) do { \
|
||||||
|
if (((a)->i+(by)) > (a)->n) { \
|
||||||
|
char *utarray_tmp; \
|
||||||
|
while (((a)->i+(by)) > (a)->n) { (a)->n = ((a)->n ? (2*(a)->n) : 8); } \
|
||||||
|
utarray_tmp=(char*)realloc((a)->d, (a)->n*(a)->icd.sz); \
|
||||||
|
if (utarray_tmp == NULL) { \
|
||||||
|
utarray_oom(); \
|
||||||
|
} \
|
||||||
|
(a)->d=utarray_tmp; \
|
||||||
|
} \
|
||||||
|
} while(0)
|
||||||
|
|
||||||
|
#define utarray_push_back(a,p) do { \
|
||||||
|
utarray_reserve(a,1); \
|
||||||
|
if ((a)->icd.copy) { (a)->icd.copy( _utarray_eltptr(a,(a)->i++), p); } \
|
||||||
|
else { memcpy(_utarray_eltptr(a,(a)->i++), p, (a)->icd.sz); }; \
|
||||||
|
} while(0)
|
||||||
|
|
||||||
|
#define utarray_pop_back(a) do { \
|
||||||
|
if ((a)->icd.dtor) { (a)->icd.dtor( _utarray_eltptr(a,--((a)->i))); } \
|
||||||
|
else { (a)->i--; } \
|
||||||
|
} while(0)
|
||||||
|
|
||||||
|
#define utarray_extend_back(a) do { \
|
||||||
|
utarray_reserve(a,1); \
|
||||||
|
if ((a)->icd.init) { (a)->icd.init(_utarray_eltptr(a,(a)->i)); } \
|
||||||
|
else { memset(_utarray_eltptr(a,(a)->i),0,(a)->icd.sz); } \
|
||||||
|
(a)->i++; \
|
||||||
|
} while(0)
|
||||||
|
|
||||||
|
#define utarray_len(a) ((a)->i)
|
||||||
|
|
||||||
|
#define utarray_eltptr(a,j) (((j) < (a)->i) ? _utarray_eltptr(a,j) : NULL)
|
||||||
|
#define _utarray_eltptr(a,j) ((void*)((a)->d + ((a)->icd.sz * (j))))
|
||||||
|
|
||||||
|
#define utarray_insert(a,p,j) do { \
|
||||||
|
if ((j) > (a)->i) utarray_resize(a,j); \
|
||||||
|
utarray_reserve(a,1); \
|
||||||
|
if ((j) < (a)->i) { \
|
||||||
|
memmove( _utarray_eltptr(a,(j)+1), _utarray_eltptr(a,j), \
|
||||||
|
((a)->i - (j))*((a)->icd.sz)); \
|
||||||
|
} \
|
||||||
|
if ((a)->icd.copy) { (a)->icd.copy( _utarray_eltptr(a,j), p); } \
|
||||||
|
else { memcpy(_utarray_eltptr(a,j), p, (a)->icd.sz); }; \
|
||||||
|
(a)->i++; \
|
||||||
|
} while(0)
|
||||||
|
|
||||||
|
#define utarray_inserta(a,w,j) do { \
|
||||||
|
if (utarray_len(w) == 0) break; \
|
||||||
|
if ((j) > (a)->i) utarray_resize(a,j); \
|
||||||
|
utarray_reserve(a,utarray_len(w)); \
|
||||||
|
if ((j) < (a)->i) { \
|
||||||
|
memmove(_utarray_eltptr(a,(j)+utarray_len(w)), \
|
||||||
|
_utarray_eltptr(a,j), \
|
||||||
|
((a)->i - (j))*((a)->icd.sz)); \
|
||||||
|
} \
|
||||||
|
if ((a)->icd.copy) { \
|
||||||
|
unsigned _ut_i; \
|
||||||
|
for(_ut_i=0;_ut_i<(w)->i;_ut_i++) { \
|
||||||
|
(a)->icd.copy(_utarray_eltptr(a, (j) + _ut_i), _utarray_eltptr(w, _ut_i)); \
|
||||||
|
} \
|
||||||
|
} else { \
|
||||||
|
memcpy(_utarray_eltptr(a,j), _utarray_eltptr(w,0), \
|
||||||
|
utarray_len(w)*((a)->icd.sz)); \
|
||||||
|
} \
|
||||||
|
(a)->i += utarray_len(w); \
|
||||||
|
} while(0)
|
||||||
|
|
||||||
|
#define utarray_resize(dst,num) do { \
|
||||||
|
unsigned _ut_i; \
|
||||||
|
if ((dst)->i > (unsigned)(num)) { \
|
||||||
|
if ((dst)->icd.dtor) { \
|
||||||
|
for (_ut_i = (num); _ut_i < (dst)->i; ++_ut_i) { \
|
||||||
|
(dst)->icd.dtor(_utarray_eltptr(dst, _ut_i)); \
|
||||||
|
} \
|
||||||
|
} \
|
||||||
|
} else if ((dst)->i < (unsigned)(num)) { \
|
||||||
|
utarray_reserve(dst, (num) - (dst)->i); \
|
||||||
|
if ((dst)->icd.init) { \
|
||||||
|
for (_ut_i = (dst)->i; _ut_i < (unsigned)(num); ++_ut_i) { \
|
||||||
|
(dst)->icd.init(_utarray_eltptr(dst, _ut_i)); \
|
||||||
|
} \
|
||||||
|
} else { \
|
||||||
|
memset(_utarray_eltptr(dst, (dst)->i), 0, (dst)->icd.sz*((num) - (dst)->i)); \
|
||||||
|
} \
|
||||||
|
} \
|
||||||
|
(dst)->i = (num); \
|
||||||
|
} while(0)
|
||||||
|
|
||||||
|
#define utarray_concat(dst,src) do { \
|
||||||
|
utarray_inserta(dst, src, utarray_len(dst)); \
|
||||||
|
} while(0)
|
||||||
|
|
||||||
|
#define utarray_erase(a,pos,len) do { \
|
||||||
|
if ((a)->icd.dtor) { \
|
||||||
|
unsigned _ut_i; \
|
||||||
|
for (_ut_i = 0; _ut_i < (len); _ut_i++) { \
|
||||||
|
(a)->icd.dtor(utarray_eltptr(a, (pos) + _ut_i)); \
|
||||||
|
} \
|
||||||
|
} \
|
||||||
|
if ((a)->i > ((pos) + (len))) { \
|
||||||
|
memmove(_utarray_eltptr(a, pos), _utarray_eltptr(a, (pos) + (len)), \
|
||||||
|
((a)->i - ((pos) + (len))) * (a)->icd.sz); \
|
||||||
|
} \
|
||||||
|
(a)->i -= (len); \
|
||||||
|
} while(0)
|
||||||
|
|
||||||
|
#define utarray_renew(a,u) do { \
|
||||||
|
if (a) utarray_clear(a); \
|
||||||
|
else utarray_new(a, u); \
|
||||||
|
} while(0)
|
||||||
|
|
||||||
|
#define utarray_clear(a) do { \
|
||||||
|
if ((a)->i > 0) { \
|
||||||
|
if ((a)->icd.dtor) { \
|
||||||
|
unsigned _ut_i; \
|
||||||
|
for(_ut_i=0; _ut_i < (a)->i; _ut_i++) { \
|
||||||
|
(a)->icd.dtor(_utarray_eltptr(a, _ut_i)); \
|
||||||
|
} \
|
||||||
|
} \
|
||||||
|
(a)->i = 0; \
|
||||||
|
} \
|
||||||
|
} while(0)
|
||||||
|
|
||||||
|
#define utarray_sort(a,cmp) do { \
|
||||||
|
qsort((a)->d, (a)->i, (a)->icd.sz, cmp); \
|
||||||
|
} while(0)
|
||||||
|
|
||||||
|
#define utarray_find(a,v,cmp) bsearch((v),(a)->d,(a)->i,(a)->icd.sz,cmp)
|
||||||
|
|
||||||
|
#define utarray_front(a) (((a)->i) ? (_utarray_eltptr(a,0)) : NULL)
|
||||||
|
#define utarray_next(a,e) (((e)==NULL) ? utarray_front(a) : (((a)->i != utarray_eltidx(a,e)+1) ? _utarray_eltptr(a,utarray_eltidx(a,e)+1) : NULL))
|
||||||
|
#define utarray_prev(a,e) (((e)==NULL) ? utarray_back(a) : ((utarray_eltidx(a,e) != 0) ? _utarray_eltptr(a,utarray_eltidx(a,e)-1) : NULL))
|
||||||
|
#define utarray_back(a) (((a)->i) ? (_utarray_eltptr(a,(a)->i-1)) : NULL)
|
||||||
|
#define utarray_eltidx(a,e) (((char*)(e) - (a)->d) / (a)->icd.sz)
|
||||||
|
|
||||||
|
/* last we pre-define a few icd for common utarrays of ints and strings */
|
||||||
|
static void utarray_str_cpy(void *dst, const void *src) {
|
||||||
|
char **_src = (char**)src, **_dst = (char**)dst;
|
||||||
|
*_dst = (*_src == NULL) ? NULL : strdup(*_src);
|
||||||
|
}
|
||||||
|
static void utarray_str_dtor(void *elt) {
|
||||||
|
char **eltc = (char**)elt;
|
||||||
|
if (*eltc != NULL) free(*eltc);
|
||||||
|
}
|
||||||
|
static const UT_icd ut_str_icd UTARRAY_UNUSED = {sizeof(char*),NULL,utarray_str_cpy,utarray_str_dtor};
|
||||||
|
static const UT_icd ut_int_icd UTARRAY_UNUSED = {sizeof(int),NULL,NULL,NULL};
|
||||||
|
static const UT_icd ut_ptr_icd UTARRAY_UNUSED = {sizeof(void*),NULL,NULL,NULL};
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* UTARRAY_H */
|
||||||
1150
src/inc_internal/uthash/uthash.h
Normal file
1150
src/inc_internal/uthash/uthash.h
Normal file
File diff suppressed because it is too large
Load Diff
1073
src/inc_internal/uthash/utlist.h
Normal file
1073
src/inc_internal/uthash/utlist.h
Normal file
File diff suppressed because it is too large
Load Diff
108
src/inc_internal/uthash/utringbuffer.h
Normal file
108
src/inc_internal/uthash/utringbuffer.h
Normal file
@@ -0,0 +1,108 @@
|
|||||||
|
/*
|
||||||
|
Copyright (c) 2015-2018, Troy D. Hanson http://troydhanson.github.com/uthash/
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without
|
||||||
|
modification, are permitted provided that the following conditions are met:
|
||||||
|
|
||||||
|
* Redistributions of source code must retain the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
|
||||||
|
IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||||
|
TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
|
||||||
|
PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
|
||||||
|
OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* a ring-buffer implementation using macros
|
||||||
|
*/
|
||||||
|
#ifndef UTRINGBUFFER_H
|
||||||
|
#define UTRINGBUFFER_H
|
||||||
|
|
||||||
|
#define UTRINGBUFFER_VERSION 2.1.0
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include "utarray.h" // for "UT_icd"
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
unsigned i; /* index of next available slot; wraps at n */
|
||||||
|
unsigned n; /* capacity */
|
||||||
|
unsigned char f; /* full */
|
||||||
|
UT_icd icd; /* initializer, copy and destructor functions */
|
||||||
|
char *d; /* n slots of size icd->sz */
|
||||||
|
} UT_ringbuffer;
|
||||||
|
|
||||||
|
#define utringbuffer_init(a, _n, _icd) do { \
|
||||||
|
memset(a, 0, sizeof(UT_ringbuffer)); \
|
||||||
|
(a)->icd = *(_icd); \
|
||||||
|
(a)->n = (_n); \
|
||||||
|
if ((a)->n) { (a)->d = (char*)malloc((a)->n * (_icd)->sz); } \
|
||||||
|
} while(0)
|
||||||
|
|
||||||
|
#define utringbuffer_clear(a) do { \
|
||||||
|
if ((a)->icd.dtor) { \
|
||||||
|
if ((a)->f) { \
|
||||||
|
unsigned _ut_i; \
|
||||||
|
for (_ut_i = 0; _ut_i < (a)->n; ++_ut_i) { \
|
||||||
|
(a)->icd.dtor(utringbuffer_eltptr(a, _ut_i)); \
|
||||||
|
} \
|
||||||
|
} else { \
|
||||||
|
unsigned _ut_i; \
|
||||||
|
for (_ut_i = 0; _ut_i < (a)->i; ++_ut_i) { \
|
||||||
|
(a)->icd.dtor(utringbuffer_eltptr(a, _ut_i)); \
|
||||||
|
} \
|
||||||
|
} \
|
||||||
|
} \
|
||||||
|
(a)->i = 0; \
|
||||||
|
(a)->f = 0; \
|
||||||
|
} while(0)
|
||||||
|
|
||||||
|
#define utringbuffer_done(a) do { \
|
||||||
|
utringbuffer_clear(a); \
|
||||||
|
free((a)->d); (a)->d = NULL; \
|
||||||
|
(a)->n = 0; \
|
||||||
|
} while(0)
|
||||||
|
|
||||||
|
#define utringbuffer_new(a,n,_icd) do { \
|
||||||
|
a = (UT_ringbuffer*)malloc(sizeof(UT_ringbuffer)); \
|
||||||
|
utringbuffer_init(a, n, _icd); \
|
||||||
|
} while(0)
|
||||||
|
|
||||||
|
#define utringbuffer_free(a) do { \
|
||||||
|
utringbuffer_done(a); \
|
||||||
|
free(a); \
|
||||||
|
} while(0)
|
||||||
|
|
||||||
|
#define utringbuffer_push_back(a,p) do { \
|
||||||
|
if ((a)->icd.dtor && (a)->f) { (a)->icd.dtor(_utringbuffer_internalptr(a,(a)->i)); } \
|
||||||
|
if ((a)->icd.copy) { (a)->icd.copy( _utringbuffer_internalptr(a,(a)->i), p); } \
|
||||||
|
else { memcpy(_utringbuffer_internalptr(a,(a)->i), p, (a)->icd.sz); }; \
|
||||||
|
if (++(a)->i == (a)->n) { (a)->i = 0; (a)->f = 1; } \
|
||||||
|
} while(0)
|
||||||
|
|
||||||
|
#define utringbuffer_len(a) ((a)->f ? (a)->n : (a)->i)
|
||||||
|
#define utringbuffer_empty(a) ((a)->i == 0 && !(a)->f)
|
||||||
|
#define utringbuffer_full(a) ((a)->f != 0)
|
||||||
|
|
||||||
|
#define _utringbuffer_real_idx(a,j) ((a)->f ? ((j) + (a)->i) % (a)->n : (j))
|
||||||
|
#define _utringbuffer_internalptr(a,j) ((void*)((a)->d + ((a)->icd.sz * (j))))
|
||||||
|
#define utringbuffer_eltptr(a,j) ((0 <= (j) && (j) < utringbuffer_len(a)) ? _utringbuffer_internalptr(a,_utringbuffer_real_idx(a,j)) : NULL)
|
||||||
|
|
||||||
|
#define _utringbuffer_fake_idx(a,j) ((a)->f ? ((j) + (a)->n - (a)->i) % (a)->n : (j))
|
||||||
|
#define _utringbuffer_internalidx(a,e) (((char*)(e) >= (a)->d) ? (((char*)(e) - (a)->d)/(a)->icd.sz) : -1)
|
||||||
|
#define utringbuffer_eltidx(a,e) _utringbuffer_fake_idx(a, _utringbuffer_internalidx(a,e))
|
||||||
|
|
||||||
|
#define utringbuffer_front(a) utringbuffer_eltptr(a,0)
|
||||||
|
#define utringbuffer_next(a,e) ((e)==NULL ? utringbuffer_front(a) : utringbuffer_eltptr(a, utringbuffer_eltidx(a,e)+1))
|
||||||
|
#define utringbuffer_prev(a,e) ((e)==NULL ? utringbuffer_back(a) : utringbuffer_eltptr(a, utringbuffer_eltidx(a,e)-1))
|
||||||
|
#define utringbuffer_back(a) (utringbuffer_empty(a) ? NULL : utringbuffer_eltptr(a, utringbuffer_len(a) - 1))
|
||||||
|
|
||||||
|
#endif /* UTRINGBUFFER_H */
|
||||||
88
src/inc_internal/uthash/utstack.h
Normal file
88
src/inc_internal/uthash/utstack.h
Normal file
@@ -0,0 +1,88 @@
|
|||||||
|
/*
|
||||||
|
Copyright (c) 2018-2018, Troy D. Hanson http://troydhanson.github.com/uthash/
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without
|
||||||
|
modification, are permitted provided that the following conditions are met:
|
||||||
|
|
||||||
|
* Redistributions of source code must retain the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
|
||||||
|
IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||||
|
TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
|
||||||
|
PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
|
||||||
|
OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef UTSTACK_H
|
||||||
|
#define UTSTACK_H
|
||||||
|
|
||||||
|
#define UTSTACK_VERSION 2.1.0
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This file contains macros to manipulate a singly-linked list as a stack.
|
||||||
|
*
|
||||||
|
* To use utstack, your structure must have a "next" pointer.
|
||||||
|
*
|
||||||
|
* ----------------.EXAMPLE -------------------------
|
||||||
|
* struct item {
|
||||||
|
* int id;
|
||||||
|
* struct item *next;
|
||||||
|
* }
|
||||||
|
*
|
||||||
|
* struct item *stack = NULL:
|
||||||
|
*
|
||||||
|
* int main() {
|
||||||
|
* int count;
|
||||||
|
* struct item *tmp;
|
||||||
|
* struct item *item = malloc(sizeof *item);
|
||||||
|
* item->id = 42;
|
||||||
|
* STACK_COUNT(stack, tmp, count); assert(count == 0);
|
||||||
|
* STACK_PUSH(stack, item);
|
||||||
|
* STACK_COUNT(stack, tmp, count); assert(count == 1);
|
||||||
|
* STACK_POP(stack, item);
|
||||||
|
* free(item);
|
||||||
|
* STACK_COUNT(stack, tmp, count); assert(count == 0);
|
||||||
|
* }
|
||||||
|
* --------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define STACK_TOP(head) (head)
|
||||||
|
|
||||||
|
#define STACK_EMPTY(head) (!(head))
|
||||||
|
|
||||||
|
#define STACK_PUSH(head,add) \
|
||||||
|
STACK_PUSH2(head,add,next)
|
||||||
|
|
||||||
|
#define STACK_PUSH2(head,add,next) \
|
||||||
|
do { \
|
||||||
|
(add)->next = (head); \
|
||||||
|
(head) = (add); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define STACK_POP(head,result) \
|
||||||
|
STACK_POP2(head,result,next)
|
||||||
|
|
||||||
|
#define STACK_POP2(head,result,next) \
|
||||||
|
do { \
|
||||||
|
(result) = (head); \
|
||||||
|
(head) = (head)->next; \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define STACK_COUNT(head,el,counter) \
|
||||||
|
STACK_COUNT2(head,el,counter,next) \
|
||||||
|
|
||||||
|
#define STACK_COUNT2(head,el,counter,next) \
|
||||||
|
do { \
|
||||||
|
(counter) = 0; \
|
||||||
|
for ((el) = (head); el; (el) = (el)->next) { ++(counter); } \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#endif /* UTSTACK_H */
|
||||||
407
src/inc_internal/uthash/utstring.h
Normal file
407
src/inc_internal/uthash/utstring.h
Normal file
@@ -0,0 +1,407 @@
|
|||||||
|
/*
|
||||||
|
Copyright (c) 2008-2018, Troy D. Hanson http://troydhanson.github.com/uthash/
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without
|
||||||
|
modification, are permitted provided that the following conditions are met:
|
||||||
|
|
||||||
|
* Redistributions of source code must retain the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
|
||||||
|
IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||||
|
TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
|
||||||
|
PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
|
||||||
|
OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* a dynamic string implementation using macros
|
||||||
|
*/
|
||||||
|
#ifndef UTSTRING_H
|
||||||
|
#define UTSTRING_H
|
||||||
|
|
||||||
|
#define UTSTRING_VERSION 2.1.0
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdarg.h>
|
||||||
|
|
||||||
|
#ifdef __GNUC__
|
||||||
|
#define UTSTRING_UNUSED __attribute__((__unused__))
|
||||||
|
#else
|
||||||
|
#define UTSTRING_UNUSED
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef oom
|
||||||
|
#error "The name of macro 'oom' has been changed to 'utstring_oom'. Please update your code."
|
||||||
|
#define utstring_oom() oom()
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef utstring_oom
|
||||||
|
#define utstring_oom() exit(-1)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
char *d; /* pointer to allocated buffer */
|
||||||
|
size_t n; /* allocated capacity */
|
||||||
|
size_t i; /* index of first unused byte */
|
||||||
|
} UT_string;
|
||||||
|
|
||||||
|
#define utstring_reserve(s,amt) \
|
||||||
|
do { \
|
||||||
|
if (((s)->n - (s)->i) < (size_t)(amt)) { \
|
||||||
|
char *utstring_tmp = (char*)realloc( \
|
||||||
|
(s)->d, (s)->n + (amt)); \
|
||||||
|
if (!utstring_tmp) { \
|
||||||
|
utstring_oom(); \
|
||||||
|
} \
|
||||||
|
(s)->d = utstring_tmp; \
|
||||||
|
(s)->n += (amt); \
|
||||||
|
} \
|
||||||
|
} while(0)
|
||||||
|
|
||||||
|
#define utstring_init(s) \
|
||||||
|
do { \
|
||||||
|
(s)->n = 0; (s)->i = 0; (s)->d = NULL; \
|
||||||
|
utstring_reserve(s,100); \
|
||||||
|
(s)->d[0] = '\0'; \
|
||||||
|
} while(0)
|
||||||
|
|
||||||
|
#define utstring_done(s) \
|
||||||
|
do { \
|
||||||
|
if ((s)->d != NULL) free((s)->d); \
|
||||||
|
(s)->n = 0; \
|
||||||
|
} while(0)
|
||||||
|
|
||||||
|
#define utstring_free(s) \
|
||||||
|
do { \
|
||||||
|
utstring_done(s); \
|
||||||
|
free(s); \
|
||||||
|
} while(0)
|
||||||
|
|
||||||
|
#define utstring_new(s) \
|
||||||
|
do { \
|
||||||
|
(s) = (UT_string*)malloc(sizeof(UT_string)); \
|
||||||
|
if (!(s)) { \
|
||||||
|
utstring_oom(); \
|
||||||
|
} \
|
||||||
|
utstring_init(s); \
|
||||||
|
} while(0)
|
||||||
|
|
||||||
|
#define utstring_renew(s) \
|
||||||
|
do { \
|
||||||
|
if (s) { \
|
||||||
|
utstring_clear(s); \
|
||||||
|
} else { \
|
||||||
|
utstring_new(s); \
|
||||||
|
} \
|
||||||
|
} while(0)
|
||||||
|
|
||||||
|
#define utstring_clear(s) \
|
||||||
|
do { \
|
||||||
|
(s)->i = 0; \
|
||||||
|
(s)->d[0] = '\0'; \
|
||||||
|
} while(0)
|
||||||
|
|
||||||
|
#define utstring_bincpy(s,b,l) \
|
||||||
|
do { \
|
||||||
|
utstring_reserve((s),(l)+1); \
|
||||||
|
if (l) memcpy(&(s)->d[(s)->i], b, l); \
|
||||||
|
(s)->i += (l); \
|
||||||
|
(s)->d[(s)->i]='\0'; \
|
||||||
|
} while(0)
|
||||||
|
|
||||||
|
#define utstring_concat(dst,src) \
|
||||||
|
do { \
|
||||||
|
utstring_reserve((dst),((src)->i)+1); \
|
||||||
|
if ((src)->i) memcpy(&(dst)->d[(dst)->i], (src)->d, (src)->i); \
|
||||||
|
(dst)->i += (src)->i; \
|
||||||
|
(dst)->d[(dst)->i]='\0'; \
|
||||||
|
} while(0)
|
||||||
|
|
||||||
|
#define utstring_len(s) ((s)->i)
|
||||||
|
|
||||||
|
#define utstring_body(s) ((s)->d)
|
||||||
|
|
||||||
|
UTSTRING_UNUSED static void utstring_printf_va(UT_string *s, const char *fmt, va_list ap) {
|
||||||
|
int n;
|
||||||
|
va_list cp;
|
||||||
|
for (;;) {
|
||||||
|
#ifdef _WIN32
|
||||||
|
cp = ap;
|
||||||
|
#else
|
||||||
|
va_copy(cp, ap);
|
||||||
|
#endif
|
||||||
|
n = vsnprintf (&s->d[s->i], s->n-s->i, fmt, cp);
|
||||||
|
va_end(cp);
|
||||||
|
|
||||||
|
if ((n > -1) && ((size_t) n < (s->n-s->i))) {
|
||||||
|
s->i += n;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Else try again with more space. */
|
||||||
|
if (n > -1) utstring_reserve(s,n+1); /* exact */
|
||||||
|
else utstring_reserve(s,(s->n)*2); /* 2x */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#ifdef __GNUC__
|
||||||
|
/* support printf format checking (2=the format string, 3=start of varargs) */
|
||||||
|
static void utstring_printf(UT_string *s, const char *fmt, ...)
|
||||||
|
__attribute__ (( format( printf, 2, 3) ));
|
||||||
|
#endif
|
||||||
|
UTSTRING_UNUSED static void utstring_printf(UT_string *s, const char *fmt, ...) {
|
||||||
|
va_list ap;
|
||||||
|
va_start(ap,fmt);
|
||||||
|
utstring_printf_va(s,fmt,ap);
|
||||||
|
va_end(ap);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* begin substring search functions *
|
||||||
|
******************************************************************************/
|
||||||
|
/* Build KMP table from left to right. */
|
||||||
|
UTSTRING_UNUSED static void _utstring_BuildTable(
|
||||||
|
const char *P_Needle,
|
||||||
|
size_t P_NeedleLen,
|
||||||
|
long *P_KMP_Table)
|
||||||
|
{
|
||||||
|
long i, j;
|
||||||
|
|
||||||
|
i = 0;
|
||||||
|
j = i - 1;
|
||||||
|
P_KMP_Table[i] = j;
|
||||||
|
while (i < (long) P_NeedleLen)
|
||||||
|
{
|
||||||
|
while ( (j > -1) && (P_Needle[i] != P_Needle[j]) )
|
||||||
|
{
|
||||||
|
j = P_KMP_Table[j];
|
||||||
|
}
|
||||||
|
i++;
|
||||||
|
j++;
|
||||||
|
if (i < (long) P_NeedleLen)
|
||||||
|
{
|
||||||
|
if (P_Needle[i] == P_Needle[j])
|
||||||
|
{
|
||||||
|
P_KMP_Table[i] = P_KMP_Table[j];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
P_KMP_Table[i] = j;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
P_KMP_Table[i] = j;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* Build KMP table from right to left. */
|
||||||
|
UTSTRING_UNUSED static void _utstring_BuildTableR(
|
||||||
|
const char *P_Needle,
|
||||||
|
size_t P_NeedleLen,
|
||||||
|
long *P_KMP_Table)
|
||||||
|
{
|
||||||
|
long i, j;
|
||||||
|
|
||||||
|
i = P_NeedleLen - 1;
|
||||||
|
j = i + 1;
|
||||||
|
P_KMP_Table[i + 1] = j;
|
||||||
|
while (i >= 0)
|
||||||
|
{
|
||||||
|
while ( (j < (long) P_NeedleLen) && (P_Needle[i] != P_Needle[j]) )
|
||||||
|
{
|
||||||
|
j = P_KMP_Table[j + 1];
|
||||||
|
}
|
||||||
|
i--;
|
||||||
|
j--;
|
||||||
|
if (i >= 0)
|
||||||
|
{
|
||||||
|
if (P_Needle[i] == P_Needle[j])
|
||||||
|
{
|
||||||
|
P_KMP_Table[i + 1] = P_KMP_Table[j + 1];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
P_KMP_Table[i + 1] = j;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
P_KMP_Table[i + 1] = j;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* Search data from left to right. ( Multiple search mode. ) */
|
||||||
|
UTSTRING_UNUSED static long _utstring_find(
|
||||||
|
const char *P_Haystack,
|
||||||
|
size_t P_HaystackLen,
|
||||||
|
const char *P_Needle,
|
||||||
|
size_t P_NeedleLen,
|
||||||
|
long *P_KMP_Table)
|
||||||
|
{
|
||||||
|
long i, j;
|
||||||
|
long V_FindPosition = -1;
|
||||||
|
|
||||||
|
/* Search from left to right. */
|
||||||
|
i = j = 0;
|
||||||
|
while ( (j < (int)P_HaystackLen) && (((P_HaystackLen - j) + i) >= P_NeedleLen) )
|
||||||
|
{
|
||||||
|
while ( (i > -1) && (P_Needle[i] != P_Haystack[j]) )
|
||||||
|
{
|
||||||
|
i = P_KMP_Table[i];
|
||||||
|
}
|
||||||
|
i++;
|
||||||
|
j++;
|
||||||
|
if (i >= (int)P_NeedleLen)
|
||||||
|
{
|
||||||
|
/* Found. */
|
||||||
|
V_FindPosition = j - i;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return V_FindPosition;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* Search data from right to left. ( Multiple search mode. ) */
|
||||||
|
UTSTRING_UNUSED static long _utstring_findR(
|
||||||
|
const char *P_Haystack,
|
||||||
|
size_t P_HaystackLen,
|
||||||
|
const char *P_Needle,
|
||||||
|
size_t P_NeedleLen,
|
||||||
|
long *P_KMP_Table)
|
||||||
|
{
|
||||||
|
long i, j;
|
||||||
|
long V_FindPosition = -1;
|
||||||
|
|
||||||
|
/* Search from right to left. */
|
||||||
|
j = (P_HaystackLen - 1);
|
||||||
|
i = (P_NeedleLen - 1);
|
||||||
|
while ( (j >= 0) && (j >= i) )
|
||||||
|
{
|
||||||
|
while ( (i < (int)P_NeedleLen) && (P_Needle[i] != P_Haystack[j]) )
|
||||||
|
{
|
||||||
|
i = P_KMP_Table[i + 1];
|
||||||
|
}
|
||||||
|
i--;
|
||||||
|
j--;
|
||||||
|
if (i < 0)
|
||||||
|
{
|
||||||
|
/* Found. */
|
||||||
|
V_FindPosition = j + 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return V_FindPosition;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* Search data from left to right. ( One time search mode. ) */
|
||||||
|
UTSTRING_UNUSED static long utstring_find(
|
||||||
|
UT_string *s,
|
||||||
|
long P_StartPosition, /* Start from 0. -1 means last position. */
|
||||||
|
const char *P_Needle,
|
||||||
|
size_t P_NeedleLen)
|
||||||
|
{
|
||||||
|
long V_StartPosition;
|
||||||
|
long V_HaystackLen;
|
||||||
|
long *V_KMP_Table;
|
||||||
|
long V_FindPosition = -1;
|
||||||
|
|
||||||
|
if (P_StartPosition < 0)
|
||||||
|
{
|
||||||
|
V_StartPosition = s->i + P_StartPosition;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
V_StartPosition = P_StartPosition;
|
||||||
|
}
|
||||||
|
V_HaystackLen = s->i - V_StartPosition;
|
||||||
|
if ( (V_HaystackLen >= (long) P_NeedleLen) && (P_NeedleLen > 0) )
|
||||||
|
{
|
||||||
|
V_KMP_Table = (long *)malloc(sizeof(long) * (P_NeedleLen + 1));
|
||||||
|
if (V_KMP_Table != NULL)
|
||||||
|
{
|
||||||
|
_utstring_BuildTable(P_Needle, P_NeedleLen, V_KMP_Table);
|
||||||
|
|
||||||
|
V_FindPosition = _utstring_find(s->d + V_StartPosition,
|
||||||
|
V_HaystackLen,
|
||||||
|
P_Needle,
|
||||||
|
P_NeedleLen,
|
||||||
|
V_KMP_Table);
|
||||||
|
if (V_FindPosition >= 0)
|
||||||
|
{
|
||||||
|
V_FindPosition += V_StartPosition;
|
||||||
|
}
|
||||||
|
|
||||||
|
free(V_KMP_Table);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return V_FindPosition;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* Search data from right to left. ( One time search mode. ) */
|
||||||
|
UTSTRING_UNUSED static long utstring_findR(
|
||||||
|
UT_string *s,
|
||||||
|
long P_StartPosition, /* Start from 0. -1 means last position. */
|
||||||
|
const char *P_Needle,
|
||||||
|
size_t P_NeedleLen)
|
||||||
|
{
|
||||||
|
long V_StartPosition;
|
||||||
|
long V_HaystackLen;
|
||||||
|
long *V_KMP_Table;
|
||||||
|
long V_FindPosition = -1;
|
||||||
|
|
||||||
|
if (P_StartPosition < 0)
|
||||||
|
{
|
||||||
|
V_StartPosition = s->i + P_StartPosition;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
V_StartPosition = P_StartPosition;
|
||||||
|
}
|
||||||
|
V_HaystackLen = V_StartPosition + 1;
|
||||||
|
if ( (V_HaystackLen >= (long) P_NeedleLen) && (P_NeedleLen > 0) )
|
||||||
|
{
|
||||||
|
V_KMP_Table = (long *)malloc(sizeof(long) * (P_NeedleLen + 1));
|
||||||
|
if (V_KMP_Table != NULL)
|
||||||
|
{
|
||||||
|
_utstring_BuildTableR(P_Needle, P_NeedleLen, V_KMP_Table);
|
||||||
|
|
||||||
|
V_FindPosition = _utstring_findR(s->d,
|
||||||
|
V_HaystackLen,
|
||||||
|
P_Needle,
|
||||||
|
P_NeedleLen,
|
||||||
|
V_KMP_Table);
|
||||||
|
|
||||||
|
free(V_KMP_Table);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return V_FindPosition;
|
||||||
|
}
|
||||||
|
/*******************************************************************************
|
||||||
|
* end substring search functions *
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
#endif /* UTSTRING_H */
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -1,623 +0,0 @@
|
|||||||
/*
|
|
||||||
** 2006 June 7
|
|
||||||
**
|
|
||||||
** The author disclaims copyright to this source code. In place of
|
|
||||||
** a legal notice, here is a blessing:
|
|
||||||
**
|
|
||||||
** May you do good and not evil.
|
|
||||||
** May you find forgiveness for yourself and forgive others.
|
|
||||||
** May you share freely, never taking more than you give.
|
|
||||||
**
|
|
||||||
*************************************************************************
|
|
||||||
** This header file defines the SQLite interface for use by
|
|
||||||
** shared libraries that want to be imported as extensions into
|
|
||||||
** an SQLite instance. Shared libraries that intend to be loaded
|
|
||||||
** as extensions by SQLite should #include this file instead of
|
|
||||||
** sqlite3.h.
|
|
||||||
*/
|
|
||||||
#ifndef SQLITE3EXT_H
|
|
||||||
#define SQLITE3EXT_H
|
|
||||||
#include "sqlite3.h"
|
|
||||||
|
|
||||||
/*
|
|
||||||
** The following structure holds pointers to all of the SQLite API
|
|
||||||
** routines.
|
|
||||||
**
|
|
||||||
** WARNING: In order to maintain backwards compatibility, add new
|
|
||||||
** interfaces to the end of this structure only. If you insert new
|
|
||||||
** interfaces in the middle of this structure, then older different
|
|
||||||
** versions of SQLite will not be able to load each other's shared
|
|
||||||
** libraries!
|
|
||||||
*/
|
|
||||||
struct sqlite3_api_routines {
|
|
||||||
void * (*aggregate_context)(sqlite3_context*,int nBytes);
|
|
||||||
int (*aggregate_count)(sqlite3_context*);
|
|
||||||
int (*bind_blob)(sqlite3_stmt*,int,const void*,int n,void(*)(void*));
|
|
||||||
int (*bind_double)(sqlite3_stmt*,int,double);
|
|
||||||
int (*bind_int)(sqlite3_stmt*,int,int);
|
|
||||||
int (*bind_int64)(sqlite3_stmt*,int,sqlite_int64);
|
|
||||||
int (*bind_null)(sqlite3_stmt*,int);
|
|
||||||
int (*bind_parameter_count)(sqlite3_stmt*);
|
|
||||||
int (*bind_parameter_index)(sqlite3_stmt*,const char*zName);
|
|
||||||
const char * (*bind_parameter_name)(sqlite3_stmt*,int);
|
|
||||||
int (*bind_text)(sqlite3_stmt*,int,const char*,int n,void(*)(void*));
|
|
||||||
int (*bind_text16)(sqlite3_stmt*,int,const void*,int,void(*)(void*));
|
|
||||||
int (*bind_value)(sqlite3_stmt*,int,const sqlite3_value*);
|
|
||||||
int (*busy_handler)(sqlite3*,int(*)(void*,int),void*);
|
|
||||||
int (*busy_timeout)(sqlite3*,int ms);
|
|
||||||
int (*changes)(sqlite3*);
|
|
||||||
int (*close)(sqlite3*);
|
|
||||||
int (*collation_needed)(sqlite3*,void*,void(*)(void*,sqlite3*,
|
|
||||||
int eTextRep,const char*));
|
|
||||||
int (*collation_needed16)(sqlite3*,void*,void(*)(void*,sqlite3*,
|
|
||||||
int eTextRep,const void*));
|
|
||||||
const void * (*column_blob)(sqlite3_stmt*,int iCol);
|
|
||||||
int (*column_bytes)(sqlite3_stmt*,int iCol);
|
|
||||||
int (*column_bytes16)(sqlite3_stmt*,int iCol);
|
|
||||||
int (*column_count)(sqlite3_stmt*pStmt);
|
|
||||||
const char * (*column_database_name)(sqlite3_stmt*,int);
|
|
||||||
const void * (*column_database_name16)(sqlite3_stmt*,int);
|
|
||||||
const char * (*column_decltype)(sqlite3_stmt*,int i);
|
|
||||||
const void * (*column_decltype16)(sqlite3_stmt*,int);
|
|
||||||
double (*column_double)(sqlite3_stmt*,int iCol);
|
|
||||||
int (*column_int)(sqlite3_stmt*,int iCol);
|
|
||||||
sqlite_int64 (*column_int64)(sqlite3_stmt*,int iCol);
|
|
||||||
const char * (*column_name)(sqlite3_stmt*,int);
|
|
||||||
const void * (*column_name16)(sqlite3_stmt*,int);
|
|
||||||
const char * (*column_origin_name)(sqlite3_stmt*,int);
|
|
||||||
const void * (*column_origin_name16)(sqlite3_stmt*,int);
|
|
||||||
const char * (*column_table_name)(sqlite3_stmt*,int);
|
|
||||||
const void * (*column_table_name16)(sqlite3_stmt*,int);
|
|
||||||
const unsigned char * (*column_text)(sqlite3_stmt*,int iCol);
|
|
||||||
const void * (*column_text16)(sqlite3_stmt*,int iCol);
|
|
||||||
int (*column_type)(sqlite3_stmt*,int iCol);
|
|
||||||
sqlite3_value* (*column_value)(sqlite3_stmt*,int iCol);
|
|
||||||
void * (*commit_hook)(sqlite3*,int(*)(void*),void*);
|
|
||||||
int (*complete)(const char*sql);
|
|
||||||
int (*complete16)(const void*sql);
|
|
||||||
int (*create_collation)(sqlite3*,const char*,int,void*,
|
|
||||||
int(*)(void*,int,const void*,int,const void*));
|
|
||||||
int (*create_collation16)(sqlite3*,const void*,int,void*,
|
|
||||||
int(*)(void*,int,const void*,int,const void*));
|
|
||||||
int (*create_function)(sqlite3*,const char*,int,int,void*,
|
|
||||||
void (*xFunc)(sqlite3_context*,int,sqlite3_value**),
|
|
||||||
void (*xStep)(sqlite3_context*,int,sqlite3_value**),
|
|
||||||
void (*xFinal)(sqlite3_context*));
|
|
||||||
int (*create_function16)(sqlite3*,const void*,int,int,void*,
|
|
||||||
void (*xFunc)(sqlite3_context*,int,sqlite3_value**),
|
|
||||||
void (*xStep)(sqlite3_context*,int,sqlite3_value**),
|
|
||||||
void (*xFinal)(sqlite3_context*));
|
|
||||||
int (*create_module)(sqlite3*,const char*,const sqlite3_module*,void*);
|
|
||||||
int (*data_count)(sqlite3_stmt*pStmt);
|
|
||||||
sqlite3 * (*db_handle)(sqlite3_stmt*);
|
|
||||||
int (*declare_vtab)(sqlite3*,const char*);
|
|
||||||
int (*enable_shared_cache)(int);
|
|
||||||
int (*errcode)(sqlite3*db);
|
|
||||||
const char * (*errmsg)(sqlite3*);
|
|
||||||
const void * (*errmsg16)(sqlite3*);
|
|
||||||
int (*exec)(sqlite3*,const char*,sqlite3_callback,void*,char**);
|
|
||||||
int (*expired)(sqlite3_stmt*);
|
|
||||||
int (*finalize)(sqlite3_stmt*pStmt);
|
|
||||||
void (*free)(void*);
|
|
||||||
void (*free_table)(char**result);
|
|
||||||
int (*get_autocommit)(sqlite3*);
|
|
||||||
void * (*get_auxdata)(sqlite3_context*,int);
|
|
||||||
int (*get_table)(sqlite3*,const char*,char***,int*,int*,char**);
|
|
||||||
int (*global_recover)(void);
|
|
||||||
void (*interruptx)(sqlite3*);
|
|
||||||
sqlite_int64 (*last_insert_rowid)(sqlite3*);
|
|
||||||
const char * (*libversion)(void);
|
|
||||||
int (*libversion_number)(void);
|
|
||||||
void *(*malloc)(int);
|
|
||||||
char * (*mprintf)(const char*,...);
|
|
||||||
int (*open)(const char*,sqlite3**);
|
|
||||||
int (*open16)(const void*,sqlite3**);
|
|
||||||
int (*prepare)(sqlite3*,const char*,int,sqlite3_stmt**,const char**);
|
|
||||||
int (*prepare16)(sqlite3*,const void*,int,sqlite3_stmt**,const void**);
|
|
||||||
void * (*profile)(sqlite3*,void(*)(void*,const char*,sqlite_uint64),void*);
|
|
||||||
void (*progress_handler)(sqlite3*,int,int(*)(void*),void*);
|
|
||||||
void *(*realloc)(void*,int);
|
|
||||||
int (*reset)(sqlite3_stmt*pStmt);
|
|
||||||
void (*result_blob)(sqlite3_context*,const void*,int,void(*)(void*));
|
|
||||||
void (*result_double)(sqlite3_context*,double);
|
|
||||||
void (*result_error)(sqlite3_context*,const char*,int);
|
|
||||||
void (*result_error16)(sqlite3_context*,const void*,int);
|
|
||||||
void (*result_int)(sqlite3_context*,int);
|
|
||||||
void (*result_int64)(sqlite3_context*,sqlite_int64);
|
|
||||||
void (*result_null)(sqlite3_context*);
|
|
||||||
void (*result_text)(sqlite3_context*,const char*,int,void(*)(void*));
|
|
||||||
void (*result_text16)(sqlite3_context*,const void*,int,void(*)(void*));
|
|
||||||
void (*result_text16be)(sqlite3_context*,const void*,int,void(*)(void*));
|
|
||||||
void (*result_text16le)(sqlite3_context*,const void*,int,void(*)(void*));
|
|
||||||
void (*result_value)(sqlite3_context*,sqlite3_value*);
|
|
||||||
void * (*rollback_hook)(sqlite3*,void(*)(void*),void*);
|
|
||||||
int (*set_authorizer)(sqlite3*,int(*)(void*,int,const char*,const char*,
|
|
||||||
const char*,const char*),void*);
|
|
||||||
void (*set_auxdata)(sqlite3_context*,int,void*,void (*)(void*));
|
|
||||||
char * (*xsnprintf)(int,char*,const char*,...);
|
|
||||||
int (*step)(sqlite3_stmt*);
|
|
||||||
int (*table_column_metadata)(sqlite3*,const char*,const char*,const char*,
|
|
||||||
char const**,char const**,int*,int*,int*);
|
|
||||||
void (*thread_cleanup)(void);
|
|
||||||
int (*total_changes)(sqlite3*);
|
|
||||||
void * (*trace)(sqlite3*,void(*xTrace)(void*,const char*),void*);
|
|
||||||
int (*transfer_bindings)(sqlite3_stmt*,sqlite3_stmt*);
|
|
||||||
void * (*update_hook)(sqlite3*,void(*)(void*,int ,char const*,char const*,
|
|
||||||
sqlite_int64),void*);
|
|
||||||
void * (*user_data)(sqlite3_context*);
|
|
||||||
const void * (*value_blob)(sqlite3_value*);
|
|
||||||
int (*value_bytes)(sqlite3_value*);
|
|
||||||
int (*value_bytes16)(sqlite3_value*);
|
|
||||||
double (*value_double)(sqlite3_value*);
|
|
||||||
int (*value_int)(sqlite3_value*);
|
|
||||||
sqlite_int64 (*value_int64)(sqlite3_value*);
|
|
||||||
int (*value_numeric_type)(sqlite3_value*);
|
|
||||||
const unsigned char * (*value_text)(sqlite3_value*);
|
|
||||||
const void * (*value_text16)(sqlite3_value*);
|
|
||||||
const void * (*value_text16be)(sqlite3_value*);
|
|
||||||
const void * (*value_text16le)(sqlite3_value*);
|
|
||||||
int (*value_type)(sqlite3_value*);
|
|
||||||
char *(*vmprintf)(const char*,va_list);
|
|
||||||
/* Added ??? */
|
|
||||||
int (*overload_function)(sqlite3*, const char *zFuncName, int nArg);
|
|
||||||
/* Added by 3.3.13 */
|
|
||||||
int (*prepare_v2)(sqlite3*,const char*,int,sqlite3_stmt**,const char**);
|
|
||||||
int (*prepare16_v2)(sqlite3*,const void*,int,sqlite3_stmt**,const void**);
|
|
||||||
int (*clear_bindings)(sqlite3_stmt*);
|
|
||||||
/* Added by 3.4.1 */
|
|
||||||
int (*create_module_v2)(sqlite3*,const char*,const sqlite3_module*,void*,
|
|
||||||
void (*xDestroy)(void *));
|
|
||||||
/* Added by 3.5.0 */
|
|
||||||
int (*bind_zeroblob)(sqlite3_stmt*,int,int);
|
|
||||||
int (*blob_bytes)(sqlite3_blob*);
|
|
||||||
int (*blob_close)(sqlite3_blob*);
|
|
||||||
int (*blob_open)(sqlite3*,const char*,const char*,const char*,sqlite3_int64,
|
|
||||||
int,sqlite3_blob**);
|
|
||||||
int (*blob_read)(sqlite3_blob*,void*,int,int);
|
|
||||||
int (*blob_write)(sqlite3_blob*,const void*,int,int);
|
|
||||||
int (*create_collation_v2)(sqlite3*,const char*,int,void*,
|
|
||||||
int(*)(void*,int,const void*,int,const void*),
|
|
||||||
void(*)(void*));
|
|
||||||
int (*file_control)(sqlite3*,const char*,int,void*);
|
|
||||||
sqlite3_int64 (*memory_highwater)(int);
|
|
||||||
sqlite3_int64 (*memory_used)(void);
|
|
||||||
sqlite3_mutex *(*mutex_alloc)(int);
|
|
||||||
void (*mutex_enter)(sqlite3_mutex*);
|
|
||||||
void (*mutex_free)(sqlite3_mutex*);
|
|
||||||
void (*mutex_leave)(sqlite3_mutex*);
|
|
||||||
int (*mutex_try)(sqlite3_mutex*);
|
|
||||||
int (*open_v2)(const char*,sqlite3**,int,const char*);
|
|
||||||
int (*release_memory)(int);
|
|
||||||
void (*result_error_nomem)(sqlite3_context*);
|
|
||||||
void (*result_error_toobig)(sqlite3_context*);
|
|
||||||
int (*sleep)(int);
|
|
||||||
void (*soft_heap_limit)(int);
|
|
||||||
sqlite3_vfs *(*vfs_find)(const char*);
|
|
||||||
int (*vfs_register)(sqlite3_vfs*,int);
|
|
||||||
int (*vfs_unregister)(sqlite3_vfs*);
|
|
||||||
int (*xthreadsafe)(void);
|
|
||||||
void (*result_zeroblob)(sqlite3_context*,int);
|
|
||||||
void (*result_error_code)(sqlite3_context*,int);
|
|
||||||
int (*test_control)(int, ...);
|
|
||||||
void (*randomness)(int,void*);
|
|
||||||
sqlite3 *(*context_db_handle)(sqlite3_context*);
|
|
||||||
int (*extended_result_codes)(sqlite3*,int);
|
|
||||||
int (*limit)(sqlite3*,int,int);
|
|
||||||
sqlite3_stmt *(*next_stmt)(sqlite3*,sqlite3_stmt*);
|
|
||||||
const char *(*sql)(sqlite3_stmt*);
|
|
||||||
int (*status)(int,int*,int*,int);
|
|
||||||
int (*backup_finish)(sqlite3_backup*);
|
|
||||||
sqlite3_backup *(*backup_init)(sqlite3*,const char*,sqlite3*,const char*);
|
|
||||||
int (*backup_pagecount)(sqlite3_backup*);
|
|
||||||
int (*backup_remaining)(sqlite3_backup*);
|
|
||||||
int (*backup_step)(sqlite3_backup*,int);
|
|
||||||
const char *(*compileoption_get)(int);
|
|
||||||
int (*compileoption_used)(const char*);
|
|
||||||
int (*create_function_v2)(sqlite3*,const char*,int,int,void*,
|
|
||||||
void (*xFunc)(sqlite3_context*,int,sqlite3_value**),
|
|
||||||
void (*xStep)(sqlite3_context*,int,sqlite3_value**),
|
|
||||||
void (*xFinal)(sqlite3_context*),
|
|
||||||
void(*xDestroy)(void*));
|
|
||||||
int (*db_config)(sqlite3*,int,...);
|
|
||||||
sqlite3_mutex *(*db_mutex)(sqlite3*);
|
|
||||||
int (*db_status)(sqlite3*,int,int*,int*,int);
|
|
||||||
int (*extended_errcode)(sqlite3*);
|
|
||||||
void (*log)(int,const char*,...);
|
|
||||||
sqlite3_int64 (*soft_heap_limit64)(sqlite3_int64);
|
|
||||||
const char *(*sourceid)(void);
|
|
||||||
int (*stmt_status)(sqlite3_stmt*,int,int);
|
|
||||||
int (*strnicmp)(const char*,const char*,int);
|
|
||||||
int (*unlock_notify)(sqlite3*,void(*)(void**,int),void*);
|
|
||||||
int (*wal_autocheckpoint)(sqlite3*,int);
|
|
||||||
int (*wal_checkpoint)(sqlite3*,const char*);
|
|
||||||
void *(*wal_hook)(sqlite3*,int(*)(void*,sqlite3*,const char*,int),void*);
|
|
||||||
int (*blob_reopen)(sqlite3_blob*,sqlite3_int64);
|
|
||||||
int (*vtab_config)(sqlite3*,int op,...);
|
|
||||||
int (*vtab_on_conflict)(sqlite3*);
|
|
||||||
/* Version 3.7.16 and later */
|
|
||||||
int (*close_v2)(sqlite3*);
|
|
||||||
const char *(*db_filename)(sqlite3*,const char*);
|
|
||||||
int (*db_readonly)(sqlite3*,const char*);
|
|
||||||
int (*db_release_memory)(sqlite3*);
|
|
||||||
const char *(*errstr)(int);
|
|
||||||
int (*stmt_busy)(sqlite3_stmt*);
|
|
||||||
int (*stmt_readonly)(sqlite3_stmt*);
|
|
||||||
int (*stricmp)(const char*,const char*);
|
|
||||||
int (*uri_boolean)(const char*,const char*,int);
|
|
||||||
sqlite3_int64 (*uri_int64)(const char*,const char*,sqlite3_int64);
|
|
||||||
const char *(*uri_parameter)(const char*,const char*);
|
|
||||||
char *(*xvsnprintf)(int,char*,const char*,va_list);
|
|
||||||
int (*wal_checkpoint_v2)(sqlite3*,const char*,int,int*,int*);
|
|
||||||
/* Version 3.8.7 and later */
|
|
||||||
int (*auto_extension)(void(*)(void));
|
|
||||||
int (*bind_blob64)(sqlite3_stmt*,int,const void*,sqlite3_uint64,
|
|
||||||
void(*)(void*));
|
|
||||||
int (*bind_text64)(sqlite3_stmt*,int,const char*,sqlite3_uint64,
|
|
||||||
void(*)(void*),unsigned char);
|
|
||||||
int (*cancel_auto_extension)(void(*)(void));
|
|
||||||
int (*load_extension)(sqlite3*,const char*,const char*,char**);
|
|
||||||
void *(*malloc64)(sqlite3_uint64);
|
|
||||||
sqlite3_uint64 (*msize)(void*);
|
|
||||||
void *(*realloc64)(void*,sqlite3_uint64);
|
|
||||||
void (*reset_auto_extension)(void);
|
|
||||||
void (*result_blob64)(sqlite3_context*,const void*,sqlite3_uint64,
|
|
||||||
void(*)(void*));
|
|
||||||
void (*result_text64)(sqlite3_context*,const char*,sqlite3_uint64,
|
|
||||||
void(*)(void*), unsigned char);
|
|
||||||
int (*strglob)(const char*,const char*);
|
|
||||||
/* Version 3.8.11 and later */
|
|
||||||
sqlite3_value *(*value_dup)(const sqlite3_value*);
|
|
||||||
void (*value_free)(sqlite3_value*);
|
|
||||||
int (*result_zeroblob64)(sqlite3_context*,sqlite3_uint64);
|
|
||||||
int (*bind_zeroblob64)(sqlite3_stmt*, int, sqlite3_uint64);
|
|
||||||
/* Version 3.9.0 and later */
|
|
||||||
unsigned int (*value_subtype)(sqlite3_value*);
|
|
||||||
void (*result_subtype)(sqlite3_context*,unsigned int);
|
|
||||||
/* Version 3.10.0 and later */
|
|
||||||
int (*status64)(int,sqlite3_int64*,sqlite3_int64*,int);
|
|
||||||
int (*strlike)(const char*,const char*,unsigned int);
|
|
||||||
int (*db_cacheflush)(sqlite3*);
|
|
||||||
/* Version 3.12.0 and later */
|
|
||||||
int (*system_errno)(sqlite3*);
|
|
||||||
/* Version 3.14.0 and later */
|
|
||||||
int (*trace_v2)(sqlite3*,unsigned,int(*)(unsigned,void*,void*,void*),void*);
|
|
||||||
char *(*expanded_sql)(sqlite3_stmt*);
|
|
||||||
/* Version 3.18.0 and later */
|
|
||||||
void (*set_last_insert_rowid)(sqlite3*,sqlite3_int64);
|
|
||||||
/* Version 3.20.0 and later */
|
|
||||||
int (*prepare_v3)(sqlite3*,const char*,int,unsigned int,
|
|
||||||
sqlite3_stmt**,const char**);
|
|
||||||
int (*prepare16_v3)(sqlite3*,const void*,int,unsigned int,
|
|
||||||
sqlite3_stmt**,const void**);
|
|
||||||
int (*bind_pointer)(sqlite3_stmt*,int,void*,const char*,void(*)(void*));
|
|
||||||
void (*result_pointer)(sqlite3_context*,void*,const char*,void(*)(void*));
|
|
||||||
void *(*value_pointer)(sqlite3_value*,const char*);
|
|
||||||
int (*vtab_nochange)(sqlite3_context*);
|
|
||||||
int (*value_nochange)(sqlite3_value*);
|
|
||||||
const char *(*vtab_collation)(sqlite3_index_info*,int);
|
|
||||||
/* Version 3.24.0 and later */
|
|
||||||
int (*keyword_count)(void);
|
|
||||||
int (*keyword_name)(int,const char**,int*);
|
|
||||||
int (*keyword_check)(const char*,int);
|
|
||||||
sqlite3_str *(*str_new)(sqlite3*);
|
|
||||||
char *(*str_finish)(sqlite3_str*);
|
|
||||||
void (*str_appendf)(sqlite3_str*, const char *zFormat, ...);
|
|
||||||
void (*str_vappendf)(sqlite3_str*, const char *zFormat, va_list);
|
|
||||||
void (*str_append)(sqlite3_str*, const char *zIn, int N);
|
|
||||||
void (*str_appendall)(sqlite3_str*, const char *zIn);
|
|
||||||
void (*str_appendchar)(sqlite3_str*, int N, char C);
|
|
||||||
void (*str_reset)(sqlite3_str*);
|
|
||||||
int (*str_errcode)(sqlite3_str*);
|
|
||||||
int (*str_length)(sqlite3_str*);
|
|
||||||
char *(*str_value)(sqlite3_str*);
|
|
||||||
int (*create_window_function)(sqlite3*,const char*,int,int,void*,
|
|
||||||
void (*xStep)(sqlite3_context*,int,sqlite3_value**),
|
|
||||||
void (*xFinal)(sqlite3_context*),
|
|
||||||
void (*xValue)(sqlite3_context*),
|
|
||||||
void (*xInv)(sqlite3_context*,int,sqlite3_value**),
|
|
||||||
void(*xDestroy)(void*));
|
|
||||||
};
|
|
||||||
|
|
||||||
/*
|
|
||||||
** This is the function signature used for all extension entry points. It
|
|
||||||
** is also defined in the file "loadext.c".
|
|
||||||
*/
|
|
||||||
typedef int (*sqlite3_loadext_entry)(
|
|
||||||
sqlite3 *db, /* Handle to the database. */
|
|
||||||
char **pzErrMsg, /* Used to set error string on failure. */
|
|
||||||
const sqlite3_api_routines *pThunk /* Extension API function pointers. */
|
|
||||||
);
|
|
||||||
|
|
||||||
/*
|
|
||||||
** The following macros redefine the API routines so that they are
|
|
||||||
** redirected through the global sqlite3_api structure.
|
|
||||||
**
|
|
||||||
** This header file is also used by the loadext.c source file
|
|
||||||
** (part of the main SQLite library - not an extension) so that
|
|
||||||
** it can get access to the sqlite3_api_routines structure
|
|
||||||
** definition. But the main library does not want to redefine
|
|
||||||
** the API. So the redefinition macros are only valid if the
|
|
||||||
** SQLITE_CORE macros is undefined.
|
|
||||||
*/
|
|
||||||
#if !defined(SQLITE_CORE) && !defined(SQLITE_OMIT_LOAD_EXTENSION)
|
|
||||||
#define sqlite3_aggregate_context sqlite3_api->aggregate_context
|
|
||||||
#ifndef SQLITE_OMIT_DEPRECATED
|
|
||||||
#define sqlite3_aggregate_count sqlite3_api->aggregate_count
|
|
||||||
#endif
|
|
||||||
#define sqlite3_bind_blob sqlite3_api->bind_blob
|
|
||||||
#define sqlite3_bind_double sqlite3_api->bind_double
|
|
||||||
#define sqlite3_bind_int sqlite3_api->bind_int
|
|
||||||
#define sqlite3_bind_int64 sqlite3_api->bind_int64
|
|
||||||
#define sqlite3_bind_null sqlite3_api->bind_null
|
|
||||||
#define sqlite3_bind_parameter_count sqlite3_api->bind_parameter_count
|
|
||||||
#define sqlite3_bind_parameter_index sqlite3_api->bind_parameter_index
|
|
||||||
#define sqlite3_bind_parameter_name sqlite3_api->bind_parameter_name
|
|
||||||
#define sqlite3_bind_text sqlite3_api->bind_text
|
|
||||||
#define sqlite3_bind_text16 sqlite3_api->bind_text16
|
|
||||||
#define sqlite3_bind_value sqlite3_api->bind_value
|
|
||||||
#define sqlite3_busy_handler sqlite3_api->busy_handler
|
|
||||||
#define sqlite3_busy_timeout sqlite3_api->busy_timeout
|
|
||||||
#define sqlite3_changes sqlite3_api->changes
|
|
||||||
#define sqlite3_close sqlite3_api->close
|
|
||||||
#define sqlite3_collation_needed sqlite3_api->collation_needed
|
|
||||||
#define sqlite3_collation_needed16 sqlite3_api->collation_needed16
|
|
||||||
#define sqlite3_column_blob sqlite3_api->column_blob
|
|
||||||
#define sqlite3_column_bytes sqlite3_api->column_bytes
|
|
||||||
#define sqlite3_column_bytes16 sqlite3_api->column_bytes16
|
|
||||||
#define sqlite3_column_count sqlite3_api->column_count
|
|
||||||
#define sqlite3_column_database_name sqlite3_api->column_database_name
|
|
||||||
#define sqlite3_column_database_name16 sqlite3_api->column_database_name16
|
|
||||||
#define sqlite3_column_decltype sqlite3_api->column_decltype
|
|
||||||
#define sqlite3_column_decltype16 sqlite3_api->column_decltype16
|
|
||||||
#define sqlite3_column_double sqlite3_api->column_double
|
|
||||||
#define sqlite3_column_int sqlite3_api->column_int
|
|
||||||
#define sqlite3_column_int64 sqlite3_api->column_int64
|
|
||||||
#define sqlite3_column_name sqlite3_api->column_name
|
|
||||||
#define sqlite3_column_name16 sqlite3_api->column_name16
|
|
||||||
#define sqlite3_column_origin_name sqlite3_api->column_origin_name
|
|
||||||
#define sqlite3_column_origin_name16 sqlite3_api->column_origin_name16
|
|
||||||
#define sqlite3_column_table_name sqlite3_api->column_table_name
|
|
||||||
#define sqlite3_column_table_name16 sqlite3_api->column_table_name16
|
|
||||||
#define sqlite3_column_text sqlite3_api->column_text
|
|
||||||
#define sqlite3_column_text16 sqlite3_api->column_text16
|
|
||||||
#define sqlite3_column_type sqlite3_api->column_type
|
|
||||||
#define sqlite3_column_value sqlite3_api->column_value
|
|
||||||
#define sqlite3_commit_hook sqlite3_api->commit_hook
|
|
||||||
#define sqlite3_complete sqlite3_api->complete
|
|
||||||
#define sqlite3_complete16 sqlite3_api->complete16
|
|
||||||
#define sqlite3_create_collation sqlite3_api->create_collation
|
|
||||||
#define sqlite3_create_collation16 sqlite3_api->create_collation16
|
|
||||||
#define sqlite3_create_function sqlite3_api->create_function
|
|
||||||
#define sqlite3_create_function16 sqlite3_api->create_function16
|
|
||||||
#define sqlite3_create_module sqlite3_api->create_module
|
|
||||||
#define sqlite3_create_module_v2 sqlite3_api->create_module_v2
|
|
||||||
#define sqlite3_data_count sqlite3_api->data_count
|
|
||||||
#define sqlite3_db_handle sqlite3_api->db_handle
|
|
||||||
#define sqlite3_declare_vtab sqlite3_api->declare_vtab
|
|
||||||
#define sqlite3_enable_shared_cache sqlite3_api->enable_shared_cache
|
|
||||||
#define sqlite3_errcode sqlite3_api->errcode
|
|
||||||
#define sqlite3_errmsg sqlite3_api->errmsg
|
|
||||||
#define sqlite3_errmsg16 sqlite3_api->errmsg16
|
|
||||||
#define sqlite3_exec sqlite3_api->exec
|
|
||||||
#ifndef SQLITE_OMIT_DEPRECATED
|
|
||||||
#define sqlite3_expired sqlite3_api->expired
|
|
||||||
#endif
|
|
||||||
#define sqlite3_finalize sqlite3_api->finalize
|
|
||||||
#define sqlite3_free sqlite3_api->free
|
|
||||||
#define sqlite3_free_table sqlite3_api->free_table
|
|
||||||
#define sqlite3_get_autocommit sqlite3_api->get_autocommit
|
|
||||||
#define sqlite3_get_auxdata sqlite3_api->get_auxdata
|
|
||||||
#define sqlite3_get_table sqlite3_api->get_table
|
|
||||||
#ifndef SQLITE_OMIT_DEPRECATED
|
|
||||||
#define sqlite3_global_recover sqlite3_api->global_recover
|
|
||||||
#endif
|
|
||||||
#define sqlite3_interrupt sqlite3_api->interruptx
|
|
||||||
#define sqlite3_last_insert_rowid sqlite3_api->last_insert_rowid
|
|
||||||
#define sqlite3_libversion sqlite3_api->libversion
|
|
||||||
#define sqlite3_libversion_number sqlite3_api->libversion_number
|
|
||||||
#define sqlite3_malloc sqlite3_api->malloc
|
|
||||||
#define sqlite3_mprintf sqlite3_api->mprintf
|
|
||||||
#define sqlite3_open sqlite3_api->open
|
|
||||||
#define sqlite3_open16 sqlite3_api->open16
|
|
||||||
#define sqlite3_prepare sqlite3_api->prepare
|
|
||||||
#define sqlite3_prepare16 sqlite3_api->prepare16
|
|
||||||
#define sqlite3_prepare_v2 sqlite3_api->prepare_v2
|
|
||||||
#define sqlite3_prepare16_v2 sqlite3_api->prepare16_v2
|
|
||||||
#define sqlite3_profile sqlite3_api->profile
|
|
||||||
#define sqlite3_progress_handler sqlite3_api->progress_handler
|
|
||||||
#define sqlite3_realloc sqlite3_api->realloc
|
|
||||||
#define sqlite3_reset sqlite3_api->reset
|
|
||||||
#define sqlite3_result_blob sqlite3_api->result_blob
|
|
||||||
#define sqlite3_result_double sqlite3_api->result_double
|
|
||||||
#define sqlite3_result_error sqlite3_api->result_error
|
|
||||||
#define sqlite3_result_error16 sqlite3_api->result_error16
|
|
||||||
#define sqlite3_result_int sqlite3_api->result_int
|
|
||||||
#define sqlite3_result_int64 sqlite3_api->result_int64
|
|
||||||
#define sqlite3_result_null sqlite3_api->result_null
|
|
||||||
#define sqlite3_result_text sqlite3_api->result_text
|
|
||||||
#define sqlite3_result_text16 sqlite3_api->result_text16
|
|
||||||
#define sqlite3_result_text16be sqlite3_api->result_text16be
|
|
||||||
#define sqlite3_result_text16le sqlite3_api->result_text16le
|
|
||||||
#define sqlite3_result_value sqlite3_api->result_value
|
|
||||||
#define sqlite3_rollback_hook sqlite3_api->rollback_hook
|
|
||||||
#define sqlite3_set_authorizer sqlite3_api->set_authorizer
|
|
||||||
#define sqlite3_set_auxdata sqlite3_api->set_auxdata
|
|
||||||
#define sqlite3_snprintf sqlite3_api->xsnprintf
|
|
||||||
#define sqlite3_step sqlite3_api->step
|
|
||||||
#define sqlite3_table_column_metadata sqlite3_api->table_column_metadata
|
|
||||||
#define sqlite3_thread_cleanup sqlite3_api->thread_cleanup
|
|
||||||
#define sqlite3_total_changes sqlite3_api->total_changes
|
|
||||||
#define sqlite3_trace sqlite3_api->trace
|
|
||||||
#ifndef SQLITE_OMIT_DEPRECATED
|
|
||||||
#define sqlite3_transfer_bindings sqlite3_api->transfer_bindings
|
|
||||||
#endif
|
|
||||||
#define sqlite3_update_hook sqlite3_api->update_hook
|
|
||||||
#define sqlite3_user_data sqlite3_api->user_data
|
|
||||||
#define sqlite3_value_blob sqlite3_api->value_blob
|
|
||||||
#define sqlite3_value_bytes sqlite3_api->value_bytes
|
|
||||||
#define sqlite3_value_bytes16 sqlite3_api->value_bytes16
|
|
||||||
#define sqlite3_value_double sqlite3_api->value_double
|
|
||||||
#define sqlite3_value_int sqlite3_api->value_int
|
|
||||||
#define sqlite3_value_int64 sqlite3_api->value_int64
|
|
||||||
#define sqlite3_value_numeric_type sqlite3_api->value_numeric_type
|
|
||||||
#define sqlite3_value_text sqlite3_api->value_text
|
|
||||||
#define sqlite3_value_text16 sqlite3_api->value_text16
|
|
||||||
#define sqlite3_value_text16be sqlite3_api->value_text16be
|
|
||||||
#define sqlite3_value_text16le sqlite3_api->value_text16le
|
|
||||||
#define sqlite3_value_type sqlite3_api->value_type
|
|
||||||
#define sqlite3_vmprintf sqlite3_api->vmprintf
|
|
||||||
#define sqlite3_vsnprintf sqlite3_api->xvsnprintf
|
|
||||||
#define sqlite3_overload_function sqlite3_api->overload_function
|
|
||||||
#define sqlite3_prepare_v2 sqlite3_api->prepare_v2
|
|
||||||
#define sqlite3_prepare16_v2 sqlite3_api->prepare16_v2
|
|
||||||
#define sqlite3_clear_bindings sqlite3_api->clear_bindings
|
|
||||||
#define sqlite3_bind_zeroblob sqlite3_api->bind_zeroblob
|
|
||||||
#define sqlite3_blob_bytes sqlite3_api->blob_bytes
|
|
||||||
#define sqlite3_blob_close sqlite3_api->blob_close
|
|
||||||
#define sqlite3_blob_open sqlite3_api->blob_open
|
|
||||||
#define sqlite3_blob_read sqlite3_api->blob_read
|
|
||||||
#define sqlite3_blob_write sqlite3_api->blob_write
|
|
||||||
#define sqlite3_create_collation_v2 sqlite3_api->create_collation_v2
|
|
||||||
#define sqlite3_file_control sqlite3_api->file_control
|
|
||||||
#define sqlite3_memory_highwater sqlite3_api->memory_highwater
|
|
||||||
#define sqlite3_memory_used sqlite3_api->memory_used
|
|
||||||
#define sqlite3_mutex_alloc sqlite3_api->mutex_alloc
|
|
||||||
#define sqlite3_mutex_enter sqlite3_api->mutex_enter
|
|
||||||
#define sqlite3_mutex_free sqlite3_api->mutex_free
|
|
||||||
#define sqlite3_mutex_leave sqlite3_api->mutex_leave
|
|
||||||
#define sqlite3_mutex_try sqlite3_api->mutex_try
|
|
||||||
#define sqlite3_open_v2 sqlite3_api->open_v2
|
|
||||||
#define sqlite3_release_memory sqlite3_api->release_memory
|
|
||||||
#define sqlite3_result_error_nomem sqlite3_api->result_error_nomem
|
|
||||||
#define sqlite3_result_error_toobig sqlite3_api->result_error_toobig
|
|
||||||
#define sqlite3_sleep sqlite3_api->sleep
|
|
||||||
#define sqlite3_soft_heap_limit sqlite3_api->soft_heap_limit
|
|
||||||
#define sqlite3_vfs_find sqlite3_api->vfs_find
|
|
||||||
#define sqlite3_vfs_register sqlite3_api->vfs_register
|
|
||||||
#define sqlite3_vfs_unregister sqlite3_api->vfs_unregister
|
|
||||||
#define sqlite3_threadsafe sqlite3_api->xthreadsafe
|
|
||||||
#define sqlite3_result_zeroblob sqlite3_api->result_zeroblob
|
|
||||||
#define sqlite3_result_error_code sqlite3_api->result_error_code
|
|
||||||
#define sqlite3_test_control sqlite3_api->test_control
|
|
||||||
#define sqlite3_randomness sqlite3_api->randomness
|
|
||||||
#define sqlite3_context_db_handle sqlite3_api->context_db_handle
|
|
||||||
#define sqlite3_extended_result_codes sqlite3_api->extended_result_codes
|
|
||||||
#define sqlite3_limit sqlite3_api->limit
|
|
||||||
#define sqlite3_next_stmt sqlite3_api->next_stmt
|
|
||||||
#define sqlite3_sql sqlite3_api->sql
|
|
||||||
#define sqlite3_status sqlite3_api->status
|
|
||||||
#define sqlite3_backup_finish sqlite3_api->backup_finish
|
|
||||||
#define sqlite3_backup_init sqlite3_api->backup_init
|
|
||||||
#define sqlite3_backup_pagecount sqlite3_api->backup_pagecount
|
|
||||||
#define sqlite3_backup_remaining sqlite3_api->backup_remaining
|
|
||||||
#define sqlite3_backup_step sqlite3_api->backup_step
|
|
||||||
#define sqlite3_compileoption_get sqlite3_api->compileoption_get
|
|
||||||
#define sqlite3_compileoption_used sqlite3_api->compileoption_used
|
|
||||||
#define sqlite3_create_function_v2 sqlite3_api->create_function_v2
|
|
||||||
#define sqlite3_db_config sqlite3_api->db_config
|
|
||||||
#define sqlite3_db_mutex sqlite3_api->db_mutex
|
|
||||||
#define sqlite3_db_status sqlite3_api->db_status
|
|
||||||
#define sqlite3_extended_errcode sqlite3_api->extended_errcode
|
|
||||||
#define sqlite3_log sqlite3_api->log
|
|
||||||
#define sqlite3_soft_heap_limit64 sqlite3_api->soft_heap_limit64
|
|
||||||
#define sqlite3_sourceid sqlite3_api->sourceid
|
|
||||||
#define sqlite3_stmt_status sqlite3_api->stmt_status
|
|
||||||
#define sqlite3_strnicmp sqlite3_api->strnicmp
|
|
||||||
#define sqlite3_unlock_notify sqlite3_api->unlock_notify
|
|
||||||
#define sqlite3_wal_autocheckpoint sqlite3_api->wal_autocheckpoint
|
|
||||||
#define sqlite3_wal_checkpoint sqlite3_api->wal_checkpoint
|
|
||||||
#define sqlite3_wal_hook sqlite3_api->wal_hook
|
|
||||||
#define sqlite3_blob_reopen sqlite3_api->blob_reopen
|
|
||||||
#define sqlite3_vtab_config sqlite3_api->vtab_config
|
|
||||||
#define sqlite3_vtab_on_conflict sqlite3_api->vtab_on_conflict
|
|
||||||
/* Version 3.7.16 and later */
|
|
||||||
#define sqlite3_close_v2 sqlite3_api->close_v2
|
|
||||||
#define sqlite3_db_filename sqlite3_api->db_filename
|
|
||||||
#define sqlite3_db_readonly sqlite3_api->db_readonly
|
|
||||||
#define sqlite3_db_release_memory sqlite3_api->db_release_memory
|
|
||||||
#define sqlite3_errstr sqlite3_api->errstr
|
|
||||||
#define sqlite3_stmt_busy sqlite3_api->stmt_busy
|
|
||||||
#define sqlite3_stmt_readonly sqlite3_api->stmt_readonly
|
|
||||||
#define sqlite3_stricmp sqlite3_api->stricmp
|
|
||||||
#define sqlite3_uri_boolean sqlite3_api->uri_boolean
|
|
||||||
#define sqlite3_uri_int64 sqlite3_api->uri_int64
|
|
||||||
#define sqlite3_uri_parameter sqlite3_api->uri_parameter
|
|
||||||
#define sqlite3_uri_vsnprintf sqlite3_api->xvsnprintf
|
|
||||||
#define sqlite3_wal_checkpoint_v2 sqlite3_api->wal_checkpoint_v2
|
|
||||||
/* Version 3.8.7 and later */
|
|
||||||
#define sqlite3_auto_extension sqlite3_api->auto_extension
|
|
||||||
#define sqlite3_bind_blob64 sqlite3_api->bind_blob64
|
|
||||||
#define sqlite3_bind_text64 sqlite3_api->bind_text64
|
|
||||||
#define sqlite3_cancel_auto_extension sqlite3_api->cancel_auto_extension
|
|
||||||
#define sqlite3_load_extension sqlite3_api->load_extension
|
|
||||||
#define sqlite3_malloc64 sqlite3_api->malloc64
|
|
||||||
#define sqlite3_msize sqlite3_api->msize
|
|
||||||
#define sqlite3_realloc64 sqlite3_api->realloc64
|
|
||||||
#define sqlite3_reset_auto_extension sqlite3_api->reset_auto_extension
|
|
||||||
#define sqlite3_result_blob64 sqlite3_api->result_blob64
|
|
||||||
#define sqlite3_result_text64 sqlite3_api->result_text64
|
|
||||||
#define sqlite3_strglob sqlite3_api->strglob
|
|
||||||
/* Version 3.8.11 and later */
|
|
||||||
#define sqlite3_value_dup sqlite3_api->value_dup
|
|
||||||
#define sqlite3_value_free sqlite3_api->value_free
|
|
||||||
#define sqlite3_result_zeroblob64 sqlite3_api->result_zeroblob64
|
|
||||||
#define sqlite3_bind_zeroblob64 sqlite3_api->bind_zeroblob64
|
|
||||||
/* Version 3.9.0 and later */
|
|
||||||
#define sqlite3_value_subtype sqlite3_api->value_subtype
|
|
||||||
#define sqlite3_result_subtype sqlite3_api->result_subtype
|
|
||||||
/* Version 3.10.0 and later */
|
|
||||||
#define sqlite3_status64 sqlite3_api->status64
|
|
||||||
#define sqlite3_strlike sqlite3_api->strlike
|
|
||||||
#define sqlite3_db_cacheflush sqlite3_api->db_cacheflush
|
|
||||||
/* Version 3.12.0 and later */
|
|
||||||
#define sqlite3_system_errno sqlite3_api->system_errno
|
|
||||||
/* Version 3.14.0 and later */
|
|
||||||
#define sqlite3_trace_v2 sqlite3_api->trace_v2
|
|
||||||
#define sqlite3_expanded_sql sqlite3_api->expanded_sql
|
|
||||||
/* Version 3.18.0 and later */
|
|
||||||
#define sqlite3_set_last_insert_rowid sqlite3_api->set_last_insert_rowid
|
|
||||||
/* Version 3.20.0 and later */
|
|
||||||
#define sqlite3_prepare_v3 sqlite3_api->prepare_v3
|
|
||||||
#define sqlite3_prepare16_v3 sqlite3_api->prepare16_v3
|
|
||||||
#define sqlite3_bind_pointer sqlite3_api->bind_pointer
|
|
||||||
#define sqlite3_result_pointer sqlite3_api->result_pointer
|
|
||||||
#define sqlite3_value_pointer sqlite3_api->value_pointer
|
|
||||||
/* Version 3.22.0 and later */
|
|
||||||
#define sqlite3_vtab_nochange sqlite3_api->vtab_nochange
|
|
||||||
#define sqlite3_value_nochange sqlite3_api->value_nochange
|
|
||||||
#define sqlite3_vtab_collation sqlite3_api->vtab_collation
|
|
||||||
/* Version 3.24.0 and later */
|
|
||||||
#define sqlite3_keyword_count sqlite3_api->keyword_count
|
|
||||||
#define sqlite3_keyword_name sqlite3_api->keyword_name
|
|
||||||
#define sqlite3_keyword_check sqlite3_api->keyword_check
|
|
||||||
#define sqlite3_str_new sqlite3_api->str_new
|
|
||||||
#define sqlite3_str_finish sqlite3_api->str_finish
|
|
||||||
#define sqlite3_str_appendf sqlite3_api->str_appendf
|
|
||||||
#define sqlite3_str_vappendf sqlite3_api->str_vappendf
|
|
||||||
#define sqlite3_str_append sqlite3_api->str_append
|
|
||||||
#define sqlite3_str_appendall sqlite3_api->str_appendall
|
|
||||||
#define sqlite3_str_appendchar sqlite3_api->str_appendchar
|
|
||||||
#define sqlite3_str_reset sqlite3_api->str_reset
|
|
||||||
#define sqlite3_str_errcode sqlite3_api->str_errcode
|
|
||||||
#define sqlite3_str_length sqlite3_api->str_length
|
|
||||||
#define sqlite3_str_value sqlite3_api->str_value
|
|
||||||
/* Version 3.25.0 and later */
|
|
||||||
#define sqlite3_create_window_function sqlite3_api->create_window_function
|
|
||||||
#endif /* !defined(SQLITE_CORE) && !defined(SQLITE_OMIT_LOAD_EXTENSION) */
|
|
||||||
|
|
||||||
#if !defined(SQLITE_CORE) && !defined(SQLITE_OMIT_LOAD_EXTENSION)
|
|
||||||
/* This case when the file really is being compiled as a loadable
|
|
||||||
** extension */
|
|
||||||
# define SQLITE_EXTENSION_INIT1 const sqlite3_api_routines *sqlite3_api=0;
|
|
||||||
# define SQLITE_EXTENSION_INIT2(v) sqlite3_api=v;
|
|
||||||
# define SQLITE_EXTENSION_INIT3 \
|
|
||||||
extern const sqlite3_api_routines *sqlite3_api;
|
|
||||||
#else
|
|
||||||
/* This case when the file is being statically linked into the
|
|
||||||
** application */
|
|
||||||
# define SQLITE_EXTENSION_INIT1 /*no-op*/
|
|
||||||
# define SQLITE_EXTENSION_INIT2(v) (void)v; /* unused parameter */
|
|
||||||
# define SQLITE_EXTENSION_INIT3 /*no-op*/
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* SQLITE3EXT_H */
|
|
||||||
@@ -3179,7 +3179,7 @@ TEST_F(MaatCmdTest, HitPath)
|
|||||||
EXPECT_EQ(hit_path[path_idx].region_id, region1.region_id);
|
EXPECT_EQ(hit_path[path_idx].region_id, region1.region_id);
|
||||||
EXPECT_EQ(hit_path[path_idx].sub_group_id, group1.group_id);
|
EXPECT_EQ(hit_path[path_idx].sub_group_id, group1.group_id);
|
||||||
EXPECT_EQ(hit_path[path_idx].top_group_id, group1.group_id);
|
EXPECT_EQ(hit_path[path_idx].top_group_id, group1.group_id);
|
||||||
EXPECT_EQ(hit_path[path_idx].virtual_table_id, table_id);
|
EXPECT_EQ(hit_path[path_idx].vt_id, table_id);
|
||||||
EXPECT_EQ(hit_path[path_idx].compile_id, -1);
|
EXPECT_EQ(hit_path[path_idx].compile_id, -1);
|
||||||
|
|
||||||
|
|
||||||
@@ -3211,7 +3211,7 @@ TEST_F(MaatCmdTest, HitPath)
|
|||||||
EXPECT_EQ(hit_path[path_idx].region_id, region2.region_id);
|
EXPECT_EQ(hit_path[path_idx].region_id, region2.region_id);
|
||||||
EXPECT_EQ(hit_path[path_idx].sub_group_id, group2.group_id);
|
EXPECT_EQ(hit_path[path_idx].sub_group_id, group2.group_id);
|
||||||
EXPECT_EQ(hit_path[path_idx].top_group_id, group21.group_id);
|
EXPECT_EQ(hit_path[path_idx].top_group_id, group21.group_id);
|
||||||
EXPECT_EQ(hit_path[path_idx].virtual_table_id, table_id);
|
EXPECT_EQ(hit_path[path_idx].vt_id, table_id);
|
||||||
EXPECT_EQ(hit_path[path_idx].compile_id, compile1.config_id);
|
EXPECT_EQ(hit_path[path_idx].compile_id, compile1.config_id);
|
||||||
|
|
||||||
const char* keywords1="In graph theory, a path in a graph is a finite or infinite \
|
const char* keywords1="In graph theory, a path in a graph is a finite or infinite \
|
||||||
@@ -3235,7 +3235,7 @@ that the edges be all directed in the same direction.";
|
|||||||
EXPECT_EQ(hit_path[path_idx].region_id, region4.region_id);
|
EXPECT_EQ(hit_path[path_idx].region_id, region4.region_id);
|
||||||
EXPECT_EQ(hit_path[path_idx].sub_group_id, group4.group_id);
|
EXPECT_EQ(hit_path[path_idx].sub_group_id, group4.group_id);
|
||||||
EXPECT_EQ(hit_path[path_idx].top_group_id, group4.group_id);
|
EXPECT_EQ(hit_path[path_idx].top_group_id, group4.group_id);
|
||||||
EXPECT_EQ(hit_path[path_idx].virtual_table_id, 0);
|
EXPECT_EQ(hit_path[path_idx].vt_id, 0);
|
||||||
EXPECT_EQ(hit_path[path_idx].compile_id, -1);
|
EXPECT_EQ(hit_path[path_idx].compile_id, -1);
|
||||||
|
|
||||||
table_id=Maat_table_register(feather, table_ip);
|
table_id=Maat_table_register(feather, table_ip);
|
||||||
@@ -3253,7 +3253,7 @@ that the edges be all directed in the same direction.";
|
|||||||
EXPECT_EQ(hit_path[path_idx].region_id, region3.region_id);
|
EXPECT_EQ(hit_path[path_idx].region_id, region3.region_id);
|
||||||
EXPECT_EQ(hit_path[path_idx].sub_group_id, group3.group_id);
|
EXPECT_EQ(hit_path[path_idx].sub_group_id, group3.group_id);
|
||||||
EXPECT_EQ(hit_path[path_idx].top_group_id, group3.group_id);
|
EXPECT_EQ(hit_path[path_idx].top_group_id, group3.group_id);
|
||||||
EXPECT_EQ(hit_path[path_idx].virtual_table_id, 0);
|
EXPECT_EQ(hit_path[path_idx].vt_id, 0);
|
||||||
EXPECT_EQ(hit_path[path_idx].compile_id, -1);
|
EXPECT_EQ(hit_path[path_idx].compile_id, -1);
|
||||||
|
|
||||||
Nth_scan++;
|
Nth_scan++;
|
||||||
@@ -3267,7 +3267,7 @@ that the edges be all directed in the same direction.";
|
|||||||
EXPECT_EQ(hit_path[path_idx].region_id, region4.region_id);
|
EXPECT_EQ(hit_path[path_idx].region_id, region4.region_id);
|
||||||
EXPECT_EQ(hit_path[path_idx].sub_group_id, group4.group_id);
|
EXPECT_EQ(hit_path[path_idx].sub_group_id, group4.group_id);
|
||||||
EXPECT_EQ(hit_path[path_idx].top_group_id, group4.group_id);
|
EXPECT_EQ(hit_path[path_idx].top_group_id, group4.group_id);
|
||||||
EXPECT_EQ(hit_path[path_idx].virtual_table_id, 0);
|
EXPECT_EQ(hit_path[path_idx].vt_id, 0);
|
||||||
EXPECT_EQ(hit_path[path_idx].compile_id, -1);
|
EXPECT_EQ(hit_path[path_idx].compile_id, -1);
|
||||||
Maat_stream_scan_string_end(&stream_para);
|
Maat_stream_scan_string_end(&stream_para);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user