Difference between revisions of "MediaWiki:Gadget-personaldata.js"

From Wikibase Personal data
Jump to navigation Jump to search
m (Abel moved page User:Abel/personaldata.js to MediaWiki:Gadget-personaldata.js: The Indexeddb functionality gadget)
m
Line 2: Line 2:
 
// Indexeddb JavaScript  
 
// Indexeddb JavaScript  
 
console.log('Indb loading');
 
console.log('Indb loading');
 +
 +
function idxdbContainer( ww ) {
 +
 +
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);
 +
 +
console.log(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
 +
var CurrentPerson = {id: idgen, name: {user: self}, age: 0};
 +
 +
console.log(PersonalDataDataBaseName);
 +
console.log(CurrentPerson);
 +
}
 +
 +
// ADD MORE DOC
 +
 +
// EnqueuePDIO a PDIOLocalDatabase:User database access function with modes
 +
// External accessible wrapper for Enquire
 +
 +
this.EnqueuePDIO = function( sw, c1, c2, c3 ) {
 +
return Enquire( PersonalDataDataBaseName, CurrentPerson, sw, c1, c2, c3 );
 +
}
 +
 +
// 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'
 +
// tries to get record from db, returns undefined if not found
 +
 +
// 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
 +
 +
function Enquire( pddbname, record, sqitch, control_1, control_2, control_3 ) {
 +
var pddb = window.indexedDB.open(pddbname, 3);
 +
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]);
 +
var inp_obj;
 +
 +
getRecord.onsuccess = function() {
 +
console.log( "Record found in database: \n <<");
 +
console.log( getRecord.result );
 +
console.log( ">>");
 +
 +
// Essential recordAdd
 +
if ( sqitch === "aggressive push" ) {
 +
inp_obj = record;
 +
store.put( inp_obj );
 +
return inp_obj;
 +
} else if ( sqitch === "checkin" ) {
 +
 +
if ( getRecord.result != undefined ) {
 +
console.log("getting from store");
 +
inp_obj = getRecord.result;
 +
} else {
 +
console.log("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
 +
console.log("Getting record");
 +
// let's return it so that our addrecord can be used as a getter as well
 +
return inp_obj;
 +
}
 +
//
 +
// endof onsuccess
 +
} else {
 +
console.log("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 ( Array.isArray( inp_obj[ control_1 ][ control_2 ] ) ) {
 +
inp_obj[ control_1 ][ control_2 ].push( control_3 );
 +
} else {
 +
inp_obj[ control_1 ][ control_2 ] = control_3; // => "Bob"
 +
}
 +
store.put(inp_obj);
 +
} else {
 +
 +
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);
 +
return inp_obj[ control_1 ];
 +
}
 +
// +2
 +
} else {
 +
 +
return inp_obj;
 +
 +
}
 +
 +
};
 +
 +
};
 +
};
 +
};
 +
};

Revision as of 20:12, 18 May 2019

// License: GPL
// Indexeddb JavaScript 
console.log('Indb loading');
	
function idxdbContainer( ww ) {
	
	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);																										

			console.log(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
			var CurrentPerson = {id: idgen, name: {user: self}, age: 0};
			
			console.log(PersonalDataDataBaseName);
			console.log(CurrentPerson);
		}

	// ADD MORE DOC

	// EnqueuePDIO a PDIOLocalDatabase:User database access function with modes
	// External accessible wrapper for Enquire
	
	this.EnqueuePDIO = function( sw, c1, c2, c3 ) {
		return Enquire( PersonalDataDataBaseName, CurrentPerson, sw, c1, c2, c3 );
	}

	// 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'
	// tries to get record from db, returns undefined if not found

	// 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

	function Enquire( pddbname, record, sqitch, control_1, control_2, control_3 ) {
		var pddb = window.indexedDB.open(pddbname, 3);
		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]);
			var inp_obj;

			getRecord.onsuccess = function() {
				console.log( "Record found in database: \n <<");
				console.log( getRecord.result );
				console.log( ">>");

				// Essential recordAdd																													
				if ( sqitch === "aggressive push" ) {
					inp_obj = record;
					store.put( inp_obj );
					return inp_obj;
				} else if ( sqitch === "checkin" ) {
					
					if ( getRecord.result != undefined ) {
						console.log("getting from store");
						inp_obj = getRecord.result;
					} else {
						console.log("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
							console.log("Getting record");
							// let's return it so that our addrecord can be used as a getter as well
							return inp_obj;
						} 
							//
						// endof onsuccess
					} else {
						console.log("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 ( Array.isArray( inp_obj[ control_1 ][ control_2 ] ) ) {
									inp_obj[ control_1 ][ control_2 ].push( control_3 );											
								} else {
									inp_obj[ control_1 ][ control_2 ] = control_3;	// => "Bob"
								}
								store.put(inp_obj);
							} else {
								
								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);
							return inp_obj[ control_1 ];
						}
							// +2
					} else {

						return inp_obj;

					}

				};

			};
		};
	};
};