add lib for sqlite3 database

This commit is contained in:
lxsang 2023-01-30 09:37:44 +01:00
parent 9afa2f5d1c
commit 11df616319
13 changed files with 725 additions and 0 deletions

130
SQLiteDB/LibSQLite.ts Normal file
View File

@ -0,0 +1,130 @@
namespace OS {
export namespace API
{
export class SQLiteDBBase {
private db_file: VFS.BaseFileHandle;
constructor(path: VFS.BaseFileHandle | string)
{
this.db_file = path.asFileHandle();
}
private pwd(): VFS.BaseFileHandle
{
return "pkg://SQLiteDB/".asFileHandle();
}
/**
* init and create the db file if it does not exist
*/
private init(): Promise<any>
{
return new Promise(async (ok, reject) => {
try{
let request = {
action: 'init',
args: {
db_source: this.db_file.path,
}
}
let _result = await this.call(request);
_result = await this.db_file.onready();
if(!this.db_file || !this.db_file.ready || this.db_file.info.type !== "file")
{
throw __("DB file meta-data is invalid: {0}", this.db_file.path).__();
}
ok(true);
}
catch(e)
{
reject(__e(e));
}
});
}
private call(request: GenericObject<any>): Promise<any> {
return new Promise(async (ok, reject) => {
request.args.db_source = this.db_file.path;
let cmd = {
path: this.pwd().path + "/api/api.lua",
parameters: request
}
let data = await API.apigateway(cmd, false);
if(!data.error)
{
ok(data.result);
}
else
{
reject(API.throwe(__("SQLiteDB server call error: {0}", data.error)));
}
});
}
private request(rq: GenericObject<any>): Promise<any>
{
return new Promise(async (ok, reject) => {
try{
if(!this.db_file.ready)
{
let _ = await this.init();
}
let result = await this.call(rq);
ok(result);
}
catch(e)
{
reject(__e(e));
}
});
}
query(sql: string): Promise<any>
{
let rq = {
action: 'query',
args: {
query: sql
}
}
return this.request(rq);
}
select(table: string, fields: string[], condition: string): Promise<GenericObject<any>[]>
{
let rq = {
action: 'select',
args: {
table: table,
fields: fields.join(","),
cond: condition
}
}
return this.request(rq);
}
list_tables(): Promise<string[]>
{
return new Promise(async (ok, reject) => {
try {
let result = await this.select(
"sqlite_master", ["name"], "type ='table'");
return ok(result.map((e) => e.name))
}
catch(e)
{
reject(__e(e))
}
});
}
last_insert_id(): Promise<number>
{
let rq = {
action: 'last_insert_id',
args: {
}
}
return this.request(rq);
}
}
}
}

15
SQLiteDB/README.md Normal file
View File

@ -0,0 +1,15 @@
# SQLiteDB
This is an example project, generated by AntOS Development Kit
## Howto
Use the Antedit command palette to access to the SDK functionalities:
1. Create new project
2. Init the project from the current folder located in side bar
3. Build and run the project
4. Release the project in zip package
## Set up build target
Open the `build.json` file from the current project tree and add/remove
build target entries and jobs. Save the file

76
SQLiteDB/api/api.lua Normal file
View File

@ -0,0 +1,76 @@
-- collecting arguments
local args=...
-- require libs
local vfs = require("vfs")
local sqlite = modules.sqlite()
-- helper functions
local result = function(data)
return { error = false, result = data }
end
local error = function(msg)
return {error = msg, result = false}
end
-- handler object
local handle = {}
-- Handle functions defined here
handle.init = function(data)
local os_path = vfs.ospath(data.db_source)
local db = sqlite._getdb(os_path)
if not db then
return error("Unable to open sqlite db file")
end
sqlite.dbclose(db)
return result(true)
end
handle.query = function(data)
local os_path = vfs.ospath(data.db_source)
local db = sqlite._getdb(os_path)
if not db then
return error("Unable to open sqlite db file")
end
local ret = sqlite.query(db, data.query)
sqlite.dbclose(db)
if ret ~= 1 then
return error("error executing query")
end
return result(true)
end
handle.select = function(data)
local os_path = vfs.ospath(data.db_source)
local db = sqlite._getdb(os_path)
if not db then
return error("Unable to open sqlite db file")
end
local ret = sqlite.select(db, data.table, data.fields, data.cond);
sqlite.dbclose(db)
if not ret then
return error("error executing select statement")
end
return result(ret)
end
handle.last_insert_id = function(data)
local os_path = vfs.ospath(data.db_source)
local db = sqlite._getdb(os_path)
if not db then
return error("Unable to open sqlite db file")
end
local ret = sqlite.lastInsertID(db)
sqlite.dbclose(db)
return result(ret)
end
-- dispatching action
if args.action and handle[args.action] then
return handle[args.action](args.args)
else
return error("Invalid action parameter")
end

92
SQLiteDB/build.json Normal file
View File

@ -0,0 +1,92 @@
{
"name": "SQLiteDB",
"targets":{
"clean": {
"jobs": [
{
"name": "vfs-rm_no_error",
"data": ["build/debug","build/release"]
}
]
},
"build": {
"require": ["ts"],
"jobs":[
{
"name": "vfs-mkdir",
"data": ["build","build/debug","build/release"]
},
{
"name": "ts-import",
"data": ["sdk://core/ts/core.d.ts", "sdk://core/ts/jquery.d.ts","sdk://core/ts/antos.d.ts"]
},
{
"name": "ts-compile",
"data": {
"src": ["main.ts"],
"dest": "build/debug/main.js"
}
},
{
"name": "ts-compile",
"data": {
"src": ["LibSQLite.ts"],
"dest": "build/debug/libsqlite.js"
}
}
]
},
"uglify": {
"require": ["terser"],
"jobs": [
{
"name":"terser-uglify",
"data": ["build/debug/main.js", "build/debug/libsqlite.js"]
}
]
},
"copy": {
"jobs": [
{
"name": "vfs-cp",
"data": {
"src": [
"scheme.html",
"package.json",
"README.md",
"api"
],
"dest":"build/debug"
}
}
]
},
"release": {
"depend": ["clean","build","uglify", "copy"],
"require": ["zip"],
"jobs": [
{
"name": "zip-mk",
"data": {
"src":"build/debug",
"dest":"build/release/SQLiteDB.zip"
}
}
]
},
"debug": {
"depend": ["clean","build", "copy"],
"jobs": [
{
"name": "vfs-cat",
"data": {
"src": [
"build/debug/main.js", "build/debug/libsqlite.js"
],
"dest":"build/debug/main.js"
}
}
]
}
}
}

View File

@ -0,0 +1,15 @@
# SQLiteDB
This is an example project, generated by AntOS Development Kit
## Howto
Use the Antedit command palette to access to the SDK functionalities:
1. Create new project
2. Init the project from the current folder located in side bar
3. Build and run the project
4. Release the project in zip package
## Set up build target
Open the `build.json` file from the current project tree and add/remove
build target entries and jobs. Save the file

View File

@ -0,0 +1,76 @@
-- collecting arguments
local args=...
-- require libs
local vfs = require("vfs")
local sqlite = modules.sqlite()
-- helper functions
local result = function(data)
return { error = false, result = data }
end
local error = function(msg)
return {error = msg, result = false}
end
-- handler object
local handle = {}
-- Handle functions defined here
handle.init = function(data)
local os_path = vfs.ospath(data.db_source)
local db = sqlite._getdb(os_path)
if not db then
return error("Unable to open sqlite db file")
end
sqlite.dbclose(db)
return result(true)
end
handle.query = function(data)
local os_path = vfs.ospath(data.db_source)
local db = sqlite._getdb(os_path)
if not db then
return error("Unable to open sqlite db file")
end
local ret = sqlite.query(db, data.query)
sqlite.dbclose(db)
if ret ~= 1 then
return error("error executing query")
end
return result(true)
end
handle.select = function(data)
local os_path = vfs.ospath(data.db_source)
local db = sqlite._getdb(os_path)
if not db then
return error("Unable to open sqlite db file")
end
local ret = sqlite.select(db, data.table, data.fields, data.cond);
sqlite.dbclose(db)
if not ret then
return error("error executing select statement")
end
return result(ret)
end
handle.last_insert_id = function(data)
local os_path = vfs.ospath(data.db_source)
local db = sqlite._getdb(os_path)
if not db then
return error("Unable to open sqlite db file")
end
local ret = sqlite.lastInsertID(db)
sqlite.dbclose(db)
return result(ret)
end
-- dispatching action
if args.action and handle[args.action] then
return handle[args.action](args.args)
else
return error("Invalid action parameter")
end

View File

@ -0,0 +1,108 @@
var OS;
(function (OS) {
let API;
(function (API) {
class SQLiteDBBase {
constructor(path) {
this.db_file = path.asFileHandle();
}
pwd() {
return "pkg://SQLiteDB/".asFileHandle();
}
/**
* init and create the db file if it doesnot exist
*/
init() {
return new Promise(async (ok, reject) => {
try {
let request = {
action: 'init',
args: {
db_source: this.db_file.path,
}
};
let _result = await this.call(request);
_result = await this.db_file.onready();
if (!this.db_file || !this.db_file.ready || this.db_file.info.type !== "file") {
throw __("DB file meta-data is invalid: {0}", this.db_file.path).__();
}
ok(true);
}
catch (e) {
reject(__e(e));
}
});
}
call(request) {
return new Promise(async (ok, reject) => {
request.args.db_source = this.db_file.path;
let cmd = {
path: this.pwd().path + "/api/api.lua",
parameters: request
};
let data = await API.apigateway(cmd, false);
if (!data.error) {
ok(data.result);
}
else {
reject(API.throwe(__("SQLiteDB server call error: {0}", data.error)));
}
});
}
request(rq) {
return new Promise(async (ok, reject) => {
try {
if (!this.db_file.ready) {
let _ = await this.init();
}
let result = await this.call(rq);
ok(result);
}
catch (e) {
reject(__e(e));
}
});
}
query(sql) {
let rq = {
action: 'query',
args: {
query: sql
}
};
return this.request(rq);
}
select(table, fields, condition) {
let rq = {
action: 'select',
args: {
table: table,
fields: fields.join(","),
cond: condition
}
};
return this.request(rq);
}
list_tables() {
return new Promise(async (ok, reject) => {
try {
let result = await this.select("sqlite_master", ["name"], "type ='table'");
return ok(result.map((e) => e.name));
}
catch (e) {
reject(__e(e));
}
});
}
last_insert_id() {
let rq = {
action: 'last_insert_id',
args: {}
};
return this.request(rq);
}
}
API.SQLiteDBBase = SQLiteDBBase;
})(API = OS.API || (OS.API = {}));
})(OS || (OS = {}));

View File

@ -0,0 +1,141 @@
var OS;
(function (OS) {
let application;
(function (application) {
;
;
/**
*
* @class SQLiteDB
* @extends {BaseApplication}
*/
class SQLiteDB extends application.BaseApplication {
constructor(args) {
super("SQLiteDB", args);
}
main() {
// YOUR CODE HERE
let handle = new OS.API.SQLiteDBBase("home://tmp/test.db");
handle.list_tables().then((list) => {
console.log(list);
if (list.indexOf("contacts") < 0) {
handle.query("CREATE TABLE contacts (id INTEGER PRIMARY KEY,first_name TEXT NOT NULL,last_name TEXT NOT NULL,email TEXT NOT NULL UNIQUE,phone TEXT NOT NULL UNIQUE)");
}
});
handle.last_insert_id().then(o => console.log(o));
}
}
application.SQLiteDB = SQLiteDB;
})(application = OS.application || (OS.application = {}));
})(OS || (OS = {}));
var OS;
(function (OS) {
let API;
(function (API) {
class SQLiteDBBase {
constructor(path) {
this.db_file = path.asFileHandle();
}
pwd() {
return "pkg://SQLiteDB/".asFileHandle();
}
/**
* init and create the db file if it doesnot exist
*/
init() {
return new Promise(async (ok, reject) => {
try {
let request = {
action: 'init',
args: {
db_source: this.db_file.path,
}
};
let _result = await this.call(request);
_result = await this.db_file.onready();
if (!this.db_file || !this.db_file.ready || this.db_file.info.type !== "file") {
throw __("DB file meta-data is invalid: {0}", this.db_file.path).__();
}
ok(true);
}
catch (e) {
reject(__e(e));
}
});
}
call(request) {
return new Promise(async (ok, reject) => {
request.args.db_source = this.db_file.path;
let cmd = {
path: this.pwd().path + "/api/api.lua",
parameters: request
};
let data = await API.apigateway(cmd, false);
if (!data.error) {
ok(data.result);
}
else {
reject(API.throwe(__("SQLiteDB server call error: {0}", data.error)));
}
});
}
request(rq) {
return new Promise(async (ok, reject) => {
try {
if (!this.db_file.ready) {
let _ = await this.init();
}
let result = await this.call(rq);
ok(result);
}
catch (e) {
reject(__e(e));
}
});
}
query(sql) {
let rq = {
action: 'query',
args: {
query: sql
}
};
return this.request(rq);
}
select(table, fields, condition) {
let rq = {
action: 'select',
args: {
table: table,
fields: fields.join(","),
cond: condition
}
};
return this.request(rq);
}
list_tables() {
return new Promise(async (ok, reject) => {
try {
let result = await this.select("sqlite_master", ["name"], "type ='table'");
return ok(result.map((e) => e.name));
}
catch (e) {
reject(__e(e));
}
});
}
last_insert_id() {
let rq = {
action: 'last_insert_id',
args: {}
};
return this.request(rq);
}
}
API.SQLiteDBBase = SQLiteDBBase;
})(API = OS.API || (OS.API = {}));
})(OS || (OS = {}));

View File

@ -0,0 +1,16 @@
{
"pkgname": "SQLiteDB",
"app":"SQLiteDB",
"name":"SQLiteDB",
"description":"SQLiteDB",
"info":{
"author": "",
"email": ""
},
"version":"0.0.1-a",
"category":"Other",
"iconclass":"fa fa-adn",
"mimes":["none"],
"dependencies":[],
"locale": {}
}

View File

@ -0,0 +1,3 @@
<afx-app-window apptitle="SQLiteDB" width="500" height="400" data-id="SQLiteDB">
<afx-hbox ></afx-hbox>
</afx-app-window>

34
SQLiteDB/main.ts Normal file
View File

@ -0,0 +1,34 @@
namespace OS {
export namespace application {
interface SQLiteDBBaseConstructor{
new(pqth: API.VFS.BaseFileHandle| string): SQLiteDBBase;
};
interface SQLiteDBBase{
list_tables(): Promise<Array<string>>,
last_insert_id(): Promise<number>,
query(sql): Promise<any>
};
/**
*
* @class SQLiteDB
* @extends {BaseApplication}
*/
export class SQLiteDB extends BaseApplication {
constructor(args: AppArgumentsType[]) {
super("SQLiteDB", args);
}
main(): void {
// YOUR CODE HERE
let handle = new ((OS.API as any).SQLiteDBBase as SQLiteDBBaseConstructor)("home://tmp/test.db");
handle.list_tables().then((list) => {
console.log(list);
if(list.indexOf("contacts") < 0)
{
handle.query("CREATE TABLE contacts (id INTEGER PRIMARY KEY,first_name TEXT NOT NULL,last_name TEXT NOT NULL,email TEXT NOT NULL UNIQUE,phone TEXT NOT NULL UNIQUE)");
}
});
handle.last_insert_id().then(o => console.log(o));
}
}
}
}

16
SQLiteDB/package.json Normal file
View File

@ -0,0 +1,16 @@
{
"pkgname": "SQLiteDB",
"app":"SQLiteDB",
"name":"SQLiteDB",
"description":"SQLiteDB",
"info":{
"author": "",
"email": ""
},
"version":"0.0.1-a",
"category":"Other",
"iconclass":"fa fa-adn",
"mimes":["none"],
"dependencies":[],
"locale": {}
}

3
SQLiteDB/scheme.html Normal file
View File

@ -0,0 +1,3 @@
<afx-app-window apptitle="SQLiteDB" width="500" height="400" data-id="SQLiteDB">
<afx-hbox ></afx-hbox>
</afx-app-window>