static void kr_rebuild_index_del(T_KRIndexTable *ptIndextable, T_KRRecord *ptRecord) { void *key = kr_field_get_value(ptRecord, ptIndextable->iIndexFieldId); T_KRHashTable *pHashTable = ptIndextable->ptIndex->pHashTable; T_KRIndexSolt *ptIndexSlot = kr_hashtable_lookup(pHashTable, key); if (ptIndexSlot != NULL) { /*modify statistical fields of external*/ if (kr_get_proctime(ptRecord) > ptIndexSlot->tExtMaxProcTime) { ptIndexSlot->tExtMaxProcTime = kr_get_proctime(ptRecord); } if (kr_get_transtime(ptRecord) > ptIndexSlot->tExtMaxTransTime) { ptIndexSlot->tExtMaxTransTime = kr_get_transtime(ptRecord); } /*remove record from list*/ kr_list_remove(ptIndexSlot->pRecList, ptRecord); /*free this slot if there is no records*/ if (kr_list_length(ptIndexSlot->pRecList) == 0 ) { kr_hashtable_remove(pHashTable, ptIndexSlot->pKeyValue); kr_list_destroy(ptIndexSlot->pRecList); kr_free(ptIndexSlot->pKeyValue); kr_free(ptIndexSlot); } } }
static T_KRDataItem *kr_data_item_get(T_KRData *ptData, char kind, int id, T_KRContext *ptContext) { char caDataItemId[20+1] = {0}; snprintf(caDataItemId, sizeof(caDataItemId), "%c_%d", kind, id); T_KRDataItem *ptDataItem = kr_hashtable_lookup(ptData->ptItemTable, caDataItemId); if (ptDataItem == NULL) { KR_LOG(KR_LOGERROR, "kr_hashtable_lookup [%c]:[%d] failed!", kind, id); return NULL; } //check whether computed yet, that is record level cache T_KRRecord *ptCurrRec = kr_context_get_data(ptContext, "curr_rec"); if (ptDataItem->ptCurrRec != ptCurrRec) { ptDataItem->ptCurrRec = ptCurrRec; if (ptDataItem->pfDataItemAggr != NULL) { if (ptDataItem->pfDataItemAggr(ptDataItem, ptContext) != 0) { KR_LOG(KR_LOGERROR, "pfDataItemAggr [%c]:[%d] failed!", kind, id); return NULL; } } } else { KR_LOG(KR_LOGDEBUG, "Get [%c]:[%d] record level cached!", kind, id); } return ptDataItem; }
static void kr_rebuild_index_ins(T_KRIndexTable *ptIndextable, T_KRRecord *ptRecord) { void *key = kr_field_get_value(ptRecord, ptIndextable->iIndexFieldId); T_KRHashTable *pHashTable = ptIndextable->ptIndex->pHashTable; T_KRIndexSolt *ptIndexSlot = kr_hashtable_lookup(pHashTable, key); if (ptIndexSlot == NULL) { /*create slot if not found*/ ptIndexSlot = kr_calloc(sizeof(*ptIndexSlot)); ptIndexSlot->eKeyType = kr_field_get_type(ptRecord, ptIndextable->iIndexFieldId); KRDupFunc pfKeyDup = kr_get_dup_func(ptIndexSlot->eKeyType); ptIndexSlot->pKeyValue = pfKeyDup(key); ptIndexSlot->tLocMinProcTime = kr_get_proctime(ptRecord); ptIndexSlot->tLocMinTransTime = kr_get_transtime(ptRecord); ptIndexSlot->tExtMaxProcTime = kr_get_proctime(ptRecord); ptIndexSlot->tExtMaxTransTime = kr_get_transtime(ptRecord); ptIndexSlot->pRecList = kr_list_new(); kr_hashtable_insert(pHashTable, ptIndexSlot->pKeyValue, ptIndexSlot); } /*modify statistical fields of local*/ if (kr_get_proctime(ptRecord) < ptIndexSlot->tLocMinProcTime) { ptIndexSlot->tLocMinProcTime = kr_get_proctime(ptRecord); } if (kr_get_transtime(ptRecord) < ptIndexSlot->tLocMinTransTime) { ptIndexSlot->tLocMinTransTime = kr_get_transtime(ptRecord); } /*add record to list*/ kr_list_add_tail(ptIndexSlot->pRecList, ptRecord); }
/* search an element in a krset * return TURE while found, FALSE for else */ kr_bool kr_hashset_search(T_KRHashSet *krset, const void *element) { void *entry = kr_hashtable_lookup(krset->set, element); if (entry != NULL) { return TRUE; } return FALSE; }
E_KRType kr_set_get_type(int aid, T_KRData *ptData) { if (ptData == NULL) return KR_TYPE_UNKNOWN; long lAid = (long )aid; T_KRSetTable *ptSetTable = ptData->ptSetTable; if (ptSetTable == NULL) { KR_LOG(KR_LOGERROR, "ptSetTable is null"); return KR_TYPE_UNKNOWN; } T_KRSet *ptSet = kr_hashtable_lookup(ptSetTable->ptSetTable, &lAid); if (ptSet == NULL) return KR_TYPE_UNKNOWN; return ptSet->eValueType; }
void *kr_set_get_value(int aid, T_KRData *ptData) { if (ptData == NULL) return NULL; long lAID = (long )aid; T_KRSetTable *ptSetTable = ptData->ptSetTable; if (ptSetTable == NULL) { KR_LOG(KR_LOGERROR, "ptSetTable is null"); return NULL; } T_KRSet *ptSet = kr_hashtable_lookup(ptSetTable->ptSetTable, &lAID); if (ptSet == NULL) return NULL; return ptSet->ptHashSet; }
static void kr_rebuild_index_ins(T_KRIndex *krindex, T_KRRecord *krrecord) { void *key = kr_get_field_value(krrecord, krindex->iIndexFieldId); T_KRList *pRecList = kr_hashtable_lookup(krindex->pHashTable, key); if (pRecList == NULL) { pRecList = kr_list_new(); kr_list_set_compare(pRecList, (KRCompareDataFunc)kr_db_field_compare); } if (krindex->iSortFieldId >= 0) { kr_list_add_sorted(pRecList, krrecord, &krindex->iSortFieldId); } else { kr_list_add_tail(pRecList, krrecord); } kr_hashtable_replace(krindex->pHashTable, key, pRecList); }
T_KRHdiCacheValue *kr_hdi_cache_get(T_KRCache *cache, void *key, long hid) { T_KRHdiCacheValue *hdi_cache_val = NULL; T_KRHashTable *node = kr_cache_get(cache, key); if (node != NULL) { hdi_cache_val = kr_hashtable_lookup(node, &hid); } else { node = kr_hashtable_new_full(kr_long_hash, kr_long_equal, \ NULL, (KRDestroyNotify )kr_hdi_cache_value_free); kr_cache_set(cache, key, node); } if (hdi_cache_val == NULL) { hdi_cache_val = kr_hdi_cache_value_new(hid); kr_hashtable_replace(node, &hdi_cache_val->lHDIId, hdi_cache_val); } return hdi_cache_val; }
static void kr_coordi_read_handler(T_KREventLoop *el, int fd, void *priv, int mask) { int ret = 0; T_KRMessage stMsg = {0}; /** read message */ T_KRMessage *ptMsg = kr_message_read(fd); if (ptMsg == NULL) { /* read message failure */ KR_LOG(KR_LOGERROR, "read message error[%s]!", krcoordi.neterr); T_KRCoordiConnector *ptConn = NULL; /* find server or client with fd, then free it */ ptConn = kr_hashtable_lookup(krcoordi.fdtable, &fd); if (ptConn == NULL) { kr_event_file_delete(el, fd, KR_EVENT_READABLE); close(fd); return; } /* handle it as connector offline */ if (ptConn->role == KR_COORDI_SERVER) { stMsg.msgtype = KR_MSGTYPE_SVROFF; strcpy(stMsg.serverid, ptConn->id); } else { stMsg.msgtype = KR_MSGTYPE_CLIOFF; strcpy(stMsg.clientid, ptConn->id); } ptMsg = &stMsg; } /** handle message */ ret = kr_coordi_handle_message(el, fd, ptMsg); if (ret != 0) {/* handle message failure */ KR_LOG(KR_LOGERROR, "handle message [%d], [%s]error!", \ ptMsg->msgtype, ptMsg->msgbuf); return; } }
static void kr_rebuild_index_del(T_KRIndex *krindex, T_KRRecord *krrecord) { void *key = kr_get_field_value(krrecord, krindex->iIndexFieldId); T_KRList *pRecList = kr_hashtable_lookup(krindex->pHashTable, key); if (pRecList != NULL) kr_list_remove(pRecList, krrecord); if (kr_list_length(pRecList) != 0 ) { T_KRRecord *ptRecord = kr_list_value(kr_list_last(pRecList)); T_KRIndex *newIndex = krindex; /* the dropped record and the last record of current list * belongs to different tables */ if (krrecord->ptTable != ptRecord->ptTable) { newIndex = kr_get_table_index(ptRecord->ptTable, krindex->iIndexId); } key = kr_get_field_value(ptRecord, newIndex->iIndexFieldId); kr_hashtable_replace(newIndex->pHashTable, key, pRecList); } else { kr_list_destroy(pRecList); kr_hashtable_remove(krindex->pHashTable, key); } }
T_KRList* kr_get_record_list(T_KRIndex *krindex, void *key) { T_KRList *pRecList = kr_hashtable_lookup(krindex->pHashTable, key); return pRecList; }
T_KRHDI *kr_hdi_lookup(T_KRHDITable *ptHdiTable, int id) { long lHID = (long )id; return kr_hashtable_lookup(ptHdiTable->ptHDITable, &lHID); }
T_KRDDI *kr_ddi_lookup(T_KRDDITable *ptDdiTable, int id) { long lDID = (long )id; return kr_hashtable_lookup(ptDdiTable->ptDDITable, &lDID); }