mirror of
https://github.com/Esri/offline-editor-js.git
synced 2025-12-15 15:20:05 +00:00
170 lines
4.6 KiB
JavaScript
170 lines
4.6 KiB
JavaScript
/*global IDBKeyRange,indexedDB */
|
|
|
|
"use strict";
|
|
O.esri.Edit.EditsStore = function()
|
|
{
|
|
this._db = null;
|
|
|
|
// Public properties
|
|
|
|
var dbName = "features_store";
|
|
var objectStoreName = "features";
|
|
|
|
// ENUMs
|
|
|
|
this.ADD = "add";
|
|
this.UPDATE = "update";
|
|
this.DELETE = "delete";
|
|
|
|
this.isSupported = function()
|
|
{
|
|
if(!window.indexedDB){
|
|
return false;
|
|
}
|
|
return true;
|
|
};
|
|
|
|
/**
|
|
* Commit an edit to the database
|
|
* @param operation add, update or delete
|
|
* @param layer the URL of the feature layer
|
|
* @param graphic esri/graphic. The method will serialize to JSON
|
|
* @param callback {true, edit} or {false, error}
|
|
*/
|
|
this.pushEdit = function(operation,layer,graphic, callback)
|
|
{
|
|
try
|
|
{
|
|
var edit = {
|
|
operation: operation,
|
|
layer: layer,
|
|
graphic: graphic.toJson()
|
|
};
|
|
|
|
var transaction = this._db.transaction([objectStoreName],"readwrite");
|
|
|
|
transaction.oncomplete = function(event){
|
|
callback(true, edit);
|
|
};
|
|
|
|
transaction.onerror = function(event){
|
|
callback(false,event.target.error.message);
|
|
};
|
|
|
|
var objectStore = transaction.objectStore(objectStoreName);
|
|
var request = objectStore.put(edit);
|
|
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.getUsage = function(callback)
|
|
{
|
|
console.assert(this._db !== null, "indexeddb not initialized");
|
|
|
|
var usage = { sizeBytes: 0, attachmentCount: 0 };
|
|
|
|
var transaction = this._db.transaction([objectStoreName])
|
|
.objectStore(objectStoreName)
|
|
.openCursor();
|
|
|
|
console.log("dumping keys");
|
|
|
|
transaction.onsuccess = function(event)
|
|
{
|
|
var cursor = event.target.result;
|
|
if(cursor)
|
|
{
|
|
console.log(cursor.value.id, cursor.value.featureId, cursor.value.objectId);
|
|
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);
|
|
};
|
|
};
|
|
|
|
// internal methods
|
|
|
|
//
|
|
// graphic serialization/deserialization
|
|
//
|
|
this._serialize = function(graphic)
|
|
{
|
|
// keep only attributes and geometry, that are the values that get sent to the server by applyEdits()
|
|
// see http://resources.arcgis.com/en/help/arcgis-rest-api/index.html#/Apply_Edits_Feature_Service_Layer/02r3000000r6000000/
|
|
// use graphic's built-in serializing method
|
|
var json = graphic.toJson();
|
|
var jsonClean =
|
|
{
|
|
attributes: json.attributes,
|
|
geometry: json.geometry
|
|
};
|
|
return JSON.stringify(jsonClean);
|
|
};
|
|
|
|
this._deserialize = function(json)
|
|
{
|
|
var graphic;
|
|
|
|
require(["esri/graphic"],function(Graphic){
|
|
graphic = new Graphic(JSON.parse(json));
|
|
});
|
|
|
|
return graphic;
|
|
};
|
|
|
|
this.init = function(callback)
|
|
{
|
|
console.log("init editsStore.js");
|
|
|
|
var request = indexedDB.open(dbName, 11);
|
|
callback = callback || function(success) { console.log("EditsStore::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(objectStoreName))
|
|
{
|
|
db.deleteObjectStore(objectStoreName);
|
|
}
|
|
|
|
var objectStore = db.createObjectStore(objectStoreName, { 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);
|
|
};
|
|
};
|
|
|
|
|