JavaScript. Подробное руководство, 6-е издание, стр. 399
Пример 22.15. База данных IndexedDB с почтовыми индексами США
<b><!DOCTYPE html></b><b><html></b><b><head></b><b><title>Zipcode Database</title></b><b><script></b><b>// Реализации IndexedDB все еще используют префиксы в именах</b><b>var indexedDB = window.indexedDB || // Использовать стандартный API БД </b><b>window.mozIndexedDB || // Или раннюю версию в Firefox</b><b>window.webkitlndexedDB; // Или раннюю версию в Chrome</b><b>// В Firefox не используются префиксы для следующих двух объектов:</b><b>var IDBTransaction = window.IDBTransaction || window.webkitIDBTransaction;</b><b>var IDBKeyRange = window.IDBKeyRange || window.webkitIDBKeyRange;</b><b>// Эта функция будет использоваться для вывода сообщений об ошибках</b><b>function logerr(e) {</b><b> console.log("Ошибка IndexedDB " + e.code + ": " + e.message);</b><b>}</b><b>// Эта функция асинхронно получает объект базы данных (при необходимости</b><b>// создает и инициализирует базу данных) и передает его функции f().</b><b>function withDB(f) {</b><b> var request = indexedDB.open("zipcodes"); // Открыть базу данных zipcode</b><b> request.onerгог = logerr; // Выводить сообщения об ошибках</b><b> request.onsuccess = function() { // Или вызвать эту функцию по завершении</b><b> var db = request.resu.lt; // Результатом запроса является база данных</b><b> // Базу данных можно открыть всегда, даже если она не существует.</b><b> // Мы проверяем версию, чтобы узнать, была ли БД создана и инициализирована.</b><b> // Если нет - это необходимо сделать. Но если БД уже настроена,</b><b> // остается просто передать ее функции f().</b><b> if (db.version === "1") f(db); // Если БД существует, передать ее f()</b><b> else initdb(db,f); // Иначе сначала инициализировать ее</b><b> }</b><b>}</b><b>// Принимает почтовый индекс, отыскивает город, которому он принадлежит,</b><b>// и асинхронно передает название города указанной функции,</b><b>function lookupCity(zip, callback) {</b><b> withDB(function(db) {</b><b> // Создать объект транзакции для этого запроса</b><b> var transaction = db.transaction(["zipcodes"], </b><b> // Требуемое хранилище </b><b> IDBTransaction.READ_0NLY, // He обновлять</b><b> 0); // Время ожидания не ограничено</b><b> // Получить хранилище объектов из транзакции</b><b> var objects = transaction.objectStoreC'zipcodes");</b><b> // Запросить объект, соответствующий указанному индексу.</b><b> // Строки выше выполнялись синхронно, но эта выполняется асинхронно</b><b> var request = objects.get(zip);</b><b> request.onerror = logerr; // Выводить сообщения об ошибках</b><b> request.onsuccess = function() { // Передать результаты этой функции</b><b> // Искомый объект сейчас в свойстве request.result</b><b> var object = request.result;</b><b> if (object) // Если cootb. найдено, передать город и штат функции</b><b> callback(object.city + ", " + object.state);</b><b> else // Иначе сообщить о неудаче</b><b> callback("Неизвестный индекс");</b><b> }</b><b> });</b><b>}</b><b>// По указанному названию города отыскивает все почтовые индексы для всех</b><b>// городов (в любом штате) с этим названием (с учетом регистра символов).</b><b>// Асинхронно передает результаты по одному указанной функции</b><b>function lookupZipcodes(city, callback) {</b><b> withDB(function(db) {</b><b> // Как и выше, создаем транзакцию и получаем хранилище объектов</b><b> var transaction = db.transaction(["zipcodes"], IDBTransaction.READ_0NLY, 0);</b><b> var store = transaction.objectStoreC'zipcodes");</b>