Commit ae076f34 authored by Xiaowu Zhang's avatar Xiaowu Zhang

use new indexeddb lib

parent 8dbd2b4a
...@@ -168,7 +168,7 @@ ...@@ -168,7 +168,7 @@
id = list[index].id; id = list[index].id;
} while (g.currentId === id); } while (g.currentId === id);
} }
if (list[index].doc.format === "video/webm") { if (list[index].doc.format === "video/webm" || list[index].doc.format === "video/mp4") {
control = "video_control"; control = "video_control";
} }
return g.displayThisPage({ return g.displayThisPage({
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
Audio, loopEventListener, jQuery, promiseEventListener, Blob*/ Audio, loopEventListener, jQuery, promiseEventListener, Blob*/
/*jslint nomen: true, maxlen:180 */ /*jslint nomen: true, maxlen:180 */
/* The MediaSource API only supports MPEG-DASH and /* The MediaSource API only supports MPEG-DASH and
* VP8 with keyframed segments currently (on Chrome 35). * VP8 with keyframed segments currently.
* more info: * more info:
*https://dvcs.w3.org/hg/html-media/raw-file/tip/media-source/media-source.html *https://dvcs.w3.org/hg/html-media/raw-file/tip/media-source/media-source.html
*/ */
...@@ -61,7 +61,7 @@ ...@@ -61,7 +61,7 @@
id = list[index].id; id = list[index].id;
} while (g.currentId === id); } while (g.currentId === id);
} }
if (list[index].doc.format === "video/webm") { if (list[index].doc.format === "video/webm" || list[index].doc.format === "video/mp4") {
control = "video_control"; control = "video_control";
} }
return g.displayThisPage({ return g.displayThisPage({
......
...@@ -9141,7 +9141,8 @@ function sequence(thens) { ...@@ -9141,7 +9141,8 @@ function sequence(thens) {
* *
* { * {
* "type": "indexeddb", * "type": "indexeddb",
* "database": <string> * "database": <string>,
* "unite": <integer> //byte
* } * }
* *
* The database name will be prefixed by "jio:", so if the database property is * The database name will be prefixed by "jio:", so if the database property is
...@@ -9190,7 +9191,7 @@ function sequence(thens) { ...@@ -9190,7 +9191,7 @@ function sequence(thens) {
} }
/** /**
* new IndexedDBStorage(description) * new IndexedDBStorage(description)
* *
* Creates a storage object designed for jIO to store documents into * Creates a storage object designed for jIO to store documents into
* indexedDB. * indexedDB.
...@@ -9204,7 +9205,16 @@ function sequence(thens) { ...@@ -9204,7 +9205,16 @@ function sequence(thens) {
throw new TypeError("IndexedDBStorage 'database' description property " + throw new TypeError("IndexedDBStorage 'database' description property " +
"must be a non-empty string"); "must be a non-empty string");
} }
if (description.unite !== undefined) {
if (description.unite !== parseInt(description.unite, 10)) {
throw new TypeError("IndexedDBStorage 'unite' description property " +
"must be a integer");
}
} else {
description.unite = 2000000;
}
this._database_name = "jio:" + description.database; this._database_name = "jio:" + description.database;
this._unite = description.unite;
} }
...@@ -9237,10 +9247,11 @@ function sequence(thens) { ...@@ -9237,10 +9247,11 @@ function sequence(thens) {
store.createIndex("_id", "_id"); store.createIndex("_id", "_id");
store = db.createObjectStore("blob", { store = db.createObjectStore("blob", {
"keyPath": ["_id", "_attachment"] "keyPath": ["_id", "_attachment", "_part"]
//"autoIncrement": true //"autoIncrement": true
}); });
store.createIndex("_id_attachment", ["_id", "_attachment"]); store.createIndex("_id_attachment_part",
["_id", "_attachment", "_part"]);
}; };
request.onsuccess = function () { request.onsuccess = function () {
resolve(request.result); resolve(request.result);
...@@ -9269,7 +9280,7 @@ function sequence(thens) { ...@@ -9269,7 +9280,7 @@ function sequence(thens) {
request = store.put(metadata); request = store.put(metadata);
resolver = function (resolve, reject) { resolver = function (resolve, reject) {
request.onerror = function (e) { request.onerror = function (e) {
reject("error index"); reject(e);
}; };
request.onsuccess = function () { request.onsuccess = function () {
resolve(metadata); resolve(metadata);
...@@ -9277,8 +9288,9 @@ function sequence(thens) { ...@@ -9277,8 +9288,9 @@ function sequence(thens) {
}; };
return new RSVP.Promise(resolver); return new RSVP.Promise(resolver);
} catch (e) { } catch (e) {
return putIndexedDB(store, {"_id": metadata._id, return putIndexedDB(store, {"_id" : metadata._id,
"_attachment" : metadata._attachment, "_attachment" : metadata._attachment,
"_part" : metadata._part,
"blob": readData}); "blob": readData});
} }
} }
...@@ -9321,9 +9333,9 @@ function sequence(thens) { ...@@ -9321,9 +9333,9 @@ function sequence(thens) {
function resolver(resolve, reject) { function resolver(resolve, reject) {
var request = store["delete"](id); var request = store["delete"](id);
request.onerror = function (e) { request.onerror = function (e) {
reject("remove error"); reject(e);
}; };
request.onsuccess = function (e){ request.onsuccess = function () {
resolve(request.result); resolve(request.result);
}; };
} }
...@@ -9402,10 +9414,6 @@ function sequence(thens) { ...@@ -9402,10 +9414,6 @@ function sequence(thens) {
return end(result); return end(result);
}) })
.push(undefined, function (error) { .push(undefined, function (error) {
// Check if transaction is ongoing, if so, abort it
// if (transaction !== undefined) {
// transaction.abort();
// }
if (global_db !== undefined) { if (global_db !== undefined) {
global_db.close(); global_db.close();
} }
...@@ -9459,10 +9467,6 @@ function sequence(thens) { ...@@ -9459,10 +9467,6 @@ function sequence(thens) {
return ({"data": meta}); return ({"data": meta});
}) })
.push(undefined, function (error) { .push(undefined, function (error) {
// Check if transaction is ongoing, if so, abort it
// if (transaction !== undefined) {
// transaction.abort();
// }
if (global_db !== undefined) { if (global_db !== undefined) {
global_db.close(); global_db.close();
} }
...@@ -9483,14 +9487,24 @@ function sequence(thens) { ...@@ -9483,14 +9487,24 @@ function sequence(thens) {
transaction, transaction,
global_db, global_db,
queue = new RSVP.Queue(); queue = new RSVP.Queue();
function tmp(index, array, store) { function removeAllPart(store, attachment, part, totalLength) {
return removeIndexedDB(store, [param._id, array[index]]) if (part * jio_storage._unite >= totalLength) {
.then(function (e) { return;
if (index < array.length -1) { }
return tmp(index + 1, array, store); return removeIndexedDB(store, [param._id, attachment, part])
.then(function () {
return removeAllPart(store, attachment, part + 1, totalLength);
});
}
function removeAll(store, array, index, allAttachment) {
var totalLength = allAttachment[array[index]].length;
return removeAllPart(store, array[index], 0, totalLength)
.then(function () {
if (index < array.length - 1) {
return removeAll(store, array, index + 1, allAttachment);
} }
}); });
}; }
return queue.push(function () { return queue.push(function () {
return openIndexedDB(jio_storage._database_name); return openIndexedDB(jio_storage._database_name);
}) })
...@@ -9517,9 +9531,9 @@ function sequence(thens) { ...@@ -9517,9 +9531,9 @@ function sequence(thens) {
var array, store; var array, store;
array = Object.keys(result._attachment); array = Object.keys(result._attachment);
store = transaction.objectStore("blob"); store = transaction.objectStore("blob");
return tmp(0, array, store); return removeAll(store, array, 0, result._attachment);
} }
}) })
.push(function () { .push(function () {
var store = transaction.objectStore("attachment"); var store = transaction.objectStore("attachment");
//delete attachment //delete attachment
...@@ -9532,10 +9546,6 @@ function sequence(thens) { ...@@ -9532,10 +9546,6 @@ function sequence(thens) {
return ({"status": 204}); return ({"status": 204});
}) })
.push(undefined, function (error) { .push(undefined, function (error) {
// Check if transaction is ongoing, if so, abort it
// if (transaction !== undefined) {
// transaction.abort();
// }
if (global_db !== undefined) { if (global_db !== undefined) {
global_db.close(); global_db.close();
} }
...@@ -9568,7 +9578,7 @@ function sequence(thens) { ...@@ -9568,7 +9578,7 @@ function sequence(thens) {
return ({"id": metadata._id}); return ({"id": metadata._id});
} }
return that._putOrPost(openIndexedDB, promiseResearch, return that._putOrPost(openIndexedDB, promiseResearch,
promiseOngoingPost, promiseEndPost, promiseOngoingPost, promiseEndPost,
command, metadata); command, metadata);
...@@ -9747,6 +9757,24 @@ function sequence(thens) { ...@@ -9747,6 +9757,24 @@ function sequence(thens) {
global_db, global_db,
BlobInfo, BlobInfo,
readResult; readResult;
function putAllPart(store, metadata, readResult, count, part) {
var blob,
readPart,
end;
if (count >= metadata._blob.size) {
return;
}
end = count + jio_storage._unite;
blob = metadata._blob.slice(count, end);
readPart = readResult.slice(count, end);
return putIndexedDB(store, {"_id": metadata._id,
"_attachment" : metadata._attachment,
"_part" : part,
"blob": blob}, readPart)
.then(function () {
return putAllPart(store, metadata, readResult, end, part + 1);
});
}
return jIO.util.readBlobAsArrayBuffer(metadata._blob) return jIO.util.readBlobAsArrayBuffer(metadata._blob)
.then(function (event) { .then(function (event) {
readResult = event.target.result; readResult = event.target.result;
...@@ -9780,9 +9808,7 @@ function sequence(thens) { ...@@ -9780,9 +9808,7 @@ function sequence(thens) {
.push(function () { .push(function () {
//put in blob //put in blob
var store = transaction.objectStore("blob"); var store = transaction.objectStore("blob");
return putIndexedDB(store, {"_id": metadata._id, return putAllPart(store, metadata, readResult, 0, 0);
"_attachment" : metadata._attachment,
"blob": metadata._blob}, readResult);
}) })
.push(function () { .push(function () {
return transactionEnd(transaction); return transactionEnd(transaction);
...@@ -9791,10 +9817,6 @@ function sequence(thens) { ...@@ -9791,10 +9817,6 @@ function sequence(thens) {
return {"status": 204}; return {"status": 204};
}) })
.push(undefined, function (error) { .push(undefined, function (error) {
// Check if transaction is ongoing, if so, abort it
// if (transaction !== undefined) {
// transaction.abort();
// }
if (global_db !== undefined) { if (global_db !== undefined) {
global_db.close(); global_db.close();
} }
...@@ -9816,32 +9838,61 @@ function sequence(thens) { ...@@ -9816,32 +9838,61 @@ function sequence(thens) {
var jio_storage = this, var jio_storage = this,
transaction, transaction,
global_db, global_db,
_id_attachment = [param._id, param._attachment]; blob,
totalLength;
function getDesirePart(store, start, end) {
if (start >= end) {
return;
}
return getIndexedDB(store, [param._id, param._attachment, start])
.then(function (result) {
var blobPart;
if (result.blob.byteLength !== undefined) {
blobPart = new Blob([result.blob]);
}
if (blob) {
blob = new Blob([blob, blobPart]);
} else {
blob = blobPart;
}
return getDesirePart(store, start + 1, end);
});
}
return new RSVP.Queue() return new RSVP.Queue()
.push(function () { .push(function () {
return openIndexedDB(jio_storage._database_name); return openIndexedDB(jio_storage._database_name);
}) })
.push(function (db) { .push(function (db) {
global_db = db; global_db = db;
transaction = db.transaction(["blob"], "readwrite"); transaction = db.transaction(["attachment", "blob"], "readwrite");
//check if the attachment exists //check if the attachment exists
return promiseResearch(transaction, _id_attachment, return promiseResearch(transaction,
"blob", "_id_attachment"); param._id, "attachment", "_id");
}) })
.push(function (researchResult) { .push(function (researchResult) {
if (researchResult.result === undefined) { var result = researchResult.result;
if (result === undefined ||
result._attachment[param._attachment] === undefined) {
throw ({"status": 404, "reason": "missing attachment", throw ({"status": 404, "reason": "missing attachment",
"message": "IndexeddbStorage, unable to get attachment."}); "message": "IndexeddbStorage, unable to get attachment."});
} }
return getIndexedDB(researchResult.store, _id_attachment); totalLength = result._attachment[param._attachment].length;
}) param._seek = param._seek === undefined ? 0 : param._seek;
.push(function (result) { param._offset = param._offset === undefined ? totalLength
//get data : param._offset;
if (result.blob.byteLength !== undefined) { if (param._seek > param._offset) {
result.blob = new Blob([result.blob], throw ({"status": 404, "reason": "invalide offset",
{type: "text/plain"}); "message": "seek is great then offset"});
} }
return ({ "data": result.blob}); return getDesirePart(transaction.objectStore("blob"),
param._seek / jio_storage._unite,
param._offset / jio_storage._unite);
})
.push(function () {
var start = param._seek % jio_storage._unite,
end = start + param._offset - param._seek;
blob = blob.slice(start, end);
return ({ "data": new Blob([blob], {type: "text/plain"})});
}) })
.push(undefined, function (error) { .push(undefined, function (error) {
// Check if transaction is ongoing, if so, abort it // Check if transaction is ongoing, if so, abort it
...@@ -9868,35 +9919,43 @@ function sequence(thens) { ...@@ -9868,35 +9919,43 @@ function sequence(thens) {
var jio_storage = this, var jio_storage = this,
transaction, transaction,
global_db, global_db,
_id_attachment = [param._id, param._attachment]; totalLength;
function removePart(store, part) {
if (part * jio_storage._unite >= totalLength) {
return;
}
return removeIndexedDB(store, [param._id, param._attachment, part])
.then(function () {
return removePart(store, part + 1);
});
}
return new RSVP.Queue() return new RSVP.Queue()
.push(function () { .push(function () {
return openIndexedDB(jio_storage._database_name); return openIndexedDB(jio_storage._database_name);
}) })
.push(function (db) { .push(function (db) {
global_db = db; global_db = db;
transaction = db.transaction(["attachment", "blob"], "readwrite"); transaction = db.transaction(["attachment", "blob"], "readwrite");
//check if the attachment exists //check if the attachment exists
return promiseResearch(transaction, _id_attachment, return promiseResearch(transaction, param._id,
"blob", "_id_attachment"); "attachment", "_id");
}) })
.push(function (researchResult) { .push(function (researchResult) {
if (researchResult.result === undefined) { var result = researchResult.result;
if (result === undefined ||
result._attachment[param._attachment] === undefined) {
throw ({"status": 404, "reason": "missing attachment", throw ({"status": 404, "reason": "missing attachment",
"message": "message":
"IndexeddbStorage, document attachment not found."}); "IndexeddbStorage, document attachment not found."});
} }
return removeIndexedDB(researchResult.store, _id_attachment); totalLength = result._attachment[param._attachment].length;
})
.push(function () {
//updata attachment //updata attachment
var store = transaction.objectStore("attachment");
return getIndexedDB(store, param._id);
})
.push(function (result) {
delete result._attachment[param._attachment]; delete result._attachment[param._attachment];
var store = transaction.objectStore("attachment"); return putIndexedDB(researchResult.store, result);
return putIndexedDB(store, result); })
.push(function () {
var store = transaction.objectStore("blob");
return removePart(store, 0);
}) })
.push(function () { .push(function () {
return transactionEnd(transaction); return transactionEnd(transaction);
...@@ -9905,10 +9964,6 @@ function sequence(thens) { ...@@ -9905,10 +9964,6 @@ function sequence(thens) {
return ({ "status": 204 }); return ({ "status": 204 });
}) })
.push(undefined, function (error) { .push(undefined, function (error) {
// Check if transaction is ongoing, if so, abort it
// if (transaction !== undefined) {
// transaction.abort();
// }
if (global_db !== undefined) { if (global_db !== undefined) {
global_db.close(); global_db.close();
} }
......
...@@ -225,7 +225,8 @@ ...@@ -225,7 +225,8 @@
id = list[index].id; id = list[index].id;
} while (g.currentId === id); } while (g.currentId === id);
} }
if (list[index].doc.format === "video/webm") { if (list[index].doc.format === "video/webm" ||
list[index].doc.format === "video/mp4") {
control = "video_control"; control = "video_control";
} }
return g.displayThisPage({page: control, return g.displayThisPage({page: control,
......
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
/* The MediaSource API only supports MPEG-DASH and /* The MediaSource API only supports MPEG-DASH and
* VP8 with keyframed segments currently (on Chrome 35). * VP8 with keyframed segments currently.
* more info: * more info:
*https://dvcs.w3.org/hg/html-media/raw-file/tip/media-source/media-source.html *https://dvcs.w3.org/hg/html-media/raw-file/tip/media-source/media-source.html
*/ */
...@@ -85,7 +85,8 @@ ...@@ -85,7 +85,8 @@
id = list[index].id; id = list[index].id;
} while (g.currentId === id); } while (g.currentId === id);
} }
if (list[index].doc.format === "video/webm") { if (list[index].doc.format === "video/webm" ||
list[index].doc.format === "video/mp4") {
control = "video_control"; control = "video_control";
} }
return g.displayThisPage({page: control, return g.displayThisPage({page: control,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment