1、增加Maat_command_raw_set_xx系列函数,可以操作sub-group、分组复用,增加sub-group增删的测试用例。 2、fix #13。
This commit is contained in:
@@ -10,7 +10,11 @@ enum MAAT_OPERATION
|
|||||||
MAAT_OP_ADD,
|
MAAT_OP_ADD,
|
||||||
MAAT_OP_RENEW_TIMEOUT //Rule expire time is changed to now+cmd->expire_after
|
MAAT_OP_RENEW_TIMEOUT //Rule expire time is changed to now+cmd->expire_after
|
||||||
};
|
};
|
||||||
|
enum MAAT_GROUP_RELATION
|
||||||
|
{
|
||||||
|
PARENT_TYPE_COMPILE=0,
|
||||||
|
PARENT_TYPE_GROUP
|
||||||
|
};
|
||||||
enum MAAT_REGION_TYPE
|
enum MAAT_REGION_TYPE
|
||||||
{
|
{
|
||||||
REGION_EXPR,
|
REGION_EXPR,
|
||||||
@@ -104,8 +108,12 @@ struct Maat_region_t
|
|||||||
};
|
};
|
||||||
struct Maat_group_t
|
struct Maat_group_t
|
||||||
{
|
{
|
||||||
int region_num;
|
const char* table_name;
|
||||||
int group_id; //If MAAT_OPT_CMD_AUTO_NUMBERING==1, maat will assigned one. Or users must assign a unique number.
|
int group_id; //If MAAT_OPT_CMD_AUTO_NUMBERING==1, maat will assigned one. Or users must assign a unique number.
|
||||||
|
int parent_id;
|
||||||
|
int not_flag;
|
||||||
|
enum MAAT_GROUP_RELATION parent_type;
|
||||||
|
int region_num;
|
||||||
struct Maat_region_t *regions;
|
struct Maat_region_t *regions;
|
||||||
};
|
};
|
||||||
struct Maat_cmd_t
|
struct Maat_cmd_t
|
||||||
@@ -170,5 +178,14 @@ void Maat_cmd_key_free(struct Maat_cmd_key**keys, int number);
|
|||||||
int Maat_cmd_key_select(Maat_feather_t feather, int label_id, struct Maat_cmd_key** keys);
|
int Maat_cmd_key_select(Maat_feather_t feather, int label_id, struct Maat_cmd_key** keys);
|
||||||
int Maat_cmd_select(Maat_feather_t feather, int label_id, int * output_ids, unsigned int size);
|
int Maat_cmd_select(Maat_feather_t feather, int label_id, int * output_ids, unsigned int size);
|
||||||
int Maat_cmd_flushDB(Maat_feather_t feather);
|
int Maat_cmd_flushDB(Maat_feather_t feather);
|
||||||
|
|
||||||
|
int Maat_command_raw_set_compile(Maat_feather_t feather, enum MAAT_OPERATION op, const struct Maat_rule_t* compile, const char* table_name, const char * huge_service_defined, int group_num);
|
||||||
|
int Maat_command_raw_set_region(Maat_feather_t feather, enum MAAT_OPERATION op, const struct Maat_region_t* region, int group_id);
|
||||||
|
int Maat_command_raw_set_group(Maat_feather_t feather, enum MAAT_OPERATION op, const struct Maat_group_t* group);
|
||||||
|
|
||||||
|
int Maat_cmd_get_new_group_id(Maat_feather_t feather);
|
||||||
|
int Maat_cmd_get_new_region_id(Maat_feather_t feather);
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|||||||
@@ -181,7 +181,7 @@ int region_compile(_Maat_feather_t*feather,struct _INNER_scan_status_t *_mid,int
|
|||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if(group_rule->compile_shortcut!=NULL&&group_rule->parent_ref_cnt==1&&shortcut_avilable_cnt<MAX_SCANNER_HIT_NUM)
|
if(group_rule->compile_shortcut!=NULL&&group_rule->ref_by_parent_cnt==1&&shortcut_avilable_cnt<MAX_SCANNER_HIT_NUM)
|
||||||
{
|
{
|
||||||
relation_arrary[shortcut_avilable_cnt]=(struct Maat_compile_group_relation*)(group_rule->compile_shortcut);
|
relation_arrary[shortcut_avilable_cnt]=(struct Maat_compile_group_relation*)(group_rule->compile_shortcut);
|
||||||
shortcut_avilable_cnt++;
|
shortcut_avilable_cnt++;
|
||||||
@@ -662,12 +662,12 @@ int Maat_set_feather_opt(Maat_feather_t feather,enum MAAT_INIT_OPT type,const vo
|
|||||||
break;
|
break;
|
||||||
case MAAT_OPT_JSON_FILE_PATH:
|
case MAAT_OPT_JSON_FILE_PATH:
|
||||||
assert(_feather->input_mode==SOURCE_NONE);
|
assert(_feather->input_mode==SOURCE_NONE);
|
||||||
ret=json2iris((const char*)value
|
ret=json2iris((const char*)value,
|
||||||
,_feather->compile_tn,_feather->group_tn
|
_feather->compile_tn,_feather->group_tn,
|
||||||
,NULL
|
NULL,
|
||||||
,_feather->json_ctx.iris_file
|
_feather->json_ctx.iris_file,
|
||||||
,sizeof(_feather->json_ctx.iris_file)
|
sizeof(_feather->json_ctx.iris_file),
|
||||||
,_feather->logger);
|
_feather->logger);
|
||||||
if(ret<0)
|
if(ret<0)
|
||||||
{
|
{
|
||||||
return -1;
|
return -1;
|
||||||
|
|||||||
@@ -242,13 +242,39 @@ int invalidate_line(char* line, enum MAAT_TABLE_TYPE type,int valid_column_seq)
|
|||||||
line[i]='0';
|
line[i]='0';
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
void serialize_region(const struct Maat_region_t* p,int group_id, char* buff,int size)
|
void serialize_group(const struct Maat_group_t* p_group, enum MAAT_OPERATION op, char* buff, size_t sz)
|
||||||
{
|
{
|
||||||
UNUSED int ret=0;
|
if(op==MAAT_OP_RENEW_TIMEOUT) op=MAAT_OP_ADD;
|
||||||
|
snprintf(buff, sz, "%d\t%d\t%d\t%d\t%d", p_group->group_id,
|
||||||
|
p_group->parent_id,
|
||||||
|
op,
|
||||||
|
p_group->not_flag,
|
||||||
|
p_group->parent_type);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
void serialize_compile(const struct Maat_rule_t* p_m_rule, const char* huge_service_defined, int group_num, enum MAAT_OPERATION op, char* buff, size_t sz)
|
||||||
|
{
|
||||||
|
if(op==MAAT_OP_RENEW_TIMEOUT) op=MAAT_OP_ADD;
|
||||||
|
const char* service_define=huge_service_defined?huge_service_defined:(strlen(p_m_rule->service_defined)?p_m_rule->service_defined:"null");
|
||||||
|
|
||||||
|
snprintf(buff, sz,"%d\t%d\t%hhd\t%hhd\t%hhd\t0\t%s\t%d\t%d",
|
||||||
|
p_m_rule->config_id,
|
||||||
|
p_m_rule->service_id,
|
||||||
|
p_m_rule->action,
|
||||||
|
p_m_rule->do_blacklist,
|
||||||
|
p_m_rule->do_log,
|
||||||
|
service_define,
|
||||||
|
op,
|
||||||
|
group_num);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
void serialize_region(const struct Maat_region_t* p, int group_id, char* buff, size_t sz)
|
||||||
|
{
|
||||||
|
UNUSED size_t ret=0;
|
||||||
switch(p->region_type)
|
switch(p->region_type)
|
||||||
{
|
{
|
||||||
case REGION_IP:
|
case REGION_IP:
|
||||||
ret=snprintf(buff,size,"%d\t%d\t%d\t%s\t%s\t%hu\t%hu\t%s\t%s\t%hu\t%hu\t%d\t%d\t1"
|
ret=snprintf(buff,sz,"%d\t%d\t%d\t%s\t%s\t%hu\t%hu\t%s\t%s\t%hu\t%hu\t%d\t%d\t1"
|
||||||
,p->region_id
|
,p->region_id
|
||||||
,group_id
|
,group_id
|
||||||
,p->ip_rule.addr_type
|
,p->ip_rule.addr_type
|
||||||
@@ -266,7 +292,7 @@ void serialize_region(const struct Maat_region_t* p,int group_id, char* buff,int
|
|||||||
case REGION_EXPR:
|
case REGION_EXPR:
|
||||||
if(p->expr_rule.district==NULL)
|
if(p->expr_rule.district==NULL)
|
||||||
{
|
{
|
||||||
ret=snprintf(buff,size,"%d\t%d\t%s\t%d\t%d\t%d\t1"
|
ret=snprintf(buff,sz,"%d\t%d\t%s\t%d\t%d\t%d\t1"
|
||||||
,p->region_id
|
,p->region_id
|
||||||
,group_id
|
,group_id
|
||||||
,p->expr_rule.keywords
|
,p->expr_rule.keywords
|
||||||
@@ -276,7 +302,7 @@ void serialize_region(const struct Maat_region_t* p,int group_id, char* buff,int
|
|||||||
}
|
}
|
||||||
else //expr_plus
|
else //expr_plus
|
||||||
{
|
{
|
||||||
ret=snprintf(buff,size,"%d\t%d\t%s\t%s\t%d\t%d\t%d\t1"
|
ret=snprintf(buff,sz,"%d\t%d\t%s\t%s\t%d\t%d\t%d\t1"
|
||||||
,p->region_id
|
,p->region_id
|
||||||
,group_id
|
,group_id
|
||||||
,p->expr_rule.keywords
|
,p->expr_rule.keywords
|
||||||
@@ -287,14 +313,14 @@ void serialize_region(const struct Maat_region_t* p,int group_id, char* buff,int
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case REGION_INTERVAL:
|
case REGION_INTERVAL:
|
||||||
ret=snprintf(buff,size,"%d\t%d\t%u\t%u\t1"
|
ret=snprintf(buff,sz,"%d\t%d\t%u\t%u\t1"
|
||||||
,p->region_id
|
,p->region_id
|
||||||
,group_id
|
,group_id
|
||||||
,p->interval_rule.low_boundary
|
,p->interval_rule.low_boundary
|
||||||
,p->interval_rule.up_boundary);
|
,p->interval_rule.up_boundary);
|
||||||
break;
|
break;
|
||||||
case REGION_DIGEST:
|
case REGION_DIGEST:
|
||||||
ret=snprintf(buff,size,"%d\t%d\t%llu\t%s\t%hd\t1"
|
ret=snprintf(buff,sz,"%d\t%d\t%llu\t%s\t%hd\t1"
|
||||||
,p->region_id
|
,p->region_id
|
||||||
,group_id
|
,group_id
|
||||||
,p->digest_rule.orgin_len
|
,p->digest_rule.orgin_len
|
||||||
@@ -302,7 +328,7 @@ void serialize_region(const struct Maat_region_t* p,int group_id, char* buff,int
|
|||||||
,p->digest_rule.confidence_degree);
|
,p->digest_rule.confidence_degree);
|
||||||
break;
|
break;
|
||||||
case REGION_SIMILARITY:
|
case REGION_SIMILARITY:
|
||||||
ret=snprintf(buff,size,"%d\t%d\t%s\t%hd\t1"
|
ret=snprintf(buff,sz,"%d\t%d\t%s\t%hd\t1"
|
||||||
,p->region_id
|
,p->region_id
|
||||||
,group_id
|
,group_id
|
||||||
,p->similarity_rule.target
|
,p->similarity_rule.target
|
||||||
@@ -311,7 +337,7 @@ void serialize_region(const struct Maat_region_t* p,int group_id, char* buff,int
|
|||||||
default:
|
default:
|
||||||
assert(0);
|
assert(0);
|
||||||
}
|
}
|
||||||
assert(ret<size);
|
assert(ret<sz);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
void empty_serial_rules(struct serial_rule_t* rule)
|
void empty_serial_rules(struct serial_rule_t* rule)
|
||||||
@@ -334,13 +360,13 @@ void empty_serial_rules(struct serial_rule_t* rule)
|
|||||||
}
|
}
|
||||||
void set_serial_rule(struct serial_rule_t* rule, enum MAAT_OPERATION op,int rule_id,int label_id,const char* table_name,const char* line, long long timeout)
|
void set_serial_rule(struct serial_rule_t* rule, enum MAAT_OPERATION op,int rule_id,int label_id,const char* table_name,const char* line, long long timeout)
|
||||||
{
|
{
|
||||||
|
memset(rule, 0, sizeof(struct serial_rule_t));
|
||||||
rule->op=op;
|
rule->op=op;
|
||||||
rule->rule_id=rule_id;
|
rule->rule_id=rule_id;
|
||||||
rule->label_id=label_id;
|
rule->label_id=label_id;
|
||||||
rule->timeout=timeout;
|
rule->timeout=timeout;
|
||||||
assert(strlen(table_name)<sizeof(rule->table_name));
|
assert(strlen(table_name)<sizeof(rule->table_name));
|
||||||
memset(rule->table_name, 0, sizeof(rule->table_name));
|
strncpy(rule->table_name, table_name, sizeof(rule->table_name));
|
||||||
memcpy(rule->table_name,table_name,strlen(table_name));
|
|
||||||
if(line!=NULL)
|
if(line!=NULL)
|
||||||
{
|
{
|
||||||
rule->table_line=_maat_strdup(line);
|
rule->table_line=_maat_strdup(line);
|
||||||
@@ -875,7 +901,7 @@ int reconstruct_cmd(struct _Maat_feather_t *feather, struct _Maat_cmd_inner_t* _
|
|||||||
group_cmd=&(cmd->groups[grp_idx]);
|
group_cmd=&(cmd->groups[grp_idx]);
|
||||||
group_cmd->group_id=group_inner->group_id;
|
group_cmd->group_id=group_inner->group_id;
|
||||||
|
|
||||||
if(group_inner->parent_ref_cnt>1)
|
if(group_inner->ref_by_parent_cnt>1)
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@@ -918,15 +944,8 @@ int build_serial_rule(_Maat_feather_t *feather,struct _Maat_cmd_inner_t* _cmd,st
|
|||||||
}
|
}
|
||||||
if(op==MAAT_OP_ADD)
|
if(op==MAAT_OP_ADD)
|
||||||
{
|
{
|
||||||
snprintf(line,sizeof(line),"%d\t%d\t%hhd\t%hhd\t%hhd\t0\t%s\t1\t%d",p_m_rule->config_id
|
serialize_compile(p_m_rule, _cmd->huge_service_defined, cmd->group_num, MAAT_OP_ADD, line, sizeof(line));
|
||||||
,p_m_rule->service_id
|
|
||||||
,p_m_rule->action
|
|
||||||
,p_m_rule->do_blacklist
|
|
||||||
,p_m_rule->do_log
|
|
||||||
,(_cmd->huge_service_defined!=NULL)?(_cmd->huge_service_defined):(p_m_rule->service_defined)
|
|
||||||
,cmd->group_num);
|
|
||||||
set_serial_rule(list+rule_num, MAAT_OP_ADD, cmd->compile.config_id, cmd->label_id, feather->compile_tn, line, timeout);
|
set_serial_rule(list+rule_num, MAAT_OP_ADD, cmd->compile.config_id, cmd->label_id, feather->compile_tn, line, timeout);
|
||||||
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -943,8 +962,9 @@ int build_serial_rule(_Maat_feather_t *feather,struct _Maat_cmd_inner_t* _cmd,st
|
|||||||
p_group->group_id=feather->base_grp_seq;
|
p_group->group_id=feather->base_grp_seq;
|
||||||
feather->base_grp_seq++;
|
feather->base_grp_seq++;
|
||||||
}
|
}
|
||||||
snprintf(line,sizeof(line),"%d\t%d\t1",p_group->group_id
|
p_group->parent_id=p_m_rule->config_id;
|
||||||
,p_m_rule->config_id);
|
p_group->parent_type=PARENT_TYPE_COMPILE;
|
||||||
|
serialize_group(p_group, MAAT_OP_ADD, line, sizeof(line));
|
||||||
set_serial_rule(list+rule_num, MAAT_OP_ADD, p_group->group_id, 0, feather->group_tn, line, timeout);
|
set_serial_rule(list+rule_num, MAAT_OP_ADD, p_group->group_id, 0, feather->group_tn, line, timeout);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -2374,7 +2394,7 @@ int Maat_cmd_commit(Maat_feather_t feather)
|
|||||||
_feather->server_time=redis_server_time(write_ctx);
|
_feather->server_time=redis_server_time(write_ctx);
|
||||||
|
|
||||||
if(_feather->AUTO_NUMBERING_ON==1)
|
if(_feather->AUTO_NUMBERING_ON==1)
|
||||||
{
|
{
|
||||||
data_reply=_wrap_redisCommand(write_ctx,"INCRBY %s %d", mr_region_id_var, new_region_num);
|
data_reply=_wrap_redisCommand(write_ctx,"INCRBY %s %d", mr_region_id_var, new_region_num);
|
||||||
if(data_reply->type!=REDIS_REPLY_INTEGER)
|
if(data_reply->type!=REDIS_REPLY_INTEGER)
|
||||||
{
|
{
|
||||||
@@ -2384,7 +2404,7 @@ int Maat_cmd_commit(Maat_feather_t feather)
|
|||||||
}
|
}
|
||||||
_feather->base_rgn_seq=data_reply->integer-new_region_num;
|
_feather->base_rgn_seq=data_reply->integer-new_region_num;
|
||||||
freeReplyObject(data_reply);
|
freeReplyObject(data_reply);
|
||||||
|
|
||||||
data_reply=_wrap_redisCommand(write_ctx,"INCRBY %s %d", mr_group_id_var, new_group_num);
|
data_reply=_wrap_redisCommand(write_ctx,"INCRBY %s %d", mr_group_id_var, new_group_num);
|
||||||
if(data_reply->type!=REDIS_REPLY_INTEGER)
|
if(data_reply->type!=REDIS_REPLY_INTEGER)
|
||||||
{
|
{
|
||||||
@@ -2448,6 +2468,19 @@ long long Maat_cmd_incrby(Maat_feather_t feather,const char* key, int increment)
|
|||||||
}
|
}
|
||||||
freeReplyObject(data_reply);
|
freeReplyObject(data_reply);
|
||||||
return result;
|
return result;
|
||||||
|
}
|
||||||
|
int Maat_cmd_get_new_group_id(Maat_feather_t feather)
|
||||||
|
{
|
||||||
|
int group_id=0;
|
||||||
|
group_id=(int) Maat_cmd_incrby(feather, mr_group_id_var, 1);
|
||||||
|
return group_id;
|
||||||
|
}
|
||||||
|
int Maat_cmd_get_new_region_id(Maat_feather_t feather)
|
||||||
|
{
|
||||||
|
int region_id=0;
|
||||||
|
region_id=(int) Maat_cmd_incrby(feather, mr_region_id_var, 1);
|
||||||
|
return region_id;
|
||||||
|
}
|
||||||
|
|
||||||
void Maat_cmd_key_free(struct Maat_cmd_key**keys, int size)
|
void Maat_cmd_key_free(struct Maat_cmd_key**keys, int size)
|
||||||
{
|
{
|
||||||
@@ -2550,9 +2583,9 @@ int redis_flush_DB(redisContext* ctx, int db_index, void* logger)
|
|||||||
redisAppendCommand(ctx,"SET MAAT_VERSION %lld",maat_redis_version);
|
redisAppendCommand(ctx,"SET MAAT_VERSION %lld",maat_redis_version);
|
||||||
append_cmd_cnt++;
|
append_cmd_cnt++;
|
||||||
redisAppendCommand(ctx,"SET MAAT_PRE_VER %lld",maat_redis_version);
|
redisAppendCommand(ctx,"SET MAAT_PRE_VER %lld",maat_redis_version);
|
||||||
append_cmd_cnt++;
|
append_cmd_cnt++;
|
||||||
redisAppendCommand(ctx,"SET %s 1", mr_region_id_var);
|
redisAppendCommand(ctx,"SET %s 1", mr_region_id_var);
|
||||||
append_cmd_cnt++;
|
append_cmd_cnt++;
|
||||||
redisAppendCommand(ctx,"SET %s 1", mr_group_id_var);
|
redisAppendCommand(ctx,"SET %s 1", mr_group_id_var);
|
||||||
append_cmd_cnt++;
|
append_cmd_cnt++;
|
||||||
redisAppendCommand(ctx,"EXEC");
|
redisAppendCommand(ctx,"EXEC");
|
||||||
@@ -2574,6 +2607,41 @@ int redis_flush_DB(redisContext* ctx, int db_index, void* logger)
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
return redis_transaction_success;
|
return redis_transaction_success;
|
||||||
|
}
|
||||||
|
static int _Maat_command_set_one_line(struct _Maat_feather_t* _feather, enum MAAT_OPERATION op, int id, const char* table_name, const char* line)
|
||||||
|
{
|
||||||
|
redisContext* write_ctx=get_redis_ctx_for_write(_feather);
|
||||||
|
_feather->server_time=redis_server_time(write_ctx);
|
||||||
|
struct serial_rule_t s_rule;
|
||||||
|
set_serial_rule(&s_rule, op, id, 0, table_name, line, 0);
|
||||||
|
int transaction_success=0;
|
||||||
|
transaction_success=exec_serial_rule(write_ctx, &s_rule, 1, _feather->server_time, _feather->logger);
|
||||||
|
empty_serial_rules(&s_rule);
|
||||||
|
return transaction_success;
|
||||||
|
}
|
||||||
|
int Maat_command_raw_set_compile(Maat_feather_t feather, enum MAAT_OPERATION op, const struct Maat_rule_t* compile, const char* table_name, const char * huge_service_defined, int group_num)
|
||||||
|
{
|
||||||
|
struct _Maat_feather_t* _feather=(struct _Maat_feather_t*)feather;
|
||||||
|
char line[MAX_TABLE_LINE_SIZE];
|
||||||
|
serialize_compile(compile, huge_service_defined, group_num, op, line, sizeof(line));
|
||||||
|
int ret=_Maat_command_set_one_line(_feather, op, compile->config_id, table_name, line);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
int Maat_command_raw_set_region(Maat_feather_t feather, enum MAAT_OPERATION op, const struct Maat_region_t* region, int group_id)
|
||||||
|
{
|
||||||
|
struct _Maat_feather_t* _feather=(struct _Maat_feather_t*)feather;
|
||||||
|
char line[MAX_TABLE_LINE_SIZE];
|
||||||
|
serialize_region(region, group_id, line, sizeof(line));
|
||||||
|
int ret=_Maat_command_set_one_line(_feather, op, region->region_id, region->table_name, line);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
int Maat_command_raw_set_group(Maat_feather_t feather, enum MAAT_OPERATION op, const struct Maat_group_t* group)
|
||||||
|
{
|
||||||
|
struct _Maat_feather_t* _feather=(struct _Maat_feather_t*)feather;
|
||||||
|
char line[MAX_TABLE_LINE_SIZE];
|
||||||
|
serialize_group(group, op, line, sizeof(line));
|
||||||
|
int ret=_Maat_command_set_one_line(_feather, op, group->group_id*1024*1204+group->parent_id, group->table_name, line);
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
int Maat_cmd_flushDB(Maat_feather_t feather)
|
int Maat_cmd_flushDB(Maat_feather_t feather)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -847,7 +847,7 @@ struct Maat_group_inner* create_group_rule(int group_id, int table_id, struct Ma
|
|||||||
group->group_id=group_id;
|
group->group_id=group_id;
|
||||||
group->region_cnt=0;
|
group->region_cnt=0;
|
||||||
group->region_boundary=0;
|
group->region_boundary=0;
|
||||||
group->parent_ref_cnt=0;
|
group->ref_by_parent_cnt=0;
|
||||||
group->regions=dynamic_array_create(1,8);
|
group->regions=dynamic_array_create(1,8);
|
||||||
group->compile_shortcut=NULL;
|
group->compile_shortcut=NULL;
|
||||||
group->table_id=table_id;
|
group->table_id=table_id;
|
||||||
@@ -868,7 +868,7 @@ void _destroy_group_rule(struct Maat_group_inner* group)
|
|||||||
group->region_cnt=0;
|
group->region_cnt=0;
|
||||||
group->region_boundary=0;
|
group->region_boundary=0;
|
||||||
group->regions=NULL;
|
group->regions=NULL;
|
||||||
group->parent_ref_cnt=0;
|
group->ref_by_parent_cnt=0;
|
||||||
group->group_id=-1;
|
group->group_id=-1;
|
||||||
group->table_id=-1;
|
group->table_id=-1;
|
||||||
free(group->group_name);
|
free(group->group_name);
|
||||||
@@ -879,8 +879,18 @@ void _destroy_group_rule(struct Maat_group_inner* group)
|
|||||||
free(group);
|
free(group);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
size_t print_igraph_vector(igraph_vector_t *v, char* buff, size_t sz) {
|
||||||
|
long int i;
|
||||||
|
int printed=0;
|
||||||
|
for (i=0; i<igraph_vector_size(v); i++) {
|
||||||
|
printed+=snprintf(buff+printed, sz-printed, " %li", (long int) VECTOR(*v)[i]);
|
||||||
|
}
|
||||||
|
return printed;
|
||||||
|
}
|
||||||
|
|
||||||
#define DESTROY_GROUP_BY_REGION 0
|
#define DESTROY_GROUP_BY_REGION 0
|
||||||
#define DESTROY_GROUP_BY_PARENT 1
|
#define DESTROY_GROUP_BY_PARENT 1
|
||||||
|
#define DESTROY_GROUP_BY_CHILD 2
|
||||||
void destroy_group_rule(struct Maat_group_inner* group_rule, int by_whom, struct Maat_scanner_t* scanner)
|
void destroy_group_rule(struct Maat_group_inner* group_rule, int by_whom, struct Maat_scanner_t* scanner)
|
||||||
{
|
{
|
||||||
switch(by_whom)
|
switch(by_whom)
|
||||||
@@ -888,16 +898,32 @@ void destroy_group_rule(struct Maat_group_inner* group_rule, int by_whom, struct
|
|||||||
case DESTROY_GROUP_BY_REGION:
|
case DESTROY_GROUP_BY_REGION:
|
||||||
break;
|
break;
|
||||||
case DESTROY_GROUP_BY_PARENT:
|
case DESTROY_GROUP_BY_PARENT:
|
||||||
group_rule->parent_ref_cnt--;
|
group_rule->ref_by_parent_cnt--;
|
||||||
|
break;
|
||||||
|
case DESTROY_GROUP_BY_CHILD:
|
||||||
|
group_rule->ref_by_children_cnt--;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
assert(0);
|
assert(0);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if(group_rule->parent_ref_cnt==0&&group_rule->region_cnt==0)
|
igraph_vector_t v;
|
||||||
|
char buff[4096];
|
||||||
|
if(group_rule->ref_by_parent_cnt==0&&group_rule->ref_by_children_cnt==0&&group_rule->region_cnt==0)
|
||||||
{
|
{
|
||||||
HASH_delete_by_id(scanner->group_hash, group_rule->group_id);
|
HASH_delete_by_id(scanner->group_hash, group_rule->group_id);
|
||||||
HASH_delete_by_id(scanner->vertex_id2group, group_rule->vertex_id);
|
HASH_delete_by_id(scanner->vertex_id2group, group_rule->vertex_id);
|
||||||
|
igraph_vector_init(&v, 8);
|
||||||
|
igraph_neighbors(&scanner->group_graph, &v, group_rule->vertex_id, IGRAPH_ALL);
|
||||||
|
if(igraph_vector_size(&v)>0)
|
||||||
|
{
|
||||||
|
print_igraph_vector(&v, buff, sizeof(buff));
|
||||||
|
MESA_handle_runtime_log(scanner->logger_ref, RLOG_LV_FATAL, maat_module,
|
||||||
|
"Del group %d exception, still reached by %s.",
|
||||||
|
group_rule->vertex_id, buff);
|
||||||
|
assert(0);
|
||||||
|
}
|
||||||
|
igraph_vector_destroy(&v);
|
||||||
//Calling _destroy_group_rule on garbage collection to free memory.
|
//Calling _destroy_group_rule on garbage collection to free memory.
|
||||||
garbage_bagging(GARBAGE_GROUP_RULE, group_rule, scanner->tomb_ref);
|
garbage_bagging(GARBAGE_GROUP_RULE, group_rule, scanner->tomb_ref);
|
||||||
|
|
||||||
@@ -1413,6 +1439,7 @@ struct Maat_scanner_t* create_maat_scanner(unsigned int version,_Maat_feather_t
|
|||||||
rulescan_set_param(scanner->region,RULESCAN_REGEX_GROUP,NULL,0);
|
rulescan_set_param(scanner->region,RULESCAN_REGEX_GROUP,NULL,0);
|
||||||
}
|
}
|
||||||
scanner->tomb_ref=feather->garbage_q;
|
scanner->tomb_ref=feather->garbage_q;
|
||||||
|
scanner->logger_ref=feather->logger;
|
||||||
scanner->region_rslt_buff=ALLOC(scan_result_t, MAX_SCANNER_HIT_NUM*scan_thread_num);
|
scanner->region_rslt_buff=ALLOC(scan_result_t, MAX_SCANNER_HIT_NUM*scan_thread_num);
|
||||||
|
|
||||||
for(i=0;i<MAX_TABLE_NUM;i++)
|
for(i=0;i<MAX_TABLE_NUM;i++)
|
||||||
@@ -1859,7 +1886,7 @@ int add_group_to_compile(struct Maat_compile_group_relation*relation, struct Maa
|
|||||||
}
|
}
|
||||||
relation->group_cnt++;
|
relation->group_cnt++;
|
||||||
//member group->compile_shortcut may set to NULL and compile rule pointer repeatly,until rule build finish.
|
//member group->compile_shortcut may set to NULL and compile rule pointer repeatly,until rule build finish.
|
||||||
if(a_rule_group->parent_ref_cnt==1&&relation->group_cnt==1)
|
if(a_rule_group->ref_by_parent_cnt==1&&relation->group_cnt==1)
|
||||||
{
|
{
|
||||||
a_rule_group->compile_shortcut=relation;
|
a_rule_group->compile_shortcut=relation;
|
||||||
}
|
}
|
||||||
@@ -1867,7 +1894,7 @@ int add_group_to_compile(struct Maat_compile_group_relation*relation, struct Maa
|
|||||||
{
|
{
|
||||||
a_rule_group->compile_shortcut=NULL;
|
a_rule_group->compile_shortcut=NULL;
|
||||||
}
|
}
|
||||||
a_rule_group->parent_ref_cnt++;
|
a_rule_group->ref_by_parent_cnt++;
|
||||||
//update group's shortcut when compile has more than one group.
|
//update group's shortcut when compile has more than one group.
|
||||||
if(relation->group_cnt!=1)
|
if(relation->group_cnt!=1)
|
||||||
{
|
{
|
||||||
@@ -1900,7 +1927,7 @@ struct Maat_group_inner* del_group_from_compile(struct Maat_compile_group_relati
|
|||||||
}
|
}
|
||||||
if(group_rule->group_id==group_id)
|
if(group_rule->group_id==group_id)
|
||||||
{
|
{
|
||||||
group_rule->parent_ref_cnt--;
|
group_rule->ref_by_parent_cnt--;
|
||||||
dynamic_array_write(relation->groups,i,NULL);
|
dynamic_array_write(relation->groups,i,NULL);
|
||||||
if(relation->not_flag[i]==1)
|
if(relation->not_flag[i]==1)
|
||||||
{
|
{
|
||||||
@@ -2387,6 +2414,7 @@ int add_group_rule(struct Maat_table_desc* table, struct db_group_rule_t* db_gro
|
|||||||
struct Maat_group_inner* group_rule=NULL, *parent_group=NULL;
|
struct Maat_group_inner* group_rule=NULL, *parent_group=NULL;
|
||||||
struct Maat_compile_group_relation*compile_rule=NULL;
|
struct Maat_compile_group_relation*compile_rule=NULL;
|
||||||
int ret=0;
|
int ret=0;
|
||||||
|
igraph_integer_t edge_id;
|
||||||
group_rule=(struct Maat_group_inner*)HASH_fetch_by_id(scanner->group_hash, db_group_rule->group_id);
|
group_rule=(struct Maat_group_inner*)HASH_fetch_by_id(scanner->group_hash, db_group_rule->group_id);
|
||||||
if(group_rule==NULL)
|
if(group_rule==NULL)
|
||||||
{
|
{
|
||||||
@@ -2400,7 +2428,19 @@ int add_group_rule(struct Maat_table_desc* table, struct db_group_rule_t* db_gro
|
|||||||
{
|
{
|
||||||
parent_group=create_group_rule(db_group_rule->parent_id, table->table_id, scanner);
|
parent_group=create_group_rule(db_group_rule->parent_id, table->table_id, scanner);
|
||||||
}
|
}
|
||||||
group_rule->parent_ref_cnt++;
|
group_rule->ref_by_parent_cnt++;
|
||||||
|
parent_group->ref_by_children_cnt++;
|
||||||
|
ret=igraph_get_eid(&scanner->group_graph, &edge_id, group_rule->vertex_id, parent_group->vertex_id, IGRAPH_DIRECTED, /*error*/ 0);
|
||||||
|
if(edge_id>0)//if the edge was not found and error is false, then -1 will be assigned to eid.
|
||||||
|
{
|
||||||
|
MESA_handle_runtime_log(logger, RLOG_LV_FATAL, maat_module,
|
||||||
|
"update error, add sub group: %s %d to group %d error, sub group exist.",
|
||||||
|
table->table_name[table->updating_name],
|
||||||
|
db_group_rule->group_id,
|
||||||
|
db_group_rule->parent_id);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
//igraph allow add multiple edges between two vetex, igraph_delete_edges removes one edge per call.
|
||||||
igraph_add_edge(&scanner->group_graph, group_rule->vertex_id, parent_group->vertex_id);
|
igraph_add_edge(&scanner->group_graph, group_rule->vertex_id, parent_group->vertex_id);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -2422,7 +2462,7 @@ int add_group_rule(struct Maat_table_desc* table, struct db_group_rule_t* db_gro
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return 0;
|
return 1;
|
||||||
}
|
}
|
||||||
int del_group_rule(struct Maat_table_desc* table, struct db_group_rule_t* db_group_rule, struct Maat_scanner_t *scanner, void* logger)
|
int del_group_rule(struct Maat_table_desc* table, struct db_group_rule_t* db_group_rule, struct Maat_scanner_t *scanner, void* logger)
|
||||||
{
|
{
|
||||||
@@ -2430,6 +2470,7 @@ int del_group_rule(struct Maat_table_desc* table, struct db_group_rule_t* db_gro
|
|||||||
struct Maat_group_inner* group_rule=NULL, *parent_group=NULL;
|
struct Maat_group_inner* group_rule=NULL, *parent_group=NULL;
|
||||||
igraph_es_t es;
|
igraph_es_t es;
|
||||||
int ret=0;
|
int ret=0;
|
||||||
|
igraph_integer_t edge_num_before=0, edge_num_after=0;
|
||||||
|
|
||||||
|
|
||||||
if(db_group_rule->parent_type==PARENT_TYPE_GROUP)
|
if(db_group_rule->parent_type==PARENT_TYPE_GROUP)
|
||||||
@@ -2454,15 +2495,21 @@ int del_group_rule(struct Maat_table_desc* table, struct db_group_rule_t* db_gro
|
|||||||
db_group_rule->parent_id);
|
db_group_rule->parent_id);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
edge_num_before=igraph_ecount(&scanner->group_graph);
|
||||||
// The edges between the given pairs of vertices will be included in the edge selection.
|
// The edges between the given pairs of vertices will be included in the edge selection.
|
||||||
//The vertex pairs must be given as the arguments of the function call, the third argument
|
//The vertex pairs must be given as the arguments of the function call, the third argument
|
||||||
//is the first vertex of the first edge, the fourth argument is the second vertex of the
|
//is the first vertex of the first edge, the fourth argument is the second vertex of the
|
||||||
//first edge, the fifth is the first vertex of the second edge and so on. The last element
|
//first edge, the fifth is the first vertex of the second edge and so on. The last element
|
||||||
//of the argument list must be -1 to denote the end of the argument list.
|
//of the argument list must be -1 to denote the end of the argument list.
|
||||||
//https://igraph.org/c/doc/igraph-Iterators.html#igraph_es_pairs_small
|
//https://igraph.org/c/doc/igraph-Iterators.html#igraph_es_pairs_small
|
||||||
igraph_es_pairs_small(&es, IGRAPH_DIRECTED, group_rule->vertex_id, parent_group->vertex_id, -1);
|
ret=igraph_es_pairs_small(&es, IGRAPH_DIRECTED, group_rule->vertex_id, parent_group->vertex_id, -1);
|
||||||
|
assert(ret==IGRAPH_SUCCESS);
|
||||||
|
// ignore no such edge to abort().
|
||||||
|
igraph_set_error_handler(igraph_error_handler_ignore);
|
||||||
ret=igraph_delete_edges(&scanner->group_graph, es);
|
ret=igraph_delete_edges(&scanner->group_graph, es);
|
||||||
if(ret!=IGRAPH_SUCCESS)
|
edge_num_after=igraph_ecount(&scanner->group_graph);
|
||||||
|
|
||||||
|
if(ret!=IGRAPH_SUCCESS||edge_num_before-edge_num_after!=1)
|
||||||
{
|
{
|
||||||
MESA_handle_runtime_log(logger, RLOG_LV_FATAL, maat_module ,
|
MESA_handle_runtime_log(logger, RLOG_LV_FATAL, maat_module ,
|
||||||
"update error, delete %s group %d from parent group %d error, not such relation before.",
|
"update error, delete %s group %d from parent group %d error, not such relation before.",
|
||||||
@@ -2471,6 +2518,7 @@ int del_group_rule(struct Maat_table_desc* table, struct db_group_rule_t* db_gro
|
|||||||
db_group_rule->parent_id);
|
db_group_rule->parent_id);
|
||||||
}
|
}
|
||||||
igraph_es_destroy(&es);
|
igraph_es_destroy(&es);
|
||||||
|
destroy_group_rule(parent_group, DESTROY_GROUP_BY_CHILD, scanner);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -2478,7 +2526,7 @@ int del_group_rule(struct Maat_table_desc* table, struct db_group_rule_t* db_gro
|
|||||||
if(relation==NULL)
|
if(relation==NULL)
|
||||||
{
|
{
|
||||||
MESA_handle_runtime_log(logger, RLOG_LV_FATAL, maat_module,
|
MESA_handle_runtime_log(logger, RLOG_LV_FATAL, maat_module,
|
||||||
"update error, delete %s group %d error : compile id %d does not exisit.",
|
"update error, delete %s group %d form compile %d error, compile does not exist.",
|
||||||
table->table_name[table->updating_name],
|
table->table_name[table->updating_name],
|
||||||
db_group_rule->group_id,
|
db_group_rule->group_id,
|
||||||
db_group_rule->parent_id);
|
db_group_rule->parent_id);
|
||||||
@@ -2488,13 +2536,13 @@ int del_group_rule(struct Maat_table_desc* table, struct db_group_rule_t* db_gro
|
|||||||
if(group_rule==NULL)
|
if(group_rule==NULL)
|
||||||
{
|
{
|
||||||
MESA_handle_runtime_log(logger, RLOG_LV_FATAL, maat_module,
|
MESA_handle_runtime_log(logger, RLOG_LV_FATAL, maat_module,
|
||||||
"update error, delete %s group rule error : group id %d not in compile id %d."
|
"update error, delete %s group %d from compile %d error, target group does not in compile.",
|
||||||
,table->table_name[table->updating_name]
|
table->table_name[table->updating_name],
|
||||||
,db_group_rule->group_id
|
db_group_rule->group_id,
|
||||||
,db_group_rule->parent_id);
|
db_group_rule->parent_id);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
if(relation->group_cnt==0)
|
if(relation->group_cnt==0 && relation->compile==NULL)
|
||||||
{
|
{
|
||||||
destroy_compile_group_relation(relation, scanner);
|
destroy_compile_group_relation(relation, scanner);
|
||||||
}
|
}
|
||||||
@@ -2531,7 +2579,7 @@ int del_compile_rule(struct Maat_table_desc* table, int compile_id, struct Maat_
|
|||||||
if(cg_relation==NULL || cg_relation->compile==NULL)
|
if(cg_relation==NULL || cg_relation->compile==NULL)
|
||||||
{
|
{
|
||||||
MESA_handle_runtime_log(logger,RLOG_LV_FATAL,maat_module ,
|
MESA_handle_runtime_log(logger,RLOG_LV_FATAL,maat_module ,
|
||||||
"update error, delete %s compile rule error : config id %d does not exist."
|
"update error, delete %s compile rule error : compile id %d does not exist."
|
||||||
,table->table_name[table->updating_name]
|
,table->table_name[table->updating_name]
|
||||||
,compile_id);
|
,compile_id);
|
||||||
return -1;
|
return -1;
|
||||||
@@ -2542,7 +2590,7 @@ int del_compile_rule(struct Maat_table_desc* table, int compile_id, struct Maat_
|
|||||||
cg_relation->compile=NULL;
|
cg_relation->compile=NULL;
|
||||||
pthread_rwlock_unlock(&(cg_relation->rwlock));
|
pthread_rwlock_unlock(&(cg_relation->rwlock));
|
||||||
|
|
||||||
if(cg_relation->group_cnt==0)
|
if(cg_relation->group_cnt==0&&cg_relation->compile==NULL)
|
||||||
{
|
{
|
||||||
destroy_compile_group_relation(cg_relation, scanner);
|
destroy_compile_group_relation(cg_relation, scanner);
|
||||||
}
|
}
|
||||||
@@ -3880,6 +3928,7 @@ int maat_update_cb(const char* table_name,const char* line,void *u_para)
|
|||||||
{
|
{
|
||||||
scanner=feather->scanner;
|
scanner=feather->scanner;
|
||||||
}
|
}
|
||||||
|
MESA_handle_runtime_log(feather->logger, RLOG_LV_DEBUG, maat_module, "Maat table %s input: %s", table_name, line);
|
||||||
ret=map_str2int(feather->map_tablename2id,table_name,&table_id);
|
ret=map_str2int(feather->map_tablename2id,table_name,&table_id);
|
||||||
if(ret<0)
|
if(ret<0)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -83,7 +83,7 @@ static int get_group_seq(struct iris_description_t* iris_cfg)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
data_reply=_wrap_redisCommand(iris_cfg->redis_write_ctx,"INCRBY SEQUENCE_GROUP 1");
|
data_reply=_wrap_redisCommand(iris_cfg->redis_write_ctx,"INCRBY %s 1", mr_group_id_var);
|
||||||
sequence=(int)data_reply->integer-1;
|
sequence=(int)data_reply->integer-1;
|
||||||
freeReplyObject(data_reply);
|
freeReplyObject(data_reply);
|
||||||
}
|
}
|
||||||
@@ -100,7 +100,7 @@ static int get_region_seq(struct iris_description_t* iris_cfg)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
data_reply=_wrap_redisCommand(iris_cfg->redis_write_ctx,"INCRBY SEQUENCE_REGION 1");
|
data_reply=_wrap_redisCommand(iris_cfg->redis_write_ctx,"INCRBY %s 1", mr_region_id_var);
|
||||||
sequence=(int)data_reply->integer-1;
|
sequence=(int)data_reply->integer-1;
|
||||||
freeReplyObject(data_reply);
|
freeReplyObject(data_reply);
|
||||||
}
|
}
|
||||||
@@ -1098,6 +1098,7 @@ int write_iris(cJSON *json, struct iris_description_t *p_iris, void* logger)
|
|||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
// redis_write_ctx is used by maat_redis_tool to write json to redis.
|
||||||
int json2iris(const char* json_file,const char*compile_tn,const char* group_tn,redisContext *redis_write_ctx,char* iris_dir_buf,int buf_len,void* logger)
|
int json2iris(const char* json_file,const char*compile_tn,const char* group_tn,redisContext *redis_write_ctx,char* iris_dir_buf,int buf_len,void* logger)
|
||||||
{
|
{
|
||||||
FILE* json_fp=NULL;
|
FILE* json_fp=NULL;
|
||||||
|
|||||||
@@ -23,6 +23,8 @@
|
|||||||
extern const char *maat_module;
|
extern const char *maat_module;
|
||||||
|
|
||||||
|
|
||||||
|
#define mr_region_id_var "SEQUENCE_REGION"
|
||||||
|
#define mr_group_id_var "SEQUENCE_GROUP"
|
||||||
|
|
||||||
|
|
||||||
#define MAX_TABLE_NUM 256
|
#define MAX_TABLE_NUM 256
|
||||||
@@ -104,8 +106,7 @@ struct Maat_compile_rule
|
|||||||
const struct Maat_table_desc* ref_table;
|
const struct Maat_table_desc* ref_table;
|
||||||
MAAT_RULE_EX_DATA* ads;
|
MAAT_RULE_EX_DATA* ads;
|
||||||
};
|
};
|
||||||
#define PARENT_TYPE_COMPILE 0
|
|
||||||
#define PARENT_TYPE_GROUP 1
|
|
||||||
struct db_group_rule_t
|
struct db_group_rule_t
|
||||||
{
|
{
|
||||||
int group_id;
|
int group_id;
|
||||||
@@ -140,7 +141,8 @@ struct Maat_group_inner
|
|||||||
int table_id;
|
int table_id;
|
||||||
int region_boundary;
|
int region_boundary;
|
||||||
int region_cnt;
|
int region_cnt;
|
||||||
int parent_ref_cnt;
|
int ref_by_parent_cnt;
|
||||||
|
int ref_by_children_cnt;
|
||||||
char* group_name;
|
char* group_name;
|
||||||
int has_compile_neighbors;
|
int has_compile_neighbors;
|
||||||
int vertex_id;
|
int vertex_id;
|
||||||
@@ -303,6 +305,7 @@ struct Maat_scanner_t
|
|||||||
MESA_lqueue_head region_update_q;
|
MESA_lqueue_head region_update_q;
|
||||||
struct bool_matcher * bool_matcher_expr_compiler;
|
struct bool_matcher * bool_matcher_expr_compiler;
|
||||||
scan_result_t *region_rslt_buff;
|
scan_result_t *region_rslt_buff;
|
||||||
|
void* logger_ref;
|
||||||
MESA_lqueue_head tomb_ref;//reference of g_feather->garbage_q
|
MESA_lqueue_head tomb_ref;//reference of g_feather->garbage_q
|
||||||
|
|
||||||
int max_thread_num;
|
int max_thread_num;
|
||||||
|
|||||||
@@ -1,6 +1,9 @@
|
|||||||
add_executable(maat_demo maat_demo.cpp)
|
add_executable(maat_demo maat_demo.cpp)
|
||||||
target_link_libraries(maat_demo maat_frame_shared)
|
target_link_libraries(maat_demo maat_frame_shared)
|
||||||
|
|
||||||
|
add_executable(test_igraph test_igraph.cpp)
|
||||||
|
target_link_libraries(test_igraph igraph-static)
|
||||||
|
|
||||||
add_executable(test_maatframe test_maatframe.cpp)
|
add_executable(test_maatframe test_maatframe.cpp)
|
||||||
target_link_libraries(test_maatframe maat_frame_shared gtest)
|
target_link_libraries(test_maatframe maat_frame_shared gtest)
|
||||||
|
|
||||||
|
|||||||
62
test/test_igraph.cpp
Normal file
62
test/test_igraph.cpp
Normal file
@@ -0,0 +1,62 @@
|
|||||||
|
#include "igraph/igraph.h"
|
||||||
|
#include <assert.h>
|
||||||
|
|
||||||
|
void print_vector(igraph_vector_t *v, FILE *f) {
|
||||||
|
long int i;
|
||||||
|
for (i=0; i<igraph_vector_size(v); i++) {
|
||||||
|
fprintf(f, " %li", (long int) VECTOR(*v)[i]);
|
||||||
|
}
|
||||||
|
fprintf(f, "\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
|
||||||
|
igraph_t g;
|
||||||
|
int ret;
|
||||||
|
ret=igraph_empty(&g, 0, IGRAPH_DIRECTED);
|
||||||
|
|
||||||
|
igraph_es_t es;
|
||||||
|
igraph_integer_t edge_num_before=0, edge_num_after=0;
|
||||||
|
int v[10];
|
||||||
|
int i=0;
|
||||||
|
for(i=0; i<sizeof(v)/sizeof(int); i++)
|
||||||
|
{
|
||||||
|
v[i]=i;
|
||||||
|
igraph_add_vertices(&g, 1, NULL); //Add 1 vertice.
|
||||||
|
}
|
||||||
|
igraph_add_edge(&g, v[0], v[1]);
|
||||||
|
igraph_add_edge(&g, v[0], v[1]);
|
||||||
|
|
||||||
|
igraph_add_edge(&g, v[2], v[3]);
|
||||||
|
|
||||||
|
int edge_id=0;
|
||||||
|
ret=igraph_get_eid(&g, &edge_id, v[2], v[3], IGRAPH_DIRECTED, 0);
|
||||||
|
assert(edge_id>0);
|
||||||
|
|
||||||
|
ret=igraph_es_pairs_small(&es, IGRAPH_DIRECTED, v[0], v[1], -1);
|
||||||
|
assert(ret==IGRAPH_SUCCESS);
|
||||||
|
edge_num_before=igraph_ecount(&g);
|
||||||
|
ret=igraph_delete_edges(&g, es);
|
||||||
|
edge_num_after=igraph_ecount(&g);
|
||||||
|
assert(edge_num_before-edge_num_after==1);
|
||||||
|
assert(ret==IGRAPH_SUCCESS);
|
||||||
|
igraph_es_destroy(&es);
|
||||||
|
|
||||||
|
ret=igraph_es_pairs_small(&es, IGRAPH_DIRECTED, v[3], v[4], -1);
|
||||||
|
assert(ret==IGRAPH_SUCCESS);
|
||||||
|
edge_num_before=igraph_ecount(&g);
|
||||||
|
/* error test, no such edge to delete */
|
||||||
|
igraph_set_error_handler(igraph_error_handler_ignore);
|
||||||
|
|
||||||
|
ret=igraph_delete_edges(&g, es);
|
||||||
|
edge_num_after=igraph_ecount(&g);
|
||||||
|
assert(edge_num_before=edge_num_after);
|
||||||
|
assert(ret!=IGRAPH_SUCCESS);
|
||||||
|
igraph_es_destroy(&es);
|
||||||
|
|
||||||
|
|
||||||
|
igraph_destroy(&g);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
@@ -1475,6 +1475,7 @@ protected:
|
|||||||
static int linger_timeout;
|
static int linger_timeout;
|
||||||
};
|
};
|
||||||
Maat_feather_t MaatCmdTest::_shared_feather;
|
Maat_feather_t MaatCmdTest::_shared_feather;
|
||||||
|
|
||||||
void* MaatCmdTest::logger;
|
void* MaatCmdTest::logger;
|
||||||
|
|
||||||
int MaatCmdTest::linger_timeout;
|
int MaatCmdTest::linger_timeout;
|
||||||
@@ -1792,8 +1793,121 @@ TEST_F(MaatCmdTest, ReturnRuleIDWithDescendingOrder)
|
|||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
#define MaatCmdTest_SubGroup 0
|
||||||
|
TEST_F(MaatCmdTest, SubGroup)
|
||||||
|
{
|
||||||
|
|
||||||
|
/* compile1->group1--group2->region1
|
||||||
|
\
|
||||||
|
\group3->region2
|
||||||
|
|
||||||
|
compile2->group1
|
||||||
|
*/
|
||||||
|
const char* table_name="HTTP_URL";
|
||||||
|
const char* group_table_name="GROUP";
|
||||||
|
const char* compile_table_name="COMPILE";
|
||||||
|
const char* scan_data1="www.v2ex.com/t/573028#程序员的核心竞争力是什么";
|
||||||
|
const char* keyword1="程序员&核心竞争力";
|
||||||
|
|
||||||
|
const char* scan_data2="https://ask.leju.com/bj/detail/12189672562229248/?bi=tg&type=sina-pc&pos=index-dbtlwzl&wt_campaign=M_5CE750003F393&wt_source=PDPS_514ACACFD9E770";
|
||||||
|
// const char* keyword2="ask.leju.com/bj/detail/12189672562229248/?bi=tg&type=sina-pc&pos=index-dbtlwzl&wt_campaign=M_5CE750003F393&wt_source=PDPS_514ACACFD9E770";
|
||||||
|
const char* keyword2="ask.leju.com/b&/detail/12189672562229248/?&?bi=tg\\&type=sina-pc\\&&\\&pos=index-dbtlwzl\\&&\\&type=sina-pc\\&pos=index-dbtlwzl\\&";
|
||||||
|
Maat_feather_t feather=MaatCmdTest::_shared_feather;
|
||||||
|
int table_id=0;
|
||||||
|
table_id=Maat_table_register(feather, table_name);
|
||||||
|
struct Maat_rule_t compile1, compile2;
|
||||||
|
struct Maat_group_t group1, group2, group3;
|
||||||
|
struct Maat_region_t region1,region2;
|
||||||
|
memset(&compile1, 0, sizeof(compile1));
|
||||||
|
compile1.config_id=(int)Maat_cmd_incrby(feather, "TEST_SEQ", 1);
|
||||||
|
Maat_command_raw_set_compile(feather, MAAT_OP_ADD, &compile1, compile_table_name, NULL, 1);
|
||||||
|
|
||||||
|
memset(&compile2, 0, sizeof(compile2));
|
||||||
|
compile2.config_id=(int)Maat_cmd_incrby(feather, "TEST_SEQ", 1);
|
||||||
|
Maat_command_raw_set_compile(feather, MAAT_OP_ADD, &compile2, compile_table_name, NULL, 1);
|
||||||
|
|
||||||
|
|
||||||
|
memset(&group1, 0, sizeof(group1));
|
||||||
|
group1.group_id=Maat_cmd_get_new_group_id(feather);
|
||||||
|
group1.table_name=group_table_name;
|
||||||
|
group1.parent_id=compile1.config_id;
|
||||||
|
group1.parent_type=PARENT_TYPE_COMPILE;
|
||||||
|
Maat_command_raw_set_group(feather, MAAT_OP_ADD, &group1);
|
||||||
|
|
||||||
|
group1.parent_id=compile2.config_id;
|
||||||
|
Maat_command_raw_set_group(feather, MAAT_OP_ADD, &group1);
|
||||||
|
|
||||||
|
memset(&group2, 0, sizeof(group2));
|
||||||
|
group2.group_id=Maat_cmd_get_new_group_id(feather);
|
||||||
|
group2.table_name=group_table_name;
|
||||||
|
group2.parent_id=group1.group_id;
|
||||||
|
group2.parent_type=PARENT_TYPE_GROUP;
|
||||||
|
Maat_command_raw_set_group(feather, MAAT_OP_ADD, &group2);
|
||||||
|
|
||||||
|
memset(®ion1, 0, sizeof(region1));
|
||||||
|
region1.region_id=Maat_cmd_get_new_region_id(feather);
|
||||||
|
region1.region_type=REGION_EXPR;
|
||||||
|
region1.table_name=table_name;
|
||||||
|
region1.expr_rule.keywords=keyword1;
|
||||||
|
region1.expr_rule.expr_type=EXPR_TYPE_AND;
|
||||||
|
Maat_command_raw_set_region(feather, MAAT_OP_ADD, ®ion1, group2.group_id);
|
||||||
|
sleep(1);
|
||||||
|
struct Maat_rule_t result[4];
|
||||||
|
memset(&result, 0, sizeof(result));
|
||||||
|
|
||||||
|
scan_status_t mid=NULL;
|
||||||
|
int ret=0;
|
||||||
|
ret=Maat_full_scan_string(feather, table_id, CHARSET_GBK, scan_data1, strlen(scan_data1),
|
||||||
|
result, NULL, 4,
|
||||||
|
&mid, 0);
|
||||||
|
EXPECT_EQ(ret, 2);
|
||||||
|
EXPECT_EQ(result[0].config_id, compile2.config_id);
|
||||||
|
EXPECT_EQ(result[1].config_id, compile1.config_id);
|
||||||
|
Maat_clean_status(&mid);
|
||||||
|
|
||||||
|
Maat_command_raw_set_group(feather, MAAT_OP_DEL, &group1);
|
||||||
|
sleep(1);
|
||||||
|
ret=Maat_full_scan_string(feather, table_id, CHARSET_GBK, scan_data1, strlen(scan_data1),
|
||||||
|
result, NULL, 4,
|
||||||
|
&mid, 0);
|
||||||
|
EXPECT_EQ(ret, 1);
|
||||||
|
EXPECT_EQ(result[0].config_id, compile1.config_id);
|
||||||
|
Maat_clean_status(&mid);
|
||||||
|
|
||||||
|
group1.parent_id=compile1.config_id;
|
||||||
|
Maat_command_raw_set_group(feather, MAAT_OP_DEL, &group1);
|
||||||
|
sleep(1);
|
||||||
|
ret=Maat_full_scan_string(feather, table_id, CHARSET_GBK, scan_data1, strlen(scan_data1),
|
||||||
|
result, NULL, 4,
|
||||||
|
&mid, 0);
|
||||||
|
EXPECT_EQ(ret, -2);
|
||||||
|
Maat_clean_status(&mid);
|
||||||
|
|
||||||
|
memset(&group3, 0, sizeof(group3));
|
||||||
|
group3.group_id=Maat_cmd_get_new_group_id(feather);
|
||||||
|
group3.parent_id=group1.group_id;
|
||||||
|
group3.parent_type=PARENT_TYPE_GROUP;
|
||||||
|
group3.table_name=group_table_name;
|
||||||
|
Maat_command_raw_set_group(feather, MAAT_OP_ADD, &group3);
|
||||||
|
|
||||||
|
memset(®ion2, 0, sizeof(region2));
|
||||||
|
region2.region_id=Maat_cmd_get_new_region_id(feather);
|
||||||
|
region2.region_type=REGION_EXPR;
|
||||||
|
region2.table_name=table_name;
|
||||||
|
region2.expr_rule.keywords=keyword2;
|
||||||
|
region2.expr_rule.expr_type=EXPR_TYPE_AND;
|
||||||
|
Maat_command_raw_set_region(feather, MAAT_OP_ADD, ®ion2, group3.group_id);
|
||||||
|
|
||||||
|
Maat_command_raw_set_group(feather, MAAT_OP_ADD, &group1);
|
||||||
|
sleep(1);
|
||||||
|
ret=Maat_full_scan_string(feather, table_id, CHARSET_GBK, scan_data2, strlen(scan_data2),
|
||||||
|
result, NULL, 4,
|
||||||
|
&mid, 0);
|
||||||
|
EXPECT_EQ(ret, 1);
|
||||||
|
EXPECT_EQ(result[0].config_id, compile1.config_id);
|
||||||
|
Maat_clean_status(&mid);
|
||||||
|
|
||||||
|
}
|
||||||
TEST_F(MaatCmdTest, SetLines)
|
TEST_F(MaatCmdTest, SetLines)
|
||||||
{
|
{
|
||||||
const int TEST_CMD_LINE_NUM=4;
|
const int TEST_CMD_LINE_NUM=4;
|
||||||
|
|||||||
Reference in New Issue
Block a user