174 lines
4.9 KiB
Python
174 lines
4.9 KiB
Python
#!/usr/bin/env python
|
|
# coding: utf-8
|
|
|
|
#===================================================
|
|
from config import Log
|
|
#---------------------------------------------------
|
|
import sqlite3
|
|
import threading
|
|
import traceback
|
|
#===================================================
|
|
|
|
|
|
def _dict_factory(cursor, row):
|
|
aDict = {}
|
|
for iField, field in enumerate (cursor.description):
|
|
aDict [field [0]] = row [iField]
|
|
return aDict
|
|
|
|
|
|
class SqliteDB(object):
|
|
|
|
def __init__(self, db_file):
|
|
self.db_file = db_file
|
|
self.conn = sqlite3.connect(db_file, check_same_thread=False)
|
|
# use 8-bit strings instead of unicode string
|
|
self.conn.text_factory = str
|
|
# not return a tuple but a dict with column name as key
|
|
self.conn.row_factory = _dict_factory
|
|
# for thread-save
|
|
self.lock = threading.Lock()
|
|
|
|
def create_table(self, table, cols):
|
|
"""
|
|
@brief Creates a table in database
|
|
@param table String
|
|
@param cols String, the cols in table
|
|
"""
|
|
sql = "CREATE TABLE if not exists %s (%s);" % (table, cols)
|
|
Log.debug('DB -> %s' % sql)
|
|
self.execute(sql)
|
|
|
|
def delete_table(self, table):
|
|
"""
|
|
@brief Delete a table in database
|
|
@param table String
|
|
"""
|
|
sql = "DROP TABLE if exists %s;" % table
|
|
Log.debug('DB -> %s' % sql)
|
|
self.execute(sql)
|
|
|
|
def insert(self, table, value):
|
|
"""
|
|
@brief Insert a row in table
|
|
@param table String
|
|
@param value Tuple
|
|
"""
|
|
sql = ("INSERT INTO %s VALUES (" + ",".join(['?'] * len(value)) + ");") % table
|
|
Log.debug('DB -> %s' % sql)
|
|
self.execute(sql, value)
|
|
|
|
def insertmany(self, table, values):
|
|
"""
|
|
@brief Insert many rows in table
|
|
@param table String
|
|
@param values Array of tuple
|
|
"""
|
|
c = self.conn.cursor()
|
|
self.lock.acquire()
|
|
n = len(values[0])
|
|
sql = ("INSERT INTO %s VALUES (" + ",".join(['?'] * n) + ");") % table
|
|
Log.debug('DB -> %s' % sql)
|
|
|
|
try:
|
|
c.executemany(sql, values)
|
|
except Exception, e:
|
|
Log.error(traceback.format_exc())
|
|
finally:
|
|
self.lock.release()
|
|
|
|
self.conn.commit()
|
|
|
|
def select(self, table, field='', condition=''):
|
|
"""
|
|
@brief select all result from table
|
|
@param table String
|
|
@param field String
|
|
@param condition String
|
|
@return result Tuple
|
|
"""
|
|
result = []
|
|
if field and condition:
|
|
cond = (condition,)
|
|
sql = "SELECT * FROM %s WHERE %s=?" % (table, field)
|
|
Log.debug('DB -> %s' % sql)
|
|
result = self.execute(sql, cond)
|
|
else:
|
|
sql = "SELECT * FROM %s" % table
|
|
Log.debug('DB -> %s' % sql)
|
|
result = self.execute(sql)
|
|
return result
|
|
|
|
def update(self, table, dic, condition=''):
|
|
k_arr = []
|
|
v_arr = []
|
|
for (k, v) in dic.items():
|
|
k_arr.append('%s=?' % k)
|
|
v_arr.append(v)
|
|
|
|
sql = "UPDATE %s SET %s" % (table, ','.join(k_arr))
|
|
if condition:
|
|
sql += " WHERE %s" % condition
|
|
|
|
Log.debug('DB -> %s' % sql)
|
|
self.execute(sql, tuple(v_arr))
|
|
|
|
def get_table_column_name(self, table):
|
|
"""
|
|
@brief select all result from table
|
|
@param table String
|
|
@return result Array
|
|
"""
|
|
c = self.conn.cursor()
|
|
c.execute("SELECT * FROM %s" % table)
|
|
names = list(map(lambda x: x[0], c.description))
|
|
return names
|
|
|
|
def execute(self, sql, value=None):
|
|
"""
|
|
@brief execute sql commands, return result if it has
|
|
@param sql String
|
|
@param value Tuple
|
|
@return result Array
|
|
"""
|
|
c = self.conn.cursor()
|
|
self.lock.acquire()
|
|
hasReturn = sql.lstrip().upper().startswith("SELECT")
|
|
|
|
try:
|
|
if value:
|
|
c.execute(sql, value)
|
|
else:
|
|
c.execute(sql)
|
|
|
|
if hasReturn:
|
|
result = c.fetchall()
|
|
except Exception, e:
|
|
Log.error(traceback.format_exc())
|
|
finally:
|
|
self.lock.release()
|
|
|
|
self.conn.commit()
|
|
|
|
if hasReturn:
|
|
return result
|
|
|
|
def delete(self, table, field='', condition=''):
|
|
"""
|
|
@brief execute sql commands, return result if it has
|
|
@param table String
|
|
@param field String
|
|
@param condition String
|
|
"""
|
|
sql = "DELETE FROM %s WHERE %s=?" % (table, field)
|
|
Log.debug('DB -> %s' % sql)
|
|
cond = (condition,)
|
|
self.execute(sql, cond)
|
|
|
|
def close(self):
|
|
"""
|
|
@brief close connection to database
|
|
"""
|
|
Log.debug('DB -> close')
|
|
self.conn.close()
|