src/SQLite3/SQLite3IF.js
/**
* The script is part of toolbox-wsh.
*
* AUTHOR:
* natade (http://twitter.com/natadea)
*
* LICENSE:
* The MIT license https://opensource.org/licenses/MIT
*/
/// <reference path="../../include/SenkoWSH.d.ts" />
import SQLite3Schema from "./SQLite3Schema.js";
import SQLite3 from "./SQLite3.js";
/**
* データベースの操作用インタフェース
* @requires SQLite3Schema
* @requires SenkoWSH
*/
export default class SQLite3IF {
/**
* データベースの操作用インタフェース
* @param {SFile} db_file DBファイル
* @param {string} table_name テーブル名
* @param {SQLite3Schema} schema テーブル情報
*/
constructor(db_file, table_name, schema) {
/**
* 操作対象のDBファイル
*/
this.db_file = db_file;
/**
* 操作対象のテーブル名
*/
this.table_name = table_name;
/**
* 操作対象のテーブル情報
*/
this.schema = schema;
}
/**
* 型情報を取得する
* @return {Object<string, import("./SQLite3Type.js").SQLite3TypeData>}
*/
getTypes() {
return this.schema.getTypes();
}
/**
* SQL文を作成する
*
* @param {string} sql_type 作成する SQL `select`, `count` など
* @param {Object<string, any>} [where] 条件文 `{ A : {$gte : 20} }` など
* @param {Object<string, null|number|boolean>} [select] 選択 `{ A : 1 }` など
* @param {Object<string, any>} [setdata] 設定値 `{ A : 1 }` など
* @returns {string}
*/
createSQL(sql_type, where, select, setdata) {
let sql_text = "";
if(sql_type === "count") {
sql_text = "select count(*) from " + this.table_name;
}
else if(sql_type === "select") {
const select_sql = this.schema.createSelectColumnSQL(select);
if(!select_sql) {
console.log("Error : createSelectColumnSQL");
return null;
}
sql_text = "select " + select_sql + " from " + this.table_name;
}
else if(sql_type === "insert") {
const value_sql = this.schema.createValuesSQL(setdata);
if(!value_sql) {
console.log("Error : createValuesSQL");
return null;
}
sql_text = "insert into " + this.table_name + " " + value_sql;
}
else if(sql_type === "delete") {
sql_text = "delete from " + this.table_name;
}
else if(sql_type === "update") {
const set_sql = this.schema.createSetSQL(setdata);
if(!set_sql) {
console.log("Error : createValuesSQL");
return null;
}
sql_text = "update " + this.table_name + " " + set_sql;
}
if(where) {
const where_sql = this.schema.createWhereSQL(where);
if(where_sql === null) {
console.log("Error : createWhereSQL");
return null;
}
else if(where_sql.length) {
sql_text += " " + where_sql;
}
}
return sql_text + ";";
}
/**
* レコード数を調べる
* @param {any} where_record
* @returns {number|null}
*/
count(where_record) {
const sql = this.createSQL("count", where_record);
if(sql === null) {
console.log("Error : createSQL");
return null;
}
const sql_data = SQLite3.execSQL(this.db_file, sql, "-readonly");
if(sql_data === null) {
console.log("Error : count " + this.table_name);
return null;
}
return Number.parseInt(sql_data, 10);
}
/**
* レコードを調べる
* @param {Object<string, any>} [where_record]
* @param {Object<string, null|number|boolean>} [is_show]
* @returns {Object<string, any>[]|null}
*/
find(where_record, is_show) {
const sql = this.createSQL("select", where_record, is_show);
if(sql === null) {
console.log("Error : createSQL");
return null;
}
const sql_data = SQLite3.execSQL(this.db_file, sql, "-readonly -json");
if(sql_data === null) {
console.log("Error : find " + sql.replace(/\n/g, "_"));
return [];
}
if(sql_data.length === 0) {
// 何もない場合は、見つからない = レコード数 0
return [];
}
return this.schema.normalizeSQLData(sql_data);
}
/**
* レコードを挿入する
* @param {Object<string, any>} insert_record
* @returns {boolean}
*/
insert(insert_record) {
const sql = this.createSQL("insert", undefined, undefined, insert_record);
if(sql === null) {
console.log("Error : createSQL");
return false;
}
const sql_data = SQLite3.execSQL(this.db_file, sql);
if(sql_data === null) {
console.log("Error : insert " + sql.replace(/\n/g, "_"));
return false;
}
return true;
}
/**
* レコードを削除する
* @param {Object<string, any>} [where_record]
* @returns {boolean}
*/
remove(where_record) {
const sql = this.createSQL("delete", where_record);
if(sql === null) {
console.log("Error : createSQL");
return false;
}
const sql_data = SQLite3.execSQL(this.db_file, sql);
if(sql_data === null) {
console.log("Error : remove " + sql.replace(/\n/g, "_"));
return false;
}
return true;
}
/**
* レコードを変更する
* @param {Object<string, any>} where_record
* @param {Object<string, any>} update_record
* @returns {boolean}
*/
update(where_record, update_record) {
const sql = this.createSQL("update", where_record, undefined, update_record);
if(sql === null) {
console.log("Error : createSQL");
return false;
}
const sql_data = SQLite3.execSQL(this.db_file, sql);
if(sql_data === null) {
console.log("Error : update " + sql.replace(/\n/g, "_"));
return false;
}
}
}