From 2e71814dc93fe1abbca140614ee74858501aaed5 Mon Sep 17 00:00:00 2001 From: sbosse Date: Mon, 21 Jul 2025 23:17:50 +0200 Subject: [PATCH] Mon 21 Jul 22:43:21 CEST 2025 --- js/top/libio.js | 209 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 209 insertions(+) create mode 100644 js/top/libio.js diff --git a/js/top/libio.js b/js/top/libio.js new file mode 100644 index 0000000..4026bf2 --- /dev/null +++ b/js/top/libio.js @@ -0,0 +1,209 @@ +/** + ** ============================== + ** O O O OOOO + ** O O O O O O + ** O O O O O O + ** OOOO OOOO O OOO OOOO + ** O O O O O O O + ** O O O O O O O + ** OOOO OOOO O O OOOO + ** ============================== + ** Dr. Stefan Bosse http://www.bsslab.de + ** + ** COPYRIGHT: THIS SOFTWARE, EXECUTABLE AND SOURCE CODE IS OWNED + ** BY THE AUTHOR(S). + ** THIS SOURCE CODE MAY NOT BE COPIED, EXTRACTED, + ** MODIFIED, OR OTHERWISE USED IN A CONTEXT + ** OUTSIDE OF THE SOFTWARE SYSTEM. + ** + ** $AUTHORS: Stefan Bosse + ** $INITIAL: (C) 2006-2018 bLAB + ** $CREATED: 30-9-17 by sbosse. + ** $VERSION: 1.2.1 + ** + ** $INFO: + ** + ** IO Module with DB/CSV support + ** + ** TODO: Unify Db.sqld/Db.sqlc/DbS.sqlc APIs!!!! + ** + ** $ENDOFINFO + */ +var Io = Require('com/io'); +var Comp = Require('com/compat'); +var Db = Require('db/dbS'); +var Json = Require('jam/jsonfn'); +var Papa = Require('parser/papaparse.js'); +var util = Require('util'); + +function io(options) { + var self=this; + if (! (this instanceof io)) return new io(options); + + this.Db=undefined; + // Logging function? + this.log = options.log||console.log; + // Current environment (AIOS)? + this.current=options.current; + + // Callback handler + function callit(proc,callback,args) { + if (!callback) return; + if (!proc) callback.apply({},args); + else proc.callback(callback,args); + } + function process() { + if (self.current && self.current.process) return self.current.process; + } + // SQLD DB connection + this.db = { + init: function (path,channel,callback) { + var proc=process(); + if (!self.Db) self.Db={}; + if (!self.Db[path]) { + self.Db[path]=Db.Sqlc(path,channel); + self.Db[path].setLog(function (msg) {self.log(msg)}); + } + self.Db[path].init(function (stat,err) { + self.log('[DB] '+path+' Initialized: '+stat); + callit(proc,callback,[stat,err]); + }); + }, + createMatrix: function (path,matname,firstrow,callback) { + var proc=process(); + self.Db[path].createMatrix(matname,firstrow,function (stat,err) { + callit(proc,callback,[stat,err]); + }); + }, + createTable: function (path,tblname,header,callback) { + var proc=process(); + self.Db[path].createTable(tblname,header,function (stat,err) { + callit(proc,callback,[stat,err]); + }); + }, + drop: function (path,tbl,callback) { + var proc=process(); + self.Db[path].drop(tbl,function (stat,err) { + callit(proc,callback,[stat,err]); + }); + }, + get: function (path,callback) { + var proc=process(); + self.Db[path].get(undefined,function (row,err) { + callit(proc,callback,[row,err]); + }); + }, + insert: function (path,tbl,row,callback) { + var proc=process(); + self.Db[path].insert(tbl,row,function (stat,err) { + callit(proc,callback,[stat,err]); + }); + }, + insertMatrix: function (path,matname,row,callback) { + var proc=process(); + self.Db[path].insertMatrix(matname,row,function (stat,err) { + callit(proc,callback,[stat,err]); + }); + }, + readMatrix: function (path,matname,callback) { + var proc=process(); + self.Db[path].readMatrix(matname,function (mat,err) { + callit(proc,callback,[mat,err]); + }); + }, + readTable: function (path,tblname,callback) { + var proc=process(); + self.Db[path].readTable(tblname,function (tbl,err) { + callit(proc,callback,[tbl,err]); + }); + }, + select: function (path,tbl,vars,cond,callback) { + var proc=process(); + if (!callback && Comp.obj.isFunction(cond)) callback=cond,cond=undefined; + self.Db[path].select(tbl,vars,cond,function (stat,err) { + callit(proc,callback,[stat,err]); + }); + }, + writeMatrix: function (path,matname,matrix,callback) { + var proc=process(); + self.Db[path].writeMatrix(matname,matrix,function (stat,err) { + callit(proc,callback,[stat,err]); + }); + }, + writeTable: function (path,tblname,tbl,callback) { + var proc=process(); + self.Db[path].writeTable(tblname,tbl,function (stat,err) { + callit(proc,callback,[stat,err]); + }); + } + } + // CSV file import/export + this.csv = { + // callback:function(data|error) + read: function (file,callback,verbose) { + var proc=process(); + if (verbose) self.log('CSV: Reading from '+file); + try { + data=Io.read_file(file); + if (!data) throw 'CSV File read error: '+file; + if (verbose) self.log('CSV: Parsing '+file); + Papa.parse(data,{ + complete: function(results) { + if (verbose) self.log('CSV parsed with DEL="'+results.meta.delimiter+'" TRUNC='+results.meta.truncated+ + ' ABORT='+results.meta.aborted); + callit(proc,callback,[results.data]); + } + }); + } catch (e) { + callit(proc,callback,[e]); + } + }, + // typeof data = *[][] + write: function (file,header,data,callback,verbose) { + var proc=process(), + fd,i; + try { + if (verbose) self.log('CSV: Wrting to file '+file); + fd=Io.open(file,'w+'); + Io.write_line(fd,Comp.printf.list(header)); + for(i in data) { + Io.write_line(fd,Comp.printf.list(data[i])); + } + Io.close(fd); + callit(proc,callback,[0]); + } catch (e) { + callit(proc,callback,[e]); + } + }, + // typeof data = {}[] + // header is derived from first object element + writeObj: function (file,data,callback,verbose) { + var proc=process(), + fd,i,p,header=[],line,sep; + try { + if (verbose) self.log('CSV: Wrting to '+file); + fd=Io.open(file,'w+'); + for(p in data[0]) header.push(p); + Io.write_line(fd,Comp.printf.list(header)); + for(i in data) { + line='',sep=''; + for(p in data[i]) line = line + sep + String(data[i][p]),sep=','; + Io.write_line(fd,line); + } + Io.close(fd); + callit(proc,callback,[0]); + } catch (e) { + callit(proc,callback,[e]); + } + } + + }; + + this.array = Comp.array; + this.inspect = util.inspect; + +} + +module.exports = { + Io:io +}