boolean OCI_HashAdd ( OCI_HashTable *table, const otext *key, OCI_Variant value, unsigned int type ) { OCI_HashEntry * e = NULL; OCI_HashValue * v = NULL, *v1 = NULL, *v2 = NULL; boolean res = FALSE; OCI_CHECK(NULL == table, FALSE) OCI_CHECK(NULL == key, FALSE) OCI_CHECK(table->type != type, FALSE) e = OCI_HashLookup(table, key, TRUE); if (e) { v = (OCI_HashValue *)OCI_MemAlloc(OCI_IPC_HASHVALUE, sizeof(*v), (size_t)1, TRUE); if (v) { if (OCI_HASH_STRING == table->type && value.p_text) { v->value.p_text = ostrdup(value.p_text); } else if (OCI_HASH_INTEGER == table->type) { v->value.num = value.num; } else { v->value.p_void = value.p_void; } v1 = v2 = e->values; while (v1) { v2 = v1; v1 = v1->next; } if (v2) { v2->next = v; } else { e->values = v; } res = TRUE; } } return res; }
boolean OCI_HashAdd ( OCI_HashTable *table, const mtext *key, OCI_Variant value, unsigned int type ) { OCI_HashEntry * e = NULL; OCI_HashValue * v = NULL, *v1 = NULL, *v2 = NULL; OCI_CHECK(table == NULL, FALSE); OCI_CHECK(key == NULL, FALSE); OCI_CHECK(table->type != type, FALSE); e = OCI_HashLookup(table, key, TRUE); if (e != NULL) { v = (OCI_HashValue *) OCI_MemAlloc(OCI_IPC_HASHVALUE, sizeof(*v), (size_t) 1, TRUE); if (v != NULL) { if (table->type == OCI_HASH_STRING && value.p_mtext != NULL) { v->value.p_mtext = mtsdup(value.p_mtext); } else if (table->type == OCI_HASH_INTEGER) { v->value.num = value.num; } else { v->value.p_void = value.p_void; } v1 = v2 = e->values; while (v1 != NULL) { v2 = v1; v1 = v1->next; } if (v2 != NULL) { v2->next = v; } else { e->values = v; } } } return (v != NULL); }
int OCI_GetDefineIndex ( OCI_Resultset *rs, const otext *name ) { OCI_HashEntry *he = NULL; int index = -1; if (!rs->map) { /* create the map at the first call to OCI_Getxxxxx2() to save time and memory when it's not needed */ rs->map = OCI_HashCreate(OCI_HASH_DEFAULT_SIZE, OCI_HASH_INTEGER); if (rs->map) { ub4 i; for (i = 0; i < rs->nb_defs; i++) { OCI_HashAddInt(rs->map, rs->defs[i].col.name, (i+1)); } } } /* check out we got our map object */ OCI_CHECK(NULL == rs->map, -1); he = OCI_HashLookup(rs->map, name, FALSE); while (he) { /* no more entries or key matched => so we got it ! */ if (!he->next || 0 == ostrcasecmp(he->key, name)) { index = he->values->value.num; break; } he = he->next; } if (index < 0) { OCI_ExceptionItemNotFound(rs->stmt->con, rs->stmt, name, OCI_IPC_COLUMN); } return index; }
OCI_HashValue * OCI_API OCI_HashGetValue ( OCI_HashTable *table, const mtext *key ) { OCI_HashEntry *e = NULL; OCI_HashValue *v = NULL; OCI_CHECK_PTR(OCI_IPC_HASHTABLE, table, NULL); e = OCI_HashLookup(table, key, FALSE); if (e != NULL) { v = e->values; } OCI_RESULT(v != NULL); return v; }
OCI_HashValue * OCI_API OCI_HashGetValue ( OCI_HashTable *table, const otext *key ) { OCI_HashEntry *e = NULL; OCI_LIB_CALL_ENTER(OCI_HashValue*, NULL) OCI_CHECK_PTR(OCI_IPC_HASHTABLE, table) e = OCI_HashLookup(table, key, FALSE); if (e) { call_retval = e->values; } call_status = TRUE; OCI_LIB_CALL_EXIT() }