| 1 | /*************** Valblk H Declares Source Code File (.H) ***************/ |
| 2 | /* Name: VALBLK.H Version 2.1 */ |
| 3 | /* */ |
| 4 | /* (C) Copyright to the author Olivier BERTRAND 2005-2014 */ |
| 5 | /* */ |
| 6 | /* This file contains the VALBLK and derived classes declares. */ |
| 7 | /***********************************************************************/ |
| 8 | |
| 9 | /***********************************************************************/ |
| 10 | /* Include required application header files */ |
| 11 | /* assert.h is header required when using the assert function. */ |
| 12 | /* block.h is header containing Block global declarations. */ |
| 13 | /***********************************************************************/ |
| 14 | #ifndef __VALBLK__H__ |
| 15 | #define __VALBLK__H__ |
| 16 | #include "value.h" |
| 17 | |
| 18 | /***********************************************************************/ |
| 19 | /* Utility used to allocate value blocks. */ |
| 20 | /***********************************************************************/ |
| 21 | DllExport PVBLK AllocValBlock(PGLOBAL, void*, int, int, int, int, |
| 22 | bool, bool, bool); |
| 23 | const char *GetFmt(int type, bool un = false); |
| 24 | |
| 25 | /***********************************************************************/ |
| 26 | /* DB static external variables. */ |
| 27 | /***********************************************************************/ |
| 28 | extern MBLOCK Nmblk; /* Used to initialize MBLOCK's */ |
| 29 | |
| 30 | /***********************************************************************/ |
| 31 | /* Class MBVALS is a utility class for (re)allocating VALBLK's. */ |
| 32 | /***********************************************************************/ |
| 33 | class MBVALS : public BLOCK { |
| 34 | //friend class LSTBLK; |
| 35 | friend class ARRAY; |
| 36 | public: |
| 37 | // Constructors |
| 38 | MBVALS(void) {Vblk = NULL; Mblk = Nmblk;} |
| 39 | |
| 40 | // Methods |
| 41 | void *GetMemp(void) {return Mblk.Memp;} |
| 42 | PVBLK Allocate(PGLOBAL g, int type, int len, int prec, |
| 43 | int n, bool sub = false); |
| 44 | bool ReAllocate(PGLOBAL g, int n); |
| 45 | void Free(void); |
| 46 | |
| 47 | protected: |
| 48 | // Members |
| 49 | PVBLK Vblk; // Pointer to VALBLK |
| 50 | MBLOCK Mblk; // The memory block |
| 51 | }; // end of class MBVALS |
| 52 | |
| 53 | typedef class MBVALS *PMBV; |
| 54 | |
| 55 | /***********************************************************************/ |
| 56 | /* Class VALBLK represent a base class for variable blocks. */ |
| 57 | /***********************************************************************/ |
| 58 | class VALBLK : public BLOCK { |
| 59 | public: |
| 60 | // Constructors |
| 61 | VALBLK(void *mp, int type, int nval, bool un = false); |
| 62 | |
| 63 | // Implementation |
| 64 | int GetNval(void) {return Nval;} |
| 65 | void SetNval(int n) {Nval = n;} |
| 66 | void *GetValPointer(void) {return Blkp;} |
| 67 | void SetValPointer(void *mp) {Blkp = mp;} |
| 68 | int GetType(void) {return Type;} |
| 69 | int GetPrec(void) {return Prec;} |
| 70 | void SetCheck(bool b) {Check = b;} |
| 71 | void MoveNull(int i, int j) |
| 72 | {if (To_Nulls) To_Nulls[j] = To_Nulls[j];} |
| 73 | virtual void SetNull(int n, bool b) |
| 74 | {if (To_Nulls) {To_Nulls[n] = (b) ? '*' : 0;}} |
| 75 | virtual bool IsNull(int n) {return To_Nulls && To_Nulls[n];} |
| 76 | virtual bool IsNullable(void) {return Nullable;} |
| 77 | virtual void SetNullable(bool b); |
| 78 | virtual bool IsUnsigned(void) {return Unsigned;} |
| 79 | virtual bool Init(PGLOBAL g, bool check) = 0; |
| 80 | virtual int GetVlen(void) = 0; |
| 81 | virtual PSZ GetCharValue(int n); |
| 82 | virtual char GetTinyValue(int n) = 0; |
| 83 | virtual uchar GetUTinyValue(int n) = 0; |
| 84 | virtual short GetShortValue(int n) = 0; |
| 85 | virtual ushort GetUShortValue(int n) = 0; |
| 86 | virtual int GetIntValue(int n) = 0; |
| 87 | virtual uint GetUIntValue(int n) = 0; |
| 88 | virtual longlong GetBigintValue(int n) = 0; |
| 89 | virtual ulonglong GetUBigintValue(int n) = 0; |
| 90 | virtual double GetFloatValue(int n) = 0; |
| 91 | virtual char *GetCharString(char *p, int n) = 0; |
| 92 | virtual void ReAlloc(void *mp, int n) {Blkp = mp; Nval = n;} |
| 93 | virtual void Reset(int n) = 0; |
| 94 | virtual bool SetFormat(PGLOBAL g, PCSZ fmt, int len, int year = 0); |
| 95 | virtual void SetPrec(int p) {} |
| 96 | virtual bool IsCi(void) {return false;} |
| 97 | |
| 98 | // Methods |
| 99 | virtual void SetValue(short, int) {assert(false);} |
| 100 | virtual void SetValue(ushort, int) {assert(false);} |
| 101 | virtual void SetValue(int, int) {assert(false);} |
| 102 | virtual void SetValue(uint, int) {assert(false);} |
| 103 | virtual void SetValue(longlong, int) {assert(false);} |
| 104 | virtual void SetValue(ulonglong, int) {assert(false);} |
| 105 | virtual void SetValue(double, int) {assert(false);} |
| 106 | virtual void SetValue(char, int) {assert(false);} |
| 107 | virtual void SetValue(uchar, int) {assert(false);} |
| 108 | virtual void SetValue(PCSZ, int) {assert(false);} |
| 109 | virtual void SetValue(const char *, uint, int) {assert(false);} |
| 110 | virtual void SetValue(PVAL valp, int n) = 0; |
| 111 | virtual void SetValue(PVBLK pv, int n1, int n2) = 0; |
| 112 | virtual void SetMin(PVAL valp, int n) = 0; |
| 113 | virtual void SetMax(PVAL valp, int n) = 0; |
| 114 | virtual void Move(int i, int j) = 0; |
| 115 | virtual int CompVal(PVAL vp, int n) = 0; |
| 116 | virtual int CompVal(int i1, int i2) = 0; |
| 117 | virtual void *GetValPtr(int n) = 0; |
| 118 | virtual void *GetValPtrEx(int n) = 0; |
| 119 | virtual int Find(PVAL vp) = 0; |
| 120 | virtual int GetMaxLength(void) = 0; |
| 121 | bool Locate(PVAL vp, int& i); |
| 122 | |
| 123 | protected: |
| 124 | bool AllocBuff(PGLOBAL g, size_t size); |
| 125 | void ChkIndx(int n); |
| 126 | void ChkTyp(PVAL v); |
| 127 | void ChkTyp(PVBLK vb); |
| 128 | |
| 129 | // Members |
| 130 | PGLOBAL Global; // Used for messages and allocation |
| 131 | MBLOCK Mblk; // Used to allocate buffer |
| 132 | char *To_Nulls; // Null values array |
| 133 | void *Blkp; // To value block |
| 134 | bool Check; // If true SetValue types must match |
| 135 | bool Nullable; // True if values can be null |
| 136 | bool Unsigned; // True if values are unsigned |
| 137 | int Type; // Type of individual values |
| 138 | int Nval; // Max number of values in block |
| 139 | int Prec; // Precision of float values |
| 140 | }; // end of class VALBLK |
| 141 | |
| 142 | /***********************************************************************/ |
| 143 | /* Class TYPBLK: represents a block of typed values. */ |
| 144 | /***********************************************************************/ |
| 145 | template <class TYPE> |
| 146 | class TYPBLK : public VALBLK { |
| 147 | public: |
| 148 | // Constructors |
| 149 | TYPBLK(void *mp, int size, int type, int prec = 0, bool un = false); |
| 150 | |
| 151 | // Implementation |
| 152 | virtual bool Init(PGLOBAL g, bool check); |
| 153 | virtual int GetVlen(void) {return sizeof(TYPE);} |
| 154 | virtual char GetTinyValue(int n) {return (char)Typp[n];} |
| 155 | virtual uchar GetUTinyValue(int n) {return (uchar)Typp[n];} |
| 156 | virtual short GetShortValue(int n) {return (short)Typp[n];} |
| 157 | virtual ushort GetUShortValue(int n) {return (ushort)Typp[n];} |
| 158 | virtual int GetIntValue(int n) {return (int)Typp[n];} |
| 159 | virtual uint GetUIntValue(int n) {return (uint)Typp[n];} |
| 160 | virtual longlong GetBigintValue(int n) {return (longlong)Typp[n];} |
| 161 | virtual ulonglong GetUBigintValue(int n) {return (ulonglong)Typp[n];} |
| 162 | virtual double GetFloatValue(int n) {return (double)Typp[n];} |
| 163 | virtual char *GetCharString(char *p, int n); |
| 164 | virtual void Reset(int n) {Typp[n] = 0;} |
| 165 | |
| 166 | // Methods |
| 167 | using VALBLK::SetValue; |
| 168 | virtual void SetValue(PCSZ sp, int n); |
| 169 | virtual void SetValue(const char *sp, uint len, int n); |
| 170 | virtual void SetValue(short sval, int n) |
| 171 | {Typp[n] = (TYPE)sval; SetNull(n, false);} |
| 172 | virtual void SetValue(ushort sval, int n) |
| 173 | {Typp[n] = (TYPE)sval; SetNull(n, false);} |
| 174 | virtual void SetValue(int lval, int n) |
| 175 | {Typp[n] = (TYPE)lval; SetNull(n, false);} |
| 176 | virtual void SetValue(uint lval, int n) |
| 177 | {Typp[n] = (TYPE)lval; SetNull(n, false);} |
| 178 | virtual void SetValue(longlong lval, int n) |
| 179 | {Typp[n] = (TYPE)lval; SetNull(n, false);} |
| 180 | virtual void SetValue(ulonglong lval, int n) |
| 181 | {Typp[n] = (TYPE)lval; SetNull(n, false);} |
| 182 | virtual void SetValue(double fval, int n) |
| 183 | {Typp[n] = (TYPE)fval; SetNull(n, false);} |
| 184 | virtual void SetValue(char cval, int n) |
| 185 | {Typp[n] = (TYPE)cval; SetNull(n, false);} |
| 186 | virtual void SetValue(uchar cval, int n) |
| 187 | {Typp[n] = (TYPE)cval; SetNull(n, false);} |
| 188 | virtual void SetValue(PVAL valp, int n); |
| 189 | virtual void SetValue(PVBLK pv, int n1, int n2); |
| 190 | virtual void SetMin(PVAL valp, int n); |
| 191 | virtual void SetMax(PVAL valp, int n); |
| 192 | virtual void Move(int i, int j); |
| 193 | virtual int CompVal(PVAL vp, int n); |
| 194 | virtual int CompVal(int i1, int i2); |
| 195 | virtual void *GetValPtr(int n); |
| 196 | virtual void *GetValPtrEx(int n); |
| 197 | virtual int Find(PVAL vp); |
| 198 | virtual int GetMaxLength(void); |
| 199 | |
| 200 | protected: |
| 201 | // Specialized functions |
| 202 | static ulonglong MaxVal(void); |
| 203 | TYPE GetTypedValue(PVAL vp); |
| 204 | TYPE GetTypedValue(PVBLK blk, int n); |
| 205 | |
| 206 | // Members |
| 207 | TYPE* const &Typp; |
| 208 | const char *Fmt; |
| 209 | }; // end of class TYPBLK |
| 210 | |
| 211 | /***********************************************************************/ |
| 212 | /* Class CHRBLK: represent a block of fixed length strings. */ |
| 213 | /***********************************************************************/ |
| 214 | class CHRBLK : public VALBLK { |
| 215 | public: |
| 216 | // Constructors |
| 217 | CHRBLK(void *mp, int size, int type, int len, int prec, bool b); |
| 218 | |
| 219 | // Implementation |
| 220 | virtual bool Init(PGLOBAL g, bool check); |
| 221 | virtual int GetVlen(void) {return Long;} |
| 222 | virtual PSZ GetCharValue(int n); |
| 223 | virtual char GetTinyValue(int n); |
| 224 | virtual uchar GetUTinyValue(int n); |
| 225 | virtual short GetShortValue(int n); |
| 226 | virtual ushort GetUShortValue(int n); |
| 227 | virtual int GetIntValue(int n); |
| 228 | virtual uint GetUIntValue(int n); |
| 229 | virtual longlong GetBigintValue(int n); |
| 230 | virtual ulonglong GetUBigintValue(int n); |
| 231 | virtual double GetFloatValue(int n); |
| 232 | virtual char *GetCharString(char *p, int n); |
| 233 | virtual void Reset(int n); |
| 234 | virtual void SetPrec(int p) {Ci = (p != 0);} |
| 235 | virtual bool IsCi(void) {return Ci;} |
| 236 | |
| 237 | // Methods |
| 238 | using VALBLK::SetValue; |
| 239 | virtual void SetValue(PCSZ sp, int n); |
| 240 | virtual void SetValue(const char *sp, uint len, int n); |
| 241 | virtual void SetValue(PVAL valp, int n); |
| 242 | virtual void SetValue(PVBLK pv, int n1, int n2); |
| 243 | virtual void SetMin(PVAL valp, int n); |
| 244 | virtual void SetMax(PVAL valp, int n); |
| 245 | virtual void Move(int i, int j); |
| 246 | virtual int CompVal(PVAL vp, int n); |
| 247 | virtual int CompVal(int i1, int i2); |
| 248 | virtual void *GetValPtr(int n); |
| 249 | virtual void *GetValPtrEx(int n); |
| 250 | virtual int Find(PVAL vp); |
| 251 | virtual int GetMaxLength(void); |
| 252 | |
| 253 | protected: |
| 254 | // Members |
| 255 | char* const &Chrp; // Pointer to char buffer |
| 256 | PSZ Valp; // Used to make a zero ended value |
| 257 | bool Blanks; // True for right filling with blanks |
| 258 | bool Ci; // True if case insensitive |
| 259 | int Long; // Length of each string |
| 260 | }; // end of class CHRBLK |
| 261 | |
| 262 | /***********************************************************************/ |
| 263 | /* Class STRBLK: represent a block of string pointers. */ |
| 264 | /* Currently this class is used only by the DECODE scalar function */ |
| 265 | /* and by the MyColumn function to store date formats. */ |
| 266 | /***********************************************************************/ |
| 267 | class STRBLK : public VALBLK { |
| 268 | public: |
| 269 | // Constructors |
| 270 | STRBLK(PGLOBAL g, void *mp, int size, int type); |
| 271 | |
| 272 | // Implementation |
| 273 | virtual void SetNull(int n, bool b) {if (b) {Strp[n] = NULL;}} |
| 274 | virtual bool IsNull(int n) {return Strp[n] == NULL;} |
| 275 | virtual void SetNullable(bool) {} // Always nullable |
| 276 | virtual bool Init(PGLOBAL g, bool check); |
| 277 | virtual int GetVlen(void) {return sizeof(PSZ);} |
| 278 | virtual PSZ GetCharValue(int n) {return Strp[n];} |
| 279 | virtual char GetTinyValue(int n); |
| 280 | virtual uchar GetUTinyValue(int n); |
| 281 | virtual short GetShortValue(int n); |
| 282 | virtual ushort GetUShortValue(int n); |
| 283 | virtual int GetIntValue(int n); |
| 284 | virtual uint GetUIntValue(int n); |
| 285 | virtual longlong GetBigintValue(int n); |
| 286 | virtual ulonglong GetUBigintValue(int n); |
| 287 | virtual double GetFloatValue(int n) {return atof(Strp[n]);} |
| 288 | virtual char *GetCharString(char *, int n) {return Strp[n];} |
| 289 | virtual void Reset(int n) {Strp[n] = NULL;} |
| 290 | |
| 291 | // Methods |
| 292 | using VALBLK::SetValue; |
| 293 | virtual void SetValue(PCSZ sp, int n); |
| 294 | virtual void SetValue(const char *sp, uint len, int n); |
| 295 | virtual void SetValue(PVAL valp, int n); |
| 296 | virtual void SetValue(PVBLK pv, int n1, int n2); |
| 297 | virtual void SetMin(PVAL valp, int n); |
| 298 | virtual void SetMax(PVAL valp, int n); |
| 299 | virtual void Move(int i, int j); |
| 300 | virtual int CompVal(PVAL vp, int n); |
| 301 | virtual int CompVal(int i1, int i2); |
| 302 | virtual void *GetValPtr(int n); |
| 303 | virtual void *GetValPtrEx(int n); |
| 304 | virtual int Find(PVAL vp); |
| 305 | virtual int GetMaxLength(void); |
| 306 | |
| 307 | // Specific |
| 308 | void SetSorted(bool b) {Sorted = b;} |
| 309 | |
| 310 | protected: |
| 311 | // Members |
| 312 | PSZ* const &Strp; // Pointer to PSZ buffer |
| 313 | bool Sorted; // Values are (semi?) sorted |
| 314 | }; // end of class STRBLK |
| 315 | |
| 316 | /***********************************************************************/ |
| 317 | /* Class DATBLK: represents a block of time stamp values. */ |
| 318 | /***********************************************************************/ |
| 319 | class DATBLK : public TYPBLK<int> { |
| 320 | public: |
| 321 | // Constructor |
| 322 | DATBLK(void *mp, int size); |
| 323 | |
| 324 | // Implementation |
| 325 | virtual bool SetFormat(PGLOBAL g, PCSZ fmt, int len, int year = 0); |
| 326 | virtual char *GetCharString(char *p, int n); |
| 327 | |
| 328 | // Methods |
| 329 | using TYPBLK<int>::SetValue; |
| 330 | virtual void SetValue(PCSZ sp, int n); |
| 331 | |
| 332 | protected: |
| 333 | // Members |
| 334 | PVAL Dvalp; // Date value used to convert string |
| 335 | }; // end of class DATBLK |
| 336 | |
| 337 | /***********************************************************************/ |
| 338 | /* Class PTRBLK: represent a block of char pointers. */ |
| 339 | /* Currently this class is used only by the ARRAY class to make and */ |
| 340 | /* sort a list of char pointers. */ |
| 341 | /***********************************************************************/ |
| 342 | class PTRBLK : public STRBLK { |
| 343 | friend class ARRAY; |
| 344 | friend PVBLK AllocValBlock(PGLOBAL, void *, int, int, int, int, |
| 345 | bool, bool, bool); |
| 346 | protected: |
| 347 | // Constructors |
| 348 | PTRBLK(PGLOBAL g, void *mp, int size) : STRBLK(g, mp, size, TYPE_PCHAR) {} |
| 349 | |
| 350 | // Implementation |
| 351 | |
| 352 | // Methods |
| 353 | using STRBLK::SetValue; |
| 354 | using STRBLK::CompVal; |
| 355 | virtual void SetValue(PCSZ p, int n) {Strp[n] = (char*)p;} |
| 356 | virtual int CompVal(int i1, int i2); |
| 357 | |
| 358 | protected: |
| 359 | // Members |
| 360 | }; // end of class PTRBLK |
| 361 | |
| 362 | #endif // __VALBLK__H__ |
| 363 | |
| 364 | |