Members
DATA_NAMES
static
Active dataset name we work with
Example
let store = ctx.dataStore
let prevData = store.currentDataName
try {
store.currentDataName = TubDataStore.DATA_NAMES.BEFORE_UPDATE
let valueBeforeUpdate = store.get('code')
} finally {
store.currentDataName = prevData
}
asJSONArray: String
Return string representation of Instance in Array of array
format
asJSONObject: String
Return string representation of Instance in format [{attr1: value1, attr2: value2},... ]
asXMLPersistent: String
Return XML representation of Instance in MS DataSet format
bof: Boolean
Indicate current position in data collection is on the beginning of collection
currentDataName: String
Active dataset name we work with. There is some predefined
dataNames - see TubDataStore.DATA_NAMES
entity: UBEntity
Entity metadata
eof: Boolean
Indicate current position in data collection is on the end of collection.
initialized: Boolean
Is store initialized
rowCount: Number
Record count. If DataStore is not initialized or empty will return 0.
rowPos: Number
Row position inside currentDataName dataset. Read/write
totalRowCount: Number
Total record count if store are filled with Repository.withTotal()
option.
If DataStore is not initialized or empty or initialized without withTotal() will return -1.
Methods
execSQL(sql, params)
Execute SQL with parameters. Not wait result data
Arguments:
fieldIndexByName(fieldName)
Return zero based index of fieldName from current data store (-1 if not found)
Arguments:
-
fieldName
(String)
Example
var r = UB.Repository('cdn_organization').attrs(['ID', 'mi_owner.name']).where('[ID]', '=', 3000000002801).select();
console.log(r.fieldIndexByName('mi_owner.name')); // 1
console.log(r.fieldIndexByName('unexistedAttr')); // -1
first()
Move first
freeNative()
Release all internal resources. Store became unusable after call to freeNative()
generateID() → Number
Generate a new identifier (int64)
get(attrib) → Number|String
Return value of attribute.
In case store initialized using TubDataStore.run style we can return Number or String type,
but in case it initialized using runSQL columns data types is unknown and you must cast value do required type directly.
Arguments:
getAsBuffer(attrib) → ArrayBuffer
Return value of attribute as ArrayBuffer.
You can apply this method to blob fields only
Arguments:
initFromJSON(source)
init dataStore content from JSON string.
WARNING!!! during initFromJSON UnityBase determinate field types from vield values,
so if some data column contain only numeric values it becode Number (even if in source it String).
Arguments:
-
source
- Deprecated:
- Use `TubDataStore.initialize` instead
Example
const UB = require('@unitybase/ub')
let ds = UB.DataStore('myEntityCode')
ds.initFromJSON({"fieldCount":1,"values":["ID"],"rowCount":0});
console.log(ds.initialized); // TRUE
initialize(source, keyMapopt) → TubDataStore
Initialize DataStore from one of supported source formats:
- Flatten(fastest):
{fieldCount: K, rowCount: Z, values: [field1Name, ..., fieldKName, row1field1Value, ..., row1fieldKValue, row2field1Value,..]}
- Array-of-array :
[[row1field1Value, ..., row1fieldKValue], ..., [rowZfield1Value, ... rowZfieldKValue]
Array-of-object :
[{field1Name: row1field1Value, ..., fieldKName: row1fieldKValue}, ....]
Can (optionally) convert source field names to new names using keyMap array.
Arguments:
-
source
(Object|Array)
-
[keyMap]
(Array.<(String|Object)>)
 Optional mapping of source field names to new field names
Example
const UB = require('@unitybase/ub')
var ds = UB.DataStore('my_entity')
// init empty (rowCount=0) dataStore with provided fields.
// In case keyMap is omitted we consider it contain one attribute 'ID'
ds.initialize([]) // the same as ds.initialize([], ['ID'])
ds.initialize([], ['ID', 'name', {from: 'AGE', to: 'age'}])
// Initialize dataStore from array-of-object representation
// Resulting datstore will contain 3 field: ID, nam, age (in order, they listen in keyMap array).
// During initialization we convert fiend name 'AGE' -> age;
ds.initialize([
{ID: 10, name: 'Jon', AGE: 10},
{ID: 20, name: 'Smith', AGE: 63}
],
['ID', 'name', {from: 'AGE', to: 'age'}]
)
//the same, but do not convert AGE->age. Result dataset field order is unknown
ds.initialize([
{ID: 10, name: 'Jon', AGE: 10},
{ID: 20, name: 'Smith', AGE: 63}
])
//result dataset will contain only two field 'ID' & 'age'
ds.initialize([
{ID: 10, name: 'Jon', AGE: 10},
{ID: 20, name: 'Smith', AGE: 63}
],
['ID', {from: 'AGE', to: 'age'}]
)
// Initialize dataStore from Array-of-array data
// in this case keyMap is mandatory.
// In case of mapping from is zero-based index of source element in row array
ds.initialize([
[10, 'Jon', 10], [20, 'Smith', 63]], ['ID', 'name', 'age']
])
// or use mapping
ds.initialize([[10, 'Jon', 10], [20, 'Smith', 63]],
['ID', {from: 2, to: 'age'}, {from: 1, to: 'name'}])
last()
Move last
next()
Move next
prev()
Move prev
run(methodName, params) → Boolean
Run any entity method.
Arguments:
Example
let store = new TubDataStore('doc_attachment');
store.run('update', {execParams: {
ID: 1,
approved: 0
}
})
store.run('anyEntityMethod', {param1: 'valueOfParam1', ...})
runSQL(sql, params)
Execute SQL with parameters and place result into dataStore. This method expect SQL statement have result.
To execute SQL statement without result (insert
for example) - use TubDataStore.execSQL instead.
Arguments:
let store = ctx.dataStore
let prevData = store.currentDataName
try {
store.currentDataName = TubDataStore.DATA_NAMES.BEFORE_UPDATE
let valueBeforeUpdate = store.get('code')
} finally {
store.currentDataName = prevData
}
Array of array
format
[{attr1: value1, attr2: value2},... ]
TubDataStore.DATA_NAMES
Repository.withTotal()
option.
If DataStore is not initialized or empty or initialized without withTotal() will return -1.
execSQL(sql, params)
Arguments:
fieldIndexByName(fieldName)
Arguments:
-
fieldName
(String)
Example
var r = UB.Repository('cdn_organization').attrs(['ID', 'mi_owner.name']).where('[ID]', '=', 3000000002801).select();
console.log(r.fieldIndexByName('mi_owner.name')); // 1
console.log(r.fieldIndexByName('unexistedAttr')); // -1
first()
freeNative()
freeNative()
generateID() → Number
get(attrib) → Number|String
In case store initialized using TubDataStore.run style we can return Number or String type, but in case it initialized using runSQL columns data types is unknown and you must cast value do required type directly.
Arguments:
getAsBuffer(attrib) → ArrayBuffer
You can apply this method to blob fields only
Arguments:
initFromJSON(source)
Arguments:
-
source
- Deprecated:
- Use `TubDataStore.initialize` instead
Example
const UB = require('@unitybase/ub')
let ds = UB.DataStore('myEntityCode')
ds.initFromJSON({"fieldCount":1,"values":["ID"],"rowCount":0});
console.log(ds.initialized); // TRUE
initialize(source, keyMapopt) → TubDataStore
Initialize DataStore from one of supported source formats:
- Flatten(fastest):
{fieldCount: K, rowCount: Z, values: [field1Name, ..., fieldKName, row1field1Value, ..., row1fieldKValue, row2field1Value,..]}
- Array-of-array :
[[row1field1Value, ..., row1fieldKValue], ..., [rowZfield1Value, ... rowZfieldKValue]
Array-of-object :
[{field1Name: row1field1Value, ..., fieldKName: row1fieldKValue}, ....]
Can (optionally) convert source field names to new names using keyMap array.
Arguments:
-
source
(Object|Array)
-
[keyMap]
(Array.<(String|Object)>)
 Optional mapping of source field names to new field names
Example
const UB = require('@unitybase/ub')
var ds = UB.DataStore('my_entity')
// init empty (rowCount=0) dataStore with provided fields.
// In case keyMap is omitted we consider it contain one attribute 'ID'
ds.initialize([]) // the same as ds.initialize([], ['ID'])
ds.initialize([], ['ID', 'name', {from: 'AGE', to: 'age'}])
// Initialize dataStore from array-of-object representation
// Resulting datstore will contain 3 field: ID, nam, age (in order, they listen in keyMap array).
// During initialization we convert fiend name 'AGE' -> age;
ds.initialize([
{ID: 10, name: 'Jon', AGE: 10},
{ID: 20, name: 'Smith', AGE: 63}
],
['ID', 'name', {from: 'AGE', to: 'age'}]
)
//the same, but do not convert AGE->age. Result dataset field order is unknown
ds.initialize([
{ID: 10, name: 'Jon', AGE: 10},
{ID: 20, name: 'Smith', AGE: 63}
])
//result dataset will contain only two field 'ID' & 'age'
ds.initialize([
{ID: 10, name: 'Jon', AGE: 10},
{ID: 20, name: 'Smith', AGE: 63}
],
['ID', {from: 'AGE', to: 'age'}]
)
// Initialize dataStore from Array-of-array data
// in this case keyMap is mandatory.
// In case of mapping from is zero-based index of source element in row array
ds.initialize([
[10, 'Jon', 10], [20, 'Smith', 63]], ['ID', 'name', 'age']
])
// or use mapping
ds.initialize([[10, 'Jon', 10], [20, 'Smith', 63]],
['ID', {from: 2, to: 'age'}, {from: 1, to: 'name'}])
last()
next()
prev()
run(methodName, params) → Boolean
Arguments:
Example
let store = new TubDataStore('doc_attachment');
store.run('update', {execParams: {
ID: 1,
approved: 0
}
})
store.run('anyEntityMethod', {param1: 'valueOfParam1', ...})
runSQL(sql, params)
To execute SQL statement without result (insert
for example) - use TubDataStore.execSQL instead.