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 }