forked from stijnsanders/TMongoWire
-
Notifications
You must be signed in to change notification settings - Fork 0
/
mongoWireUtils.pas
151 lines (127 loc) · 3.67 KB
/
mongoWireUtils.pas
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
unit mongoWireUtils;
{
Misc utils for TMongoWire
Originally developped by Alexey Petushkov (mentatxx@gmail.com)
under MIT License
}
interface
uses Windows, Classes, SysUtils, Variants, Types, bsonDoc;
{**
* Dump BSON Variant to string
*}
function bsonDump( const V: Variant ) : string;
{**
* Convert local time to UTC
* @param DateTime
* @return
*}
function convertTimeLocalToUTC(DateTime: TDateTime): TDateTime;
{**
* Convert UTC time to local
* @param DateTime
* @return
*}
function convertTimeUTCToLocal(DateTime: TDateTime): TDateTime;
implementation
resourcestring
RsMakeUTCTime = 'Error converting from/to UTC time. Time zone could not be determined';
const
MinutesPerDay = 60 * 24;
type
TIndexArray = TIntegerDynArray;
function ConcatArrays( A1, A2: TIndexArray): TIndexArray;
var
i: Integer;
begin
SetLength( Result, High(A1) + High(A2) + 2 );
for i := 0 to High(A1) do
Result[i]:= A1[i];
for i := 0 to High(A2) do
Result[High(A1)+1+i]:= A2[i];
end;
function joinIndexes( const Indexes: TIndexArray;
const Separator: string = ' x ') : string;
var i : integer;
begin
Result := '';
if length(Indexes)=0 then exit;
Result := IntToStr( Indexes[0] );
for i := 1 to Length(Indexes) - 1 do
Result := Result + Separator + IntToStr( Indexes[i] );
end;
function bsonDump( const V: Variant ) : string;
function varDumpRow( const V: Variant; const Dim: Integer; const P: TIndexArray ): string;
var i, l: integer;
Z: TIndexArray;
begin
Result := '';
l := length(P);
for i := VarArrayLowBound(V, 1+length(P)) to VarArrayHighBound(V, 1+length(P)) do
begin
SetLength(Z, 1);
Z[0] := i;
Z := ConcatArrays(P, Z);
if l+1=Dim then
begin
try
Result := Result + joinIndexes(Z) + ' ' + bsonDump( VarArrayGet(V, Z) ) + #13#10
except on E: Exception do
Result := Result + joinIndexes(Z) + ' ERROR '#13#10;
end;
end
else
Result := Result + varDumpRow( V, Dim, Z ) + #13#10;
end;
end;
var d: integer;
Z: TIndexArray;
VV: Variant;
begin
if VarIsArray(V) then
begin
SetLength(Z, 0);
d := VarArrayDimCount( V );
Result := varDumpRow( V, d, Z );
end else
if varType(V) = 13 then
begin
VV := (IUnknown(V) as IBSONDocument).ToVarArray;
Result := bsonDump( VV );
end else
begin
try
Result := VarToStr(V);
except on E: Exception do
Result := 'Error varType = (' + IntToStr(VarType(V)) + ')';
end;
end;
end;
function convertTimeLocalToUTC(DateTime: TDateTime): TDateTime;
var
TimeZoneInfo: TTimeZoneInformation;
begin
ZeroMemory(@TimeZoneInfo, SizeOf(TimeZoneInfo));
case GetTimeZoneInformation(TimeZoneInfo) of
TIME_ZONE_ID_STANDARD, TIME_ZONE_ID_UNKNOWN:
Result := DateTime + (TimeZoneInfo.Bias + TimeZoneInfo.StandardBias) / MinutesPerDay;
TIME_ZONE_ID_DAYLIGHT:
Result := DateTime + (TimeZoneInfo.Bias + TimeZoneInfo.DaylightBias) / MinutesPerDay;
else
raise Exception.CreateRes(@RsMakeUTCTime);
end;
end;
function convertTimeUTCToLocal(DateTime: TDateTime): TDateTime;
var
TimeZoneInfo: TTimeZoneInformation;
begin
ZeroMemory(@TimeZoneInfo, SizeOf(TimeZoneInfo));
case GetTimeZoneInformation(TimeZoneInfo) of
TIME_ZONE_ID_STANDARD, TIME_ZONE_ID_UNKNOWN:
Result := DateTime - (TimeZoneInfo.Bias + TimeZoneInfo.StandardBias) / MinutesPerDay;
TIME_ZONE_ID_DAYLIGHT:
Result := DateTime - (TimeZoneInfo.Bias + TimeZoneInfo.DaylightBias) / MinutesPerDay;
else
raise Exception.CreateRes(@RsMakeUTCTime);
end;
end;
end.