CUBRID Engine  latest
packer.cpp
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  * packer.cpp
21  */
22 
23 #ident "$Id$"
24 
25 #include "packer.hpp"
26 
27 #include "dbtype_def.h"
28 #include "memory_alloc.h"
29 #include "object_representation.h"
30 #include "packable_object.hpp"
31 
32 #include <algorithm>
33 #include <cstring>
34 #include <vector>
35 #include <string>
36 
37 namespace cubpacking
38 {
39 #define MAX_SMALL_STRING_SIZE 255
40 #define LARGE_STRING_CODE 0xff
41 
42  //
43  // static function declarations
44  //
45  static void check_range (const char *ptr, const char *endptr, const size_t amount);
46 
47  //
48  // static function definitions
49  static void
50  check_range (const char *ptr, const char *endptr, const size_t amount)
51  {
52  assert (ptr + amount <= endptr);
53  if (ptr + amount > endptr)
54  {
55  abort ();
56  }
57  }
58 
59  //
60  // packer
61  //
62 
64  {
65  // all pointers are initialized to NULL
66  }
67 
68  packer::packer (char *storage, const size_t amount)
69  {
70  set_buffer (storage, amount);
71  }
72 
73  void
74  packer::set_buffer (char *storage, const size_t amount)
75  {
76  m_start_ptr = storage;
77  m_ptr = storage;
78  m_end_ptr = m_start_ptr + amount;
79  }
80 
81  unpacker::unpacker (const char *storage, const size_t amount)
82  {
83  set_buffer (storage, amount);
84  }
85 
86  void
87  unpacker::set_buffer (const char *storage, const size_t amount)
88  {
89  m_start_ptr = storage;
90  m_ptr = storage;
91  m_end_ptr = m_start_ptr + amount;
92  }
93 
94  size_t
95  packer::get_packed_int_size (size_t curr_offset)
96  {
97  return DB_ALIGN (curr_offset, INT_ALIGNMENT) - curr_offset + OR_INT_SIZE;
98  }
99 
100  void
101  packer::pack_int (const int value)
102  {
105 
106  OR_PUT_INT (m_ptr, value);
107  m_ptr += OR_INT_SIZE;
108  }
109 
110  size_t
111  packer::get_packed_size_overloaded (int value, size_t curr_offset)
112  {
113  return get_packed_int_size (curr_offset);
114  }
115 
116  void
118  {
119  pack_int (value);
120  }
121 
122  void
123  unpacker::unpack_int (int &value)
124  {
127 
128  value = OR_GET_INT (m_ptr);
129  m_ptr += OR_INT_SIZE;
130  }
131 
132  void
134  {
135  unpack_int (value);
136  }
137 
138  void
140  {
143 
144  value = OR_GET_INT (m_ptr);
145  }
146 
147  size_t
148  packer::get_packed_bool_size (size_t curr_offset)
149  {
150  return get_packed_int_size (curr_offset);
151  }
152 
153  void
154  packer::pack_bool (bool value)
155  {
156  pack_int (value ? 1 : 0);
157  }
158 
159  size_t
160  packer::get_packed_size_overloaded (bool value, size_t curr_offset)
161  {
162  return get_packed_bool_size (curr_offset);
163  }
164 
165  void
167  {
168  pack_bool (value);
169  }
170 
171  void
172  unpacker::unpack_bool (bool &value)
173  {
174  int int_val;
175  unpack_int (int_val);
176  assert (int_val == 1 || int_val == 0);
177  value = int_val != 0;
178  }
179 
180  void
182  {
183  unpack_bool (value);
184  }
185 
186  size_t
187  packer::get_packed_short_size (size_t curr_offset)
188  {
189  return DB_ALIGN (curr_offset, SHORT_ALIGNMENT) - curr_offset + OR_SHORT_SIZE;
190  }
191 
192  void
193  packer::pack_short (const short value)
194  {
197 
198  OR_PUT_SHORT (m_ptr, value);
199  m_ptr += OR_SHORT_SIZE;
200  }
201 
202  size_t
203  packer::get_packed_size_overloaded (short value, size_t curr_offset)
204  {
205  return get_packed_short_size (curr_offset);
206  }
207 
208  void
210  {
211  pack_short (value);
212  }
213 
214  void
215  unpacker::unpack_short (short &value)
216  {
219 
220  value = OR_GET_SHORT (m_ptr);
221  m_ptr += OR_SHORT_SIZE;
222  }
223 
224  void
226  {
227  unpack_short (value);
228  }
229 
230  size_t
231  packer::get_packed_bigint_size (size_t curr_offset)
232  {
233  return DB_ALIGN (curr_offset, MAX_ALIGNMENT) - curr_offset + OR_BIGINT_SIZE;
234  }
235 
236  void
237  packer::pack_bigint (const std::int64_t &value)
238  {
241 
242  OR_PUT_INT64 (m_ptr, &value);
244  }
245 
246  void
247  unpacker::unpack_bigint (std::int64_t &value)
248  {
251 
252  OR_GET_INT64 (m_ptr, &value);
254  }
255 
256  void
257  packer::pack_bigint (const std::uint64_t &value)
258  {
261 
262  OR_PUT_INT64 (m_ptr, &value);
264  }
265 
266  size_t
267  packer::get_packed_size_overloaded (const std::int64_t &value, size_t curr_offset)
268  {
269  return get_packed_bigint_size (curr_offset);
270  }
271 
272  size_t
273  packer::get_packed_size_overloaded (const std::uint64_t &value, size_t curr_offset)
274  {
275  return get_packed_bigint_size (curr_offset);
276  }
277 
278  void
279  packer::pack_overloaded (const std::int64_t &value)
280  {
281  pack_bigint (value);
282  }
283 
284  void
285  packer::pack_overloaded (const std::uint64_t &value)
286  {
287  pack_bigint (value);
288  }
289 
290  void
291  unpacker::unpack_bigint (std::uint64_t &value)
292  {
295 
296  OR_GET_INT64 (m_ptr, &value);
298  }
299 
300  void
301  unpacker::unpack_overloaded (std::int64_t &value)
302  {
303  unpack_bigint (value);
304  }
305 
306  void
307  unpacker::unpack_overloaded (std::uint64_t &value)
308  {
309  unpack_bigint (value);
310  }
311 
312  void
313  packer::pack_int_array (const int *array, const int count)
314  {
316  check_range (m_ptr, m_end_ptr, (OR_INT_SIZE * (count + 1)));
317 
318  OR_PUT_INT (m_ptr, count);
319  m_ptr += OR_INT_SIZE;
320  for (int i = 0; i < count; i++)
321  {
322  OR_PUT_INT (m_ptr, array[i]);
323  m_ptr += OR_INT_SIZE;
324  }
325  }
326 
327  void
329  {
332 
333  count = OR_GET_INT (m_ptr);
334  m_ptr += OR_INT_SIZE;
335 
336  if (count == 0)
337  {
338  return;
339  }
340 
342 
343  for (int i = 0; i < count; i++)
344  {
345  array[i] = OR_GET_INT (m_ptr);
346  m_ptr += OR_INT_SIZE;
347  }
348  }
349 
350  size_t
351  packer::get_packed_int_vector_size (size_t curr_offset, const size_t count)
352  {
353  return DB_ALIGN (curr_offset, INT_ALIGNMENT) - curr_offset + (OR_INT_SIZE * (count + 1));
354  }
355 
356  void
357  packer::pack_int_vector (const std::vector<int> &array)
358  {
359  const size_t count = array.size ();
360 
362  check_range (m_ptr, m_end_ptr, (OR_INT_SIZE * (count + 1)));
363 
364  OR_PUT_INT (m_ptr, count);
365  m_ptr += OR_INT_SIZE;
366  for (size_t i = 0; i < count; ++i)
367  {
368  OR_PUT_INT (m_ptr, array[i]);
369  m_ptr += OR_INT_SIZE;
370  }
371  }
372 
373  void
374  unpacker::unpack_int_vector (std::vector<int> &array)
375  {
376  int count;
377 
380 
381  count = OR_GET_INT (m_ptr);
382  m_ptr += OR_INT_SIZE;
383 
385 
386  for (int i = 0; i < count; i++)
387  {
388  array.push_back (OR_GET_INT (m_ptr));
389  m_ptr += OR_INT_SIZE;
390  }
391  }
392 
393  size_t
394  packer::get_packed_db_value_size (const db_value &value, size_t curr_offset)
395  {
396  size_t aligned_offset = DB_ALIGN (curr_offset, MAX_ALIGNMENT);
397  size_t unaligned_size = or_packed_value_size (&value, 1, 1, 0);
398  size_t aligned_size = unaligned_size;
399  return aligned_size + aligned_offset - curr_offset;
400  }
401 
402  void
404  {
405  char *old_ptr;
406 
407  size_t value_size = or_packed_value_size (&value, 1, 1, 0);
408 
410  check_range (m_ptr, m_end_ptr, value_size);
411  old_ptr = m_ptr;
412 
413  m_ptr = or_pack_value (m_ptr, (db_value *) &value);
414  assert (old_ptr + value_size == m_ptr);
415 
417  }
418 
419  size_t
420  packer::get_packed_size_overloaded (const db_value &value, size_t curr_offset)
421  {
422  return get_packed_db_value_size (value, curr_offset);
423  }
424 
425  void
427  {
428  pack_db_value (value);
429  }
430 
431  void
433  {
434  const char *old_ptr;
435 
437  old_ptr = m_ptr;
438  m_ptr = or_unpack_value (m_ptr, &value);
439 
440  size_t value_size = or_packed_value_size (&value, 1, 1, 0);
441  assert (old_ptr + value_size == m_ptr);
442 
444  }
445 
446  void
448  {
449  unpack_db_value (value);
450  }
451 
452  size_t
453  packer::get_packed_small_string_size (const char *string, const size_t curr_offset)
454  {
455  size_t entry_size;
456 
457  entry_size = OR_BYTE_SIZE + strlen (string);
458 
459  return DB_ALIGN (curr_offset + entry_size, INT_ALIGNMENT) - curr_offset;
460  }
461 
462  void
463  packer::pack_small_string (const char *string, const size_t str_size)
464  {
465  size_t len;
466 
467  if (str_size == 0)
468  {
469  len = strlen (string);
470  }
471  else
472  {
473  len = str_size;
474  }
475 
476  if (len > MAX_SMALL_STRING_SIZE)
477  {
478  assert (false);
479  pack_c_string (string, len);
480  return;
481  }
482 
483  check_range (m_ptr, m_end_ptr, len + 1);
484 
485  OR_PUT_BYTE (m_ptr, len);
486  m_ptr += OR_BYTE_SIZE;
487  if (len > 0)
488  {
489  std::memcpy (m_ptr, string, len);
490  m_ptr += len;
491  }
492 
494  }
495 
496  void
497  unpacker::unpack_small_string (char *string, const size_t max_size)
498  {
499  size_t len;
500 
502 
503  len = OR_GET_BYTE (m_ptr);
504  if (len > max_size)
505  {
506  assert (false);
507  return;
508  }
509 
510  m_ptr += OR_BYTE_SIZE;
511 
512  check_range (m_ptr, m_end_ptr, len);
513  if (len > 0)
514  {
515  std::memcpy (string, m_ptr, len);
516  string[len] = '\0';
517  m_ptr += len;
518  }
519  else
520  {
521  *string = '\0';
522  }
523 
525  }
526 
527 
528  size_t
529  packer::get_packed_large_string_size (const std::string &str, const size_t curr_offset)
530  {
531  size_t entry_size;
532 
533  entry_size = OR_INT_SIZE + str.size ();
534 
535  return DB_ALIGN (curr_offset + entry_size, INT_ALIGNMENT) - curr_offset;
536  }
537 
538  void
539  packer::pack_large_c_string (const char *string, const size_t str_size)
540  {
541  size_t len;
542 
543  if (str_size == 0)
544  {
545  len = strlen (string);
546  }
547  else
548  {
549  len = str_size;
550  }
551 
554 
555  OR_PUT_INT (m_ptr, len);
556  m_ptr += OR_INT_SIZE;
557 
558  std::memcpy (m_ptr, string, len);
559  m_ptr += len;
560 
562  }
563 
564  void
565  packer::pack_large_string (const std::string &str)
566  {
567  pack_large_c_string (str.c_str (), str.size ());
568  }
569 
570  void
571  unpacker::unpack_large_string (std::string &str)
572  {
573  size_t len;
574 
576 
578 
579  len = OR_GET_INT (m_ptr);
580  m_ptr += OR_INT_SIZE;
581 
582  if (len > 0)
583  {
584  check_range (m_ptr, m_end_ptr, len);
585  str = std::string (m_ptr, len);
586  m_ptr += len;
587  }
588 
590  }
591 
592  size_t
593  packer::get_packed_string_size (const std::string &str, const size_t curr_offset)
594  {
595  return get_packed_c_string_size (str.c_str (), str.size (), curr_offset);
596  }
597 
598  void
599  packer::pack_string (const std::string &str)
600  {
601  size_t len = str.size ();
602 
603  pack_c_string (str.c_str (), len);
604  }
605 
606  size_t
607  packer::get_packed_size_overloaded (const std::string &value, size_t curr_offset)
608  {
609  return get_packed_string_size (value, curr_offset);
610  }
611 
612  void
613  packer::pack_overloaded (const std::string &str)
614  {
615  pack_string (str);
616  }
617 
618  void
619  unpacker::unpack_string (std::string &str)
620  {
621  size_t len;
622 
624 
625  len = OR_GET_BYTE (m_ptr);
626 
627  if (len == LARGE_STRING_CODE)
628  {
629  m_ptr++;
630  unpack_large_string (str);
631  }
632  else
633  {
634  m_ptr++;
635 
636  str = std::string (m_ptr, len);
637  m_ptr += len;
638 
640  }
641  }
642 
643  void
644  unpacker::unpack_overloaded (std::string &str)
645  {
646  return unpack_string (str);
647  }
648 
649  size_t
650  packer::get_packed_c_string_size (const char *str, const size_t str_size, const size_t curr_offset)
651  {
652  size_t entry_size;
653 
654  if (str_size < MAX_SMALL_STRING_SIZE)
655  {
656  entry_size = OR_BYTE_SIZE + str_size;
657  }
658  else
659  {
660  entry_size = DB_ALIGN (OR_BYTE_SIZE, INT_ALIGNMENT) + OR_INT_SIZE + str_size;
661  }
662 
663  return DB_ALIGN (curr_offset + entry_size, INT_ALIGNMENT) - curr_offset;
664  }
665 
666  void
667  packer::pack_c_string (const char *str, const size_t str_size)
668  {
669  if (str_size < MAX_SMALL_STRING_SIZE)
670  {
671  pack_small_string (str, str_size);
672  }
673  else
674  {
675  check_range (m_ptr, m_end_ptr, str_size + 1 + OR_INT_SIZE);
676 
678  m_ptr++;
679 
680  pack_large_c_string (str, str_size);
681  }
682  }
683 
684  void
686  {
688  len = OR_GET_BYTE (m_ptr);
689  if (len == LARGE_STRING_CODE)
690  {
691  m_ptr++;
692 
693  align (OR_INT_SIZE);
694 
695  len = OR_GET_INT (m_ptr);
696  m_ptr += OR_INT_SIZE;
697  }
698  else
699  {
700  m_ptr++;
701  }
702  if (len > 0)
703  {
704  check_range (m_ptr, m_end_ptr, len);
705  }
706  }
707 
708  void
709  unpacker::unpack_c_string (char *str, const size_t max_str_size)
710  {
711  size_t len = 0;
712 
713  unpack_string_size (len);
714 
715  if (len >= max_str_size)
716  {
717  assert (false);
718  return;
719  }
720  if (len > 0)
721  {
722  std::memcpy (str, m_ptr, len);
723  m_ptr += len;
724  }
725 
726  str[len] = '\0';
727 
729  }
730 
731  void
733  {
734  size_t len;
735  unpack_string_size (len);
736 
737  // make sure memory size is enough
738  blk.extend_to (len + 1);
739 
740  if (len > 0)
741  {
742  std::memcpy (blk.get_ptr (), m_ptr, len);
743  m_ptr += len;
744  }
745  blk.get_ptr ()[len] = '\0';
746 
748  }
749 
750  size_t
751  packer::get_packed_size_overloaded (const packable_object &po, size_t curr_offset)
752  {
753  // align first
754  size_t aligned_offset = DB_ALIGN (curr_offset, MAX_ALIGNMENT);
755  return po.get_packed_size (*this) + aligned_offset - curr_offset;
756  }
757 
758  void
760  {
761  po.pack (*this);
762  }
763 
764  void
766  {
767  po.unpack (*this);
768  }
769 
770  size_t
771  packer::get_packed_oid_size (const size_t curr_offset)
772  {
773  return DB_ALIGN (curr_offset + OR_OID_SIZE, INT_ALIGNMENT) - curr_offset;
774  }
775 
776  void
777  packer::pack_oid (const OID &oid)
778  {
781 
782  OR_PUT_OID (m_ptr, &oid);
783  m_ptr += OR_OID_SIZE;
784  }
785 
786  size_t
787  packer::get_packed_size_overloaded (const OID &oid, size_t curr_offset)
788  {
789  return get_packed_oid_size (curr_offset);
790  }
791 
792  void
794  {
795  pack_oid (oid);
796  }
797 
798  void
800  {
803 
804  OR_GET_OID (m_ptr, &oid);
805  m_ptr += OR_OID_SIZE;
806  }
807 
808  void
810  {
811  return unpack_oid (oid);
812  }
813 
814  const char *
816  {
817  return m_ptr;
818  }
819 
820  void
821  unpacker::align (const size_t req_alignment)
822  {
823  m_ptr = PTR_ALIGN (m_ptr, req_alignment);
824  }
825 
826  size_t
828  {
829  return get_curr_ptr () - get_buffer_start ();
830  }
831 
832  const char *
834  {
835  return m_start_ptr;
836  }
837 
838  const char *
840  {
841  return m_end_ptr;
842  }
843 
844  bool
846  {
847  return get_curr_ptr () == get_buffer_end ();
848  }
849 
850  size_t
851  packer::get_packed_buffer_size (const char *stream, const size_t length, const size_t curr_offset) const
852  {
853  size_t actual_length = 0;
854 
855  if (stream != NULL)
856  {
857  actual_length = length;
858  }
859 
860  size_t entry_size = OR_INT_SIZE + actual_length;
861 
862  return DB_ALIGN (curr_offset, INT_ALIGNMENT) + entry_size - curr_offset;
863  }
864 
865  void
866  packer::pack_buffer_with_length (const char *stream, const size_t length)
867  {
869 
870  check_range (m_ptr, m_end_ptr, length + OR_INT_SIZE);
871 
872  OR_PUT_INT (m_ptr, length);
873  m_ptr += OR_INT_SIZE;
874 
875  if (length > 0)
876  {
877  std::memcpy (m_ptr, stream, length);
878  m_ptr += length;
879 
881  }
882  }
883 
885  {
886  return peek_unpack_int (value);
887  }
888 
889  /*
890  * unpack_buffer_with_length : unpacks a stream into a preallocated buffer
891  * stream (in/out) : output stream
892  * max_length (in) : maximum length to unpack
893  *
894  * Note : the unpacker pointer is incremented with the actual length of buffer (found in unpacker)
895  */
896  void
897  unpacker::unpack_buffer_with_length (char *stream, const size_t max_length)
898  {
899  size_t actual_len, copy_length;
900 
902 
903  actual_len = OR_GET_INT (m_ptr);
904  m_ptr += OR_INT_SIZE;
905 
906  assert (actual_len <= max_length);
907  copy_length = std::min (actual_len, max_length);
908 
909  check_range (m_ptr, m_end_ptr, actual_len);
910 
911  if (copy_length > 0)
912  {
913  memcpy (stream, m_ptr, copy_length);
914  }
915 
916  m_ptr += actual_len;
918  }
919 
920 
921  void
922  packer::delegate_to_or_buf (const size_t size, or_buf &buf)
923  {
924  check_range (m_ptr, m_end_ptr, size);
925  m_ptr += size;
926  OR_BUF_INIT (buf, m_ptr, size);
927  }
928 
929  const char *
931  {
932  return m_ptr;
933  }
934 
935  size_t
937  {
938  return get_curr_ptr () - get_buffer_start ();
939  }
940 
941  void
942  packer::align (const size_t req_alignment)
943  {
944  m_ptr = PTR_ALIGN (m_ptr, req_alignment);
945  }
946 
947  const char *
949  {
950  return m_start_ptr;
951  }
952 
953  const char *
955  {
956  return m_end_ptr;
957  }
958 
959  bool
961  {
962  return get_curr_ptr () == get_buffer_end ();
963  }
964 
965  void
966  unpacker::delegate_to_or_buf (const size_t size, or_buf &buf)
967  {
968  check_range (m_ptr, m_end_ptr, size);
969  m_ptr += size;
970  // promise you won't write on it!
971  OR_BUF_INIT (buf, const_cast <char *> (m_ptr), size);
972  }
973 
974 } /* namespace cubpacking */
size_t get_packed_string_size(const std::string &str, const size_t curr_offset)
Definition: packer.cpp:593
virtual size_t get_packed_size(packer &serializator, std::size_t start_offset=0) const =0
#define LARGE_STRING_CODE
Definition: packer.cpp:40
#define OR_PUT_OID(ptr, oid)
size_t get_packed_oid_size(const size_t curr_offset)
Definition: packer.cpp:771
void peek_unpack_int(int &value)
Definition: packer.cpp:139
void set_buffer(const char *storage, const size_t amount)
Definition: packer.cpp:87
const char * get_buffer_start(void)
Definition: packer.cpp:833
static void check_range(const char *ptr, const char *endptr, const size_t amount)
Definition: packer.cpp:50
void pack_int(const int value)
Definition: packer.cpp:101
void unpack_bigint(std::int64_t &value)
Definition: packer.cpp:247
int or_packed_value_size(const DB_VALUE *value, int collapse_null, int include_domain, int include_domain_classoids)
void pack_int_array(const int *array, const int count)
Definition: packer.cpp:313
void pack_large_c_string(const char *string, const size_t str_size)
Definition: packer.cpp:539
void pack_small_string(const char *string, const size_t str_size=0)
Definition: packer.cpp:463
void align(const size_t req_alignment)
Definition: packer.cpp:942
bool is_ended(void)
Definition: packer.cpp:960
const char * m_start_ptr
Definition: packer.hpp:176
void pack_overloaded(int value)
Definition: packer.cpp:117
#define OR_BUF_INIT(buf, data, size)
void pack_buffer_with_length(const char *stream, const std::size_t length)
Definition: packer.cpp:866
char * or_pack_value(char *buf, DB_VALUE *value)
void pack_short(const short value)
Definition: packer.cpp:193
void unpack_db_value(db_value &value)
Definition: packer.cpp:432
#define SHORT_ALIGNMENT
Definition: memory_alloc.h:60
void unpack_small_string(char *string, const size_t max_size)
Definition: packer.cpp:497
#define OR_GET_BYTE(ptr)
size_t get_packed_size_overloaded(int value, size_t curr_offset)
Definition: packer.cpp:111
#define OR_SHORT_SIZE
#define PTR_ALIGN(addr, boundary)
Definition: memory_alloc.h:77
size_t get_packed_c_string_size(const char *str, const size_t str_size, const size_t curr_offset)
Definition: packer.cpp:650
virtual void pack(packer &serializator) const =0
#define MAX_ALIGNMENT
Definition: memory_alloc.h:70
void unpack_string_to_memblock(cubmem::extensible_block &blk)
Definition: packer.cpp:732
const char * get_buffer_end(void)
Definition: packer.cpp:954
size_t get_packed_int_size(size_t curr_offset)
Definition: packer.cpp:95
void unpack_string(std::string &str)
Definition: packer.cpp:619
#define assert(x)
size_t get_current_size(void)
Definition: packer.cpp:936
std::size_t get_packed_buffer_size(const char *stream, const std::size_t length, const std::size_t curr_offset) const
Definition: packer.cpp:851
void delegate_to_or_buf(const size_t size, or_buf &buf)
Definition: packer.cpp:966
#define OR_GET_OID(ptr, oid)
void pack_large_string(const std::string &str)
Definition: packer.cpp:565
#define MAX_SMALL_STRING_SIZE
Definition: packer.cpp:39
size_t get_packed_bool_size(size_t curr_offset)
Definition: packer.cpp:148
#define min(a, b)
void pack_db_value(const db_value &value)
Definition: packer.cpp:403
void unpack_c_string(char *str, const size_t max_str_size)
Definition: packer.cpp:709
#define NULL
Definition: freelistheap.h:34
const char * m_end_ptr
Definition: packer.hpp:177
#define OR_BIGINT_SIZE
void unpack_bool(bool &value)
Definition: packer.cpp:172
bool is_ended(void)
Definition: packer.cpp:845
void unpack_short(short &value)
Definition: packer.cpp:215
#define OR_PUT_SHORT(ptr, val)
#define OR_GET_INT64(ptr, val)
int count(int &result, const cub_regex_object &reg, const std::string &src, const int position, const INTL_CODESET codeset)
void pack_bool(bool value)
Definition: packer.cpp:154
virtual void unpack(unpacker &deserializator)=0
size_t get_packed_db_value_size(const db_value &value, size_t curr_offset)
Definition: packer.cpp:394
size_t get_packed_short_size(size_t curr_offset)
Definition: packer.cpp:187
void peek_unpack_buffer_length(int &value)
Definition: packer.cpp:884
void pack_c_string(const char *str, const size_t str_size)
Definition: packer.cpp:667
void unpack_overloaded(int &value)
Definition: packer.cpp:133
const char * get_buffer_start(void)
Definition: packer.cpp:948
#define OR_BYTE_SIZE
void pack_oid(const OID &oid)
Definition: packer.cpp:777
void set_buffer(char *storage, const size_t amount)
Definition: packer.cpp:74
void unpack_string_size(size_t &len)
Definition: packer.cpp:685
#define OR_GET_INT(ptr)
void unpack_int(int &value)
Definition: packer.cpp:123
#define DB_ALIGN(offset, align)
Definition: memory_alloc.h:84
#define strlen(s1)
Definition: intl_support.c:43
#define OR_PUT_INT64(ptr, val)
void pack_bigint(const std::int64_t &value)
Definition: packer.cpp:237
#define INT_ALIGNMENT
Definition: memory_alloc.h:61
#define OR_PUT_INT(ptr, val)
char * or_unpack_value(const char *buf, DB_VALUE *value)
void pack_string(const std::string &str)
Definition: packer.cpp:599
const char * get_buffer_end(void)
Definition: packer.cpp:839
size_t get_packed_small_string_size(const char *string, const size_t curr_offset)
Definition: packer.cpp:453
int i
Definition: dynamic_load.c:954
void unpack_oid(OID &oid)
Definition: packer.cpp:799
size_t get_packed_large_string_size(const std::string &str, const size_t curr_offset)
Definition: packer.cpp:529
size_t get_packed_int_vector_size(size_t curr_offset, const size_t count)
Definition: packer.cpp:351
void extend_to(size_t total_bytes)
Definition: mem_block.hpp:346
void unpack_large_string(std::string &str)
Definition: packer.cpp:571
void unpack_buffer_with_length(char *stream, const std::size_t max_length)
Definition: packer.cpp:897
const char * get_curr_ptr(void)
Definition: packer.cpp:815
void unpack_int_array(int *array, int &count)
Definition: packer.cpp:328
const char * get_curr_ptr(void)
Definition: packer.cpp:930
void unpack_int_vector(std::vector< int > &array)
Definition: packer.cpp:374
void delegate_to_or_buf(const size_t size, or_buf &buf)
Definition: packer.cpp:922
size_t get_packed_bigint_size(size_t curr_offset)
Definition: packer.cpp:231
size_t get_current_size(void)
Definition: packer.cpp:827
#define OR_GET_SHORT(ptr)
#define OR_PUT_BYTE(ptr, val)
void pack_int_vector(const std::vector< int > &array)
Definition: packer.cpp:357
void align(const size_t req_alignment)
Definition: packer.cpp:821