cordova-plugin-mfp-jsonstore
Version:
IBM MobileFirst Platform Foundation Cordova Plugin JSONStore
1,535 lines (1,275 loc) • 183 kB
JavaScript
/**
* =================================================================
* Source file taken from :: jsonstore_stub.js
* =================================================================
*/
/**
* @license
Licensed Materials - Property of IBM
(C) Copyright 2015 IBM Corp.
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.
*/
/*globals WL_*/
var WL = WL || {};
WL.JSONStore = (function(_) {
/*jshint strict:false*/
var publicAPI = [
'init',
'get',
'initCollection',
'usePassword',
'clearPassword',
'closeAll',
'documentify',
'changePassword',
'destroy',
'getErrorMessage',
'startTransaction',
'commitTransaction',
'rollbackTransaction',
'fileInfo',
'QueryPart'
];
var stub = {};
var jsonStoreEnabled = function() {
return !(_.isUndefined(WL._JSONStoreImpl));
};
_.each(publicAPI, function(apiName) {
var implName = apiName;
stub[apiName] =
(function(apiName, implName) {
return function() {
if (jsonStoreEnabled()) {
return WL._JSONStoreImpl[implName].apply(WL._JSONStoreImpl, arguments);
} else {
var featureName = 'JSONStore';
var cmd = 'WL.JSONStore.' + apiName;
var errMsg = 'Failed to call {1} because {0} is missing in the application. Add {0} to the application descriptor, rebuild and deploy it.';
throw new Error(WL.Utils.formatString(errMsg, featureName, cmd));
}
};
})(apiName, implName);
});
stub['syncOptions'] = { SYNC_NONE : 2, SYNC_UPSTREAM : 1, SYNC_DOWNSTREAM : 0 };
return stub;
}(WL_));
/**
* =================================================================
* Source file taken from :: jsonstore.js
* =================================================================
*/
/**
* @license
Licensed Materials - Property of IBM
(C) Copyright 2015 IBM Corp.
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.
*/
/*globals WLJQ, WL_, WLResourceRequest, cordova, sjcl, setTimeout, document, localStorage, JSONStoreWin8, ArrayBuffer */
/*jshint camelcase:false, maxparams:4*/
var WL = WL || {};
/**
* JSONStore Modules
*/
/**
Provides a namespace function for WL
@private
**/
WL.namespace = function(ns_string) {
'use strict';
var parts = ns_string.split('.'),
parent = WL,
i;
if (parts[0] === 'WL') {
parts = parts.slice(1);
}
for (i = 0; i < parts.length; i += 1) {
if (typeof parent[parts[i]] === 'undefined') {
parent[parts[i]] = {};
}
parent = parent[parts[i]];
}
return parent;
};
/**
Provides constants
@private
**/
WL.constant = (function() {
'use strict';
/**
Error Codes - Make sure you update wl.geterrormessage.tests.js
in QA/jsonstore if you change the error codes.
@private
*/
var ERROR = [],
UNKNOWN_FAILURE = -100,
OS_SECURITY_FAILURE = -75,
PERSISTENT_STORE_NOT_OPEN = -50,
FIPS_ENABLEMENT_FAILURE = -40,
TRANSACTION_IN_PROGRESS = -41,
NO_TRANSACTION_IN_PROGRESS = -42,
TRANSACTION_FAILURE = -43,
TRANSACTION_FAILURE_DURING_INIT = -44,
TRANSACTION_FAILURE_DURING_CLOSE_ALL = -45,
TRANSACTION_FAILURE_DURING_DESTROY = -46,
TRANSACTION_FAILURE_DURING_REMOVE_COLLECTION = -47,
TRANSACTION_FAILURE_DURING_ROLLBACK = -48,
DESTROY_FAILED_FILE_ERROR = -18,
DESTROY_FAILED_METADATA_REMOVAL_FAILURE = -19,
JSON_STORE_INVALID_JSON_STRUCTURE = -20,
JSON_STORE_STORE_DATA_PROTECTION_KEY_FAILURE = -21,
JSON_STORE_REMOVE_WITH_QUERIES_FAILURE = -22,
JSON_STORE_REPLACE_DOCUMENTS_FAILURE = -23,
JSON_STORE_FILE_INFO_ERROR = -24,
INVALID_SEARCH_FIELD_TYPES = -12,
OPERATION_FAILED_ON_SPECIFIC_DOCUMENT = -11,
ACCEPT_CONDITION_FAILED = -10,
OFFSET_WITHOUT_LIMIT = -9,
INVALID_LIMIT_OR_OFFSET = -8,
INVALID_USERNAME = -7,
USERNAME_MISMATCH_DETECTED = -6,
DESTROY_REMOVE_PERSISTENT_STORE_FAILED = -5,
DESTROY_REMOVE_KEYS_FAILED = -4,
INVALID_KEY_ON_PROVISION = -3,
PROVISION_TABLE_SEARCH_FIELDS_MISMATCH = -2,
PERSISTENT_STORE_FAILURE = -1,
SUCCESS = 0,
BAD_PARAMETER_EXPECTED_INT = 1,
BAD_PARAMETER_EXPECTED_STRING = 2,
BAD_PARAMETER_EXPECTED_FUNCTION = 3,
BAD_PARAMETER_EXPECTED_ALPHANUMERIC_STRING = 4,
BAD_PARAMETER_EXPECTED_OBJECT = 5,
BAD_PARAMETER_EXPECTED_SIMPLE_OBJECT = 6,
BAD_PARAMETER_EXPECTED_DOCUMENT = 7,
FAILED_TO_GET_UNPUSHED_DOCUMENTS_FROM_DB = 8,
NO_ADAPTER_LINKED_TO_COLLECTION = 9,
BAD_PARAMETER_EXPECTED_DOCUMENT_OR_ARRAY_OF_DOCUMENTS = 10,
INVALID_PASSWORD_EXPECTED_ALPHANUMERIC_STRING_WITH_LENGTH_GREATER_THAN_ZERO = 11,
ADAPTER_FAILURE = 12,
BAD_PARAMETER_EXPECTED_DOCUMENT_OR_ID = 13,
CAN_NOT_REPLACE_DEFAULT_FUNCTIONS = 14,
COULD_NOT_MARK_DOCUMENT_PUSHED = 15,
COULD_NOT_GET_SECURE_KEY = 16,
FAILED_TO_LOAD_INITIAL_DATA_FROM_ADAPTER = 17,
FAILED_TO_LOAD_INITIAL_DATA_FROM_ADAPTER_INVALID_LOAD_OBJ = 18,
INVALID_KEY_IN_LOAD_OBJECT = 19,
UNDEFINED_PUSH_OPERATION = 20,
INVALID_ADD_INDEX_KEY = 21,
INVALID_SEARCH_FIELD = 22,
ERROR_CLOSING_ALL = 23,
ERROR_CHANGING_PASSWORD = 24,
ERROR_DURING_DESTROY = 25,
ERROR_CLEARING_COLLECTION = 26,
INVALID_PARAMETER_FOR_FIND_BY_ID = 27,
INVALID_SORT_OBJECT = 28,
INVALID_FILTER_ARRAY = 29,
BAD_PARAMETER_EXPECTED_ARRAY_OF_OBJECTS = 30,
BAD_PARAMETER_EXPECTED_ARRAY_OF_CLEAN_DOCUMENTS = 31,
BAD_PARAMETER_WRONG_SEARCH_CRITERIA = 32;
ERROR[UNKNOWN_FAILURE] = 'UNKNOWN_FAILURE';
ERROR[OS_SECURITY_FAILURE] = 'OS_SECURITY_FAILURE';
ERROR[PERSISTENT_STORE_NOT_OPEN] = 'PERSISTENT_STORE_NOT_OPEN';
ERROR[FIPS_ENABLEMENT_FAILURE] = 'FIPS_ENABLEMENT_FAILURE';
ERROR[TRANSACTION_IN_PROGRESS] = 'TRANSACTION_IN_PROGRESS';
ERROR[NO_TRANSACTION_IN_PROGRESS] = 'NO_TRANSACTION_IN_PROGRESS';
ERROR[TRANSACTION_FAILURE] = 'TRANSACTION_FAILURE';
ERROR[TRANSACTION_FAILURE_DURING_INIT] = 'TRANSACTION_FAILURE_DURING_INIT';
ERROR[TRANSACTION_FAILURE_DURING_CLOSE_ALL] = 'TRANSACTION_FAILURE_DURING_CLOSE_ALL';
ERROR[TRANSACTION_FAILURE_DURING_DESTROY] = 'TRANSACTION_FAILURE_DURING_DESTROY';
ERROR[TRANSACTION_FAILURE_DURING_ROLLBACK] = 'TRANSACTION_FAILURE_DURING_ROLLBACK';
ERROR[DESTROY_FAILED_FILE_ERROR] = 'DESTROY_FAILED_FILE_ERROR';
ERROR[DESTROY_FAILED_METADATA_REMOVAL_FAILURE] = 'DESTROY_FAILED_METADATA_REMOVAL_FAILURE';
ERROR[JSON_STORE_INVALID_JSON_STRUCTURE] = 'JSON_STORE_INVALID_JSON_STRUCTURE';
ERROR[JSON_STORE_STORE_DATA_PROTECTION_KEY_FAILURE] = 'JSON_STORE_STORE_DATA_PROTECTION_KEY_FAILURE';
ERROR[JSON_STORE_REMOVE_WITH_QUERIES_FAILURE] = 'JSON_STORE_REMOVE_WITH_QUERIES_FAILURE';
ERROR[JSON_STORE_REPLACE_DOCUMENTS_FAILURE] = 'JSON_STORE_REPLACE_DOCUMENTS_FAILURE';
ERROR[JSON_STORE_FILE_INFO_ERROR] = 'JSON_STORE_FILE_INFO_ERROR';
ERROR[TRANSACTION_FAILURE_DURING_REMOVE_COLLECTION] = 'TRANSACTION_FAILURE_DURING_REMOVE_COLLECTION';
ERROR[INVALID_SEARCH_FIELD_TYPES] = 'INVALID_SEARCH_FIELD_TYPES';
ERROR[OPERATION_FAILED_ON_SPECIFIC_DOCUMENT] = 'OPERATION_FAILED_ON_SPECIFIC_DOCUMENT';
ERROR[ACCEPT_CONDITION_FAILED] = 'ACCEPT_CONDITION_FAILED';
ERROR[OFFSET_WITHOUT_LIMIT] = 'OFFSET_WITHOUT_LIMIT';
ERROR[INVALID_LIMIT_OR_OFFSET] = 'INVALID_LIMIT_OR_OFFSET';
ERROR[INVALID_USERNAME] = 'INVALID_USERNAME';
ERROR[USERNAME_MISMATCH_DETECTED] = 'USERNAME_MISMATCH_DETECTED';
ERROR[DESTROY_REMOVE_PERSISTENT_STORE_FAILED] = 'DESTROY_REMOVE_PERSISTENT_STORE_FAILED';
ERROR[DESTROY_REMOVE_KEYS_FAILED] = 'DESTROY_REMOVE_KEYS_FAILED';
ERROR[INVALID_KEY_ON_PROVISION] = 'INVALID_KEY_ON_PROVISION';
ERROR[PROVISION_TABLE_SEARCH_FIELDS_MISMATCH] = 'PROVISION_TABLE_SEARCH_FIELDS_MISMATCH';
ERROR[PERSISTENT_STORE_FAILURE] = 'PERSISTENT_STORE_FAILURE';
ERROR[SUCCESS] = 'SUCCESS';
ERROR[BAD_PARAMETER_EXPECTED_INT] = 'BAD_PARAMETER_EXPECTED_INT';
ERROR[BAD_PARAMETER_EXPECTED_STRING] = 'BAD_PARAMETER_EXPECTED_STRING';
ERROR[BAD_PARAMETER_EXPECTED_FUNCTION] = 'BAD_PARAMETER_EXPECTED_FUNCTION';
ERROR[BAD_PARAMETER_EXPECTED_ALPHANUMERIC_STRING] = 'BAD_PARAMETER_EXPECTED_ALPHANUMERIC_STRING';
ERROR[BAD_PARAMETER_EXPECTED_OBJECT] = 'BAD_PARAMETER_EXPECTED_OBJECT';
ERROR[BAD_PARAMETER_EXPECTED_SIMPLE_OBJECT] = 'BAD_PARAMETER_EXPECTED_SIMPLE_OBJECT';
ERROR[BAD_PARAMETER_EXPECTED_DOCUMENT] = 'BAD_PARAMETER_EXPECTED_DOCUMENT';
ERROR[FAILED_TO_GET_UNPUSHED_DOCUMENTS_FROM_DB] = 'FAILED_TO_GET_UNPUSHED_DOCUMENTS_FROM_DB';
ERROR[NO_ADAPTER_LINKED_TO_COLLECTION] = 'NO_ADAPTER_LINKED_TO_COLLECTION';
ERROR[BAD_PARAMETER_EXPECTED_DOCUMENT_OR_ARRAY_OF_DOCUMENTS] = 'BAD_PARAMETER_EXPECTED_DOCUMENT_OR_ARRAY_OF_DOCUMENTS';
ERROR[INVALID_PASSWORD_EXPECTED_ALPHANUMERIC_STRING_WITH_LENGTH_GREATER_THAN_ZERO] = 'INVALID_PASSWORD_EXPECTED_ALPHANUMERIC_STRING_WITH_LENGTH_GREATER_THAN_ZERO';
ERROR[ADAPTER_FAILURE] = 'ADAPTER_FAILURE';
ERROR[BAD_PARAMETER_EXPECTED_DOCUMENT_OR_ID] = 'BAD_PARAMETER_EXPECTED_DOCUMENT_OR_ID';
ERROR[CAN_NOT_REPLACE_DEFAULT_FUNCTIONS] = 'CAN_NOT_REPLACE_DEFAULT_FUNCTIONS';
ERROR[COULD_NOT_MARK_DOCUMENT_PUSHED] = 'COULD_NOT_MARK_DOCUMENT_PUSHED';
ERROR[COULD_NOT_GET_SECURE_KEY] = 'COULD_NOT_GET_SECURE_KEY';
ERROR[FAILED_TO_LOAD_INITIAL_DATA_FROM_ADAPTER] = 'FAILED_TO_LOAD_INITIAL_DATA_FROM_ADAPTER';
ERROR[FAILED_TO_LOAD_INITIAL_DATA_FROM_ADAPTER_INVALID_LOAD_OBJ] = 'FAILED_TO_LOAD_INITIAL_DATA_FROM_ADAPTER_INVALID_LOAD_OBJ';
ERROR[INVALID_KEY_IN_LOAD_OBJECT] = 'INVALID_KEY_IN_LOAD_OBJECT';
ERROR[UNDEFINED_PUSH_OPERATION] = 'UNDEFINED_PUSH_OPERATION';
ERROR[INVALID_ADD_INDEX_KEY] = 'INVALID_ADD_INDEX_KEY';
ERROR[INVALID_SEARCH_FIELD] = 'INVALID_SEARCH_FIELD';
ERROR[ERROR_CLOSING_ALL] = 'ERROR_CLOSING_ALL';
ERROR[ERROR_CHANGING_PASSWORD] = 'ERROR_CHANGING_PASSWORD';
ERROR[ERROR_DURING_DESTROY] = 'ERROR_DURING_DESTROY';
ERROR[ERROR_CLEARING_COLLECTION] = 'ERROR_CLEARING_COLLECTION';
ERROR[INVALID_PARAMETER_FOR_FIND_BY_ID] = 'INVALID_PARAMETER_FOR_FIND_BY_ID';
ERROR[INVALID_SORT_OBJECT] = 'INVALID_SORT_OBJECT';
ERROR[INVALID_FILTER_ARRAY] = 'INVALID_FILTER_ARRAY';
ERROR[BAD_PARAMETER_EXPECTED_ARRAY_OF_OBJECTS] = 'BAD_PARAMETER_EXPECTED_ARRAY_OF_OBJECTS';
ERROR[BAD_PARAMETER_EXPECTED_ARRAY_OF_CLEAN_DOCUMENTS] = 'BAD_PARAMETER_EXPECTED_ARRAY_OF_CLEAN_DOCUMENTS';
ERROR[BAD_PARAMETER_WRONG_SEARCH_CRITERIA] = 'BAD_PARAMETER_WRONG_SEARCH_CRITERIA';
//public api
return {
PKG_NAME: 'wl.jsonstore',
ID_KEY: '_id',
JSON_DATA_KEY: 'json',
INDEXES_KEY: '_indexes',
ARRAY_JOIN: '-@-',
OPERATION_KEY: '_operation',
DEFAULT_USERNAME: 'jsonstore',
USERNAME: 'username',
DEFAULT_KEYCHAIN_USERNAME: 'jsonstorekey',
DEFAULT_ANDROID_KEYCHAIN_ID: 'dpk',
DELETED_KEY: '_deleted',
DIRTY_KEY: '_dirty',
OPERATION_DELETED: 'remove',
METADATA_TAG: '#dgonz.metadata',
KEYGEN_NOT_REQUIERED: 1,
NOT_FOUND: 'Not found',
ASCENDING: 'asc',
DESCENDING: 'desc',
QUERYPART: '$',
PERIOD: '.',
LESSTHAN: 'lessThan',
LESSOREQUALTHAN: 'lessOrEqualThan',
GREATERTHAN: 'greaterThan',
GREATEROREQUALTHAN: 'greaterOrEqualThan',
EQUAL: 'equal',
NOTEQUAL: 'notEqual',
INSIDE: 'inside',
NOTINSIDE: 'notInside',
BETWEEN: 'between',
NOTBETWEEN: 'notBetween',
RIGHTLIKE: 'rightLike',
NOTRIGHTLIKE: 'notRightLike',
LEFTLIKE: 'leftLike',
NOTLEFTLIKE: 'notLeftLike',
LIKE: 'like',
NOTLIKE: 'notLike',
ERROR: ERROR,
//Exporting the error code contants
UNKNOWN_FAILURE: UNKNOWN_FAILURE,
OS_SECURITY_FAILURE : OS_SECURITY_FAILURE,
TRANSACTION_IN_PROGRESS: TRANSACTION_IN_PROGRESS,
FIPS_ENABLEMENT_FAILURE: FIPS_ENABLEMENT_FAILURE,
NO_TRANSACTION_IN_PROGRESS: NO_TRANSACTION_IN_PROGRESS,
TRANSACTION_FAILURE: TRANSACTION_FAILURE,
TRANSACTION_FAILURE_DURING_INIT: TRANSACTION_FAILURE_DURING_INIT,
TRANSACTION_FAILURE_DURING_CLOSE_ALL: TRANSACTION_FAILURE_DURING_CLOSE_ALL,
TRANSACTION_FAILURE_DURING_DESTROY: TRANSACTION_FAILURE_DURING_DESTROY,
TRANSACTION_FAILURE_DURING_REMOVE_COLLECTION: TRANSACTION_FAILURE_DURING_REMOVE_COLLECTION,
TRANSACTION_FAILURE_DURING_ROLLBACK: TRANSACTION_FAILURE_DURING_ROLLBACK,
DESTROY_FAILED_FILE_ERROR : DESTROY_FAILED_FILE_ERROR,
DESTROY_FAILED_METADATA_REMOVAL_FAILURE : DESTROY_FAILED_METADATA_REMOVAL_FAILURE,
JSON_STORE_INVALID_JSON_STRUCTURE: JSON_STORE_INVALID_JSON_STRUCTURE,
JSON_STORE_STORE_DATA_PROTECTION_KEY_FAILURE: JSON_STORE_STORE_DATA_PROTECTION_KEY_FAILURE,
JSON_STORE_REMOVE_WITH_QUERIES_FAILURE: JSON_STORE_REMOVE_WITH_QUERIES_FAILURE,
JSON_STORE_REPLACE_DOCUMENTS_FAILURE: JSON_STORE_REPLACE_DOCUMENTS_FAILURE,
JSON_STORE_FILE_INFO_ERROR: JSON_STORE_FILE_INFO_ERROR,
PERSISTENT_STORE_NOT_OPEN: PERSISTENT_STORE_NOT_OPEN,
INVALID_SEARCH_FIELD_TYPES: INVALID_SEARCH_FIELD_TYPES,
OPERATION_FAILED_ON_SPECIFIC_DOCUMENT: OPERATION_FAILED_ON_SPECIFIC_DOCUMENT,
ACCEPT_CONDITION_FAILED: ACCEPT_CONDITION_FAILED,
OFFSET_WITHOUT_LIMIT: OFFSET_WITHOUT_LIMIT,
INVALID_LIMIT_OR_OFFSET: INVALID_LIMIT_OR_OFFSET,
INVALID_USERNAME: INVALID_USERNAME,
USERNAME_MISMATCH_DETECTED: USERNAME_MISMATCH_DETECTED,
DESTROY_REMOVE_PERSISTENT_STORE_FAILED: DESTROY_REMOVE_PERSISTENT_STORE_FAILED,
DESTROY_REMOVE_KEYS_FAILED: DESTROY_REMOVE_KEYS_FAILED,
INVALID_KEY_ON_PROVISION: INVALID_KEY_ON_PROVISION,
PROVISION_TABLE_SEARCH_FIELDS_MISMATCH: PROVISION_TABLE_SEARCH_FIELDS_MISMATCH,
PERSISTENT_STORE_FAILURE: PERSISTENT_STORE_FAILURE,
SUCCESS: SUCCESS,
BAD_PARAMETER_EXPECTED_INT: BAD_PARAMETER_EXPECTED_INT,
BAD_PARAMETER_EXPECTED_STRING: BAD_PARAMETER_EXPECTED_STRING,
BAD_PARAMETER_EXPECTED_FUNCTION: BAD_PARAMETER_EXPECTED_FUNCTION,
BAD_PARAMETER_EXPECTED_ALPHANUMERIC_STRING: BAD_PARAMETER_EXPECTED_ALPHANUMERIC_STRING,
BAD_PARAMETER_EXPECTED_OBJECT: BAD_PARAMETER_EXPECTED_OBJECT,
BAD_PARAMETER_EXPECTED_SIMPLE_OBJECT: BAD_PARAMETER_EXPECTED_SIMPLE_OBJECT,
BAD_PARAMETER_EXPECTED_DOCUMENT: BAD_PARAMETER_EXPECTED_DOCUMENT,
FAILED_TO_GET_UNPUSHED_DOCUMENTS_FROM_DB: FAILED_TO_GET_UNPUSHED_DOCUMENTS_FROM_DB,
NO_ADAPTER_LINKED_TO_COLLECTION: NO_ADAPTER_LINKED_TO_COLLECTION,
BAD_PARAMETER_EXPECTED_DOCUMENT_OR_ARRAY_OF_DOCUMENTS: BAD_PARAMETER_EXPECTED_DOCUMENT_OR_ARRAY_OF_DOCUMENTS,
INVALID_PASSWORD_EXPECTED_ALPHANUMERIC_STRING_WITH_LENGTH_GREATER_THAN_ZERO: INVALID_PASSWORD_EXPECTED_ALPHANUMERIC_STRING_WITH_LENGTH_GREATER_THAN_ZERO,
ADAPTER_FAILURE: ADAPTER_FAILURE,
BAD_PARAMETER_EXPECTED_DOCUMENT_OR_ID: BAD_PARAMETER_EXPECTED_DOCUMENT_OR_ID,
CAN_NOT_REPLACE_DEFAULT_FUNCTIONS: CAN_NOT_REPLACE_DEFAULT_FUNCTIONS,
COULD_NOT_MARK_DOCUMENT_PUSHED: COULD_NOT_MARK_DOCUMENT_PUSHED,
COULD_NOT_GET_SECURE_KEY: COULD_NOT_GET_SECURE_KEY,
FAILED_TO_LOAD_INITIAL_DATA_FROM_ADAPTER: FAILED_TO_LOAD_INITIAL_DATA_FROM_ADAPTER,
FAILED_TO_LOAD_INITIAL_DATA_FROM_ADAPTER_INVALID_LOAD_OBJ: FAILED_TO_LOAD_INITIAL_DATA_FROM_ADAPTER_INVALID_LOAD_OBJ,
INVALID_KEY_IN_LOAD_OBJECT: INVALID_KEY_IN_LOAD_OBJECT,
UNDEFINED_PUSH_OPERATION: UNDEFINED_PUSH_OPERATION,
INVALID_ADD_INDEX_KEY: INVALID_ADD_INDEX_KEY,
INVALID_SEARCH_FIELD: INVALID_SEARCH_FIELD,
ERROR_CLOSING_ALL: ERROR_CLOSING_ALL,
ERROR_CHANGING_PASSWORD: ERROR_CHANGING_PASSWORD,
ERROR_DURING_DESTROY: ERROR_DURING_DESTROY,
ERROR_CLEARING_COLLECTION: ERROR_DURING_DESTROY,
INVALID_PARAMETER_FOR_FIND_BY_ID: INVALID_PARAMETER_FOR_FIND_BY_ID,
INVALID_SORT_OBJECT: INVALID_SORT_OBJECT,
INVALID_FILTER_ARRAY: INVALID_FILTER_ARRAY,
BAD_PARAMETER_EXPECTED_ARRAY_OF_OBJECTS: BAD_PARAMETER_EXPECTED_ARRAY_OF_OBJECTS,
BAD_PARAMETER_EXPECTED_ARRAY_OF_CLEAN_DOCUMENTS: BAD_PARAMETER_EXPECTED_ARRAY_OF_CLEAN_DOCUMENTS,
BAD_PARAMETER_WRONG_SEARCH_CRITERIA: BAD_PARAMETER_WRONG_SEARCH_CRITERIA
};
})(); //end WL.constant
/**
Provides some validation methods
@private
**/
WL.check = (function(jQuery, underscore) {
'use strict';
//Dependencies
var constant = WL.constant,
_ = underscore,
$ = jQuery,
//Support for isArray on older browsers
isArray = Array.isArray || function(obj) {
return Object.prototype.toString.call(obj) === '[object Array]';
};
var __isArray = function(input) {
return isArray(input);
};
var __isEmptyArray = function(arr) {
return (__isArray(arr) && arr.length === 0);
};
//Add pick!
var __filterPick = function(obj, keys, iterator, context) {
var results = [];
var parts = [];
if (obj === null) {
return results;
}
_.each(obj, function(value, index, list) {
keys.unshift(value);
if (iterator.call(context, value, index, list)) {
results[results.length] = _.pick.apply(context, keys);
}
});
if (!__isUndefined(context.filter)) {
_.each(results, function(value, index) {
parts[0] = _.pick(value, context.filter); //filter through json created such as _id, _operation, _deleted, etc...
parts[1] = _.pick(value.json, context.filter); //filter through json array
parts[2] = _.pick(value._indexes, context.filter); //filter through _indexes array
results[index] = _removeArrayComponents(_.merge(parts[0], parts[1], parts[2]));
});
}
results = _removeDuplicates(results);
return results;
};
var _removeArrayComponents = function(arr) {
var keys = _.keys(arr);
_.each(keys, function(value) {
if (value !== constant.JSON_DATA_KEY && __isArray(arr[value]) && arr[value].length < 2) {
arr[value] = '' + arr[value][0];
} else if (value !== constant.JSON_DATA_KEY && __isArray(arr[value]) && arr[value].length > 1) {
arr[value] = arr[value].join(constant.ARRAY_JOIN);
} else if (value === constant.DELETED_KEY) {
arr[value] = (arr[value] ? '1' : '0');
}
});
return arr;
};
var _removeDuplicates = function(arr) {
var map = [];
var newResults = [];
_.each(arr, function(value) {
if (__isUndefined(map[JSON.stringify(value)])) {
if (!__isUndefined(value._indexes)) {
delete value._indexes;
}
map[JSON.stringify(value)] = true;
newResults.push(value);
}
});
return newResults;
};
//Constants
var ALPHANUMERIC_REGEX = /^[a-z0-9]+$/i;
/** Checks if a string is alphanumeric.
@private
*/
var __isAlphaNumeric = function(string) {
var result = ALPHANUMERIC_REGEX.exec(string);
return (typeof string === 'string' && isArray(result) && result.length > 0 && result[0] === string);
};
/** Checks if input is an object.
Note: __isObject([]) = false by default,
if isArrayValid is true it returns true
@private
*/
var __isObject = function(input, obj) {
obj = obj || {};
var isArrayValidType = obj.isArrayValid || false;
if (typeof input === 'undefined' || typeof input !== 'object' || input === null) {
return false;
}
if (isArray(input) && !isArrayValidType) {
return false;
}
return true;
};
/** Checks if an object does not contain other objects or arrays.
@private
*/
var __isSimpleObject = function(obj) {
var key,
hasOwn = Object.prototype.hasOwnProperty;
if (!__isObject(obj)) {
return false;
}
for (key in obj) {
if (hasOwn.call(obj, key) && __isObject(obj[key], {
isArrayValid: true
}) || obj[key] === null) {
return false;
}
}
return true;
};
/** Private function to check if the array contains only objects and arrays.
@private
*/
var __isArrayOfObjects = function(arr) {
var i,
len;
if (!isArray(arr) || arr.length < 1) {
return false;
}
for (i = 0, len = arr.length; i < len; i++) {
if (!__isObject(arr[i])) {
return false;
}
}
return true;
};
/** Private function to check if an object contains duplicate keys, this will return true:
{fn: 'carlos', fN: 'Carlos', Fn: 'clos', FN: 'carlitos'})
@private
*/
var __containsDuplicateKeys = function(obj) {
var i,
len,
keys = [],
key,
hasOwn = Object.prototype.hasOwnProperty;
if (!__isObject(obj)) {
// fail the test, because it's not a valid object
return true;
}
for (key in obj) {
if (hasOwn.call(obj, key)) {
keys.push(key.toLowerCase());
}
}
keys = keys.sort();
//Guard against the {} case
if (keys.length <= 0) {
return false;
}
for (i = 0, len = keys.length; i < len - 1; i++) {
if (keys[i + 1] === keys[i]) {
return true;
}
}
return false; //all green!
};
/** Checks if an object is a valid adapter.
@private
*/
var __isValidAdapter = function(obj) {
return __isObject(obj) &&
typeof obj.name === 'string' &&
obj.name.length > 0;
};
/** Checks if the input (num) is an integer.
@private
*/
var __isInt = function(num) {
return (typeof num === 'number' && parseFloat(num) === parseInt(num, 10) && !isNaN(num));
};
/** Checks if the input (arrray) are all integers.
@private
*/
var __isArrayOfInts = function(intArr) {
var i,
len;
if (!isArray(intArr) || intArr.length < 1) {
return false;
}
for (i = 0, len = intArr.length; i < len; i++) {
if (!__isInt(intArr[i])) {
return false;
}
}
return true;
};
/** Checks if the input (arrray) are all documents.
@private
*/
var __isArrayOfDocuments = function(docArr) {
var i,
len;
if (!isArray(docArr) || docArr.length < 1) {
return false;
}
for (i = 0, len = docArr.length; i < len; i++) {
if (!__isValidDocument(docArr[i])) {
return false;
}
}
return true;
};
/** Checks if the input (array) are clean objects thath include _id, json, operation, deleted, and dirty
@private
*/
var __isArrayOfCleanDocuments = function(docArr) {
var i,
len;
if (isArray(docArr) && docArr.length === 0) {
return true;
} else if (!isArray(docArr) || docArr.length < 1) {
return false;
}
for (i = 0, len = docArr.length; i < len; i++) {
if (!__isValidDocument(docArr[i]) && !__isString(docArr[i][constant.OPERATION_KEY]) && !__isString(docArr[i][constant.DIRTY_KEY]) && !__isBoolean(docArr[i][constant.DELETED_KEY])) {
return false;
}
}
return true;
};
/** Checks if the (input) object has json specific searchfields (ie: _deleted, json)
Valid input : ['_id', 'json', '_deleted', '_operation', '_dirty']
@private
*/
var __hasJSONSearchFields = function(arr) {
var jsonFields = ['_id', 'json', '_deleted', '_operation', '_dirty'];
return (_.intersection(arr, jsonFields).length > 0);
};
/** Checks if the object passed is a valid document.
Valid object: {_id: 0, json: {...}}
@private
*/
var __isValidDocument = function(doc) {
return (__isObject(doc) &&
__isInt(Number(doc[constant.ID_KEY])) &&
__isObject(doc[constant.JSON_DATA_KEY]));
};
/** Checks if func is a function
@private
*/
var __isFunction = function(func) {
return typeof func === 'function';
};
/** Checks if str is a string
@private
*/
var __isString = function(str) {
return typeof str === 'string';
};
/** Checks if input is undefined (or null)
@private
*/
var __isUndefined = function(input) {
return (typeof input === 'undefined' || input === null);
};
/** Checks if input is a boolean
@private
*/
var __isBoolean = function(input) {
return typeof input === 'boolean';
};
/** Checks if input is a compatible boolean
Valid Example : '1', '0', 1, 0, true, false
@private
*/
var __isCompatibleBoolean = function(input) {
if ((typeof input === 'boolean') ||
(__isInt(input) && input === 1 || input === 0) ||
(__isString(input) && input === '1' || input === '0')) {
return true;
} else {
return false;
}
};
/** Checks if valid load object
Valid Example: { procedure: 'getCustomers', params: [], key: "customers" }
@private
*/
var __isValidLoadObject = function(obj) {
if (!__isObject(obj)) {
return false;
}
return (__isString(obj.procedure) && isArray(obj.params) && __isString(obj.key));
};
/** Merges to objects
var obj1 = {fn: 'carlos'}, var obj2 = {ln: 'andreu'};
mergeObjects(obj1,obj2) => {fn: 'carlos', ln: 'andreu'}
@private
*/
var __mergeObjects = function(obj1, obj2) {
if (!__isObject(obj1) || !__isObject(obj2)) {
return -1;
}
//prevent corrupting obj references
var cloneOb1 = _.cloneDeep(obj1);
var cloneOb2 = _.cloneDeep(obj2);
return $.extend(cloneOb1, cloneOb2);
};
/** Checks if it's part of the searchFields, if you pass additionalSearchFields
it will also check those and only return true if it's inside one of those objects.
@private
*/
var __isPartofSearchFields = function(obj, searchFields, additionalSearchFields) {
if (!__isSimpleObject(obj) || !__isSimpleObject(searchFields)) {
return false;
}
var key,
hasOwn = Object.prototype.hasOwnProperty,
allSearchFields = searchFields;
//We want to make _id a valid searchField
allSearchFields[constant.ID_KEY] = 'number';
if (!__isUndefined(additionalSearchFields)) {
allSearchFields = __mergeObjects(searchFields, additionalSearchFields);
}
//search searchFields in obj
for (key in obj) {
if (hasOwn.call(obj, key) && __isUndefined(allSearchFields[key.toLocaleLowerCase()])) {
return false;
}
}
return true;
};
/** Counts how many keys an object has
@private
*/
var __countKeys = function(obj) {
if (!__isObject(obj)) {
return -1;
}
//This is faster but not supported everywhere
if (!__isUndefined(Object.keys)) {
return Object.keys(obj).length;
//Loop over the keys and count them
} else {
var key,
hasOwn = Object.prototype.hasOwnProperty,
count = 0;
for (key in obj) {
if (hasOwn.call(obj, key)) {
count++;
}
}
return count;
}
};
/** Checks if a reserved word is used
@private
*/
var __isReservedWord = function(username) {
if (!__isString(username)) {
return false;
}
var usr = username.toLowerCase();
return (usr.indexOf(constant.DEFAULT_USERNAME) === 0 ||
usr.indexOf(constant.DEFAULT_KEYCHAIN_USERNAME) === 0 ||
usr.indexOf(constant.DEFAULT_ANDROID_KEYCHAIN_ID) === 0);
};
/** Checks if the search fields object has valid types
@private
*/
var __isValidSchemaObject = function(obj) {
var key,
hasOwn = Object.prototype.hasOwnProperty,
invalidKeys = [constant.ID_KEY, constant.OPERATION_KEY, constant.DELETED_KEY, constant.DIRTY_KEY, constant.JSON_DATA_KEY],
validTypes = ['string', 'integer', 'boolean', 'number'];
for (key in obj) {
if (hasOwn.call(obj, key) && validTypes.indexOf(obj[key]) === -1 || invalidKeys.indexOf(key) > -1) {
return false;
}
}
return true;
};
/** Checks if n is a number
@private
*/
var __isNumber = function(n) {
return !isNaN(parseFloat(n)) && isFinite(n);
};
/** Checks if sortObj is a valid sort object for a query
@private
*/
var __isValidSortObject = function(sortObj, searchFields, additionalSearchFields) {
var propertiesValidated = 0,
sortObjKey, sortStr;
for (sortObjKey in sortObj) {
if (sortObj.hasOwnProperty(sortObjKey)) {
if (propertiesValidated > 0) {
WL.Logger.trace('Sort object ' + JSON.stringify(sortObj) + ' has more than one property. Each object must have only one property.');
return false;
}
//check is sortObjKey is lowerCase
if (_.isUndefined(searchFields[sortObjKey.toLowerCase()]) && _.isUndefined(additionalSearchFields[sortObjKey.toLowerCase()])) {
WL.Logger.trace('Sort key ' + sortObjKey + ' is not part of search fields: ' + JSON.stringify(searchFields) + ' or additional search fields: ' + JSON.stringify(additionalSearchFields));
return false;
}
sortStr = sortObj[sortObjKey];
//Check that the string that specifies sorting order says either "asc" or "desc"
if (__isString(sortStr) && sortStr.length > 0 && (/^(a|de)sc$/i.test(sortStr))) {
WL.Logger.trace('Sort key ' + sortObjKey + 'is not one of the valid strings.');
propertiesValidated++;
} else {
return false;
}
}
}
if (propertiesValidated === 0) {
return false;
}
return true;
};
var __isArrayOfSAFields = function(filterArray, allSearchFields, allAdditionalSearchFields) {
if (!__isArray(filterArray)) {
return false;
}
var len = filterArray.length,
allSearchFieldsKeys = _.keys(allSearchFields),
allAdditionalSearchFieldsKeys = _.keys(allAdditionalSearchFields),
jsonstoreKeys = [constant.ID_KEY, constant.JSON_DATA_KEY,
constant.DIRTY_KEY, constant.DELETED_KEY,
constant.OPERATION_KEY
],
current;
while (len--) {
current = filterArray[len];
if (!_.contains(allSearchFieldsKeys, current) && !_.contains(allAdditionalSearchFieldsKeys, current) && !_.contains(jsonstoreKeys, current)) {
return false;
}
}
return true;
};
//public api
return {
isAlphaNumeric: __isAlphaNumeric,
isObject: __isObject,
isSimpleObject: __isSimpleObject,
isArrayOfObjects: __isArrayOfObjects,
containsDuplicateKeys: __containsDuplicateKeys,
isValidAdapter: __isValidAdapter,
isInt: __isInt,
isValidDocument: __isValidDocument,
isFunction: __isFunction,
isString: __isString,
isUndefined: __isUndefined,
isBoolean: __isBoolean,
isCompatibleBoolean: __isCompatibleBoolean,
isValidLoadObject: __isValidLoadObject,
isPartofSearchFields: __isPartofSearchFields,
countKeys: __countKeys,
mergeObjects: __mergeObjects,
isReservedWord: __isReservedWord,
isArrayOfInts: __isArrayOfInts,
isValidSchemaObject: __isValidSchemaObject,
isNumber: __isNumber,
filterPick: __filterPick,
isArrayOfDocuments: __isArrayOfDocuments,
isArray: __isArray,
isEmptyArray: __isEmptyArray,
isValidSortObject: __isValidSortObject,
isArrayOfSAFields: __isArrayOfSAFields,
isArrayOfCleanDocuments: __isArrayOfCleanDocuments,
hasJSONSearchFields: __hasJSONSearchFields
};
})(WLJQ, WL_); //end WL.check
/**
Provides support for setting up callbacks with events.
@private
**/
WL.callback = (function(jQuery) {
'use strict';
//Dependencies
var check = WL.check,
constant = WL.constant,
$ = jQuery;
/**
Error object returned by rejected deferreds
@private
@param obj {object} src = source of the error,
err = error int, col = collection name, usr = username,
doc = doc that failed and res = response from the server.
*/
var ErrorObject = function(obj) {
this.src = obj.src || '';
this.err = obj.err || constant.UNKNOWN_FAILURE;
this.msg = WL.JSONStore.getErrorMessage(this.err);
this.col = obj.col || '';
this.usr = obj.usr || constant.DEFAULT_USERNAME;
this.doc = obj.doc || {};
this.res = obj.res || {};
};
ErrorObject.prototype.toString = function() {
return JSON.stringify(this, null, ' ');
};
//Private Members
/*jshint maxparams:6*/
var _generate = function(options, events, src, collectionName, username, deferred) {
var success,
failure;
success = function(data, more) {
//Push is a special case we handle separately, search for __push
if (!check.isUndefined(deferred) && 'push' !== src) {
deferred.resolve(data, more);
}
//Send the WL/JSONSTORE/SUCCESS event
$(document.body).trigger(events.success, [data, src, collectionName, more, username]);
//Call the user provided callback if there is one
if (check.isObject(options) && check.isFunction(options.onSuccess)) {
options.onSuccess(data, more);
}
},
failure = function(data, more) {
var errorObject = {
src: src,
col: collectionName,
usr: username
},
realErrorObject;
if (check.isInt(data)) {
errorObject.err = data;
errorObject.msg = WL.JSONStore.getErrorMessage(data);
} else {
//We got a document back instead of an error code
errorObject.doc = data;
errorObject.err = -11;
errorObject.msg = WL.JSONStore.getErrorMessage(-11);
}
realErrorObject = new ErrorObject(errorObject);
//Resolve with an error object
if (!check.isUndefined(deferred)) {
deferred.reject(realErrorObject);
}
WL.Logger.ctx({
pkg: constant.PKG_NAME
}).error(realErrorObject);
//Send the WL/JSONSTORE/FAILURE event
$(document.body).trigger(events.failure, [data, src, collectionName, more, username]);
//Call the user provided callback if there is one
if (check.isObject(options) && check.isFunction(options.onFailure)) {
options.onFailure(data, more);
}
};
return {
onSuccess: success,
onFailure: failure
};
};
//public api
return {
generate: _generate,
ErrorObject: ErrorObject
};
})(WLJQ); //end WL.callback
/**
Provides a way to traverse JSON objects in JavaScript
@private
**/
WL.jspath = (function(jQuery) {
'use strict';
var $ = jQuery,
check = WL.check,
__locate = function(element, key) {
var arr = [];
function traverse(currentKey, curretValue, parentPath) {
if (check.isObject(curretValue, {
isArrayValid: true
}) && !check.isUndefined(curretValue)) {
if (!check.isUndefined(currentKey)) {
parentPath.push(currentKey);
}
$.map(curretValue, function(v, k) {
if (key === k) {
arr.push({
parent: parentPath.join('.').replace('.', ''),
key: k,
value: v
});
}
traverse(k, v, parentPath);
});
if (!check.isUndefined(currentKey)) {
parentPath.pop();
}
}
}
traverse('', element, []);
return arr;
},
__get = function(data, element, parent) {
var databack,
arr = [],
currentParent;
if (check.isUndefined(parent)) {
parent = 'root';
}
if (!check.isObject(data, {
isArrayValid: true
}) || !check.isString(element) || !check.isString(parent)) {
return [];
}
if (parent === 'root') {
return [data[element]];
}
databack = __locate(data, element);
for (var i = 0; i < databack.length; i++) {
currentParent = databack[i].parent;
if (currentParent.indexOf(parent) >= 0) {
arr.push(databack[i].value);
}
}
return arr;
};
//public api
return {
get: __get
};
})(WLJQ); //end WL.jspath
/**
Provide iterators for advancedFind
@private
**/
WL.findIterator = (function(underscore) {
'use strict';
var check = WL.check,
constant = WL.constant,
_ = underscore,
__inequalityComparator = function(value, index, list) {
var self = this,
sc,
sv,
flag = false,
pattLeft,
pattRight,
hasOwn = Object.prototype.hasOwnProperty;
_.each(list, function(iSearch, vSearch) {
if (check.isCompatibleBoolean(self.searchStr[vSearch])) {
if (check.isString(self.searchStr[vSearch])) {
self.searchStr[vSearch] = (self.searchStr[vSearch] === '1' ? 1 : 0);
} else {
self.searchStr[vSearch] = (self.searchStr[vSearch] ? 1 : 0);
}
}
if (check.isCompatibleBoolean(iSearch[0])) {
iSearch[0] = (iSearch[0] === '0' ? 0 : iSearch[0]);
iSearch[0] = (iSearch[0] === '1' ? 1 : iSearch[0]);
}
if (hasOwn.call(self.searchStr, vSearch) && (check.isNumber(iSearch[0]) || check.isString(iSearch[0]))) {
sc = '' + iSearch[0];
sv = '' + self.searchStr[vSearch];
pattLeft = new RegExp('(' + self.searchStr[vSearch] + '$)', ['ig']);
pattRight = new RegExp('(^' + self.searchStr[vSearch] + ')', ['ig']);
if (self.kLower === constant.LEFTLIKE.toLowerCase()) {
if (sc.match(pattLeft) !== null) {
flag = true;
}
} else if (self.kLower === constant.NOTLEFTLIKE.toLowerCase()) {
if (sc.match(pattLeft) === null) {
flag = true;
}
} else if (self.kLower === constant.RIGHTLIKE.toLowerCase()) {
if (sc.match(pattRight) !== null) {
flag = true;
}
} else if (self.kLower === constant.NOTRIGHTLIKE.toLowerCase()) {
if (sc.match(pattRight) === null) {
flag = true;
}
} else if (self.kLower === constant.LIKE.toLowerCase() && sc.toLowerCase().indexOf(sv.toLowerCase()) > -1) {
flag = true;
} else if (self.kLower === constant.NOTLIKE.toLowerCase() && sc.toLowerCase().indexOf(sv.toLowerCase()) === -1) {
flag = true;
} else if (self.kLower === constant.EQUAL.toLowerCase() && iSearch[0] === self.searchStr[vSearch]) {
flag = true;
} else if (self.kLower === constant.NOTEQUAL.toLowerCase() && iSearch[0] !== self.searchStr[vSearch]) {
flag = true;
}
}
if (hasOwn.call(self.searchStr, vSearch) && check.isNumber(iSearch[0]) && !flag) {
if (self.kLower === constant.LESSTHAN.toLowerCase() && iSearch[0] < self.searchStr[vSearch]) {
flag = true;
} else if (self.kLower === constant.LESSOREQUALTHAN.toLowerCase() && iSearch[0] <= self.searchStr[vSearch]) {
flag = true;
} else if (self.kLower === constant.GREATERTHAN.toLowerCase() && iSearch[0] > self.searchStr[vSearch]) {
flag = true;
} else if (self.kLower === constant.GREATEROREQUALTHAN.toLowerCase() && iSearch[0] >= self.searchStr[vSearch]) {
flag = true;
} else {
flag = false;
}
}
if (hasOwn.call(self.searchStr, vSearch) && check.isCompatibleBoolean(iSearch[0]) && !flag) {
if (self.kLower === constant.LESSTHAN.toLowerCase() && iSearch[0] < self.searchStr[vSearch]) {
flag = true;
} else if (self.kLower === constant.LESSOREQUALTHAN.toLowerCase() && iSearch[0] <= self.searchStr[vSearch]) {
flag = true;
} else if (self.kLower === constant.GREATERTHAN.toLowerCase() && iSearch[0] > self.searchStr[vSearch]) {
flag = true;
} else if (self.kLower === constant.GREATEROREQUALTHAN.toLowerCase() && iSearch[0] >= self.searchStr[vSearch]) {
flag = true;
/*jshint eqeqeq:false*/
} else if (self.kLower === constant.EQUAL.toLowerCase() && iSearch[0] == self.searchStr[vSearch]) {
flag = true;
} else if (self.kLower === constant.NOTEQUAL.toLowerCase() && iSearch[0] !== self.searchStr[vSearch]) {
flag = true;
} else {
flag = false;
}
}
});
return flag;
},
__rangeComparator = function(value, index, list) {
var self = this,
flag = false,
hasOwn = Object.prototype.hasOwnProperty;
_.each(list, function(iSearch, vSearch) {
if (!check.isUndefined(self.searchStr[vSearch]) &&
check.isCompatibleBoolean(self.searchStr[vSearch][0]) && check.isCompatibleBoolean(self.searchStr[vSearch][1])) {
if (check.isString(self.searchStr[vSearch][0]) && check.isString(self.searchStr[vSearch][1])) {
self.searchStr[vSearch][0] = (self.searchStr[vSearch][0] === '1' ? 1 : 0);
self.searchStr[vSearch][1] = (self.searchStr[vSearch][1] === '1' ? 1 : 0);
} else {
self.searchStr[vSearch][0] = (self.searchStr[vSearch][0] ? 1 : 0);
self.searchStr[vSearch][1] = (self.searchStr[vSearch][1] ? 1 : 0);
}
}
if (check.isCompatibleBoolean(iSearch[0])) {
iSearch[0] = (iSearch[0] === '0' ? 0 : iSearch[0]);
iSearch[0] = (iSearch[0] === '1' ? 1 : iSearch[0]);
}
if (hasOwn.call(self.searchStr, vSearch) && (check.isNumber(iSearch[0]) || check.isString(iSearch[0]) || check.isCompatibleBoolean(iSearch[0]))) {
if (self.kLower === constant.INSIDE.toLowerCase() && _.contains(self.searchStr[vSearch], iSearch[0])) {
flag = true;
} else if (self.kLower === constant.NOTINSIDE.toLowerCase() && !_.contains(self.searchStr[vSearch], iSearch[0])) {
flag = true;
} else if (self.kLower === constant.BETWEEN.toLowerCase() && self.searchStr[vSearch].length !== 2) {
flag = true; //syntax error (ignore comparator)
} else if (self.kLower === constant.BETWEEN.toLowerCase() &&
(iSearch[0] >= self.searchStr[vSearch][0] && iSearch[0] <= self.searchStr[vSearch][1])) {
flag = true;
} else if (self.kLower === constant.NOTBETWEEN.toLowerCase() && !(iSearch[0] >= self.searchStr[vSearch][0] && iSearch[0] <= self.searchStr[vSearch][1])) {
flag = true;
} else if (self.kLower === constant.NOTBETWEEN.toLowerCase() && self.searchStr[vSearch].length !== 2) {
flag = true; //syntax error (ignore comparator)
} else {
flag = false;
}
}
});
return flag;
},
__get = function(iteratorName) {
var map = {
lessthan: __inequalityComparator,
lessorequalthan: __inequalityComparator,
greaterthan: __inequalityComparator,
greaterorequalthan: __inequalityComparator,
equal: __inequalityComparator,
notequal: __inequalityComparator,
inside: __rangeComparator,
notinside: __rangeComparator,
between: __rangeComparator,
notbetween: __rangeComparator,
leftlike: __inequalityComparator,
notleftlike: __inequalityComparator,
rightlike: __inequalityComparator,
notrightlike: __inequalityComparator,
notlike: __inequalityComparator,
like: __inequalityComparator
};
return map[iteratorName];
};
//public api
return {
get: __get
};
})(WL_); //end WL.findIterator
if (WL.Client.getEnvironment() === WL.Environment.IPHONE ||
WL.Client.getEnvironment() === WL.Environment.IPAD ||
WL.Client.getEnvironment() === WL.Environment.ANDROID ||
WL.Client.getEnvironment() === WL.Environment.WINDOWS8 ||
WL.Client.getEnvironment() === WL.Environment.WINDOWS ||
WL.Client.getEnvironment() === WL.Environment.WINDOWSPHONE8) {
/**
Provides access to our internal storage via cordova.
Internally used in WL.JSONStore.
@private
**/
WL.db = (function(jQuery) {
'use strict';
//dependencies
var cdv = cordova,
$ = jQuery,
//constants
STORAGE_PLUGIN = 'StoragePlugin',
PROVISION_METHOD = 'provision',
STORE_METHOD = 'store',
FIND_METHOD = 'find',
FIND_BY_ID_METHOD = 'findById',
ADVANCED_FIND_METHOD = 'advancedFind',
REPLACE_METHOD = 'replace',
REMOVE_METHOD = 'remove',
ALL_DIRTY_METHOD = 'allDirty',
CLEAN_METHOD = 'markClean',
QUEUE_COUNT_METHOD = 'localCount',
COLLECTION_COUNT_METHOD = 'count',
IS_DIRTY_METHOD = 'isDirty',
DROP_TABLE_METHOD = 'dropTable',
CHANGE_PW_METHOD = 'changePassword',
CLOSE_METHOD = 'closeDatabase',
DESTROY_METHOD = 'destroyDbFileAndKeychain',
IS_KEY_GEN_REQ_METHOD = 'isKeyGenRequired',
START_TRANSACTION_METHOD = 'startTransaction',
COMMIT_TRANSACTION_METHOD = 'commitTransaction',
ROLLBACK_TRANSACTION_METHOD = 'rollbackTransaction',
CHANGE_METHOD = 'change',
CLEAR_METHOD = 'clear',
FILE_INFO_METHOD = 'fileInfo',
SYNC_METHOD = 'sync',
__callNative = function(args, options, pluginName, nativeFunction) {
cdv.exec(options.onSuccess, options.onFailure, pluginName, nativeFunction, args);
},
_provision = function(collection, searchFields, options) {
__callNative([collection, searchFields, options], options, STORAGE_PLUGIN, PROVISION_METHOD);
},
_store = function(collection, data, options) {
__callNative([collection, data, options], options, STORAGE_PLUGIN, STORE_METHOD);
},
_find = function(collection, query, options) {
__callNative([collection, query, options], options, STORAGE_PLUGIN, FIND_METHOD);
},
_sync = function(collection,options){
__callNative([collection], options, STORAGE_PLUGIN, SYNC_METHOD);
},
_findById = function(collection, id, options) {
__callNative([collection, id], options, STORAGE_PLUGIN, FIND_BY_ID_METHOD);
},
_advancedFind = function(collection, query, options) {
__callNative([collection, query, options], options, STORAGE_PLUGIN, ADVANCED_FIND_METHOD);
},
_replace = function(collection, doc, options) {
__callNative([collection, doc, options], options, STORAGE_PLUGIN, REPLACE_METHOD);
},
_remove = function(collection, query, options) {
__callNative([collection, query, options], options, STORAGE_PLUGIN, REMOVE_METHOD);
},
_allDirty = function(collection, docs, options) {
__callNative([collection, docs], options, STORAGE_PLUGIN, ALL_DIRTY_METHOD);
},
_clean = function(collection, documents) {
//The method was changed to use promises instead of callbacks.
var deferred = $.Deferred(),
options = {
onSuccess: function(rc) {
deferred.resolve(rc);
},
onFailure: function(err) {
deferred.reject(err);
}
};
__callNative([collection, documents], options, STORAGE_PLUGIN, CLEAN_METHOD);
return deferred.promise();
},
_localCount = function(collection, options) {
__callNative([collection], options, STORAGE_PLUGIN, QUEUE_COUNT_METHOD);
},
_count = function(collection, options, query) {
__callNative([collection, query, options], options, STORAGE_PLUGIN, COLLECTION_COUNT_METHOD);
},
_isDirty = function(collection, docId, options) {
__callNative([collection, docId], options, STORAGE_PLUGIN, IS_DIRTY_METHOD);
},
_clear = function(collection, options) {
__callNative([collection], options, STORAGE_PLUGIN, DROP_TABLE_METHOD);
},
_change = function(collection, data, options) {
__callNative([collection, data, options], options, STORAGE_PLUGIN, CHANGE_METHOD);
},
_clearCollection = function(collection, options) {
__callNative([collection], options, STORAGE_PLUGIN, CLEAR_METHOD);
},
_changePW = function(oldPw, newPw, username, options) {
__callNative([oldPw, newPw, username], options, STORAGE_PLUGIN, CHANGE_PW_METHOD);
oldPw = null;
newPw = null;
},
_closeDatabase = function(options) {
__callNative([], options, STORAGE_PLUGIN, CLOSE_METHOD);
},
_destroy = function(options, username) {
__callNative([username], options, STORAGE_PLUGIN, DESTROY_METHOD);
},
_isKeyGenReq = function(username, callback) {
var options = {
onSuccess: callback,
onFailure: callback
};
__callNative([username], options, STORAGE_PLUGIN, IS_KEY_GEN_REQ_METHOD);
},
_startTransaction = function(callbacks) {
__callNative([], callbacks, STORAGE_PLUGIN, START_TRANSACTION_METHOD);
},
_commitTransaction = function(callbacks) {
__callNative([], callbacks, STORAGE_PLUGIN, COMMIT_TRANSACTION_METHOD);
},
_rollbackTransaction = function(callbacks) {
__callNative([], callbacks, STORAGE_PLUGIN, ROLLBACK_TRANSACTION_METHOD);
},
_fileInfo = function(callbacks) {
__callNative([], callbacks, STORAGE_PLUGIN, FILE_INFO_METHOD);
},
win8Plugin;
if (WL.Client.getEnvironment() === WL.Environment.WINDOWS8 || WL.Client.getEnvironment() === WL.Environment.WINDOWS || WL.Client.getEnvironment() === WL.Environment.WINDOWSPHONE8 ) {
var base64 = cdv.require('cordova/base64');
win8Plugin = new JSONStoreWin8.StoragePlugin();
__callNative = function(args, options, pluginName, nativeFunction) {
var onSuccess = options.onSuccess,
onFailure = options.onFailure;
var resultHandler = function(result) {
if (result.isSuccess) {
onSuccess(JSON.parse(result.value));
} else {
onFailure(JSON.parse(result.value));
}
};
for (var n = 0; n < ar