add versioning and migrateing data

This commit is contained in:
frankiebee 2017-03-23 19:14:08 -07:00
parent 8e30acb41a
commit 282775c52f
2 changed files with 28 additions and 51 deletions

View File

@ -23,20 +23,25 @@ module.exports = class IndexDbController extends EventEmitter {
}
dbOpenRequest.onsuccess = (event) => {
this.db = dbOpenRequest.result
if (!this.db.objectStoreNames.length) {
Object.keys(this.initialState).forEach((key) => {
this._add(key, this.initialState[key])
})
}
this.emit('success')
resolve(this.db)
}
dbOpenRequest.onupgradeneeded = (event) => {
// if (this.migrators)
this.db = event.target.result
this.migrate()
this.db.createObjectStore('dataStore')
}
})
.then((openRequest) => {
return this.get('dataStore')
})
.then((data) => {
if (!data) {
return this._add('dataStore', this.initialState)
.then(() => this.get('dataStore'))
.then((versionedData) => Promise.resolve(versionedData.data))
}
return Promise.resolve(data)
})
}
requestObjectStore (key, type = 'readonly') {
@ -47,7 +52,7 @@ module.exports = class IndexDbController extends EventEmitter {
})
}
get (key) {
get (key = 'dataStore') {
return this.requestObjectStore(key)
.then((dataObject)=> {
return new Promise((resolve, reject) => {
@ -67,10 +72,6 @@ module.exports = class IndexDbController extends EventEmitter {
})
}
migrate () {
this.db.createObjectStore('dataStore')
}
_add (key, objStore, cb = logger) {
return this.requestObjectStore(key, 'readwrite')
.then((dataObject)=> {

View File

@ -59,12 +59,6 @@ const dbController = new DbController({
key: STORAGE_KEY,
global: self,
version: 2,
initialState: {
dataStore: {
meta: 2,
data: firstTimeState,
},
},
})
asyncQ.waterfall([
() => loadStateFromPersistence(),
@ -87,36 +81,12 @@ function loadStateFromPersistence() {
const initialState = migrator.generateInitialState(firstTimeState)
dbController.initialState = initialState
return dbController.open()
.then((openRequest) => {
return dbController.get('dataStore')
.then((versionedData) => migrator.migrateData(versionedData))
.then((versionedData) => {
dbController.put(versionedData)
return Promise.resolve(versionedData)
})
.then((data) => {
if (!data) {
return dbController._add('dataStore', initialState)
.then(() => dbController.get('dataStore'))
.then((versionedData) => Promise.resolve(versionedData.data))
}
return Promise.resolve(data.data)
})
.catch((err) => console.error(err))
/*
need to get migrations working
*/
// return asyncQ.waterfall([
// // read from disk
// () => Promise.resolve(diskStore || initialState),
// // migrate data
// (versionedData) => migrator.migrateData(versionedData),
// // write to disk
// (versionedData) => {
// diskStore.put(versionedData)
// return Promise.resolve(versionedData)
// },
// // resolve to just data
// (versionedData) => Promise.resolve(versionedData.data),
// ])
.then((versionedData) => Promise.resolve(versionedData.data))
}
function setupController (initState, client) {
@ -142,14 +112,20 @@ function setupController (initState, client) {
// diskStore
// )
controller.store.subscribe((state) => {
dbController.put(versionifyData(state))
versionifyData(state)
.then((versionedData) => dbController.put(versionedData))
.catch((err) => {console.error(err)})
})
function versionifyData(state) {
// let versionedData = diskStore.getState()
// let versionedData
// versionedData.data = state
let versionedData = {data: state}
return versionedData
return dbController.get()
.then((rawData) => {
return Promise.resolve({
data: state,
meta: rawData.meta,
})}
)
}
//