| |
| |
| |
| |
| |
| |
| |
| |
|
|
| import sqlite3 |
| import os, time, sys |
|
|
| os.chdir('/www/server/panel') |
| if not 'class/' in sys.path: |
| sys.path.insert(0, 'class/') |
| import public |
|
|
|
|
| class Sql(): |
| |
| |
| |
| __DB_FILE = None |
| __DB_CONN = None |
| __DB_TABLE = "" |
| __OPT_WHERE = "" |
| __OPT_LIMIT = "" |
| __OPT_ORDER = "" |
| __OPT_FIELD = "*" |
| __OPT_PARAM = () |
|
|
|
|
| def __init__(self, dbfile=None): |
| if not os.path.exists("class/projectModel/content/"): |
| os.makedirs("class/projectModel/content/") |
| if not dbfile: |
| self.__DB_FILE = 'class/projectModel/content/content.db' |
| self.__LOCK = '/dev/shm/{}.pl'.format(self.__DB_FILE.replace('/', '_')) |
| else: |
| self.__DB_FILE ='class/projectModel/content/' + dbfile + '.db' |
| self.__LOCK = '/dev/shm/{}.pl'.format(self.__DB_FILE.replace('/', '_')) |
| if not os.path.exists(self.__DB_FILE): |
| |
| conn = sqlite3.connect(self.__DB_FILE) |
| conn.close() |
|
|
| def __enter__(self): |
| return self |
|
|
| def __exit__(self, exc_type, exc_value, exc_trackback): |
| self.close() |
|
|
| def __GetConn(self): |
| |
| try: |
| if self.__DB_CONN == None: |
| self.__DB_CONN = sqlite3.connect(self.__DB_FILE) |
| self.__DB_CONN.text_factory = str |
| except Exception as ex: |
| return "error: " + str(ex) |
|
|
| def dbfile(self, name): |
| self.__DB_FILE = 'class/projectModel/content/' + name + '.db' |
| return self |
|
|
| def table(self, table): |
| |
| self.__DB_TABLE = table |
| return self |
|
|
| def where(self, where, param): |
| |
| if where: |
| self.__OPT_WHERE = " WHERE " + where |
| self.__OPT_PARAM = self.__to_tuple(param) |
| return self |
|
|
| def __to_tuple(self, param): |
| |
| if type(param) != tuple: |
| if type(param) == list: |
| param = tuple(param) |
| else: |
| param = (param,) |
| return param |
|
|
| def order(self, order): |
| |
| if len(order): |
| self.__OPT_ORDER = " ORDER BY " + order |
| return self |
|
|
| def limit(self, limit): |
| |
| if len(limit): |
| self.__OPT_LIMIT = " LIMIT " + limit |
| return self |
|
|
| def field(self, field): |
| |
| if len(field): |
| self.__OPT_FIELD = field |
| return self |
|
|
| def select(self): |
| |
| self.__GetConn() |
| try: |
| self.__get_columns() |
| sql = "SELECT " + self.__OPT_FIELD + " FROM " + self.__DB_TABLE + self.__OPT_WHERE + self.__OPT_ORDER + self.__OPT_LIMIT |
| result = self.__DB_CONN.execute(sql, self.__OPT_PARAM) |
| data = result.fetchall() |
| |
| if self.__OPT_FIELD != "*": |
| fields = self.__format_field(self.__OPT_FIELD.split(',')) |
| tmp = [] |
| for row in data: |
| i = 0 |
| tmp1 = {} |
| for key in fields: |
| tmp1[key.strip('`')] = row[i] |
| i += 1 |
| tmp.append(tmp1) |
| del (tmp1) |
| data = tmp |
| del (tmp) |
| else: |
| |
| tmp = list(map(list, data)) |
| data = tmp |
| del (tmp) |
| self.__close() |
| return data |
| except Exception as ex: |
| return "error: " + str(ex) |
|
|
| def get(self): |
| self.__get_columns() |
| return self.select() |
|
|
| def __format_field(self, field): |
| import re |
| fields = [] |
| for key in field: |
| s_as = re.search(r'\s+as\s+', key, flags=re.IGNORECASE) |
| if s_as: |
| as_tip = s_as.group() |
| key = key.split(as_tip)[1] |
| fields.append(key) |
| return fields |
|
|
| def __get_columns(self): |
| if self.__OPT_FIELD == '*': |
| tmp_cols = self.query('PRAGMA table_info(' + self.__DB_TABLE + ')', ()) |
| cols = [] |
| for col in tmp_cols: |
| if len(col) > 2: cols.append('`' + col[1] + '`') |
| if len(cols) > 0: self.__OPT_FIELD = ','.join(cols) |
|
|
| def getField(self, keyName): |
| |
| try: |
| result = self.field(keyName).select() |
| if len(result) != 0: |
| return result[0][keyName] |
| return result |
| except: |
| return None |
|
|
| def setField(self, keyName, keyValue): |
| |
| return self.save(keyName, (keyValue,)) |
|
|
| def find(self): |
| |
| try: |
| result = self.limit("1").select() |
| if len(result) == 1: |
| return result[0] |
| return result |
| except: |
| return None |
|
|
| def count(self): |
| |
| key = "COUNT(*)" |
| data = self.field(key).select() |
| try: |
| return int(data[0][key]) |
| except: |
| return 0 |
|
|
| def add(self, keys, param): |
| |
| self.write_lock() |
| self.__GetConn() |
| self.__DB_CONN.text_factory = str |
| try: |
| values = "" |
| for key in keys.split(','): |
| values += "?," |
| values = values[0:len(values) - 1] |
| sql = "INSERT INTO " + self.__DB_TABLE + "(" + keys + ") " + "VALUES(" + values + ")" |
| result = self.__DB_CONN.execute(sql, self.__to_tuple(param)) |
| id = result.lastrowid |
| self.__close() |
| self.__DB_CONN.commit() |
| self.rm_lock() |
| return id |
| except Exception as ex: |
| return "error: " + str(ex) |
|
|
| |
| def insert(self, pdata): |
| if not pdata: return False |
| keys, param = self.__format_pdata(pdata) |
| return self.add(keys, param) |
|
|
| |
| def update(self, pdata): |
| if not pdata: return False |
| keys, param = self.__format_pdata(pdata) |
| return self.save(keys, param) |
|
|
| |
| def __format_pdata(self, pdata): |
| keys = pdata.keys() |
| keys_str = ','.join(keys) |
| param = [] |
| for k in keys: param.append(pdata[k]) |
| return keys_str, tuple(param) |
|
|
| def addAll(self, keys, param): |
| |
| self.write_lock() |
| self.__GetConn() |
| self.__DB_CONN.text_factory = str |
| try: |
| values = "" |
| for key in keys.split(','): |
| values += "?," |
| values = values[0:len(values) - 1] |
| sql = "INSERT INTO " + self.__DB_TABLE + "(" + keys + ") " + "VALUES(" + values + ")" |
| result = self.__DB_CONN.execute(sql, self.__to_tuple(param)) |
| self.rm_lock() |
| return True |
| except Exception as ex: |
| return "error: " + str(ex) |
|
|
| def commit(self): |
| self.__close() |
| self.__DB_CONN.commit() |
|
|
| def save(self, keys, param): |
| |
| self.write_lock() |
| self.__GetConn() |
| self.__DB_CONN.text_factory = str |
| try: |
| opt = "" |
| for key in keys.split(','): |
| opt += key + "=?," |
| opt = opt[0:len(opt) - 1] |
| sql = "UPDATE " + self.__DB_TABLE + " SET " + opt + self.__OPT_WHERE |
|
|
| |
| tmp = list(self.__to_tuple(param)) |
| for arg in self.__OPT_PARAM: |
| tmp.append(arg) |
| self.__OPT_PARAM = tuple(tmp) |
| result = self.__DB_CONN.execute(sql, self.__OPT_PARAM) |
| self.__close() |
| self.__DB_CONN.commit() |
| self.rm_lock() |
| return result.rowcount |
| except Exception as ex: |
| return "error: " + str(ex) |
|
|
| def delete(self, id=None): |
| |
| self.write_lock() |
| self.__GetConn() |
| try: |
| if id: |
| self.__OPT_WHERE = " WHERE id=?" |
| self.__OPT_PARAM = (id,) |
| sql = "DELETE FROM " + self.__DB_TABLE + self.__OPT_WHERE |
| result = self.__DB_CONN.execute(sql, self.__OPT_PARAM) |
| self.__close() |
| self.__DB_CONN.commit() |
| self.rm_lock() |
| return result.rowcount |
| except Exception as ex: |
| return "error: " + str(ex) |
|
|
| def execute(self, sql, param=()): |
| |
| self.write_lock() |
| self.__GetConn() |
| try: |
| result = self.__DB_CONN.execute(sql, self.__to_tuple(param)) |
| self.__DB_CONN.commit() |
| self.rm_lock() |
| return result.rowcount |
| except Exception as ex: |
| return "error: " + str(ex) |
|
|
| |
| def is_lock(self): |
| n = 0 |
| while os.path.exists(self.__LOCK): |
| n += 1 |
| if n > 100: |
| self.rm_lock() |
| break |
| time.sleep(0.01) |
|
|
| |
| def write_lock(self): |
| self.is_lock() |
| with open(self.__LOCK, 'wb+') as f: |
| f.close() |
|
|
| |
| def rm_lock(self): |
| if os.path.exists(self.__LOCK): |
| try: |
| os.remove(self.__LOCK) |
| except: |
| pass |
|
|
| def query(self, sql, param=()): |
| |
| self.__GetConn() |
| try: |
| result = self.__DB_CONN.execute(sql, self.__to_tuple(param)) |
| |
| data = list(map(list, result)) |
| return data |
| except Exception as ex: |
| return "error: " + str(ex) |
|
|
| def create(self, name): |
| |
| self.write_lock() |
| self.__GetConn() |
| script = public.readFile('data/' + name + '.sql') |
| result = self.__DB_CONN.executescript(script) |
| self.__DB_CONN.commit() |
| self.rm_lock() |
| return result.rowcount |
|
|
| def fofile(self, filename): |
| |
| self.write_lock() |
| self.__GetConn() |
| script = public.readFile(filename) |
| result = self.__DB_CONN.executescript(script) |
| self.__DB_CONN.commit() |
| self.rm_lock() |
| return result.rowcount |
|
|
| def __close(self): |
| |
| self.__OPT_WHERE = "" |
| self.__OPT_FIELD = "*" |
| self.__OPT_ORDER = "" |
| self.__OPT_LIMIT = "" |
| self.__OPT_PARAM = () |
|
|
| def close(self): |
| |
| try: |
| self.__DB_CONN.close() |
| self.__DB_CONN = None |
| except: |
| pass |
|
|
|
|