From dfe0c6007b2eab15a69f734a3c15e08641967760 Mon Sep 17 00:00:00 2001 From: zhengchao Date: Wed, 4 Nov 2020 14:55:31 +0800 Subject: [PATCH] Foreign file column content uses "null" to present empty file, which will not retrieval from redis server. --- src/entry/Maat_command.cpp | 40 +++++++++++++++++++++++++------------- test/test_maatframe.cpp | 34 ++++++++++++++++++++++++++++---- 2 files changed, 56 insertions(+), 18 deletions(-) diff --git a/src/entry/Maat_command.cpp b/src/entry/Maat_command.cpp index 4f43ac5..0b7bdb5 100644 --- a/src/entry/Maat_command.cpp +++ b/src/entry/Maat_command.cpp @@ -1418,45 +1418,49 @@ void _get_foregin_keys(struct serial_rule_t* p_rule, int* foreign_columns, int n int i=0; const char* p_foreign=NULL; int foreign_key_size=0; - p_rule->n_foreign=n_foreign; p_rule->f_keys=ALLOC(struct foreign_key, n_foreign); for(i=0; itable_line, foreign_columns[i], &foreign_key_size); if(p_foreign==NULL) { - MESA_handle_runtime_log(logger,RLOG_LV_FATAL,maat_redis_monitor - , "Get %s,%d foreign keys failed: No %dth column." - , p_rule->table_name, p_rule->rule_id, foreign_columns[i]); - break; + MESA_handle_runtime_log(logger, RLOG_LV_FATAL, maat_redis_monitor, + "Get %s,%d foreign keys failed: No %dth column.", + p_rule->table_name, p_rule->rule_id, foreign_columns[i]); + continue; + } + if(0==strncasecmp(p_foreign, "null", strlen("null"))) + {//emtpy file + continue; } if(0!=strncmp(p_foreign, foreign_source_prefix, strlen(foreign_source_prefix))) { - MESA_handle_runtime_log(logger,RLOG_LV_FATAL,maat_redis_monitor - ,"Get %s,%d foreign key failed: Invalid source prefix %s." - , p_rule->table_name, p_rule->rule_id, p_foreign); - break; + MESA_handle_runtime_log(logger, RLOG_LV_FATAL, maat_redis_monitor, + "Get %s,%d foreign key failed: Invalid source prefix %s.", + p_rule->table_name, p_rule->rule_id, p_foreign); + continue; } p_rule->f_keys[i].column=foreign_columns[i]; foreign_key_size=foreign_key_size-strlen(foreign_source_prefix); p_foreign+=strlen(foreign_source_prefix); if(0!=strncmp(p_foreign, foreign_key_prefix, strlen(foreign_key_prefix))) { - MESA_handle_runtime_log(logger,RLOG_LV_INFO,maat_redis_monitor - ,"%s,%d foreign key prefix %s is discouraged." - ,p_rule->table_name, p_rule->rule_id, p_foreign); + MESA_handle_runtime_log(logger, RLOG_LV_INFO, maat_redis_monitor, + "%s, %d foreign key prefix %s is not recommended.", + p_rule->table_name, p_rule->rule_id, p_foreign); } p_rule->f_keys[i].key=(char*)calloc(sizeof(char),foreign_key_size+1); memcpy(p_rule->f_keys[i].key, p_foreign, foreign_key_size); p_rule->f_keys[i].filename=get_foreign_cont_filename(p_rule->table_name, p_rule->rule_id, p_rule->f_keys[i].key, dir); + p_rule->n_foreign++; } - if(i!=n_foreign) + if(i==0) { p_rule->n_foreign=0; free(p_rule->f_keys); p_rule->f_keys=NULL; - p_rule->with_error=1; } + return; } int get_foreign_keys_define(redisContext *ctx, struct serial_rule_t* rule_list, int rule_num, _Maat_feather_t* feather, const char* dir,void *logger) { @@ -1543,6 +1547,10 @@ void _get_foreign_conts(redisContext *ctx, struct serial_rule_t* rule_list, int { for(j=0; jn_foreign; j++) { + if(rule_list[i].f_keys[j].filename==NULL) + { + continue; + } ret=stat(p->f_keys[j].filename, &file_info); if(ret==0) { diff --git a/test/test_maatframe.cpp b/test/test_maatframe.cpp index 2e6876e..0d25669 100644 --- a/test/test_maatframe.cpp +++ b/test/test_maatframe.cpp @@ -3038,7 +3038,7 @@ int is_same_file(const char* filename1, const char* filename2) } int g_test_foregin_read_OK=0, g_test_foreign_del_OK=0; char file1_to_del[256], file2_to_del[256]; - +const char* empty_file_name="An_empty_file"; void foreign_key_test_entry_cb(int table_id,const char* table_line,void* u_para) { int rule_id=-1, not_care=0, tag=0; @@ -3056,10 +3056,16 @@ void foreign_key_test_entry_cb(int table_id,const char* table_line,void* u_para) , end); EXPECT_STREQ(end, "End"); if(is_valid==1) - { + { EXPECT_TRUE(is_same_file(file1_origin_name, file1_localname)); - EXPECT_TRUE(is_same_file(file2_origin_name, file2_localname)); - + if(0==strncmp(file2_origin_name, empty_file_name, strlen(empty_file_name))) + { + EXPECT_TRUE(0==strncasecmp(file2_localname, "null", strlen("null"))); + } + else + { + EXPECT_TRUE(is_same_file(file2_origin_name, file2_localname)); + } g_test_foregin_read_OK=1; } else @@ -3133,6 +3139,26 @@ TEST_F(MaatCmdTest, SetFile) ret=stat(file2_to_del, &file_info); EXPECT_EQ(ret, -1); + +// Test empty file, file key is a string "null". + line_rule.label_id=0; + line_rule.rule_id=(int)Maat_cmd_incrby(feather,"TEST_PLUG_SEQ", 1); + line_rule.table_name=table_name; + snprintf(line, sizeof(line),"%d\t2\t%d\t1\t%s\tredis://%s\t%s\t%s\tEnd",line_rule.rule_id, tag + ,file1_name, file1_key + ,empty_file_name, "null"); + line_rule.table_line=line; + line_rule.expire_after=0; + + g_test_foregin_read_OK=0; + + ret=Maat_cmd_set_line(feather, &line_rule, MAAT_OP_ADD); + EXPECT_EQ(ret, 1); + usleep(WAIT_FOR_EFFECTIVE_US);//wait for callback triggered. + + + EXPECT_EQ(g_test_foregin_read_OK, 1); + return; } struct user_info