MediaWiki:Gadget-personaldata.js
Jump to navigation
Jump to search
Note: After saving, you may have to bypass your browser's cache to see the changes.
- Firefox / Safari: Hold Shift while clicking Reload, or press either Ctrl-F5 or Ctrl-R (⌘-R on a Mac)
- Google Chrome: Press Ctrl-Shift-R (⌘-Shift-R on a Mac)
- Internet Explorer / Edge: Hold Ctrl while clicking Refresh, or press Ctrl-F5
- Opera: Go to Menu → Settings (Opera → Preferences on a Mac) and then to Privacy & security → Clear browsing data → Cached images and files.
// License: GPL
// Indexeddb JavaScript
console.log('Indb loading');
function idxdbContainer( ww ) {
var Debug_switch = false;
hashCode = function(s) {
if ( s == undefined) {
s = '00'
}
var h = 0, l = s.length, i = 0;
if ( l > 0 )
while (i < l)
h = (h << 5) - h + s.charCodeAt(i++) | 0;
return h;
};
if ( ww.user != undefined ) {
var self = ww.user.getName();
var idgen = hashCode(self);
debuglog(idgen);
// Take username for standard databasename format
var PersonalDataDataBaseName = "PD.IO" + idgen + "Database";
// Use username in user to get up to date version of self
this.CurrentPerson = {id: idgen, name: {user: self}, age: 0};
debuglog(PersonalDataDataBaseName);
debuglog(this.CurrentPerson);
}
// ADD MORE DOC
// EnqueuePDIO a PDIOLocalDatabase:User database access function with modes
// External accessible wrapper for Enquire
this.EnqueuePDIO = async function( sw, c1, c2, c3 ) {
var k = await Enquire( PersonalDataDataBaseName, this.CurrentPerson, sw, c1, c2, c3 );
return k;
}
// Enquire, a general purpose indexeddb update function with modes
// Mode 'aggressive push':
// parameter record is pushed to database, overwriting whatever is there
// Mode 'checkin':
// record is retrieved from database, parameter record is pushed if not found
// Mode 'get record'
// updates record given as argument
// Mode 'update record' field1 field2 field3
// retrieve record, make record.field1.field2 = field3, push back
// Mode 'update record' field1 field2
// retrieve record, make record.field1 = field2, push back
// Mode 'remove from record' field1
// retrieve record, splice/delete record.field1, push back
// Mode 'remove from record' field1 field2
// retrieve record, splice/delete record.field1.field2, push back
async function Enquire( pddbname, record, sqitch, control_1, control_2, control_3 ) {
return new Promise(
function(resolve, reject) {
var pddb = window.indexedDB.open(pddbname, 3);
var inp_obj;
pddb.onupgradeneeded = function() {
var db = pddb.result;
var store = db.createObjectStore(pddbname, {keyPath: "id"});
// shouldn't the index be the wiki.personaldata.io username?
var index = store.createIndex("NameIndex", ["id"]);
};
pddb.onsuccess = function() {
var db = pddb.result;
var tx = db.transaction(pddbname, "readwrite");
var store = tx.objectStore(pddbname);
var index = store.index("NameIndex");
// Get the original record from the db...
var getRecord = index.get([record.id]);
getRecord.onsuccess = function() {
debuglog( "Record found in database: \n <<");
debuglog( getRecord.result );
debuglog( ">>");
// Essential recordAdd
if ( sqitch === "aggressive push" ) {
inp_obj = record;
store.put( inp_obj );
return inp_obj;
} else if ( sqitch === "checkin" ) {
if ( getRecord.result != undefined ) {
debuglog("getting from store");
inp_obj = getRecord.result;
} else {
debuglog("overriding whatever in there");
inp_obj = record;
store.put(inp_obj);
}
} else {
if ( getRecord.result != undefined ) {
inp_obj = getRecord.result;
if ( sqitch === "get record" ) {
// if found, let's use that from now on
debuglog("Getting record");
// let's return it so that our addrecord can be used as a getter as well
return inp_obj;
}
//
// endof onsuccess
} else {
debuglog("record not found");
if ( sqitch === "update record" ) {
inp_obj = record;
} else {
return undefined;
}
}
// endof resultdefined
}
// endofELSE
if ( sqitch === "update record" ) { // Record Update
if ( control_1 != undefined ) {
if ( control_2 != undefined ) {
if ( control_3 != undefined ) {
if ( inp_obj[ control_1 ] == undefined ) { inp_obj[ control_1 ] = (isNaN( control_2 )) ? {} : [] };
inp_obj[ control_1 ][ control_2 ] = control_3; // => "Bob"
store.put(inp_obj);
} else {
inp_obj[ control_1 ] = inp_obj[ control_1 ] || {};
if ( Array.isArray( inp_obj[ control_1 ] ) ) {
inp_obj[ control_1 ].push( control_2 );
} else {
inp_obj[ control_1 ] = control_2;
}
store.put(inp_obj);
}
// +3
} else {
store.put(inp_obj);
debuglog("mark N");
debuglog(inp_obj);
debuglog(inp_obj[ control_1 ]);
debuglog("mark NN")
inp_obj = inp_obj[ control_1 ];
}
// +2
} else {
//return inp_obj;
}
debuglog("return 3")
// return inp_obj;
};
if ( sqitch === "remove from record" ) { // Record Update
if ( control_1 != undefined ) {
if ( control_2 != undefined ) {
if ( Array.isArray( inp_obj[ control_1 ] ) && !isNaN( control_2 ) ) {
inp_obj[ control_1 ].splice( control_2, 1 );
} else {
delete inp_obj[ control_1 ][ control_2 ];
}
} else {
delete inp_obj[ control_1 ];
}
}
store.put(inp_obj);
}
debuglog("return 2")
resolve( inp_obj );
};
tx.oncomplete = function() {
debuglog("return 1")
db.close();
};
};
debuglog("return 0")
}).then( function(result) {
debuglog("Mark 3");
debuglog(result);
return result;
});
}
function debuglog( l0g ){
if ( Debug_switch ) {
debuglog( l0g );
}
}
};