Skip to content

Commit 74270b0

Browse files
pangaLeonardo Zanivan
andauthored
feat: add TransactionStatus to Connection (#123)
Co-authored-by: Leonardo Zanivan <leo.zanivan@okta.com>
1 parent d5aa00c commit 74270b0

File tree

5 files changed

+81
-0
lines changed

5 files changed

+81
-0
lines changed

index.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,12 @@ PQ.prototype.serverVersion = function () {
6262
return this.$serverVersion();
6363
};
6464

65+
// returns the current in-transaction status of the server
66+
// 0=IDLE, 1=ACTIVE, 2=INTRANS, 3=INERROR, 4=UNKNOWN
67+
PQ.prototype.transactionStatus = function () {
68+
return this.$transactionStatus();
69+
};
70+
6571
//finishes the connection & closes it
6672
PQ.prototype.finish = function () {
6773
this.connected = false;

src/addon.cc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ NAN_MODULE_INIT(InitAddon) {
1515
Nan::SetPrototypeMethod(tpl, "$resultErrorFields", Connection::ResultErrorFields);
1616
Nan::SetPrototypeMethod(tpl, "$socket", Connection::Socket);
1717
Nan::SetPrototypeMethod(tpl, "$serverVersion", Connection::ServerVersion);
18+
Nan::SetPrototypeMethod(tpl, "$transactionStatus", Connection::TransactionStatus);
1819

1920
//sync query functions
2021
Nan::SetPrototypeMethod(tpl, "$exec", Connection::Exec);

src/connection.cc

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,13 @@ NAN_METHOD(Connection::ServerVersion) {
9191
info.GetReturnValue().Set(PQserverVersion(self->pq));
9292
}
9393

94+
NAN_METHOD(Connection::TransactionStatus) {
95+
TRACE("Connection::TransactionStatus");
96+
Connection* self = NODE_THIS();
97+
int status = PQtransactionStatus(self->pq);
98+
info.GetReturnValue().Set(status);
99+
}
100+
94101

95102
NAN_METHOD(Connection::Exec) {
96103
Connection *self = NODE_THIS();

src/connection.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ class Connection : public Nan::ObjectWrap {
5656
static NAN_METHOD(PutCopyEnd);
5757
static NAN_METHOD(GetCopyData);
5858
static NAN_METHOD(Cancel);
59+
static NAN_METHOD(TransactionStatus);
5960
#ifdef PIPELINE_MODE_SUPPORTED
6061
static NAN_METHOD(EnterPipelineMode);
6162
static NAN_METHOD(ExitPipelineMode);

test/transaction-status.js

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
var Libpq = require('../');
2+
var assert = require('assert');
3+
4+
describe('transactionStatus', function() {
5+
6+
it('returns PQTRANS_UNKNOWN when not connected', function() {
7+
var pq = new Libpq();
8+
assert.strictEqual(pq.transactionStatus(), 4);
9+
});
10+
11+
it('returns PQTRANS_IDLE after connecting', function() {
12+
var pq = new Libpq();
13+
pq.connectSync();
14+
assert.strictEqual(pq.transactionStatus(), 0);
15+
pq.finish();
16+
});
17+
18+
it('returns PQTRANS_IDLE after a simple query', function() {
19+
var pq = new Libpq();
20+
pq.connectSync();
21+
pq.exec('SELECT 1');
22+
assert.strictEqual(pq.transactionStatus(), 0);
23+
pq.finish();
24+
});
25+
26+
it('returns PQTRANS_INTRANS inside a transaction', function() {
27+
var pq = new Libpq();
28+
pq.connectSync();
29+
pq.exec('BEGIN');
30+
assert.strictEqual(pq.transactionStatus(), 2);
31+
pq.exec('ROLLBACK');
32+
pq.finish();
33+
});
34+
35+
it('returns PQTRANS_IDLE after COMMIT', function() {
36+
var pq = new Libpq();
37+
pq.connectSync();
38+
pq.exec('BEGIN');
39+
assert.strictEqual(pq.transactionStatus(), 2);
40+
pq.exec('COMMIT');
41+
assert.strictEqual(pq.transactionStatus(), 0);
42+
pq.finish();
43+
});
44+
45+
it('returns PQTRANS_INERROR after a failed query in a transaction', function() {
46+
var pq = new Libpq();
47+
pq.connectSync();
48+
pq.exec('BEGIN');
49+
pq.exec('SELECT FROM nonexistent_table_xyz');
50+
assert.strictEqual(pq.transactionStatus(), 3);
51+
pq.exec('ROLLBACK');
52+
pq.finish();
53+
});
54+
55+
it('returns PQTRANS_IDLE after ROLLBACK from error state', function() {
56+
var pq = new Libpq();
57+
pq.connectSync();
58+
pq.exec('BEGIN');
59+
pq.exec('SELECT FROM nonexistent_table_xyz');
60+
assert.strictEqual(pq.transactionStatus(), 3);
61+
pq.exec('ROLLBACK');
62+
assert.strictEqual(pq.transactionStatus(), 0);
63+
pq.finish();
64+
});
65+
66+
});

0 commit comments

Comments
 (0)