@@ -100,8 +100,9 @@ static bool njsDbObject_transformFromOracle(njsDbObject *obj, napi_env env,
100
100
njsDataTypeInfo * typeInfo , dpiData * data , napi_value * value ,
101
101
njsDbObjectAttr * attr , njsModuleGlobals * globals );
102
102
static bool njsDbObject_transformToOracle (njsDbObject * obj , napi_env env ,
103
- napi_value value , dpiNativeTypeNum * nativeTypeNum , dpiData * data ,
104
- char * * strBuffer , njsDbObjectAttr * attr , njsModuleGlobals * globals );
103
+ napi_value value , dpiOracleTypeNum oracleTypeNum ,
104
+ dpiNativeTypeNum * nativeTypeNum , dpiData * data , char * * strBuffer ,
105
+ njsDbObjectAttr * attr , njsModuleGlobals * globals );
105
106
static bool njsDbObjectType_populate (njsDbObjectType * objType ,
106
107
dpiObjectType * objectTypeHandle , napi_env env , napi_value jsObjectType ,
107
108
dpiObjectTypeInfo * info , njsBaton * baton );
@@ -124,8 +125,9 @@ NJS_NAPI_METHOD_IMPL_SYNC(njsDbObject_append, 1, &njsClassDefDbObject)
124
125
int status ;
125
126
126
127
nativeTypeNum = obj -> type -> elementTypeInfo .nativeTypeNum ;
127
- if (!njsDbObject_transformToOracle (obj , env , args [0 ], & nativeTypeNum ,
128
- & data , & str , NULL , globals ))
128
+ if (!njsDbObject_transformToOracle (obj , env , args [0 ],
129
+ obj -> type -> elementTypeInfo .oracleTypeNum , & nativeTypeNum , & data ,
130
+ & str , NULL , globals ))
129
131
return false;
130
132
status = dpiObject_appendElement (obj -> handle , nativeTypeNum , & data );
131
133
if (str )
@@ -547,8 +549,9 @@ NJS_NAPI_METHOD_IMPL_SYNC(njsDbObject_setAttrValue, 2, &njsClassDefDbObject)
547
549
548
550
// transform to value required by ODPI-C
549
551
nativeTypeNum = attr -> typeInfo .nativeTypeNum ;
550
- if (!njsDbObject_transformToOracle (obj , env , args [1 ], & nativeTypeNum ,
551
- & data , & str , attr , globals ))
552
+ if (!njsDbObject_transformToOracle (obj , env , args [1 ],
553
+ attr -> typeInfo .oracleTypeNum , & nativeTypeNum , & data , & str , attr ,
554
+ globals ))
552
555
return false;
553
556
554
557
// set value
@@ -578,8 +581,9 @@ NJS_NAPI_METHOD_IMPL_SYNC(njsDbObject_setElement, 2, &njsClassDefDbObject)
578
581
579
582
NJS_CHECK_NAPI (env , napi_get_value_int32 (env , args [0 ], & index ))
580
583
nativeTypeNum = obj -> type -> elementTypeInfo .nativeTypeNum ;
581
- if (!njsDbObject_transformToOracle (obj , env , args [1 ], & nativeTypeNum ,
582
- & data , & str , NULL , globals ))
584
+ if (!njsDbObject_transformToOracle (obj , env , args [1 ],
585
+ obj -> type -> elementTypeInfo .oracleTypeNum , & nativeTypeNum , & data ,
586
+ & str , NULL , globals ))
583
587
return false;
584
588
status = dpiObject_setElementValueByIndex (obj -> handle , index ,
585
589
nativeTypeNum , & data );
@@ -600,7 +604,7 @@ static bool njsDbObject_transformFromOracle(njsDbObject *obj, napi_env env,
600
604
njsDataTypeInfo * typeInfo , dpiData * data , napi_value * value ,
601
605
njsDbObjectAttr * attr , njsModuleGlobals * globals )
602
606
{
603
- napi_value global , constructor , jsDbObjectType , temp ;
607
+ napi_value jsDbObjectType , makeDateFn , temp ;
604
608
njsLobBuffer lobBuffer ;
605
609
bool ok ;
606
610
@@ -650,14 +654,10 @@ static bool njsDbObject_transformFromOracle(njsDbObject *obj, napi_env env,
650
654
case DPI_ORACLE_TYPE_TIMESTAMP :
651
655
case DPI_ORACLE_TYPE_TIMESTAMP_TZ :
652
656
case DPI_ORACLE_TYPE_TIMESTAMP_LTZ :
653
- NJS_CHECK_NAPI (env , napi_get_global (env , & global ))
654
- NJS_CHECK_NAPI (env , napi_get_named_property (env , global , "Date" ,
655
- & constructor ))
656
- NJS_CHECK_NAPI (env , napi_create_double (env , data -> value .asDouble ,
657
- & temp ))
658
- NJS_CHECK_NAPI (env , napi_new_instance (env , constructor , 1 , & temp ,
659
- value ))
660
- return true;
657
+ NJS_CHECK_NAPI (env , napi_get_reference_value (env ,
658
+ globals -> jsMakeDateFn , & makeDateFn ))
659
+ return njsUtils_getDateValue (typeInfo -> oracleTypeNum , env ,
660
+ makeDateFn , & data -> value .asTimestamp , value );
661
661
case DPI_ORACLE_TYPE_CLOB :
662
662
case DPI_ORACLE_TYPE_NCLOB :
663
663
case DPI_ORACLE_TYPE_BLOB :
@@ -700,10 +700,11 @@ static bool njsDbObject_transformFromOracle(njsDbObject *obj, napi_env env,
700
700
// Transforms a JavaScript value into the value that ODPI-C expects.
701
701
//-----------------------------------------------------------------------------
702
702
static bool njsDbObject_transformToOracle (njsDbObject * obj , napi_env env ,
703
- napi_value value , dpiNativeTypeNum * nativeTypeNum , dpiData * data ,
704
- char * * strBuffer , njsDbObjectAttr * attr , njsModuleGlobals * globals )
703
+ napi_value value , dpiOracleTypeNum oracleTypeNum ,
704
+ dpiNativeTypeNum * nativeTypeNum , dpiData * data , char * * strBuffer ,
705
+ njsDbObjectAttr * attr , njsModuleGlobals * globals )
705
706
{
706
- napi_value global , constructor , asNumber ;
707
+ napi_value constructor , getComponentsFn ;
707
708
napi_valuetype valueType ;
708
709
njsDbObject * valueObj ;
709
710
bool check , tempBool ;
@@ -734,9 +735,7 @@ static bool njsDbObject_transformToOracle(njsDbObject *obj, napi_env env,
734
735
case napi_number :
735
736
NJS_CHECK_NAPI (env , napi_get_value_double (env , value ,
736
737
& data -> value .asDouble ));
737
- if (* nativeTypeNum != DPI_NATIVE_TYPE_TIMESTAMP ) {
738
- * nativeTypeNum = DPI_NATIVE_TYPE_DOUBLE ;
739
- }
738
+ * nativeTypeNum = DPI_NATIVE_TYPE_DOUBLE ;
740
739
return true;
741
740
742
741
// handle booleans
@@ -750,18 +749,13 @@ static bool njsDbObject_transformToOracle(njsDbObject *obj, napi_env env,
750
749
case napi_object :
751
750
752
751
// handle dates
753
- NJS_CHECK_NAPI (env , napi_get_global (env , & global ))
754
- NJS_CHECK_NAPI (env , napi_get_named_property (env , global , "Date" ,
755
- & constructor ))
756
- NJS_CHECK_NAPI (env , napi_instanceof (env , value , constructor ,
757
- & check ))
752
+ NJS_CHECK_NAPI (env , napi_is_date (env , value , & check ))
758
753
if (check ) {
759
- NJS_CHECK_NAPI (env , napi_coerce_to_number (env , value ,
760
- & asNumber ))
761
- NJS_CHECK_NAPI (env , napi_get_value_double (env , asNumber ,
762
- & data -> value .asDouble ))
763
- * nativeTypeNum = DPI_NATIVE_TYPE_DOUBLE ;
764
- return true;
754
+ * nativeTypeNum = DPI_NATIVE_TYPE_TIMESTAMP ;
755
+ NJS_CHECK_NAPI (env , napi_get_reference_value (env ,
756
+ globals -> jsGetDateComponentsFn , & getComponentsFn ))
757
+ return njsUtils_setDateValue (oracleTypeNum , env , value ,
758
+ getComponentsFn , & data -> value .asTimestamp );
765
759
}
766
760
767
761
// handle buffers
@@ -1004,12 +998,6 @@ static bool njsDbObjectType_populateTypeInfo(njsDataTypeInfo *info,
1004
998
1005
999
info -> oracleTypeNum = sourceInfo -> oracleTypeNum ;
1006
1000
info -> nativeTypeNum = sourceInfo -> defaultNativeTypeNum ;
1007
- if (info -> oracleTypeNum == DPI_ORACLE_TYPE_DATE ||
1008
- info -> oracleTypeNum == DPI_ORACLE_TYPE_TIMESTAMP ||
1009
- info -> oracleTypeNum == DPI_ORACLE_TYPE_TIMESTAMP_TZ ||
1010
- info -> oracleTypeNum == DPI_ORACLE_TYPE_TIMESTAMP_LTZ ) {
1011
- info -> nativeTypeNum = DPI_NATIVE_TYPE_DOUBLE ;
1012
- }
1013
1001
if (sourceInfo -> objectType ) {
1014
1002
return njsDbObject_getSubClass (baton , sourceInfo -> objectType , env ,
1015
1003
& temp , & info -> objectType );
0 commit comments