CUBRID Engine  latest
oid.c
Go to the documentation of this file.
1 /*
2  * Copyright 2008 Search Solution Corporation
3  * Copyright 2016 CUBRID Corporation
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  *
9  * http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  *
17  */
18 
19 /*
20  * oid.c - object identifier (OID) module (at client and server)
21  */
22 
23 #ident "$Id$"
24 
25 #include "config.h"
26 
27 #include <assert.h>
28 
29 #include "oid.h"
30 #include "transform.h"
31 
34 {
35  OID *oid;
36  const char *class_name;
37 };
38 
39 static OID oid_Root_class = { 0, 0, 0 };
40 static OID oid_Serial_class = { 0, 0, 0 };
41 static OID oid_Partition_class = { 0, 0, 0 };
42 static OID oid_Collation_class = { 0, 0, 0 };
43 static OID oid_HA_apply_info_class = { 0, 0, 0 };
44 static OID oid_Class_class = { 0, 0, 0 };
45 static OID oid_Attribute_class = { 0, 0, 0 };
46 static OID oid_Domain_class = { 0, 0, 0 };
47 static OID oid_Method_class = { 0, 0, 0 };
48 static OID oid_Methsig_class = { 0, 0, 0 };
49 static OID oid_Metharg_class = { 0, 0, 0 };
50 static OID oid_Methfile_class = { 0, 0, 0 };
51 static OID oid_Queryspec_class = { 0, 0, 0 };
52 static OID oid_Index_class = { 0, 0, 0 };
53 static OID oid_Indexkey_class = { 0, 0, 0 };
54 static OID oid_Datatype_class = { 0, 0, 0 };
55 static OID oid_Classauth_class = { 0, 0, 0 };
56 static OID oid_Stored_proc_class = { 0, 0, 0 };
57 static OID oid_Stored_proc_args_class = { 0, 0, 0 };
58 static OID oid_Charset_class = { 0, 0, 0 };
59 static OID oid_Trigger_class = { 0, 0, 0 };
60 static OID oid_User_class = { 0, 0, 0 };
61 static OID oid_Password_class = { 0, 0, 0 };
62 static OID oid_Authorization_class = { 0, 0, 0 };
63 static OID oid_Authorizations_class = { 0, 0, 0 };
64 static OID oid_DB_root_class = { 0, 0, 0 };
65 
66 static OID oid_Rep_Read_Tran = { 0, (short int) 0x8000, 0 };
67 
69 
71 
72 /* ROOT_CLASS OID values. Set during restart/initialization.*/
74 
75 
79 
80 
82  {&oid_Root_class, NULL}, /* Root class is not identifiable by a name */
108 };
109 
110 /*
111  * oid_set_root() - Set the value of the root oid to the given value
112  * return: void
113  * oid(in): Rootoid value
114  *
115  * Note: This function is used during restart/initialization.
116  */
117 void
119 {
120  oid_Root_class_oid = &oid_Root_class;
121  if (oid != oid_Root_class_oid)
122  {
123  oid_Root_class_oid->volid = oid->volid;
124  oid_Root_class_oid->pageid = oid->pageid;
125  oid_Root_class_oid->slotid = oid->slotid;
126  }
127 }
128 
129 /*
130  * oid_is_root() - Find out if the passed oid is the root oid
131  * return: true/false
132  * oid(in): Object identifier
133  */
134 bool
135 oid_is_root (const OID * oid)
136 {
137  return OID_EQ (oid, oid_Root_class_oid);
138 }
139 
140 /*
141  * oid_set_serial () - Store serial class OID
142  *
143  * return :
144  * oid (in) :
145  */
146 void
148 {
149  COPY_OID (oid_Serial_class_oid, oid);
150 }
151 
152 /*
153  * ois_is_serial () - Compare OID with serial class OID.
154  *
155  * return :
156  * const OID * oid (in) :
157  */
158 bool
160 {
161  return OID_EQ (oid, oid_Serial_class_oid);
162 }
163 
164 /*
165  * oid_get_serial_oid () - Get serial class OID
166  *
167  * return : Void.
168  * oid (out) : Serial class OID.
169  */
170 void
172 {
173  COPY_OID (oid, oid_Serial_class_oid);
174 }
175 
176 /*
177  * oid_set_partition () - Store _db_partition class OID
178  *
179  * return :
180  * oid (in) :
181  */
182 void
184 {
185  COPY_OID (oid_Partition_class_oid, oid);
186 }
187 
188 /*
189  * ois_is_partition () - Compare OID with partition class OID.
190  *
191  * return :
192  * const OID * oid (in) :
193  */
194 bool
196 {
197  return OID_EQ (oid, oid_Partition_class_oid);
198 }
199 
200 /*
201  * oid_get_partition_oid () - Get partition class OID
202  *
203  * return : Void.
204  * oid (out) : Serial class OID.
205  */
206 void
208 {
209  COPY_OID (oid, oid_Partition_class_oid);
210 }
211 
212 /*
213  * oid_is_db_class () - Is this OID of db_class?
214  *
215  * return : True/false.
216  * oid (in) : Check OID.
217  */
218 bool
220 {
221  return OID_EQ (oid, &oid_Class_class);
222 }
223 
224 /*
225  * oid_is_db_attribute () - Is this OID of db_attribute?
226  *
227  * return : True/false.
228  * oid (in) : Check OID.
229  */
230 bool
232 {
233  return OID_EQ (oid, &oid_Attribute_class);
234 }
235 
236 /*
237  * oid_compare() - Compare two oids
238  * return: 0 (oid1 == oid2), 1 (oid1 > oid2), -1 (oid1 < oid2)
239  * a(in): Object identifier of first object
240  * b(in): Object identifier of second object
241  */
242 int
243 oid_compare (const void *a, const void *b)
244 {
245  const OID *oid1_p = (const OID *) a;
246  const OID *oid2_p = (const OID *) b;
247  int diff;
248 
249  if (oid1_p == oid2_p)
250  {
251  return 0;
252  }
253 
254  diff = oid1_p->volid - oid2_p->volid;
255  if (diff > 0)
256  {
257  return 1;
258  }
259  else if (diff < 0)
260  {
261  return -1;
262  }
263 
264  diff = oid1_p->pageid - oid2_p->pageid;
265  if (diff > 0)
266  {
267  return 1;
268  }
269  else if (diff < 0)
270  {
271  return -1;
272  }
273 
274  diff = oid1_p->slotid - oid2_p->slotid;
275  if (diff > 0)
276  {
277  return 1;
278  }
279  else if (diff < 0)
280  {
281  return -1;
282  }
283 
284  return 0;
285 }
286 
287 /*
288  * oid_hash() - Hash OIDs
289  * return: hash value
290  * key_oid(in): OID to hash
291  * htsize(in): Size of hash table
292  */
293 unsigned int
294 oid_hash (const void *key_oid, unsigned int htsize)
295 {
296  unsigned int hash;
297  const OID *oid = (OID *) key_oid;
298 
299  hash = OID_PSEUDO_KEY (oid);
300  return (hash % htsize);
301 }
302 
303 /*
304  * oid_compare_equals() - Compare oids key for hashing
305  * return:
306  * key_oid1: First key
307  * key_oid2: Second key
308  */
309 int
310 oid_compare_equals (const void *key_oid1, const void *key_oid2)
311 {
312  const OID *oid1 = (OID *) key_oid1;
313  const OID *oid2 = (OID *) key_oid2;
314 
315  return OID_EQ (oid1, oid2);
316 }
317 
318 /*
319  * oid_is_cached_class_oid () - Compare OID with the cached OID identified by
320  * cache_id
321  *
322  * return :
323  * cache_id (in) :
324  * oid (in) :
325  */
326 bool
327 oid_check_cached_class_oid (const int cache_id, const OID * oid)
328 {
329  return OID_EQ (oid, oid_Cache[cache_id].oid);
330 }
331 
332 /*
333  * oid_set_cached_class_oid () - Sets the cached value of OID
334  *
335  * cache_id (in) :
336  * oid (in) :
337  */
338 void
339 oid_set_cached_class_oid (const int cache_id, const OID * oid)
340 {
341  COPY_OID (oid_Cache[cache_id].oid, oid);
342 }
343 
344 /*
345  * oid_get_cached_class_name () - get the name of cached class
346  *
347  * return :
348  * cache_id (in) :
349  */
350 const char *
351 oid_get_cached_class_name (const int cache_id)
352 {
353  return oid_Cache[cache_id].class_name;
354 }
355 
356 /*
357  * oid_is_cached_class_oid () - Used to find a class OID in the cache.
358  * Currently only used for system classes.
359  *
360  * return : true/false if found
361  * class_oid (in): class OID to search for
362  */
363 bool
364 oid_is_cached_class_oid (const OID * class_oid)
365 {
366  int i;
367 
368  for (i = OID_CACHE_ROOT_CLASS_ID; i < OID_CACHE_SIZE; i++)
369  {
370  if (OID_EQ (oid_Cache[i].oid, class_oid))
371  {
372  return true;
373  }
374  }
375 
376  return false;
377 }
378 
379 /*
380  * oid_get_rep_read_tran_oid () - Get OID that is used for RR transactions
381  * locking.
382  *
383  * return : return the OID.
384  */
385 OID *
387 {
388  return &oid_Rep_Read_Tran;
389 }
390 
391 /*
392  * oid_is_system_class () - Check if class identified with class_oid is
393  * system class.
394  *
395  * return : Error code.
396  * class_oid (in) : Class object identifier.
397  * is_system_class_p (out) : True is class is a system class.
398  */
399 bool
400 oid_is_system_class (const OID * class_oid)
401 {
402  assert (class_oid != NULL && !OID_ISNULL (class_oid));
403 
404  return oid_is_cached_class_oid (class_oid);
405 }
#define CT_ATTRIBUTE_NAME
Definition: transform.h:120
static OID oid_User_class
Definition: oid.c:60
#define CT_DATATYPE_NAME
Definition: transform.h:131
OID * oid_Root_class_oid
Definition: oid.c:73
#define CT_CLASSAUTH_NAME
Definition: transform.h:130
bool oid_is_db_attribute(const OID *oid)
Definition: oid.c:231
static OID oid_Indexkey_class
Definition: oid.c:53
OID * oid_User_class_oid
Definition: oid.c:78
#define CT_METHOD_NAME
Definition: transform.h:122
static OID oid_Serial_class
Definition: oid.c:40
#define CT_AUTHORIZATIONS_NAME
Definition: transform.h:143
static OID oid_Attribute_class
Definition: oid.c:45
void oid_set_cached_class_oid(const int cache_id, const OID *oid)
Definition: oid.c:339
const char * class_name
Definition: oid.c:36
static OID oid_Method_class
Definition: oid.c:47
OID * oid_Partition_class_oid
Definition: oid.c:77
#define CT_DOMAIN_NAME
Definition: transform.h:121
#define CT_METHSIG_NAME
Definition: transform.h:123
static OID oid_Domain_class
Definition: oid.c:46
#define CT_AUTHORIZATION_NAME
Definition: transform.h:142
bool oid_is_system_class(const OID *class_oid)
Definition: oid.c:400
bool oid_is_serial(const OID *oid)
Definition: oid.c:159
#define NULL_SLOTID
#define diff
Definition: mprec.h:352
void oid_set_root(const OID *oid)
Definition: oid.c:118
static OID oid_Datatype_class
Definition: oid.c:54
#define CT_STORED_PROC_NAME
Definition: transform.h:132
#define CT_METHFILE_NAME
Definition: transform.h:125
bool oid_is_cached_class_oid(const OID *class_oid)
Definition: oid.c:364
#define CT_CLASS_NAME
Definition: transform.h:119
#define CT_PARTITION_NAME
Definition: transform.h:134
#define COPY_OID(dest_oid_ptr, src_oid_ptr)
Definition: oid.h:63
const char * oid_get_cached_class_name(const int cache_id)
Definition: oid.c:351
#define NULL_PAGEID
#define CT_SERIAL_NAME
Definition: transform.h:135
static OID oid_Trigger_class
Definition: oid.c:59
#define OID_PSEUDO_KEY(oidp)
Definition: oid.h:130
static OID oid_Stored_proc_args_class
Definition: oid.c:57
#define CT_STORED_PROC_ARGS_NAME
Definition: transform.h:133
void oid_set_serial(const OID *oid)
Definition: oid.c:147
#define CT_HA_APPLY_INFO_NAME
Definition: transform.h:136
static OID oid_HA_apply_info_class
Definition: oid.c:43
static OID oid_Collation_class
Definition: oid.c:42
#define assert(x)
static OID oid_Stored_proc_class
Definition: oid.c:56
bool oid_is_root(const OID *oid)
Definition: oid.c:135
OID * oid
Definition: oid.c:35
#define CT_USER_NAME
Definition: transform.h:138
static OID oid_Rep_Read_Tran
Definition: oid.c:66
static OID oid_Partition_class
Definition: oid.c:41
#define OID_EQ(oidp1, oidp2)
Definition: oid.h:92
OID * oid_get_rep_read_tran_oid(void)
Definition: oid.c:386
OID * oid_Serial_class_oid
Definition: oid.c:76
#define CT_INDEX_NAME
Definition: transform.h:128
#define NULL
Definition: freelistheap.h:34
OID_CACHE_ENTRY oid_Cache[OID_CACHE_SIZE]
Definition: oid.c:81
Definition: btree.h:536
#define CT_METHARG_NAME
Definition: transform.h:124
void oid_set_partition(const OID *oid)
Definition: oid.c:183
unsigned int oid_hash(const void *key_oid, unsigned int htsize)
Definition: oid.c:294
#define CT_QUERYSPEC_NAME
Definition: transform.h:126
const OID oid_Null_oid
Definition: oid.c:68
static OID oid_Charset_class
Definition: oid.c:58
#define CT_COLLATION_NAME
Definition: transform.h:137
static OID oid_DB_root_class
Definition: oid.c:64
static OID oid_Authorizations_class
Definition: oid.c:63
#define CT_TRIGGER_NAME
Definition: transform.h:139
int oid_compare_equals(const void *key_oid1, const void *key_oid2)
Definition: oid.c:310
static OID oid_Index_class
Definition: oid.c:52
void oid_get_partition_oid(OID *oid)
Definition: oid.c:207
static OID oid_Root_class
Definition: oid.c:39
bool oid_is_db_class(const OID *oid)
Definition: oid.c:219
int oid_compare(const void *a, const void *b)
Definition: oid.c:243
bool oid_is_partition(const OID *oid)
Definition: oid.c:195
#define CT_INDEXKEY_NAME
Definition: transform.h:129
int i
Definition: dynamic_load.c:954
static OID oid_Class_class
Definition: oid.c:44
bool oid_check_cached_class_oid(const int cache_id, const OID *oid)
Definition: oid.c:327
#define NULL_VOLID
static OID oid_Authorization_class
Definition: oid.c:62
static OID oid_Password_class
Definition: oid.c:61
Definition: oid.c:33
#define CT_ROOT_NAME
Definition: transform.h:140
INT32 PAGEID
#define OID_ISNULL(oidp)
Definition: oid.h:81
static OID oid_Queryspec_class
Definition: oid.c:51
#define CT_PASSWORD_NAME
Definition: transform.h:141
PAGEID oid_Next_tempid
Definition: oid.c:70
static OID oid_Methfile_class
Definition: oid.c:50
static OID oid_Methsig_class
Definition: oid.c:48
void oid_get_serial_oid(OID *oid)
Definition: oid.c:171
static OID oid_Classauth_class
Definition: oid.c:55
static OID oid_Metharg_class
Definition: oid.c:49
#define CT_CHARSET_NAME
Definition: transform.h:144