Zero  0.1.0
field.h
Go to the documentation of this file.
1 /* -*- mode:C++; c-basic-offset:4 -*-
2  Shore-kits -- Benchmark implementations for Shore-MT
3 
4  Copyright (c) 2007-2009
5  Data Intensive Applications and Systems Labaratory (DIAS)
6  Ecole Polytechnique Federale de Lausanne
7 
8  All Rights Reserved.
9 
10  Permission to use, copy, modify and distribute this software and
11  its documentation is hereby granted, provided that both the
12  copyright notice and this permission notice appear in all copies of
13  the software, derivative works or modified versions, and any
14  portions thereof, and that both notices appear in supporting
15  documentation.
16 
17  This code is distributed in the hope that it will be useful, but
18  WITHOUT ANY WARRANTY; without even the implied warranty of
19  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. THE AUTHORS
20  DISCLAIM ANY LIABILITY OF ANY KIND FOR ANY DAMAGES WHATSOEVER
21  RESULTING FROM THE USE OF THIS SOFTWARE.
22 */
23 
42 #ifndef __FIELD_H
43 #define __FIELD_H
44 
45 #include "util/decimal.h"
46 
47 #include "file_desc.h"
48 
49 #define MAX_LINE_LENGTH 1024
50 
51 /*--------------------------------------------------------------------
52  *
53  * @class: timestamp_t
54  *
55  * @brief: Helper for the SQL_TIME type. Value for timestamp field.
56  *
57  * @note: Deprecated
58  *
59  *--------------------------------------------------------------------*/
60 
61 class timestamp_t {
62 private:
63  time_t _time;
64 
65 public:
66 
68  _time = time(nullptr);
69  }
70 
72 
73  static int size() {
74  return sizeof(time_t);
75  }
76 
77  void string(char* dest, const int len) const {
78 #ifdef _POSIX_PTHREAD_SEMANTICS
79  ctime_r(&_time, dest);
80 #elif defined(SOLARIS2)
81  ctime_r(&_time, dest, len);
82 #else
83  ctime_r(&_time, dest);
84 #endif
85  dest[len - 1] = '\0';
86  }
87 }; // EOF: timestamp_t
88 
89 
90 
91 /*---------------------------------------------------------------------
92  *
93  * @enum: sql_type_t
94  *
95  * @brief: Enumuration of the supported sql types
96  *
97  *--------------------------------------------------------------------*/
98 
99 enum sqltype_t {
100  SQL_BIT, /* BIT == BOOL */
101  SQL_SMALLINT, /* SMALLINT */
102  SQL_INT, /* INTEGER */
103  SQL_FLOAT, /* FLOAT */
104  SQL_LONG, /* LONG */
105  SQL_CHAR, /* CHAR */ // A single char, could have been a smallint
106  SQL_FIXCHAR, /* FIXCHAR */ // Fixed size string
107  SQL_VARCHAR, /* VARCHAR */ // Variable size string
108  SQL_TIME, /* TIMESTAMP */ // Deprecated, use SQL_FLOAT instead
109 
110  SQL_NUMERIC, /* NUMERIC */ /* Not tested */
111  SQL_SNUMERIC /* SIGNED NUMERIC */ /* Not tested */
112 
113 }; // EOF: sqltype_t
114 
115 
116 
117 /*********************************************************************
118  *
119  * @class: field_desc_t
120  *
121  * @brief: Description of a table field (column)
122  *
123  *********************************************************************/
124 
126 private:
127 
128  tatas_lock _fielddesc_lock; /* lock for the modifying methods */
129  char _name[MAX_FIELDNAME_LEN]; /* field name */
130  char _keydesc[MAX_KEYDESC_LEN]; /* buffer for key description */
131 
132  sqltype_t _type; /* type */
133  short _size; /* max_size */
134  bool _allow_null; /* allow null? */
135  bool _is_setup; /* is setup? */
136 
137  const char* _set_keydesc();
138 
139 public:
140 
141  /* -------------------- */
142  /* --- construction --- */
143  /* -------------------- */
144 
146  : _type(SQL_SMALLINT),
147  _size(0),
148  _allow_null(true),
149  _is_setup(false) {
150  memset(_name, 0, MAX_FIELDNAME_LEN);
151  memset(_keydesc, 0, MAX_KEYDESC_LEN);
152  }
153 
155 
156 
157  /* ---------------------- */
158  /* --- access methods --- */
159  /* ---------------------- */
160 
161  const char* name() const {
162  //assert (_is_setup);
163  return (_name);
164  }
165 
166  inline bool is_variable_length(sqltype_t type) const {
167  //assert (_is_setup);
168  return (type == SQL_VARCHAR);
169  }
170 
171  inline bool is_variable_length() const {
172  return (is_variable_length(_type));
173  }
174 
175  inline unsigned fieldmaxsize() const {
176  //assert (_is_setup);
177  return (_size);
178  }
179 
180  inline sqltype_t type() const {
181  //assert (_is_setup);
182  return (_type);
183  }
184 
185  inline bool allow_null() const {
186  //assert (_is_setup);
187  return (_allow_null);
188  }
189 
190  /* return key description for index creation */
191  const char* keydesc() {
192  //assert (_is_setup);
193  CRITICAL_SECTION(fkd_cs, _fielddesc_lock);
194  return (_set_keydesc());
195  }
196 
197  /* set the type description for the field. */
198  void setup(const sqltype_t type,
199  const char* name,
200  const short size = 0,
201  const bool allow_null = false);
202 
203  /* for debugging */
204  void print_desc(ostream& os = cout);
205 }; // EOF: field_desc_t
206 
207 
208 
209 /*********************************************************************
210  *
211  * @struct: field_value_t
212  *
213  * @brief: Value of a table field
214  *
215  * @warning: !!! NOT-THREAD SAFE !!!
216  *
217  *********************************************************************/
218 
221  field_desc_t* _pfield_desc; /* pointer to the description of the field */
222  bool _null_flag; /* null value? */
223 
224  /* value of a field */
226  bool _bit; /* BIT */
227  short _smallint; /* SMALLINT */
228  char _char; /* CHAR */
229  int _int; /* INT */
230  double _float; /* FLOAT */
231  long long _long; /* LONG */
232  timestamp_t* _time; /* TIME or DATE */
233  char* _string; /* FIXCHAR, VARCHAR, NUMERIC */
234  } _value;
235 
236  char* _data; /* buffer for _value._time or _value._string */
237  unsigned _data_size; /* allocated size of the data buffer (watermark) */
238  unsigned _real_size; /* current size of the value */
239  unsigned _max_size; /* maximum possible size of the buffer (shortcut) */
240 
241 
242  /* -------------------- */
243  /* --- construction --- */
244  /* -------------------- */
245 
247  : _pfield_desc(nullptr),
248  _null_flag(true),
249  _data(nullptr),
250  _data_size(0),
251  _real_size(0),
252  _max_size(0) {}
253 
255  : _pfield_desc(pfd),
256  _null_flag(true),
257  _data(nullptr),
258  _data_size(0),
259  _real_size(0),
260  _max_size(0) {
261  setup(pfd); /* It will assert if pfd = nullptr */
262  }
263 
265  if (_data) {
266  free(_data);
267  _data = nullptr;
268  }
269  }
270 
271 
272  /* ------------------------- */
273  /* --- setup field value --- */
274  /* ------------------------- */
275 
276  /* setup according to the given field_desc_t */
277  void setup(field_desc_t* pfd);
278 
279  /* clear value */
280  void reset();
281 
282  inline bool is_setup() {
283  return (_pfield_desc ? true : false);
284  }
285 
286  /* access field description */
288  return (_pfield_desc);
289  }
290 
291  inline void set_field_desc(field_desc_t* fd) {
292  assert (fd);
293  _pfield_desc = fd;
294  }
295 
296  /* return realsize of value */
297  inline unsigned realsize() const {
298  assert (_pfield_desc);
299  return (_real_size);
300  }
301 
302  /* return maxsize of value */
303  inline unsigned maxsize() const {
304  assert (_pfield_desc);
305  return (_max_size);
306  }
307 
308 
309  /* ------------------------------- */
310  /* --- value related functions --- */
311  /* ------------------------------- */
312 
313 
314  /* allocate the space for _data */
315  void alloc_space(const unsigned size);
316 
317  /* set min/max allowed value */
318  void set_min_value();
319 
320  void set_max_value();
321 
322  /* null field */
323  inline bool is_null() const {
324  assert (_pfield_desc);
325  return (_null_flag);
326  }
327 
328  inline void set_null(bool v = true) {
329  assert (_pfield_desc);
330  assert (_pfield_desc->allow_null());
331  _null_flag = v;
332  }
333 
334  /* var length */
335  inline bool is_variable_length() {
336  assert (_pfield_desc);
337  return (_pfield_desc->is_variable_length());
338  }
339 
340  /* copy current value out */
341  bool copy_value(void* data) const;
342 
343  // Set current value
344  void set_value(const void* data, const uint length);
345 
346  void set_int_value(const int data);
347 
348  void set_bit_value(const bool data);
349 
350  void set_smallint_value(const short data);
351 
352  void set_float_value(const double data);
353 
354  void set_long_value(const long long data);
355 
356  void set_decimal_value(const decimal data);
357 
358  void set_time_value(const time_t data);
359 
360  void set_tstamp_value(const timestamp_t& data);
361 
362  void set_char_value(const char data);
363 
364  void set_fixed_string_value(const char* string, const uint len);
365 
366  void set_var_string_value(const char* string, const uint len);
367 
368  // Get current value
369  int get_int_value() const;
370 
371  short get_smallint_value() const;
372 
373  bool get_bit_value() const;
374 
375  char get_char_value() const;
376 
377  void get_string_value(char* string, const uint bufsize) const;
378 
379  double get_float_value() const;
380 
381  long long get_long_value() const;
382 
383  decimal get_decimal_value() const;
384 
385  time_t get_time_value() const;
386 
387  timestamp_t& get_tstamp_value() const;
388 
389  bool load_value_from_file(ifstream& is, const char delim);
390 
391 
392  /* ----------------- */
393  /* --- debugging --- */
394  /* ----------------- */
395 
396  void print_value(ostream& os = cout);
397 
398  int get_debug_str(char*& buf);
399 }; // EOF: field_value_t
400 
401 
402 
403 /*********************************************************************
404  *
405  * class field_desc_t functions
406  *
407  *********************************************************************/
408 
409 
410 /*********************************************************************
411  *
412  * @fn: setup
413  *
414  * @brief: Sqltype specific setup
415  *
416  *********************************************************************/
417 
419  const char* name,
420  short size,
421  bool allow_null) {
422  CRITICAL_SECTION(setup_cs, _fielddesc_lock);
423 
424  // name of field
425  strncpy(_name, name, MAX_FIELDNAME_LEN);
426  _type = type;
427 
428  // size of field
429  switch (_type) {
430  case SQL_BIT:
431  _size = sizeof(bool);
432  break;
433  case SQL_SMALLINT:
434  _size = sizeof(short);
435  break;
436  case SQL_CHAR:
437  _size = sizeof(char);
438  break;
439  case SQL_INT:
440  _size = sizeof(int);
441  break;
442  case SQL_FLOAT:
443  _size = sizeof(double);
444  break;
445  case SQL_LONG:
446  _size = sizeof(long long);
447  break;
448  case SQL_TIME:
449  _size = sizeof(timestamp_t);
450  break;
451  case SQL_FIXCHAR:
452  case SQL_NUMERIC:
453  case SQL_SNUMERIC:
454  case SQL_VARCHAR:
455  _size = size * sizeof(char);
456  break;
457  }
458 
459  // set the key desc
460  _set_keydesc();
461 
462  // set if this field can contain null values
463  _allow_null = allow_null;
464 
465  // now let the rest functionality to be accessed
466  _is_setup = true;
467 }
468 
469 /*********************************************************************
470  *
471  * @fn: _set_keydesc
472  *
473  * @brief: Private function. Returns a string with the key description
474  *
475  * @note: Private function, it does not lock the key desc lock. The
476  * public function only locks.
477  *
478  *********************************************************************/
479 
480 inline const char* field_desc_t::_set_keydesc() {
481  if (strlen(_keydesc) > 1) {
482  return (&_keydesc[0]);
483  }
484 
485  // else construct the _keydesc
486  //if (!_keydesc) _keydesc = (char*)malloc( MAX_KEYDESC_LEN );
487 
488  switch (_type) {
489  case SQL_BIT:
490  case SQL_SMALLINT:
491  case SQL_CHAR:
492  case SQL_INT:
493  sprintf(_keydesc, "i%d", _size);
494  break;
495 
496  case SQL_FLOAT:
497  case SQL_LONG:
498  sprintf(_keydesc, "f%d", _size);
499  break;
500 
501  case SQL_VARCHAR:
502  sprintf(_keydesc, "b*%d", _size);
503  break;
504 
505  case SQL_TIME:
506  case SQL_FIXCHAR:
507  case SQL_NUMERIC:
508  case SQL_SNUMERIC:
509  sprintf(_keydesc, "b%d", _size);
510  break;
511  }
512  return (&_keydesc[0]);
513 }
514 
515 
516 
517 /*********************************************************************
518  *
519  * class field_value_t functions
520  *
521  *********************************************************************/
522 
523 
524 /*********************************************************************
525  *
526  * @fn: setup
527  *
528  * @brief: Field specific setup for the value
529  *
530  *********************************************************************/
531 
533  assert (pfd);
534 
535  // if it is already setup for this field do nothing
536  if (_pfield_desc == pfd) {
537  return;
538  }
539 
540  _pfield_desc = pfd;
541  unsigned sz = 0;
542 
543  switch (_pfield_desc->type()) {
544  case SQL_BIT:
545  _max_size = sizeof(bool);
546  _real_size = _max_size;
547  break;
548  case SQL_SMALLINT:
549  _max_size = sizeof(short);
550  _real_size = _max_size;
551  break;
552  case SQL_CHAR:
553  _max_size = sizeof(char);
554  _real_size = _max_size;
555  break;
556  case SQL_INT:
557  _max_size = sizeof(int);
558  _real_size = _max_size;
559  break;
560  case SQL_FLOAT:
561  _max_size = sizeof(double);
562  _real_size = _max_size;
563  break;
564  case SQL_LONG:
565  _max_size = sizeof(long long);
566  _real_size = _max_size;
567  break;
568  case SQL_TIME:
569  sz = sizeof(timestamp_t);
570  _data_size = sz;
571  _real_size = sz;
572  _max_size = sz;
573  if (_data) {
574  free(_data);
575  }
576  _data = (char*)malloc(sz);
577  _value._time = (timestamp_t*)_data;
578  break;
579  case SQL_VARCHAR:
580  _max_size = _pfield_desc->fieldmaxsize();
581  /* real_size is re-set at runtime, at the set_value() function */
582  _real_size = 0;
583  /* we don't know how much space is already allocated for data
584  * thus, we are not changing its value
585  */
586  _value._string = _data;
587  break;
588  case SQL_FIXCHAR:
589  case SQL_NUMERIC:
590  case SQL_SNUMERIC:
591  // +1 byte for zero terminating char
592  sz = _pfield_desc->fieldmaxsize() + 1;
593  _real_size = sz;
594  _max_size = sz;
595 
596  if ((_data_size >= sz) && (_data)) {
597  // if already _data has enough allocated space
598  // just memset the area
599  memset(_data, 0, _data_size);
600  } else {
601  // else allocate the buffer
602  if (_data) {
603  free(_data);
604  }
605  // CS TODO -- why are we using malloc here?
606  _data = (char*)malloc(sz);
607  memset(_data, 0, sz);
608  _data_size = sz;
609  }
610 
611  _value._string = _data;
612  break;
613  }
614 }
615 
616 /*********************************************************************
617  *
618  * @fn: reset
619  *
620  * @brief: Field specific reset for the value
621  *
622  *********************************************************************/
623 
624 inline void field_value_t::reset() {
625  //assert (_pfield_desc);
626 
627  _null_flag = true;
628  switch (_pfield_desc->type()) {
629  case SQL_BIT:
630  _value._bit = false;
631  break;
632  case SQL_SMALLINT:
633  _value._smallint = 0;
634  break;
635  case SQL_CHAR:
636  _value._char = 0;
637  break;
638  case SQL_INT:
639  _value._int = 0;
640  break;
641  case SQL_FLOAT:
642  _value._float = 0;
643  break;
644  case SQL_LONG:
645  _value._long = 0;
646  break;
647  case SQL_TIME:
648  case SQL_VARCHAR:
649  case SQL_FIXCHAR:
650  case SQL_NUMERIC:
651  case SQL_SNUMERIC:
652  if (_data && _data_size) {
653  memset(_data, 0, _data_size);
654  }
655  }
656 }
657 
658 /*********************************************************************
659  *
660  * @fn: alloc_space
661  *
662  * @brief: Allocates the requested space (param len). If it has already
663  * allocated enough returns immediately.
664  *
665  * @note: It will asserts if the requested space is larger than the
666  * realsize.
667  *
668  *********************************************************************/
669 
670 inline void field_value_t::alloc_space(const unsigned len) {
671  assert (_pfield_desc);
672  assert (_pfield_desc->type() == SQL_VARCHAR);
673  assert (len <= _real_size);
674 
675  // check if already enough space
676  if (_data_size >= len) {
677  return;
678  }
679 
680  // if not, release previously allocated space and allocate new
681  if (_data) {
682  free(_data);
683  }
684  _data = (char*)malloc(len);
685  _data_size = len;
686 
687  // clear the contents of the allocated buffer
688  memset(_data, 0, _data_size);
689 
690  // the string value points to the allocated buffer
691  _value._string = _data;
692 }
693 
694 /*********************************************************************
695  *
696  * @fn: set_value
697  *
698  * @brief: Sets the current value to a (void*) buffer
699  *
700  *********************************************************************/
701 
702 inline void field_value_t::set_value(const void* data,
703  const uint length) {
704  assert (_pfield_desc);
705  _null_flag = false;
706 
707  switch (_pfield_desc->type()) {
708  case SQL_BIT:
709  case SQL_SMALLINT:
710  case SQL_CHAR:
711  case SQL_INT:
712  case SQL_FLOAT:
713  case SQL_LONG:
714  memcpy(&_value, data, _max_size);
715  break;
716  case SQL_TIME:
717  memcpy(_value._time, data, MIN(length, _real_size));
718  break;
719  case SQL_VARCHAR:
720  set_var_string_value((const char*)data, length);
721  break;
722  case SQL_FIXCHAR:
723  case SQL_NUMERIC:
724  case SQL_SNUMERIC:
725  _real_size = MIN(length, _max_size);
726  assert(_data_size >= _real_size);
727  memset(_data, '\0', _data_size);
728  memcpy(_value._string, data, _real_size);
729  break;
730  }
731 }
732 
733 /*********************************************************************
734  *
735  * @fn: set min/max value function
736  *
737  * @brief: Set the min/max possible value for this field type
738  *
739  *********************************************************************/
740 
742  assert (_pfield_desc);
743  _null_flag = false;
744 
745  switch (_pfield_desc->type()) {
746  case SQL_BIT:
747  _value._bit = false;
748  break;
749  case SQL_SMALLINT:
750  _value._smallint = MIN_SMALLINT;
751  break;
752  case SQL_CHAR:
753  _value._char = MIN_SMALLINT;
754  break;
755  case SQL_INT:
756  _value._int = MIN_INT;
757  break;
758  case SQL_FLOAT:
759  _value._float = MIN_FLOAT;
760  break;
761  case SQL_LONG:
762  _value._long = MIN_FLOAT;
763  break;
764  case SQL_VARCHAR:
765  case SQL_FIXCHAR:
766  case SQL_NUMERIC:
767  case SQL_SNUMERIC:
768  _data[0] = '\0';
769  _value._string = _data;
770  break;
771  case SQL_TIME:
772  break;
773  }
774 }
775 
777  assert (_pfield_desc);
778 
779  _null_flag = false;
780 
781  switch (_pfield_desc->type()) {
782  case SQL_BIT:
783  _value._bit = true;
784  break;
785  case SQL_SMALLINT:
786  _value._smallint = MAX_SMALLINT;
787  break;
788  case SQL_CHAR:
789  _value._char = 'z';
790  break;
791  case SQL_INT:
792  _value._int = MAX_INT;
793  break;
794  case SQL_FLOAT:
795  _value._float = MAX_FLOAT;
796  break;
797  case SQL_LONG:
798  _value._long = MAX_FLOAT;
799  break;
800  case SQL_VARCHAR:
801  case SQL_FIXCHAR:
802  memset(_data, 'z', _data_size);
803  _value._string = _data;
804  break;
805  case SQL_NUMERIC:
806  case SQL_SNUMERIC:
807  memset(_data, '9', _data_size);
808  _value._string = _data;
809  break;
810  case SQL_TIME:
811  break;
812  }
813 }
814 
815 /*********************************************************************
816  *
817  * @fn: copy_value
818  *
819  * @brief: Copy the 'current' value of of the field to an address
820  *
821  *********************************************************************/
822 
823 inline bool field_value_t::copy_value(void* data) const {
824  assert (_pfield_desc);
825  assert (!_null_flag);
826 
827  switch (_pfield_desc->type()) {
828  case SQL_BIT:
829  memcpy(data, &_value._bit, _max_size);
830  break;
831  case SQL_SMALLINT:
832  memcpy(data, &_value._smallint, _max_size);
833  break;
834  case SQL_CHAR:
835  memcpy(data, &_value._char, _max_size);
836  break;
837  case SQL_INT:
838  memcpy(data, &_value._int, _max_size);
839  break;
840  case SQL_FLOAT:
841  memcpy(data, &_value._float, _max_size);
842  break;
843  case SQL_LONG:
844  memcpy(data, &_value._long, _max_size);
845  break;
846  case SQL_TIME:
847  memcpy(data, _value._time, _real_size);
848  break;
849  case SQL_VARCHAR:
850  memcpy(data, _value._string, _real_size);
851  break;
852  case SQL_FIXCHAR:
853  case SQL_NUMERIC:
854  case SQL_SNUMERIC:
855  memcpy(data, _value._string, _real_size);
856  break;
857  }
858 
859  return (true);
860 }
861 
862 /*********************************************************************
863  *
864  * @fn: set_XXX_value
865  *
866  * @brief: Type-specific set of value
867  *
868  *********************************************************************/
869 
870 inline void field_value_t::set_int_value(const int data) {
871  assert (_pfield_desc);
872  assert (_pfield_desc->type() == SQL_INT);
873  _null_flag = false;
874  _value._int = data;
875 }
876 
877 inline void field_value_t::set_bit_value(const bool data) {
878  assert (_pfield_desc);
879  assert (_pfield_desc->type() == SQL_BIT);
880  _null_flag = false;
881  _value._bit = data;
882 }
883 
884 inline void field_value_t::set_smallint_value(const short data) {
885  assert (_pfield_desc);
886  assert (_pfield_desc->type() == SQL_SMALLINT);
887  _null_flag = false;
888  _value._smallint = data;
889 }
890 
891 inline void field_value_t::set_char_value(const char data) {
892  assert (_pfield_desc);
893  assert (_pfield_desc->type() == SQL_CHAR);
894  _null_flag = false;
895  _value._char = data;
896 }
897 
898 inline void field_value_t::set_float_value(const double data) {
899  assert (_pfield_desc);
900  assert (_pfield_desc->type() == SQL_FLOAT);
901  _null_flag = false;
902  _value._float = data;
903 }
904 
905 inline void field_value_t::set_long_value(const long long data) {
906  assert (_pfield_desc);
907  assert (_pfield_desc->type() == SQL_LONG);
908  _null_flag = false;
909  _value._long = data;
910 }
911 
912 inline void field_value_t::set_decimal_value(const decimal data) {
913  assert (_pfield_desc);
914  assert (_pfield_desc->type() == SQL_FLOAT);
915  _null_flag = false;
916  _value._float = data.to_double();
917 }
918 
919 inline void field_value_t::set_time_value(const time_t data) {
920  assert (_pfield_desc);
921  assert (_pfield_desc->type() == SQL_FLOAT);
922  _null_flag = false;
923  _value._float = data;
924 }
925 
927  assert (_pfield_desc);
928  assert (_pfield_desc->type() == SQL_TIME);
929  _null_flag = false;
930  memcpy(_value._time, &data, _real_size);
931 }
932 
933 /*********************************************************************
934  *
935  * @fn: set_fixed_string_value
936  *
937  * @brief: Copy the string to the data buffer using fixed lengths
938  *
939  *********************************************************************/
940 
941 inline void field_value_t::set_fixed_string_value(const char* string,
942  const uint len) {
943  assert (_pfield_desc);
944  assert (_pfield_desc->type() == SQL_FIXCHAR ||
945  _pfield_desc->type() == SQL_NUMERIC ||
946  _pfield_desc->type() == SQL_SNUMERIC);
949  _real_size = MIN(len + 1, _data_size);
950  assert (_data_size >= _real_size);
951  _null_flag = false;
952  memset(_value._string, '\0', _data_size);
953  memcpy(_value._string, string, _real_size);
954 }
955 
956 /*********************************************************************
957  *
958  * @fn: set_var_string_value
959  *
960  * @brief: Copy the string to the data buffer and set real_size
961  *
962  * @note: Only len chars are copied. If len > field->fieldsize() then only
963  * fieldsize() chars are copied.
964  *
965  *********************************************************************/
966 
967 inline void field_value_t::set_var_string_value(const char* string,
968  const uint len) {
969  assert (_pfield_desc);
970  assert (_pfield_desc->type() == SQL_VARCHAR);
971  // +1 byte for zero terminating char
972  _real_size = MIN(len + 1, _max_size);
973  alloc_space(_real_size);
974  assert (_data_size >= _real_size);
975  _null_flag = false;
976  memcpy(_value._string, string, _real_size);
977  // enforce last char to be \0
978  _value._string[_real_size - 1] = 0;
979 }
980 
981 /*********************************************************************
982  *
983  * @fn: get_XXX_value
984  *
985  * @brief: Type-specific return of value
986  *
987  *********************************************************************/
988 
989 
990 inline int field_value_t::get_int_value() const {
991  assert (_pfield_desc);
992  assert (_pfield_desc->type() == SQL_INT);
993  return (_value._int);
994 }
995 
996 inline bool field_value_t::get_bit_value() const {
997  assert (_pfield_desc);
998  assert (_pfield_desc->type() == SQL_BIT);
999  return (_value._bit);
1000 }
1001 
1003  assert (_pfield_desc);
1004  assert (_pfield_desc->type() == SQL_SMALLINT);
1005  return (_value._smallint);
1006 }
1007 
1008 inline char field_value_t::get_char_value() const {
1009  assert (_pfield_desc);
1010  assert (_pfield_desc->type() == SQL_CHAR);
1011  return (_value._char);
1012 }
1013 
1014 inline void field_value_t::get_string_value(char* buffer,
1015  const uint bufsize) const {
1016  assert (_pfield_desc);
1017  assert (_pfield_desc->type() == SQL_FIXCHAR ||
1018  _pfield_desc->type() == SQL_VARCHAR ||
1019  _pfield_desc->type() == SQL_NUMERIC ||
1020  _pfield_desc->type() == SQL_SNUMERIC);
1021  memset(buffer, '\0', bufsize);
1022  memcpy(buffer, _value._string, MIN(bufsize, _real_size));
1023 }
1024 
1025 inline double field_value_t::get_float_value() const {
1026  assert (_pfield_desc);
1027  assert (_pfield_desc->type() == SQL_FLOAT);
1028  return (_value._float);
1029 }
1030 
1031 inline long long field_value_t::get_long_value() const {
1032  assert (_pfield_desc);
1033  assert (_pfield_desc->type() == SQL_LONG);
1034  return (_value._long);
1035 }
1036 
1038  assert (_pfield_desc);
1039  assert (_pfield_desc->type() == SQL_FLOAT);
1040  return (decimal(_value._float));
1041 }
1042 
1043 inline time_t field_value_t::get_time_value() const {
1044  assert (_pfield_desc);
1045  assert (_pfield_desc->type() == SQL_FLOAT);
1046  return ((time_t)_value._float);
1047 }
1048 
1050  assert (_pfield_desc);
1051  assert (_pfield_desc->type() == SQL_TIME);
1052  return *(_value._time);
1053 }
1054 
1055 #endif // __FIELD_H
bool is_null() const
Definition: field.h:323
bool is_variable_length(sqltype_t type) const
Definition: field.h:166
bool get_bit_value() const
Definition: field.h:996
sqltype_t type() const
Definition: field.h:180
unsigned _data_size
Definition: field.h:237
void set_null(bool v=true)
Definition: field.h:328
Definition: field.h:111
bool _allow_null
Definition: field.h:134
void set_value(const void *data, const uint length)
Definition: field.h:702
unsigned maxsize() const
Definition: field.h:303
static int size()
Definition: field.h:73
Definition: decimal.h:32
void set_fixed_string_value(const char *string, const uint len)
Definition: field.h:941
short _smallint
Definition: field.h:227
void set_max_value()
Definition: field.h:776
Definition: field.h:105
int _int
Definition: field.h:229
Definition: field.h:104
Definition: field.h:103
time_t _time
Definition: field.h:63
timestamp_t()
Definition: field.h:67
Definition: field.h:125
~timestamp_t()
Definition: field.h:71
#define MAX_SMALLINT
Definition: file_desc.h:54
unsigned realsize() const
Definition: field.h:297
void string(char *dest, const int len) const
Definition: field.h:77
void set_field_desc(field_desc_t *fd)
Definition: field.h:291
void set_bit_value(const bool data)
Definition: field.h:877
#define MIN_SMALLINT
Definition: file_desc.h:53
void set_char_value(const char data)
Definition: field.h:891
short _size
Definition: field.h:133
unsigned _max_size
Definition: field.h:239
unsigned fieldmaxsize() const
Definition: field.h:175
const char * keydesc()
Definition: field.h:191
bool is_setup()
Definition: field.h:282
#define MAX_INT
Definition: file_desc.h:56
Definition: field.h:100
#define MAX_FLOAT
Definition: file_desc.h:58
bool is_variable_length() const
Definition: field.h:171
void set_time_value(const time_t data)
Definition: field.h:919
#define MIN(x, y)
Definition: w_minmax.h:69
unsigned _real_size
Definition: field.h:238
bool _bit
Definition: field.h:226
void set_decimal_value(const decimal data)
Definition: field.h:912
char _char
Definition: field.h:228
~field_desc_t()
Definition: field.h:154
void setup(field_desc_t *pfd)
Definition: field.h:532
int get_int_value() const
Definition: field.h:990
field_desc_t * _pfield_desc
Definition: field.h:221
Definition: field.h:219
bool _null_flag
Definition: field.h:222
field_value_t()
Definition: field.h:246
void reset()
Definition: field.h:624
Definition: field.h:102
Definition: field.h:101
Definition: field.h:107
bool allow_null() const
Definition: field.h:185
void get_string_value(char *string, const uint bufsize) const
Definition: field.h:1014
const char * _set_keydesc()
Definition: field.h:480
void set_long_value(const long long data)
Definition: field.h:905
void set_tstamp_value(const timestamp_t &data)
Definition: field.h:926
field_value_t(field_desc_t *pfd)
Definition: field.h:254
const char * name() const
Definition: field.h:161
Definition: field.h:106
void set_var_string_value(const char *string, const uint len)
Definition: field.h:967
timestamp_t & get_tstamp_value() const
Definition: field.h:1049
Definition: field.h:110
double _float
Definition: field.h:230
A test-and-test-and-set spinlock.
Definition: tatas.h:25
#define MIN_FLOAT
Definition: file_desc.h:57
bool copy_value(void *data) const
Definition: field.h:823
short get_smallint_value() const
Definition: field.h:1002
: Descriptors for Shore files/indexes, and structures that help in keeping track of the created files...
const unsigned int MAX_KEYDESC_LEN
Definition: file_desc.h:46
void set_min_value()
Definition: field.h:741
char * _data
Definition: field.h:236
field_desc_t()
Definition: field.h:145
void set_float_value(const double data)
Definition: field.h:898
void setup(const sqltype_t type, const char *name, const short size=0, const bool allow_null=false)
Definition: field.h:418
long long get_long_value() const
Definition: field.h:1031
sqltype_t
Definition: field.h:99
bool is_variable_length()
Definition: field.h:335
Definition: field.h:61
time_t get_time_value() const
Definition: field.h:1043
const unsigned int MAX_FIELDNAME_LEN
Definition: file_desc.h:44
tatas_lock _fielddesc_lock
Definition: field.h:128
double to_double() const
Definition: decimal.h:106
void set_int_value(const int data)
Definition: field.h:870
char * _string
Definition: field.h:233
double get_float_value() const
Definition: field.h:1025
timestamp_t * _time
Definition: field.h:232
void alloc_space(const unsigned size)
Definition: field.h:670
void set_smallint_value(const short data)
Definition: field.h:884
long long _long
Definition: field.h:231
decimal get_decimal_value() const
Definition: field.h:1037
sqltype_t _type
Definition: field.h:132
char get_char_value() const
Definition: field.h:1008
field_desc_t * field_desc()
Definition: field.h:287
Definition: field.h:225
#define MIN_INT
Definition: file_desc.h:55
#define CRITICAL_SECTION(name, lock)
Definition: critical_section.h:75
Definition: field.h:108
bool _is_setup
Definition: field.h:135
~field_value_t()
Definition: field.h:264