/** * Copyright 2009 Google Inc. * * Licensed 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. */ import("jsutils.*"); import("sqlbase.sqlcommon"); import("fastJSON"); import("timer"); jimport("java.lang.System.out.println"); function _sqlbase() { return sqlcommon.getSqlBase(); } /** * Creates a SQL table suitable for storing a mapping from String to JSON value. * Maximum key length is 128 characters. Has no effect if the table already exists. */ function createJSONTable(tableName) { _sqlbase().createJSONTable(String(tableName)); } /** * Retrieves a JavaScript object or value from a table. Returns undefined * if there is no mapping for the given string key. Requires that the table * exist. */ function getJSON(tableName, stringKey) { var result = _sqlbase().getJSON(String(tableName), String(stringKey)); if (result) { return fastJSON.parse(String(result))['x']; /* performance-testing JSON var obj1 = timer.time("JSON.parse (json2)", function() { return JSON.parse(String(result))['x']; }); var obj2 = timer.time("JSON.parse (fastJSON)", function() { return fastJSON.parse(String(result))['x']; }); return obj2; */ } return undefined; } function getAllJSON(tableName, start, count) { var result = _sqlbase().getAllJSON(String(tableName), Number(start), Number(count)); return Array.prototype.map.call(result, function(x) { return {id: x.id(), value: fastJSON.parse(String(x.value()))['x']}; }) } function getAllJSONKeys(tableName) { var result = _sqlbase().getAllJSONKeys(String(tableName)); return Array.prototype.map.call(result, function(x) { return String(x); }); } /** * Assigns a JavaScript object or primitive value to a string key in a table. * Maximum key length is 128 characters. Requires that the table exist. */ function putJSON(tableName, stringKey, objectOrValue) { var obj = ({x:objectOrValue}); var json = fastJSON.stringify(obj); /* performance-testing JSON var json1 = timer.time("JSON.stringify (json2)", function() { return JSON.stringify(obj); }); var json2 = timer.time("JSON.stringify (fastJSON)", function() { return fastJSON.stringify(obj); }); if (json1 != json2) { println("json strings do not match!"); println("\n\n"); println(json1); println("\n"); println(json2); println("\n\n"); }*/ _sqlbase().putJSON(String(tableName), String(stringKey), json); } /** * Removes the mapping for a string key from a table. Requires that the table * exist. */ function deleteJSON(tableName, stringKey) { _sqlbase().deleteJSON(String(tableName), String(stringKey)); } /** * Creates a SQL table suitable for storing a mapping from (key,n) to string. * The mapping may be sparse, but storage is most efficient when n are consecutive. * The "length" of the array is not stored and must be externally maintained. * Maximum key length is 128 characters. This call has no effect if the table * already exists. */ function createStringArrayTable(tableName) { _sqlbase().createStringArrayTable(String(tableName)); } /** * Assigns a string value to a (key,n) pair in a StringArray table. Maximum key length * is 128 characters. Requires that the table exist. */ function putStringArrayElement(tableName, stringKey, n, value) { _sqlbase().putStringArrayElement(String(tableName), String(stringKey), Number(n), String(value)); } /** * Equivalent to a series of consecutive puts of the elements of valueArray, with the first * one going to n=startN, the second to n=startN+1, and so on, but much more efficient. */ function putConsecutiveStringArrayElements(tableName, stringKey, startN, valueArray) { var putter = _sqlbase().putMultipleStringArrayElements(String(tableName), String(stringKey)); for(var i=0;i<valueArray.length;i++) { putter.put(Number(startN)+i, String(valueArray[i])); } putter.finish(); } /** * Equivalent to a series of puts of the (key,value) entries of the JavaScript object * nToValue, using as few database operations as possible. */ function putDictStringArrayElements(tableName, stringKey, nToValue) { var nArray = []; for(var n in nToValue) { nArray.push(n); } nArray.sort(function(a,b) { return Number(a) - Number(b); }); var putter = _sqlbase().putMultipleStringArrayElements(String(tableName), String(stringKey)); nArray.forEach(function(n) { putter.put(Number(n), String(nToValue[n])); }); putter.finish(); } /** * Retrieves a string value from a StringArray table. Returns undefined * if there is no mapping for the given (key,n) pair. Requires that the table * exist. */ function getStringArrayElement(tableName, stringKey, n) { var result = _sqlbase().getStringArrayElement(String(tableName), String(stringKey), Number(n)); if (result) { return String(result); } return undefined; } /** * Retrieves all values from the database page that contains the mapping for n. * Properties are added to destMap for n, if present in the database, and any other * numeric entries in the same page. No return value. */ function getPageStringArrayElements(tableName, stringKey, n, destMap) { var array = _sqlbase().getPageStringArrayElements(String(tableName), String(stringKey), n); for(var i=0;i<array.length;i++) { var entry = array[i]; destMap[entry.index()] = String(entry.value()); } } /** * Removes the mapping for a (key,n) pair from a StringArray table. Requires that the table * exist. */ function deleteStringArrayElement(tableName, stringKey, n) { _sqlbase().putStringArrayElement(String(tableName), String(stringKey), Number(n), null); } /** * Removes all mappings and metadata associated with a given key in a table. */ function clearStringArray(tableName, stringKey) { _sqlbase().clearStringArray(String(tableName), stringKey); } function getStringArrayAllKeys(tableName) { var result = _sqlbase().getStringArrayAllKeys(String(tableName)); return Array.prototype.map.call(result, function(x) { return String(x); }); }