Skip to content

Commit ff27bb9

Browse files
committed
Added support for deliveryMode parameter in deqOptions
1 parent aa6d4db commit ff27bb9

File tree

5 files changed

+142
-3
lines changed

5 files changed

+142
-3
lines changed

doc/src/release_notes.rst

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,9 @@ Common Changes
2929
#) Fixed bug that threw empty error message when NaN values were used
3030
in JSON binds.
3131

32+
#) Added support for :attr:`deqOptions.deliveryMode` in
33+
:ref:`Advanced Queuing <aq>`.
34+
3235
Thin Mode Changes
3336
+++++++++++++++++
3437

lib/aqDeqOptions.js

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,19 @@ class AqDeqOptions {
7474
this._impl.setCorrelation(value);
7575
}
7676

77+
//---------------------------------------------------------------------------
78+
// deliveryMode
79+
//
80+
// Property for the deliveryMode to use for dequeuing messages.
81+
//---------------------------------------------------------------------------
82+
set deliveryMode(value) {
83+
errors.assertPropValue(value === constants.AQ_MSG_DELIV_MODE_PERSISTENT ||
84+
value === constants.AQ_MSG_DELIV_MODE_BUFFERED ||
85+
value === constants.AQ_MSG_DELIV_MODE_PERSISTENT_OR_BUFFERED,
86+
"deliveryMode");
87+
this._impl.setDeliveryMode(value);
88+
}
89+
7790
//---------------------------------------------------------------------------
7891
// mode
7992
//

src/njsAqDeqOptions.c

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ NJS_NAPI_METHOD_DECL_SYNC(njsAqDeqOptions_getWait);
4545
NJS_NAPI_METHOD_DECL_SYNC(njsAqDeqOptions_setCondition);
4646
NJS_NAPI_METHOD_DECL_SYNC(njsAqDeqOptions_setConsumerName);
4747
NJS_NAPI_METHOD_DECL_SYNC(njsAqDeqOptions_setCorrelation);
48+
NJS_NAPI_METHOD_DECL_SYNC(njsAqDeqOptions_setDeliveryMode);
4849
NJS_NAPI_METHOD_DECL_SYNC(njsAqDeqOptions_setMode);
4950
NJS_NAPI_METHOD_DECL_SYNC(njsAqDeqOptions_setMsgId);
5051
NJS_NAPI_METHOD_DECL_SYNC(njsAqDeqOptions_setNavigation);
@@ -81,6 +82,8 @@ static const napi_property_descriptor njsClassProperties[] = {
8182
NULL, napi_enumerable, NULL },
8283
{ "setCorrelation", NULL, njsAqDeqOptions_setCorrelation, NULL, NULL, NULL,
8384
napi_enumerable, NULL },
85+
{ "setDeliveryMode", NULL, njsAqDeqOptions_setDeliveryMode, NULL, NULL, NULL,
86+
napi_enumerable, NULL },
8487
{ "setMode", NULL, njsAqDeqOptions_setMode, NULL, NULL, NULL,
8588
napi_enumerable, NULL },
8689
{ "setMsgId", NULL, njsAqDeqOptions_setMsgId, NULL, NULL, NULL,
@@ -309,6 +312,22 @@ NJS_NAPI_METHOD_IMPL_SYNC(njsAqDeqOptions_setCorrelation, 1, NULL)
309312
}
310313

311314

315+
//-----------------------------------------------------------------------------
316+
// njsAqDeqOptions_setDeliveryMode()
317+
// Set accessor of "deliveryMode" property.
318+
//-----------------------------------------------------------------------------
319+
NJS_NAPI_METHOD_IMPL_SYNC(njsAqDeqOptions_setDeliveryMode, 1, NULL)
320+
{
321+
njsAqDeqOptions *options = (njsAqDeqOptions*) callingInstance;
322+
uint32_t value;
323+
324+
NJS_CHECK_NAPI(env, napi_get_value_uint32(env, args[0], &value))
325+
if (dpiDeqOptions_setDeliveryMode(options->handle, (uint16_t) value) < 0)
326+
return njsUtils_throwErrorDPI(env, globals);
327+
return true;
328+
}
329+
330+
312331
//-----------------------------------------------------------------------------
313332
// njsAqDeqOptions_setMode()
314333
// Set accessor of "mode" property.

test/aq1.js

Lines changed: 103 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ describe('217. aq1.js', function() {
4646

4747
const rawQueueName = "NODB_RAW_QUEUE";
4848
const RAW_TABLE = 'NODB_RAW_QUEUE_TAB';
49+
let credential;
4950

5051
before(async function() {
5152
if (!dbConfig.test.DBA_PRIVILEGE || oracledb.thin) {
@@ -56,7 +57,7 @@ describe('217. aq1.js', function() {
5657
this.skip();
5758
} else {
5859
await testsUtil.createAQtestUser(AQ_USER, AQ_USER_PWD);
59-
const credential = {
60+
credential = {
6061
user: AQ_USER,
6162
password: AQ_USER_PWD,
6263
connectString: dbConfig.connectString
@@ -251,7 +252,7 @@ describe('217. aq1.js', function() {
251252
const message = {
252253
payload: messageString // the message itself
253254
};
254-
const myMsg = await queue1.enqOne(message);
255+
await queue1.enqOne(message);
255256

256257
// Get the deliveryMode attribute in enqOptions
257258
assert.strictEqual(queue1.enqOptions.deliveryMode,
@@ -265,7 +266,7 @@ describe('217. aq1.js', function() {
265266
visibility: oracledb.AQ_VISIBILITY_IMMEDIATE, // Change the visibility so that no explicit commit is required
266267
}
267268
);
268-
queue2.deqOptions.deliveryMode = myMsg.deliveryMode;
269+
queue2.deqOptions.deliveryMode = oracledb.AQ_MSG_DELIV_MODE_PERSISTENT;
269270
const msg = await queue2.deqOne();
270271
if (msg) {
271272
assert.strictEqual(msg.payload.toString(), messageString);
@@ -499,4 +500,103 @@ describe('217. aq1.js', function() {
499500
assert.strictEqual(msg.payload.length, largeMessage.length);
500501
assert.strictEqual(msg.payload.toString(), largeMessage.toString());
501502
}); // 217.17
503+
504+
it('217.18 test enqueue/dequeue with BUFFERED delivery mode', async function() {
505+
const queue = await conn.getQueue(rawQueueName);
506+
queue.enqOptions.visibility = oracledb.AQ_VISIBILITY_IMMEDIATE;
507+
queue.enqOptions.deliveryMode = oracledb.AQ_MSG_DELIV_MODE_BUFFERED;
508+
509+
const messageString = 'This is a buffered message';
510+
await queue.enqOne(messageString);
511+
512+
const conn2 = await oracledb.getConnection(credential);
513+
const queue2 = await conn2.getQueue(rawQueueName);
514+
queue2.deqOptions.visibility = oracledb.AQ_VISIBILITY_IMMEDIATE;
515+
queue2.deqOptions.deliveryMode = oracledb.AQ_MSG_DELIV_MODE_BUFFERED;
516+
517+
const msg = await queue2.deqOne();
518+
await conn2.close();
519+
520+
assert(msg);
521+
assert.strictEqual(msg.payload.toString(), messageString);
522+
assert.strictEqual(msg.deliveryMode, oracledb.AQ_MSG_DELIV_MODE_BUFFERED);
523+
}); // 217.18
524+
525+
it('217.19 test enqueue/dequeue with PERSISTENT delivery mode', async function() {
526+
const queue = await conn.getQueue(rawQueueName);
527+
queue.enqOptions.visibility = oracledb.AQ_VISIBILITY_IMMEDIATE;
528+
queue.enqOptions.deliveryMode = oracledb.AQ_MSG_DELIV_MODE_PERSISTENT;
529+
530+
const messageString = 'This is a persistent message';
531+
await queue.enqOne(messageString);
532+
533+
const conn2 = await oracledb.getConnection(credential);
534+
const queue2 = await conn2.getQueue(rawQueueName);
535+
queue2.deqOptions.visibility = oracledb.AQ_VISIBILITY_IMMEDIATE;
536+
queue2.deqOptions.deliveryMode = oracledb.AQ_MSG_DELIV_MODE_PERSISTENT;
537+
538+
const msg = await queue2.deqOne();
539+
await conn2.commit();
540+
await conn2.close();
541+
542+
assert(msg);
543+
assert.strictEqual(msg.payload.toString(), messageString);
544+
assert.strictEqual(msg.deliveryMode, oracledb.AQ_MSG_DELIV_MODE_PERSISTENT);
545+
}); // 217.19
546+
547+
it('217.20 test enqueue/dequeue with PERSISTENT_OR_BUFFERED delivery mode', async function() {
548+
const queue = await conn.getQueue(rawQueueName);
549+
queue.enqOptions.visibility = oracledb.AQ_VISIBILITY_IMMEDIATE;
550+
queue.enqOptions.deliveryMode = oracledb.AQ_MSG_DELIV_MODE_PERSISTENT_OR_BUFFERED;
551+
552+
const messageString = 'This is a persistent or buffered message';
553+
await queue.enqOne(messageString);
554+
555+
const conn2 = await oracledb.getConnection(credential);
556+
const queue2 = await conn2.getQueue(rawQueueName);
557+
queue2.deqOptions.visibility = oracledb.AQ_VISIBILITY_IMMEDIATE;
558+
queue2.deqOptions.deliveryMode = oracledb.AQ_MSG_DELIV_MODE_PERSISTENT_OR_BUFFERED;
559+
560+
const msg = await queue2.deqOne();
561+
await conn2.commit();
562+
await conn2.close();
563+
564+
assert(msg);
565+
assert.strictEqual(msg.payload.toString(), messageString);
566+
}); // 217.20
567+
568+
it('217.21 test enqueue/dequeue with mismatched delivery modes', async function() {
569+
const queue = await conn.getQueue(rawQueueName);
570+
// queue.deqOptions.wait = oracledb.AQ_DEQ_NO_WAIT;
571+
// queue.deqOptions.visibility = oracledb.AQ_VISIBILITY_IMMEDIATE;
572+
// queue.deqOptions.deliveryMode = oracledb.AQ_MSG_DELIV_MODE_PERSISTENT_OR_BUFFERED;
573+
// let myMsg = await queue.deqOne();
574+
// while (myMsg) {
575+
// myMsg = await queue.deqOne();
576+
// }
577+
queue.enqOptions.visibility = oracledb.AQ_VISIBILITY_IMMEDIATE;
578+
queue.enqOptions.deliveryMode = oracledb.AQ_MSG_DELIV_MODE_BUFFERED;
579+
580+
const messageString = 'This should not be dequeued with persistent mode';
581+
await queue.enqOne(messageString);
582+
583+
const conn2 = await oracledb.getConnection(credential);
584+
const queue2 = await conn2.getQueue(rawQueueName);
585+
queue2.deqOptions.navigation = oracledb.AQ_DEQ_NAV_FIRST_MSG;
586+
queue2.deqOptions.visibility = oracledb.AQ_VISIBILITY_IMMEDIATE;
587+
queue2.deqOptions.deliveryMode = oracledb.AQ_MSG_DELIV_MODE_PERSISTENT;
588+
queue2.deqOptions.wait = oracledb.AQ_DEQ_NO_WAIT;
589+
590+
const msg = await queue2.deqOne();
591+
await conn2.close();
592+
593+
assert.strictEqual(msg, undefined);
594+
595+
// Cleanup: dequeue properly with matching mode
596+
const cleanupQueue = await conn.getQueue(rawQueueName);
597+
cleanupQueue.deqOptions.visibility = oracledb.AQ_VISIBILITY_IMMEDIATE;
598+
cleanupQueue.deqOptions.deliveryMode = oracledb.AQ_MSG_DELIV_MODE_BUFFERED;
599+
await cleanupQueue.deqOne();
600+
}); // 217.21
601+
502602
});

test/list.txt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4787,6 +4787,10 @@ oracledb.OUT_FORMAT_OBJECT and resultSet = true
47874787
217.15 test dequeue with wait timeout
47884788
217.16 test buffer message payload - 32KB
47894789
217.17 test large buffer message payload - 1MB
4790+
217.18 test enqueue/dequeue with BUFFERED delivery mode
4791+
217.19 test enqueue/dequeue with PERSISTENT delivery mode
4792+
217.20 test enqueue/dequeue with PERSISTENT_OR_BUFFERED delivery mode
4793+
217.21 test enqueue/dequeue with mismatched delivery modes
47904794

47914795
218. aq2.js
47924796
218.1 examples/aqobject.js

0 commit comments

Comments
 (0)