/*make a new hashset from multi_string*/ T_KRHashSet *kr_hashset_make(E_KRType key_type, char *multi_string) { T_KRHashSet *krhashset = kr_hashset_create(multi_string, key_type); if (krhashset == NULL) { return NULL; } char *str = kr_strdup(multi_string); char *save_str = NULL; char *p = strtok_r(str, ",", &save_str); U_KRValue val; while(p) { switch(krhashset->type) { case KR_TYPE_INT: val.i=atoi(p); kr_hashset_add(krhashset, &val.i); break; case KR_TYPE_DOUBLE: val.d=atof(p); kr_hashset_add(krhashset, &val.d); break; case KR_TYPE_STRING: p = p+1; p[strlen(p)-1] = '\0'; val.s=p; kr_hashset_add(krhashset, val.s); break; } p=strtok_r(NULL, ",", &save_str); } kr_free(str); return krhashset; }
/*create a new set*/ T_KRHashSet *kr_hashset_create(char *name, E_KRType key_type) { T_KRHashSet *krset = (T_KRHashSet *)kr_calloc(sizeof(T_KRHashSet)); krset->name = (char *)kr_strdup(name); krset->type = key_type; KRHashFunc hash_func = kr_get_hash_func(key_type); KREqualFunc equal_func = kr_get_equal_func(key_type); krset->set = kr_hashtable_new_full(hash_func, equal_func, kr_free, NULL); return krset; }
T_KRCalc *kr_calc_construct(E_KRCalcFormat format, char *calcstr) { T_KRCalc *krcalc = (T_KRCalc *)kr_calloc(sizeof(T_KRCalc)); krcalc->calc_format = format; krcalc->calc_string = kr_strdup(calcstr); krcalc->get_type_cb = kr_data_get_type; krcalc->get_value_cb = kr_data_get_value; if (kr_calc_parse(krcalc) != 0) { fprintf(stderr, "kr_calc_parse failed[%s]!\n", krcalc->err_msg); return NULL; } kr_calc_dump(krcalc, stdout); return krcalc; }
static int kr_server_argument_parse(int argc, char *argv[]) { int opt; while ((opt = getopt(argc, argv, "c:h")) != -1) { switch(opt) { case 'c': krserver.configfile = kr_strdup(optarg); break; case 'h': kr_server_usage(); break; default: fprintf(stderr, "Unrecognized option: -%c.", optopt); kr_server_usage(); return -1; } } return 0; }
int main() { void *pMalloc=NULL; size_t malloc_size = 100; pMalloc = kr_malloc(malloc_size); assert(pMalloc != NULL); pMalloc = kr_realloc(pMalloc, malloc_size*2); assert(pMalloc != NULL); kr_free(pMalloc); char *pStrDup = kr_strdup("Tiger"); assert(pStrDup != NULL); printf("pStrDup=[%s]\n", pStrDup); kr_free(pStrDup); int i=0; char *paMalloc[100]; for(i=0; i<100; i++) { paMalloc[i] = (char *)kr_malloc(malloc_size*i); assert(paMalloc[i] != NULL); } printf("used memory:[%u], fragmentation_ratio:[%f], rss:[%u]\n", \ kr_malloc_used_memory(), kr_malloc_get_fragmentation_ratio(), kr_malloc_get_rss()); for(i=0; i<100; i++) { kr_free(paMalloc[i]); } return 0; }
int kr_sdi_aggr_func(T_KRSDI *krsdi, T_KRContext *krcontext) { int iResult = -1; int iAbsLoc = -1; int iRelLoc = -1; T_KRListNode *node = krcontext->ptRecList->tail; while(node) { krcontext->ptRecord = (T_KRRecord *)kr_list_value(node); iAbsLoc++; /*绝对位置加一*/ /*数据项绝对统计定位校验*/ if (krsdi->ptShmSDIDef->caLocationProperty[0] == KR_LOC_ABSOLUTE) { if (krsdi->ptShmSDIDef->lStatisticsLocation != iAbsLoc) { node = node->prev; continue; } } /*统计数据源校验*/ if (((T_KRTable *)krcontext->ptRecord->ptTable)->iTableId != \ krsdi->ptShmSDIDef->lStatisticsDatasrc) { node = node->prev; continue; } /*过滤器校验*/ iResult = kr_calc_eval(krsdi->ptSDICalc, krcontext); if (iResult != 0) { KR_LOG(KR_LOGERROR, "kr_calc_eval [%ld] failed!", krsdi->lSDIId); return -1; } else if (krsdi->ptSDICalc->result_type != KR_TYPE_BOOL) { KR_LOG(KR_LOGERROR, "result_type of sdi_calc must be boolean!"); return -1; } else if (krsdi->ptSDICalc->result_ind != KR_VALUE_SETED || !krsdi->ptSDICalc->result_value.b) { node = node->prev; continue; } iRelLoc++; /*相对位置加一*/ /*数据项相对统计定位校验*/ if (krsdi->ptShmSDIDef->caLocationProperty[0] == KR_LOC_RELATIVE) { if (krsdi->ptShmSDIDef->lStatisticsLocation != iRelLoc) { node = node->prev; continue; } } /*获取数据项值*/ void *val = kr_get_field_value(krcontext->ptRecord, \ krsdi->ptShmSDIDef->lStatisticsField); switch(krsdi->eValueType) { case KR_TYPE_INT: krsdi->uValue.i = *(int *)val; break; case KR_TYPE_LONG: krsdi->uValue.l = *(long *)val; break; case KR_TYPE_DOUBLE: krsdi->uValue.d = *(double *)val; break; case KR_TYPE_STRING: krsdi->uValue.s = kr_strdup(val); break; default: KR_LOG(KR_LOGERROR, "Bad FieldType [%c]!", krsdi->eValueType); return -1; } /*add this record to related*/ kr_hashtable_insert(krsdi->ptRelated, \ krcontext->ptRecord, krcontext->ptRecord); /* This is what the difference between SDI and DDI: * SDI only set once, while DDI still need to traversal all the list */ krsdi->eValueInd = KR_VALUE_SETED; break; node = node->prev; } return 0; }