diff --git a/.gitignore b/.gitignore index 65043fb..76c9938 100644 --- a/.gitignore +++ b/.gitignore @@ -1,9 +1,44 @@ -SI/ -*.I* -*.P* -*.S* -*.W* -*.[od] -*.[1-9]* -*.log +# Created by https://www.gitignore.io/api/c++,clion + +### C++ ### +# Prerequisites +*.d + +# Compiled Object files +*.slo +*.lo +*.o +*.obj + +# Precompiled Headers +*.gch +*.pch + +# Compiled Dynamic libraries +*.so +*.dylib +*.dll + +# Fortran module files +*.mod +*.smod + +# Compiled Static libraries +*.lai +*.la *.a +*.lib + +# Executables +*.exe +*.out +*.app + +# CMake +cmake-build-*/ + +# Clion +.idea/ + +# Vscode +.vscode/* diff --git a/CMakeLists.txt b/CMakeLists.txt index 3c60a47..acafaae 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,6 +1,7 @@ cmake_minimum_required (VERSION 3.5) project (maatframe) set(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} -Wall) +set(MAAT_DEPEND_DYN_LIB MESA_handle_logger MESA_htable pcre rulescan pthread m pcre MESA_field_stat2 crypto) include_directories(${PROJECT_SOURCE_DIR}/inc/) include_directories(/opt/MESA/include/MESA/) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index a5e6477..ee1ce60 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1,9 +1,9 @@ -cmake_minimum_required(VERSION 2.6) +cmake_minimum_required(VERSION 3.5) project(maatframe) set(MAAT_FRAME_MAJOR_VERSION 2) -set(MAAT_FRAME_MINOR_VERSION 2) -set(MAAT_FRAME_PATCH_VERSION 20180923) +set(MAAT_FRAME_MINOR_VERSION 3) +set(MAAT_FRAME_PATCH_VERSION 20180926) set(MAAT_FRAME_VERSION ${MAAT_FRAME_MAJOR_VERSION}.${MAAT_FRAME_MINOR_VERSION}.${MAAT_FRAME_PATCH_VERSION}) message(STATUS "Maat Frame, Version: ${MAAT_FRAME_VERSION}") @@ -19,7 +19,8 @@ set_target_properties(maat_frame_static PROPERTIES LINKER_LANGUAGE CXX) set_target_properties(maat_frame_static PROPERTIES OUTPUT_NAME maatframe) set_target_properties(maat_frame_static PROPERTIES CLEAN_DIRECT_OUTPUT 1) target_include_directories(maat_frame_static PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/inc_internal/) -target_include_directories(maat_frame_static PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/inc_internal/hiredis) +#target_include_directories(maat_frame_static PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/inc_internal/hiredis) +target_link_libraries(maat_frame_static hiredis-vip-static) # Shared Library Output add_library(maat_frame_shared SHARED ${MAAT_SRC}) @@ -30,7 +31,7 @@ set_target_properties(maat_frame_shared PROPERTIES VERSION ${MAAT_FRAME_MAJOR_VE set_target_properties(maat_frame_shared PROPERTIES SOVERSION ${MAAT_FRAME_MAJOR_VERSION}) target_include_directories(maat_frame_shared PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/inc_internal/) target_include_directories(maat_frame_shared PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/inc_internal/hiredis) -target_link_libraries(maat_frame_shared MESA_handle_logger MESA_htable pcre rulescan pthread m pcre MESA_field_stat2 crypto hiredis_vip) +target_link_libraries(maat_frame_shared hiredis-vip-static ${MAAT_DEPEND_DYN_LIB}) install(DIRECTORY ${PROJECT_SOURCE_DIR}/inc/ DESTINATION /opt/MESA/include/MESA/ FILES_MATCHING PATTERN "*.h") install(TARGETS maat_frame_shared DESTINATION /opt/MESA/lib/) diff --git a/src/entry/Maat_command.cpp b/src/entry/Maat_command.cpp index a7d581c..3a30724 100644 --- a/src/entry/Maat_command.cpp +++ b/src/entry/Maat_command.cpp @@ -1403,7 +1403,7 @@ const char* find_Nth_column(const char* line, int Nth, int* column_len) break; } } - if(start==0) + if(start==end) { return NULL; } @@ -1456,14 +1456,57 @@ void rewrite_table_line_with_foreign(struct serial_rule_t*p) p->table_line=rewrite_line; return; } -int get_foreign_keys(redisContext *ctx, struct serial_rule_t* rule_list, int rule_num, _Maat_feather_t* feather, const char* dir,void *logger) +void _get_foregin_keys(struct serial_rule_t* p_rule, int* foreign_columns, int n_foreign, const char* dir, void* logger) { - int ret=0, table_id=0, i=0, j=0; - int foreign_key_size=0; - int rule_with_foreign_key=0; + int ret=0, i=0; const char* p_foreign=NULL; - struct _Maat_table_info_t* p_table=NULL; + int foreign_key_size=0; struct stat file_info; + p_rule->n_foreign=n_foreign; + p_rule->f_keys=(struct foreign_key*)calloc(sizeof(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]); + 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, foreign_columns[i]); + 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, foreign_columns[i]); + } + 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); + ret=stat(p_rule->f_keys[i].filename, &file_info); + if(ret==0) + { + p_rule->f_keys[i].is_existed=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) +{ + int ret=0, table_id=0, i=0; + int rule_with_foreign_key=0; + struct _Maat_table_info_t* p_table=NULL; for(i=0; in_foreign; - rule_list[i].f_keys=(struct foreign_key*)calloc(sizeof(struct foreign_key), rule_list[i].n_foreign); - for(j=0;jn_foreign;j++) - { - p_foreign=find_Nth_column(rule_list[i].table_line, p_table->foreign_columns[j], &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." - , rule_list[i].table_name, rule_list[i].rule_id, p_table->foreign_columns[j]); - 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." - , rule_list[i].table_name, rule_list[i].rule_id, p_foreign); - continue; - } - rule_list[i].f_keys[j].column=p_table->foreign_columns[j]; - 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." - , rule_list[i].table_name, rule_list[i].rule_id, p_foreign); - } - rule_list[i].f_keys[j].key=(char*)calloc(sizeof(char),foreign_key_size+1); - memcpy(rule_list[i].f_keys[j].key, p_foreign, foreign_key_size); - - rule_list[i].f_keys[j].filename=get_foreign_cont_filename(rule_list[i].table_name, rule_list[i].rule_id, rule_list[i].f_keys[j].key, dir); - ret=stat(rule_list[i].f_keys[j].filename, &file_info); - if(ret==0) - { - rule_list[i].f_keys[j].is_existed=1; - } - } + _get_foregin_keys(rule_list+i, p_table->foreign_columns, p_table->n_foreign, dir, logger); rule_with_foreign_key++; } return rule_with_foreign_key; } +int get_foreign_keys_by_prefix(redisContext *ctx, struct serial_rule_t* rule_list, int rule_num, const char* dir,void *logger) +{ + int i=0, j=0, foreign_key_size=0; + int rule_with_foreign_key=0; + const char* p_foreign=NULL; + + int n_foreign=0; + int foreign_columns[MAX_FOREIGN_CLMN_NUM]; + for(i=0; i(int)strlen(foreign_source_prefix)&&0==strncmp(p_foreign,foreign_source_prefix, strlen(foreign_source_prefix))) + { + foreign_columns[n_foreign]=j; + n_foreign++; + } + j++; + }while(p_foreign!=NULL&&n_foreign0) + { + _get_foregin_keys(rule_list+i, foreign_columns, n_foreign,dir,logger); + rule_with_foreign_key++; + } + } + return rule_with_foreign_key; +} + struct foreign_conts_track { int rule_idx; int foreign_idx; }; -void _get_foreign_conts(redisContext *ctx, struct serial_rule_t* rule_list, int rule_num, void *logger) +void _get_foreign_conts(redisContext *ctx, struct serial_rule_t* rule_list, int rule_num, int print_fn, void *logger) { int i=0, j=0, ret=0; int key_num=0; @@ -1584,6 +1620,10 @@ void _get_foreign_conts(redisContext *ctx, struct serial_rule_t* rule_list, int fwrite(reply->str, 1, reply->len, fp); fclose(fp); fp=NULL; + if(print_fn==1) + { + printf("Written foreign content %s\n",p->f_keys[track[i].foreign_idx].filename); + } } } freeReplyObject(reply); @@ -1591,14 +1631,14 @@ void _get_foreign_conts(redisContext *ctx, struct serial_rule_t* rule_list, int free(track); return; } -void get_foreign_conts(redisContext *ctx, struct serial_rule_t* rule_list, int rule_num, void *logger) +void get_foreign_conts(redisContext *ctx, struct serial_rule_t* rule_list, int rule_num, int print_fn, void *logger) { int max_redis_batch=4*1024,batch_cnt=0; int success_cnt=0; while(success_cntforeign_cont_dir, logger); + ret=get_foreign_keys_define(c, rule_list, rule_num, feather, feather->foreign_cont_dir, logger); if(ret>0) { - get_foreign_conts(c, rule_list, rule_num, logger); + get_foreign_conts(c, rule_list, rule_num, 0, logger); } } start(new_version,update_type,u_para); @@ -2018,7 +2058,7 @@ int Maat_cmd_set_file(Maat_feather_t feather,const char* key, const char* value, return -1; } freeReplyObject(reply); - return 0; + return 1; } void Maat_add_region2cmd(struct Maat_cmd_t* cmd,int which_group,const struct Maat_region_t* region) { diff --git a/src/entry/Maat_rule.cpp b/src/entry/Maat_rule.cpp index 65180f5..ae51562 100644 --- a/src/entry/Maat_rule.cpp +++ b/src/entry/Maat_rule.cpp @@ -32,7 +32,7 @@ #include "stream_fuzzy_hash.h" #include "gram_index_engine.h" -int MAAT_FRAME_VERSION_2_2_20180925=1; +int MAAT_FRAME_VERSION_2_2_20180926=1; const char* CHARSET_STRING[]={"NONE","gbk","big5","unicode","utf8","bin", "unicode_ascii_esc","unicode_ascii_aligned","unicode_ncr_dec","unicode_ncr_hex","url_encode_gb2312","url_encode_utf8",""}; @@ -3009,6 +3009,15 @@ void garbage_bury(MESA_lqueue_head garbage_q,int timeout,void *logger) "Foreign content file %s remove failed.", bag->filename); } + else + { + + MESA_handle_runtime_log(logger,RLOG_LV_DEBUG,maat_module, + "Foreign content file %s remove success.", + bag->filename); + } + free(bag->filename); + bag->filename=NULL; break; default: assert(0); diff --git a/src/inc_internal/Maat_rule_internal.h b/src/inc_internal/Maat_rule_internal.h index 8f9c0cf..6d200d9 100644 --- a/src/inc_internal/Maat_rule_internal.h +++ b/src/inc_internal/Maat_rule_internal.h @@ -500,6 +500,11 @@ void maat_stat_output(struct _Maat_feather_t* feather); redisReply *_wrap_redisCommand(redisContext *c, const char *format, ...); int get_rm_key_list(redisContext *c, long long instance_version, long long desired_version, long long* new_version, struct serial_rule_t** list,int *update_type, void* logger, int cumulative_off); int get_maat_redis_value(redisContext *c,struct serial_rule_t* rule_list,int rule_num,void* logger,int print_process); +int get_foreign_keys_by_prefix(redisContext *ctx, struct serial_rule_t* rule_list, int rule_num, const char* dir,void *logger); +void get_foreign_conts(redisContext *ctx, struct serial_rule_t* rule_list, int rule_num, int print_fn, void *logger); +void rewrite_table_line_with_foreign(struct serial_rule_t*p); + + 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 empty_serial_rules(struct serial_rule_t* rule); int exec_serial_rule(redisContext* ctx,struct serial_rule_t* s_rule,int serial_rule_num, long long server_time, void* logger); diff --git a/test/test_maatframe.cpp b/test/test_maatframe.cpp index 70e9137..6edb1cd 100644 --- a/test/test_maatframe.cpp +++ b/test/test_maatframe.cpp @@ -664,8 +664,7 @@ protected: const char* foregin_dir="./foreign_files/"; Maat_set_feather_opt(_shared_feather, MAAT_OPT_FOREIGN_CONT_DIR,foregin_dir, strlen(foregin_dir)+1); - - int linger_timeout=4; + linger_timeout=2; Maat_set_feather_opt(_shared_feather, MAAT_OPT_FOREIGN_CONT_LINGER,&linger_timeout, sizeof(linger_timeout)); Maat_cmd_flushDB(_shared_feather); @@ -678,10 +677,11 @@ protected: } // Some expensive resource shared by all tests. - static Maat_feather_t _shared_feather; + static Maat_feather_t _shared_feather; + static int linger_timeout; }; Maat_feather_t MaatCmdTest::_shared_feather; - +int MaatCmdTest::linger_timeout; int test_add_expr_command(Maat_feather_t feather,const char* region_table,int config_id, int timeout,int label_id, const char* keywords) { struct Maat_cmd_t* cmd=NULL; @@ -1043,7 +1043,9 @@ int is_same_file(const char* filename1, const char* filename2) return 0; } } -int g_test_foregin_read_OK=0; +int g_test_foregin_read_OK=0, g_test_foreign_del_OK=0; +char file1_to_del[256], file2_to_del[256]; + 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; @@ -1060,10 +1062,19 @@ void foreign_key_test_entry_cb(int table_id,const char* table_line,void* u_para) , file2_origin_name, file2_localname , end); EXPECT_STREQ(end, "End"); - EXPECT_TRUE(is_same_file(file1_origin_name, file1_localname)); - EXPECT_TRUE(is_same_file(file2_origin_name, file2_localname)); + if(is_valid==1) + { + EXPECT_TRUE(is_same_file(file1_origin_name, file1_localname)); + EXPECT_TRUE(is_same_file(file2_origin_name, file2_localname)); - g_test_foregin_read_OK=1; + g_test_foregin_read_OK=1; + } + else + { + strcpy(file1_to_del, file1_localname); + strcpy(file2_to_del, file2_localname); + g_test_foreign_del_OK=1; + } return; } @@ -1085,12 +1096,14 @@ TEST_F(MaatCmdTest, SetFile) size_t file_size=0; prepare_file_to_set(file1_name, &file_buff, &file_size, file1_key, sizeof(file1_key)); - Maat_cmd_set_file(feather, file1_key, file_buff, file_size, MAAT_OP_ADD); + ret=Maat_cmd_set_file(feather, file1_key, file_buff, file_size, MAAT_OP_ADD); + EXPECT_EQ(ret, 1); free(file_buff); file_buff=NULL; prepare_file_to_set(file2_name, &file_buff, &file_size, file2_key, sizeof(file2_key)); - Maat_cmd_set_file(feather, file2_key, file_buff, file_size, MAAT_OP_ADD); + ret=Maat_cmd_set_file(feather, file2_key, file_buff, file_size, MAAT_OP_ADD); + EXPECT_EQ(ret, 1); free(file_buff); file_buff=NULL; g_test_foregin_read_OK=0; @@ -1110,6 +1123,23 @@ TEST_F(MaatCmdTest, SetFile) EXPECT_EQ(ret, 1); usleep(WAIT_FOR_EFFECTIVE_US);//wait for callback triggered. EXPECT_EQ(g_test_foregin_read_OK, 1); + + g_test_foreign_del_OK=0; + ret=Maat_cmd_set_file(feather, file1_key, NULL, 0, MAAT_OP_DEL); + EXPECT_EQ(ret, 1); + ret=Maat_cmd_set_file(feather, file2_key, NULL, 0, MAAT_OP_DEL); + EXPECT_EQ(ret, 1); + + ret=Maat_cmd_set_line(feather, &line_rule, MAAT_OP_DEL); + EXPECT_EQ(ret, 1); + sleep(MaatCmdTest::linger_timeout+1); + + struct stat file_info; + ret=stat(file1_to_del, &file_info); + EXPECT_EQ(ret, -1); + ret=stat(file2_to_del, &file_info); + EXPECT_EQ(ret, -1); + return; } diff --git a/tools/CMakeLists.txt b/tools/CMakeLists.txt index 5cb7cc2..8cb7a2f 100644 --- a/tools/CMakeLists.txt +++ b/tools/CMakeLists.txt @@ -4,8 +4,8 @@ target_link_libraries(digest_gen maat_frame_shared) add_executable(maat_redis_tool maat_redis_tool.cpp) add_dependencies(maat_redis_tool maat_frame_shared) -target_link_libraries(maat_redis_tool maat_frame_shared) +target_link_libraries(maat_redis_tool maat_frame_static ${MAAT_DEPEND_DYN_LIB}) target_include_directories(maat_redis_tool PRIVATE ${PROJECT_SOURCE_DIR}/src/inc_internal/) -target_include_directories(maat_redis_tool PRIVATE ${PROJECT_SOURCE_DIR}/src/inc_internal/hiredis) +target_include_directories(maat_redis_tool PRIVATE hiredis-vip-static) diff --git a/tools/maat_redis_tool.cpp b/tools/maat_redis_tool.cpp index 8b0a53c..82931c5 100644 --- a/tools/maat_redis_tool.cpp +++ b/tools/maat_redis_tool.cpp @@ -91,6 +91,10 @@ void read_rule_from_redis(redisContext * ctx, long long desire_version, const ch assert(update_type==CM_UPDATE_TYPE_FULL); printf("MAAT Version: %lld, key number: %d\n", version, rule_num); + if(rule_num==0) + { + goto clean_up; + } printf("Reading value: "); ret=get_maat_redis_value(ctx,rule_list,rule_num,logger,1); if(ret<0) @@ -106,6 +110,20 @@ void read_rule_from_redis(redisContext * ctx, long long desire_version, const ch printf("mkdir %s error\n",output_path); } + char foreign_files_dir[256]; + snprintf(foreign_files_dir, sizeof(foreign_files_dir), "%s/foreign_files/",output_path); + if((access(foreign_files_dir,F_OK)) <0) + + { if((mkdir(foreign_files_dir,S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH)) < 0) + printf("mkdir %s error\n",foreign_files_dir); + + } + ret=get_foreign_keys_by_prefix(ctx, rule_list, rule_num, foreign_files_dir, logger); + if(ret>0) + { + printf("%d lines has foreign content.\n", ret); + get_foreign_conts(ctx, rule_list, rule_num, 1, logger); + } snprintf(index_path,sizeof(index_path),"%s/full_config_index.%020lld",output_path,version); index_fp=fopen(index_path,"w"); if(index_fp==NULL) @@ -116,6 +134,10 @@ void read_rule_from_redis(redisContext * ctx, long long desire_version, const ch for(i=0;i0) + { + rewrite_table_line_with_foreign(rule_list+i); + } if(cur_table==NULL||0!=strcmp(cur_table,rule_list[i].table_name)) { if(table_fp!=NULL) @@ -125,6 +147,7 @@ void read_rule_from_redis(redisContext * ctx, long long desire_version, const ch table_fp=NULL; set_file_rulenum(table_path,line_count, logger); line_count=0; + printf("Written table %s\n",table_path); } snprintf(table_path,sizeof(table_path),"%s/%s.%020lld",output_path,rule_list[i].table_name,version); set_file_rulenum(table_path, 0, logger); @@ -134,7 +157,7 @@ void read_rule_from_redis(redisContext * ctx, long long desire_version, const ch printf("Open %s failed.\n",table_path); goto clean_up; } - printf("Writing %s\n",table_path); + cur_table=rule_list[i].table_name; } fprintf(table_fp,"%s\tkey=%d\n",rule_list[i].table_line,rule_list[i].rule_id); @@ -145,7 +168,7 @@ void read_rule_from_redis(redisContext * ctx, long long desire_version, const ch fprintf(index_fp,"%s\t%d\t%s\n",cur_table,line_count,table_path); set_file_rulenum(table_path,line_count, logger); - printf("Writing complete: %s\n",index_path); + printf("Written complete: %s\n",index_path); clean_up: for(i=0;i -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}) -ExternalProject_Get_Property(googletest INSTALL_DIR) +ExternalProject_Get_Property(GoogleTest INSTALL_DIR) file(MAKE_DIRECTORY ${INSTALL_DIR}/include) add_library(gtest STATIC IMPORTED GLOBAL) set_property(TARGET gtest PROPERTY IMPORTED_LOCATION ${INSTALL_DIR}/lib/libgtest.a) set_property(TARGET gtest PROPERTY INTERFACE_INCLUDE_DIRECTORIES ${INSTALL_DIR}/include) -set_property(TARGET gtest PROPERTY INTERFACE_LINK_LIBRARIES pthread) \ No newline at end of file +set_property(TARGET gtest PROPERTY INTERFACE_LINK_LIBRARIES pthread) + +ExternalProject_Add(hiredis-vip PREFIX hiredis-vip + URL ${CMAKE_CURRENT_SOURCE_DIR}/hiredis-vip-0.3.0.tar.gz + URL_MD5 e4d4a2928188b11f696d35ca1c52e9a4 + CONFIGURE_COMMAND "" + BUILD_COMMAND make + INSTALL_COMMAND "" + BUILD_IN_SOURCE 1) + +ExternalProject_Get_Property(hiredis-vip SOURCE_DIR) +set(HTTP_PARSER_INCLUDE_DIRECTORIES ${SOURCE_DIR}) +file(MAKE_DIRECTORY ${HTTP_PARSER_INCLUDE_DIRECTORIES}) + +add_library(hiredis-vip-static STATIC IMPORTED GLOBAL) +set_property(TARGET hiredis-vip-static PROPERTY IMPORTED_LOCATION ${SOURCE_DIR}/libhiredis_vip.a) +set_property(TARGET hiredis-vip-static PROPERTY INTERFACE_INCLUDE_DIRECTORIES ${SOURCE_DIR}) diff --git a/vendor/googletest-release-1.8.0.tar.gz b/vendor/googletest-release-1.8.0.tar.gz new file mode 100644 index 0000000..a40df33 Binary files /dev/null and b/vendor/googletest-release-1.8.0.tar.gz differ diff --git a/vendor/hiredis-vip-0.3.0.tar.gz b/vendor/hiredis-vip-0.3.0.tar.gz new file mode 100644 index 0000000..cf88a1b Binary files /dev/null and b/vendor/hiredis-vip-0.3.0.tar.gz differ