<b> // city: "Allston",</b>
<b> // state: "MA",</b>
<b> // latitude: "42.355147",</b>
<b> // longitude: '-71.13164”</b>
<b> // }</b>
<b> //</b>
<b> // Свойство "zipcode" используется в качестве ключа базы данных</b>
<b> // Кроме того, создается индекс по названию города</b>
<b> // Создать хранилище объектов, указав имя хранилища и объект с параметрами,</b>
<b> // включающий "путь к ключу", определяющий имя свойства-ключа для этого</b>
<b> // хранилища. (Если опустить путь к ключу, IndexedDB определит свой</b>
<b> // собственный уникальный целочисленный ключ.)</b>
<b> var store = db.createObjectStore("zipcodes", // имя хранилища</b>
<b> { keyPath: "zipcode" });</b>
<b> // Создать в хранилище объектов индекс по названию города.</b>
<b> // Строка пути к ключу передается этому методу непосредственно,</b>
<b> // как обязательный аргумент, а не как свойство объекта с параметрами,</b>
<b> store.createlndex("cities", "city");</b>
<b> // Теперь необходимо загрузить информацию о почтовых индексах, преобразовать</b>
<b> // ее в объекты и сохранить эти объекты в созданном выше хранилище.</b>
<b> //</b>
<b> // Файл с исходными данными содержит строки следующего вида:</b>
<b> //</b>
<b> // 02130,Jamaica Plain,MA.42.309998,-71.11171</b>
<b> // 02131,Roslindale,MA,42.284678,-71.13052</b>
<b> // 02132,West Roxbury.MA,42.279432,-71.1598</b>
<b> // 02133,Boston,MA,42.338947,-70.919635</b>
<b> // 02134,Allston,MA, 42.355147,-71.13164</b>
<b> //</b>
<b> // Как ни странно, но почтовая служба США не обеспечивает свободный доступ</b>
<b> // к этой информации, поэтому мы будет использовать устаревшие данные переписи</b>
<b> // с сайта: </b><a href="http://mappinghacks.com/2008/04/28/civicspace-zip-code-database/"><b>http://mappinghacks.com/2008/04/28/civicspace-zip-code-database/</b></a>
<b> // Для загрузки данных используется объект XMLHttpRequest.</b>
<b> // Но для обработки данных по мере поступления будут использованы</b>
<b> // новые события onload и onprogress, определяемые спецификацией XHR2</b>
<b> var xhr = new XMLHttpRequest(); // Объект XHR для загрузки данных</b>
<b> xhr.open("GET", "zipcodes.csv"); // HTTP-запрос типа GET для этого URL</b>
<b> xhr.send(); // Запустить немедленно</b>
<b> xhr.oneг гог = status; // Отображать сообщения об ошибках</b>
<b> var lastChar = 0, numlines = 0; // Уже обработанный объем</b>
<b> // Обрабатывает файл базы данных блоками, по мере загрузки</b>
<b> xhr.onprogress = xhr.onload = function(e) { // Сразу два обработчика!</b>
<b> // Обработать блок между lastChar и последним принятым символом</b>
<b> // перевода строки. (Нам требуется отыскать последний символ</b>
<b> // перевода строки, чтобы не обработать неполную запись)</b>
<b> var lastNewline = xhr.responseText.lastIndexOf("\n");</b>
<b> if (lastNewline > lastChar) {</b>
<b> var chunk = xhr.responseText.substring(lastChar, lastNewline)</b>
<b> lastChar = lastNewline + 1; // Откуда начинать в следующий раз</b>
<b> // Разбить новый фрагмент на строки</b>
<b> var lines = chunk.split("\n”);</b>
<b> numlines += lines.length;</b>
<b> // Чтобы вставить информацию о почтовом индексе в базу данных, необходимо</b>
<b> // получить объект транзакции. Все операции добавления объектов</b>
<b> // в базу данных, выполняемые с использованием этого объекта,</b>
<b> // будут автоматически подтверждаться после выхода из этой функции,</b>
<b> // когда броузер вернется в цикл обработки событий.</b>
<b> // Чтобы создать объект транзакции, следует определить,</b>
<b> // какие хранилища объектов будут использоваться (у нас имеется всего</b>
<b> // одно хранилище). Кроме того, требуется сообщить, что будет</b>
<b> // выполняться не только чтение, но и запись в базу данных:</b>
<b> var transaction = db.transaction(["zipcodes’'], // хранилища</b>