oracle-nosqldb
Version:
Node.js driver for Oracle NoSQL Database
221 lines (189 loc) • 7.79 kB
text/typescript
/*-
* Copyright (c) 2018, 2024 Oracle and/or its affiliates. All rights reserved.
*
* Licensed under the Universal Permissive License v 1.0 as shown at
* https://oss.oracle.com/licenses/upl/
*/
;
import assert = require("assert");
import Decimal from "decimal.js";
import { NoSQLClient, Consistency, GetResult, PutResult, DeleteResult }
from "oracle-nosqldb";
import { TABLE_NAME, runExample } from "./setup";
import { PurchaseOrder, printConsumedCapacity, printPutOrDeleteOpResult }
from "./common";
function printGetResult(res: GetResult<PurchaseOrder>): void {
printConsumedCapacity(res.consumedCapacity);
if (res.row) {
console.log("Got row:");
console.log(res.row);
if (res.expirationTime) {
console.log("Expiration time: %o", res.expirationTime);
}
if (res.modificationTime) {
console.log("Last modification time: %o",
res.modificationTime);
}
} else {
console.log("Row does not exist");
}
console.log();
}
function printPutResult(res: PutResult<PurchaseOrder>) {
printConsumedCapacity(res.consumedCapacity);
printPutOrDeleteOpResult(res);
}
function printDeleteResult(res: DeleteResult<PurchaseOrder>) {
printConsumedCapacity(res.consumedCapacity);
printPutOrDeleteOpResult(res);
}
async function singleRowOps(client: NoSQLClient): Promise<void> {
// Get the row for order id 10001
console.log("Getting order 10001");
let pk10001 = { // primary key for order 10001
seller: "Amazon",
orderId: 10001
};
let getRes = await client.get<PurchaseOrder>(TABLE_NAME, pk10001);
printGetResult(getRes);
// Modify the order: update street address, add one more item
assert(getRes.row, "Missing row for order 10001");
let order: PurchaseOrder = getRes.row;
order.shipAddress.street += " Apt. 200";
order.items.push({
id: 2346,
name: "Snickers",
price: new Decimal(123)
});
// Update the order in the Orders table
console.log("Updating order 10001");
let putRes = await client.put<PurchaseOrder>(TABLE_NAME, order);
printPutResult(putRes);
assert(putRes.success, "Unconditional put failed");
// Set time-to-live for the order
console.log("Updating order 10001 with TTL of 5 hours");
putRes = await client.put<PurchaseOrder>(TABLE_NAME, order,
{ ttl: { hours: 5 }});
printPutResult(putRes);
assert(putRes.success, "Unconditional put failed");
// Retrieve the order again and check expiration time, use absolute
// consistency.
console.log("Getting order 10001 using absolute consistency");
getRes = await client.get<PurchaseOrder>(TABLE_NAME, pk10001, {
consistency: Consistency.ABSOLUTE
});
printGetResult(getRes);
// Update the ship date for the order
assert(getRes.row, "Missing row for order 10001");
order = getRes.row;
order.shipDate.setDate(order.shipDate.getDate() + 1);
// Try to update the order using putIfAbsent, it should fail. Use option
// to return existing row in case of failure.
console.log("Updating order 10001 via putIfAbsent, should fail");
putRes = await client.putIfAbsent(TABLE_NAME, order, {
returnExisting: true
});
printPutResult(putRes);
assert(!putRes.success, "putIfAbsent for order 10001 succeeded, but \
should have failed");
// Update the order using putIfPresent, should succeed
console.log("Updating order 10001 via putIfPresent, should succeed");
putRes = await client.putIfPresent(TABLE_NAME, order);
printPutResult(putRes);
assert(putRes.success, "putIfPresent for order 10001 failed");
// Create a new order
order = {
seller: "Lowes",
orderId: 10011,
customerName: "Jack",
shipAddress: {
street: "101 some street",
city: "Dublin"
},
shipDate: new Date("2023-05-10T07:00:00Z"),
items: [
{
id: 13003,
name: "Microwave",
price: new Decimal(120.02)
}
]
};
// Insert the new order via putIfAbsent
console.log("Inserting order 10011 via putIfAbsent, should succeed");
putRes = await client.putIfAbsent(TABLE_NAME, order);
printPutResult(putRes);
assert(putRes.success, "putIfAbsent for order 10011 failed");
// Save the row version
assert(putRes.success, "Failed to insert new order 10011");
assert(putRes.version, "Missing version for order 10001");
const rowVer = putRes.version;
// Add new items to the order
order.items.push({
id: 13004,
name: "Shelf assembly",
price: new Decimal(300)
});
// Update the order using putIfVersion, should succeed
console.log("Updating order 10011 via putIfVersion, should succeed");
putRes = await client.putIfVersion(TABLE_NAME, order, rowVer);
printPutResult(putRes);
assert(putRes.success, "putIfVersion for order 10011 failed");
// Save the new row version
assert(putRes.success, "Failed to create new order 10011");
assert(putRes.version, "Missing version for order 10001");
const newRowVer = putRes.version;
// Try to update the order using putIfVersion with old version,
// this should fail, since the old version is no longer valid.
console.log("Updating order 10011 via putIfVersion with old row version, \
should fail");
putRes = await client.putIfVersion(TABLE_NAME, order, rowVer);
printPutResult(putRes);
assert(!putRes.success, "putIfVersion for order 10011 succeded, but \
should have failed");
// Update the order using putIfVersion with new version, should succeed
console.log("Updating order 10011 via putIfVersion, should succeed");
putRes = await client.putIfVersion(TABLE_NAME, order, newRowVer);
printPutResult(putRes);
assert(putRes.success, "putIfVersion for order 10011 failed");
// Delete order 10011
const pk10011 = {
seller: "Lowes",
orderId: 10011
};
console.log("Deleting order 10011");
let delRes = await client.delete<PurchaseOrder>(TABLE_NAME, pk10011);
printDeleteResult(delRes);
assert(delRes.success, "Unconditional delete failed");
console.log("Getting order 10011, should be null");
getRes = await client.get(TABLE_NAME, pk10011);
printGetResult(getRes);
assert(!getRes.row, "Found order 10011 after deletion");
// Re-insert order 10011
console.log("Re-inserting order 10011");
putRes = await client.put(TABLE_NAME, order);
printPutResult(putRes);
assert(putRes.success, "Unconditional put failed");
// Try to delete order 10011 via deleteIfVersion using old version, this
// should fail. Use option to return existing row.
console.log("Deleting order 10011 via deleteIfVersion with old version, \
should fail");
delRes = await client.deleteIfVersion(TABLE_NAME, pk10011, rowVer, {
returnExisting: true
});
printDeleteResult(delRes);
assert(!delRes.success, "deleteIfVersion succeeded for row 10011, but \
should have failed");
// Delete order 10011 via deleteIfVersion using row version from last put,
// should succeed.
assert(putRes.version, "Missing row version for order 10011");
delRes = await client.deleteIfVersion(TABLE_NAME, pk10011,
putRes.version);
printDeleteResult(delRes);
assert(delRes.success, "deleteIfVersion failed for order 10011");
console.log("Getting order 10011, should be null");
getRes = await client.get(TABLE_NAME, pk10011);
printGetResult(getRes);
assert(!getRes.row, "Found order 10011 after deletion");
}
runExample(singleRowOps, false, true);