Skip to content

Commit b97a5dd

Browse files
author
bimalkjha
committed
Merge branch 'qpresley-fixLocking' removing uv_locks.
2 parents 2501b28 + 46fdffe commit b97a5dd

9 files changed

+348
-426
lines changed

src/odbc.cpp

+2-22
Original file line numberDiff line numberDiff line change
@@ -104,12 +104,8 @@ ODBC::~ODBC() {
104104
void ODBC::Free() {
105105
DEBUG_PRINTF("ODBC::Free\n");
106106
if (m_hEnv) {
107-
uv_mutex_lock(&ODBC::g_odbcMutex);
108-
if (m_hEnv) {
109-
SQLFreeHandle(SQL_HANDLE_ENV, m_hEnv);
110-
m_hEnv = (SQLHENV)NULL;
111-
}
112-
uv_mutex_unlock(&ODBC::g_odbcMutex);
107+
SQLFreeHandle(SQL_HANDLE_ENV, m_hEnv);
108+
m_hEnv = (SQLHENV)NULL;
113109
}
114110
}
115111

@@ -122,13 +118,9 @@ NAN_METHOD(ODBC::New) {
122118

123119
dbo->m_hEnv = (SQLHENV)NULL;
124120

125-
uv_mutex_lock(&ODBC::g_odbcMutex);
126-
127121
// Initialize the Environment handle
128122
int ret = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &dbo->m_hEnv);
129123

130-
uv_mutex_unlock(&ODBC::g_odbcMutex);
131-
132124
if (!SQL_SUCCEEDED(ret)) {
133125
DEBUG_PRINTF("ODBC::New - ERROR ALLOCATING ENV HANDLE!!\n");
134126

@@ -189,12 +181,8 @@ void ODBC::UV_CreateConnection(uv_work_t* req) {
189181
//get our work data
190182
create_connection_work_data* data = (create_connection_work_data *)(req->data);
191183

192-
uv_mutex_lock(&ODBC::g_odbcMutex);
193-
194184
//allocate a new connection handle
195185
data->result = SQLAllocHandle(SQL_HANDLE_DBC, data->dbo->m_hEnv, &data->hDBC);
196-
197-
uv_mutex_unlock(&ODBC::g_odbcMutex);
198186
}
199187

200188
void ODBC::UV_AfterCreateConnection(uv_work_t* req, int status) {
@@ -249,17 +237,13 @@ NAN_METHOD(ODBC::CreateConnectionSync) {
249237

250238
SQLHDBC hDBC;
251239

252-
uv_mutex_lock(&ODBC::g_odbcMutex);
253-
254240
//allocate a new connection handle
255241
SQLRETURN ret = SQLAllocHandle(SQL_HANDLE_DBC, dbo->m_hEnv, &hDBC);
256242

257243
if (!SQL_SUCCEEDED(ret)) {
258244
//TODO: do something!
259245
}
260246

261-
uv_mutex_unlock(&ODBC::g_odbcMutex);
262-
263247
Local<Value> params[2];
264248
params[0] = Nan::New<External>((void*)(intptr_t)dbo->m_hEnv);
265249
params[1] = Nan::New<External>((void*)(intptr_t)hDBC);
@@ -783,7 +767,6 @@ Local<Object> ODBC::GetRecordTuple ( SQLHSTMT hStmt, Column* columns,
783767

784768
Local<Object> tuple = Nan::New<Object>();
785769

786-
//uv_mutex_lock(&ODBC::g_odbcMutex); Commented to fix issue #211.
787770
for(int i = 0; i < *colCount; i++) {
788771
#ifdef UNICODE
789772
tuple->Set( Nan::New((uint16_t *) columns[i].name).ToLocalChecked(),
@@ -793,7 +776,6 @@ Local<Object> ODBC::GetRecordTuple ( SQLHSTMT hStmt, Column* columns,
793776
GetColumnValue( hStmt, columns[i], buffer, bufferLength));
794777
#endif
795778
}
796-
//uv_mutex_unlock(&ODBC::g_odbcMutex);
797779

798780
return scope.Escape(tuple);
799781
}
@@ -809,12 +791,10 @@ Local<Value> ODBC::GetRecordArray ( SQLHSTMT hStmt, Column* columns,
809791

810792
Local<Array> array = Nan::New<Array>();
811793

812-
//uv_mutex_lock(&ODBC::g_odbcMutex); Commented to fix issue #211.
813794
for(int i = 0; i < *colCount; i++) {
814795
array->Set( Nan::New(i),
815796
GetColumnValue( hStmt, columns[i], buffer, bufferLength));
816797
}
817-
//uv_mutex_unlock(&ODBC::g_odbcMutex);
818798

819799
return scope.Escape(array);
820800
}

src/odbc_connection.cpp

+3-45
Original file line numberDiff line numberDiff line change
@@ -90,15 +90,9 @@ ODBCConnection::~ODBCConnection() {
9090
void ODBCConnection::Free() {
9191
DEBUG_PRINTF("ODBCConnection::Free m_hDBC = %i \n", m_hDBC);
9292
if (m_hDBC) {
93-
uv_mutex_lock(&ODBC::g_odbcMutex);
94-
95-
if (m_hDBC) {
96-
SQLDisconnect(m_hDBC);
97-
SQLFreeHandle(SQL_HANDLE_DBC, m_hDBC);
98-
m_hDBC = (SQLHDBC)NULL;
99-
}
100-
101-
uv_mutex_unlock(&ODBC::g_odbcMutex);
93+
SQLDisconnect(m_hDBC);
94+
SQLFreeHandle(SQL_HANDLE_DBC, m_hDBC);
95+
m_hDBC = (SQLHDBC)NULL;
10296
}
10397
}
10498

@@ -214,8 +208,6 @@ void ODBCConnection::UV_Open(uv_work_t* req) {
214208

215209
DEBUG_PRINTF("ODBCConnection::UV_Open : connectTimeout=%i \n", *&(self->connectTimeout));
216210

217-
uv_mutex_lock(&ODBC::g_odbcMutex);
218-
219211
int timeOut = self->connectTimeout;
220212

221213
if (timeOut > 0) {
@@ -262,8 +254,6 @@ void ODBCConnection::UV_Open(uv_work_t* req) {
262254
hStmt = (SQLHSTMT)NULL;
263255
}
264256

265-
uv_mutex_unlock(&ODBC::g_odbcMutex);
266-
267257
data->result = ret;
268258
}
269259

@@ -343,8 +333,6 @@ NAN_METHOD(ODBCConnection::OpenSync) {
343333
connection->WriteUtf8(connectionString);
344334
#endif
345335

346-
uv_mutex_lock(&ODBC::g_odbcMutex);
347-
348336
int timeOut = conn->connectTimeout;
349337

350338
if (timeOut > 0) {
@@ -404,8 +392,6 @@ NAN_METHOD(ODBCConnection::OpenSync) {
404392
#endif*/
405393
}
406394

407-
uv_mutex_unlock(&ODBC::g_odbcMutex);
408-
409395
free(connectionString);
410396

411397
if (err) {
@@ -545,15 +531,11 @@ NAN_METHOD(ODBCConnection::CreateStatementSync) {
545531

546532
SQLHSTMT hSTMT;
547533

548-
uv_mutex_lock(&ODBC::g_odbcMutex);
549-
550534
SQLAllocHandle(
551535
SQL_HANDLE_STMT,
552536
conn->m_hDBC,
553537
&hSTMT);
554538

555-
uv_mutex_unlock(&ODBC::g_odbcMutex);
556-
557539
Local<Value> params[3];
558540
params[0] = Nan::New<External>((void*)(intptr_t)conn->m_hENV);
559541
params[1] = Nan::New<External>((void*)(intptr_t)conn->m_hDBC);
@@ -614,15 +596,11 @@ void ODBCConnection::UV_CreateStatement(uv_work_t* req) {
614596
data->hSTMT
615597
);
616598

617-
uv_mutex_lock(&ODBC::g_odbcMutex);
618-
619599
//allocate a new statment handle
620600
SQLAllocHandle( SQL_HANDLE_STMT,
621601
data->conn->m_hDBC,
622602
&data->hSTMT);
623603

624-
uv_mutex_unlock(&ODBC::g_odbcMutex);
625-
626604
DEBUG_PRINTF("ODBCConnection::UV_CreateStatement m_hDBC=%X m_hDBC=%X m_hSTMT=%X\n",
627605
data->conn->m_hENV,
628606
data->conn->m_hDBC,
@@ -808,8 +786,6 @@ void ODBCConnection::UV_Query(uv_work_t* req) {
808786

809787
SQLRETURN ret;
810788

811-
uv_mutex_lock(&ODBC::g_odbcMutex);
812-
813789
//allocate a new statment handle
814790
SQLAllocHandle( SQL_HANDLE_STMT,
815791
data->conn->m_hDBC,
@@ -839,7 +815,6 @@ void ODBCConnection::UV_Query(uv_work_t* req) {
839815
}
840816
}
841817
}
842-
uv_mutex_unlock(&ODBC::g_odbcMutex);
843818

844819
// this will be checked later in UV_AfterQuery
845820
data->result = ret;
@@ -873,11 +848,9 @@ void ODBCConnection::UV_AfterQuery(uv_work_t* req, int status) {
873848
//this means we should release the handle now and call back
874849
//with Nan::True()
875850

876-
uv_mutex_lock(&ODBC::g_odbcMutex);
877851
DEBUG_PRINTF("Going to free handle.\n");
878852
SQLFreeHandle(SQL_HANDLE_STMT, data->hSTMT);
879853
data->hSTMT = (SQLHSTMT)NULL;
880-
uv_mutex_unlock(&ODBC::g_odbcMutex);
881854
DEBUG_PRINTF("Handle freed.\n");
882855

883856
Local<Value> info[2];
@@ -1047,8 +1020,6 @@ NAN_METHOD(ODBCConnection::QuerySync) {
10471020
}
10481021
//Done checking arguments
10491022

1050-
uv_mutex_lock(&ODBC::g_odbcMutex);
1051-
10521023
//allocate a new statment handle
10531024
ret = SQLAllocHandle( SQL_HANDLE_STMT,
10541025
conn->m_hDBC,
@@ -1090,7 +1061,6 @@ NAN_METHOD(ODBCConnection::QuerySync) {
10901061
FREE_PARAMS( params, paramCount ) ;
10911062
}
10921063

1093-
uv_mutex_unlock(&ODBC::g_odbcMutex);
10941064
delete sql;
10951065

10961066
//check to see if there was an error during execution
@@ -1101,20 +1071,16 @@ NAN_METHOD(ODBCConnection::QuerySync) {
11011071
hSTMT,
11021072
(char *) "[node-ibm_db] Error in ODBCConnection::QuerySync while executing query."
11031073
);
1104-
uv_mutex_lock(&ODBC::g_odbcMutex);
11051074
SQLFreeHandle(SQL_HANDLE_STMT, hSTMT);
11061075
hSTMT = (SQLHSTMT)NULL;
1107-
uv_mutex_unlock(&ODBC::g_odbcMutex);
11081076
Nan::ThrowError(err);
11091077
return;
11101078
}
11111079
else if (noResultObject) {
11121080
//if there is not result object requested then
11131081
//we must destroy the STMT ourselves.
1114-
uv_mutex_lock(&ODBC::g_odbcMutex);
11151082
SQLFreeHandle(SQL_HANDLE_STMT, hSTMT);
11161083
hSTMT = (SQLHSTMT)NULL;
1117-
uv_mutex_unlock(&ODBC::g_odbcMutex);
11181084

11191085
if( outParamCount ) // Its a CALL stmt with OUT params.
11201086
{ // Return an array with outparams as second element.
@@ -1244,12 +1210,8 @@ NAN_METHOD(ODBCConnection::Tables) {
12441210
void ODBCConnection::UV_Tables(uv_work_t* req) {
12451211
query_work_data* data = (query_work_data *)(req->data);
12461212

1247-
uv_mutex_lock(&ODBC::g_odbcMutex);
1248-
12491213
SQLAllocHandle(SQL_HANDLE_STMT, data->conn->m_hDBC, &data->hSTMT );
12501214

1251-
uv_mutex_unlock(&ODBC::g_odbcMutex);
1252-
12531215
SQLRETURN ret = SQLTables(
12541216
data->hSTMT,
12551217
(SQLTCHAR *) data->catalog, SQL_NTS,
@@ -1359,12 +1321,8 @@ NAN_METHOD(ODBCConnection::Columns) {
13591321
void ODBCConnection::UV_Columns(uv_work_t* req) {
13601322
query_work_data* data = (query_work_data *)(req->data);
13611323

1362-
uv_mutex_lock(&ODBC::g_odbcMutex);
1363-
13641324
SQLAllocHandle(SQL_HANDLE_STMT, data->conn->m_hDBC, &data->hSTMT );
13651325

1366-
uv_mutex_unlock(&ODBC::g_odbcMutex);
1367-
13681326
SQLRETURN ret = SQLColumns(
13691327
data->hSTMT,
13701328
(SQLTCHAR *) data->catalog, SQL_NTS,

src/odbc_result.cpp

+1-12
Original file line numberDiff line numberDiff line change
@@ -74,11 +74,8 @@ void ODBCResult::Free() {
7474
DEBUG_PRINTF("ODBCResult::Free m_hSTMT=%X m_canFreeHandle=%X\n", m_hSTMT, m_canFreeHandle);
7575

7676
if (m_hSTMT && m_canFreeHandle) {
77-
//uv_mutex_lock(&ODBC::g_odbcMutex); Commented to fix issue #211
78-
if(m_hSTMT)
79-
SQLFreeHandle( SQL_HANDLE_STMT, m_hSTMT);
77+
SQLFreeHandle( SQL_HANDLE_STMT, m_hSTMT);
8078
m_hSTMT = (SQLHSTMT)NULL;
81-
//uv_mutex_unlock(&ODBC::g_odbcMutex);
8279
}
8380

8481
if (bufferLength > 0) {
@@ -697,20 +694,12 @@ NAN_METHOD(ODBCResult::CloseSync) {
697694
}
698695
else if (closeOption == SQL_DESTROY && !result->m_canFreeHandle) {
699696
//We technically can't free the handle so, we'll SQL_CLOSE
700-
uv_mutex_lock(&ODBC::g_odbcMutex);
701-
702697
SQLFreeStmt(result->m_hSTMT, SQL_CLOSE);
703698
result->m_canFreeHandle = new bool(true);
704-
705-
uv_mutex_unlock(&ODBC::g_odbcMutex);
706699
}
707700
else {
708-
uv_mutex_lock(&ODBC::g_odbcMutex);
709-
710701
SQLFreeStmt(result->m_hSTMT, closeOption);
711702
result->m_canFreeHandle = new bool(true);
712-
713-
uv_mutex_unlock(&ODBC::g_odbcMutex);
714703
}
715704

716705
info.GetReturnValue().Set(Nan::True());

src/odbc_statement.cpp

-10
Original file line numberDiff line numberDiff line change
@@ -81,10 +81,8 @@ void ODBCStatement::Free() {
8181
}
8282

8383
if (m_hSTMT) {
84-
uv_mutex_lock(&ODBC::g_odbcMutex);
8584
SQLFreeHandle(SQL_HANDLE_STMT, m_hSTMT);
8685
m_hSTMT = (SQLHSTMT)NULL;
87-
uv_mutex_unlock(&ODBC::g_odbcMutex);
8886
}
8987

9088
if (bufferLength > 0) {
@@ -376,9 +374,7 @@ void ODBCStatement::UV_AfterExecuteNonQuery(uv_work_t* req, int status) {
376374
rowCount = 0;
377375
}
378376

379-
uv_mutex_lock(&ODBC::g_odbcMutex);
380377
SQLFreeStmt(self->m_hSTMT, SQL_CLOSE);
381-
uv_mutex_unlock(&ODBC::g_odbcMutex);
382378

383379
Local<Value> info[2];
384380

@@ -433,9 +429,7 @@ NAN_METHOD(ODBCStatement::ExecuteNonQuerySync) {
433429
rowCount = 0;
434430
}
435431

436-
uv_mutex_lock(&ODBC::g_odbcMutex);
437432
SQLFreeStmt(stmt->m_hSTMT, SQL_CLOSE);
438-
uv_mutex_unlock(&ODBC::g_odbcMutex);
439433

440434
info.GetReturnValue().Set(Nan::New<Number>(rowCount));
441435
}
@@ -953,11 +947,7 @@ NAN_METHOD(ODBCStatement::CloseSync) {
953947
stmt->Free();
954948
}
955949
else {
956-
uv_mutex_lock(&ODBC::g_odbcMutex);
957-
958950
SQLFreeStmt(stmt->m_hSTMT, closeOption);
959-
960-
uv_mutex_unlock(&ODBC::g_odbcMutex);
961951
}
962952

963953
info.GetReturnValue().Set(Nan::True());

test/common.js

+7-7
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,13 @@ try {
88
}
99
catch (e) {
1010
exports.connectionObject = {
11-
DRIVER : "{DB2 ODBC Driver}",
12-
DATABASE : "SAMPLE",
13-
HOSTNAME : "localhost",
14-
UID : "db2admin",
15-
PWD : "db2admin",
16-
PORT : "50000",
17-
PROTOCOL : "TCPIP"
11+
DRIVER : "{DB2 ODBC Driver}",
12+
DATABASE : "SAMPLE",
13+
HOSTNAME : "localhost",
14+
UID : "db2admin",
15+
PWD : "db2admin",
16+
PORT : "50000",
17+
PROTOCOL : "TCPIP"
1818
};
1919
}
2020

0 commit comments

Comments
 (0)