Database worker code documentation
// initialize database
const {database} = require('../scripts/databaseInit.js');
//read processed data line by line
liner = new lineByLine(path.join(process.resourcesPath, '..', 'data', 'Stats', 'Patterns.txt'));
/*
* read processed data line by line
* split each records in pattern string, popularity and file address
* add splited values to pattern database table
* catch any error or else count successful addition
*/
// database transaction, this will rollback half completed operation automatically
database.transaction('rw', database.Patterns, async () => {
//iterate over file
while (line = liner.next()) {
//split line as per delimiter
splitter = line.toString().split('<|>');
//to check file strings are in correct format => "pattern<|>address<|>popularity"
if(splitter.length != 3){
continue;
}
//add records to database table
await database.Patterns.add({
pattern: splitter[0],
address: splitter[1],
popularity: splitter[2]
}).then(function(){
addedRecords++;
lineNumber++;
}).catch(async function (e) {
//if record already exist in database then
if((e.name == "ConstraintError") && (e.message == 'Key already exists in the object store.')){
//check if popularity is greater than what we have in database
await database.Patterns.where('pattern')
.equalsIgnoreCase(splitter[0])
.and(function(record) { return record.popularity < splitter[2];})
.toArray (function (isSmall) {
//if yes then update popularity
if(isSmall.length){
database.Patterns.where('pattern').equals(splitter[0]).modify({"popularity": splitter[2]});
}
});
}else{
console.error(e.name + ': ' +e.message);
}
duplicates++;
lineNumber++;
});
}
}).then(function(){
//pass successful and unsuccessful records number to main thread.
postMessage(addedRecords.toString() + "," + duplicates.toString());//use when you are using a web worker
return;
}).catch(error => {
console.error(error);
return;
});