-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathsql.py
142 lines (129 loc) · 3.36 KB
/
sql.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
#!/usr/bin/python
import os
import sys
import re
import importlib
import inspect
class Table:
def __init__(self, name, fields, keys=None, indexes=None):
self.name = name
self.fields = fields
self.keys = keys
self.indexes = indexes
@classmethod
def stringify(cls, val):
if isinstance(val, str):
return '\'' + val.replace('\'', '\'\'') + '\''
else:
return str(val)
def create_table(self):
query = 'CREATE TABLE ' + self.name + ' ('
delim = ''
for (name, type, attr) in self.fields:
query += delim + name + ' ' + type + ' ' + attr
delim = ', '
if self.keys:
query += ', PRIMARY KEY ('
delim = ''
for key in self.keys:
query += delim + key
delim = ', '
query += ')'
query += ')'
return query
def create_indexes(self):
if not self.indexes:
return []
queries = []
for idx in self.indexes:
idx_name = self.name
for idx_field in idx:
idx_name += '_' + idx_field
idx_name += '_idx'
query = 'CREATE INDEX ' + idx_name + ' ON ' + self.name + '('
delim = ''
for idx_field in idx:
query += delim + idx_field
delim = ', '
query += ')'
queries.append(query)
return queries
def insert_record(self, values):
query = 'INSERT INTO ' + self.name + ' ('
value_str = ''
delim = ''
for (field, type, attr) in self.fields:
if field not in values or values[field] is None:
continue
query += delim + field
value_str += delim + Table.stringify(values[field])
delim = ', '
query += ') VALUES (' + value_str + ')'
return query
def select_record(self, condition, fields=None):
query = 'SELECT '
if fields:
query += '('
delim = ''
for field in fields:
query += delim + field
delim = ', '
query += ')'
else:
query += '*'
query += ' FROM ' + self.name
if condition:
query += ' WHERE ' + condition
return query
def delete_record(self, condition=None):
query = 'DELETE FROM ' + self.name
if condition:
query += ' WHERE ' + condition
return query
def update_record(self, values, condition=None):
query = 'UPDATE ' + self.name + ' SET '
delim = ''
has_values = False
for (field, type, attr) in self.fields:
if field in values:
has_values = True
query += delim + field + '=' + Table.stringify(values[field])
delim = ', '
if not has_values:
raise Exception('syntax error: update ' + self.name)
if condition:
query += ' WHERE ' + condition
return query
tables = dict()
class SQL:
def __init__(self):
return
# Have to implement following methods
# def __del__(self):
# def connect(self):
# def disconnect(self):
# def commit(self):
# def connect_table(self, table):
# def append_record(self, table, values):
# def search_record(self, table, condition=None, fields=None):
# def delete_record(self, table, condition=None):
# def update_record(self, table, values, condition=None):
# def hash_text(self, text)
@classmethod
def get_engine(cls, name):
names = name.split('.')
obj = importlib.import_module(names[0])
for n in names[1:]:
next = None
for (key, val) in inspect.getmembers(obj):
if n == key:
next = val
break
if not next:
raise Exception('Object ' + name + ' is not found')
obj = next
if not inspect.isclass(obj):
raise Exception('Object ' + name + ' is not a class')
if not issubclass(obj, SQL):
raise Exception('Object ' + name + ' is not a subclass of SQL')
return obj()