-
Notifications
You must be signed in to change notification settings - Fork 64
Expand file tree
/
Copy pathiDB.js
More file actions
168 lines (136 loc) · 5.23 KB
/
Copy pathiDB.js
File metadata and controls
168 lines (136 loc) · 5.23 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
var CoreMobCameraiDB = (function(){
var db;
// Supported without prefix: IE10
// Supported with Prefix: Chrome, BlackBerry10 and Firefox Mobile 15
// Unsupported: Opera Mobile, iOS6 Safari
window.indexedDB = window.indexedDB || window.webkitIndexedDB || window.mozIndexedDB;
window.IDBKeyRange = window.IDBKeyRange || window.webkitIDBKeyRange;
// Chrome21+ and IE10 use strings instead of constants
window.IDBTransaction = window.IDBTransaction || window.webkitIDBTransaction || {READ_WRITE: 'readwrite'};
window.URL = window.URL || window.webkitURL;
return {
openDB: openDB,
deleteDB: deleteDB,
putPhotoInDB: putPhotoInDB
};
function deleteDB(renderCallback) {
var req = window.indexedDB.deleteDatabase('gallery');
req.onsuccess = function(e){
console.log('Database is deleted: '+ e.result);
renderCallback();
alert('DB Deleted: Reload the page manually (temp)');
};
req.onerror = function(e){
console.log('Error deleting DB');
};
req.onblocked = function(e){
console.log('Deleting DB Blocked');
alert('Deleting DB Blocked: Reload the page manually. '+ e.target.error);
};
}
function openDB(renderCallback, failCallback) {
if(typeof window.indexedDB === 'undefined') {
// iDB unsupported -- iOS, Opera, other older browsers
failCallback();
return;
}
if(window.indexedDB === null) {
// possibly running the app from local file on older Firefox
alert('IndexedDB cannot run locally on some browsers. Try running this app from a server.')
return;
}
var req = window.indexedDB.open('gallery', 1); // IE10 doesn't like variables as db names & ver? (need to test again)
req.onsuccess = function(e) {
db = e.target.result;
console.log(db);
// For Chrome < 23 (including mobile. v18) -- newer Chrome & FF deprecated it and use onupgradeneeded event
if(typeof db.setVersion !== 'undefined') {
console.log('using the deprecated setVersion');
if(db.version != 1) {
var setVersionReq = db.setVersion(1);
setVersionReq.onsuccess = function(e) {
createObjStoreOldBrowserOnly(db);
};
setVersionReq.onfailure = dbFailureHandler;
}
}
getPhotoFromDB(renderCallback);
};
req.onfailure = dbFailureHandler;
// Newer browsers only - FF, Chrome (newer than ?), IE10
req.onupgradeneeded = function(e) {
console.log('onupgradeneeded');
createObjStore(e.target.result);
};
}
function dbFailureHandler(e) {
console.log(e);
}
function createObjStore(db) {
db.createObjectStore('photo', {keyPath: 'id', autoIncrement: true});
}
function createObjStoreOldBrowserOnly(db) {
// 'autoIncrement: true' causes DATA_ERR on Chrome Mobile (v18) :-(
// so use timestamp as the key for now
db.createObjectStore('photo', {keyPath: 'timestamp'});
}
function getPhotoFromDB(renderCallback) {
var transaction = db.transaction(['photo'], IDBTransaction.READ_WRITE);
var objStore = transaction.objectStore('photo');
console.log(objStore);
// Get everything in object store;
var cursorReq = objStore.openCursor();
var photos = [];
cursorReq.onsuccess = function(e) {
var cursor = e.target.result;
if(cursor) {
var item = cursor.value;
if(cursor.value.photo) {
// either blob or data url string for Chrome18
var imgUrl = (typeof cursor.value.photo === 'object') ? window.URL.createObjectURL(cursor.value.photo) : cursor.value.photo;
item.photo = imgUrl;
}
photos.push(item);
cursor.continue();
} else {
renderCallback(photos);
}
}
cursorReq.onerror = dbFailureHandler;
}
function putPhotoInDB(data, renderCallback, blobFailureCallback) {
if(data && data.photo) {
storeInDB(data, renderCallback, blobFailureCallback);
} else {
console.log('No image data received.');
}
}
function storeInDB(data, renderCallback, blobFailureCallback){
var transaction = db.transaction(['photo'], IDBTransaction.READ_WRITE);
var objStore = transaction.objectStore('photo');
var req;
try {
req = objStore.put(data);
} catch(e) {
// expect the Chrome DataCloneError: DOM IDBDatabase Exception 25 - no blob support
console.log(e.name + ': ' + e.message);
blobFailureCallback();
return;
}
req.onsuccess = function(e) {
var imgUrl;
if(typeof data.photo === 'object') { // should be blob
imgUrl = window.URL.createObjectURL(data.photo);
} else { // not blob, just a base64 data url
imgUrl = data.photo;
}
renderCallback({
title: data.title,
photo: imgUrl
});
};
req.onfailure = function(e) {
console.log(e);
};
}
})();