1 /*
2  * Copyright (C) 2019, HuntLabs
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  *
16  */
17 
18 module hunt.database.driver.postgresql.impl.PostgreSQLRowImpl;
19 
20 import hunt.database.driver.postgresql.data.Box;
21 import hunt.database.driver.postgresql.data.Circle;
22 import hunt.database.driver.postgresql.data.Line;
23 import hunt.database.driver.postgresql.data.LineSegment;
24 import hunt.database.driver.postgresql.data.Path;
25 import hunt.database.driver.postgresql.data.Polygon;
26 import hunt.database.driver.postgresql.data.Interval;
27 import hunt.database.driver.postgresql.data.Point;
28 
29 import hunt.database.base.Numeric;
30 import hunt.database.base.impl.ArrayTuple;
31 import hunt.database.base.impl.RowDesc;
32 import hunt.database.base.impl.RowImpl;
33 import hunt.database.base.impl.RowInternal;
34 
35 import hunt.collection.List;
36 import hunt.Exceptions;
37 import hunt.math.BigDecimal;
38 
39 import std.algorithm;
40 import std.string;
41 import std.variant;
42 
43 
44 class PgRowImpl : RowImpl {
45 
46     this(RowDesc desc) {
47         super(desc);
48     }
49 
50     this(RowImpl row) {
51         super(row);
52     }
53 
54 
55     // override
56     // T get(T)(TypeInfo type, int pos) {
57     //     if (type == typeid(bool)) {
58     //         return type.cast(getBoolean(pos));
59     //     } else if (type == Short.class) {
60     //         return type.cast(getShort(pos));
61     //     } else if (type == Integer.class) {
62     //         return type.cast(getInteger(pos));
63     //     } else if (type == Long.class) {
64     //         return type.cast(getLong(pos));
65     //     } else if (type == Float.class) {
66     //         return type.cast(getFloat(pos));
67     //     } else if (type == Double.class) {
68     //         return type.cast(getDouble(pos));
69     //     } else if (type == Character.class) {
70     //         return type.cast(getChar(pos));
71     //     } else if (type == Numeric.class) {
72     //         return type.cast(getNumeric(pos));
73     //     } else if (type == string.class) {
74     //         return type.cast(getString(pos));
75     //     } else if (type == Buffer.class) {
76     //         return type.cast(getBuffer(pos));
77     //     } else if (type == UUID.class) {
78     //         return type.cast(getUUID(pos));
79     //     } else if (type == LocalDate.class) {
80     //         return type.cast(getLocalDate(pos));
81     //     } else if (type == LocalTime.class) {
82     //         return type.cast(getLocalTime(pos));
83     //     } else if (type == OffsetTime.class) {
84     //         return type.cast(getOffsetTime(pos));
85     //     } else if (type == LocalDateTime.class) {
86     //         return type.cast(getLocalDateTime(pos));
87     //     } else if (type == OffsetDateTime.class) {
88     //         return type.cast(getOffsetDateTime(pos));
89     //     } else if (type == Interval.class) {
90     //         return type.cast(getInterval(pos));
91     //     } else if (type == Point.class) {
92     //         return type.cast(getPoint(pos));
93     //     } else if (type == Line.class) {
94     //         return type.cast(getLine(pos));
95     //     } else if (type == LineSegment.class) {
96     //         return type.cast(getLineSegment(pos));
97     //     } else if (type == Path.class) {
98     //         return type.cast(getPath(pos));
99     //     } else if (type == Polygon.class) {
100     //         return type.cast(getPolygon(pos));
101     //     } else if (type == Circle.class) {
102     //         return type.cast(getCircle(pos));
103     //     } else if (type == Box.class) {
104     //         return type.cast(getBox(pos));
105     //     } else if (type == JsonObject.class) {
106     //         return type.cast(getJson(pos));
107     //     } else if (type == JsonArray.class) {
108     //         return type.cast(getJson(pos));
109     //     } else if (type == Object.class) {
110     //         return type.cast(get(pos));
111     //     }
112     //     throw new UnsupportedOperationException("Unsupported type " ~ type.getName());
113     // }
114 
115     // override
116     // <T> T[] getValues(Class!(T) type, int pos) {
117     //     if (type == Boolean.class) {
118     //         return (T[]) getBooleanArray(pos);
119     //     } else if (type == Short.class) {
120     //         return (T[]) getShortArray(pos);
121     //     } else if (type == Integer.class) {
122     //         return (T[]) getIntegerArray(pos);
123     //     } else if (type == Long.class) {
124     //         return (T[]) getLongArray(pos);
125     //     } else if (type == Float.class) {
126     //         return (T[]) getFloatArray(pos);
127     //     } else if (type == Double.class) {
128     //         return (T[]) getDoubleArray(pos);
129     //     } else if (type == Character.class) {
130     //         return (T[]) getCharArray(pos);
131     //     } else if (type == string.class) {
132     //         return (T[]) getStringArray(pos);
133     //     } else if (type == Buffer.class) {
134     //         return (T[]) getBufferArray(pos);
135     //     } else if (type == UUID.class) {
136     //         return (T[]) getUUIDArray(pos);
137     //     } else if (type == LocalDate.class) {
138     //         return (T[]) getLocalDateArray(pos);
139     //     } else if (type == LocalTime.class) {
140     //         return (T[]) getLocalTimeArray(pos);
141     //     } else if (type == OffsetTime.class) {
142     //         return (T[]) getOffsetTimeArray(pos);
143     //     } else if (type == LocalDateTime.class) {
144     //         return (T[]) getLocalDateTimeArray(pos);
145     //     } else if (type == OffsetDateTime.class) {
146     //         return (T[]) getOffsetDateTimeArray(pos);
147     //     } else if (type == Interval.class) {
148     //         return (T[]) getIntervalArray(pos);
149     //     } else if (type == Numeric.class) {
150     //         return (T[]) getNumericArray(pos);
151     //     } else if (type == Point.class) {
152     //         return (T[]) getPointArray(pos);
153     //     } else if (type == Line.class) {
154     //         return (T[]) getLineArray(pos);
155     //     } else if (type == LineSegment.class) {
156     //         return (T[]) getLineSegmentArray(pos);
157     //     } else if (type == Path.class) {
158     //         return (T[]) getPathArray(pos);
159     //     } else if (type == Polygon.class) {
160     //         return (T[]) getPolygonArray(pos);
161     //     } else if (type == Circle.class) {
162     //         return (T[]) getCircleArray(pos);
163     //     } else if (type == Interval.class) {
164     //         return (T[]) getIntervalArray(pos);
165     //     } else if (type == Box.class) {
166     //         return (T[]) getBoxArray(pos);
167     //     } else if (type == Object.class) {
168     //         return (T[]) getJsonArray(pos);
169     //     }
170     //     throw new UnsupportedOperationException("Unsupported type " ~ type.getName());
171     // }
172 
173     // override
174     // Temporal getTemporal(string name) {
175     //     int pos = desc.columnIndex(name);
176     //     return pos == -1 ? null : getTemporal(pos);
177     // }
178 
179     // override
180     // LocalDate getLocalDate(string name) {
181     //     int pos = desc.columnIndex(name);
182     //     return pos == -1 ? null : getLocalDate(pos);
183     // }
184 
185     // override
186     // LocalTime getLocalTime(string name) {
187     //     int pos = desc.columnIndex(name);
188     //     return pos == -1 ? null : getLocalTime(pos);
189     // }
190 
191     // override
192     // LocalDateTime getLocalDateTime(string name) {
193     //     int pos = desc.columnIndex(name);
194     //     return pos == -1 ? null : getLocalDateTime(pos);
195     // }
196 
197     // override
198     // OffsetTime getOffsetTime(string name) {
199     //     int pos = desc.columnIndex(name);
200     //     return pos == -1 ? null : getOffsetTime(pos);
201     // }
202 
203     // override
204     // OffsetDateTime getOffsetDateTime(string name) {
205     //     int pos = desc.columnIndex(name);
206     //     return pos == -1 ? null : getOffsetDateTime(pos);
207     // }
208 
209     // override
210     // UUID getUUID(string name) {
211     //     int pos = desc.columnIndex(name);
212     //     return pos == -1 ? null : getUUID(pos);
213     // }
214 
215     // override
216     // BigDecimal getBigDecimal(string name) {
217     //     int pos = desc.columnIndex(name);
218     //     return pos == -1 ? null : getBigDecimal(pos);
219     // }
220 
221     // Numeric getNumeric(string name) {
222     //     int pos = desc.columnIndex(name);
223     //     return pos == -1 ? null : getNumeric(pos);
224     // }
225 
226     // Point getPoint(string name) {
227     //     int pos = desc.columnIndex(name);
228     //     return pos == -1 ? null : getPoint(pos);
229     // }
230 
231     // Line getLine(string name) {
232     //     int pos = desc.columnIndex(name);
233     //     return pos == -1 ? null : getLine(pos);
234     // }
235 
236     // LineSegment getLineSegment(string name) {
237     //     int pos = desc.columnIndex(name);
238     //     return pos == -1 ? null : getLineSegment(pos);
239     // }
240 
241     // Box getBox(string name) {
242     //     int pos = desc.columnIndex(name);
243     //     return pos == -1 ? null : getBox(pos);
244     // }
245 
246     // Path getPath(string name) {
247     //     int pos = desc.columnIndex(name);
248     //     return pos == -1 ? null : getPath(pos);
249     // }
250 
251     // Polygon getPolygon(string name) {
252     //     int pos = desc.columnIndex(name);
253     //     return pos == -1 ? null : getPolygon(pos);
254     // }
255 
256     // Circle getCircle(string name) {
257     //     int pos = desc.columnIndex(name);
258     //     return pos == -1 ? null : getCircle(pos);
259     // }
260 
261     // Interval getInterval(string name) {
262     //     int pos = desc.columnIndex(name);
263     //     return pos == -1 ? null : getInterval(pos);
264     // }
265 
266     // override
267     // Boolean[] getBooleanArray(string name) {
268     //     int pos = desc.columnIndex(name);
269     //     return pos == -1 ? null : getBooleanArray(pos);
270     // }
271 
272     // override
273     // Short[] getShortArray(string name) {
274     //     int pos = desc.columnIndex(name);
275     //     return pos == -1 ? null : getShortArray(pos);
276     // }
277 
278     // override
279     // Integer[] getIntegerArray(string name) {
280     //     int pos = desc.columnIndex(name);
281     //     return pos == -1 ? null : getIntegerArray(pos);
282     // }
283 
284     // override
285     // Long[] getLongArray(string name) {
286     //     int pos = desc.columnIndex(name);
287     //     return pos == -1 ? null : getLongArray(pos);
288     // }
289 
290     // override
291     // Float[] getFloatArray(string name) {
292     //     int pos = desc.columnIndex(name);
293     //     return pos == -1 ? null : getFloatArray(pos);
294     // }
295 
296     // override
297     // Double[] getDoubleArray(string name) {
298     //     int pos = desc.columnIndex(name);
299     //     return pos == -1 ? null : getDoubleArray(pos);
300     // }
301 
302     // override
303     // string[] getStringArray(string name) {
304     //     int pos = desc.columnIndex(name);
305     //     return pos == -1 ? null : getStringArray(pos);
306     // }
307 
308     // override
309     // LocalDate[] getLocalDateArray(string name) {
310     //     int pos = desc.columnIndex(name);
311     //     return pos == -1 ? null : getLocalDateArray(pos);
312     // }
313 
314     // override
315     // LocalTime[] getLocalTimeArray(string name) {
316     //     int pos = desc.columnIndex(name);
317     //     return pos == -1 ? null : getLocalTimeArray(pos);
318     // }
319 
320     // override
321     // OffsetTime[] getOffsetTimeArray(string name) {
322     //     int pos = desc.columnIndex(name);
323     //     return pos == -1 ? null : getOffsetTimeArray(pos);
324     // }
325 
326     // override
327     // LocalDateTime[] getLocalDateTimeArray(string name) {
328     //     int pos = desc.columnIndex(name);
329     //     return pos == -1 ? null : getLocalDateTimeArray(pos);
330     // }
331 
332     // override
333     // OffsetDateTime[] getOffsetDateTimeArray(string name) {
334     //     int pos = desc.columnIndex(name);
335     //     return pos == -1 ? null : getOffsetDateTimeArray(pos);
336     // }
337 
338     // override
339     // Buffer[] getBufferArray(string name) {
340     //     int pos = desc.columnIndex(name);
341     //     return pos == -1 ? null : getBufferArray(pos);
342     // }
343 
344     // override
345     // UUID[] getUUIDArray(string name) {
346     //     int pos = desc.columnIndex(name);
347     //     return pos == -1 ? null : getUUIDArray(pos);
348     // }
349 
350     // Object[] getJsonArray(string name) {
351     //     int pos = desc.columnIndex(name);
352     //     return pos == -1 ? null : getJsonArray(pos);
353     // }
354 
355     // Numeric[] getNumericArray(string name) {
356     //     int pos = desc.columnIndex(name);
357     //     return pos == -1 ? null : getNumericArray(pos);
358     // }
359 
360     // Point[] getPointArray(string name) {
361     //     int pos = desc.columnIndex(name);
362     //     return pos == -1 ? null : getPointArray(pos);
363     // }
364 
365     // Line[] getLineArray(string name) {
366     //     int pos = desc.columnIndex(name);
367     //     return pos == -1 ? null : getLineArray(pos);
368     // }
369 
370     // LineSegment[] getLineSegmentArray(string name) {
371     //     int pos = desc.columnIndex(name);
372     //     return pos == -1 ? null : getLineSegmentArray(pos);
373     // }
374 
375     // Box[] getBoxArray(string name) {
376     //     int pos = desc.columnIndex(name);
377     //     return pos == -1 ? null : getBoxArray(pos);
378     // }
379 
380     // Path[] getPathArray(string name) {
381     //     int pos = desc.columnIndex(name);
382     //     return pos == -1 ? null : getPathArray(pos);
383     // }
384 
385     // Polygon[] getPolygonArray(string name) {
386     //     int pos = desc.columnIndex(name);
387     //     return pos == -1 ? null : getPolygonArray(pos);
388     // }
389 
390     // Circle[] getCircleArray(string name) {
391     //     int pos = desc.columnIndex(name);
392     //     return pos == -1 ? null : getCircleArray(pos);
393     // }
394 
395     // Interval[] getIntervalArray(string name) {
396     //     int pos = desc.columnIndex(name);
397     //     return pos == -1 ? null : getIntervalArray(pos);
398     // }
399 
400     // Character[] getCharArray(string name) {
401     //     int pos = desc.columnIndex(name);
402     //     return pos == -1 ? null : getCharArray(pos);
403     // }
404 
405     // Character getChar(int pos) {
406     //     Object val = get(pos);
407     //     if (val instanceof Character) {
408     //         return (Character) val;
409     //     } else {
410     //         return null;
411     //     }
412     // }
413 
414     // Numeric getNumeric(int pos) {
415     //     Object val = get(pos);
416     //     if (val instanceof Numeric) {
417     //         return (Numeric) val;
418     //     } else if (val instanceof Number) {
419     //         return Numeric.parse(val.toString());
420     //     }
421     //     return null;
422     // }
423 
424     // /**
425     //  * Get a {@link io.vertx.core.json.JsonObject} or {@link io.vertx.core.json.JsonArray} value.
426     //  */
427     // Object getJson(int pos) {
428     //     Object val = get(pos);
429     //     if (val instanceof JsonObject) {
430     //         return val;
431     //     } else if (val instanceof JsonArray) {
432     //         return val;
433     //     } else {
434     //         return null;
435     //     }
436     // }
437 
438     // Point getPoint(int pos) {
439     //     Object val = get(pos);
440     //     if (val instanceof Point) {
441     //         return (Point) val;
442     //     } else {
443     //         return null;
444     //     }
445     // }
446 
447     // Line getLine(int pos) {
448     //     Object val = get(pos);
449     //     if (val instanceof Line) {
450     //         return (Line) val;
451     //     } else {
452     //         return null;
453     //     }
454     // }
455 
456     // LineSegment getLineSegment(int pos) {
457     //     Object val = get(pos);
458     //     if (val instanceof LineSegment) {
459     //         return (LineSegment) val;
460     //     } else {
461     //         return null;
462     //     }
463     // }
464 
465     // Box getBox(int pos) {
466     //     Object val = get(pos);
467     //     if (val instanceof Box) {
468     //         return (Box) val;
469     //     } else {
470     //         return null;
471     //     }
472     // }
473 
474     // Path getPath(int pos) {
475     //     Object val = get(pos);
476     //     if (val instanceof Path) {
477     //         return (Path) val;
478     //     } else {
479     //         return null;
480     //     }
481     // }
482 
483     // Polygon getPolygon(int pos) {
484     //     Object val = get(pos);
485     //     if (val instanceof Polygon) {
486     //         return (Polygon) val;
487     //     } else {
488     //         return null;
489     //     }
490     // }
491 
492     // Circle getCircle(int pos) {
493     //     Object val = get(pos);
494     //     if (val instanceof Circle) {
495     //         return (Circle) val;
496     //     } else {
497     //         return null;
498     //     }
499     // }
500 
501     // Interval getInterval(int pos) {
502     //     Object val = get(pos);
503     //     if (val instanceof Interval) {
504     //         return (Interval) val;
505     //     } else {
506     //         return null;
507     //     }
508     // }
509 
510     // Character[] getCharArray(int pos) {
511     //     Object val = get(pos);
512     //     if (val instanceof Character[]) {
513     //         return (Character[]) val;
514     //     } else {
515     //         return null;
516     //     }
517     // }
518 
519     // /**
520     //  * Get a {@code Json} array value, the {@code Json} value may be a string, number, JSON object, array, boolean or null.
521     //  */
522     // Object[] getJsonArray(int pos) {
523     //     Object val = get(pos);
524     //     if (val instanceof Object[]) {
525     //         return (Object[]) val;
526     //     } else {
527     //         return null;
528     //     }
529     // }
530 
531     // Numeric[] getNumericArray(int pos) {
532     //     Object val = get(pos);
533     //     if (val instanceof Numeric[]) {
534     //         return (Numeric[]) val;
535     //     } else {
536     //         return null;
537     //     }
538     // }
539 
540     // Point[] getPointArray(int pos) {
541     //     Object val = get(pos);
542     //     if (val instanceof Point[]) {
543     //         return (Point[]) val;
544     //     } else {
545     //         return null;
546     //     }
547     // }
548 
549     // Line[] getLineArray(int pos) {
550     //     Object val = get(pos);
551     //     if (val instanceof Line[]) {
552     //         return (Line[]) val;
553     //     } else {
554     //         return null;
555     //     }
556     // }
557 
558     // LineSegment[] getLineSegmentArray(int pos) {
559     //     Object val = get(pos);
560     //     if (val instanceof LineSegment[]) {
561     //         return (LineSegment[]) val;
562     //     } else {
563     //         return null;
564     //     }
565     // }
566 
567     // Box[] getBoxArray(int pos) {
568     //     Object val = get(pos);
569     //     if (val instanceof Box[]) {
570     //         return (Box[]) val;
571     //     } else {
572     //         return null;
573     //     }
574     // }
575 
576     // Path[] getPathArray(int pos) {
577     //     Object val = get(pos);
578     //     if (val instanceof Path[]) {
579     //         return (Path[]) val;
580     //     } else {
581     //         return null;
582     //     }
583     // }
584 
585     // Polygon[] getPolygonArray(int pos) {
586     //     Object val = get(pos);
587     //     if (val instanceof Polygon[]) {
588     //         return (Polygon[]) val;
589     //     } else {
590     //         return null;
591     //     }
592     // }
593 
594     // Circle[] getCircleArray(int pos) {
595     //     Object val = get(pos);
596     //     if (val instanceof Circle[]) {
597     //         return (Circle[]) val;
598     //     } else {
599     //         return null;
600     //     }
601     // }
602 
603     // Interval[] getIntervalArray(int pos) {
604     //     Object val = get(pos);
605     //     if (val instanceof Interval[]) {
606     //         return (Interval[]) val;
607     //     } else {
608     //         return null;
609     //     }
610     // }
611 }