2
* simple but fast map from str to Oid
3
* Teodor Sigaev <teodor@sigaev.ru>
14
compareSNMapEntry(const void *a, const void *b)
16
if (((SNMapEntry *) a)->nsp < ((SNMapEntry *) b)->nsp)
18
else if (((SNMapEntry *) a)->nsp > ((SNMapEntry *) b)->nsp)
21
return strcmp(((SNMapEntry *) a)->key, ((SNMapEntry *) b)->key);
25
addSNMap(SNMap * map, char *key, Oid value)
27
if (map->len >= map->reallen)
30
int len = (map->reallen) ? 2 * map->reallen : 16;
32
tmp = (SNMapEntry *) realloc(map->list, sizeof(SNMapEntry) * len);
35
(errcode(ERRCODE_OUT_OF_MEMORY),
36
errmsg("out of memory")));
40
map->list[map->len].key = strdup(key);
41
if (!map->list[map->len].key)
43
(errcode(ERRCODE_OUT_OF_MEMORY),
44
errmsg("out of memory")));
45
map->list[map->len].nsp = get_oidnamespace(TSNSP_FunctionOid);
46
map->list[map->len].value = value;
49
qsort(map->list, map->len, sizeof(SNMapEntry), compareSNMapEntry);
53
addSNMap_t(SNMap * map, text *key, Oid value)
55
char *k = text2char(key);
57
addSNMap(map, k, value);
62
findSNMap(SNMap * map, char *key)
68
ks.nsp = get_oidnamespace(TSNSP_FunctionOid);
71
if (map->len == 0 || !map->list)
73
ptr = (SNMapEntry *) bsearch(&ks, map->list, map->len, sizeof(SNMapEntry), compareSNMapEntry);
74
return (ptr) ? ptr->value : 0;
78
findSNMap_t(SNMap * map, text *key)
80
char *k = text2char(key);
83
res = findSNMap(map, k);
89
freeSNMap(SNMap * map)
91
SNMapEntry *entry = map->list;
104
memset(map, 0, sizeof(SNMap));