Skip to content

Commit a1bb0fb

Browse files
author
App Generator
committed
Update Code
1 parent 57a96e3 commit a1bb0fb

File tree

2 files changed

+388
-0
lines changed

2 files changed

+388
-0
lines changed

util/__init__.py

Lines changed: 239 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,239 @@
1+
# -*- encoding: utf-8 -*-
2+
"""
3+
Copyright (c) 2019 - present AppSeed.us
4+
License: MIT
5+
"""
6+
7+
from util.helpers import *
8+
9+
from peewee import SqliteDatabase, MySQLDatabase, PostgresqlDatabase
10+
from playhouse.reflection import generate_models, print_model, print_table_sql
11+
from playhouse.dataset import DataSet
12+
13+
def test():
14+
print( 'working!' )
15+
16+
class DbWrapper:
17+
18+
# private
19+
_db = None
20+
_ds = None
21+
_models = None
22+
23+
# public data
24+
driver = None
25+
db_name = None
26+
db_user = None
27+
db_pass = None
28+
29+
# reset
30+
def reset(self):
31+
32+
self._db = None
33+
self._ds = None
34+
self._models = None
35+
36+
self.driver = None
37+
self.db_name = None
38+
self.db_user = None
39+
self.db_pass = None
40+
41+
# helpers
42+
def connect(self):
43+
44+
if not self.driver:
45+
print( ' > Error DB driver not set' )
46+
47+
if self.driver == COMMON.DB_SQLITE:
48+
self._db = SqliteDatabase( self.db_name )
49+
self._ds = DataSet( self._db )
50+
return True
51+
elif self.driver == COMMON.DB_MYSQL:
52+
self._db = MySQLDatabase( self.db_name, user=self.db_user, password=self.db_pass )
53+
self._ds = DataSet( self._db )
54+
return True
55+
elif self.driver == COMMON.DB_PGSQL:
56+
self._db = PostgresqlDatabase( self.db_name, user=self.db_user, password=self.db_pass )
57+
self._ds = DataSet( self._db )
58+
return True
59+
else:
60+
print( ' > Error unsupported driver [' + driver + ']' )
61+
return False
62+
63+
def load_models(self):
64+
65+
if not self._db:
66+
print( ' > Error: No DB connection' )
67+
return None
68+
69+
if not self._models:
70+
self._models = generate_models( self._db )
71+
return True
72+
73+
def get_model(self, aModelName):
74+
75+
if not self._db:
76+
print( ' > Error: No DB connection' )
77+
return None
78+
79+
if not self._models:
80+
print( ' > Error: No DB models' )
81+
return None
82+
83+
if not aModelName in self._models:
84+
print( ' > Error Model [' + aModelName + '] not found' )
85+
return None
86+
87+
return self._models[ aModelName ]
88+
89+
def get_model_data(self, aModelName):
90+
91+
aModel = self.get_model( aModelName )
92+
93+
if not aModel:
94+
return None
95+
96+
return self._ds[ aModelName ].all()
97+
98+
def print_all_models(self):
99+
100+
if not self._db:
101+
print( ' > Error: No DB connection' )
102+
return
103+
104+
if not self._models:
105+
print( ' > Error: No DB models' )
106+
return
107+
108+
print( list(self._models.items()) )
109+
110+
def print_db_model(self, aModelName, aSql=False):
111+
112+
if not self._models:
113+
print( ' > Error: No DB models' )
114+
return
115+
116+
if not aModelName in self._models:
117+
print( ' > Error Model [' + aModelName + '] not found' )
118+
return
119+
120+
aModel = self._models[ aModelName ]
121+
122+
if aSql:
123+
print_table_sql( aModel )
124+
else:
125+
print_model(aModel)
126+
127+
return
128+
129+
def sql_select(self, aModelName):
130+
131+
if not self._models:
132+
print( ' > Error: No DB models' )
133+
return
134+
135+
if not aModelName in self._models:
136+
print( ' > Error Model [' + aModelName + '] not found' )
137+
return None
138+
139+
aModel = self._models[ aModelName ]
140+
141+
for item in aModel.select():
142+
print ( item )
143+
144+
def dump_model_data(self, aModelName, aFileName=None):
145+
146+
items = self.get_model_data( aModelName )
147+
148+
if not items:
149+
return None
150+
151+
if len( items ) == 0:
152+
print( ' > Model [' + aModelName + '] is empty ' )
153+
return None
154+
155+
header = items[0].keys()
156+
157+
sqlContent = ''
158+
159+
for col in header:
160+
sqlContent += col + ','
161+
162+
sqlContent += '\n'
163+
164+
for row in items:
165+
166+
for i in row.values():
167+
sqlContent += str( i ) + ','
168+
169+
sqlContent += '\n'
170+
171+
if not aFileName:
172+
aFileName = get_date() + '_' + self.driver + '_' + aModelName
173+
174+
if not aFileName.endswith('.sql'):
175+
aFileName += '.sql'
176+
177+
file_write('output/' + aFileName, sqlContent)
178+
return True
179+
180+
def dump_tables(self, aFileName=None):
181+
182+
sqlContent = ''
183+
184+
if not self._models:
185+
print( ' > Error: No DB models' )
186+
return False
187+
188+
if not aFileName:
189+
aFileName = get_date() + '_' + self.driver
190+
191+
if not aFileName.endswith('.sql'):
192+
aFileName += '.sql'
193+
194+
for table_name in self._models.keys():
195+
196+
# SQLite Engine Metadata
197+
if 'sqlite_sequence' == table_name:
198+
continue
199+
200+
# Unused
201+
aModel = self._models[ table_name ]
202+
203+
# Hack the print
204+
with Capturing() as output:
205+
206+
self.print_db_model( table_name, True)
207+
208+
sqlContent += '\n'
209+
sqlContent += '-- Table: ' + table_name + '\n'
210+
sqlContent += h_list_to_s( output, '\n' )
211+
sqlContent += ';\n'
212+
213+
file_write('output/' + aFileName, sqlContent)
214+
return True
215+
216+
def dump_tables_data(self, aFileName=None):
217+
218+
sqlContent = ''
219+
220+
if not self._models:
221+
print( ' > Error: No DB models' )
222+
return False
223+
224+
if not aFileName:
225+
aFileName = get_date() + '_' + self.driver
226+
227+
if not aFileName.endswith('.sql'):
228+
aFileName += '.sql'
229+
230+
for table_name in self._models.keys():
231+
232+
# SQLite Engine Metadata
233+
if 'sqlite_sequence' == table_name:
234+
continue
235+
236+
print( ' > Dump data for [' + table_name + ']' )
237+
self.dump_model_data( table_name )
238+
239+
return True

util/helpers.py

Lines changed: 149 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,149 @@
1+
# -*- encoding: utf-8 -*-
2+
"""
3+
Copyright (c) 2019 - present AppSeed.us
4+
License: MIT
5+
"""
6+
7+
from lib2to3.pgen2 import driver
8+
import os, csv, fnmatch, time, shutil
9+
10+
from io import StringIO
11+
import sys
12+
13+
'''
14+
This file should contain primitives used in other modules
15+
'''
16+
17+
class COMMON:
18+
DB_SQLITE = 'SQLITE'
19+
DB_MYSQL = 'MYSQL'
20+
DB_PGSQL = 'PGSQL'
21+
22+
def h_list_to_s( aList, aSeparator=',' ):
23+
if isinstance(aList, list):
24+
return aSeparator.join([str(elem) for elem in aList])
25+
else:
26+
return aList
27+
28+
def file_exists( aPath ):
29+
30+
try:
31+
32+
if open( aPath, 'r'):
33+
return True
34+
35+
except:
36+
return False
37+
38+
def file_p( aPath ):
39+
40+
try:
41+
42+
f = open( aPath, 'r')
43+
44+
if f:
45+
return f
46+
47+
return None
48+
except:
49+
return None
50+
51+
def file_read( aPath, as_list=False ):
52+
53+
try:
54+
55+
if not file_exists( aPath ):
56+
return None
57+
58+
f = open( aPath, 'r')
59+
if f:
60+
61+
if as_list:
62+
content = f.readlines()
63+
else:
64+
content = f.read()
65+
66+
f.close()
67+
return content
68+
69+
except UnicodeDecodeError as err:
70+
71+
return None
72+
73+
except:
74+
return None
75+
76+
def file_rm ( aPath ):
77+
if file_exists( aPath ):
78+
os.remove( aPath )
79+
80+
def file_cp ( aSrc, aDest ):
81+
if file_exists( aSrc ):
82+
shutil.copyfile(aSrc, aDest)
83+
84+
def file_write( aPath, aContent, isAppend=False ):
85+
86+
try:
87+
88+
f = None
89+
90+
if file_exists( aPath ):
91+
if isAppend:
92+
f = open( aPath, 'a+')
93+
else:
94+
f = open( aPath, 'w+')
95+
else:
96+
f = open( aPath, 'w+')
97+
98+
if not f:
99+
return False
100+
101+
f.seek(0)
102+
f.write( aContent )
103+
f.truncate()
104+
f.close()
105+
106+
return True
107+
108+
except IOError:
109+
return False
110+
111+
except:
112+
return False
113+
114+
def list_files(dir_to_scan, ext='html'):
115+
116+
matches = []
117+
118+
for root, dirnames, filenames in os.walk( dir_to_scan ):
119+
for filename in fnmatch.filter(filenames, '*.'+ ext):
120+
121+
item = os.path.join(root, filename)
122+
123+
#print ' **** type(item) = ' + str( type ( item ) )
124+
matches.append( item )
125+
126+
return matches
127+
128+
def list_sqlite( aPath ):
129+
130+
return list_files( aPath, 'sqlite3' )
131+
132+
def get_tail( aPath ):
133+
head, tail = os.path.split( aPath )
134+
return tail
135+
136+
def get_date(aFormat='%H_%M_%S'):
137+
return time.strftime( aFormat, time.gmtime())
138+
139+
# Credits:
140+
# https://stackoverflow.com/questions/16571150/how-to-capture-stdout-output-from-a-python-function-call
141+
class Capturing(list):
142+
def __enter__(self):
143+
self._stdout = sys.stdout
144+
sys.stdout = self._stringio = StringIO()
145+
return self
146+
def __exit__(self, *args):
147+
self.extend(self._stringio.getvalue().splitlines())
148+
del self._stringio # free up some memory
149+
sys.stdout = self._stdout

0 commit comments

Comments
 (0)