Line data Source code
1 : /*
2 : * SPDX-License-Identifier: MPL-2.0
3 : *
4 : * This Source Code Form is subject to the terms of the Mozilla Public
5 : * License, v. 2.0. If a copy of the MPL was not distributed with this
6 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
7 : *
8 : * Copyright 2024 MonetDB Foundation;
9 : * Copyright August 2008 - 2023 MonetDB B.V.;
10 : * Copyright 1997 - July 2008 CWI.
11 : */
12 :
13 : #include "monetdb_config.h"
14 : #include "sql_catalog.h"
15 : #include "sql_storage.h"
16 :
17 : #include "gdk_atoms.h"
18 :
19 : static inline int
20 1173 : node_key( node *n )
21 : {
22 1173 : sql_base *b = n->data;
23 0 : return hash_key(b->name);
24 : }
25 :
26 : objlist *
27 379844 : ol_new(allocator *sa, destroy_fptr destroy, sql_store store)
28 : {
29 379844 : objlist *ol = SA_NEW(sa, objlist);
30 759688 : *ol = (objlist) {
31 379844 : .l = list_new(sa, (fdestroy)destroy),
32 379843 : .h = hash_new(sa, 16, (fkeyvalue)&node_key),
33 : .store = store
34 : };
35 379844 : return ol;
36 : }
37 :
38 : void
39 242864 : ol_destroy(objlist *ol, sql_store store)
40 : {
41 242864 : if (!ol->l->sa) {
42 242864 : hash_destroy(ol->h);
43 242864 : list_destroy2(ol->l, store);
44 242864 : _DELETE(ol);
45 : }
46 242864 : }
47 :
48 : int
49 786273 : ol_add(objlist *ol, sql_base *data)
50 : {
51 786273 : list *l = list_append(ol->l, data);
52 786273 : if (!l) {
53 0 : if (ol->l->destroy)
54 0 : ol->l->destroy(ol->store, data);
55 0 : return -1;
56 : }
57 786273 : node *n = l->t;
58 786273 : assert(n->data == data);
59 786273 : int sz = list_length(ol->l);
60 786273 : if (ol->h->size <= sz) {
61 7117 : hash_destroy(ol->h);
62 7117 : ol->h = hash_new(ol->l->sa, 4*sz, (fkeyvalue)&node_key);
63 7117 : if (ol->h == NULL)
64 : return -1;
65 191789 : for (node *n = ol->l->h; n; n = n->next) {
66 184672 : if (hash_add(ol->h, base_key(n->data), n) == NULL)
67 : /* No need to clean, ie expect a full transaction rollback */
68 : return -1;
69 : }
70 : } else {
71 779156 : if (hash_add(ol->h, base_key(data), n) == NULL)
72 : /* No need to clean, ie expect a full transaction rollback */
73 : return -1;
74 : }
75 : return 0;
76 : }
77 :
78 : void
79 1160 : ol_del(objlist *ol, sql_store store, node *n)
80 : {
81 2320 : hash_del(ol->h, node_key(n), n);
82 1160 : list_remove_node(ol->l, store, n);
83 1160 : }
84 :
85 : node *
86 13 : ol_rehash(objlist *ol, const char *oldname, node *n)
87 : {
88 26 : hash_del(ol->h, hash_key(oldname), n);
89 26 : if (hash_add(ol->h, node_key(n), n) == NULL)
90 0 : return NULL;
91 : return n;
92 : }
93 :
94 : node *
95 14934294 : ol_find_name(objlist *ol, const char *name)
96 : {
97 14934294 : int key = hash_key(name);
98 14934294 : sql_hash_e *he = ol->h->buckets[key&(ol->h->size-1)];
99 :
100 17378541 : for (; he; he = he->chain) {
101 13900599 : node *n = he->value;
102 13900599 : sql_base *b = n->data;
103 :
104 13900599 : if (b->name && strcmp(b->name, name) == 0)
105 11456352 : return n;
106 : }
107 : return NULL;
108 : }
109 :
110 36964 : node *ol_find_id(objlist *ol, sqlid id)
111 : {
112 : /* if needed we could add hash on id's as well */
113 1371070 : for (node *n = ol->l->h; n; n = n->next) {
114 1370972 : sql_base *b = n->data;
115 1370972 : if (b->id == id)
116 36866 : return n;
117 : }
118 : return NULL;
119 : }
|