Skip to content

Instantly share code, notes, and snippets.

@nolanlawson
Last active January 2, 2016 16:29
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save nolanlawson/8330172 to your computer and use it in GitHub Desktop.
Save nolanlawson/8330172 to your computer and use it in GitHub Desktop.
Script to test complex keys in IndexedDB.

IndexedDB complex key test

This script tests complex keys in IndexedDB (i.e. arrays instead of simple numbers, strings, booleans). It was motivated by a SO post claiming IE doesn't support complex keys.

This test seems to confirm that indeed IE 10 and 11 do not support complex IndexedDB keys (as of January 2014).

Chrome/Opera/Firefox correctly show:

people are: [{"name":["very complex","key",1]},{"name":["very complex","key",2]},{"name":["very complex","key",3]},{"name":["very complex","key","foo"]}]

IE 11.0.9600.16438 on Win 8.1 and IE 10 .0.9200.16736 on Win 8 (brokenly) show:

got an unexpected error: {"description":"Permission denied","number":-2146828218,"stack":"Error: Permission denied\n   at Anonymous function (http://192.168.0.4:8080/index.js:52:9)\n   at addPersons (http://192.168.0.4:8080/index.js:46:5)"}

The "permission denied" message is a total red herring; the page works fine when using non-complex keys. You can toggle useComplexKeys to false in the script to confirm.

<!DOCTYPE html>
<html lang="en">
<body>
<script src="index.js"></script>
</body>
</html>
/*global indexedDB, IDBKeyRange*/
/*jshint browser:true */
(function () {
'use strict';
// toggle true/false in order to confirm that IE
// only bars when we're using complex keys
var useComplexKeys = true;
function writeln(str) {
window.document.writeln('<pre>' + str + '\n</pre>');
}
var request = indexedDB.open('MyTestdatabase', 1);
request.onupgradeneeded = function createDB(event) {
var db = event.target.result;
var objectStore = db.createObjectStore('persons', {keyPath: 'name'});
};
request.onsuccess = function addPersons(event) {
var db = event.target.result;
var persons;
if (useComplexKeys) {
persons = [
{name: ['complex', 'key']},
{name: ['very complex', 'key', 1]},
{name: ['very complex', 'key', 2]},
{name: ['very complex', 'key', 3]},
{name: ['very complex', 'key', 'foo']}
];
} else {
persons = [
{name: 'foo'},
{name: 'bar'},
{name: 'baz'},
{name: 'quux'},
{name: 'foobar'}
];
}
var transaction = db.transaction(['persons'], 'readwrite');
var objectStore = transaction.objectStore('persons');
var numDone = 0;
var gotError;
persons.forEach(function (person) {
if (gotError) {
return;
}
try {
var addRequest = objectStore.add(person);
addRequest.onsuccess = function (event) {
numDone++;
checkDone();
};
addRequest.onerror = function (event) {
// duplicate key error, already added these objects
if (!gotError) {
queryDB();
writeln('got an expected error: ' + JSON.stringify(event.target.error));
}
gotError = true;
};
} catch (err) {
writeln('got an unexpected error: ' + JSON.stringify(err));
}
});
function checkDone() {
if (numDone === persons.length) {
queryDB();
}
}
function queryDB() {
var transaction = db.transaction(['persons'], 'readonly');
var objectStore = transaction.objectStore('persons');
var keyRange = IDBKeyRange.lowerBound(useComplexKeys ? ['very complex', 'key'] : 'foo');
var cursorRequest = objectStore.openCursor(keyRange);
var people = [];
cursorRequest.onsuccess = function (event) {
var result = event.target.result;
if (!result) { // done
writeln('people are: ' + JSON.stringify(people));
return;
}
people.push(result.value);
result.continue();
};
}
};
})();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment