|
28 | 28 | // methods used internally
|
29 | 29 | static bool njsBaton_completeAsyncHelper(njsBaton *baton, napi_env env,
|
30 | 30 | napi_value *callback, napi_value *callingObj);
|
| 31 | +static void njsBaton_freeShardingKeys(uint8_t *numShardingKeyColumns, |
| 32 | + dpiShardingKeyColumn **shardingKeyColumns); |
31 | 33 |
|
32 | 34 |
|
33 | 35 | //-----------------------------------------------------------------------------
|
@@ -359,10 +361,39 @@ void njsBaton_free(njsBaton *baton, napi_env env)
|
359 | 361 | }
|
360 | 362 | NJS_FREE_AND_CLEAR(baton->callbackArgs);
|
361 | 363 |
|
| 364 | + // free sharding and super sharding keys |
| 365 | + njsBaton_freeShardingKeys(&baton->numShardingKeyColumns, |
| 366 | + &baton->shardingKeyColumns); |
| 367 | + njsBaton_freeShardingKeys(&baton->numSuperShardingKeyColumns, |
| 368 | + &baton->superShardingKeyColumns); |
| 369 | + |
362 | 370 | free(baton);
|
363 | 371 | }
|
364 | 372 |
|
365 | 373 |
|
| 374 | +//----------------------------------------------------------------------------- |
| 375 | +// njsBaton_freeShardingKeys() |
| 376 | +// To clean up array of ShardingKeys |
| 377 | +//----------------------------------------------------------------------------- |
| 378 | +void njsBaton_freeShardingKeys(uint8_t *numShardingKeyColumns, |
| 379 | + dpiShardingKeyColumn **shardingKeyColumns) |
| 380 | +{ |
| 381 | + dpiShardingKeyColumn *shards = *shardingKeyColumns; |
| 382 | + uint32_t i; |
| 383 | + |
| 384 | + for (i = 0; i < *numShardingKeyColumns; i++) { |
| 385 | + if (shards[i].oracleTypeNum == DPI_ORACLE_TYPE_VARCHAR && |
| 386 | + shards[i].value.asBytes.ptr) { |
| 387 | + free(shards[i].value.asBytes.ptr); |
| 388 | + shards[i].value.asBytes.ptr = NULL; |
| 389 | + } |
| 390 | + } |
| 391 | + free(shards); |
| 392 | + *numShardingKeyColumns = 0; |
| 393 | + *shardingKeyColumns = NULL; |
| 394 | +} |
| 395 | + |
| 396 | + |
366 | 397 | //-----------------------------------------------------------------------------
|
367 | 398 | // njsBaton_getBoolFromArg()
|
368 | 399 | // Gets a boolean value from the specified JavaScript object property, if
|
@@ -540,6 +571,109 @@ uint32_t njsBaton_getNumOutBinds(njsBaton *baton)
|
540 | 571 | }
|
541 | 572 |
|
542 | 573 |
|
| 574 | +//----------------------------------------------------------------------------- |
| 575 | +// njsBaton_getShardingKeyColumnsFromArg() |
| 576 | +// Gets an array of sharding key columns from the specified JavaScript object |
| 577 | +// property, if possible. If the given property is undefined, no error is set |
| 578 | +// and the value is left untouched; otherwise, if the value is not an array, |
| 579 | +// the error is set on the baton. |
| 580 | +//----------------------------------------------------------------------------- |
| 581 | +bool njsBaton_getShardingKeyColumnsFromArg(njsBaton *baton, napi_env env, |
| 582 | + napi_value *args, int argIndex, const char *propertyName, |
| 583 | + uint8_t *numShardingKeyColumns, |
| 584 | + dpiShardingKeyColumn **shardingKeyColumns) |
| 585 | +{ |
| 586 | + napi_value asNumber, value, element; |
| 587 | + dpiShardingKeyColumn *shards; |
| 588 | + napi_valuetype valueType; |
| 589 | + uint32_t arrLen, i; |
| 590 | + size_t numBytes; |
| 591 | + bool check; |
| 592 | + |
| 593 | + // validate parameter |
| 594 | + if (!njsBaton_getValueFromArg(baton, env, args, argIndex, propertyName, |
| 595 | + napi_object, &value, NULL)) |
| 596 | + return false; |
| 597 | + if (!value) |
| 598 | + return true; |
| 599 | + NJS_CHECK_NAPI(env, napi_is_array(env, value, &check)) |
| 600 | + if (!check) |
| 601 | + return njsBaton_setError(baton, errNonArrayProvided); |
| 602 | + |
| 603 | + // allocate space for sharding key columns; if array is empty, nothing |
| 604 | + // further to do! |
| 605 | + NJS_CHECK_NAPI(env, napi_get_array_length(env, value, &arrLen)) |
| 606 | + if (arrLen == 0) |
| 607 | + return true; |
| 608 | + shards = calloc(arrLen, sizeof(dpiShardingKeyColumn)); |
| 609 | + if (!shards) |
| 610 | + return njsBaton_setError(baton, errInsufficientMemory); |
| 611 | + *shardingKeyColumns = shards; |
| 612 | + *numShardingKeyColumns = (uint8_t)arrLen; |
| 613 | + |
| 614 | + // process each element |
| 615 | + for (i = 0; i < arrLen; i++) { |
| 616 | + NJS_CHECK_NAPI(env, napi_get_element(env, value, i, &element)) |
| 617 | + NJS_CHECK_NAPI(env, napi_typeof(env, element, &valueType)) |
| 618 | + |
| 619 | + // handle strings |
| 620 | + if (valueType == napi_string) { |
| 621 | + shards[i].nativeTypeNum = DPI_NATIVE_TYPE_BYTES; |
| 622 | + shards[i].oracleTypeNum = DPI_ORACLE_TYPE_VARCHAR; |
| 623 | + if (!njsUtils_copyStringFromJS(env, element, |
| 624 | + &shards[i].value.asBytes.ptr, &numBytes)) |
| 625 | + return false; |
| 626 | + shards[i].value.asBytes.length = (uint32_t) numBytes; |
| 627 | + continue; |
| 628 | + } |
| 629 | + |
| 630 | + // handle numbers |
| 631 | + if (valueType == napi_number) { |
| 632 | + shards[i].nativeTypeNum = DPI_NATIVE_TYPE_DOUBLE; |
| 633 | + shards[i].oracleTypeNum = DPI_ORACLE_TYPE_NUMBER; |
| 634 | + NJS_CHECK_NAPI(env, napi_get_value_double(env, element, |
| 635 | + &shards[i].value.asDouble)); |
| 636 | + continue; |
| 637 | + } |
| 638 | + |
| 639 | + // handle objects |
| 640 | + if (valueType == napi_object) { |
| 641 | + |
| 642 | + // handle buffers |
| 643 | + NJS_CHECK_NAPI(env, napi_is_buffer(env, element, &check)) |
| 644 | + if (check) { |
| 645 | + shards[i].nativeTypeNum = DPI_NATIVE_TYPE_BYTES; |
| 646 | + shards[i].oracleTypeNum = DPI_ORACLE_TYPE_RAW; |
| 647 | + NJS_CHECK_NAPI(env, napi_get_buffer_info(env, element, |
| 648 | + (void*) &shards[i].value.asBytes.ptr, &numBytes)) |
| 649 | + shards[i].value.asBytes.length = (uint32_t) numBytes; |
| 650 | + continue; |
| 651 | + } |
| 652 | + |
| 653 | + // handle dates |
| 654 | + if (!njsBaton_isDate(baton, env, element, &check)) |
| 655 | + return false; |
| 656 | + if (check) { |
| 657 | + shards[i].nativeTypeNum = DPI_NATIVE_TYPE_DOUBLE; |
| 658 | + shards[i].oracleTypeNum = DPI_ORACLE_TYPE_DATE; |
| 659 | + NJS_CHECK_NAPI(env, napi_coerce_to_number(env, element, |
| 660 | + &asNumber)) |
| 661 | + NJS_CHECK_NAPI(env, napi_get_value_double(env, asNumber, |
| 662 | + &shards[i].value.asDouble)) |
| 663 | + continue; |
| 664 | + } |
| 665 | + |
| 666 | + } |
| 667 | + |
| 668 | + // no support for other types |
| 669 | + return njsBaton_setError(baton, errInvalidPropertyValueInParam, |
| 670 | + propertyName, argIndex + 1); |
| 671 | + } |
| 672 | + |
| 673 | + return true; |
| 674 | +} |
| 675 | + |
| 676 | + |
543 | 677 | //-----------------------------------------------------------------------------
|
544 | 678 | // njsBaton_getSodaDocument()
|
545 | 679 | // Examines the passed object. If it is a SODA document object, a reference
|
@@ -836,7 +970,13 @@ bool njsBaton_isDate(njsBaton *baton, napi_env env, napi_value value,
|
836 | 970 | {
|
837 | 971 | napi_value isDateObj;
|
838 | 972 |
|
839 |
| - NJS_CHECK_NAPI(env, napi_call_function(env, baton->jsConnection, |
| 973 | + if (!baton->jsIsDateObj) { |
| 974 | + NJS_CHECK_NAPI(env, napi_get_reference_value(env, baton->jsCallingObj, |
| 975 | + &baton->jsIsDateObj)) |
| 976 | + NJS_CHECK_NAPI(env, napi_get_named_property(env, baton->jsIsDateObj, |
| 977 | + "_isDate", &baton->jsIsDateMethod)) |
| 978 | + } |
| 979 | + NJS_CHECK_NAPI(env, napi_call_function(env, baton->jsIsDateObj, |
840 | 980 | baton->jsIsDateMethod, 1, &value, &isDateObj))
|
841 | 981 | NJS_CHECK_NAPI(env, napi_get_value_bool(env, isDateObj, isDate))
|
842 | 982 | return true;
|
@@ -918,21 +1058,10 @@ void njsBaton_reportError(njsBaton *baton, napi_env env)
|
918 | 1058 | // njsBaton_setConstructors()
|
919 | 1059 | // Sets the constructors on the baton.
|
920 | 1060 | //-----------------------------------------------------------------------------
|
921 |
| -bool njsBaton_setConstructors(njsBaton *baton, napi_env env, bool canBind) |
| 1061 | +bool njsBaton_setConstructors(njsBaton *baton, napi_env env) |
922 | 1062 | {
|
923 | 1063 | napi_value global;
|
924 | 1064 |
|
925 |
| - // if binding is possible, get the connection (which is the calling object) |
926 |
| - // and acquire the method used for determining if a value is a date; this |
927 |
| - // is needed until such time as napi_is_date() is available for all LTS |
928 |
| - // releases |
929 |
| - if (canBind) { |
930 |
| - NJS_CHECK_NAPI(env, napi_get_reference_value(env, baton->jsCallingObj, |
931 |
| - &baton->jsConnection)) |
932 |
| - NJS_CHECK_NAPI(env, napi_get_named_property(env, baton->jsConnection, |
933 |
| - "_isDate", &baton->jsIsDateMethod)) |
934 |
| - } |
935 |
| - |
936 | 1065 | // acquire the Date constructor
|
937 | 1066 | NJS_CHECK_NAPI(env, napi_get_global(env, &global))
|
938 | 1067 | NJS_CHECK_NAPI(env, napi_get_named_property(env, global, "Date",
|
|
0 commit comments