mirror of
https://github.com/Esri/offline-editor-js.git
synced 2025-12-15 15:20:05 +00:00
200 lines
6.1 KiB
JavaScript
200 lines
6.1 KiB
JavaScript
"use strict"
|
|
|
|
define([], function()
|
|
{
|
|
var AttachmentsStore = function()
|
|
{
|
|
this._db = null;
|
|
|
|
var DB_NAME = "attachments_store";
|
|
var OBJECT_STORE_NAME = "attachments";
|
|
|
|
this.isSupported = function()
|
|
{
|
|
if(!window.indexedDB){
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
this.store = function(featureLayerUrl, attachmentId, objectId, attachmentFile, callback)
|
|
{
|
|
try
|
|
{
|
|
var transaction = this._db.transaction([OBJECT_STORE_NAME],"readwrite");
|
|
|
|
transaction.oncomplete = function(event)
|
|
{
|
|
callback(true);
|
|
};
|
|
|
|
transaction.onerror = function(event)
|
|
{
|
|
callback(false,event.target.error.message)
|
|
};
|
|
|
|
var objectStore = transaction.objectStore(OBJECT_STORE_NAME);
|
|
var request = objectStore.put(
|
|
{
|
|
id: attachmentId,
|
|
objectId: objectId,
|
|
featureId: featureLayerUrl + "/" + objectId,
|
|
contentType: attachmentFile.type,
|
|
name: attachmentFile.name,
|
|
size: attachmentFile.size,
|
|
url: 'javascript:alert("show local attached file ' + attachmentFile.name + '");', // TODO -> download the local file
|
|
content: attachmentFile.content
|
|
});
|
|
request.onsuccess = function(event)
|
|
{
|
|
//console.log("item added to db " + event.target.result);
|
|
};
|
|
}
|
|
catch(err)
|
|
{
|
|
console.log("AttachmentsStore: " + err.stack);
|
|
callback(false,err.stack);
|
|
}
|
|
}
|
|
|
|
this.retrieve = function(attachmentId, callback)
|
|
{
|
|
if(this._db != null)
|
|
{
|
|
var objectStore = this._db.transaction([OBJECT_STORE_NAME]).objectStore(OBJECT_STORE_NAME);
|
|
var request = objectStore.get(attachmentId);
|
|
request.onsuccess = function(event)
|
|
{
|
|
var result = event.target.result;
|
|
if(result == null){
|
|
callback(false,"not found");
|
|
}
|
|
else{
|
|
callback(true,result);
|
|
}
|
|
}
|
|
request.onerror = function(err)
|
|
{
|
|
console.log(err);
|
|
callback(false,err);
|
|
}
|
|
}
|
|
}
|
|
|
|
this.getAttachmentsByFeatureId = function(featureLayerUrl,objectId,callback)
|
|
{
|
|
var featureId = featureLayerUrl + "/" + objectId;
|
|
var attachments = [];
|
|
|
|
var objectStore = this._db.transaction([OBJECT_STORE_NAME]).objectStore(OBJECT_STORE_NAME);
|
|
var index = objectStore.index("featureId");
|
|
var keyRange = IDBKeyRange.only(featureId);
|
|
index.openCursor(keyRange).onsuccess = function(evt)
|
|
{
|
|
var cursor = evt.target.result;
|
|
if(cursor)
|
|
{
|
|
attachments.push( cursor.value );
|
|
cursor.continue();
|
|
}
|
|
else
|
|
{
|
|
callback(attachments);
|
|
}
|
|
}
|
|
}
|
|
|
|
this.delete = function(attachmentId)
|
|
{
|
|
console.assert(false, "not implemented");
|
|
}
|
|
|
|
this.deleteAll = function(callback)
|
|
{
|
|
if(this._db != null)
|
|
{
|
|
var request = this._db.transaction([OBJECT_STORE_NAME],"readwrite")
|
|
.objectStore(OBJECT_STORE_NAME)
|
|
.clear();
|
|
request.onsuccess = function(event)
|
|
{
|
|
callback(true);
|
|
}
|
|
request.onerror = function(err)
|
|
{
|
|
callback(false,err);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
callback(false,null);
|
|
}
|
|
}
|
|
|
|
this.getUsage = function(callback){
|
|
if(this._db != null){
|
|
var usage = { sizeBytes: 0, attachmentCount: 0 };
|
|
|
|
var transaction = this._db.transaction([OBJECT_STORE_NAME])
|
|
.objectStore(OBJECT_STORE_NAME)
|
|
.openCursor();
|
|
|
|
transaction.onsuccess = function(event){
|
|
var cursor = event.target.result;
|
|
if(cursor){
|
|
var storedObject = cursor.value;
|
|
var json = JSON.stringify(storedObject);
|
|
usage.sizeBytes += json.length;
|
|
usage.attachmentCount += 1;
|
|
cursor.continue();
|
|
}
|
|
else{
|
|
callback(usage,null);
|
|
}
|
|
}.bind(this);
|
|
transaction.onerror = function(err){
|
|
callback(null,err);
|
|
}
|
|
}
|
|
else{
|
|
callback(null,null);
|
|
}
|
|
}
|
|
|
|
this.init = function(callback)
|
|
{
|
|
console.log("init AttachmentStore");
|
|
|
|
var request = indexedDB.open(DB_NAME, 11);
|
|
callback = callback? callback : function(success) { console.log("AttachmentsStore::init() success:", success)}.bind(this);
|
|
|
|
request.onerror = function(event)
|
|
{
|
|
console.log("indexedDB error: " + event.target.errorCode);
|
|
callback(false,event.target.errorCode);
|
|
}.bind(this);
|
|
|
|
request.onupgradeneeded = function(event)
|
|
{
|
|
var db = event.target.result;
|
|
|
|
if( db.objectStoreNames.contains(OBJECT_STORE_NAME))
|
|
{
|
|
db.deleteObjectStore(OBJECT_STORE_NAME);
|
|
}
|
|
|
|
var objectStore = db.createObjectStore(OBJECT_STORE_NAME, { keyPath: "id" });
|
|
objectStore.createIndex("featureId","featureId", {unique: false});
|
|
}.bind(this);
|
|
|
|
request.onsuccess = function(event)
|
|
{
|
|
this._db = event.target.result;
|
|
console.log("database opened successfully");
|
|
callback(true);
|
|
}.bind(this);
|
|
}
|
|
};
|
|
return AttachmentsStore;
|
|
})
|