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