CUBRID Engine  latest
object_representation.h
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 /*
21  * object_representation.h - Definitions related to the representation of
22  * objects on disk and in memory.
23  * his file is shared by both the client and server.
24  */
25 
26 #ifndef _OBJECT_REPRESENTATION_H_
27 #define _OBJECT_REPRESENTATION_H_
28 
29 #ident "$Id$"
30 
31 #include <setjmp.h>
32 #include <time.h>
33 #include <float.h>
34 #include <limits.h>
35 #include <assert.h>
36 #if !defined(WINDOWS)
37 #include <netinet/in.h>
38 #endif /* !WINDOWS */
39 
40 #include "byte_order.h"
41 #include "db_set.h"
42 #include "error_manager.h"
43 #include "memory_alloc.h"
44 #include "oid.h"
46 #include "porting_inline.hpp"
47 #include "storage_common.h"
48 
49 // forward declarations
50 struct log_lsa;
51 struct setobj;
52 
53 #define OR_VALUE_ALIGNED_SIZE(value) \
54  (or_db_value_size (value) + MAX_ALIGNMENT)
55 
56 /* OVERFLOW CHECK MACROS */
57 
58 #define OR_CHECK_ASSIGN_OVERFLOW(dest, src) \
59  (((src) > 0 && (dest) < 0) || ((src) < 0 && (dest) > 0))
60 #define OR_CHECK_ADD_OVERFLOW(a, b, c) \
61  (((a) > 0 && (b) > 0 && (c) < 0) \
62  || ((a) < 0 && (b) < 0 && (c) >= 0))
63 #define OR_CHECK_UNS_ADD_OVERFLOW(a, b, c) \
64  (c) < (a) || (c) < (b)
65 #define OR_CHECK_SUB_UNDERFLOW(a, b, c) \
66  (((a) < (b) && (c) > 0) \
67  || ((a) > (b) && (c) < 0))
68 #define OR_CHECK_UNS_SUB_UNDERFLOW(a, b, c) \
69  (b) > (a)
70 #define OR_CHECK_MULT_OVERFLOW(a, b, c) \
71  (((b) == 0) ? ((c) != 0) : ((c) / (b) != (a)))
72 #define OR_CHECK_SHORT_DIV_OVERFLOW(a, b) \
73  ((a) == DB_INT16_MIN && (b) == -1)
74 #define OR_CHECK_INT_DIV_OVERFLOW(a, b) \
75  ((a) == DB_INT32_MIN && (b) == -1)
76 #define OR_CHECK_BIGINT_DIV_OVERFLOW(a, b) \
77  ((a) == DB_BIGINT_MIN && (b) == -1)
78 
79 #define OR_CHECK_SHORT_OVERFLOW(i) ((i) > DB_INT16_MAX || (i) < DB_INT16_MIN)
80 #define OR_CHECK_INT_OVERFLOW(i) ((i) > DB_INT32_MAX || (i) < DB_INT32_MIN)
81 #define OR_CHECK_BIGINT_OVERFLOW(i) ((i) > DB_BIGINT_MAX || (i) < DB_BIGINT_MIN)
82 #define OR_CHECK_USHRT_OVERFLOW(i) ((i) > (int) DB_UINT16_MAX || (i) < 0)
83 #define OR_CHECK_UINT_OVERFLOW(i) ((i) > DB_UINT32_MAX || (i) < 0)
84 
85 #define OR_CHECK_FLOAT_OVERFLOW(i) ((i) > FLT_MAX || (-(i)) > FLT_MAX)
86 #define OR_CHECK_DOUBLE_OVERFLOW(i) ((i) > DBL_MAX || (-(i)) > DBL_MAX)
87 
88 /* PACK/UNPACK MACROS */
89 
90 #define OR_GET_BYTE(ptr) \
91  (*(unsigned char *) ((char *) (ptr)))
92 #define OR_GET_SHORT(ptr) \
93  ((short) ntohs (*(short *) ((char *) (ptr))))
94 #define OR_GET_INT(ptr) \
95  ((int) ntohl (*(int *) ((char *) (ptr))))
96 #define OR_GET_FLOAT(ptr, value) \
97  (*(value) = ntohf (*(UINT32 *) (ptr)))
98 #define OR_GET_DOUBLE(ptr, value) \
99  (*(value) = ntohd (*(UINT64 *) (ptr)))
100 #define OR_GET_STRING(ptr) \
101  ((char *) ((char *) (ptr)))
102 
103 #define OR_PUT_BYTE(ptr, val) \
104  (*((unsigned char *) (ptr)) = (unsigned char) (val))
105 #define OR_PUT_SHORT(ptr, val) \
106  (*(short *) ((char *) (ptr)) = htons ((short) (val)))
107 #define OR_PUT_INT(ptr, val) \
108  (*(int *) ((char *) (ptr)) = htonl ((int) (val)))
109 inline void
110 OR_PUT_FLOAT (char *ptr, float val)
111 {
112  UINT32 ui;
113  ui = htonf (val);
114  memcpy (ptr, &ui, sizeof (ui));
115 }
116 
117 inline void
118 OR_PUT_DOUBLE (char *ptr, double val)
119 {
120  UINT64 ui;
121  ui = htond (val);
122  memcpy (ptr, &ui, sizeof (ui));
123 }
124 
125 #define OR_GET_BIG_VAR_OFFSET(ptr) OR_GET_INT (ptr) /* 4byte */
126 #define OR_PUT_BIG_VAR_OFFSET(ptr, val) OR_PUT_INT (ptr, val) /* 4byte */
127 
128 #define OR_PUT_OFFSET(ptr, val) \
129  OR_PUT_OFFSET_INTERNAL(ptr, val, BIG_VAR_OFFSET_SIZE)
130 
131 #define OR_PUT_OFFSET_INTERNAL(ptr, val, offset_size) \
132  do { \
133  if (offset_size == OR_BYTE_SIZE) \
134  { \
135  OR_PUT_BYTE(ptr, val); \
136  } \
137  else if (offset_size == OR_SHORT_SIZE) \
138  { \
139  OR_PUT_SHORT(ptr, val); \
140  } \
141  else if (offset_size == OR_INT_SIZE) \
142  { \
143  OR_PUT_INT(ptr, val); \
144  } \
145  } while (0)
146 
147 #define OR_GET_OFFSET(ptr) \
148  OR_GET_OFFSET_INTERNAL (ptr, BIG_VAR_OFFSET_SIZE)
149 
150 #define OR_GET_OFFSET_INTERNAL(ptr, offset_size) \
151  (offset_size == OR_BYTE_SIZE) \
152  ? OR_GET_BYTE (ptr) \
153  : ((offset_size == OR_SHORT_SIZE) \
154  ? OR_GET_SHORT (ptr) : OR_GET_INT (ptr))
155 
156 #define OR_MOVE_MONETARY(src, dst) \
157  do { \
158  OR_MOVE_DOUBLE (src, dst); \
159  ((DB_MONETARY *) dst)->type = ((DB_MONETARY *) src)->type; \
160  } while (0)
161 
162 #if OR_BYTE_ORDER == OR_LITTLE_ENDIAN
163 
164 #define swap64(x) \
165  ((((unsigned long long) (x) & (0x00000000000000FFULL)) << 56) \
166  | (((unsigned long long) (x) & (0xFF00000000000000ULL)) >> 56) \
167  | (((unsigned long long) (x) & (0x000000000000FF00ULL)) << 40) \
168  | (((unsigned long long) (x) & (0x00FF000000000000ULL)) >> 40) \
169  | (((unsigned long long) (x) & (0x0000000000FF0000ULL)) << 24) \
170  | (((unsigned long long) (x) & (0x0000FF0000000000ULL)) >> 24) \
171  | (((unsigned long long) (x) & (0x00000000FF000000ULL)) << 8) \
172  | (((unsigned long long) (x) & (0x000000FF00000000ULL)) >> 8))
173 
174 #else /* OR_BYTE_ORDER == OR_LITTLE_ENDIAN */
175 #define swap64(x) (x)
176 #endif /* OR_BYTE_ORDER == OR_LITTLE_ENDIAN */
177 
178 #if __WORDSIZE == 32
179 #define OR_PTR_SIZE 4
180 #define OR_PUT_PTR(ptr, val) OR_PUT_INT ((ptr), (val))
181 #define OR_GET_PTR(ptr) OR_GET_INT ((ptr))
182 #else /* __WORDSIZE == 32 */
183 #define OR_PTR_SIZE 8
184 #define OR_PUT_PTR(ptr, val) (*(UINTPTR *) ((char *) (ptr)) = swap64 ((UINTPTR) val))
185 #define OR_GET_PTR(ptr) ((UINTPTR) swap64 (*(UINTPTR *) ((char *) (ptr))))
186 #endif /* __WORDSIZE == 32 */
187 
188 #define OR_INT64_SIZE 8
189 
190 /* EXTENDED TYPES */
191 
192 #define OR_PUT_BIGINT(ptr, val) OR_PUT_INT64 (ptr, val)
193 #define OR_GET_BIGINT(ptr, val) OR_GET_INT64 (ptr, val)
194 
195 #define OR_GET_INT64(ptr, val) \
196  do { \
197  INT64 packed_value; \
198  memcpy (&packed_value, ptr, OR_INT64_SIZE); \
199  *((INT64*) (val)) = ((INT64) swap64 (packed_value)); \
200  } while (0)
201 
202 #define OR_PUT_INT64(ptr, val) \
203  do { \
204  INT64 packed_value; \
205  packed_value = ((INT64) swap64 (*(INT64*) val)); \
206  memcpy (ptr, &packed_value, OR_INT64_SIZE);\
207  } while (0)
208 
209 #define OR_GET_TIME(ptr, value) \
210  *((DB_TIME *) (value)) = OR_GET_INT (ptr)
211 
212 #define OR_PUT_TIME(ptr, value) \
213  OR_PUT_INT (ptr, *((DB_TIME *) (value)))
214 
215 #define OR_GET_UTIME(ptr, value) \
216  *((DB_UTIME *) (value)) = OR_GET_INT (ptr)
217 
218 #define OR_PUT_UTIME(ptr, value) \
219  OR_PUT_INT (ptr, *((DB_UTIME *) (value)))
220 
221 #define OR_GET_TIMESTAMPTZ(ptr, ts_tz) \
222  do { \
223  (ts_tz)->timestamp = OR_GET_INT ((char *) (ptr)); \
224  (ts_tz)->tz_id = OR_GET_INT (((char *) (ptr)) + OR_TIMESTAMPTZ_TZID); \
225  } while (0)
226 
227 #define OR_PUT_TIMESTAMPTZ(ptr, ts_tz) \
228  do { \
229  OR_PUT_INT (((char *) ptr), (ts_tz)->timestamp); \
230  OR_PUT_INT (((char *) ptr) + OR_TIMESTAMPTZ_TZID, (ts_tz)->tz_id); \
231  } while (0)
232 
233 #define OR_GET_DATE(ptr, value) \
234  *((DB_DATE *) (value)) = OR_GET_INT (ptr)
235 
236 #define OR_PUT_DATE(ptr, value) \
237  OR_PUT_INT (ptr, *((DB_DATE *) (value)))
238 
239 #define OR_GET_DATETIME(ptr, datetime) \
240  do { \
241  (datetime)->date = OR_GET_INT (((char *) (ptr)) + OR_DATETIME_DATE); \
242  (datetime)->time = OR_GET_INT (((char *) (ptr)) + OR_DATETIME_TIME); \
243  } while (0)
244 
245 #define OR_PUT_DATETIME(ptr, datetime) \
246  do { \
247  OR_PUT_INT (((char *)ptr) + OR_DATETIME_DATE, (datetime)->date); \
248  OR_PUT_INT (((char *)ptr) + OR_DATETIME_TIME, (datetime)->time); \
249  } while (0)
250 
251 #define OR_GET_DATETIMETZ(ptr, datetimetz) \
252  do { \
253  OR_GET_DATETIME ((char *) ptr, \
254  &((DB_DATETIMETZ *) datetimetz)->datetime); \
255  (datetimetz)->tz_id = OR_GET_INT (((char *) (ptr)) + OR_DATETIMETZ_TZID); \
256  } while (0)
257 
258 #define OR_PUT_DATETIMETZ(ptr, datetimetz) \
259  do { \
260  OR_PUT_DATETIME (((char *) ptr), \
261  &((DB_DATETIMETZ *) datetimetz)->datetime); \
262  OR_PUT_INT (((char *) ptr) + OR_DATETIMETZ_TZID, (datetimetz)->tz_id); \
263  } while (0)
264 
265 #define OR_GET_MONETARY(ptr, value) \
266  do { \
267  UINT64 pack_value; \
268  (value)->type = (DB_CURRENCY) OR_GET_INT (((char *) (ptr)) + OR_MONETARY_TYPE); \
269  memcpy ((char *) (&pack_value), ((char *) (ptr)) + OR_MONETARY_AMOUNT, OR_DOUBLE_SIZE); \
270  OR_GET_DOUBLE (&pack_value, &(value)->amount); \
271  } while (0)
272 
273 #define OR_GET_CURRENCY_TYPE(ptr) \
274  (DB_CURRENCY) OR_GET_INT (((char *) (ptr)) + OR_MONETARY_TYPE)
275 
276 #define OR_PUT_MONETARY(ptr, value) \
277  do { \
278  char pack_value[OR_DOUBLE_SIZE]; \
279  OR_PUT_INT (((char *) (ptr)) + OR_MONETARY_TYPE, (int) (value)->type); \
280  OR_PUT_DOUBLE (pack_value, (value)->amount); \
281  memcpy (((char *) (ptr)) + OR_MONETARY_AMOUNT, pack_value, OR_DOUBLE_SIZE); \
282  } while (0)
283 
284 /* Sha1 */
285 #define OR_GET_SHA1(ptr, value) \
286  do { \
287  int i = 0; \
288  for (; i < 5; i++) \
289  { \
290  ((SHA1Hash *) (value))->h[i] = (INT32) OR_GET_INT (ptr + i * OR_INT_SIZE); \
291  } \
292  } while (0)
293 #define OR_PUT_SHA1(ptr, value) \
294  do { \
295  int i = 0; \
296  for (; i < 5; i++) \
297  { \
298  OR_PUT_INT (ptr + i * OR_INT_SIZE, ((SHA1Hash *) (value))->h[i]); \
299  } \
300  } while (0)
301 
302 /* DISK IDENTIFIERS */
303 
304 #define OR_GET_OID(ptr, oid) \
305  do { \
306  (oid)->pageid = OR_GET_INT (((char *) (ptr)) + OR_OID_PAGEID); \
307  (oid)->slotid = OR_GET_SHORT (((char *) (ptr)) + OR_OID_SLOTID); \
308  (oid)->volid = OR_GET_SHORT (((char *) (ptr)) + OR_OID_VOLID); \
309  } while (0)
310 
311 #define OR_PUT_OID(ptr, oid) \
312  do { \
313  OR_PUT_INT (((char *) (ptr)) + OR_OID_PAGEID, (oid)->pageid); \
314  OR_PUT_SHORT (((char *) (ptr)) + OR_OID_SLOTID, (oid)->slotid); \
315  OR_PUT_SHORT (((char *) (ptr)) + OR_OID_VOLID, (oid)->volid); \
316  } while (0)
317 
318 #define OR_GET_VPID(ptr, vpid) \
319  do { \
320  (vpid)->pageid = OR_GET_INT (((char *) (ptr)) + OR_VPID_PAGEID); \
321  (vpid)->volid = OR_GET_SHORT (((char *) (ptr)) + OR_VPID_VOLID); \
322  } while (0)
323 
324 #define OR_PUT_VPID(ptr, vpid) \
325  do { \
326  OR_PUT_INT (((char *) (ptr)) + OR_VPID_PAGEID, (vpid)->pageid); \
327  OR_PUT_SHORT (((char *) (ptr)) + OR_VPID_VOLID, (vpid)->volid); \
328  } while (0)
329 #define OR_PUT_VPID_ALIGNED(ptr, vpid) \
330  do { \
331  OR_PUT_INT (((char *) (ptr)) + OR_VPID_PAGEID, (vpid)->pageid); \
332  OR_PUT_SHORT (((char *) (ptr)) + OR_VPID_VOLID, (vpid)->volid); \
333  OR_PUT_SHORT (((char *) (ptr)) + OR_VPID_SIZE, 0); \
334  } while (0)
335 
336 #define OR_PUT_NULL_OID(ptr) \
337  do { \
338  OR_PUT_INT (((char *) (ptr)) + OR_OID_PAGEID, NULL_PAGEID); \
339  OR_PUT_SHORT (((char *) (ptr)) + OR_OID_SLOTID, 0); \
340  OR_PUT_SHORT (((char *) (ptr)) + OR_OID_VOLID, 0); \
341  } while (0)
342 
343 #define OR_GET_HFID(ptr, hfid) \
344  do { \
345  (hfid)->hpgid = OR_GET_INT (((char *) (ptr)) + OR_HFID_PAGEID); \
346  (hfid)->vfid.fileid = OR_GET_INT (((char *) (ptr)) + OR_HFID_VFID_FILEID); \
347  (hfid)->vfid.volid = OR_GET_INT (((char *) (ptr)) + OR_HFID_VFID_VOLID); \
348  } while (0)
349 
350 #define OR_PUT_HFID(ptr, hfid) \
351  do { \
352  OR_PUT_INT (((char *) (ptr)) + OR_HFID_PAGEID, (hfid)->hpgid); \
353  OR_PUT_INT (((char *) (ptr)) + OR_HFID_VFID_FILEID, (hfid)->vfid.fileid); \
354  OR_PUT_INT (((char *) (ptr)) + OR_HFID_VFID_VOLID, (hfid)->vfid.volid); \
355  } while (0)
356 
357 #define OR_PUT_NULL_HFID(ptr) \
358  do { \
359  OR_PUT_INT (((char *) (ptr)) + OR_HFID_PAGEID, -1); \
360  OR_PUT_INT (((char *) (ptr)) + OR_HFID_VFID_FILEID, -1); \
361  OR_PUT_INT (((char *) (ptr)) + OR_HFID_VFID_VOLID, -1); \
362  } while (0)
363 
364 #define OR_GET_BTID(ptr, btid) \
365  do { \
366  (btid)->root_pageid = OR_GET_INT (((char *) (ptr)) + OR_BTID_PAGEID); \
367  (btid)->vfid.fileid = OR_GET_INT (((char *) (ptr)) + OR_BTID_VFID_FILEID); \
368  (btid)->vfid.volid = OR_GET_SHORT (((char *) (ptr)) + OR_BTID_VFID_VOLID); \
369  } while (0)
370 
371 #define OR_PUT_BTID(ptr, btid) \
372  do { \
373  OR_PUT_INT (((char *) (ptr)) + OR_BTID_PAGEID, (btid)->root_pageid); \
374  OR_PUT_INT (((char *) (ptr)) + OR_BTID_VFID_FILEID, (btid)->vfid.fileid); \
375  OR_PUT_SHORT (((char *) (ptr)) + OR_BTID_VFID_VOLID, (btid)->vfid.volid); \
376  } while (0)
377 
378 #define OR_PUT_NULL_BTID(ptr) \
379  do { \
380  OR_PUT_INT (((char *) (ptr)) + OR_BTID_PAGEID, NULL_PAGEID); \
381  OR_PUT_INT (((char *) (ptr)) + OR_BTID_VFID_FILEID, NULL_FILEID); \
382  OR_PUT_SHORT (((char *) (ptr)) + OR_BTID_VFID_VOLID, NULL_VOLID); \
383  } while (0)
384 
385 #define OR_GET_EHID(ptr, ehid) \
386  do { \
387  (ehid)->vfid.volid = OR_GET_INT (((char *) (ptr)) + OR_EHID_VOLID); \
388  (ehid)->vfid.fileid = OR_GET_INT (((char *) (ptr)) + OR_EHID_FILEID); \
389  (ehid)->pageid = OR_GET_INT (((char *) (ptr)) + OR_EHID_PAGEID); \
390  } while (0)
391 
392 #define OR_PUT_EHID(ptr, ehid) \
393  do { \
394  OR_PUT_INT (((char *) (ptr)) + OR_EHID_VOLID, (ehid)->vfid.volid); \
395  OR_PUT_INT (((char *) (ptr)) + OR_EHID_FILEID, (ehid)->vfid.fileid); \
396  OR_PUT_INT (((char *) (ptr)) + OR_EHID_PAGEID, (ehid)->pageid); \
397  } while (0)
398 
399 #define OR_GET_LOG_LSA(ptr, lsa) \
400  do { \
401  INT64 value; \
402  OR_GET_INT64 (((char *) (ptr)) + OR_LOG_LSA_PAGEID, &value); \
403  (lsa)->pageid = value; \
404  (lsa)->offset = OR_GET_SHORT (((char *) (ptr)) + OR_LOG_LSA_OFFSET); \
405  } while (0)
406 
407 #define OR_PUT_LOG_LSA(ptr, lsa) \
408  do { \
409  INT64 pageid = (lsa)->pageid; \
410  OR_PUT_INT64 (((char *) (ptr)) + OR_LOG_LSA_PAGEID, &pageid); \
411  OR_PUT_SHORT (((char *) (ptr)) + OR_LOG_LSA_OFFSET, (lsa)->offset); \
412  } while (0)
413 
414 #define OR_PUT_NULL_LOG_LSA(ptr) \
415  do { \
416  INT64 pageid = -1; \
417  OR_PUT_INT64 (((char *) (ptr)) + OR_LOG_LSA_PAGEID, &pageid); \
418  OR_PUT_SHORT (((char *) (ptr)) + OR_LOG_LSA_OFFSET, -1); \
419  } while (0)
420 
421 /*
422  * VARIABLE OFFSET TABLE ACCESSORS
423  * The variable offset table is present in the headers of objects and sets.
424  */
425 
426 #define OR_VAR_TABLE_SIZE(vars) \
427  (OR_VAR_TABLE_SIZE_INTERNAL (vars, BIG_VAR_OFFSET_SIZE))
428 
429 #define OR_VAR_TABLE_SIZE_INTERNAL(vars, offset_size) \
430  (((vars) == 0) ? 0 : DB_ALIGN ((offset_size * ((vars) + 1)), INT_ALIGNMENT))
431 
432 #define OR_VAR_TABLE_ELEMENT_PTR(table, index, offset_size) \
433  ((offset_size == OR_BYTE_SIZE) \
434  ? (&((char *) (table))[(index)]) \
435  : ((offset_size == OR_SHORT_SIZE) \
436  ? ((char *) (&((short *) (table))[(index)])) \
437  : ((char *) (&((int *) (table))[(index)]))))
438 
439 #define OR_VAR_TABLE_ELEMENT_OFFSET_INTERNAL(table, index, offset_size) \
440  ((offset_size == OR_BYTE_SIZE) \
441  ? (OR_GET_BYTE (OR_VAR_TABLE_ELEMENT_PTR (table, index, offset_size))) \
442  : ((offset_size == OR_SHORT_SIZE) \
443  ? (OR_GET_SHORT (OR_VAR_TABLE_ELEMENT_PTR (table, index, offset_size))) \
444  : (OR_GET_INT (OR_VAR_TABLE_ELEMENT_PTR (table, index, offset_size)))))
445 
446 #define OR_VAR_TABLE_ELEMENT_LENGTH_INTERNAL(table, index, offset_size) \
447  (OR_VAR_TABLE_ELEMENT_OFFSET_INTERNAL (table, (index) + 1, offset_size) \
448  - OR_VAR_TABLE_ELEMENT_OFFSET_INTERNAL (table, (index), offset_size))
449 
450 /* ATTRIBUTE LOCATION */
451 
452 #define OR_FIXED_ATTRIBUTES_OFFSET(ptr, nvars) \
453  (OR_FIXED_ATTRIBUTES_OFFSET_INTERNAL (ptr, nvars, BIG_VAR_OFFSET_SIZE))
454 
455 #define OR_FIXED_ATTRIBUTES_OFFSET_INTERNAL(ptr, nvars, offset_size) \
456  (OR_HEADER_SIZE (ptr) + OR_VAR_TABLE_SIZE_INTERNAL (nvars, offset_size))
457 
458 /* OBJECT HEADER LAYOUT */
459 /* header fixed-size in non-MVCC only, in MVCC the header has variable size */
460 #define OR_HEADER_SIZE(ptr) (or_header_size ((char *) (ptr)))
461 
462 /* representation offset in MVCC and non-MVCC. In MVCC the representation
463  * contains flags that allow to compute header size and CHN offset.
464  */
465 
466 #define OR_REP_OFFSET 0
467 #define OR_MVCC_REP_SIZE 4
468 
469 #define OR_MVCC_FLAG_OFFSET OR_REP_OFFSET
470 #define OR_MVCC_FLAG_SIZE OR_MVCC_REP_SIZE
471 
472 #define OR_CHN_OFFSET (OR_REP_OFFSET + OR_MVCC_REP_SIZE)
473 #define OR_CHN_SIZE 4
474 
475 #define OR_MVCC_INSERT_ID_OFFSET (OR_CHN_OFFSET + OR_CHN_SIZE)
476 #define OR_MVCC_INSERT_ID_SIZE 8
477 
478 #define OR_MVCC_DELETE_ID_OFFSET(mvcc_flags) \
479  (OR_MVCC_INSERT_ID_OFFSET + (((mvcc_flags) & OR_MVCC_FLAG_VALID_INSID) ? OR_MVCC_INSERT_ID_SIZE : 0))
480 #define OR_MVCC_DELETE_ID_SIZE 8
481 
482 #define OR_MVCC_PREV_VERSION_LSA_OFFSET(mvcc_flags) \
483  (OR_MVCC_DELETE_ID_OFFSET(mvcc_flags) + (((mvcc_flags) & OR_MVCC_FLAG_VALID_DELID) ? OR_MVCC_DELETE_ID_SIZE : 0))
484 #define OR_MVCC_PREV_VERSION_LSA_SIZE 8
485 
486 /* MVCC */
487 #define OR_MVCCID_SIZE OR_BIGINT_SIZE
488 #define OR_PUT_MVCCID OR_PUT_BIGINT
489 #define OR_GET_MVCCID OR_GET_BIGINT
490 
491 /* In case MVCC is enabled and chn is needed it will be saved instead of
492  * delete MVCC id.
493  */
494 
495 /* high bit of the repid word is reserved for the bound bit flag,
496  need to keep representations from going negative ! */
497 #define OR_BOUND_BIT_FLAG 0x80000000
498 
499 #define BIG_VAR_OFFSET_SIZE OR_INT_SIZE /* 4byte */
500 
501 /* OBJECT HEADER ACCESS MACROS */
502 
503 #define OR_GET_REPID(ptr) \
504  ((OR_GET_INT ((ptr) + OR_REP_OFFSET)) & ~OR_BOUND_BIT_FLAG & ~OR_OFFSET_SIZE_FLAG)
505 
506 #define OR_GET_BOUND_BIT_FLAG(ptr) \
507  ((OR_GET_INT ((ptr) + OR_REP_OFFSET)) & OR_BOUND_BIT_FLAG)
508 
509 #define OR_GET_OFFSET_SIZE(ptr) \
510  ((((OR_GET_INT (((char *) (ptr)) + OR_REP_OFFSET)) & OR_OFFSET_SIZE_FLAG) == OR_OFFSET_SIZE_1BYTE) \
511  ? OR_BYTE_SIZE \
512  : ((((OR_GET_INT (((char *) (ptr)) + OR_REP_OFFSET)) & OR_OFFSET_SIZE_FLAG) == OR_OFFSET_SIZE_2BYTE) \
513  ? OR_SHORT_SIZE : OR_INT_SIZE))
514 
515 #define OR_SET_VAR_OFFSET_SIZE(val, offset_size) \
516  (((offset_size) == OR_BYTE_SIZE) \
517  ? ((val) |= OR_OFFSET_SIZE_1BYTE) \
518  : (((offset_size) == OR_SHORT_SIZE) \
519  ? ((val) |= OR_OFFSET_SIZE_2BYTE) \
520  : ((val) |= OR_OFFSET_SIZE_4BYTE)))
521 
522 /* MVCC OBJECT HEADER ACCESS MACROS */
523 #define OR_GET_MVCC_INSERT_ID(ptr, mvcc_flags, valp) \
524  ((((mvcc_flags) & OR_MVCC_FLAG_VALID_INSID) == 0) \
525  ? MVCCID_ALL_VISIBLE \
526  : (OR_GET_BIGINT (((char *) (ptr)) + OR_MVCC_INSERT_ID_OFFSET, (valp))))
527 
528 #define OR_GET_MVCC_DELETE_ID(ptr, mvcc_flags, valp) \
529  ((((mvcc_flags) & OR_MVCC_FLAG_VALID_DELID) == 0) \
530  ? MVCCID_NULL \
531  : (OR_GET_BIGINT (((char *) (ptr)) + OR_MVCC_DELETE_ID_OFFSET(mvcc_flags), (valp))))
532 
533 #define OR_GET_MVCC_REPID(ptr) \
534  ((OR_GET_INT(((char *) (ptr)) + OR_REP_OFFSET)) \
535  & OR_MVCC_REPID_MASK)
536 
537 #define OR_GET_MVCC_CHN(ptr) (OR_GET_INT ((char *) (ptr) + OR_CHN_OFFSET))
538 
539 #define OR_GET_MVCC_FLAG(ptr) \
540  (((OR_GET_INT (((char *) (ptr)) + OR_REP_OFFSET)) \
541  >> OR_MVCC_FLAG_SHIFT_BITS) & OR_MVCC_FLAG_MASK)
542 
543 #define OR_GET_MVCC_REPID_AND_FLAG(ptr) \
544  (OR_GET_INT (((char *) (ptr)) + OR_REP_OFFSET))
545 
546 /* VARIABLE OFFSET TABLE ACCESSORS */
547 
548 #define OR_GET_OBJECT_VAR_TABLE(obj) \
549  ((short *) (((char *) (obj)) + OR_HEADER_SIZE ((char *) (obj))))
550 
551 #define OR_VAR_ELEMENT_PTR(obj, index) \
552  (OR_VAR_TABLE_ELEMENT_PTR (OR_GET_OBJECT_VAR_TABLE (obj), index, OR_GET_OFFSET_SIZE (obj)))
553 
554 #define OR_VAR_OFFSET(obj, index) \
555  (OR_HEADER_SIZE (obj) \
556  + OR_VAR_TABLE_ELEMENT_OFFSET_INTERNAL (OR_GET_OBJECT_VAR_TABLE (obj), \
557  index, OR_GET_OFFSET_SIZE (obj)))
558 
559 #define OR_VAR_IS_NULL(obj, index) \
560  ((OR_VAR_TABLE_ELEMENT_LENGTH_INTERNAL (OR_GET_OBJECT_VAR_TABLE (obj), \
561  index, OR_GET_OFFSET_SIZE (obj))) ? 0 : 1)
562 
563 #define OR_VAR_LENGTH(length, obj, index, n_variables) \
564  do { \
565  int _this_offset, _next_offset, _temp_offset, _nth_var; \
566  _this_offset = OR_VAR_OFFSET(obj, index); \
567  _next_offset = OR_VAR_OFFSET(obj, index + 1); \
568  if ((length = _next_offset - _this_offset) != 0) \
569  { \
570  _next_offset = 0; \
571  for (_nth_var = 0; _nth_var <= n_variables; _nth_var++) \
572  { \
573  _temp_offset = OR_VAR_OFFSET(obj, _nth_var); \
574  if (_temp_offset > _this_offset ) \
575  { \
576  if (_next_offset == 0) \
577  { \
578  _next_offset = _temp_offset; \
579  } \
580  else if (_temp_offset < _next_offset) \
581  { \
582  _next_offset = _temp_offset; \
583  } \
584  } \
585  } \
586  length = _next_offset - _this_offset; \
587  } \
588  } while (0)
589 
590 /*
591  * BOUND BIT ACCESSORS.
592  * Note that these are assuming 4 byte integers to avoid a divide operation.
593  */
594 
595 #define OR_BOUND_BIT_WORDS(count) (((count) + 31) >> 5)
596 #define OR_BOUND_BIT_BYTES(count) ((((count) + 31) >> 5) * 4)
597 
598 #define OR_BOUND_BIT_MASK(element) (1 << ((int) (element) & 7))
599 
600 #define OR_GET_BOUND_BIT_BYTE(bitptr, element) \
601  ((char *) (bitptr) + ((int) (element) >> 3))
602 
603 #define OR_GET_BOUND_BIT(bitptr, element) \
604  ((*OR_GET_BOUND_BIT_BYTE ((bitptr), (element))) & OR_BOUND_BIT_MASK ((element)))
605 
606 #define OR_GET_BOUND_BITS(obj, nvars, fsize) \
607  (char *) (((char *) (obj)) \
608  + OR_HEADER_SIZE ((char *) (obj)) \
609  + OR_VAR_TABLE_SIZE_INTERNAL ((nvars), OR_GET_OFFSET_SIZE (obj)) + (fsize))
610 
611 /* These are the most useful ones if we're only testing a single attribute */
612 
613 #define OR_FIXED_ATT_IS_BOUND(obj, nvars, fsize, position) \
614  (!OR_GET_BOUND_BIT_FLAG (obj) || OR_GET_BOUND_BIT (OR_GET_BOUND_BITS (obj, nvars, fsize), position))
615 
616 #define OR_FIXED_ATT_IS_UNBOUND(obj, nvars, fsize, position) \
617  (OR_GET_BOUND_BIT_FLAG (obj) && !OR_GET_BOUND_BIT (OR_GET_BOUND_BITS (obj, nvars, fsize), position))
618 
619 #define OR_ENABLE_BOUND_BIT(bitptr, element) \
620  *OR_GET_BOUND_BIT_BYTE (bitptr, element) = *OR_GET_BOUND_BIT_BYTE (bitptr, element) | OR_BOUND_BIT_MASK (element)
621 
622 #define OR_CLEAR_BOUND_BIT(bitptr, element) \
623  *OR_GET_BOUND_BIT_BYTE (bitptr, element) = *OR_GET_BOUND_BIT_BYTE (bitptr, element) & ~OR_BOUND_BIT_MASK (element)
624 
625 /* SET HEADER */
626 
627 #define OR_SET_HEADER_SIZE 8
628 #define OR_SET_SIZE_OFFSET 4
629 /* optional header extension if the full domain is present */
630 #define OR_SET_DOMAIN_SIZE_OFFSET 8
631 
632 /* Set header fields.
633  These constants are used to construct and decompose the set header word. */
634 #define OR_SET_TYPE_MASK 0xFF
635 #define OR_SET_ETYPE_MASK 0xFF00
636 #define OR_SET_ETYPE_SHIFT 8
637 #define OR_SET_BOUND_BIT 0x10000
638 #define OR_SET_VARIABLE_BIT 0x20000
639 #define OR_SET_DOMAIN_BIT 0x40000
640 #define OR_SET_TAG_BIT 0x80000
641 #define OR_SET_COMMON_SUB_BIT 0x100000
642 
643 #define OR_SET_TYPE(setptr) \
644  (DB_TYPE) ((OR_GET_INT ((char *) (setptr))) & OR_SET_TYPE_MASK)
645 
646 #define OR_SET_ELEMENT_TYPE(setptr) \
647  (DB_TYPE) ((OR_GET_INT ((char *) (setptr)) & OR_SET_ETYPE_MASK) >> OR_SET_ETYPE_SHIFT)
648 
649 #define OR_SET_HAS_BOUND_BITS(setptr) \
650  (OR_GET_INT ((char *) (setptr)) & OR_SET_BOUND_BIT)
651 
652 #define OR_SET_HAS_OFFSET_TABLE(setptr) \
653  (OR_GET_INT ((char *) (setptr)) & OR_SET_VARIABLE_BIT)
654 
655 #define OR_SET_HAS_DOMAIN(setptr) \
656  (OR_GET_INT ((char *) (setptr)) & OR_SET_DOMAIN_BIT)
657 
658 #define OR_SET_HAS_ELEMENT_TAGS(setptr) \
659  (OR_GET_INT ((char *) (setptr)) & OR_SET_TAG_BIT)
660 
661 #define OR_SET_ELEMENT_COUNT(setptr) \
662  ((OR_GET_INT ((char *) (setptr) + OR_SET_SIZE_OFFSET)))
663 
664 #define OR_SET_DOMAIN_SIZE(setptr) \
665  ((OR_GET_INT ((char *) (setptr) + OR_SET_DOMAIN_SIZE_OFFSET)))
666 
667 /*
668  * SET VARIABLE OFFSET TABLE ACCESSORS.
669  * Should make sure that the set actually has one before using.
670  */
671 #define OR_GET_SET_VAR_TABLE(setptr) \
672  ((int *) ((char *) (setptr) + OR_SET_HEADER_SIZE))
673 
674 #define OR_SET_ELEMENT_OFFSET(setptr, element) \
675  (OR_VAR_TABLE_ELEMENT_OFFSET_INTERNAL (OR_GET_SET_VAR_TABLE (setptr), element, BIG_VAR_OFFSET_SIZE))
676 
677 /*
678  * SET BOUND BIT ACCESSORS
679  *
680  * Should make sure that the set actually has these before using.
681  * Its essentially the same as OR_GET_SET_VAR_TABLE since these will
682  * be in the same position and can't both appear at the same time.
683  */
684 
685 #define OR_GET_SET_BOUND_BITS(setptr) \
686  (int *) ((char *) (setptr) + OR_SET_HEADER_SIZE)
687 
688 /* MIDXKEY HEADER */
689 
690 #define OR_MULTI_BOUND_BIT_BYTES(count) (((count) + 7) >> 3)
691 
692 #define OR_MULTI_BOUND_BIT_MASK(element) (1 << ((int) (element) & 7))
693 
694 #define OR_MULTI_GET_BOUND_BIT_BYTE(bitptr, element) \
695  ((char *)(bitptr) + ((int)(element) >> 3))
696 
697 #define OR_MULTI_GET_BOUND_BIT(bitptr, element) \
698  ((*OR_MULTI_GET_BOUND_BIT_BYTE(bitptr, element)) & OR_MULTI_BOUND_BIT_MASK(element))
699 
700 #define OR_MULTI_GET_BOUND_BITS(bitptr, fsize) \
701  (char *) (((char *) (bitptr)) + fsize)
702 
703 #define OR_MULTI_ATT_IS_BOUND(bitptr, element) \
704  OR_MULTI_GET_BOUND_BIT(bitptr, element)
705 #define OR_MULTI_ATT_IS_UNBOUND(bitptr, element) \
706  (!OR_MULTI_GET_BOUND_BIT (bitptr, element))
707 
708 #define OR_MULTI_ENABLE_BOUND_BIT(bitptr, element) \
709  *OR_MULTI_GET_BOUND_BIT_BYTE (bitptr, element) = (*OR_MULTI_GET_BOUND_BIT_BYTE (bitptr, element) \
710  | OR_MULTI_BOUND_BIT_MASK (element))
711 
712 #define OR_MULTI_CLEAR_BOUND_BIT(bitptr, element) \
713  *OR_MULTI_GET_BOUND_BIT_BYTE (bitptr, element) = (*OR_MULTI_GET_BOUND_BIT_BYTE (bitptr, element) \
714  & ~OR_MULTI_BOUND_BIT_MASK (element))
715 
716 
717 /*
718  * OR_SUB_HEADER_SIZE
719  *
720  * Used to tag each substructure. Same as the object header currently.
721  * class oid, repid, flags
722  */
723 #define OR_SUB_HEADER_SIZE OR_OID_SIZE + OR_INT_SIZE + OR_INT_SIZE
724 
725 /*
726  * OR_SUB_DOMAIN_AND_HEADER_SIZE
727  *
728  * Hack for the class transformer, since we always currently know what the
729  * substructure lists contain, this allows us to skip over the packed domain
730  * quickly. Must match the stuff packed by or_put_sub_domain_and_header().
731  */
732 #define OR_SUB_DOMAIN_SIZE OR_INT_SIZE
733 
734 /* VARIABLE HEADER */
735 #define OR_VARIABLE_HEADER_SIZE 4
736 
737 #define OR_GET_VARIABLE_TYPE(ptr) (OR_GET_INT ((int *) (ptr)))
738 
739 /* class */
740 enum
741 {
755 };
756 
757 enum
758 {
776 
777  /* add a new one above */
778 
780 
782 };
783 
784 /* attribute */
785 enum
786 {
793 };
794 
795 enum
796 {
804 
805  /* add a new one above */
806 
808 
810 };
811 
812 /* representation */
813 enum
814 {
818 };
819 
820 enum
821 {
824 
825  /* add a new one above */
826 
828 
830 };
831 
832 /* rep_attribute */
833 enum
834 {
837 };
838 
839 enum
840 {
842 
843  /* add a new one above */
844 
846 
848 };
849 
850 /* domain */
851 enum
852 {
859 };
860 
861 enum
862 {
866 
867  /* add a new one above */
868 
870 
872 };
873 
874 /* method */
875 enum
876 {
880 
881  /* add a new one above */
882 
884 
886 };
887 
888 /* method argument */
889 enum
890 {
892 
893  /* add a new one above */
894 
896 
898 };
899 
900 /* method signature */
901 enum
902 {
907 
908  /* add a new one above */
909 
911 
913 };
914 
915 /* method file */
916 enum
917 {
920 
921  /* add a new one above */
922 
924 
926 };
927 
928 /* query spec */
929 enum
930 {
932 
933  /* add a new one above */
934 
936 
938 };
939 
940 /* resolution */
941 enum
942 {
945 
946  /* add a new one above */
947 
949 
951 };
952 
953 /* partition */
954 enum
955 {
960 
961  /* add a new one above */
963 
965 };
966 
967 /* MEMORY REPRESENTATION STRUCTURES */
968 
969 #define OR_BINARY_MAX_LENGTH 65535
970 #define OR_BINARY_LENGTH_MASK 0xFFFF
971 #define OR_BINARY_PAD_SHIFT 16
972 
973 typedef struct db_binary DB_BINARY;
974 struct db_binary
975 {
976  unsigned char *data;
977  unsigned int length;
978 };
979 
980 /*
981  * DB_REFERENCE
982  * This is a common structure header used by DB_SET and DB_ELO.
983  * It encapsulates ownership information that must be maintained
984  * by these two types. General routines can be written to maintain
985  * ownership information for both types.
986  *
987  */
988 typedef struct db_reference DB_REFERENCE;
990 {
991  struct db_object *handle;
992  struct db_object *owner;
994 };
995 
996 /*
997  * SETOBJ
998  * This is the primitive set object header.
999  */
1000 typedef struct setobj SETOBJ;
1001 
1002 typedef struct db_set SETREF;
1003 
1004 #if defined (__cplusplus)
1005 class JSON_VALIDATOR;
1006 #endif
1007 /*
1008  * OR_TYPE_SIZE
1009  * Returns the byte size of the disk representation of a particular
1010  * type. Returns -1 if the type is variable and the size cannot
1011  * be known from just the type id.
1012  */
1013 extern int or_Type_sizes[]; /* map of type id to fixed value size */
1014 
1015 #define OR_TYPE_SIZE(type) or_Type_sizes[(int)(type)]
1016 
1017 /*
1018  * OR_VARINFO
1019  * Memory representation for a variable offset table. This is build
1020  * from a disk offset table, either in an object header or in a
1021  * set header.
1022  */
1023 typedef struct or_varinfo OR_VARINFO;
1025 {
1026  int offset;
1027  int length;
1028 };
1029 
1030 #if __WORDSIZE == 32
1031 
1032 #define OR_ALIGNED_BUF(size) \
1033 union \
1034  { \
1035  double dummy; \
1036  char buf[(size) + MAX_ALIGNMENT]; \
1037  }
1038 
1039 #define OR_ALIGNED_BUF_START(abuf) (PTR_ALIGN (abuf.buf, MAX_ALIGNMENT))
1040 #define OR_ALIGNED_BUF_SIZE(abuf) (sizeof (abuf.buf) - MAX_ALIGNMENT)
1041 
1042 #else /* __WORDSIZE == 32 */
1043 
1044 #define OR_ALIGNED_BUF(size) \
1045 union \
1046  { \
1047  double dummy; \
1048  char buf[(size)]; \
1049  }
1050 
1051 #define OR_ALIGNED_BUF_START(abuf) (abuf.buf)
1052 #define OR_ALIGNED_BUF_SIZE(abuf) (sizeof (abuf.buf))
1053 
1054 #endif
1055 
1056 #define OR_INFINITE_POINTER ((void *) (~((UINTPTR) 0UL)))
1057 
1058 typedef struct or_buf OR_BUF;
1059 struct or_buf
1060 {
1061  char *buffer;
1062  char *ptr;
1063  char *endptr;
1064  struct or_fixup *fixups;
1065  jmp_buf env;
1067 };
1068 
1069 /* TODO: LP64 check DB_INT32_MAX */
1070 
1071 #define OR_BUF_INIT(buf, data, size) \
1072  do { \
1073  (buf).buffer = (buf).ptr = (data); \
1074  (buf).endptr = ((size) <= 0 || (size) == DB_INT32_MAX) \
1075  ? (char *) OR_INFINITE_POINTER : (data) + (size); \
1076  (buf).error_abort = 0; \
1077  (buf).fixups = NULL; \
1078  } while (0)
1079 
1080 #define OR_BUF_INIT2(buf, data, size) \
1081  do { \
1082  (buf).buffer = (buf).ptr = (data); \
1083  (buf).endptr = ((size) <= 0 || (size) == DB_INT32_MAX) \
1084  ? (char *) OR_INFINITE_POINTER : (data) + (size); \
1085  (buf).error_abort = 1; \
1086  (buf).fixups = NULL; \
1087  } while (0)
1088 
1089 /* Need to translate types of DB_TYPE_OBJECT into DB_TYPE_OID in server-side */
1090 #define OR_PACK_DOMAIN_OBJECT_TO_OID(p, d, o, n) \
1091  or_pack_domain ((p), \
1092  TP_DOMAIN_TYPE (d) == DB_TYPE_OBJECT ? &tp_Oid_domain : (d), \
1093  (o), (n))
1094 
1095 #define ASSERT_ALIGN(ptr, alignment) (assert (PTR_ALIGN (ptr, alignment) == ptr))
1096 
1097 #if defined __cplusplus
1098 extern "C"
1099 {
1100 #endif
1101 
1102  extern int db_string_put_cs_and_collation (DB_VALUE * value, const int codeset, const int collation_id);
1103  extern int db_enum_put_cs_and_collation (DB_VALUE * value, const int codeset, const int collation_id);
1104 
1105  extern int valcnv_convert_value_to_string (DB_VALUE * value);
1106 
1107 #if defined __cplusplus
1108 }
1109 #endif
1110 
1111 extern int or_rep_id (RECDES * record);
1112 extern int or_set_rep_id (RECDES * record, int repid);
1113 extern int or_chn (RECDES * record);
1114 extern int or_replace_chn (RECDES * record, int chn);
1115 extern int or_mvcc_get_repid_and_flags (OR_BUF * buf, int *error);
1116 extern int or_mvcc_set_repid_and_flags (OR_BUF * buf, int mvcc_flag, int repid, int bound_bit,
1117  int variable_offset_size);
1118 extern char *or_class_name (RECDES * record);
1119 
1120 /* Pointer based decoding functions */
1121 extern int or_set_element_offset (char *setptr, int element);
1122 
1123 #if defined(ENABLE_UNUSED_FUNCTION)
1124 extern int or_get_bound_bit (char *bound_bits, int element);
1125 extern void or_put_bound_bit (char *bound_bits, int element, int bound);
1126 #endif
1127 
1128 /* Data packing functions */
1129 extern char *or_pack_int (char *ptr, int number);
1130 #if defined(ENABLE_UNUSED_FUNCTION)
1131 extern char *or_pack_bigint (char *ptr, DB_BIGINT number);
1132 #endif
1133 extern char *or_pack_int64 (char *ptr, INT64 number);
1134 extern char *or_pack_float (char *ptr, float number);
1135 extern char *or_pack_double (char *ptr, double number);
1136 #if defined(ENABLE_UNUSED_FUNCTION)
1137 extern char *or_pack_time (char *ptr, DB_TIME time);
1138 extern char *or_pack_date (char *ptr, DB_DATE date);
1139 extern char *or_pack_monetary (char *ptr, DB_MONETARY * money);
1140 extern char *or_pack_utime (char *ptr, DB_UTIME utime);
1141 #endif
1142 extern char *or_pack_short (char *ptr, short number);
1143 extern char *or_pack_string_with_null_padding (char *ptr, const char *stream, size_t len);
1144 extern char *or_pack_stream (char *ptr, const char *stream, size_t len);
1145 extern char *or_pack_string (char *ptr, const char *string);
1146 extern char *or_pack_string_with_length (char *ptr, const char *string, int length);
1147 extern char *or_pack_errcode (char *ptr, int error);
1148 extern char *or_pack_oid (char *ptr, const OID * oid);
1149 extern char *or_pack_oid_array (char *ptr, int n, const OID * oids);
1150 extern char *or_pack_hfid (const char *ptr, const HFID * hfid);
1151 extern char *or_pack_btid (char *buf, const BTID * btid);
1152 extern char *or_pack_ehid (char *buf, EHID * btid);
1153 extern char *or_pack_recdes (char *buf, RECDES * recdes);
1154 extern char *or_pack_log_lsa (const char *ptr, const struct log_lsa *lsa);
1155 extern char *or_unpack_log_lsa (char *ptr, struct log_lsa *lsa);
1156 extern char *or_unpack_set (char *ptr, setobj ** set, struct tp_domain *domain);
1157 extern char *or_unpack_setref (char *ptr, DB_SET ** ref);
1158 extern char *or_pack_listid (char *ptr, void *listid);
1159 extern char *or_pack_lock (char *ptr, LOCK lock);
1160 extern char *or_pack_set_header (char *buf, DB_TYPE stype, DB_TYPE etype, int bound_bits, int size);
1161 extern char *or_pack_method_sig_list (char *ptr, void *method_sig_list);
1162 extern char *or_pack_set_node (char *ptr, void *set_node);
1163 #if defined(ENABLE_UNUSED_FUNCTION)
1164 extern char *or_pack_elo (char *ptr, void *elo);
1165 extern char *or_pack_string_array (char *buffer, int count, const char **string_array);
1166 extern char *or_pack_db_value_array (char *buffer, int count, DB_VALUE * val);
1167 extern char *or_pack_int_array (char *buffer, int count, int *int_array);
1168 #endif
1169 
1170 /* should be using the or_pack_value family instead ! */
1171 extern char *or_pack_db_value (char *buffer, DB_VALUE * var);
1172 extern char *or_unpack_db_value (char *buffer, DB_VALUE * val);
1173 extern int or_db_value_size (DB_VALUE * var);
1174 
1175 /* Data unpacking functions */
1176 extern char *or_unpack_int (char *ptr, int *number);
1177 #if defined(ENABLE_UNUSED_FUNCTION)
1178 extern char *or_unpack_bigint (char *ptr, DB_BIGINT * number);
1179 #endif
1180 extern char *or_unpack_int64 (char *ptr, INT64 * number);
1181 extern char *or_unpack_int_array (char *ptr, int n, int **number_array);
1182 extern char *or_unpack_longint (char *ptr, int *number);
1183 extern char *or_unpack_short (char *ptr, short *number);
1184 extern char *or_unpack_float (char *ptr, float *number);
1185 extern char *or_unpack_double (char *ptr, double *number);
1186 #if defined(ENABLE_UNUSED_FUNCTION)
1187 extern char *or_unpack_time (char *ptr, DB_TIME * time);
1188 extern char *or_unpack_date (char *ptr, DB_DATE * date);
1189 extern char *or_unpack_monetary (char *ptr, DB_MONETARY * money);
1190 extern char *or_unpack_utime (char *ptr, DB_UTIME * utime);
1191 #endif
1192 extern char *or_unpack_stream (char *ptr, char *stream, size_t len);
1193 extern char *or_unpack_string (char *ptr, char **string);
1194 extern char *or_unpack_string_alloc (char *ptr, char **string);
1195 extern char *or_unpack_string_nocopy (char *ptr, char **string);
1196 extern char *or_unpack_errcode (char *ptr, int *error);
1197 extern char *or_unpack_oid (char *ptr, OID * oid);
1198 extern char *or_unpack_oid_array (char *ptr, int n, OID ** oids);
1199 extern char *or_unpack_hfid (char *ptr, HFID * hfid);
1200 extern char *or_unpack_hfid_array (char *ptr, int n, HFID ** hfids);
1201 extern char *or_unpack_btid (char *buf, BTID * btid);
1202 extern char *or_unpack_ehid (char *buf, EHID * btid);
1203 extern char *or_unpack_recdes (char *buf, RECDES ** recdes);
1204 extern char *or_unpack_listid (char *ptr, void *listid_ptr);
1205 extern char *or_unpack_unbound_listid (char *ptr, void **listid_ptr);
1206 extern char *or_unpack_lock (char *ptr, LOCK * lock);
1207 extern char *or_unpack_set_header (char *buf, DB_TYPE * stype, DB_TYPE * etype, int *bound_bits, int *size);
1208 extern char *or_unpack_method_sig_list (char *ptr, void **method_sig_list_ptr);
1209 extern char *or_unpack_set_node (char *ptr, void *set_node_ptr);
1210 #if defined(ENABLE_UNUSED_FUNCTION)
1211 extern char *or_unpack_string_array (char *buffer, char ***string_array, int *cnt);
1212 extern char *or_unpack_db_value_array (char *buffer, DB_VALUE ** val, int *count);
1213 extern char *or_unpack_elo (char *ptr, void **elo_ptr);
1214 #endif
1215 extern char *or_pack_ptr (char *ptr, UINTPTR ptrval);
1216 extern char *or_unpack_ptr (char *ptr, UINTPTR * ptrval);
1217 
1218 extern char *or_pack_bool_array (char *ptr, const bool * bools, int size);
1219 extern char *or_unpack_bool_array (char *ptr, bool ** bools);
1220 extern int or_packed_bool_array_length (const bool * bools, int size);
1221 
1222 /* pack/unpack support functions */
1223 extern int or_packed_stream_length (size_t len);
1224 extern int or_packed_string_length (const char *string, int *strlen);
1225 #if defined(ENABLE_UNUSED_FUNCTION)
1226 extern int or_align_length (int length);
1227 #endif /* ENABLE_UNUSED_FUNCTION */
1228 extern int or_packed_varbit_length (int bitlen);
1229 extern int or_varbit_length (int bitlen);
1230 extern int or_packed_varchar_length (int charlen);
1231 extern int or_varchar_length (int charlen);
1232 extern int or_packed_recdesc_length (int length);
1233 
1234 /*
1235  * to avoid circular dependencies, don't require the definition of QFILE_LIST_ID in
1236  * this file (it references DB_TYPE)
1237  */
1238 extern int or_listid_length (void *listid);
1239 extern int or_method_sig_list_length (void *method_sig_list_ptr);
1240 extern int or_set_node_length (void *set_node_ptr);
1241 #if defined(ENABLE_UNUSED_FUNCTION)
1242 extern int or_elo_length (void *elo_ptr);
1243 extern int or_packed_string_array_length (int count, const char **string_array);
1244 extern int or_packed_db_value_array_length (int count, DB_VALUE * val);
1245 #endif
1246 
1247 extern void or_encode (char *buffer, const char *source, int size);
1248 extern void or_decode (const char *buffer, char *dest, int size);
1249 
1250 extern void or_init (OR_BUF * buf, char *data, int length);
1251 
1252 /* These are called when overflow/underflow are detected */
1253 extern int or_overflow (OR_BUF * buf);
1254 extern int or_underflow (OR_BUF * buf);
1255 extern void or_abort (OR_BUF * buf);
1256 
1257 /* Data packing functions */
1258 extern int or_put_byte (OR_BUF * buf, int num);
1259 extern int or_put_short (OR_BUF * buf, int num);
1260 extern int or_put_int (OR_BUF * buf, int num);
1261 extern int or_put_bigint (OR_BUF * buf, DB_BIGINT num);
1262 extern int or_put_float (OR_BUF * buf, float num);
1263 extern int or_put_double (OR_BUF * buf, double num);
1264 extern int or_put_time (OR_BUF * buf, DB_TIME * timeval);
1265 extern int or_put_utime (OR_BUF * buf, DB_UTIME * timeval);
1266 extern int or_put_timestamptz (OR_BUF * buf, DB_TIMESTAMPTZ * ts_tz);
1267 extern int or_put_date (OR_BUF * buf, DB_DATE * date);
1268 extern int or_put_datetime (OR_BUF * buf, DB_DATETIME * datetimeval);
1269 extern int or_put_datetimetz (OR_BUF * buf, DB_DATETIMETZ * datetimetz);
1270 extern int or_put_monetary (OR_BUF * buf, DB_MONETARY * monetary);
1271 extern int or_put_string_aligned (OR_BUF * buf, char *string);
1272 extern int or_put_string_aligned_with_length (OR_BUF * buf, const char *str);
1273 #if defined(ENABLE_UNUSED_FUNCTION)
1274 extern int or_put_binary (OR_BUF * buf, DB_BINARY * binary);
1275 #endif
1276 extern int or_put_data (OR_BUF * buf, const char *data, int length);
1277 extern int or_put_oid (OR_BUF * buf, const OID * oid);
1278 extern int or_put_varbit (OR_BUF * buf, const char *string, int bitlen);
1279 extern int or_packed_put_varbit (OR_BUF * buf, const char *string, int bitlen);
1280 extern int or_put_varchar (OR_BUF * buf, char *string, int charlen);
1281 extern int or_packed_put_varchar (OR_BUF * buf, char *string, int charlen);
1282 extern int or_put_align32 (OR_BUF * buf);
1283 extern int or_put_offset (OR_BUF * buf, int num);
1284 extern int or_put_offset_internal (OR_BUF * buf, int num, int offset_size);
1285 extern int or_put_mvccid (OR_BUF * buf, MVCCID mvccid);
1286 
1287 /* Data unpacking functions */
1288 extern int or_get_byte (OR_BUF * buf, int *error);
1289 extern int or_get_short (OR_BUF * buf, int *error);
1290 extern int or_get_int (OR_BUF * buf, int *error);
1291 extern DB_BIGINT or_get_bigint (OR_BUF * buf, int *error);
1292 extern float or_get_float (OR_BUF * buf, int *error);
1293 extern double or_get_double (OR_BUF * buf, int *error);
1294 extern int or_get_time (OR_BUF * buf, DB_TIME * timeval);
1295 extern int or_get_utime (OR_BUF * buf, DB_UTIME * timeval);
1296 extern int or_get_timestamptz (OR_BUF * buf, DB_TIMESTAMPTZ * ts_tz);
1297 extern int or_get_date (OR_BUF * buf, DB_DATE * date);
1298 extern int or_get_datetime (OR_BUF * buf, DB_DATETIME * datetime);
1299 extern int or_get_datetimetz (OR_BUF * buf, DB_DATETIMETZ * datetimetz);
1300 extern int or_get_monetary (OR_BUF * buf, DB_MONETARY * monetary);
1301 extern int or_get_data (OR_BUF * buf, char *data, int length);
1302 extern int or_get_oid (OR_BUF * buf, OID * oid);
1303 extern int or_get_offset (OR_BUF * buf, int *error);
1304 extern int or_get_offset_internal (OR_BUF * buf, int *error, int offset_size);
1305 extern int or_get_mvccid (OR_BUF * buf, MVCCID * mvccid);
1306 
1307 extern int or_skip_varchar_remainder (OR_BUF * buf, int charlen, int align);
1308 extern int or_skip_varchar (OR_BUF * buf, int align);
1309 extern int or_skip_varbit (OR_BUF * buf, int align);
1310 extern int or_skip_varbit_remainder (OR_BUF * buf, int bitlen, int align);
1311 
1312 /* Pack/unpack support functions */
1313 extern int or_advance (OR_BUF * buf, int offset);
1314 extern int or_seek (OR_BUF * buf, int psn);
1315 extern int or_align (OR_BUF * buf, int alignment);
1316 extern int or_pad (OR_BUF * buf, int length);
1317 #if defined(ENABLE_UNUSED_FUNCTION)
1318 extern int or_length_string (char *string);
1319 extern int or_length_binary (DB_BINARY * binary);
1320 #endif
1321 
1322 extern int or_get_varchar_length (OR_BUF * buf, int *intval);
1323 extern int or_get_align (OR_BUF * buf, int align);
1324 extern int or_get_align32 (OR_BUF * buf);
1325 extern int or_get_align64 (OR_BUF * buf);
1326 #if defined(ENABLE_UNUSED_FUNCTION)
1327 extern char *or_get_varchar (OR_BUF * buf, int *length_ptr);
1328 extern char *or_get_varbit (OR_BUF * buf, int *length_ptr);
1329 #endif
1330 extern int or_get_varbit_length (OR_BUF * buf, int *intval);
1331 
1332 extern char *or_unpack_var_table (char *ptr, int nvars, OR_VARINFO * vars);
1333 extern OR_VARINFO *or_get_var_table (OR_BUF * buf, int nvars, char *(*allocator) (int));
1334 
1335 extern OR_VARINFO *or_get_var_table_internal (OR_BUF * buf, int nvars, char *(*allocator) (int), int offset_size);
1336 
1337 /* DOMAIN functions */
1338 extern int or_packed_domain_size (struct tp_domain *domain, int include_classoids);
1339 extern char *or_pack_domain (char *ptr, struct tp_domain *domain, int include_classoids, int is_null);
1340 extern char *or_unpack_domain (char *ptr, struct tp_domain **domain_ptr, int *is_null);
1341 extern int or_put_domain (OR_BUF * buf, struct tp_domain *domain, int include_classoids, int is_null);
1342 extern struct tp_domain *or_get_domain (OR_BUF * buf, struct tp_domain *dom, int *is_null);
1343 extern int or_put_sub_domain (OR_BUF * buf);
1344 
1345 /* SET functions */
1346 extern void or_packed_set_info (DB_TYPE set_type, struct tp_domain *domain, int include_domain, int *bound_bits,
1347  int *offset_table, int *element_tags, int *element_size);
1348 
1349 extern int or_put_set_header (OR_BUF * buf, DB_TYPE set_type, int size, int domain, int bound_bits, int offset_table,
1350  int element_tags, int common_sub_header);
1351 
1352 extern int or_get_set_header (OR_BUF * buf, DB_TYPE * set_type, int *size, int *domain, int *bound_bits,
1353  int *offset_table, int *element_tags, int *common_sub_header);
1354 
1355 extern int or_skip_set_header (OR_BUF * buf);
1356 
1357 extern int or_packed_set_length (setobj * set, int include_domain);
1358 
1359 extern void or_put_set (OR_BUF * buf, setobj * set, int include_domain);
1360 
1361 extern setobj *or_get_set (OR_BUF * buf, struct tp_domain *domain);
1362 extern int or_disk_set_size (OR_BUF * buf, struct tp_domain *domain, DB_TYPE * set_type);
1363 
1364 /* DB_VALUE functions */
1365 extern int or_packed_value_size (const DB_VALUE * value, int collapse_null, int include_domain,
1366  int include_domain_classoids);
1367 
1368 extern int or_put_value (OR_BUF * buf, DB_VALUE * value, int collapse_null, int include_domain,
1369  int include_domain_classoids);
1370 
1371 extern int or_get_value (OR_BUF * buf, DB_VALUE * value, struct tp_domain *domain, int expected, bool copy);
1372 
1373 extern char *or_pack_value (char *buf, DB_VALUE * value);
1374 extern char *or_pack_mem_value (char *ptr, DB_VALUE * value, int *packed_len_except_alignment);
1375 extern char *or_unpack_value (const char *buf, DB_VALUE * value);
1376 extern char *or_unpack_mem_value (char *buf, DB_VALUE * value);
1377 
1378 extern int or_packed_enumeration_size (const DB_ENUMERATION * e);
1379 extern int or_put_enumeration (OR_BUF * buf, const DB_ENUMERATION * e);
1380 extern int or_get_enumeration (OR_BUF * buf, DB_ENUMERATION * e);
1381 extern int or_header_size (char *ptr);
1382 extern char *or_pack_mvccid (char *ptr, const MVCCID mvccid);
1383 extern char *or_unpack_mvccid (char *ptr, MVCCID * mvccid);
1384 
1385 extern char *or_pack_sha1 (char *ptr, const SHA1Hash * sha1);
1386 extern char *or_unpack_sha1 (char *ptr, SHA1Hash * sha1);
1387 
1389 /* Get the compressed and the decompressed lengths of a string stored in buffer */
1390 STATIC_INLINE int or_get_varchar_compression_lengths (OR_BUF * buf, int *compressed_size, int *decompressed_size)
1392 
1393 extern int or_packed_spacedb_size (const SPACEDB_ALL * all, const SPACEDB_ONEVOL * vols, const SPACEDB_FILES * files);
1394 extern char *or_pack_spacedb (char *ptr, const SPACEDB_ALL * all, const SPACEDB_ONEVOL * vols,
1395  const SPACEDB_FILES * files);
1396 extern char *or_unpack_spacedb (char *ptr, SPACEDB_ALL * all, SPACEDB_ONEVOL ** vols, SPACEDB_FILES * files);
1397 
1398 /* class object */
1399 extern int classobj_decompose_property_oid (const char *buffer, int *volid, int *fileid, int *pageid);
1400 extern void classobj_initialize_default_expr (DB_DEFAULT_EXPR * default_expr);
1401 extern int classobj_get_prop (DB_SEQ * properties, const char *name, DB_VALUE * pvalue);
1402 #if defined (__cplusplus)
1403 extern int or_get_json_validator (OR_BUF * buf, REFPTR (JSON_VALIDATOR, validator));
1404 extern int or_put_json_validator (OR_BUF * buf, JSON_VALIDATOR * validator);
1405 extern int or_get_json_schema (OR_BUF * buf, REFPTR (char, schema));
1406 extern int or_put_json_schema (OR_BUF * buf, const char *schema);
1407 #endif
1408 
1409 /* Because of the VARNCHAR and STRING encoding, this one could not be changed for over 255, just lower. */
1410 #define OR_MINIMUM_STRING_LENGTH_FOR_COMPRESSION 255
1411 
1412 #define OR_IS_STRING_LENGTH_COMPRESSABLE(str_length) \
1413  ((str_length) >= OR_MINIMUM_STRING_LENGTH_FOR_COMPRESSION && (str_length) <= LZ4_MAX_INPUT_SIZE)
1414 
1415 /*
1416  * or_get_string_size_byte - read string size byte value from or buffer
1417  * return: byte value read
1418  * buf(in/out): or buffer
1419  * error(out): NO_ERROR or error code
1420  *
1421  * NOTE that it is really same as or_get_byte function. It is duplicated to inline the function for performance.
1422  */
1423 STATIC_INLINE int
1425 {
1426  int size_prefix;
1427 
1428  if ((buf->ptr + OR_BYTE_SIZE) > buf->endptr)
1429  {
1430  *error = or_underflow (buf);
1431  size_prefix = 0;
1432  }
1433  else
1434  {
1435  size_prefix = OR_GET_BYTE (buf->ptr);
1436  buf->ptr += OR_BYTE_SIZE;
1437  *error = NO_ERROR;
1438  }
1439  return size_prefix;
1440 }
1441 
1442 /* or_get_varchar_compression_lengths() - Function to get the compressed length and the uncompressed length of
1443  * a compressed string.
1444  *
1445  * return : NO_ERROR or error_code.
1446  * buf(in) : The buffer where the string is stored.
1447  * compressed_size(out) : The compressed size of the string. Set to 0 if the string was not compressed.
1448  * decompressed_size(out) : The uncompressed size of the string.
1449  */
1450 STATIC_INLINE int
1451 or_get_varchar_compression_lengths (OR_BUF * buf, int *compressed_size, int *decompressed_size)
1452 {
1453  int compressed_length = 0, decompressed_length = 0, rc = NO_ERROR, net_charlen = 0;
1454  int size_prefix = 0;
1455 
1456  /* Check if the string is compressed */
1457  size_prefix = or_get_string_size_byte (buf, &rc);
1458  if (rc != NO_ERROR)
1459  {
1460  assert (size_prefix == 0);
1461  return rc;
1462  }
1463 
1464  if (size_prefix == OR_MINIMUM_STRING_LENGTH_FOR_COMPRESSION)
1465  {
1466  /* String was compressed */
1467  /* Get the compressed size */
1468  rc = or_get_data (buf, (char *) &net_charlen, OR_INT_SIZE);
1469  compressed_length = OR_GET_INT ((char *) &net_charlen);
1470  if (rc != NO_ERROR)
1471  {
1472  return rc;
1473  }
1474  *compressed_size = compressed_length;
1475 
1476  net_charlen = 0;
1477 
1478  /* Get the decompressed size */
1479  rc = or_get_data (buf, (char *) &net_charlen, OR_INT_SIZE);
1480  decompressed_length = OR_GET_INT ((char *) &net_charlen);
1481  if (rc != NO_ERROR)
1482  {
1483  return rc;
1484  }
1485  *decompressed_size = decompressed_length;
1486  }
1487  else
1488  {
1489  /* String was not compressed so we set compressed_size to 0 to know that no compression happened. */
1490  *compressed_size = 0;
1491  *decompressed_size = size_prefix;
1492  }
1493 
1494  return rc;
1495 }
1496 #endif /* _OBJECT_REPRESENTATION_H_ */
char * or_unpack_var_table(char *ptr, int nvars, OR_VARINFO *vars)
char * or_unpack_set(char *ptr, setobj **set, struct tp_domain *domain)
Definition: sha1.h:50
char * or_unpack_hfid_array(char *ptr, int n, HFID **hfids)
char * or_unpack_oid(char *ptr, OID *oid)
struct or_fixup * fixups
char * or_pack_btid(char *buf, const BTID *btid)
void OR_PUT_FLOAT(char *ptr, float val)
#define NO_ERROR
Definition: error_code.h:46
int or_get_enumeration(OR_BUF *buf, DB_ENUMERATION *e)
int or_rep_id(RECDES *record)
#define __attribute__(X)
Definition: porting.h:36
unsigned int length
char * or_pack_bool_array(char *ptr, const bool *bools, int size)
int or_get_mvccid(OR_BUF *buf, MVCCID *mvccid)
int or_get_varbit_length(OR_BUF *buf, int *intval)
STATIC_INLINE int or_get_varchar_compression_lengths(OR_BUF *buf, int *compressed_size, int *decompressed_size) __attribute__((ALWAYS_INLINE))
float or_get_float(OR_BUF *buf, int *error)
int or_put_float(OR_BUF *buf, float num)
char * or_unpack_string(char *ptr, char **string)
int or_packed_value_size(const DB_VALUE *value, int collapse_null, int include_domain, int include_domain_classoids)
int or_put_oid(OR_BUF *buf, const OID *oid)
void or_abort(OR_BUF *buf)
int or_mvcc_set_repid_and_flags(OR_BUF *buf, int mvcc_flag, int repid, int bound_bit, int variable_offset_size)
char * or_pack_ehid(char *buf, EHID *btid)
int or_listid_length(void *listid)
int or_packed_varchar_length(int charlen)
int or_get_json_schema(OR_BUF *buf, REFPTR(char, schema))
int or_put_domain(OR_BUF *buf, struct tp_domain *domain, int include_classoids, int is_null)
char * or_pack_errcode(char *ptr, int error)
char * or_pack_recdes(char *buf, RECDES *recdes)
size_t align(size_t v)
Definition: align.h:19
char * or_unpack_unbound_listid(char *ptr, void **listid_ptr)
int or_put_time(OR_BUF *buf, DB_TIME *timeval)
DB_TYPE
Definition: dbtype_def.h:670
UINT64 htond(double from)
double or_get_double(OR_BUF *buf, int *error)
int or_get_datetimetz(OR_BUF *buf, DB_DATETIMETZ *datetimetz)
#define ALWAYS_INLINE
char * or_unpack_string_alloc(char *ptr, char **string)
char * or_pack_db_value(char *buffer, DB_VALUE *var)
int classobj_get_prop(DB_SEQ *properties, const char *name, DB_VALUE *pvalue)
int or_put_datetimetz(OR_BUF *buf, DB_DATETIMETZ *datetimetz)
char * or_pack_string(char *ptr, const char *string)
char * or_pack_value(char *buf, DB_VALUE *value)
int or_get_oid(OR_BUF *buf, OID *oid)
int or_packed_recdesc_length(int length)
int or_put_varbit(OR_BUF *buf, const char *string, int bitlen)
void OR_PUT_DOUBLE(char *ptr, double val)
char * or_unpack_ehid(char *buf, EHID *btid)
char * or_unpack_set_node(char *ptr, void *set_node_ptr)
int or_skip_varchar_remainder(OR_BUF *buf, int charlen, int align)
char * or_unpack_spacedb(char *ptr, SPACEDB_ALL *all, SPACEDB_ONEVOL **vols, SPACEDB_FILES *files)
int or_packed_enumeration_size(const DB_ENUMERATION *e)
int or_varchar_length(int charlen)
void or_packed_set_info(DB_TYPE set_type, struct tp_domain *domain, int include_domain, int *bound_bits, int *offset_table, int *element_tags, int *element_size)
#define OR_GET_BYTE(ptr)
char * or_unpack_string_nocopy(char *ptr, char **string)
int or_put_value(OR_BUF *buf, DB_VALUE *value, int collapse_null, int include_domain, int include_domain_classoids)
int or_skip_varbit(OR_BUF *buf, int align)
char * or_pack_oid(char *ptr, const OID *oid)
char * or_unpack_recdes(char *buf, RECDES **recdes)
int or_packed_domain_size(struct tp_domain *domain, int include_classoids)
int or_put_date(OR_BUF *buf, DB_DATE *date)
int or_get_monetary(OR_BUF *buf, DB_MONETARY *monetary)
char * or_unpack_log_lsa(char *ptr, struct log_lsa *lsa)
char * or_unpack_int_array(char *ptr, int n, int **number_array)
int or_packed_bool_array_length(const bool *bools, int size)
char * or_unpack_errcode(char *ptr, int *error)
int or_get_align(OR_BUF *buf, int align)
char * or_pack_short(char *ptr, short number)
char * or_pack_mvccid(char *ptr, const MVCCID mvccid)
int or_set_node_length(void *set_node_ptr)
int or_skip_set_header(OR_BUF *buf)
int or_get_varchar_length(OR_BUF *buf, int *intval)
int or_put_utime(OR_BUF *buf, DB_UTIME *timeval)
int or_packed_stream_length(size_t len)
int or_put_mvccid(OR_BUF *buf, MVCCID mvccid)
LOCK
char * or_pack_int64(char *ptr, INT64 number)
char * or_pack_double(char *ptr, double number)
int or_get_utime(OR_BUF *buf, DB_UTIME *timeval)
int or_put_set_header(OR_BUF *buf, DB_TYPE set_type, int size, int domain, int bound_bits, int offset_table, int element_tags, int common_sub_header)
int or_put_timestamptz(OR_BUF *buf, DB_TIMESTAMPTZ *ts_tz)
char * or_pack_float(char *ptr, float number)
int classobj_decompose_property_oid(const char *buffer, int *volid, int *fileid, int *pageid)
void classobj_initialize_default_expr(DB_DEFAULT_EXPR *default_expr)
char * or_pack_hfid(const char *ptr, const HFID *hfid)
void or_decode(const char *buffer, char *dest, int size)
Definition: db_set.h:35
char * or_pack_stream(char *ptr, const char *stream, size_t len)
STATIC_INLINE int or_get_string_size_byte(OR_BUF *buf, int *error) __attribute__((ALWAYS_INLINE))
#define assert(x)
int or_packed_string_length(const char *string, int *strlen)
char * or_unpack_btid(char *buf, BTID *btid)
#define STATIC_INLINE
int or_get_set_header(OR_BUF *buf, DB_TYPE *set_type, int *size, int *domain, int *bound_bits, int *offset_table, int *element_tags, int *common_sub_header)
int or_get_time(OR_BUF *buf, DB_TIME *timeval)
int or_mvcc_get_repid_and_flags(OR_BUF *buf, int *error)
int or_get_short(OR_BUF *buf, int *error)
int or_put_json_validator(OR_BUF *buf, JSON_VALIDATOR *validator)
#define REFPTR(T, name)
Definition: porting.h:1089
int or_chn(RECDES *record)
char * or_pack_spacedb(char *ptr, const SPACEDB_ALL *all, const SPACEDB_ONEVOL *vols, const SPACEDB_FILES *files)
int or_disk_set_size(OR_BUF *buf, struct tp_domain *domain, DB_TYPE *set_type)
char * or_unpack_hfid(char *ptr, HFID *hfid)
char * or_unpack_lock(char *ptr, LOCK *lock)
int or_put_int(OR_BUF *buf, int num)
char * or_pack_sha1(char *ptr, const SHA1Hash *sha1)
int or_db_value_size(DB_VALUE *var)
DB_BIGINT or_get_bigint(OR_BUF *buf, int *error)
int or_put_string_aligned(OR_BUF *buf, char *string)
int or_get_datetime(OR_BUF *buf, DB_DATETIME *datetime)
char * or_pack_string_with_null_padding(char *ptr, const char *stream, size_t len)
int or_put_bigint(OR_BUF *buf, DB_BIGINT num)
int or_varbit_length(int bitlen)
int or_put_byte(OR_BUF *buf, int num)
int or_overflow(OR_BUF *buf)
int or_align(OR_BUF *buf, int alignment)
int or_put_short(OR_BUF *buf, int num)
int or_put_offset(OR_BUF *buf, int num)
int db_string_put_cs_and_collation(DB_VALUE *value, const int codeset, const int collation_id)
Definition: db_macro.c:4164
int or_get_align64(OR_BUF *buf)
int or_replace_chn(RECDES *record, int chn)
int or_header_size(char *ptr)
int or_put_offset_internal(OR_BUF *buf, int num, int offset_size)
char * or_unpack_sha1(char *ptr, SHA1Hash *sha1)
UINT64 MVCCID
struct db_object * owner
char * or_pack_set_header(char *buf, DB_TYPE stype, DB_TYPE etype, int bound_bits, int size)
char * or_unpack_float(char *ptr, float *number)
int or_Type_sizes[]
unsigned char * data
int or_method_sig_list_length(void *method_sig_list_ptr)
char * or_unpack_int(char *ptr, int *number)
void or_init(OR_BUF *buf, char *data, int length)
int or_get_timestamptz(OR_BUF *buf, DB_TIMESTAMPTZ *ts_tz)
char * or_unpack_longint(char *ptr, int *number)
char * or_unpack_int64(char *ptr, INT64 *number)
int or_set_rep_id(RECDES *record, int repid)
int count(int &result, const cub_regex_object &reg, const std::string &src, const int position, const INTL_CODESET codeset)
int or_packed_spacedb_size(const SPACEDB_ALL *all, const SPACEDB_ONEVOL *vols, const SPACEDB_FILES *files)
char * or_unpack_mem_value(char *buf, DB_VALUE *value)
setobj * or_get_set(OR_BUF *buf, struct tp_domain *domain)
char * or_pack_mem_value(char *ptr, DB_VALUE *value, int *packed_len_except_alignment)
char * or_unpack_listid(char *ptr, void *listid_ptr)
int64_t DB_BIGINT
Definition: dbtype_def.h:751
int or_put_enumeration(OR_BUF *buf, const DB_ENUMERATION *e)
char * or_unpack_bool_array(char *ptr, bool **bools)
int or_get_offset_internal(OR_BUF *buf, int *error, int offset_size)
int or_packed_set_length(setobj *set, int include_domain)
int or_put_varchar(OR_BUF *buf, char *string, int charlen)
static void error(const char *msg)
Definition: gencat.c:331
int or_put_datetime(OR_BUF *buf, DB_DATETIME *datetimeval)
static int rc
Definition: serial.c:50
char * or_pack_int(char *ptr, int number)
int or_skip_varbit_remainder(OR_BUF *buf, int bitlen, int align)
int or_seek(OR_BUF *buf, int psn)
int or_put_monetary(OR_BUF *buf, DB_MONETARY *monetary)
char * or_class_name(RECDES *record)
char * or_unpack_setref(char *ptr, DB_SET **ref)
#define OR_BYTE_SIZE
char * or_pack_listid(char *ptr, void *listid)
char * or_pack_method_sig_list(char *ptr, void *method_sig_list)
int valcnv_convert_value_to_string(DB_VALUE *value)
Definition: db_macro.c:4901
#define OR_MINIMUM_STRING_LENGTH_FOR_COMPRESSION
unsigned int DB_TIME
Definition: dbtype_def.h:754
char * or_unpack_set_header(char *buf, DB_TYPE *stype, DB_TYPE *etype, int *bound_bits, int *size)
char * or_unpack_mvccid(char *ptr, MVCCID *mvccid)
char * or_pack_oid_array(char *ptr, int n, const OID *oids)
unsigned int DB_DATE
Definition: dbtype_def.h:771
#define OR_GET_INT(ptr)
int or_underflow(OR_BUF *buf)
UINT32 htonf(float from)
#define strlen(s1)
Definition: intl_support.c:43
char * or_pack_lock(char *ptr, LOCK lock)
char * or_unpack_ptr(char *ptr, UINTPTR *ptrval)
int or_packed_varbit_length(int bitlen)
char * or_pack_string_with_length(char *ptr, const char *string, int length)
int or_get_offset(OR_BUF *buf, int *error)
int db_enum_put_cs_and_collation(DB_VALUE *value, const int codeset, const int collation_id)
Definition: db_macro.c:4191
char * or_pack_domain(char *ptr, struct tp_domain *domain, int include_classoids, int is_null)
int or_put_align32(OR_BUF *buf)
char * or_unpack_method_sig_list(char *ptr, void **method_sig_list_ptr)
OR_VARINFO * or_get_var_table(OR_BUF *buf, int nvars, char *(*allocator)(int))
int or_packed_put_varbit(OR_BUF *buf, const char *string, int bitlen)
int or_get_align32(OR_BUF *buf)
OR_VARINFO * or_get_var_table_internal(OR_BUF *buf, int nvars, char *(*allocator)(int), int offset_size)
int or_get_date(OR_BUF *buf, DB_DATE *date)
char * or_unpack_value(const char *buf, DB_VALUE *value)
char * or_pack_ptr(char *ptr, UINTPTR ptrval)
int or_packed_put_varchar(OR_BUF *buf, char *string, int charlen)
int or_put_data(OR_BUF *buf, const char *data, int length)
int or_put_json_schema(OR_BUF *buf, const char *schema)
int or_get_data(OR_BUF *buf, char *data, int length)
char * or_pack_log_lsa(const char *ptr, const struct log_lsa *lsa)
void or_encode(char *buffer, const char *source, int size)
int or_put_double(OR_BUF *buf, double num)
int or_get_byte(OR_BUF *buf, int *error)
char * or_unpack_oid_array(char *ptr, int n, OID **oids)
int or_put_sub_domain(OR_BUF *buf)
char * or_unpack_stream(char *ptr, char *stream, size_t len)
struct db_object * handle
char * or_unpack_double(char *ptr, double *number)
DB_TIMESTAMP DB_UTIME
Definition: dbtype_def.h:761
int or_get_int(OR_BUF *buf, int *error)
int or_get_value(OR_BUF *buf, DB_VALUE *value, struct tp_domain *domain, int expected, bool copy)
int or_set_element_offset(char *setptr, int element)
char * or_unpack_short(char *ptr, short *number)
int or_put_string_aligned_with_length(OR_BUF *buf, const char *str)
char * or_pack_set_node(char *ptr, void *set_node)
int or_pad(OR_BUF *buf, int length)
char * or_unpack_domain(char *ptr, struct tp_domain **domain_ptr, int *is_null)
void or_put_set(OR_BUF *buf, setobj *set, int include_domain)
char * or_unpack_db_value(char *buffer, DB_VALUE *val)
int or_advance(OR_BUF *buf, int offset)
struct tp_domain * or_get_domain(OR_BUF *buf, struct tp_domain *dom, int *is_null)
int or_get_json_validator(OR_BUF *buf, REFPTR(JSON_VALIDATOR, validator))
int or_skip_varchar(OR_BUF *buf, int align)