1 | /**************** Value H Declares Source Code File (.H) ***************/ |
2 | /* Name: VALUE.H Version 2.3 */ |
3 | /* */ |
4 | /* (C) Copyright to the author Olivier BERTRAND 2001-2017 */ |
5 | /* */ |
6 | /* This file contains the VALUE and derived classes declares. */ |
7 | /***********************************************************************/ |
8 | #ifndef __VALUE__H__ |
9 | #define __VALUE__H__ |
10 | |
11 | /***********************************************************************/ |
12 | /* Include required application header files */ |
13 | /* assert.h is header required when using the assert function. */ |
14 | /* block.h is header containing Block global declarations. */ |
15 | /***********************************************************************/ |
16 | #include "assert.h" |
17 | #include "block.h" |
18 | |
19 | /***********************************************************************/ |
20 | /* This should list the processors accepting unaligned numeral values.*/ |
21 | /***********************************************************************/ |
22 | #if defined(__i386__) || defined(__x86_64__) || defined(_M_IX86) || defined(_M_X64) || defined(_M_AMD64) || defined(_M_IA64) |
23 | #define UNALIGNED_OK |
24 | #endif |
25 | |
26 | /***********************************************************************/ |
27 | /* Types used in some class definitions. */ |
28 | /***********************************************************************/ |
29 | enum CONV {CNV_ANY = 0, /* Convert to any type */ |
30 | CNV_CHAR = 1, /* Convert to character type */ |
31 | CNV_NUM = 2}; /* Convert to numeric type */ |
32 | |
33 | /***********************************************************************/ |
34 | /* Types used in some class definitions. */ |
35 | /***********************************************************************/ |
36 | class CONSTANT; // For friend setting |
37 | typedef struct _datpar *PDTP; // For DTVAL |
38 | |
39 | /***********************************************************************/ |
40 | /* Utilities used to test types and to allocated values. */ |
41 | /***********************************************************************/ |
42 | // Exported functions |
43 | DllExport PCSZ GetTypeName(int); |
44 | DllExport int GetTypeSize(int, int); |
45 | #ifdef ODBC_SUPPORT |
46 | /* This function is exported for use in OEM table type DLLs */ |
47 | DllExport int TranslateSQLType(int stp, int prec, |
48 | int& len, char& v, bool& w); |
49 | #endif |
50 | DllExport const char *GetFormatType(int); |
51 | DllExport int GetFormatType(char); |
52 | DllExport bool IsTypeChar(int type); |
53 | DllExport bool IsTypeNum(int type); |
54 | DllExport int ConvertType(int, int, CONV, bool match = false); |
55 | DllExport PVAL AllocateValue(PGLOBAL, void *, short, short = 2); |
56 | DllExport PVAL AllocateValue(PGLOBAL, PVAL, int = TYPE_VOID, int = 0); |
57 | DllExport PVAL AllocateValue(PGLOBAL, int, int len = 0, int prec = 0, |
58 | bool uns = false, PCSZ fmt = NULL); |
59 | DllExport ulonglong CharToNumber(PCSZ, int, ulonglong, bool, |
60 | bool *minus = NULL, bool *rc = NULL); |
61 | DllExport BYTE OpBmp(PGLOBAL g, OPVAL opc); |
62 | |
63 | /***********************************************************************/ |
64 | /* Class VALUE represents a constant or variable of any valid type. */ |
65 | /***********************************************************************/ |
66 | class DllExport VALUE : public BLOCK { |
67 | friend class CONSTANT; // The only object allowed to use SetConstFormat |
68 | public: |
69 | // Constructors |
70 | |
71 | // Implementation |
72 | virtual bool IsTypeNum(void) = 0; |
73 | virtual bool IsZero(void) = 0; |
74 | virtual bool IsCi(void) {return false;} |
75 | virtual bool IsUnsigned(void) {return Unsigned;} |
76 | virtual void Reset(void) = 0; |
77 | virtual int GetSize(void) = 0; |
78 | virtual int GetValLen(void) = 0; |
79 | virtual int GetValPrec(void) = 0; |
80 | virtual int GetLength(void) {return 1;} |
81 | virtual PSZ GetCharValue(void) {assert(false); return NULL;} |
82 | virtual char GetTinyValue(void) {assert(false); return 0;} |
83 | virtual uchar GetUTinyValue(void) {assert(false); return 0;} |
84 | virtual short GetShortValue(void) {assert(false); return 0;} |
85 | virtual ushort GetUShortValue(void) {assert(false); return 0;} |
86 | virtual int GetIntValue(void) = 0; |
87 | virtual uint GetUIntValue(void) = 0; |
88 | virtual longlong GetBigintValue(void) = 0; |
89 | virtual ulonglong GetUBigintValue(void) = 0; |
90 | virtual double GetFloatValue(void) = 0; |
91 | virtual void *GetTo_Val(void) = 0; |
92 | virtual void SetPrec(int prec) {Prec = prec;} |
93 | bool IsNull(void) {return (Nullable && Null);} |
94 | void SetNull(bool b) {Null = (Nullable ? b : false);} |
95 | bool GetNullable(void) {return Nullable;} |
96 | void SetNullable(bool b) {Nullable = b;} |
97 | int GetType(void) {return Type;} |
98 | int GetClen(void) {return Clen;} |
99 | void SetGlobal(PGLOBAL g) {Global = g;} |
100 | |
101 | // Methods |
102 | virtual bool SetValue_pval(PVAL valp, bool chktype = false) = 0; |
103 | virtual bool SetValue_char(const char *p, int n) = 0; |
104 | virtual void SetValue_psz(PCSZ s) = 0; |
105 | virtual void SetValue_bool(bool) {assert(false);} |
106 | virtual int CompareValue(PVAL vp) = 0; |
107 | virtual BYTE TestValue(PVAL vp); |
108 | virtual void SetValue(char) {assert(false);} |
109 | virtual void SetValue(uchar) {assert(false);} |
110 | virtual void SetValue(short) {assert(false);} |
111 | virtual void SetValue(ushort) {assert(false);} |
112 | virtual void SetValue(int) {assert(false);} |
113 | virtual void SetValue(uint) {assert(false);} |
114 | virtual void SetValue(longlong) {assert(false);} |
115 | virtual void SetValue(ulonglong) {assert(false);} |
116 | virtual void SetValue(double) {assert(false);} |
117 | virtual void SetValue_pvblk(PVBLK blk, int n) = 0; |
118 | virtual void SetBinValue(void *p) = 0; |
119 | virtual bool GetBinValue(void *buf, int buflen, bool go) = 0; |
120 | virtual char *ShowValue(char *buf, int len = 0) = 0; |
121 | virtual char *GetCharString(char *p) = 0; |
122 | virtual bool IsEqual(PVAL vp, bool chktype) = 0; |
123 | virtual bool Compute(PGLOBAL g, PVAL *vp, int np, OPVAL op); |
124 | virtual bool FormatValue(PVAL vp, PCSZ fmt) = 0; |
125 | virtual void Printf(PGLOBAL g, FILE *, uint); |
126 | virtual void Prints(PGLOBAL g, char *ps, uint z); |
127 | |
128 | /** |
129 | Set value from a non-aligned in-memory value in the machine byte order. |
130 | TYPE can be either of: |
131 | - int, short, longlong |
132 | - uint, ushort, ulonglong |
133 | - float, double |
134 | @param - a pointer to a non-aligned value of type TYPE. |
135 | */ |
136 | template<typename TYPE> |
137 | void SetValueNonAligned(const char *p) |
138 | { |
139 | #if defined(UNALIGNED_OK) |
140 | SetValue(*((TYPE*)p)); // x86 can cast non-aligned memory directly |
141 | #else |
142 | TYPE tmp; // a slower version for non-x86 platforms |
143 | memcpy(&tmp, p, sizeof(tmp)); |
144 | SetValue(tmp); |
145 | #endif |
146 | } // end of SetValueNonAligned |
147 | |
148 | /** |
149 | Get value from a non-aligned in-memory value in the machine byte order. |
150 | TYPE can be either of: |
151 | - int, short, longlong |
152 | - uint, ushort, ulonglong |
153 | - float, double |
154 | @params - a pointer to a non-aligned value of type TYPE, the TYPE value. |
155 | */ |
156 | template<typename TYPE> |
157 | void GetValueNonAligned(char *p, TYPE n) |
158 | { |
159 | #if defined(UNALIGNED_OK) |
160 | *(TYPE *)p = n; // x86 can cast non-aligned memory directly |
161 | #else |
162 | TYPE tmp = n; // a slower version for non-x86 platforms |
163 | memcpy(p, &tmp, sizeof(tmp)); |
164 | #endif |
165 | } // end of SetValueNonAligned |
166 | |
167 | protected: |
168 | virtual bool SetConstFormat(PGLOBAL, FORMAT&) = 0; |
169 | const char *GetXfmt(void); |
170 | |
171 | // Constructor used by derived classes |
172 | VALUE(int type, bool un = false); |
173 | |
174 | // Members |
175 | PGLOBAL Global; // To reduce arglist |
176 | const char *Fmt; |
177 | const char *Xfmt; |
178 | bool Nullable; // True if value can be null |
179 | bool Null; // True if value is null |
180 | bool Unsigned; // True if unsigned |
181 | int Type; // The value type |
182 | int Clen; // Internal value length |
183 | int Prec; |
184 | }; // end of class VALUE |
185 | |
186 | /***********************************************************************/ |
187 | /* Class TYPVAL: represents a typed value. */ |
188 | /***********************************************************************/ |
189 | template <class TYPE> |
190 | class DllExport TYPVAL : public VALUE { |
191 | public: |
192 | // Constructor |
193 | TYPVAL(TYPE n, int type, int prec = 0, bool un = false); |
194 | |
195 | // Implementation |
196 | virtual bool IsTypeNum(void) {return true;} |
197 | virtual bool IsZero(void) {return Tval == 0;} |
198 | virtual void Reset(void) {Tval = 0;} |
199 | virtual int GetValLen(void); |
200 | virtual int GetValPrec() {return Prec;} |
201 | virtual int GetSize(void) {return sizeof(TYPE);} |
202 | //virtual PSZ GetCharValue(void) {return VALUE::GetCharValue();} |
203 | virtual char GetTinyValue(void) {return (char)Tval;} |
204 | virtual uchar GetUTinyValue(void) {return (uchar)Tval;} |
205 | virtual short GetShortValue(void) {return (short)Tval;} |
206 | virtual ushort GetUShortValue(void) {return (ushort)Tval;} |
207 | virtual int GetIntValue(void) {return (int)Tval;} |
208 | virtual uint GetUIntValue(void) {return (uint)Tval;} |
209 | virtual longlong GetBigintValue(void) {return (longlong)Tval;} |
210 | virtual ulonglong GetUBigintValue(void) {return (ulonglong)Tval;} |
211 | virtual double GetFloatValue(void) {return (double)Tval;} |
212 | virtual void *GetTo_Val(void) {return &Tval;} |
213 | |
214 | // Methods |
215 | virtual bool SetValue_pval(PVAL valp, bool chktype); |
216 | virtual bool SetValue_char(const char *p, int n); |
217 | virtual void SetValue_psz(PCSZ s); |
218 | virtual void SetValue_bool(bool b) {Tval = (b) ? 1 : 0;} |
219 | virtual int CompareValue(PVAL vp); |
220 | virtual void SetValue(char c) {Tval = (TYPE)c; Null = false;} |
221 | virtual void SetValue(uchar c) {Tval = (TYPE)c; Null = false;} |
222 | virtual void SetValue(short i) {Tval = (TYPE)i; Null = false;} |
223 | virtual void SetValue(ushort i) {Tval = (TYPE)i; Null = false;} |
224 | virtual void SetValue(int n) {Tval = (TYPE)n; Null = false;} |
225 | virtual void SetValue(uint n) {Tval = (TYPE)n; Null = false;} |
226 | virtual void SetValue(longlong n) {Tval = (TYPE)n; Null = false;} |
227 | virtual void SetValue(ulonglong n) {Tval = (TYPE)n; Null = false;} |
228 | virtual void SetValue(double f) {Tval = (TYPE)f; Null = false;} |
229 | virtual void SetValue_pvblk(PVBLK blk, int n); |
230 | virtual void SetBinValue(void *p); |
231 | virtual bool GetBinValue(void *buf, int buflen, bool go); |
232 | virtual char *ShowValue(char *buf, int); |
233 | virtual char *GetCharString(char *p); |
234 | virtual bool IsEqual(PVAL vp, bool chktype); |
235 | virtual bool Compute(PGLOBAL g, PVAL *vp, int np, OPVAL op); |
236 | virtual bool SetConstFormat(PGLOBAL, FORMAT&); |
237 | virtual bool FormatValue(PVAL vp, PCSZ fmt); |
238 | |
239 | protected: |
240 | static TYPE MinMaxVal(bool b); |
241 | TYPE SafeAdd(TYPE n1, TYPE n2); |
242 | TYPE SafeMult(TYPE n1, TYPE n2); |
243 | bool Compall(PGLOBAL g, PVAL *vp, int np, OPVAL op); |
244 | |
245 | // Default constructor not to be used |
246 | TYPVAL(void) : VALUE(TYPE_ERROR) {} |
247 | |
248 | // Specialized functions |
249 | static ulonglong MaxVal(void); |
250 | TYPE GetTypedValue(PVAL vp); |
251 | TYPE GetTypedValue(PVBLK blk, int n); |
252 | // TYPE GetTypedValue(PSZ s); |
253 | |
254 | // Members |
255 | TYPE Tval; |
256 | }; // end of class TYPVAL |
257 | |
258 | /***********************************************************************/ |
259 | /* Specific STRING class. */ |
260 | /***********************************************************************/ |
261 | template <> |
262 | class DllExport TYPVAL<PSZ>: public VALUE { |
263 | public: |
264 | // Constructors |
265 | TYPVAL(PSZ s, short c = 0); |
266 | TYPVAL(PGLOBAL g, PSZ s, int n, int c); |
267 | |
268 | // Implementation |
269 | virtual bool IsTypeNum(void) {return false;} |
270 | virtual bool IsZero(void) {return *Strp == 0;} |
271 | virtual void Reset(void) {*Strp = 0;} |
272 | virtual int GetValLen(void) {return Len;}; |
273 | virtual int GetValPrec() {return (Ci) ? 1 : 0;} |
274 | virtual int GetSize(void) {return (Strp) ? (int)strlen(Strp) : 0;} |
275 | virtual PSZ GetCharValue(void) {return Strp;} |
276 | virtual char GetTinyValue(void); |
277 | virtual uchar GetUTinyValue(void); |
278 | virtual short GetShortValue(void); |
279 | virtual ushort GetUShortValue(void); |
280 | virtual int GetIntValue(void); |
281 | virtual uint GetUIntValue(void); |
282 | virtual longlong GetBigintValue(void); |
283 | virtual ulonglong GetUBigintValue(void); |
284 | virtual double GetFloatValue(void) {return atof(Strp);} |
285 | virtual void *GetTo_Val(void) {return Strp;} |
286 | virtual void SetPrec(int prec) {Ci = prec != 0;} |
287 | |
288 | // Methods |
289 | virtual bool SetValue_pval(PVAL valp, bool chktype); |
290 | virtual bool SetValue_char(const char *p, int n); |
291 | virtual void SetValue_psz(PCSZ s); |
292 | virtual void SetValue_pvblk(PVBLK blk, int n); |
293 | virtual void SetValue(char c); |
294 | virtual void SetValue(uchar c); |
295 | virtual void SetValue(short i); |
296 | virtual void SetValue(ushort i); |
297 | virtual void SetValue(int n); |
298 | virtual void SetValue(uint n); |
299 | virtual void SetValue(longlong n); |
300 | virtual void SetValue(ulonglong n); |
301 | virtual void SetValue(double f); |
302 | virtual void SetBinValue(void *p); |
303 | virtual int CompareValue(PVAL vp); |
304 | virtual bool GetBinValue(void *buf, int buflen, bool go); |
305 | virtual char *ShowValue(char *buf, int); |
306 | virtual char *GetCharString(char *p); |
307 | virtual bool IsEqual(PVAL vp, bool chktype); |
308 | virtual bool Compute(PGLOBAL g, PVAL *vp, int np, OPVAL op); |
309 | virtual bool FormatValue(PVAL vp, PCSZ fmt); |
310 | virtual bool SetConstFormat(PGLOBAL, FORMAT&); |
311 | virtual void Prints(PGLOBAL g, char *ps, uint z); |
312 | |
313 | protected: |
314 | // Members |
315 | PSZ Strp; |
316 | bool Ci; // true if case insensitive |
317 | int Len; |
318 | }; // end of class TYPVAL<PSZ> |
319 | |
320 | /***********************************************************************/ |
321 | /* Specific DECIMAL class. */ |
322 | /***********************************************************************/ |
323 | class DllExport DECVAL: public TYPVAL<PSZ> { |
324 | public: |
325 | // Constructors |
326 | DECVAL(PSZ s); |
327 | DECVAL(PGLOBAL g, PSZ s, int n, int prec, bool uns); |
328 | |
329 | // Implementation |
330 | virtual bool IsTypeNum(void) {return true;} |
331 | virtual bool IsZero(void); |
332 | virtual void Reset(void); |
333 | virtual int GetValPrec() {return Prec;} |
334 | |
335 | // Methods |
336 | virtual bool GetBinValue(void *buf, int buflen, bool go); |
337 | virtual char *ShowValue(char *buf, int); |
338 | virtual bool IsEqual(PVAL vp, bool chktype); |
339 | virtual int CompareValue(PVAL vp); |
340 | |
341 | protected: |
342 | // Members |
343 | }; // end of class DECVAL |
344 | |
345 | /***********************************************************************/ |
346 | /* Specific BINARY class. */ |
347 | /***********************************************************************/ |
348 | class DllExport BINVAL: public VALUE { |
349 | public: |
350 | // Constructors |
351 | //BINVAL(void *p); |
352 | BINVAL(PGLOBAL g, void *p, int cl, int n); |
353 | |
354 | // Implementation |
355 | virtual bool IsTypeNum(void) {return false;} |
356 | virtual bool IsZero(void); |
357 | virtual void Reset(void); |
358 | virtual int GetValLen(void) {return Clen;}; |
359 | virtual int GetValPrec() {return 0;} |
360 | virtual int GetSize(void) {return Len;} |
361 | virtual PSZ GetCharValue(void) {return (PSZ)Binp;} |
362 | virtual char GetTinyValue(void); |
363 | virtual uchar GetUTinyValue(void); |
364 | virtual short GetShortValue(void); |
365 | virtual ushort GetUShortValue(void); |
366 | virtual int GetIntValue(void); |
367 | virtual uint GetUIntValue(void); |
368 | virtual longlong GetBigintValue(void); |
369 | virtual ulonglong GetUBigintValue(void); |
370 | virtual double GetFloatValue(void); |
371 | virtual void *GetTo_Val(void) {return Binp;} |
372 | |
373 | // Methods |
374 | virtual bool SetValue_pval(PVAL valp, bool chktype); |
375 | virtual bool SetValue_char(const char *p, int n); |
376 | virtual void SetValue_psz(PCSZ s); |
377 | virtual void SetValue_pvblk(PVBLK blk, int n); |
378 | virtual void SetValue(char c); |
379 | virtual void SetValue(uchar c); |
380 | virtual void SetValue(short i); |
381 | virtual void SetValue(ushort i); |
382 | virtual void SetValue(int n); |
383 | virtual void SetValue(uint n); |
384 | virtual void SetValue(longlong n); |
385 | virtual void SetValue(ulonglong n); |
386 | virtual void SetValue(double f); |
387 | virtual void SetBinValue(void *p); |
388 | virtual bool GetBinValue(void *buf, int buflen, bool go); |
389 | virtual int CompareValue(PVAL) {assert(false); return 0;} |
390 | virtual char *ShowValue(char *buf, int); |
391 | virtual char *GetCharString(char *p); |
392 | virtual bool IsEqual(PVAL vp, bool chktype); |
393 | virtual bool FormatValue(PVAL vp, PCSZ fmt); |
394 | virtual bool SetConstFormat(PGLOBAL, FORMAT&); |
395 | |
396 | protected: |
397 | // Members |
398 | void *Binp; |
399 | char *Chrp; |
400 | int Len; |
401 | }; // end of class BINVAL |
402 | |
403 | /***********************************************************************/ |
404 | /* Class DTVAL: represents a time stamp value. */ |
405 | /***********************************************************************/ |
406 | class DllExport DTVAL : public TYPVAL<int> { |
407 | public: |
408 | // Constructors |
409 | DTVAL(PGLOBAL g, int n, int p, PCSZ fmt); |
410 | DTVAL(int n); |
411 | |
412 | // Implementation |
413 | virtual bool SetValue_pval(PVAL valp, bool chktype); |
414 | virtual bool SetValue_char(const char *p, int n); |
415 | virtual void SetValue_psz(PCSZ s); |
416 | virtual void SetValue_pvblk(PVBLK blk, int n); |
417 | virtual char *GetCharString(char *p); |
418 | virtual char *ShowValue(char *buf, int); |
419 | virtual bool FormatValue(PVAL vp, PCSZ fmt); |
420 | bool SetFormat(PGLOBAL g, PCSZ fmt, int len, int year = 0); |
421 | bool SetFormat(PGLOBAL g, PVAL valp); |
422 | bool IsFormatted(void) {return Pdtp != NULL;} |
423 | bool MakeTime(struct tm *ptm); |
424 | static void SetTimeShift(void); |
425 | static int GetShift(void) {return Shift;} |
426 | |
427 | // Methods |
428 | bool MakeDate(PGLOBAL g, int *val, int nval); |
429 | |
430 | struct tm *GetGmTime(struct tm *); |
431 | |
432 | protected: |
433 | // Default constructor not to be used |
434 | DTVAL(void) : TYPVAL<int>() {} |
435 | |
436 | // Members |
437 | static int Shift; // Time zone shift in seconds |
438 | PDTP Pdtp; // To the DATPAR structure |
439 | char *Sdate; // Utility char buffer |
440 | int DefYear; // Used by ExtractDate |
441 | int Len; // Used by CHAR scalar function |
442 | }; // end of class DTVAL |
443 | |
444 | #endif // __VALUE__H__ |
445 | |