obcon-scada / app /include /modelOdbc.js
chanmin0723's picture
Initial obcon SCADA deploy
e4bf523
Raw
History Blame Contribute Delete
7.29 kB
'use strict'
/**
* Copyright (c) 2017~2022, OBCon Inc.
* All rights reserved.
*/
/**
* @file
* @copyright 2017~2022, OBCon Inc.
* @author gye hyun james kim [pnuskgh@gmail.com]
*/
//--- 사용하지 않음
class ModelOdbc {
constructor() {
this._table = 'devices';
this._fieldNames = [];
}
get table() {
return {
findOne: this.findOne.bind(this),
findAll: this.findAll.bind(this),
create: this.create.bind(this),
update: this.update.bind(this),
destroy: this.destroy.bind(this),
};
}
async findOne(sql, strQuery = null) {
let results = await this.findAll(sql, strQuery);
if (0 < results.count) {
if ((strQuery != null) && (-1 < strQuery.indexOf('NEXTVAL'))) {
return results[0]['NEXTVAL'];
} else {
return results[0];
}
} else {
return null;
}
}
async findAll(sql, strQuery = null) {
let query = [];
if (strQuery == null) {
query.push('SELECT *');
query.push(` FROM ${this._table}`);
//--- WHERE 문 처리
if (typeof(sql.where) != 'undefined') {
query.push(' WHERE');
query.push(this._set(sql.where, 'AND'));
}
//--- ORDER BY 문 처리
if (typeof(sql.order) != 'undefined') {
query.push(' ORDER BY');
let data = [];
for (let idx = 0; idx < sql.order.length; idx++) {
let item = sql.order[idx];
switch(item[0]) {
case 'site': break;
default:
data.push(`${item[0]} ${item[1]}`);
break;
}
}
query.push(data.join(', '));
}
//--- LIMIT 문 처리
if (typeof(sql.limit) != 'undefined') {
query.push(` LIMIT ${sql.limit}`);
}
query = query.join(' ');
} else {
query = strQuery;
}
logger.info(query);
let results = await db.conn.query(query);
if (config.databases.obcon.type == 'Tibero') {
for (let idx = 0; idx < results.length; idx++) {
for (let pos = 0; pos < this._fieldNames.length; pos++) {
let fieldName = this._fieldNames[pos];
if (typeof(results[idx][fieldName.toUpperCase()]) != 'undefined') {
results[idx][fieldName] = results[idx][fieldName.toUpperCase()];
}
}
}
}
return results;
}
_set(item, delimiter, isIn=false) {
let data = [];
for (const [key, value] of Object.entries(item)) {
if (isIn) {
// let key1 = (config.databases.obcon.type == 'Tibero') ? key.toUpperCase():key;
if (this._fieldNames.includes(key) == false) {
continue;
}
}
switch(key) {
case 'site': break;
default:
switch(typeof(value)) {
case 'string':
data.push(`${key} = '${value}'`);
break;
case 'number':
case 'boolean':
default:
data.push(`${key} = ${value}`);
break;
}
break;
}
}
return data.join(` ${delimiter} `);
}
async create(item, strQuery = null) {
let query = `SELECT seq_${this._table}.NEXTVAL FROM DUAL`.replace('OBICON.', '');
let id = await this.findOne(null, query);
item['id'] = id;
query = [];
if (strQuery == null) {
query.push(`INSERT INTO ${this._table} (`);
let data = [];
for (const [key, value] of Object.entries(item)) {
// let key1 = (config.databases.obcon.type == 'Tibero') ? key.toUpperCase():key;
if (this._fieldNames.includes(key)) {
data.push(key);
}
}
query.push(data.join(', '));
query.push(') VALUES (');
data = [];
for (const [key, value] of Object.entries(item)) {
// let key1 = (config.databases.obcon.type == 'Tibero') ? key.toUpperCase():key;
if (this._fieldNames.includes(key)) {
switch(key) {
case 'site': break;
default:
switch(typeof(value)) {
case 'string':
data.push(`'${value}'`);
break;
case 'number':
case 'boolean':
default:
data.push(`${value}`);
break;
}
break;
}
}
}
query.push(data.join(', '));
query.push(')');
query = query.join(' ');
} else {
query = strQuery;
}
logger.info(`SQL Create : ${query}`);
let results = await db.conn.query(query);
results[0] = results.count;
return results;
}
async update(item, sql = null, strQuery = null) {
let query = [];
if (strQuery == null) {
query.push(`UPDATE ${this._table}`);
query.push(' SET');
query.push(this._set(item, ',', true));
//--- WHERE 문 처리
if (typeof(sql.where) != 'undefined') {
query.push(' WHERE');
query.push(this._set(sql.where, 'AND'));
}
query = query.join(' ');
} else {
query = strQuery;
}
logger.info(`SQL Update : ${query}`);
let results = await db.conn.query(query);
results[0] = results.count;
return results;
}
async destroy(sql, strQuery = null) {
let query = [];
if (strQuery == null) {
query.push(`DELETE FROM ${this._table}`);
//--- WHERE 문 처리
if (typeof(sql.where) != 'undefined') {
query.push(' WHERE');
query.push(this._set(sql.where, 'AND'));
}
query = query.join(' ');
} else {
query = strQuery;
}
//--- To-Do : ppp, 테스트 필요
logger.info(`SQL delete : ${query}`);
if (-1 < query.indexOf('id = ')) {
let results = await db.conn.query(query);
results[0] = results.count;
return results;
}
return 0;
}
init() {
}
}
module.exports = ModelOdbc;