Skip to content

Commit 5c7d3d6

Browse files
committed
feat: enhance decimal handling in SenderBufferV3 and Sender classes to support null and undefined values
1 parent 88de8a7 commit 5c7d3d6

File tree

3 files changed

+90
-5
lines changed

3 files changed

+90
-5
lines changed

src/buffer/bufferv3.ts

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ const EQUALS_SIGN: number = "=".charCodeAt(0);
1818
*/
1919
class SenderBufferV3 extends SenderBufferV2 {
2020
/**
21-
* Creates a new SenderBufferV2 instance.
21+
* Creates a new SenderBufferV3 instance.
2222
*
2323
* @param {SenderOptions} options - Sender configuration object.
2424
*
@@ -37,13 +37,18 @@ class SenderBufferV3 extends SenderBufferV2 {
3737
* @param {number} value - Column value, accepts only number/string values.
3838
* @returns {Sender} Returns with a reference to this buffer.
3939
*/
40-
decimalColumnText(name: string, value: string | number): SenderBuffer {
40+
decimalColumnText(
41+
name: string,
42+
value: string | number | null | undefined,
43+
): SenderBuffer {
4144
let str = "";
4245
if (typeof value === "string") {
4346
validateDecimalText(value);
4447
str = value;
4548
} else if (typeof value === "number") {
4649
str = value.toString();
50+
} else if (value === null || value === undefined) {
51+
return this;
4752
} else {
4853
throw new TypeError(`Invalid decimal value type: ${typeof value}`);
4954
}
@@ -69,7 +74,7 @@ class SenderBufferV3 extends SenderBufferV2 {
6974
*/
7075
decimalColumnUnscaled(
7176
name: string,
72-
unscaled: Int8Array | bigint,
77+
unscaled: Int8Array | bigint | null | undefined,
7378
scale: number,
7479
): SenderBuffer {
7580
if (scale < 0 || scale > 76) {
@@ -80,6 +85,8 @@ class SenderBufferV3 extends SenderBufferV2 {
8085
arr = bigintToTwosComplementBytes(unscaled);
8186
} else if (unscaled instanceof Int8Array) {
8287
arr = Array.from(unscaled);
88+
} else if (unscaled === null || unscaled === undefined) {
89+
return this;
8390
} else {
8491
throw new TypeError(
8592
`Invalid unscaled value type: ${typeof unscaled}, expected Int8Array or bigint`,

src/sender.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -336,7 +336,10 @@ class Sender {
336336
* - value is not a number/string
337337
* - or the string contains invalid characters
338338
*/
339-
decimalColumnText(name: string, value: string | number): Sender {
339+
decimalColumnText(
340+
name: string,
341+
value: string | number | undefined | null,
342+
): Sender {
340343
this.buffer.decimalColumnText(name, value);
341344
return this;
342345
}
@@ -355,7 +358,7 @@ class Sender {
355358
*/
356359
decimalColumnUnscaled(
357360
name: string,
358-
unscaled: Int8Array | bigint,
361+
unscaled: Int8Array | bigint | undefined | null,
359362
scale: number,
360363
): Sender {
361364
this.buffer.decimalColumnUnscaled(name, unscaled, scale);

test/sender.buffer.test.ts

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1382,6 +1382,81 @@ describe("Sender message builder test suite (anything not covered in client inte
13821382
sender.reset();
13831383
await sender.close();
13841384
});
1385+
1386+
it("doesn't send the decimal text column when undefined is passed as value", async function () {
1387+
const sender = new Sender({
1388+
protocol: "tcp",
1389+
protocol_version: "3",
1390+
host: "host",
1391+
init_buf_size: 1024,
1392+
});
1393+
try {
1394+
await sender.table("fx").decimalColumnText("mid", undefined).atNow();
1395+
} catch (e: Error | any) {
1396+
expect(e.message).toEqual(
1397+
"The row must have a symbol or column set before it is closed",
1398+
);
1399+
}
1400+
sender.reset();
1401+
await sender.close();
1402+
});
1403+
1404+
it("doesn't send the decimal text column when null is passed as value", async function () {
1405+
const sender = new Sender({
1406+
protocol: "tcp",
1407+
protocol_version: "3",
1408+
host: "host",
1409+
init_buf_size: 1024,
1410+
});
1411+
try {
1412+
await sender.table("fx").decimalColumnText("mid", null).atNow();
1413+
} catch (e: Error | any) {
1414+
expect(e.message).toEqual(
1415+
"The row must have a symbol or column set before it is closed",
1416+
);
1417+
}
1418+
sender.reset();
1419+
await sender.close();
1420+
});
1421+
1422+
it("doesn't send the decimal unscaled column when undefined is passed as value", async function () {
1423+
const sender = new Sender({
1424+
protocol: "tcp",
1425+
protocol_version: "3",
1426+
host: "host",
1427+
init_buf_size: 1024,
1428+
});
1429+
try {
1430+
await sender
1431+
.table("fx")
1432+
.decimalColumnUnscaled("mid", undefined, 0)
1433+
.atNow();
1434+
} catch (e: Error | any) {
1435+
expect(e.message).toEqual(
1436+
"The row must have a symbol or column set before it is closed",
1437+
);
1438+
}
1439+
sender.reset();
1440+
await sender.close();
1441+
});
1442+
1443+
it("doesn't send the decimal unscaled column when null is passed as value", async function () {
1444+
const sender = new Sender({
1445+
protocol: "tcp",
1446+
protocol_version: "3",
1447+
host: "host",
1448+
init_buf_size: 1024,
1449+
});
1450+
try {
1451+
await sender.table("fx").decimalColumnUnscaled("mid", null, 0).atNow();
1452+
} catch (e: Error | any) {
1453+
expect(e.message).toEqual(
1454+
"The row must have a symbol or column set before it is closed",
1455+
);
1456+
}
1457+
sender.reset();
1458+
await sender.close();
1459+
});
13851460
});
13861461

13871462
function bufferContent(sender: Sender) {

0 commit comments

Comments
 (0)