IGNITE-11597 Fix for Node.js thin client UUID marshalling
Co-Authored-By: Ruslan Ragimov <ruslan.ragimov@nobitlost.com>
Co-Authored-By: ekaterina-nbl <ekaterina.vergizova@nobitlost.com>
Co-Authored-By: sergey-nbl <sergey.nazarkin@nobitlost.com>
Co-Authored-By: dmelnichuk <39872028+dmelnichuk@users.noreply.github.com>
Co-Authored-By: snork-nbl <snork@nobitlost.com>
Co-Authored-By: Pavel Petroshenko <pavel@petroshenko.com>
Co-Authored-By: alexey-nbl <alexey.kosenchuk@nobitlost.com>
This closes #6527
diff --git a/examples/CachePutGetExample.js b/examples/CachePutGetExample.js
index 94060bd..b37f573 100644
--- a/examples/CachePutGetExample.js
+++ b/examples/CachePutGetExample.js
@@ -62,7 +62,7 @@
constructor() {
this._personCache = null;
this._personObjectType = null;
- this._binaryObjectCache = null;
+ this._binaryObjectCache = null;
}
async start() {
@@ -127,7 +127,7 @@
new CacheEntry(await personBinaryObject1.getField('id'), personBinaryObject1),
new CacheEntry(await personBinaryObject2.getField('id'), personBinaryObject2)
]);
-
+
console.log('Binary Objects put successfully using putAll()');
}
@@ -138,7 +138,7 @@
this.printPersonObject(person.getValue());
}
}
-
+
async getBinaryObjects() {
const personBinaryObject = await this._binaryObjectCache.get(3);
console.log('Binary Object get:');
diff --git a/lib/BinaryObject.js b/lib/BinaryObject.js
index 9be60da..478dbaf 100644
--- a/lib/BinaryObject.js
+++ b/lib/BinaryObject.js
@@ -491,7 +491,7 @@
else if (offset < 0x10000) {
return BinaryUtils.TYPE_CODE.SHORT;
}
- return BinaryUtils.TYPE_CODE.INTEGER;
+ return BinaryUtils.TYPE_CODE.INTEGER;
}
static _fromBuffer(communicator, buffer, offset, length, id) {
diff --git a/lib/CacheClient.js b/lib/CacheClient.js
index f59910b..fad8e71 100644
--- a/lib/CacheClient.js
+++ b/lib/CacheClient.js
@@ -729,7 +729,7 @@
* @param {*} key - key corresponding to this entry.
* @param {*} value - value associated with the key.
*
- * @return {CacheEntry} - new CacheEntry instance
+ * @return {CacheEntry} - new CacheEntry instance
*/
constructor(key, value) {
this._key = key;
diff --git a/lib/CacheConfiguration.js b/lib/CacheConfiguration.js
index ccf20b9..75f0155 100644
--- a/lib/CacheConfiguration.js
+++ b/lib/CacheConfiguration.js
@@ -29,7 +29,7 @@
*
* All configuration settings are optional and have defaults which are defined on a server side.
*
- * See Apache Ignite documentation for details of every configuration setting.
+ * See Apache Ignite documentation for details of every configuration setting.
*/
class CacheKeyConfiguration {
@@ -112,7 +112,7 @@
*
* All configuration settings are optional and have defaults which are defined on a server side.
*
- * See Apache Ignite documentation for details of every configuration setting.
+ * See Apache Ignite documentation for details of every configuration setting.
*/
class QueryEntity {
@@ -238,7 +238,7 @@
}
/**
- *
+ *
*
* @param {Array<QueryField>} fields
*
@@ -250,7 +250,7 @@
}
/**
- *
+ *
*
* @return {Array<QueryField>}
*/
@@ -259,7 +259,7 @@
}
/**
- *
+ *
*
* @param {Map<string, string>} aliases
*
@@ -271,7 +271,7 @@
}
/**
- *
+ *
*
* @return {Map<string, string>}
*/
@@ -280,7 +280,7 @@
}
/**
- *
+ *
*
* @param {Array<QueryIndex>} indexes
*
@@ -292,7 +292,7 @@
}
/**
- *
+ *
*
* @return {Array<QueryIndex>}
*/
@@ -394,7 +394,7 @@
*
* All configuration settings are optional and have defaults which are defined on a server side.
*
- * See Apache Ignite documentation for details of every configuration setting.
+ * See Apache Ignite documentation for details of every configuration setting.
*/
class QueryField {
@@ -629,7 +629,7 @@
}
/**
- *
+ *
* @typedef QueryIndex.INDEX_TYPE
* @enum
* @readonly
@@ -648,10 +648,10 @@
*
* All configuration settings are optional and have defaults which are defined on a server side.
*
- * See Apache Ignite documentation for details of every configuration setting.
+ * See Apache Ignite documentation for details of every configuration setting.
*/
class QueryIndex {
-
+
/**
* Public constructor.
*
@@ -738,7 +738,7 @@
}
/**
- *
+ *
*
* @param {Map<string, boolean>} fields
*
@@ -750,7 +750,7 @@
}
/**
- *
+ *
*
* @return {Map<string, boolean>}
*/
@@ -862,7 +862,7 @@
});
/**
- *
+ *
* @typedef CacheConfiguration.CACHE_ATOMICITY_MODE
* @enum
* @readonly
@@ -875,7 +875,7 @@
});
/**
- *
+ *
* @typedef CacheConfiguration.CACHE_MODE
* @enum
* @readonly
@@ -890,7 +890,7 @@
});
/**
- *
+ *
* @typedef CacheConfiguration.PARTITION_LOSS_POLICY
* @enum
* @readonly
@@ -909,7 +909,7 @@
});
/**
- *
+ *
* @typedef CacheConfiguration.REABALANCE_MODE
* @enum
* @readonly
@@ -924,7 +924,7 @@
});
/**
- *
+ *
* @typedef CacheConfiguration.WRITE_SYNCHRONIZATION_MODE
* @enum
* @readonly
@@ -943,7 +943,7 @@
*
* All configuration settings are optional and have defaults which are defined on a server side.
*
- * See Apache Ignite documentation for details of every configuration setting.
+ * See Apache Ignite documentation for details of every configuration setting.
*/
class CacheConfiguration {
@@ -1559,7 +1559,7 @@
}
/**
- *
+ *
*
* @param {...CacheKeyConfiguration} keyConfigurations
*
@@ -1574,7 +1574,7 @@
}
/**
- *
+ *
*
* @return {Array<CacheKeyConfiguration>}
*/
@@ -1583,7 +1583,7 @@
}
/**
- *
+ *
*
* @param {...QueryEntity} queryEntities
*
@@ -1598,7 +1598,7 @@
}
/**
- *
+ *
*
* @return {Array<QueryEntity>}
*/
diff --git a/lib/IgniteClient.js b/lib/IgniteClient.js
index 544c37f..1974352 100644
--- a/lib/IgniteClient.js
+++ b/lib/IgniteClient.js
@@ -53,7 +53,7 @@
/**
* Class representing Ignite client.
- *
+ *
*/
class IgniteClient {
diff --git a/lib/ObjectType.js b/lib/ObjectType.js
index f1facfd..00c4d56 100644
--- a/lib/ObjectType.js
+++ b/lib/ObjectType.js
@@ -109,7 +109,7 @@
COMPLEX_OBJECT : 103
});
-/**
+/**
* Base class representing a type of Ignite object.
*
* The class has no public constructor. Only subclasses may be instantiated.
@@ -351,8 +351,8 @@
* If key and/or value type is not specified then during operations the Ignite client
* will try to make automatic mapping between JavaScript types and Ignite object types -
* according to the mapping table defined in the description of the {@link ObjectType} class.
- *
- * @param {MapObjectType.MAP_SUBTYPE} [mapSubType=MAP_SUBTYPE.HASH_MAP] - map subtype, one of the
+ *
+ * @param {MapObjectType.MAP_SUBTYPE} [mapSubType=MAP_SUBTYPE.HASH_MAP] - map subtype, one of the
* {@link MapObjectType.MAP_SUBTYPE} constants.
* @param {ObjectType.PRIMITIVE_TYPE | CompositeType} [keyType=null] - type of the keys in the map:
* - either a type code of primitive (simple) type
@@ -424,8 +424,8 @@
* If the type of elements is not specified then during operations the Ignite client
* will try to make automatic mapping between JavaScript types and Ignite object types -
* according to the mapping table defined in the description of the {@link ObjectType} class.
- *
- * @param {CollectionObjectType.COLLECTION_SUBTYPE} collectionSubType - collection subtype, one of the
+ *
+ * @param {CollectionObjectType.COLLECTION_SUBTYPE} collectionSubType - collection subtype, one of the
* {@link CollectionObjectType.COLLECTION_SUBTYPE} constants.
* @param {ObjectType.PRIMITIVE_TYPE | CompositeType} [elementType=null] - type of elements in the collection:
* - either a type code of primitive (simple) type
@@ -529,7 +529,7 @@
*
* By default, the name of the complex type is the name of the JavaScript Object.
* The name may be explicitely specified using optional typeName parameter in the constructor.
- *
+ *
* @param {object} jsObject - instance of JavaScript Object which will be mapped to/from this complex type.
* @param {string} [typeName] - name of the complex type.
*
@@ -560,7 +560,7 @@
* If the type is not specified then during operations the Ignite client
* will try to make automatic mapping between JavaScript types and Ignite object types -
* according to the mapping table defined in the description of the {@link ObjectType} class.
- *
+ *
* @param {string} fieldName - name of the field.
* @param {ObjectType.PRIMITIVE_TYPE | CompositeType} fieldType - type of the field:
* - either a type code of primitive (simple) type
diff --git a/lib/Query.js b/lib/Query.js
index 029ec3d..d3f6f87 100644
--- a/lib/Query.js
+++ b/lib/Query.js
@@ -469,7 +469,7 @@
/**
* Sets a partition number over which this query should iterate.
*
- * If negative, the query will iterate over all partitions in the cache.
+ * If negative, the query will iterate over all partitions in the cache.
*
* @param {number} partitionNumber - partition number over which this query should iterate.
*
diff --git a/lib/internal/BinaryCommunicator.js b/lib/internal/BinaryCommunicator.js
index 9418d36..20ddcff 100644
--- a/lib/internal/BinaryCommunicator.js
+++ b/lib/internal/BinaryCommunicator.js
@@ -51,7 +51,7 @@
buffer.writeString(value);
}
}
-
+
async send(opCode, payloadWriter, payloadReader = null) {
await this._socket.send(opCode, payloadWriter, payloadReader);
}
@@ -218,7 +218,7 @@
}
_readUUID(buffer) {
- return [...buffer.readBuffer(BinaryUtils.getSize(BinaryUtils.TYPE_CODE.UUID))];
+ return [...buffer.readBuffer(BinaryUtils.getSize(BinaryUtils.TYPE_CODE.UUID)).swap64()];
}
async _readEnum(buffer) {
@@ -314,7 +314,7 @@
}
_writeUUID(buffer, value) {
- buffer.writeBuffer(Buffer.from(value));
+ buffer.writeBuffer(Buffer.from(value).swap64());
}
async _writeEnum(buffer, enumValue) {
diff --git a/lib/internal/BinaryType.js b/lib/internal/BinaryType.js
index a111ed0..4a36426 100644
--- a/lib/internal/BinaryType.js
+++ b/lib/internal/BinaryType.js
@@ -393,7 +393,7 @@
result._fromComplexObjectType(complexObjectType, jsObject);
BinaryTypeStorage.setByComplexObjectType(complexObjectType, result._type, result._schema);
}
- return result;
+ return result;
}
getTypeId() {
diff --git a/lib/internal/ClientFailoverSocket.js b/lib/internal/ClientFailoverSocket.js
index 3ef9c76..770c5c6 100644
--- a/lib/internal/ClientFailoverSocket.js
+++ b/lib/internal/ClientFailoverSocket.js
@@ -60,7 +60,7 @@
}
async _onSocketDisconnect(error = null) {
- this._changeState(IgniteClient.STATE.CONNECTING, null, error);
+ this._changeState(IgniteClient.STATE.CONNECTING, null, error);
this._socket = null;
this._endpointIndex++;
try {
diff --git a/lib/internal/MessageBuffer.js b/lib/internal/MessageBuffer.js
index b3be7e9..e282967 100644
--- a/lib/internal/MessageBuffer.js
+++ b/lib/internal/MessageBuffer.js
@@ -115,7 +115,7 @@
this._buffer.writeInt8(value, this._position);
}
else {
- this._buffer.writeUInt8(value, this._position);
+ this._buffer.writeUInt8(value, this._position);
}
break;
case BinaryUtils.TYPE_CODE.SHORT:
@@ -123,7 +123,7 @@
this._buffer.writeInt16LE(value, this._position);
}
else {
- this._buffer.writeUInt16LE(value, this._position);
+ this._buffer.writeUInt16LE(value, this._position);
}
break;
case BinaryUtils.TYPE_CODE.INTEGER:
@@ -131,7 +131,7 @@
this._buffer.writeInt32LE(value, this._position);
}
else {
- this._buffer.writeUInt32LE(value, this._position);
+ this._buffer.writeUInt32LE(value, this._position);
}
break;
case BinaryUtils.TYPE_CODE.FLOAT:
@@ -260,7 +260,7 @@
if (end === undefined) {
end = buffer.length;
}
- const size = end - start;
+ const size = end - start;
this._ensureCapacity(size);
buffer.copy(this._buffer, this._position, start, end);
this._position += size;
diff --git a/package.json b/package.json
index 4ffb809..cca390e 100644
--- a/package.json
+++ b/package.json
@@ -1,8 +1,22 @@
{
"name": "apache-ignite-client",
- "version": "1.0.0",
- "description": "",
+ "version": "1.0.1",
+ "description": "NodeJS Client for Apache Ignite",
"main": "index.js",
+ "files": [
+ "/examples",
+ "/lib",
+ "index.js"
+ ],
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/apache/ignite/tree/master/modules/platforms/nodejs"
+ },
+ "keywords": [
+ "apache",
+ "ignite",
+ "client"
+ ],
"author": "",
"license": "Apache-2.0",
"engines": {
diff --git a/spec/TestingHelper.js b/spec/TestingHelper.js
index 78df0cb..25465bb 100644
--- a/spec/TestingHelper.js
+++ b/spec/TestingHelper.js
@@ -62,7 +62,7 @@
const timestampValueModificator = (data) => { return new Timestamp(new Date(data.getTime() + 12345), data.getNanos() + 123); };
const primitiveValues = {
- [ObjectType.PRIMITIVE_TYPE.BYTE] : {
+ [ObjectType.PRIMITIVE_TYPE.BYTE] : {
values : [-128, 0, 127],
isMapKey : true,
modificator : numericValueModificator
@@ -385,7 +385,7 @@
}
return true;
}
- }
+ }
}
module.exports = TestingHelper;
diff --git a/spec/cache/CachePutGetDiffTypes.spec.js b/spec/cache/CachePutGetDiffTypes.spec.js
index a6e1bba..5fd370e 100644
--- a/spec/cache/CachePutGetDiffTypes.spec.js
+++ b/spec/cache/CachePutGetDiffTypes.spec.js
@@ -132,7 +132,7 @@
map);
await putGetMaps(
new MapObjectType(
- MapObjectType.MAP_SUBTYPE.LINKED_HASH_MAP, type1, type2),
+ MapObjectType.MAP_SUBTYPE.LINKED_HASH_MAP, type1, type2),
map);
if (typeInfo1.typeOptional) {
await putGetMaps(new MapObjectType(MapObjectType.MAP_SUBTYPE.HASH_MAP, null, type2),
@@ -177,7 +177,7 @@
new MapObjectType(MapObjectType.MAP_SUBTYPE.HASH_MAP, type1, type2),
map);
await putGetMaps(
- new MapObjectType(MapObjectType.MAP_SUBTYPE.LINKED_HASH_MAP, type1, type2),
+ new MapObjectType(MapObjectType.MAP_SUBTYPE.LINKED_HASH_MAP, type1, type2),
map);
if (typeInfo1.typeOptional) {
await putGetMaps(new MapObjectType(MapObjectType.MAP_SUBTYPE.HASH_MAP, null, type2),
@@ -284,14 +284,14 @@
map = new Map([...map.entries()].map(([key, value]) => [typeInfo1.modificator(key), typeInfo2.modificator(value)]));
array.push(map);
}
- await putGetObjectArrays(new ObjectArrayType(new MapObjectType(MapObjectType.MAP_SUBTYPE.HASH_MAP, type1, type2)),
+ await putGetObjectArrays(new ObjectArrayType(new MapObjectType(MapObjectType.MAP_SUBTYPE.HASH_MAP, type1, type2)),
array);
if (typeInfo1.typeOptional) {
- await putGetObjectArrays(new ObjectArrayType(new MapObjectType(MapObjectType.MAP_SUBTYPE.LINKED_HASH_MAP, null, type2)),
+ await putGetObjectArrays(new ObjectArrayType(new MapObjectType(MapObjectType.MAP_SUBTYPE.LINKED_HASH_MAP, null, type2)),
array);
}
if (typeInfo2.typeOptional) {
- await putGetObjectArrays(new ObjectArrayType(new MapObjectType(MapObjectType.MAP_SUBTYPE.LINKED_HASH_MAP, type1)),
+ await putGetObjectArrays(new ObjectArrayType(new MapObjectType(MapObjectType.MAP_SUBTYPE.LINKED_HASH_MAP, type1)),
array);
}
if (typeInfo1.typeOptional && typeInfo2.typeOptional) {
@@ -318,7 +318,7 @@
array.push(value);
}
await putGetObjectArrays(
- new ObjectArrayType(type),
+ new ObjectArrayType(type),
array);
if (typeInfo.typeOptional) {
await putGetObjectArrays(new ObjectArrayType(), array);
@@ -338,14 +338,14 @@
const primitiveType = typeInfo.elemType;
const primitiveTypeInfo = TestingHelper.primitiveValues[primitiveType];
let values = primitiveTypeInfo.values;
-
+
const array = new Array();
for (let i = 0; i < 10; i++) {
values = values.map((value) => primitiveTypeInfo.modificator(value));
array.push(values);
}
await putGetObjectArrays(
- new ObjectArrayType(type),
+ new ObjectArrayType(type),
array);
if (typeInfo.typeOptional) {
await putGetObjectArrays(new ObjectArrayType(), array);
@@ -372,13 +372,13 @@
array.push(set);
}
await putGetObjectArrays(
- new ObjectArrayType(new CollectionObjectType(CollectionObjectType.COLLECTION_SUBTYPE.USER_SET, type)),
+ new ObjectArrayType(new CollectionObjectType(CollectionObjectType.COLLECTION_SUBTYPE.USER_SET, type)),
array);
await putGetObjectArrays(
- new ObjectArrayType(new CollectionObjectType(CollectionObjectType.COLLECTION_SUBTYPE.HASH_SET, type)),
+ new ObjectArrayType(new CollectionObjectType(CollectionObjectType.COLLECTION_SUBTYPE.HASH_SET, type)),
array);
await putGetObjectArrays(
- new ObjectArrayType(new CollectionObjectType(CollectionObjectType.COLLECTION_SUBTYPE.LINKED_HASH_SET, type)),
+ new ObjectArrayType(new CollectionObjectType(CollectionObjectType.COLLECTION_SUBTYPE.LINKED_HASH_SET, type)),
array);
if (typeInfo.typeOptional) {
await putGetObjectArrays(new ObjectArrayType(), array);
@@ -406,17 +406,17 @@
array.push(list);
}
await putGetObjectArrays(
- new ObjectArrayType(new CollectionObjectType(CollectionObjectType.COLLECTION_SUBTYPE.USER_COL, type)),
+ new ObjectArrayType(new CollectionObjectType(CollectionObjectType.COLLECTION_SUBTYPE.USER_COL, type)),
array);
await putGetObjectArrays(
- new ObjectArrayType(new CollectionObjectType(CollectionObjectType.COLLECTION_SUBTYPE.ARRAY_LIST, type)),
+ new ObjectArrayType(new CollectionObjectType(CollectionObjectType.COLLECTION_SUBTYPE.ARRAY_LIST, type)),
array);
await putGetObjectArrays(
- new ObjectArrayType(new CollectionObjectType(CollectionObjectType.COLLECTION_SUBTYPE.LINKED_LIST, type)),
+ new ObjectArrayType(new CollectionObjectType(CollectionObjectType.COLLECTION_SUBTYPE.LINKED_LIST, type)),
array);
if (typeInfo.typeOptional) {
await putGetObjectArrays(
- new ObjectArrayType(new CollectionObjectType(CollectionObjectType.COLLECTION_SUBTYPE.ARRAY_LIST)),
+ new ObjectArrayType(new CollectionObjectType(CollectionObjectType.COLLECTION_SUBTYPE.ARRAY_LIST)),
array);
}
}
@@ -613,7 +613,7 @@
await cache.clearKey(key);
expect(result instanceof Array).toBe(true,
`result is not Array: arrayType=${valueType}, result=${result}`);
- expect(await TestingHelper.compare(value, result)).toBe(true,
+ expect(await TestingHelper.compare(value, result)).toBe(true,
`Arrays are not equal: arrayType=${valueType}, put array=${TestingHelper.printValue(value)
}, get array=${TestingHelper.printValue(result)}`);
}
@@ -630,7 +630,7 @@
let result = await cache.get(key);
expect(result instanceof Map).toBe(true,
`result is not Map: mapType=${mapType}, result=${result}`);
- expect(await TestingHelper.compare(value, result)).toBe(true,
+ expect(await TestingHelper.compare(value, result)).toBe(true,
`Maps are not equal: valueType=${mapType._valueType}, put value=${TestingHelper.printValue(value)
}, get value=${TestingHelper.printValue(result)}`);
}
@@ -647,11 +647,11 @@
if (!setType || setType._subType !== CollectionObjectType.COLLECTION_SUBTYPE.LINKED_HASH_SET) {
const valueArr = [...value].sort();
const resultArr = [...result].sort();
- expect(await TestingHelper.compare(valueArr, resultArr)).toBe(true, `Sets are not equal: valueType=${setType ? setType._elementType :
+ expect(await TestingHelper.compare(valueArr, resultArr)).toBe(true, `Sets are not equal: valueType=${setType ? setType._elementType :
null}, put value=${TestingHelper.printValue(valueArr)}, get value=${TestingHelper.printValue(resultArr)}`);
}
else {
- expect(await TestingHelper.compare(value, result)).toBe(true, `Sets are not equal: valueType=${setType ? setType._elementType :
+ expect(await TestingHelper.compare(value, result)).toBe(true, `Sets are not equal: valueType=${setType ? setType._elementType :
null}, put value=${TestingHelper.printValue(value)}, get value=${TestingHelper.printValue(result)}`);
}
}
@@ -664,7 +664,7 @@
let result = await cache.get(key);
expect(result instanceof Array).toBe(true,
`result is not Array: listType=${listType}, result=${result}`);
- expect(await TestingHelper.compare(value, result)).toBe(true, `Lists are not equal: valueType=${listType ? listType._elementType :
+ expect(await TestingHelper.compare(value, result)).toBe(true, `Lists are not equal: valueType=${listType ? listType._elementType :
null}, put value=${TestingHelper.printValue(value)}, get value=${TestingHelper.printValue(result)}`);
}
@@ -676,7 +676,7 @@
let result = await cache.get(key);
expect(result instanceof Array).toBe(true,
`result is not Array: arrayType=${arrayType}, result=${result}`);
- expect(await TestingHelper.compare(value, result)).toBe(true, `Arrays are not equal: valueType=${arrayType ? arrayType._elementType :
+ expect(await TestingHelper.compare(value, result)).toBe(true, `Arrays are not equal: valueType=${arrayType ? arrayType._elementType :
null}, put value=${TestingHelper.printValue(value)}, get value=${TestingHelper.printValue(result)}`);
}
diff --git a/spec/cache/UUID.spec.js b/spec/cache/UUID.spec.js
new file mode 100644
index 0000000..1715113
--- /dev/null
+++ b/spec/cache/UUID.spec.js
@@ -0,0 +1,105 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+'use strict';
+
+require('jasmine-expect');
+
+const TestingHelper = require('../TestingHelper');
+const IgniteClient = require('apache-ignite-client');
+const CacheConfiguration = IgniteClient.CacheConfiguration;
+const SqlFieldsQuery = IgniteClient.SqlFieldsQuery;
+const ObjectType = IgniteClient.ObjectType;
+
+const CACHE_NAME = '__test_cache';
+const TABLE_NAME = '__test_UUID_table';
+const UUID_STRINGS = [
+ 'd57babad-7bc1-4c82-9f9c-e72841b92a85',
+ '5946c0c0-2b76-479d-8694-a2e64a3968da',
+ 'a521723d-ad5d-46a6-94ad-300f850ef704'
+];
+
+describe('uuid test suite >', () => {
+ let igniteClient = null;
+
+ beforeAll((done) => {
+ Promise.resolve().
+ then(async () => {
+ await TestingHelper.init();
+ igniteClient = TestingHelper.igniteClient;
+ await testSuiteCleanup(done);
+ await igniteClient.getOrCreateCache(CACHE_NAME, new CacheConfiguration().setSqlSchema('PUBLIC'));
+ }).
+ then(done).
+ catch(error => done.fail(error));
+ }, TestingHelper.TIMEOUT);
+
+ afterAll((done) => {
+ Promise.resolve().
+ then(async () => {
+ await testSuiteCleanup(done);
+ await TestingHelper.cleanUp();
+ }).
+ then(done).
+ catch(error => done.fail(error));
+ }, TestingHelper.TIMEOUT);
+
+ it('insert byte array and select string to check uuid marshalling', (done) => {
+ Promise.resolve().
+ then(async () => {
+ const cache = igniteClient.getCache(CACHE_NAME);
+ const createTable = `CREATE TABLE IF NOT EXISTS ${TABLE_NAME} (id INTEGER PRIMARY KEY, uuid_field UUID)`;
+ (await cache.query(new SqlFieldsQuery(createTable))).getAll();
+
+ const insertQuery = new SqlFieldsQuery(`INSERT INTO ${TABLE_NAME} (id, uuid_field) VALUES (?, ?)`);
+ const dataTypes = [ObjectType.PRIMITIVE_TYPE.INTEGER, ObjectType.PRIMITIVE_TYPE.UUID];
+
+ let id = 1;
+ for (let uuidStr of UUID_STRINGS) {
+ const args = [id++, uuidToBytes(uuidStr)];
+ (await cache.query(insertQuery.setArgs(...args).setArgTypes(...dataTypes))).getAll();
+ }
+
+ const selectQuery = `SELECT * FROM ${TABLE_NAME} WHERE uuid_field = ?`;
+
+ for (let uuidStr of UUID_STRINGS) {
+ const cursor = await cache.query(new SqlFieldsQuery(selectQuery).setArgs(uuidStr));
+ const rows = await cursor.getAll();
+ expect(rows.length).toBe(1);
+ expect(rows[0][1]).toEqual(uuidToBytes(uuidStr));
+ }
+ }).
+ then(done).
+ catch(error => done.fail(error));
+ });
+
+ function uuidToBytes(uuidStr) {
+ const buf = [];
+ uuidStr.toLowerCase().replace(/[0-9a-f]{2}/g, function(oct) {
+ buf.push(parseInt(oct, 16));
+ });
+
+ return buf;
+ }
+
+ async function testSuiteCleanup(done) {
+ const cache = await igniteClient.getOrCreateCache(CACHE_NAME, new CacheConfiguration().setSqlSchema('PUBLIC'));
+ const dropTable = `DROP TABLE IF EXISTS ${TABLE_NAME}`;
+ (await cache.query(new SqlFieldsQuery(dropTable))).getAll();
+ await TestingHelper.destroyCache(CACHE_NAME, done);
+ }
+});
diff --git a/spec/config.js b/spec/config.js
index 4e89875..747170a 100644
--- a/spec/config.js
+++ b/spec/config.js
@@ -19,7 +19,7 @@
exports.endpoints = process.env.APACHE_IGNITE_CLIENT_ENDPOINTS ?
process.env.APACHE_IGNITE_CLIENT_ENDPOINTS.split(',') : [];
-exports.debug = process.env.APACHE_IGNITE_CLIENT_DEBUG === 'true' ||
+exports.debug = process.env.APACHE_IGNITE_CLIENT_DEBUG === 'true' ||
process.env.APACHE_IGNITE_CLIENT_DEBUG === '1';
diff --git a/spec/query/SqlQuery.spec.js b/spec/query/SqlQuery.spec.js
index 2bbd0e5..c2e2bb1 100644
--- a/spec/query/SqlQuery.spec.js
+++ b/spec/query/SqlQuery.spec.js
@@ -45,7 +45,7 @@
igniteClient = TestingHelper.igniteClient;
await testSuiteCleanup(done);
await igniteClient.getOrCreateCache(
- CACHE_NAME,
+ CACHE_NAME,
new CacheConfiguration().
setQueryEntities(
new QueryEntity().