UNPKG

ydn.db

Version:

Javascript database library for IndexedDB, WebDatabase (WebSQL) and WebStorage (localStorage) storage mechanisms supporting version migration, advanced query and transaction workflow.

246 lines (213 loc) 6.38 kB
// Copyright 2012 YDN Authors. All Rights Reserved. // // 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. /** * @fileoverview Performance test. * * @author kyawtun@yathit.com (Kyaw Tun) */ // ydn.debug.log('ydn.db', 'finest'); (function() { var schema = { stores: [ { name: 'big', autoIncrement: true, indexes: [ { name: 'n', type: 'NUMERIC' }, { name: 'uid', type: 'NUMERIC' }, { name: 't', type: 'TEXT' }, { name: 'm', multiEntry: true }] }] }; var options = {size: 200 * 1024 * 1024}; if (/websql/.test(location.hash)) { options.mechanisms = ['websql']; } else if (/indexeddb/.test(location.hash)) { options.mechanisms = ['indexeddb']; } else if (/localstorage/.test(location.hash)) { options.mechanisms = ['localstorage']; } else if (/memory/.test(location.hash)) { options.mechanisms = ['memory']; } var db2 = new ydn.db.Storage('pref-test-2', schema, options); var initClear2 = function(cb) { db2.clear().always(function() { cb(); }); }; var genBigData = function(n) { var long = (new Array(1000)).join( (new Array(10)).join('abcdefghijklmnopuqstubc')); var data = []; for (var i = 0; i < n; i++) { var arr = []; for (var j = 0; j < 16; j++) { arr[j] = Math.random(); } data[i] = { load: long, n: Math.random(), uid: (+new Date()) + Math.random(), m: arr, t: Math.random().toString(36).slice(2) }; } // console.log(n + ' big data generated'); return data; }; var testPutBigTight = function(db, data, onComplete, n) { var cnt = 0; for (var i = 0; i < n; i++) { var req = db2.put('big', data[i]); req.then(function() { cnt++; if (cnt == n) { onComplete(); // timer end } }, function(e) { throw e; }); } }; var testPutBig = function(db, data, onComplete, n) { var test = function(i) { var req = db2.put('big', data[i]); i++; req.then(function(x) { if (i == n) { onComplete(); // timer end } else { test(i); } }, function(e) { throw e; }); }; test(0); }; var testPutArray = function(db, data, onComplete, n) { var req = db2.put('big', data); req.then(function(keys) { onComplete(); // timer end }, function(e) { console.log(e); throw e; }); }; var initIndexData = function(cb, n) { var data = genBigData(n); db2.clear('big').always(function() { var req = db2.put('big', data); req.always(function() { db2.keys('big', null, 1).always(function(x) { cb(x[0]); // get the first key }); }); }); }; var valuesIndexKeyRangeBig = function(db, start, onComplete, nOp, nData) { var cnt = 0; for (var i = 0; i < nOp; i++) { var range = ydn.db.KeyRange.lowerBound(Math.random() * nData); db2.values('big', 'n', range, 1).always(function(x) { cnt++; if (cnt == nOp) { onComplete(); // timer end } else { // console.log(x); // ok } }); } }; var keysIndexKeyRangeBig = function(db, start, onComplete, nOp, nData) { var cnt = 0; for (var i = 0; i < nOp; i++) { var range = ydn.db.KeyRange.lowerBound(nData * Math.random()); db2.keys('big', 'n', range, 1).always(function(x) { cnt++; if (cnt == nOp) { onComplete(); // timer end } else { // console.log(x); // ok } }); } }; var valuesIndexKeyRangeBigLimit5 = function(db, start, onComplete, n, nData) { var cnt = 0; for (var i = 0; i < n; i++) { var range = ydn.db.KeyRange.lowerBound(nData * Math.random()); db2.values('big', 'n', range, 10).always(function(x) { cnt++; if (cnt == n) { onComplete(); // timer end } else { // console.log(x); // ok } }); } }; var keysIndexKeyRangeBigLimit5 = function(db, start, onComplete, n, nData) { var cnt = 0; for (var i = 0; i < n; i++) { var range = ydn.db.KeyRange.lowerBound(nData * Math.random()); db2.keys('big', 'n', range, 10).always(function(x) { cnt++; if (cnt == n) { onComplete(); // timer end } else { // console.log(x); // ok } }); } }; var valuesIndexIterBig = function(db, start, onComplete, n) { for (var i = 0; i < n; i++) { var iter = ydn.db.IndexValueIterator.where('big', 'n', '>', Math.random()); db2.values(iter, 1).always(function(x) { if (i == n - 1) { onComplete(); // timer end } else { } }); } }; var pref = Pref.newPref(db2, 'large object with indexes'); var t = pref.addTest('Put', testPutBig, initClear2, 20); t.prepareData = function() { return genBigData(20); }; t = pref.addTest('Put, tight loop', testPutBigTight, initClear2, 20); t.prepareData = function() { return genBigData(20); }; t = pref.addTest('Put, array', testPutArray, initClear2, 20); t.prepareData = function() { return genBigData(20); }; pref.addTest('Keys index key range, limit 1, 1000 records', keysIndexKeyRangeBig, initIndexData, 20, 1000); pref.addTest('Values index key range, limit 1, 1000 records', valuesIndexKeyRangeBig, null, 20, 1000); pref.addTest('Values index key range, limit 10, 1000 records', valuesIndexKeyRangeBigLimit5, null, 20, 1000); pref.addTest('Keys index key range, limit 10, 1000 records', keysIndexKeyRangeBigLimit5, null, 20, 1000); Pref.run(); })();