/
android_database_generator.py
163 lines (142 loc) · 4.67 KB
/
android_database_generator.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
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
import os.path
import shutil
import sqlite3
import re
from build import Build
class AndroidDatabaseGenerator:
def __init__(self):
self.pkg_name = ""
# call remove gen folder when starting generator module
# remove_gen_folder()
# create new gen folder
create_generate_dir("gen")
create_generate_dir("gen/database")
create_generate_dir("gen/domain")
def set_pkg(self, name):
self.pkg_name = name
def get_pkg(self):
return self.pkg_name
def generate(self):
print("Start generate file..")
build = Build()
# open
core_tpl = open("template/DatabaseCore.java.tpl")
core_new = []
for line in core_tpl:
# set package name
line = line.replace("CONFIG_PKG_NAME", build.get_pkg_name())
# set db name
line = line.replace("CONFIG_DB_NAME", build.get_db_name())
core_new.append(line)
# close file
core_tpl.close()
# w+ is create new file, if file not exist
core = open("gen/database/DatabaseCore.java", "w+")
for line in core_new:
core.write(line)
core.close()
print("End generate new file..")
print("Prepare to generate database helper file..")
db = SQLiteDatabase()
cur_tbl = db.connect(build.get_db_name())
cur_tbl.execute(db.get_database_structure_sql())
for row in cur_tbl:
# genereate core file
if row[0] != "sqlite_sequence" and row[0] != "android_metadata":
cur_col = db.connect(build.get_db_name())
cur_col.execute(db.get_table_schema_sql(row[0]))
sql = cur_col.fetchone()
p = re.compile(r'"(.*?)"')
# find value in quote by regex
m = p.findall(sql[0])
# create class name
cls_name = row[0].replace("_", " ")
cls_name = cls_name.title()
cls_name = cls_name.replace(" ", "")
# create domain file
domain = open("gen/domain/"+cls_name+".java", "w+")
domain.write("package " + build.get_pkg_name() + ".domain")
domain.write("\n")
domain.write("\n")
domain.write("public class "+cls_name+" {")
domain.write("\n")
domain.write("\n")
# loop for creating column variable
for tbl in m:
if tbl != row[0]:
domain.write("public static final String " + tbl.upper() + " = \" " + tbl + " \";\n")
# clean sql to normal form
col_datatype = sql[0].replace("CREATE TABLE", "")
col_datatype = col_datatype.replace("PRIMARY KEY", "")
col_datatype = col_datatype.replace("AUTOINCREMENT", "")
col_datatype = col_datatype.replace("NOT NULL", "")
col_datatype = col_datatype.replace("UNIQUE", "")
col_datatype = col_datatype.replace(row[0], "")
col_datatype = col_datatype.replace("(", "")
col_datatype = col_datatype.replace(")", "")
col_datatype = col_datatype.replace("\"", "")
col_datatype = col_datatype.replace(" ", "")
col_datatype_list = col_datatype.split(",")
domain.write("\n")
variable = ""
get_str = ""
set_str = ""
index = 1
for datatype in col_datatype_list:
variable += "private "
get_str += "public "
set_str += "public "
# clean datatype
datatype = datatype.replace(m[index], "")
# variable
variable += get_datatype_str(datatype) + " "
variable += m[index]+";\n"
method_name = m[index]
if method_name[0] != "_":
method_name = m[index].replace("_", " ")
method_name = method_name.title()
method_name = method_name.replace(" ", "")
# get
get_str += get_datatype_str(datatype) + " " + "get"
get_str += method_name + " { return this."
get_str += m[index] + "; } \n"
# set
set_str += "void set" + method_name + "(" + get_datatype_str(datatype) + " "
set_str += m[index] + "){ this." + m[index] + " = " + m[index] + "; }\n"
index = index + 1
domain.write(variable)
domain.write("\n")
domain.write(get_str)
domain.write("\n")
domain.write(set_str)
domain.write("\n")
domain.write("}")
db.close()
def get_datatype_str(datatype):
result = ""
if datatype.lower() == "integer":
result = "int"
if datatype.lower() == "varchar":
result = "String"
if datatype.lower() == "double":
result = "double"
return result
def create_generate_dir(dir_name):
if not os.path.exists(dir_name):
# create gen folder
os.makedirs(dir_name)
def remove_gen_folder():
if os.path.exists("gen"):
# remove gen folder
shutil.rmtree("gen")
class SQLiteDatabase:
def connect(self, db_name):
self.conn = sqlite3.connect(db_name+".sqlite")
# return cursor for traveling in database
return self.conn.cursor()
def get_database_structure_sql(self):
return "select name from sqlite_master where type = 'table'"
def get_table_schema_sql(self, table_name):
return "select sql from sqlite_master where type = 'table' and name = '"+table_name+"' "
def close(self):
self.conn.close()