1 {*********************************************************}
3 { Zeos Database Objects }
4 { Variant Processing Classes }
6 { Originally written by Sergey Seroukhov }
8 {*********************************************************}
10 {@********************************************************}
11 { Copyright (c) 1999-2012 Zeos Development Group }
13 { License Agreement: }
15 { This library is distributed in the hope that it will be }
16 { useful, but WITHOUT ANY WARRANTY; without even the }
17 { implied warranty of MERCHANTABILITY or FITNESS FOR }
18 { A PARTICULAR PURPOSE. See the GNU Lesser General }
19 { Public License for more details. }
21 { The source code of the ZEOS Libraries and packages are }
22 { distributed under the Library GNU General Public }
23 { License (see the file COPYING / COPYING.ZEOS) }
24 { with the following modification: }
25 { As a special exception, the copyright holders of this }
26 { library give you permission to link this library with }
27 { independent modules to produce an executable, }
28 { regardless of the license terms of these independent }
29 { modules, and to copy and distribute the resulting }
30 { executable under terms of your choice, provided that }
31 { you also meet, for each linked independent module, }
32 { the terms and conditions of the license of that module. }
33 { An independent module is a module which is not derived }
34 { from or based on this library. If you modify this }
35 { library, you may extend this exception to your version }
36 { of the library, but you are not obligated to do so. }
37 { If you do not wish to do so, delete this exception }
38 { statement from your version. }
41 { The project web site is located on: }
42 { http://zeos.firmos.at (FORUM) }
43 { http://sourceforge.net/p/zeoslib/tickets/ (BUGTRACKER)}
44 { svn://svn.code.sf.net/p/zeoslib/code-0/trunk (SVN) }
46 { http://www.sourceforge.net/projects/zeoslib. }
49 { Zeos Development Group. }
50 {********************************************************@}
60 Windows, //need for inline
62 Classes, SysUtils, Types, ZCompatibility, ZClasses, ZSysUtils;
65 {** Precision for float values comparison }
66 FLOAT_COMPARE_PRECISION = 1.0e-5;
67 FLOAT_COMPARE_PRECISION_SINGLE = 1.5e-5;
69 {FPC - Compatibility for SQLite (currently) }
70 JULIAN_DAY_DISTANCE = 2415018.5; //distance from "julian day 0" (January 1, 4713 BC 12:00AM) to "1899-12-30 00:00AM"}
73 {** Defines variant types. }
74 TZVariantType = (vtNull, vtBoolean, vtInteger, vtFloat, vtBytes,
75 vtString, vtAnsiString, vtUTF8String, vtRawByteString, vtUnicodeString, //String Types
76 vtDateTime, vtPointer, vtInterface);
78 {** Defines a variant structure. }
79 TZVariant = {$ifndef FPC_REQUIRES_PROPER_ALIGNMENT}packed{$endif} record
82 VAnsiString: AnsiString;
83 VRawByteString: RawByteString;
84 VUTF8String: UTF8String;
85 VUnicodeString: ZWideString;
86 VBytes: TByteDynArray;
87 VInterface: IZInterface;
89 vtBoolean: (VBoolean: Boolean);
90 vtInteger: (VInteger: Int64);
91 vtFloat: (VFloat: Extended);
92 VtDateTime: (VDateTime: Double); // M.A. was TDateTime
93 VtPointer: (VPointer: Pointer);
96 PZVariant = ^TZVariant;
98 {** Defines an array of variants. }
99 TZVariantDynArray = array of TZVariant;
101 {** Defines a variant processing exception. }
102 EZVariantException = class (Exception);
104 {** Defines an interface for variant data. }
105 {** Defines a Variant Manager interface. }
106 IZVariantManager = interface (IZInterface)
107 ['{DAA373D9-1A98-4AA8-B65E-4C23167EE83F}']
109 function IsNull(const Value: TZVariant): Boolean;
110 procedure SetNull(var Value: TZVariant);
112 function Convert(const Value: TZVariant; NewType: TZVariantType): TZVariant;
113 procedure Assign(const SrcValue: TZVariant; var DstValue: TZVariant);
114 function Clone(const Value: TZVariant): TZVariant;
115 function Compare(const Value1, Value2: TZVariant): Integer;
117 function GetAsBoolean(const Value: TZVariant): Boolean;
118 function GetAsBytes(const Value: TZVariant): TByteDynArray;
119 function GetAsInteger(const Value: TZVariant): Int64;
120 function GetAsFloat(const Value: TZVariant): Extended;
121 function GetAsString(const Value: TZVariant): String;
122 function GetAsAnsiString(const Value: TZVariant): AnsiString;
123 function GetAsRawByteString(const Value: TZVariant): RawByteString; overload;
124 function GetAsUTF8String(const Value: TZVariant): UTF8String;
125 function GetAsUnicodeString(const Value: TZVariant): ZWideString;
126 function GetAsDateTime(const Value: TZVariant): TDateTime;
127 function GetAsPointer(const Value: TZVariant): Pointer;
128 function GetAsInterface(const Value: TZVariant): IZInterface;
130 procedure SetAsBoolean(var Value: TZVariant; Data: Boolean);
131 procedure SetAsBytes(var Value: TZVariant; const Data: TByteDynArray);
132 procedure SetAsInteger(var Value: TZVariant; Data: Int64);
133 procedure SetAsFloat(var Value: TZVariant; Data: Extended);
134 procedure SetAsString(var Value: TZVariant; const Data: String);
135 procedure SetAsAnsiString(var Value: TZVariant; const Data: AnsiString);
136 procedure SetAsUTF8String(var Value: TZVariant; const Data: UTF8String);
137 procedure SetAsRawByteString(var Value: TZVariant; const Data: RawByteString);
138 procedure SetAsUnicodeString(var Value: TZVariant; const Data: ZWideString);
139 procedure SetAsDateTime(var Value: TZVariant; Data: TDateTime);
140 procedure SetAsPointer(var Value: TZVariant; Data: Pointer);
141 procedure SetAsInterface(var Value: TZVariant; Data: IZInterface);
143 function OpAdd(const Value1, Value2: TZVariant): TZVariant;
144 function OpSub(const Value1, Value2: TZVariant): TZVariant;
145 function OpMul(const Value1, Value2: TZVariant): TZVariant;
146 function OpDiv(const Value1, Value2: TZVariant): TZVariant;
147 function OpMod(const Value1, Value2: TZVariant): TZVariant;
148 function OpPow(const Value1, Value2: TZVariant): TZVariant;
149 function OpAnd(const Value1, Value2: TZVariant): TZVariant;
150 function OpOr(const Value1, Value2: TZVariant): TZVariant;
151 function OpXor(const Value1, Value2: TZVariant): TZVariant;
152 function OpNot(const Value: TZVariant): TZVariant;
153 function OpNegative(const Value: TZVariant): TZVariant;
154 function OpEqual(const Value1, Value2: TZVariant): TZVariant;
155 function OpNotEqual(const Value1, Value2: TZVariant): TZVariant;
156 function OpMore(const Value1, Value2: TZVariant): TZVariant;
157 function OpLess(const Value1, Value2: TZVariant): TZVariant;
158 function OpMoreEqual(const Value1, Value2: TZVariant): TZVariant;
159 function OpLessEqual(const Value1, Value2: TZVariant): TZVariant;
162 {** Implements a variant manager with strict convertion rules. }
163 TZDefaultVariantManager = class (TInterfacedObject, IZVariantManager)
165 ZAnsiToUTF8: TZAnsiToUTF8;
166 ZUTF8ToAnsi: TZUTF8ToAnsi;
167 ZUTF8ToString: TZUTF8ToString;
168 ZStringToUTF8: TZStringToUTF8;
169 FSystemCodePage: Word;
171 procedure RaiseTypeMismatchError;
172 procedure RaiseUnsupportedOperation;
175 function Convert(const Value: TZVariant; NewType: TZVariantType): TZVariant;
177 procedure Assign(const SrcValue: TZVariant; var DstValue: TZVariant);
178 function Clone(const Value: TZVariant): TZVariant;
179 function Compare(const Value1, Value2: TZVariant): Integer;
181 function IsNull(const Value: TZVariant): Boolean;
182 procedure SetNull(var Value: TZVariant);
184 function GetAsBoolean(const Value: TZVariant): Boolean;
185 function GetAsBytes(const Value: TZVariant): TByteDynArray;
186 function GetAsInteger(const Value: TZVariant): Int64;
187 function GetAsFloat(const Value: TZVariant): Extended;
188 function GetAsString(const Value: TZVariant): String;
189 function GetAsAnsiString(const Value: TZVariant): AnsiString;
190 function GetAsUTF8String(const Value: TZVariant): UTF8String;
191 function GetAsRawByteString(const Value: TZVariant): RawByteString; overload;
192 function GetAsUnicodeString(const Value: TZVariant): ZWideString;
193 function GetAsDateTime(const Value: TZVariant): TDateTime;
194 function GetAsPointer(const Value: TZVariant): Pointer;
195 function GetAsInterface(const Value: TZVariant): IZInterface;
197 procedure SetAsBoolean(var Value: TZVariant; Data: Boolean);
198 procedure SetAsBytes(var Value: TZVariant; const Data: TByteDynArray);
199 procedure SetAsInteger(var Value: TZVariant; Data: Int64);
200 procedure SetAsFloat(var Value: TZVariant; Data: Extended);
201 procedure SetAsString(var Value: TZVariant; const Data: String);
202 procedure SetAsAnsiString(var Value: TZVariant; const Data: AnsiString);
203 procedure SetAsUTF8String(var Value: TZVariant; const Data: UTF8String);
204 procedure SetAsRawByteString(var Value: TZVariant; const Data: RawByteString);
205 procedure SetAsUnicodeString(var Value: TZVariant; const Data: ZWideString);
206 procedure SetAsDateTime(var Value: TZVariant; Data: TDateTime);
207 procedure SetAsPointer(var Value: TZVariant; Data: Pointer);
208 procedure SetAsInterface(var Value: TZVariant; Data: IZInterface);
210 function OpAdd(const Value1, Value2: TZVariant): TZVariant;
211 function OpSub(const Value1, Value2: TZVariant): TZVariant;
212 function OpMul(const Value1, Value2: TZVariant): TZVariant;
213 function OpDiv(const Value1, Value2: TZVariant): TZVariant;
214 function OpMod(const Value1, Value2: TZVariant): TZVariant;
215 function OpPow(const Value1, Value2: TZVariant): TZVariant;
216 function OpAnd(const Value1, Value2: TZVariant): TZVariant;
217 function OpOr(const Value1, Value2: TZVariant): TZVariant;
218 function OpXor(const Value1, Value2: TZVariant): TZVariant;
219 function OpNot(const Value: TZVariant): TZVariant;
220 function OpNegative(const Value: TZVariant): TZVariant;
221 function OpEqual(const Value1, Value2: TZVariant): TZVariant;
222 function OpNotEqual(const Value1, Value2: TZVariant): TZVariant;
223 function OpMore(const Value1, Value2: TZVariant): TZVariant;
224 function OpLess(const Value1, Value2: TZVariant): TZVariant;
225 function OpMoreEqual(const Value1, Value2: TZVariant): TZVariant;
226 function OpLessEqual(const Value1, Value2: TZVariant): TZVariant;
229 {** Implements a variant manager with soft convertion rules. }
230 TZSoftVariantManager = class (TZDefaultVariantManager)
232 function Convert(const Value: TZVariant; NewType: TZVariantType): TZVariant;
236 IZClientVariantManager = Interface(IZVariantManager)
237 ['{73A1A2C7-7C38-4620-B7FE-2426BF839BE5}']
238 function GetAsRawByteString(const Value: TZVariant; const RawCP: Word): RawByteString; overload;
241 {** Implements a variant manager with connection related convertion rules. }
242 TZClientVariantManager = class (TZDefaultVariantManager, IZClientVariantManager)
244 FConSettings: PZConSettings;
246 constructor Create(const ConSettings: PZConSettings);
247 function Convert(const Value: TZVariant; NewType: TZVariantType): TZVariant;
249 function GetAsRawByteString(const Value: TZVariant; const RawCP: Word): RawByteString; overload;
254 {** Represents any value interface. }
255 IZAnyValue = interface (IZClonnable)
256 ['{E81988B3-FD0E-4524-B658-B309B02F0B6A}']
258 function IsNull: Boolean;
259 function GetValue: TZVariant;
261 function GetBoolean: Boolean;
262 function GetBytes: TByteDynArray;
263 function GetInteger: Int64;
264 function GetFloat: Extended;
265 function GetString: String;
266 function GetAnsiString: AnsiString;
267 function GetUTF8String: UTF8String;
268 function GetUnicodeString: ZWideString;
269 function GetDateTime: TDateTime;
272 {** Implements an any value object. }
273 TZAnyValue = class(TZAbstractObject, IZAnyValue, IZComparable)
277 constructor Create(const Value: TZVariant);
278 constructor CreateWithBoolean(Value: Boolean);
279 constructor CreateWithInteger(Value: Int64);
280 constructor CreateWithFloat(Value: Extended);
281 constructor CreateWithString(const Value: String);
283 // unicodeType is a (dummy) default parameter to avoid
284 // the problem described in https://forums.codegear.com/thread.jspa?messageID=65681
285 // when dcc creates header (.hpp)-files for c++ builder. Both 'String' and
286 // 'UnicodeString' translate into 'UnicodeString' in C++ builder 2009/2010, and
287 // CreateWithString and CreateWithUnicodeString would result in duplicate
289 constructor CreateWithUnicodeString(const Value: String; unicodeType: Boolean=true);
291 constructor CreateWithUnicodeString(const Value: WideString);
293 constructor CreateWithDateTime(Value: TDateTime);
295 function IsNull: Boolean;
296 function GetValue: TZVariant;
298 function GetBoolean: Boolean;
299 function GetBytes: TByteDynArray;
300 function GetInteger: Int64;
301 function GetFloat: Extended;
302 function GetString: String;
303 function GetAnsiString: AnsiString;
304 function GetUTF8String: UTF8String;
305 function GetUnicodeString: ZWideString;
306 function GetDateTime: TDateTime;
308 function Equals(const Value: IZInterface): Boolean; override;
309 function Clone: IZInterface; override;
310 function ToString: string; override;
314 Encodes a custom variant value into standard variant.
315 @param Value a custom variant value to be encoded.
316 @returns an encoded standard variant.
318 function EncodeVariant(const Value: TZVariant): Variant;
321 Encodes an array of custom variant values into array of standard variants.
322 @param Value an array of custom variant values to be encoded.
323 @returns an encoded array of standard variants.
325 function EncodeVariantArray(const Value: TZVariantDynArray): Variant;
328 Decodes a standard variant value into custom variant.
329 @param Value a standard variant value to be decoded.
330 @returns an decoded custom variant.
332 function DecodeVariant(const Value: Variant): TZVariant;
335 Decodes an array of standard variant values into array of custom variants.
336 @param Value an array of standard variant values to be decoded.
337 @returns an decoded array of custom variants.
339 function DecodeVariantArray(const Value: Variant): TZVariantDynArray;
342 Encodes null into a custom variant.
343 @returns an decoded custom variant.
345 function EncodeNull : TZVariant;
347 Encodes a boolean into a custom variant.
348 @param Value a boolean value to be encoded.
349 @returns an encoded custom variant.
351 function EncodeBoolean(const Value: Boolean): TZVariant;
353 Encodes a Byte array into a custom variant.
354 @param Value a boolean value to be encoded.
355 @returns an encoded custom variant.
357 function EncodeBytes(const Value: TByteDynArray): TZVariant;
359 Encodes an integer into a custom variant.
360 @param Value an intger value to be encoded.
361 @returns an encoded custom variant.
363 function EncodeInteger(const Value: Int64): TZVariant;
365 Encodes a float into a custom variant.
366 @param Value a float value to be encoded.
367 @returns an encoded custom variant.
369 function EncodeFloat(const Value: Extended): TZVariant;
371 Encodes a String into a custom variant.
372 @param Value a String value to be encoded.
373 @returns an encoded custom variant.
375 function EncodeString(const Value: String): TZVariant;
377 Encodes a AnsiString into a custom variant.
378 @param Value a AnsiString value to be encoded.
379 @returns an encoded custom variant.
381 function EncodeAnsiString(const Value: AnsiString): TZVariant;
383 Encodes a UTF8String into a custom variant.
384 @param Value a UTF8String value to be encoded.
385 @returns an encoded custom variant.
387 function EncodeUTF8String(const Value: UTF8String): TZVariant;
389 Encodes a RawByteString into a custom variant.
390 @param Value a RawByteString value to be encoded.
391 @param CP the CoodePage of the Value string.
392 @returns an encoded custom variant.
394 function EncodeRawByteString(const Value: RawByteString): TZVariant;
396 Encodes a unicodestring into a custom variant.
397 @param Value a unicodestring value to be encoded.
398 @returns an encoded custom variant.
400 function EncodeUnicodeString(const Value: ZWideString): TZVariant;
402 Encodes a TDateTime into a custom variant.
403 @param Value a TDateTime value to be encoded.
404 @returns an encoded custom variant.
406 function EncodeDateTime(const Value: TDateTime): TZVariant;
408 Encodes a pointer into a custom variant.
409 @param Value a pointer value to be encoded.
410 @returns an encoded custom variant.
412 function EncodePointer(const Value: Pointer): TZVariant;
414 Encodes an interface into a custom variant.
415 @param Value an interface value to be encoded.
416 @returns an encoded custom variant.
418 function EncodeInterface(const Value: IZInterface): TZVariant;
421 {** Declares a default variant manager with strict convertion rules. }
422 DefVarManager: IZVariantManager;
424 {** Declares a variant manager with soft convertion rules. }
425 SoftVarManager: IZVariantManager;
427 {** A NULL Variant Value. }
428 NullVariant: TZVariant;
433 Variants, Math, ZMessages, ZEncoding
434 {$IFDEF WITH_ANSISTRCOMP_DEPRECATED}, AnsiStrings{$ENDIF};
436 { TZDefaultVariantManager }
439 Constructs this object and assignes the main properties.
441 constructor TZDefaultVariantManager.Create;
444 FSystemCodePage := ZDefaultSystemCodePage;
445 if ZCompatibleCodePages(zCP_UTF8, FSystemCodePage) then
447 ZAnsiToUTF8 := @ZMoveAnsiToUTF8;
448 ZUTF8ToAnsi := @ZMoveUTF8ToAnsi;
449 ZUTF8ToString := @ZMoveUTF8ToString;
450 ZStringToUTF8 := @ZMoveStringToUTF8;
454 ZAnsiToUTF8 := @ZConvertAnsiToUTF8;
455 ZUTF8ToAnsi := @ZConvertUTF8ToAnsi;
456 ZUTF8ToString := @ZConvertUTF8ToString;
457 ZStringToUTF8 := @ZConvertStringToUTF8;
462 Assignes one variant value to another one.
463 @param SrcValue a source variant value.
464 @param DstValue a destination variant value.
466 procedure TZDefaultVariantManager.Assign(const SrcValue: TZVariant;
467 var DstValue: TZVariant);
469 DstValue.VType := SrcValue.VType;
470 case SrcValue.VType of
471 vtBoolean: DstValue.VBoolean := SrcValue.VBoolean;
472 vtBytes: DstValue.VBytes := SrcValue.VBytes;
473 vtInteger: DstValue.VInteger := SrcValue.VInteger;
474 vtFloat: DstValue.VFloat := SrcValue.VFloat;
475 vtString: DstValue.VString := SrcValue.VString;
476 vtAnsiString: DstValue.VAnsiString := SrcValue.VAnsiString;
477 vtRawByteString: DstValue.VRawByteString := SrcValue.VRawByteString;
478 vtUTF8String: DstValue.VUTF8String := SrcValue.VUTF8String;
479 vtUnicodeString: DstValue.VUnicodeString := SrcValue.VUnicodeString;
480 vtDateTime: DstValue.VDateTime := SrcValue.VDateTime;
481 vtPointer: DstValue.VPointer := SrcValue.VPointer;
482 vtInterface: DstValue.VInterface := SrcValue.VInterface;
487 Clones a variant value.
488 @param Value a source variant value.
489 @returns a clonned variant value.
491 function TZDefaultVariantManager.Clone(const Value: TZVariant): TZVariant;
493 Assign(Value, Result);
497 Raises a type mismatch exception.
499 procedure TZDefaultVariantManager.RaiseTypeMismatchError;
501 raise EZVariantException.Create(STypesMismatch);
505 Raises an unsupported operation exception.
507 procedure TZDefaultVariantManager.RaiseUnsupportedOperation;
509 raise EZVariantException.Create(SUnsupportedOperation);
513 Converts a specified variant value to a new type.
514 @param Value a variant value to be converted.
515 @param NewType a type of the result variant value.
516 @returns a converted variant value.
518 function TZDefaultVariantManager.Convert(const Value: TZVariant;
519 NewType: TZVariantType): TZVariant;
521 Result.VType := NewType;
526 Result.VBoolean := False;
528 Result.VBoolean := Value.VBoolean;
530 RaiseTypeMismatchError;
535 Result.VBytes := nil;
537 Result.VBytes := Value.VBytes;
539 Result.VBytes := StrToBytes(Value.VString);
541 Result.VBytes := StrToBytes(Value.VAnsiString);
543 Result.VBytes := StrToBytes(Value.VRawByteString);
545 Result.VBytes := StrToBytes(Value.VUTF8String);
547 Result.VBytes := StrToBytes(Value.VUnicodeString);
549 RaiseTypeMismatchError;
554 Result.VInteger := 0;
556 if Value.VBoolean then
559 Result.VInteger := 0;
561 Result.VInteger := Value.VInteger;
563 RaiseTypeMismatchError;
570 if Value.VBoolean then
575 Result.VFloat := Value.VInteger;
577 Result.VFloat := Value.VFloat;
579 RaiseTypeMismatchError;
584 Result.VString := '';
586 Result.VString := {$IFDEF UNICODE}String{$ENDIF}(BytesToStr(Value.VBytes));
588 Result.VString := Value.VString;
590 Result.VString := {$IFDEF UNICODE}String{$ENDIF}(Value.VAnsiString);
592 Result.VString := ZUTF8ToString(Value.VUTF8String, FSystemCodePage);
594 Result.VString := {$IFNDEF UNICODE}String{$ENDIF}(Value.VUnicodeString);
596 RaiseTypeMismatchError;
601 Result.VAnsiString := '';
603 Result.VAnsiString := BytesToStr(Value.VBytes);
605 Result.VAnsiString := {$IFDEF UNICODE}AnsiString{$ENDIF}(Value.VString);
607 Result.VAnsiString := Value.VAnsiString;
609 Result.VAnsiString := ZUTF8ToAnsi(Value.VUTF8String);
611 Result.VAnsiString := AnsiString(Value.VUnicodeString);
613 RaiseTypeMismatchError;
618 Result.VUTF8String := '';
620 ZSetString(PAnsiChar(Value.VBytes), Length(Value.VBytes), Result.VUTF8String);
622 Result.VUTF8String := ZStringToUTF8(Value.VString, FSystemCodePage);
624 Result.VUTF8String := ZAnsiToUTF8(Value.VAnsiString);
626 Result.VUTF8String := Value.VUTF8String;
628 {$IFDEF WITH_RAWBYTESTRING}
629 Result.VUTF8String := UTF8String(Value.VUnicodeString);
631 Result.VUTF8String := UTF8Encode(Value.VUnicodeString);
634 RaiseTypeMismatchError;
639 Result.VRawByteString := '';
641 ZSetString(PAnsiChar(Value.VBytes), Length(Value.VBytes), Result.VRawByteString);
643 Result.VRawByteString := Value.VRawByteString;
645 RaiseTypeMismatchError;
650 Result.VUnicodeString := '';
652 Result.VUnicodeString := {$IFNDEF UNICODE}ZWideString{$ENDIF}(Value.VString); //Cast ansi to Wide/Unicode
654 Result.VUnicodeString := ZWideString(Value.VAnsiString); //Cast ansi to Wide/Unicode
656 Result.VUnicodeString :=
657 {$IFDEF WITH_RAWBYTESTRING}
658 ZWideString(Value.VUTF8String);
660 UTF8ToString(PAnsiChar(Value.VUTF8String));
663 Result.VUnicodeString := Value.VUnicodeString;
665 RaiseTypeMismatchError;
670 Result.VDateTime := 0;
672 Result.VDateTime := Value.VDateTime;
674 RaiseTypeMismatchError;
679 Result.VPointer := nil;
681 Result.VPointer := Value.VPointer;
683 RaiseTypeMismatchError;
688 Result.VInterface := nil;
690 Result.VInterface := Value.VInterface;
692 RaiseTypeMismatchError;
698 Compares two variant values.
699 @param Value1 the first variant value.
700 @param Value2 the second variant value.
701 @return <0 if Value1 < Value 2, =0 if Value1 = Value2, >0 if Value1 > Value2
703 function TZDefaultVariantManager.Compare(const Value1,
704 Value2: TZVariant): Integer;
707 TempDateTime: TDateTime;
712 if IsNull(Value2) then
719 if GetAsBoolean(Value2) then
721 if Value1.VBoolean then
728 if Value1.VBoolean then
735 Result := Value1.VInteger - GetAsInteger(Value2);
738 TempFloat := GetAsFloat(Value2);
739 if Value1.VFloat - TempFloat < -FLOAT_COMPARE_PRECISION then
741 else if Value1.VFloat - TempFloat > FLOAT_COMPARE_PRECISION then
746 { TODO -oEgonHugeist -cOptimierung :
747 String typed needs to be reviewed for a more optimal way.
748 Simple ByteCompare instead of functions which are codepage dependent should be faster, thought. }
750 Result := AnsiStrComp(PChar(Value1.VString), PChar(GetAsString(Value2)));
752 Result := {$IFDEF WITH_ANSISTRCOMP_DEPRECATED}AnsiStrings.{$ENDIF}AnsiStrComp(PAnsiChar(Value1.VAnsiString), PAnsiChar(GetAsAnsiString(Value2)));
754 Result := {$IFDEF WITH_ANSISTRCOMP_DEPRECATED}AnsiStrings.{$ENDIF}AnsiStrComp(PAnsiChar(GetAsAnsiString(Value1)), PAnsiChar(GetAsAnsiString(Value2)));
756 Result := {$IFDEF WITH_ANSISTRCOMP_DEPRECATED}AnsiStrings.{$ENDIF}AnsiStrComp(PAnsiChar(GetAsAnsiString(Value1)), PAnsiChar(GetAsAnsiString(Value2)));
760 Result := AnsiCompareStr(Value1.VUnicodeString, GetAsUnicodeString(Value2));
762 Result := WideCompareStr(Value1.VUnicodeString, GetAsUnicodeString(Value2));
765 Result := AnsiCompareStr(AnsiString(Value1.VUnicodeString), GetAsString(Value2));
769 TempDateTime := GetAsDateTime(Value2);
770 if Value1.VDateTime < TempDateTime then
772 else if Value1.VDateTime > TempDateTime then
778 Result := sign(NativeInt(Value1.VPointer) - GetAsInteger(Value2));
785 Checks is the specified value NULL.
786 @param Value a value to be checked.
787 @returns <code>True</code> if variant has NULL value.
789 function TZDefaultVariantManager.IsNull(const Value: TZVariant): Boolean;
791 Result := Value.VType = vtNull;
795 Sets the NULL value to specified variant.
796 @param Value variant value to be set to NULL.
798 procedure TZDefaultVariantManager.SetNull(var Value: TZVariant);
804 Gets a variant to boolean value.
805 @param Value a variant to be converted.
806 @param a result value.
808 function TZDefaultVariantManager.GetAsBoolean(
809 const Value: TZVariant): Boolean;
811 Result := Convert(Value, vtBoolean).VBoolean;
815 Gets a variant to boolean value.
816 @param Value a variant to be converted.
817 @param a result value.
819 function TZDefaultVariantManager.GetAsBytes(
820 const Value: TZVariant): TByteDynArray;
822 Result := Convert(Value, vtBytes).VBytes;
825 Gets a variant to integer value.
826 @param Value a variant to be converted.
827 @param a result value.
829 function TZDefaultVariantManager.GetAsInteger(
830 const Value: TZVariant): Int64;
832 Result := Convert(Value, vtInteger).VInteger;
836 Gets a variant to float value.
837 @param Value a variant to be converted.
838 @param a result value.
840 function TZDefaultVariantManager.GetAsFloat(
841 const Value: TZVariant): Extended;
843 Result := Convert(Value, vtFloat).VFloat;
847 Gets a variant to string value.
848 @param Value a variant to be converted.
849 @param a result value.
851 function TZDefaultVariantManager.GetAsString(
852 const Value: TZVariant): String;
854 Result := Convert(Value, vtString).VString;
858 Gets a variant to string value.
859 @param Value a variant to be converted.
860 @param a result value.
862 function TZDefaultVariantManager.GetAsAnsiString(
863 const Value: TZVariant): AnsiString;
865 Result := Convert(Value, vtAnsiString).VAnsiString;
868 function TZDefaultVariantManager.GetAsUTF8String(const Value: TZVariant): UTF8String;
870 Result := Convert(Value, vtUTF8String).VUTF8String;
873 function TZDefaultVariantManager.GetAsRawByteString(const Value: TZVariant): RawByteString;
875 Result := Convert(Value, vtRawByteString).VRawByteString;
879 Gets a variant to unicode string value.
880 @param Value a variant to be converted.
881 @param a result value.
883 function TZDefaultVariantManager.GetAsUnicodeString(
884 const Value: TZVariant): ZWideString;
886 Result := Convert(Value, vtUnicodeString).VUnicodeString;
890 Gets a variant to date and time value.
891 @param Value a variant to be converted.
892 @param a result value.
894 function TZDefaultVariantManager.GetAsDateTime(
895 const Value: TZVariant): TDateTime;
897 Result := Convert(Value, vtDateTime).VDateTime;
901 Gets a variant to pointer value.
902 @param Value a variant to be converted.
903 @param a result value.
905 function TZDefaultVariantManager.GetAsPointer(
906 const Value: TZVariant): Pointer;
908 Result := Convert(Value, vtPointer).VPointer;
912 Gets a variant to interface value.
913 @param Value a variant to be converted.
914 @param a result value.
916 function TZDefaultVariantManager.GetAsInterface(
917 const Value: TZVariant): IZInterface;
919 Result := Convert(Value, vtInterface).VInterface;
923 Assignes a boolean value to variant.
924 @param Value a variant to store the value.
925 @param Data a value to be assigned.
927 procedure TZDefaultVariantManager.SetAsBoolean(var Value: TZVariant;
930 Value := EncodeBoolean(Data);
934 Assignes a Byte array value to variant.
935 @param Value a variant to store the value.
936 @param Data a value to be assigned.
938 procedure TZDefaultVariantManager.SetAsBytes(var Value: TZVariant;
939 const Data: TByteDynArray);
941 Value := EncodeBytes(Data);
945 Assignes an integer value to variant.
946 @param Value a variant to store the value.
947 @param Data a value to be assigned.
949 procedure TZDefaultVariantManager.SetAsInteger(var Value: TZVariant;
952 Value := EncodeInteger(Data);
956 Assignes a float value to variant.
957 @param Value a variant to store the value.
958 @param Data a value to be assigned.
960 procedure TZDefaultVariantManager.SetAsFloat(var Value: TZVariant;
963 Value := EncodeFloat(Data);
967 Assignes a String value to variant.
968 @param Value a variant to store the value.
969 @param Data a value to be assigned.
971 procedure TZDefaultVariantManager.SetAsString(var Value: TZVariant;
974 Value := EncodeString(Data);
978 Assignes a AnsiString value to variant.
979 @param Value a variant to store the value.
980 @param Data a value to be assigned.
982 procedure TZDefaultVariantManager.SetAsAnsiString(var Value: TZVariant;
983 const Data: AnsiString);
985 Value := EncodeAnsiString(Data);
989 Assignes a UTF8string value to variant.
990 @param Value a variant to store the value.
991 @param Data a value to be assigned.
993 procedure TZDefaultVariantManager.SetAsUTF8String(var Value: TZVariant;
994 const Data: UTF8String);
996 Value := EncodeUTF8String(Data);
1000 Assignes a RawByteString value to variant.
1001 @param Value a variant to store the value.
1002 @param Data a value to be assigned.
1003 @param CP the CodePage of the Data string
1005 procedure TZDefaultVariantManager.SetAsRawByteString(var Value: TZVariant;
1006 const Data: RawByteString);
1008 Value := EncodeRawByteString(Data);
1012 Assignes a unicode string value to variant.
1013 @param Value a variant to store the value.
1014 @param Data a value to be assigned.
1016 procedure TZDefaultVariantManager.SetAsUnicodeString(var Value: TZVariant;
1017 const Data: ZWideString);
1019 Value := EncodeUnicodeString(Data);
1023 Assignes a datetime value to variant.
1024 @param Value a variant to store the value.
1025 @param Data a value to be assigned.
1027 procedure TZDefaultVariantManager.SetAsDateTime(var Value: TZVariant;
1030 Value := EncodeDateTime(Data);
1034 Assignes a pointer value to variant.
1035 @param Value a variant to store the value.
1036 @param Data a value to be assigned.
1038 procedure TZDefaultVariantManager.SetAsPointer(var Value: TZVariant;
1041 Value := EncodePointer(Data);
1045 Assignes a interface value to variant.
1046 @param Value a variant to store the value.
1047 @param Data a value to be assigned.
1049 procedure TZDefaultVariantManager.SetAsInterface(var Value: TZVariant;
1052 Value := EncodeInterface(Data);
1056 Performs '+' operation.
1057 @param Value1 the first variant argument.
1058 @param Value2 the second variant argument.
1059 @returns an operation result.
1061 function TZDefaultVariantManager.OpAdd(const Value1,
1062 Value2: TZVariant): TZVariant;
1064 case Value1.VType of
1065 vtNull: Result := EncodeNull;
1066 vtInteger: Result := EncodeInteger(Value1.VInteger + GetAsInteger(Value2));
1067 vtFloat: Result := EncodeFloat(Value1.VFloat + GetAsFloat(Value2));
1068 vtString: Result := EncodeString(Value1.VString + GetAsString(Value2));
1069 vtAnsiString: Result := EncodeAnsiString(Value1.VAnsiString + GetAsAnsiString(Value2));
1070 vtUTF8String: Result := EncodeUTF8String(Value1.VUTF8String + GetAsUTF8String(Value2));
1071 vtRawByteString: Result := EncodeRawByteString(Value1.VRawByteString + GetAsRawByteString(Value2));
1072 vtUnicodeString: Result := EncodeUnicodeString(Value1.VUnicodeString + GetAsUnicodeString(Value2));
1073 vtDateTime: Result := EncodeDateTime(Value1.VDateTime + GetAsDateTime(Value2));
1074 else RaiseUnsupportedOperation;
1079 Performs '&' operation.
1080 @param Value1 the first variant argument.
1081 @param Value2 the second variant argument.
1082 @returns an operation result.
1084 function TZDefaultVariantManager.OpAnd(const Value1,
1085 Value2: TZVariant): TZVariant;
1087 case Value1.VType of
1088 vtNull: Result := EncodeNull;
1089 vtBoolean: Result := EncodeBoolean(Value1.VBoolean and GetAsBoolean(Value2));
1090 vtInteger: Result := EncodeInteger(Value1.VInteger and GetAsInteger(Value2));
1091 else RaiseUnsupportedOperation;
1096 Performs '/' operation.
1097 @param Value1 the first variant argument.
1098 @param Value2 the second variant argument.
1099 @returns an operation result.
1101 function TZDefaultVariantManager.OpDiv(const Value1,
1102 Value2: TZVariant): TZVariant;
1104 case Value1.VType of
1105 vtNull: Result := EncodeNull;
1106 vtInteger: Result := EncodeInteger(Value1.VInteger div GetAsInteger(Value2));
1107 vtFloat: Result := EncodeFloat(Value1.VFloat / GetAsFloat(Value2));
1108 else RaiseUnsupportedOperation;
1113 Performs '=' operation.
1114 @param Value1 the first variant argument.
1115 @param Value2 the second variant argument.
1116 @returns an operation result.
1118 function TZDefaultVariantManager.OpEqual(const Value1,
1119 Value2: TZVariant): TZVariant;
1121 Result := EncodeBoolean(Compare(Value1, Value2) = 0);
1125 Performs '<' operation.
1126 @param Value1 the first variant argument.
1127 @param Value2 the second variant argument.
1128 @returns an operation result.
1130 function TZDefaultVariantManager.OpLess(const Value1,
1131 Value2: TZVariant): TZVariant;
1133 Result := EncodeBoolean(Compare(Value1, Value2) < 0);
1137 Performs '<=' operation.
1138 @param Value1 the first variant argument.
1139 @param Value2 the second variant argument.
1140 @returns an operation result.
1142 function TZDefaultVariantManager.OpLessEqual(const Value1,
1143 Value2: TZVariant): TZVariant;
1145 Result := EncodeBoolean(Compare(Value1, Value2) <= 0);
1149 Performs '%' operation.
1150 @param Value1 the first variant argument.
1151 @param Value2 the second variant argument.
1152 @returns an operation result.
1154 function TZDefaultVariantManager.OpMod(const Value1,
1155 Value2: TZVariant): TZVariant;
1157 case Value1.VType of
1158 vtNull: Result := EncodeNull;
1159 vtInteger: Result := EncodeInteger(Value1.VInteger mod GetAsInteger(Value2));
1160 else RaiseUnsupportedOperation;
1165 Performs '>' operation.
1166 @param Value1 the first variant argument.
1167 @param Value2 the second variant argument.
1168 @returns an operation result.
1170 function TZDefaultVariantManager.OpMore(const Value1,
1171 Value2: TZVariant): TZVariant;
1173 Result := EncodeBoolean(Compare(Value1, Value2) > 0);
1177 Performs '>=' operation.
1178 @param Value1 the first variant argument.
1179 @param Value2 the second variant argument.
1180 @returns an operation result.
1182 function TZDefaultVariantManager.OpMoreEqual(const Value1,
1183 Value2: TZVariant): TZVariant;
1185 Result := EncodeBoolean(Compare(Value1, Value2) >= 0);
1189 Performs '*' operation.
1190 @param Value1 the first variant argument.
1191 @param Value2 the second variant argument.
1192 @returns an operation result.
1194 function TZDefaultVariantManager.OpMul(const Value1,
1195 Value2: TZVariant): TZVariant;
1197 case Value1.VType of
1198 vtNull: Result := EncodeNull;
1199 vtInteger: Result := EncodeInteger(Value1.VInteger * GetAsInteger(Value2));
1200 vtFloat: Result := EncodeFloat(Value1.VFloat * GetAsFloat(Value2));
1201 else RaiseUnsupportedOperation;
1206 Performs unary '-' operation.
1207 @param Value the variant argument.
1208 @returns an operation result.
1210 function TZDefaultVariantManager.OpNegative(const Value: TZVariant): TZVariant;
1213 vtNull: Result := EncodeNull;
1214 vtInteger: Result := EncodeInteger(-Value.VInteger);
1215 vtFloat: Result := EncodeFloat(-Value.VFloat);
1216 else RaiseUnsupportedOperation;
1221 Performs '~' operation.
1222 @param Value the variant argument.
1223 @returns an operation result.
1225 function TZDefaultVariantManager.OpNot(const Value: TZVariant): TZVariant;
1228 vtNull: Result := EncodeNull;
1229 vtBoolean: Result := EncodeBoolean(not Value.VBoolean);
1230 vtInteger: Result := EncodeInteger(not Value.VInteger);
1231 else RaiseUnsupportedOperation;
1236 Performs '<>' operation.
1237 @param Value1 the first variant argument.
1238 @param Value2 the second variant argument.
1239 @returns an operation result.
1241 function TZDefaultVariantManager.OpNotEqual(const Value1,
1242 Value2: TZVariant): TZVariant;
1244 Result := EncodeBoolean(Compare(Value1, Value2) <> 0);
1248 Performs '|' operation.
1249 @param Value1 the first variant argument.
1250 @param Value2 the second variant argument.
1251 @returns an operation result.
1253 function TZDefaultVariantManager.OpOr(const Value1,
1254 Value2: TZVariant): TZVariant;
1256 case Value1.VType of
1257 vtNull: SetNull(Result);
1258 vtBoolean: Result := EncodeBoolean(Value1.VBoolean or GetAsBoolean(Value2));
1259 vtInteger: Result := EncodeInteger(Value1.VInteger or GetAsInteger(Value2));
1260 else RaiseUnsupportedOperation;
1265 Performs '^' operation.
1266 @param Value1 the first variant argument.
1267 @param Value2 the second variant argument.
1268 @returns an operation result.
1270 function TZDefaultVariantManager.OpPow(const Value1,
1271 Value2: TZVariant): TZVariant;
1273 case Value1.VType of
1274 vtNull: Result := EncodeNull;
1275 vtInteger: Result := EncodeFloat(Power(Value1.VInteger, GetAsInteger(Value2)));
1276 vtFloat: Result := EncodeFloat(Power(Value1.VFloat, GetAsFloat(Value2)));
1277 else RaiseUnsupportedOperation;
1282 Performs '-' operation.
1283 @param Value1 the first variant argument.
1284 @param Value2 the second variant argument.
1285 @returns an operation result.
1287 function TZDefaultVariantManager.OpSub(const Value1,
1288 Value2: TZVariant): TZVariant;
1290 case Value1.VType of
1291 vtNull: Result := EncodeNull;
1292 vtInteger: Result := EncodeInteger(Value1.VInteger - GetAsInteger(Value2));
1293 vtFloat: Result := EncodeFloat(Value1.VFloat - GetAsFloat(Value2));
1294 else RaiseUnsupportedOperation;
1299 Performs '^' operation.
1300 @param Value1 the first variant argument.
1301 @param Value2 the second variant argument.
1302 @returns an operation result.
1304 function TZDefaultVariantManager.OpXor(const Value1,
1305 Value2: TZVariant): TZVariant;
1307 TempBool1, TempBool2: Boolean;
1308 TempInteger1, TempInteger2: Int64;
1310 case Value1.VType of
1311 vtNull: Result := EncodeNull;
1314 TempBool1 := Value1.VBoolean;
1315 TempBool2 := GetAsBoolean(Value2);
1316 Result := EncodeBoolean((TempBool1 and not TempBool2)
1317 or (not TempBool1 and TempBool2));
1321 TempInteger1 := Value1.VInteger;
1322 TempInteger2 := GetAsInteger(Value2);
1323 Result := EncodeInteger((TempInteger1 and not TempInteger2)
1324 or (not TempInteger1 and TempInteger2));
1326 else RaiseUnsupportedOperation;
1330 { TZSoftVariantManager }
1333 Converts a specified variant value to a new type.
1334 @param Value a variant value to be converted.
1335 @param NewType a type of the result variant value.
1336 @returns a converted variant value.
1338 function TZSoftVariantManager.Convert(const Value: TZVariant;
1339 NewType: TZVariantType): TZVariant;
1341 Result.VType := NewType;
1346 Result.VBoolean := False;
1348 Result.VBoolean := Value.VBoolean;
1350 Result.VBoolean := Value.VInteger <> 0;
1352 Result.VBoolean := Value.VFloat <> 0;
1354 Result.VBoolean := StrToBoolEx(Value.VString);
1356 Result.VBoolean := StrToBoolEx({$IFDEF UNICODE}String{$ENDIF}(Value.VAnsiString));
1358 Result.VBoolean := StrToBoolEx({$IFDEF UNICODE}String{$ENDIF}(Value.VUTF8String));
1360 Result.VBoolean := StrToBoolEx({$IFDEF UNICODE}String{$ENDIF}(Value.VRawByteString));
1362 Result.VBoolean := StrToBoolEx({$IFNDEF UNICODE}String{$ENDIF}(Value.VUnicodeString));
1364 Result.VBoolean := Value.VDateTime <> 0;
1366 RaiseTypeMismatchError;
1368 RaiseTypeMismatchError;
1373 Result.VBytes := nil;
1375 Result.VBytes := Value.VBytes;
1377 Result.VBytes := StrToBytes(Value.VString);
1379 Result.VBytes := StrToBytes(Value.VAnsiString);
1381 Result.VBytes := StrToBytes(Value.VRawByteString);
1383 Result.VBytes := StrToBytes(Value.VUTF8String);
1385 Result.VBytes := StrToBytes(Value.VUnicodeString);
1387 RaiseTypeMismatchError;
1392 Result.VInteger := 0;
1394 if Value.VBoolean then
1395 Result.VInteger := 1
1397 Result.VInteger := 0;
1399 Result.VInteger := Value.VInteger;
1401 Result.VInteger := Trunc(Value.VFloat);
1403 Result.VInteger := StrToInt64Def(Value.VString, 0);
1405 Result.VInteger := StrToInt64Def({$IFDEF UNICODE}String{$ENDIF}(Value.VAnsiString), 0);
1407 Result.VInteger := StrToInt64Def({$IFDEF UNICODE}String{$ENDIF}(Value.VUTF8String), 0);
1409 Result.VInteger := StrToInt64Def({$IFDEF UNICODE}String{$ENDIF}(Value.VRawByteString), 0);
1411 Result.VInteger := StrToInt64Def({$IFNDEF UNICODE}String{$ENDIF}(Value.VUnicodeString), 0);
1413 Result.VInteger := Trunc(Value.VDateTime);
1415 Result.VInteger := NativeInt(Value.VPointer);
1417 RaiseTypeMismatchError;
1424 if Value.VBoolean then
1429 Result.VFloat := Value.VInteger;
1431 Result.VFloat := Value.VFloat;
1433 Result.VFloat := SqlStrToFloatDef(Value.VString, 0);
1435 Result.VFloat := SqlStrToFloatDef({$IFDEF UNICODE}String{$ENDIF}(Value.VAnsiString), 0);
1437 Result.VFloat := SqlStrToFloatDef({$IFDEF UNICODE}String{$ENDIF}(Value.VUTF8String), 0);
1439 Result.VFloat := SqlStrToFloatDef(Value.VRawByteString, 0);
1441 Result.VFloat := SqlStrToFloatDef(AnsiString(Value.VUnicodeString), 0);
1443 Result.VFloat := Value.VDateTime;
1445 RaiseTypeMismatchError;
1450 Result.VString := '';
1452 if Value.VBoolean then
1453 Result.VString := 'TRUE'
1455 Result.VString := 'FALSE';
1457 ZSetString(PAnsiChar(Value.VBytes), Length(Value.VBytes), Result.VString);
1459 Result.VString := IntToStr(Value.VInteger);
1461 Result.VString := FloatToSqlStr(Value.VFloat);
1463 Result.VString := Value.VString;
1465 Result.VString := {$IFDEF UNICODE}String{$ENDIF}(Value.VAnsiString);
1467 Result.VString := ZUTF8ToString(Value.VUTF8String, FSystemCodePage);
1469 Result.VString := Value.VUnicodeString; //hint: VarArrayOf(['Test']) returns allways varOleStr which is type WideString don't change that again
1471 Result.VString := DateTimeToAnsiSQLDate(Value.VDateTime);
1472 // gto: Not a real threat, as it's converting dates (unicode safe)
1474 RaiseTypeMismatchError;
1479 Result.VAnsiString := '';
1481 if Value.VBoolean then
1482 Result.VAnsiString := 'TRUE'
1484 Result.VAnsiString := 'FALSE';
1486 Result.VAnsiString := {$IFDEF UNICODE}AnsiString{$ENDIF}(IntToStr(Value.VInteger));
1488 Result.VAnsiString := {$IFDEF UNICODE}AnsiString{$ENDIF}(FloatToSqlStr(Value.VFloat));
1490 Result.VAnsiString := {$IFDEF UNICODE}AnsiString{$ENDIF}(Value.VString);
1492 Result.VAnsiString := Value.VAnsiString;
1494 Result.VAnsiString := ZUTF8ToAnsi(Value.VUTF8String);
1496 Result.VAnsiString := AnsiString(Value.VUnicodeString);
1498 Result.VAnsiString := {$IFDEF UNICODE}AnsiString{$ENDIF}(DateTimeToAnsiSQLDate(Value.VDateTime));
1500 RaiseTypeMismatchError;
1505 Result.VUTF8String := '';
1507 if Value.VBoolean then
1508 Result.VUTF8String := 'TRUE'
1510 Result.VUTF8String := 'FALSE';
1512 Result.VUTF8String := UTF8String(IntToStr(Value.VInteger));
1514 Result.VUTF8String := UTF8String(FloatToSqlStr(Value.VFloat));
1516 Result.VUTF8String := ZStringToUTF8(Value.VString, FSystemCodePage);
1518 Result.VUTF8String := ZAnsiToUTF8(Value.VAnsiString);
1520 Result.VUTF8String := Value.VUTF8String;
1522 {$IFDEF WITH_RAWBYTESTRING}
1523 Result.VUTF8String := UTF8String(Value.VUnicodeString);
1525 Result.VUTF8String := UTF8Encode(Value.VUnicodeString);
1528 Result.VUTF8String := UTF8String(DateTimeToAnsiSQLDate(Value.VDateTime));
1530 RaiseTypeMismatchError;
1535 Result.VUnicodeString := '';
1537 if Value.VBoolean then
1538 Result.VUnicodeString := 'TRUE'
1540 Result.VUnicodeString := 'FALSE';
1542 Result.VUnicodeString := {$IFNDEF UNICODE}ZWideString{$ENDIF}(IntToStr(Value.VInteger));
1544 Result.VUnicodeString := {$IFNDEF UNICODE}ZWideString{$ENDIF}(FloatToSqlStr(Value.VFloat));
1546 Result.VUnicodeString := {$IFNDEF UNICODE}ZWideString{$ENDIF}(Value.VString);
1548 Result.VUnicodeString := ZWideString(Value.VAnsiString);
1550 Result.VUnicodeString := {$IFDEF UNICODE}UTF8ToString{$ELSE}UTF8Decode{$ENDIF}(PAnsiChar(Value.VUTF8String));
1552 Result.VUnicodeString := Value.VUnicodeString;
1554 Result.VUnicodeString := ZWideString(DateTimeToAnsiSQLDate(Value.VDateTime));
1556 RaiseTypeMismatchError;
1561 Result.VDateTime := 0;
1563 RaiseTypeMismatchError;
1565 Result.VDateTime := Value.VInteger;
1567 Result.VDateTime := Value.VFloat;
1569 Result.VDateTime := AnsiSQLDateToDateTime(Value.VString);
1571 Result.VDateTime := AnsiSQLDateToDateTime({$IFDEF UNICODE}String{$ENDIF}(Value.VAnsiString));
1573 Result.VDateTime := AnsiSQLDateToDateTime({$IFDEF UNICODE}String{$ENDIF}(Value.VUTF8String));
1575 Result.VDateTime := AnsiSQLDateToDateTime({$IFDEF UNICODE}String{$ENDIF}(Value.VRawByteString));
1577 Result.VDateTime := AnsiSQLDateToDateTime({$IFNDEF UNICODE}String{$ENDIF}(Value.VUnicodeString));
1579 Result.VDateTime := Value.VDateTime;
1581 RaiseTypeMismatchError;
1586 Result.VPointer := nil;
1588 RaiseTypeMismatchError;
1590 Result.VPointer := Pointer(Value.VInteger);
1592 RaiseTypeMismatchError;
1597 Result.VInterface := nil;
1599 Result.VInterface := Value.VInterface;
1605 { TZClientVariantManager }
1608 Constructs this object and assignes the main properties.
1609 @param ClientCodePage the current ClientCodePage.
1611 constructor TZClientVariantManager.Create(const ConSettings: PZConSettings);
1613 inherited Create; //Set all standart converters functions
1615 FConSettings := ConSettings;
1619 Converts a specified variant value to a new type.
1620 @param Value a variant value to be converted.
1621 @param NewType a type of the result variant value.
1622 @returns a converted variant value.
1624 function TZClientVariantManager.Convert(const Value: TZVariant;
1625 NewType: TZVariantType): TZVariant;
1627 Result.VType := NewType;
1632 Result.VBoolean := False;
1634 Result.VBoolean := Value.VBoolean;
1636 Result.VBoolean := Value.VInteger <> 0;
1638 Result.VBoolean := Value.VFloat <> 0;
1640 Result.VBoolean := StrToBoolEx(Value.VString);
1642 Result.VBoolean := StrToBoolEx({$IFDEF UNICODE}String{$ENDIF}(Value.VAnsiString));
1644 Result.VBoolean := StrToBoolEx({$IFDEF UNICODE}String{$ENDIF}(Value.VUTF8String));
1646 Result.VBoolean := StrToBoolEx({$IFDEF UNICODE}String{$ENDIF}(Value.VRawByteString));
1648 Result.VBoolean := StrToBoolEx({$IFNDEF UNICODE}String{$ENDIF}(Value.VUnicodeString));
1650 Result.VBoolean := Value.VDateTime <> 0;
1652 RaiseTypeMismatchError;
1657 Result.VBytes := nil;
1659 Result.VBytes := Value.VBytes;
1661 Result.VBytes := StrToBytes(Value.VString);
1663 Result.VBytes := StrToBytes(Value.VAnsiString);
1665 Result.VBytes := StrToBytes(Value.VRawByteString);
1667 Result.VBytes := StrToBytes(Value.VUTF8String);
1669 Result.VBytes := StrToBytes(Value.VUnicodeString);
1671 RaiseTypeMismatchError;
1676 Result.VInteger := 0;
1678 if Value.VBoolean then
1679 Result.VInteger := 1
1681 Result.VInteger := 0;
1683 Result.VInteger := Value.VInteger;
1685 Result.VInteger := Trunc(Value.VFloat);
1687 Result.VInteger := StrToInt64Def(Value.VString, 0);
1689 Result.VInteger := StrToInt64Def({$IFDEF UNICODE}String{$ENDIF}(Value.VAnsiString), 0);
1691 Result.VInteger := StrToInt64Def({$IFDEF UNICODE}String{$ENDIF}(Value.VUTF8String), 0);
1693 Result.VInteger := StrToInt64Def({$IFDEF UNICODE}String{$ENDIF}(Value.VRawByteString), 0);
1695 Result.VInteger := StrToInt64Def({$IFNDEF UNICODE}String{$ENDIF}(Value.VUnicodeString), 0);
1697 Result.VInteger := Trunc(Value.VDateTime);
1699 Result.VInteger := NativeInt(Value.VPointer);
1701 RaiseTypeMismatchError;
1708 if Value.VBoolean then
1713 Result.VFloat := Value.VInteger;
1715 Result.VFloat := Value.VFloat;
1717 Result.VFloat := SqlStrToFloatDef(Value.VString, 0);
1719 Result.VFloat := SqlStrToFloatDef({$IFDEF UNICODE}String{$ENDIF}(Value.VAnsiString), 0);
1721 Result.VFloat := SqlStrToFloatDef({$IFDEF UNICODE}String{$ENDIF}(Value.VUTF8String), 0);
1723 Result.VFloat := SqlStrToFloatDef(Value.VRawByteString, 0);
1725 Result.VFloat := SqlStrToFloatDef({$IFNDEF UNICODE}String{$ENDIF}(Value.VUnicodeString), 0);
1727 Result.VFloat := Value.VDateTime;
1729 RaiseTypeMismatchError;
1734 Result.VString := '';
1736 if Value.VBoolean then
1737 Result.VString := 'TRUE'
1739 Result.VString := 'FALSE';
1741 Result.VString := {$IFDEF UNICODE}String{$ENDIF}(BytesToStr(Value.VBytes));
1743 Result.VString := IntToStr(Value.VInteger);
1745 Result.VString := FloatToSqlStr(Value.VFloat);
1747 Result.VString := Value.VString;
1749 Result.VString := FConSettings^.ConvFuncs.ZAnsiToString(Value.VAnsiString, FConSettings^.CTRL_CP);
1751 Result.VString := FConSettings^.ConvFuncs.ZUTF8ToString(Value.VUTF8String, FConSettings^.CTRL_CP);
1753 Result.VString := FConSettings^.ConvFuncs.ZRawToString(Value.VRawByteString, FConSettings^.ClientCodePage^.CP, FConSettings^.CTRL_CP);
1755 //hint: VarArrayOf(['Test']) returns allways varOleStr which is type WideString don't change that again
1756 //this hint means a cast instead of convert. The user should better use WideString constants!
1757 Result.VString := FConSettings^.ConvFuncs.ZUnicodeToString(Value.VUnicodeString, FConSettings^.CTRL_CP);
1759 Result.VString := DateTimeToAnsiSQLDate(Value.VDateTime);
1761 RaiseTypeMismatchError;
1766 Result.VAnsiString := '';
1768 if Value.VBoolean then
1769 Result.VAnsiString := 'TRUE'
1771 Result.VAnsiString := 'FALSE';
1773 Result.VAnsiString := {$IFDEF UNICODE}AnsiString{$ENDIF}(IntToStr(Value.VInteger));
1775 Result.VAnsiString := {$IFDEF UNICODE}AnsiString{$ENDIF}(FloatToSqlStr(Value.VFloat));
1777 Result.VAnsiString := FConSettings^.ConvFuncs.ZStringToAnsi(Value.VString, FConSettings^.CTRL_CP);
1779 Result.VAnsiString := Value.VAnsiString;
1781 Result.VAnsiString := FConSettings^.ConvFuncs.ZUTF8ToAnsi(Value.VUTF8String);
1783 Result.VAnsiString := FConSettings^.ConvFuncs.ZRawToAnsi(Value.VRawByteString, FConSettings^.ClientCodePage^.CP);
1785 Result.VAnsiString := AnsiString(Value.VUnicodeString);
1787 Result.VAnsiString := {$IFDEF UNICODE}AnsiString{$ENDIF}(DateTimeToAnsiSQLDate(Value.VDateTime));
1789 RaiseTypeMismatchError;
1794 Result.VUTF8String := '';
1796 if Value.VBoolean then
1797 Result.VUTF8String := 'TRUE'
1799 Result.VUTF8String := 'FALSE';
1801 Result.VUTF8String := {$IFDEF WITH_RAWBYTESTRING}UTF8String{$ENDIF}(IntToStr(Value.VInteger));
1803 Result.VUTF8String := {$IFDEF WITH_RAWBYTESTRING}UTF8String{$ENDIF}(FloatToSqlStr(Value.VFloat));
1805 Result.VUTF8String := FConSettings^.ConvFuncs.ZStringToUTF8(Value.VString, FConSettings^.CTRL_CP);
1807 Result.VUTF8String := FConSettings^.ConvFuncs.ZAnsiToUTF8(Value.VAnsiString);
1809 Result.VUTF8String := Value.VUTF8String;
1811 Result.VUTF8String := FConSettings^.ConvFuncs.ZRawToUTF8(Value.VRawByteString, FConSettings^.ClientCodePage^.CP);
1813 {$IFDEF WITH_RAWBYTESTRING}
1814 Result.VUTF8String := UTF8String(Value.VUnicodeString);
1816 Result.VUTF8String := UTF8Encode(Value.VUnicodeString);
1819 Result.VUTF8String := {$IFDEF WITH_RAWBYTESTRING}UTF8String{$ENDIF}(DateTimeToAnsiSQLDate(Value.VDateTime));
1821 RaiseTypeMismatchError;
1826 Result.VRawByteString := '';
1828 if Value.VBoolean then
1829 Result.VRawByteString := 'TRUE'
1831 Result.VRawByteString := 'FALSE';
1833 Result.VRawByteString := {$IFDEF WITH_RAWBYTESTRING}RawByteString{$ENDIF}(IntToStr(Value.VInteger));
1835 Result.VRawByteString := {$IFDEF WITH_RAWBYTESTRING}RawByteString{$ENDIF}(FloatToSqlStr(Value.VFloat));
1837 Result.VRawByteString := FConSettings^.ConvFuncs.ZStringToRaw(Value.VString, FConSettings^.CTRL_CP, FConSettings^.ClientCodePage^.CP);
1839 Result.VRawByteString := FConSettings^.ConvFuncs.ZAnsiToRaw(Value.VAnsiString, FConSettings^.ClientCodePage^.CP);
1841 Result.VRawByteString := FConSettings^.ConvFuncs.ZUTF8ToRaw(Value.VUTF8String, FConSettings^.ClientCodePage^.CP);
1843 Result.VRawByteString := Value.VRawByteString;
1845 Result.VRawByteString := FConSettings^.ConvFuncs.ZUnicodeToRaw(Value.VUnicodeString, FConSettings^.ClientCodePage^.CP);
1847 Result.VRawByteString := {$IFDEF WITH_RAWBYTESTRING}RawByteString{$ENDIF}(DateTimeToAnsiSQLDate(Value.VDateTime));
1849 RaiseTypeMismatchError;
1854 Result.VUnicodeString := '';
1856 if Value.VBoolean then
1857 Result.VUnicodeString := 'TRUE'
1859 Result.VUnicodeString := 'FALSE';
1861 Result.VUnicodeString := ZWideString(IntToStr(Value.VInteger));
1863 Result.VUnicodeString := ZWideString(FloatToSqlStr(Value.VFloat));
1865 Result.VUnicodeString := FConSettings^.ConvFuncs.ZStringToUnicode(Value.VString, FConSettings^.CTRL_CP);
1867 Result.VUnicodeString := ZWideString(Value.VAnsiString);
1869 Result.VUnicodeString := {$IFDEF UNICODE}UTF8ToString{$ELSE}UTF8Decode{$ENDIF}(PAnsiChar(Value.VUTF8String));
1871 Result.VUnicodeString := FConSettings^.ConvFuncs.ZRawToUnicode(Value.VRawByteString, FConSettings^.ClientCodePage^.CP);
1873 Result.VUnicodeString := Value.VUnicodeString;
1875 Result.VUnicodeString := ZWideString(DateTimeToAnsiSQLDate(Value.VDateTime));
1877 RaiseTypeMismatchError;
1882 Result.VDateTime := 0;
1884 Result.VDateTime := Value.VInteger;
1886 Result.VDateTime := Value.VFloat;
1888 Result.VDateTime := AnsiSQLDateToDateTime(Value.VString);
1890 Result.VDateTime := AnsiSQLDateToDateTime({$IFDEF UNICODE}String{$ENDIF}(Value.VAnsiString));
1892 Result.VDateTime := AnsiSQLDateToDateTime({$IFDEF WITH_RAWBYTESTRING}String{$ENDIF}(Value.VUTF8String));
1894 Result.VDateTime := AnsiSQLDateToDateTime({$IFDEF WITH_RAWBYTESTRING}String{$ENDIF}(Value.VRawByteString));
1896 Result.VDateTime := AnsiSQLDateToDateTime({$IFNDEF UNICODE}String{$ENDIF}(Value.VUnicodeString));
1898 Result.VDateTime := Value.VDateTime;
1900 RaiseTypeMismatchError;
1905 Result.VPointer := nil;
1907 RaiseTypeMismatchError;
1909 Result.VPointer := Pointer(Value.VInteger);
1911 RaiseTypeMismatchError;
1916 Result.VInterface := nil;
1918 Result.VInterface := Value.VInterface;
1919 else RaiseTypeMismatchError;
1924 {$WARNINGS OFF} //suppress [Pascal Warning] ZVariant.pas(1926): W1035 Return value of function 'TZClientVariantManager.GetAsRawByteString' might be undefined
1925 function TZClientVariantManager.GetAsRawByteString(const Value: TZVariant;
1926 const RawCP: Word): RawByteString;
1927 var US: ZWideString;
1933 if Value.VBoolean then
1938 ZSetString(PAnsiChar(Value.VBytes), Length(Value.VBytes), Result);
1940 Result := {$IFDEF WITH_RAWBYTESTRING}RawByteString{$ENDIF}(IntToStr(Value.VInteger));
1942 Result := {$IFDEF WITH_RAWBYTESTRING}RawByteString{$ENDIF}(FloatToSqlStr(Value.VFloat));
1944 Result := ZConvertStringToRawWithAutoEncode(Value.VString, FConSettings^.CTRL_CP, RawCP);
1946 if ZCompatibleCodePages(ZDefaultSystemCodePage, RawCP) then
1947 Result := ZMoveAnsiToRaw(Value.VAnsiString, RawCP)
1949 Result := ZConvertAnsiToRaw(Value.VAnsiString, RawCP);
1951 if ZCompatibleCodePages(zCP_UTF8, RawCP) then
1952 Result := ZMoveUTF8ToRaw(Value.VUTF8String, RawCP)
1954 Result := ZConvertUTF8ToRaw(Value.VUTF8String, RawCP);
1956 if ZCompatibleCodePages(FConSettings^.ClientCodePage^.CP, RawCP) then
1957 Result := Value.VRawByteString
1960 US := ZRawToUnicode(Value.VRawByteString, FConSettings^.ClientCodePage^.CP);
1961 Result := ZUnicodeToRaw(US, RawCP);
1964 Result := ZUnicodeToRaw(Value.VUnicodeString, RawCP);
1966 Result := {$IFDEF WITH_RAWBYTESTRING}RawByteString{$ENDIF}(DateTimeToAnsiSQLDate(Value.VDateTime));
1968 RaiseTypeMismatchError;
1976 Constructs this object and assignes the main properties.
1977 @param Value an any value.
1979 constructor TZAnyValue.Create(const Value: TZVariant);
1985 Constructs this object and assignes the main properties.
1986 @param Value a boolean value.
1988 constructor TZAnyValue.CreateWithBoolean(Value: Boolean);
1990 FValue := EncodeBoolean(Value);
1994 Constructs this object and assignes the main properties.
1995 @param Value a datetime value.
1997 constructor TZAnyValue.CreateWithDateTime(Value: TDateTime);
1999 FValue := EncodeDateTime(Value);
2003 Constructs this object and assignes the main properties.
2004 @param Value a float value.
2006 constructor TZAnyValue.CreateWithFloat(Value: Extended);
2008 FValue := EncodeFloat(Value);
2012 Constructs this object and assignes the main properties.
2013 @param Value a integer value.
2015 constructor TZAnyValue.CreateWithInteger(Value: Int64);
2017 FValue := EncodeInteger(Value);
2021 Constructs this object and assignes the main properties.
2022 @param Value a string value.
2024 constructor TZAnyValue.CreateWithString(const Value: String);
2026 FValue := EncodeString(Value);
2030 Constructs this object and assignes the main properties.
2031 @param Value a unicode string value.
2034 constructor TZAnyValue.CreateWithUnicodeString(const Value: String; unicodeType : Boolean = true);
2036 constructor TZAnyValue.CreateWithUnicodeString(const Value: WideString);
2039 FValue := EncodeUnicodeString(Value);
2043 Clones an object instance.
2044 @return a clonned object instance.
2046 function TZAnyValue.Clone: IZInterface;
2048 Result := TZAnyValue.Create(FValue);
2052 Compares this and another property.
2053 @return <code>True</code> is properties are equal.
2055 function TZAnyValue.Equals(const Value: IZInterface): Boolean;
2059 if Value <> nil then
2061 if Value.QueryInterface(IZAnyValue, Temp) = 0 then
2063 Result := SoftVarManager.Compare(FValue, Temp.GetValue) = 0;
2067 Result := inherited Equals(Value);
2074 Gets a stored any value.
2075 @return a stored any value.
2077 function TZAnyValue.GetValue: TZVariant;
2083 Converts this object into the string representation.
2084 @return a string representation for this object.
2086 function TZAnyValue.ToString: string;
2088 Result := GetString;
2092 Checks is the stored value contains NULL.
2093 @returns <code>True</code> if NULL is stored.
2095 function TZAnyValue.IsNull: Boolean;
2097 Result := SoftVarManager.IsNull(FValue);
2101 Gets a stored value converted to double.
2102 @return a stored value converted to double.
2104 function TZAnyValue.GetFloat: Extended;
2106 Result := SoftVarManager.GetAsFloat(FValue);
2110 Gets a stored value converted to integer.
2111 @return a stored value converted to integer.
2113 function TZAnyValue.GetInteger: Int64;
2115 Result := SoftVarManager.GetAsInteger(FValue);
2119 Gets a stored value converted to String.
2120 @return a stored value converted to string.
2122 function TZAnyValue.GetString: String;
2124 Result := SoftVarManager.GetAsString(FValue);
2128 Gets a stored value converted to AnsiString.
2129 @return a stored value converted to string.
2131 function TZAnyValue.GetAnsiString: AnsiString;
2133 Result := SoftVarManager.GetAsAnsiString(FValue);
2137 Gets a stored value converted to AnsiString.
2138 @return a stored value converted to string.
2140 function TZAnyValue.GetUTF8String: UTF8String;
2142 Result := SoftVarManager.GetAsUTF8String(FValue);
2146 Gets a stored value converted to boolean.
2147 @return a stored value converted to boolean.
2149 function TZAnyValue.GetBoolean: Boolean;
2151 Result := SoftVarManager.GetAsBoolean(FValue);
2155 Gets a stored value converted to byte array.
2156 @return a stored value converted to a byte array.
2158 function TZAnyValue.GetBytes: TByteDynArray;
2160 Result := SoftVarManager.GetAsBytes(FValue);
2164 Gets a stored value converted to unicode string.
2165 @return a stored value converted to unicode string.
2167 function TZAnyValue.GetUnicodeString: ZWideString;
2169 Result := SoftVarManager.GetAsUnicodeString(FValue);
2173 Gets a stored value converted to datetime.
2174 @return a stored value converted to datetime.
2176 function TZAnyValue.GetDateTime: TDateTime;
2178 Result := SoftVarManager.GetAsDateTime(FValue);
2182 Encodes a custom variant value into standard variant.
2183 @param Value a custom variant value to be encoded.
2184 @returns an encoded standard variant.
2186 function EncodeVariant(const Value: TZVariant): Variant;
2189 vtBoolean: Result := Value.VBoolean;
2190 vtBytes: Result := BytesToVar(Value.VBytes);
2192 if (Value.VInteger > -MaxInt) and (Value.VInteger < MaxInt) then
2193 Result := Integer(Value.VInteger)
2196 Result := Value.VInteger;
2198 Result := IntToStr(Value.VInteger);
2200 vtFloat: Result := Value.VFloat;
2201 vtString: Result := Value.VString;
2202 vtAnsiString: Result := Value.VAnsiString;
2203 vtUTF8String: Result := Value.VUTF8String;
2204 vtRawByteString: Result := Value.VRawByteString;
2205 vtUnicodeString: Result := Value.VUnicodeString;
2206 vtDateTime: Result := Value.VDateTime;
2209 Result := NativeInt(Value.VPointer);
2211 Result := NativeUInt(Value.VPointer);
2213 vtInterface: Result := Value.VInterface;
2220 Encodes an array of custom variant values into array of standard variants.
2221 @param Value an array of custom variant values to be encoded.
2222 @returns an encoded array of standard variants.
2224 function EncodeVariantArray(const Value: TZVariantDynArray): Variant;
2229 Result := VarArrayCreate([0, L - 1], varVariant);
2230 for I := 0 to L - 1 do
2231 Result[I] := EncodeVariant(Value[I]);
2235 Decodes a standard variant value into custom variant.
2236 @param Value a standard variant value to be decoded.
2237 @returns an decoded custom variant.
2239 function DecodeVariant(const Value: Variant): TZVariant;
2241 case VarType(Value) of
2242 varSmallint, varInteger, varByte:
2243 Result := EncodeInteger(Integer(Value));
2244 varBoolean: Result := EncodeBoolean(Value);
2245 varString: Result := EncodeString(Value);
2247 varUString: Result := EncodeUnicodeString(Value);
2249 varSingle, varDouble, varCurrency:
2250 Result := EncodeFloat(Value);
2251 varUnknown: Result := EncodeInterface(Value);
2253 Result := EncodeUnicodeString(Value);
2254 varDate: Result := EncodeDateTime(Value);
2255 varShortInt, varWord, varLongWord:
2256 Result := EncodeInteger(Value);
2257 varInt64{$IFDEF BDS5_UP},varUInt64{$ENDIF}:
2258 Result := EncodeInteger(Value);
2260 Result := EncodeNull;
2265 Decodes an array of standard variant values into array of custom variants.
2266 @param Value an array of standard variant values to be decoded.
2267 @returns an decoded array of custom variants.
2269 function DecodeVariantArray(const Value: Variant): TZVariantDynArray;
2273 if VarIsArray(Value) then
2275 L := VarArrayLowBound(Value, 1);
2276 H := VarArrayHighBound(Value, 1);
2277 SetLength(Result, H - L + 1);
2279 Result[I - L] := DecodeVariant(Value[I]);
2283 SetLength(Result, 1);
2284 Result[0] := DecodeVariant(Value);
2289 Creates a null variant.
2291 function EncodeNull: TZVariant;
2293 Result.VType := vtNull;
2297 Creates a boolean variant.
2298 @param Value a value to be assigned.
2300 function EncodeBoolean(const Value: Boolean): TZVariant;
2302 Result.VType := vtBoolean;
2303 Result.VBoolean := Value;
2307 Creates a bytes array variant.
2308 @param Value a value to be assigned.
2310 function EncodeBytes(const Value: TByteDynArray): TZVariant;
2312 Result.VType := vtBytes;
2313 Result.VBytes := Value;
2317 Creates a integer variant.
2318 @param Value a value to be assigned.
2320 function EncodeInteger(const Value: Int64): TZVariant;
2322 Result.VType := vtInteger;
2323 Result.VInteger := Value;
2327 Creates a float variant.
2328 @param Value a value to be assigned.
2330 function EncodeFloat(const Value: Extended): TZVariant;
2332 Result.VType := vtFloat;
2333 Result.VFloat := Value;
2337 Creates a AnsiString variant.
2338 @param Value a value to be assigned.
2340 function EncodeString(const Value: String): TZVariant;
2342 Result.VType := vtString;
2343 Result.VString := Value;
2347 Creates a AnsiString variant.
2348 @param Value a value to be assigned.
2350 function EncodeAnsiString(const Value: AnsiString): TZVariant;
2352 Result.VType := vtAnsiString;
2353 Result.VAnsiString := Value;
2357 Creates a UTF8String variant.
2358 @param Value a value to be assigned.
2360 function EncodeUTF8String(const Value: UTF8String): TZVariant;
2362 Result.VType := vtUTF8String;
2363 Result.VUTF8String := Value;
2367 Creates a UTF8String variant.
2368 @param Value a value to be assigned.
2370 function EncodeRawByteString(const Value: RawByteString): TZVariant;
2372 Result.VType := vtRawByteString;
2373 Result.VRawByteString := Value;
2377 Creates a UnicodeString variant.
2378 @param Value a value to be assigned.
2380 function EncodeUnicodeString(const Value: ZWideString): TZVariant;
2382 Result.VType := vtUnicodeString;
2383 Result.VUnicodeString := Value;
2387 Creates a TDateTime variant.
2388 @param Value a value to be assigned.
2390 function EncodeDateTime(const Value: TDateTime): TZVariant;
2392 Result.VType := vtDateTime;
2393 Result.VDateTime := Value;
2397 Creates a pointer variant.
2398 @param Value a value to be assigned.
2400 function EncodePointer(const Value: Pointer): TZVariant;
2402 Result.VType := vtPointer;
2403 Result.VPointer := Value;
2407 Creates an Interface variant.
2408 @param Value a value to be assigned.
2410 function EncodeInterface(const Value: IZInterface): TZVariant;
2412 Result.VType := vtInterface;
2413 Result.VInterface := Value;
2417 DefVarManager := TZDefaultVariantManager.Create;
2418 SoftVarManager := TZSoftVariantManager.Create;
2419 NullVariant := EncodeNull;
2421 DefVarManager := nil;
2422 SoftVarManager := nil;