@@ -104,9 +104,12 @@ Connection::~Connection()
104
104
*/
105
105
void Connection::setConnection (dpi::Conn* dpiconn, Oracledb* oracledb)
106
106
{
107
- this ->dpiconn_ = dpiconn;
108
- this ->isValid_ = true ;
109
- this ->oracledb_ = oracledb;
107
+ this ->dpiconn_ = dpiconn;
108
+ this ->isValid_ = true ;
109
+ this ->oracledb_ = oracledb;
110
+ this ->lobCount_ = 0 ;
111
+ this ->rsCount_ = 0 ;
112
+ this ->dbCount_ = 0 ;
110
113
}
111
114
112
115
/* ****************************************************************************/
@@ -438,11 +441,10 @@ NAN_METHOD(Connection::Execute)
438
441
Connection *connection;
439
442
NJS_GET_CALLBACK ( callback, info );
440
443
441
- eBaton *executeBaton = new eBaton;
442
- executeBaton->cb .Reset ( callback );
443
- NJS_CHECK_NUMBER_OF_ARGS ( executeBaton->error , info, 2 , 4 , exitExecute );
444
444
connection = Nan::ObjectWrap::Unwrap<Connection>(info.This ());
445
+ eBaton *executeBaton = new eBaton ( connection->DBCount (), callback );
445
446
447
+ NJS_CHECK_NUMBER_OF_ARGS ( executeBaton->error , info, 2 , 4 , exitExecute );
446
448
NJS_CHECK_OBJECT_VALID3 ( connection, executeBaton->error , exitExecute );
447
449
448
450
if (!connection->isValid_ )
@@ -479,8 +481,16 @@ NAN_METHOD(Connection::Execute)
479
481
480
482
exitExecute:
481
483
executeBaton->req .data = (void *) executeBaton;
482
- uv_queue_work (uv_default_loop (), &executeBaton->req ,
484
+ int status = uv_queue_work (uv_default_loop (), &executeBaton->req ,
483
485
Async_Execute, (uv_after_work_cb)Async_AfterExecute);
486
+ // delete the Baton if uv_queue_work fails
487
+ if ( status )
488
+ {
489
+ delete executeBaton;
490
+ string error = NJSMessages::getErrorMsg ( errInternalError,
491
+ " uv_queue_work" , " Execute" );
492
+ NJS_SET_EXCEPTION (error.c_str (), error.length ());
493
+ }
484
494
485
495
info.GetReturnValue ().SetUndefined ();
486
496
}
@@ -2053,9 +2063,8 @@ void Connection::Async_AfterExecute(uv_work_t *req)
2053
2063
}
2054
2064
argv[1 ] = result;
2055
2065
}
2056
- exitAsyncAfterExecute:
2066
+ exitAsyncAfterExecute:
2057
2067
Local<Function> callback = Nan::New<Function>(executeBaton->cb );
2058
- executeBaton->cb .Reset ();
2059
2068
delete executeBaton;
2060
2069
Nan::MakeCallback ( Nan::GetCurrentContext ()->Global (), callback, 2 , argv );
2061
2070
if (tc.HasCaught ())
@@ -2546,6 +2555,33 @@ v8::Local<v8::Value> Connection::GetOutBindObject ( eBaton *executeBaton )
2546
2555
return scope.Escape (objectBinds);
2547
2556
}
2548
2557
2558
+
2559
+ /* ***************************************************************************/
2560
+ /* NAME
2561
+ * Connection::getConnectionBusyStatus
2562
+ *
2563
+ * DESCRIPTION
2564
+ * Checks whther connection is busy with database call or not using counters
2565
+ *
2566
+ * PARAMETERS
2567
+ * connection - connection object to check it's counters
2568
+ *
2569
+ * Note: Currently this function can be used only in Release () method
2570
+ */
2571
+ ConnectionBusyStatus Connection::getConnectionBusyStatus ( Connection *conn )
2572
+ {
2573
+ ConnectionBusyStatus connStatus = CONN_NOT_BUSY;
2574
+
2575
+ if ( conn->lobCount_ != 0 )
2576
+ connStatus = CONN_BUSY_LOB;
2577
+ else if ( conn->rsCount_ != 0 )
2578
+ connStatus = CONN_BUSY_RS;
2579
+ else if ( conn->dbCount_ != 1 ) // 1 for Release operaion itself
2580
+ connStatus = CONN_BUSY_DB;
2581
+
2582
+ return connStatus;
2583
+ }
2584
+
2549
2585
/* ****************************************************************************/
2550
2586
/*
2551
2587
DESCRIPTION
@@ -2560,26 +2596,55 @@ NAN_METHOD(Connection::Release)
2560
2596
Local<Function> callback;
2561
2597
Connection *connection;
2562
2598
NJS_GET_CALLBACK ( callback, info );
2599
+ ConnectionBusyStatus connStat;
2563
2600
2564
- eBaton* releaseBaton = new eBaton;
2565
- releaseBaton->cb .Reset (callback);
2566
-
2567
- NJS_CHECK_NUMBER_OF_ARGS ( releaseBaton->error , info, 1 , 1 , exitRelease );
2568
2601
connection = Nan::ObjectWrap::Unwrap<Connection>(info.This ());
2602
+ eBaton *releaseBaton = new eBaton ( connection->DBCount (), callback );
2569
2603
2604
+ NJS_CHECK_NUMBER_OF_ARGS ( releaseBaton->error , info, 1 , 1 , exitRelease );
2570
2605
NJS_CHECK_OBJECT_VALID3 (connection, releaseBaton->error , exitRelease);
2571
2606
if (!connection->isValid_ )
2572
2607
{
2573
2608
releaseBaton->error = NJSMessages::getErrorMsg ( errInvalidConnection );
2574
2609
goto exitRelease;
2575
2610
}
2611
+
2612
+
2613
+ // Check to see if database call is in progress
2614
+ connStat = getConnectionBusyStatus ( connection );
2615
+ switch ( connStat )
2616
+ {
2617
+ case CONN_NOT_BUSY:
2618
+ break ; // Nothing to do in this case
2619
+ case CONN_BUSY_LOB:
2620
+ releaseBaton->error = NJSMessages::getErrorMsg ( errBusyConnLOB );
2621
+ goto exitRelease;
2622
+ case CONN_BUSY_RS:
2623
+ releaseBaton->error = NJSMessages::getErrorMsg ( errBusyConnRS );
2624
+ goto exitRelease;
2625
+ case CONN_BUSY_DB:
2626
+ releaseBaton->error = NJSMessages::getErrorMsg ( errBusyConnDB );
2627
+ goto exitRelease;
2628
+
2629
+ default :
2630
+ break ;
2631
+ }
2632
+
2576
2633
connection->isValid_ = false ;
2577
2634
releaseBaton->dpiconn = connection->dpiconn_ ;
2578
2635
exitRelease:
2579
2636
releaseBaton->req .data = (void *) releaseBaton;
2580
2637
2581
- uv_queue_work (uv_default_loop (), &releaseBaton->req ,
2638
+ int status = uv_queue_work (uv_default_loop (), &releaseBaton->req ,
2582
2639
Async_Release, (uv_after_work_cb)Async_AfterRelease);
2640
+ // delete the Baton if uv_queue_work fails
2641
+ if ( status )
2642
+ {
2643
+ delete releaseBaton;
2644
+ string error = NJSMessages::getErrorMsg ( errInternalError,
2645
+ " uv_queue_work" , " Release" );
2646
+ NJS_SET_EXCEPTION (error.c_str (), error.length ());
2647
+ }
2583
2648
info.GetReturnValue ().SetUndefined ();
2584
2649
scope.Escape ( Nan::Undefined () );
2585
2650
}
@@ -2635,7 +2700,6 @@ void Connection::Async_AfterRelease(uv_work_t *req)
2635
2700
else
2636
2701
argv[0 ] = Nan::Undefined ();
2637
2702
Local<Function> callback = Nan::New<Function>(releaseBaton->cb );
2638
- releaseBaton->cb .Reset ();
2639
2703
delete releaseBaton;
2640
2704
Nan::MakeCallback ( Nan::GetCurrentContext ()->Global (),
2641
2705
callback, 1 , argv );
@@ -2660,11 +2724,10 @@ NAN_METHOD(Connection::Commit)
2660
2724
Connection *connection;
2661
2725
NJS_GET_CALLBACK ( callback, info );
2662
2726
2663
- eBaton* commitBaton = new eBaton;
2664
- commitBaton->cb .Reset ( callback );
2665
- NJS_CHECK_NUMBER_OF_ARGS ( commitBaton->error , info, 1 , 1 , exitCommit );
2666
2727
connection = Nan::ObjectWrap::Unwrap<Connection>(info.This ());
2728
+ eBaton *commitBaton = new eBaton ( connection->DBCount (), callback );
2667
2729
2730
+ NJS_CHECK_NUMBER_OF_ARGS ( commitBaton->error , info, 1 , 1 , exitCommit );
2668
2731
NJS_CHECK_OBJECT_VALID3 ( connection, commitBaton->error , exitCommit );
2669
2732
if (!connection->isValid_ )
2670
2733
{
@@ -2675,8 +2738,16 @@ NAN_METHOD(Connection::Commit)
2675
2738
exitCommit:
2676
2739
commitBaton->req .data = (void *) commitBaton;
2677
2740
2678
- uv_queue_work (uv_default_loop (), &commitBaton->req ,
2741
+ int status = uv_queue_work (uv_default_loop (), &commitBaton->req ,
2679
2742
Async_Commit, (uv_after_work_cb)Async_AfterCommit);
2743
+ // delete the Baton if uv_queue_work fails
2744
+ if ( status )
2745
+ {
2746
+ delete commitBaton;
2747
+ string error = NJSMessages::getErrorMsg ( errInternalError,
2748
+ " uv_queue_work" , " Commit" );
2749
+ NJS_SET_EXCEPTION (error.c_str (), error.length ());
2750
+ }
2680
2751
2681
2752
info.GetReturnValue ().SetUndefined ();
2682
2753
}
@@ -2732,14 +2803,15 @@ void Connection::Async_AfterCommit (uv_work_t *req)
2732
2803
else
2733
2804
argv[0 ] = Nan::Undefined ();
2734
2805
2806
+ Local<Function> callback = Nan::New<Function>(commitBaton->cb );
2807
+ delete commitBaton;
2735
2808
Nan::MakeCallback ( Nan::GetCurrentContext ()->Global (),
2736
- Nan::New<Function>(commitBaton->cb ), 1 , argv );
2809
+ callback, 1 , argv );
2810
+
2737
2811
if (tc.HasCaught ())
2738
2812
{
2739
2813
Nan::FatalException (tc);
2740
2814
}
2741
- commitBaton->cb .Reset ();
2742
- delete commitBaton;
2743
2815
}
2744
2816
2745
2817
/* ****************************************************************************/
@@ -2756,10 +2828,9 @@ NAN_METHOD(Connection::Rollback)
2756
2828
Connection *connection;
2757
2829
NJS_GET_CALLBACK ( callback, info );
2758
2830
2759
- eBaton* rollbackBaton = new eBaton;
2760
- rollbackBaton->cb .Reset ( callback );
2761
- NJS_CHECK_NUMBER_OF_ARGS ( rollbackBaton->error , info, 1 , 1 , exitRollback );
2762
2831
connection = Nan::ObjectWrap::Unwrap<Connection>(info.This ());
2832
+ eBaton *rollbackBaton = new eBaton ( connection->DBCount (), callback );
2833
+ NJS_CHECK_NUMBER_OF_ARGS ( rollbackBaton->error , info, 1 , 1 , exitRollback );
2763
2834
NJS_CHECK_OBJECT_VALID3 ( connection, rollbackBaton->error , exitRollback );
2764
2835
2765
2836
if (!connection->isValid_ )
@@ -2770,8 +2841,16 @@ NAN_METHOD(Connection::Rollback)
2770
2841
rollbackBaton->dpiconn = connection->dpiconn_ ;
2771
2842
exitRollback:
2772
2843
rollbackBaton->req .data = (void *) rollbackBaton;
2773
- uv_queue_work (uv_default_loop (), &rollbackBaton->req ,
2774
- Async_Rollback, (uv_after_work_cb)Async_AfterRollback);
2844
+ int status = uv_queue_work (uv_default_loop (), &rollbackBaton->req ,
2845
+ Async_Rollback, (uv_after_work_cb)Async_AfterRollback);
2846
+ // delete the Baton if uv_queue_work fails
2847
+ if ( status )
2848
+ {
2849
+ delete rollbackBaton;
2850
+ string error = NJSMessages::getErrorMsg ( errInternalError,
2851
+ " uv_queue_work" , " Rollback" );
2852
+ NJS_SET_EXCEPTION (error.c_str (), error.length ());
2853
+ }
2775
2854
info.GetReturnValue ().SetUndefined ();
2776
2855
}
2777
2856
@@ -2826,14 +2905,14 @@ void Connection::Async_AfterRollback(uv_work_t *req)
2826
2905
else
2827
2906
argv[0 ] = Nan::Undefined ();
2828
2907
2908
+ Local<Function> callback = Nan::New<Function>(rollbackBaton->cb );
2909
+ delete rollbackBaton;
2829
2910
Nan::MakeCallback ( Nan::GetCurrentContext ()->Global (),
2830
- Nan::New<Function>(rollbackBaton-> cb ) , 1 , argv );
2911
+ callback , 1 , argv );
2831
2912
if (tc.HasCaught ())
2832
2913
{
2833
2914
Nan::FatalException (tc);
2834
2915
}
2835
- rollbackBaton->cb .Reset ();
2836
- delete rollbackBaton;
2837
2916
}
2838
2917
2839
2918
/* ****************************************************************************/
@@ -2850,11 +2929,10 @@ NAN_METHOD(Connection::Break)
2850
2929
Connection *connection;
2851
2930
NJS_GET_CALLBACK ( callback, info );
2852
2931
2853
- eBaton* breakBaton = new eBaton;
2854
- breakBaton->cb .Reset ( callback );
2855
- NJS_CHECK_NUMBER_OF_ARGS ( breakBaton->error , info, 1 , 1 , exitBreak );
2856
2932
connection = Nan::ObjectWrap::Unwrap<Connection>(info.This ());
2933
+ eBaton *breakBaton = new eBaton ( connection->DBCount (), callback );
2857
2934
2935
+ NJS_CHECK_NUMBER_OF_ARGS ( breakBaton->error , info, 1 , 1 , exitBreak );
2858
2936
NJS_CHECK_OBJECT_VALID3 ( connection, breakBaton->error , exitBreak );
2859
2937
2860
2938
if (!connection->isValid_ )
@@ -2866,8 +2944,16 @@ NAN_METHOD(Connection::Break)
2866
2944
exitBreak:
2867
2945
breakBaton->req .data = (void *) breakBaton;
2868
2946
2869
- uv_queue_work (uv_default_loop (), &breakBaton->req ,
2947
+ int status = uv_queue_work (uv_default_loop (), &breakBaton->req ,
2870
2948
Async_Break, (uv_after_work_cb)Async_AfterBreak);
2949
+ // delete the Baton if uv_queue_work fails
2950
+ if ( status )
2951
+ {
2952
+ delete breakBaton;
2953
+ string error = NJSMessages::getErrorMsg ( errInternalError,
2954
+ " uv_queue_work" , " Break" );
2955
+ NJS_SET_EXCEPTION (error.c_str (), error.length ());
2956
+ }
2871
2957
2872
2958
info.GetReturnValue ().SetUndefined ();
2873
2959
}
@@ -2923,14 +3009,14 @@ void Connection::Async_AfterBreak (uv_work_t *req)
2923
3009
argv[0 ] = v8::Exception::Error (Nan::New<v8::String>((breakBaton->error ).c_str ()).ToLocalChecked ());
2924
3010
else
2925
3011
argv[0 ] = Nan::Undefined ();
3012
+ Local<Function> callback = Nan::New<Function>(breakBaton->cb );
3013
+ delete breakBaton;
2926
3014
Nan::MakeCallback ( Nan::GetCurrentContext ()->Global (),
2927
- Nan::New<Function>(breakBaton-> cb ) , 1 , argv );
3015
+ callback , 1 , argv );
2928
3016
if (tc.HasCaught ())
2929
3017
{
2930
3018
Nan::FatalException (tc);
2931
3019
}
2932
- breakBaton->cb .Reset ();
2933
- delete breakBaton;
2934
3020
}
2935
3021
2936
3022
/* ***************************************************************************/
0 commit comments