Skip to content

Commit cbf3484

Browse files
committed
refactor code and show metadata of each table
1 parent 540faa0 commit cbf3484

File tree

5 files changed

+108
-25
lines changed

5 files changed

+108
-25
lines changed

app.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,11 @@ def read_conf_file(fp):
1818
"""
1919
Read configuration from file
2020
"""
21-
with open(fp) as f:
22-
return f.readlines()
21+
try:
22+
with open(fp) as f:
23+
return f.readlines()
24+
except IOError as e:
25+
return []
2326

2427

2528
def write_conf_file(fp, content):
@@ -48,7 +51,7 @@ def on_forward_main(self, evt):
4851
selected_file = evt.selected_file
4952
main_frame = MainFrame(self, selected_file)
5053
main_frame.Show()
51-
main_frame.Maximize()
54+
# main_frame.Maximize()
5255

5356
def write_file_history(self, fh):
5457
fp = os.path.join(self.app_config_dir, 'fh')

db.py

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
import sqlite3
2+
3+
4+
class TableMeta:
5+
6+
def __init__(self, idx, column_name, column_type, is_null, default_value, is_pk):
7+
self.idx = idx + 1
8+
self.column_name = column_name
9+
self.column_type = column_type
10+
self.is_null = is_null
11+
self.allow_null = is_null == 1 and 'Y' or 'N'
12+
self.default_value = default_value
13+
self.is_pk = is_pk
14+
self.pk_field = is_pk == 1 and 'Y' or 'N'
15+
16+
17+
class DBUtils:
18+
def __init__(self, db_file):
19+
self.db_file = db_file
20+
21+
def get_object_type(self):
22+
result = []
23+
with sqlite3.connect(self.db_file) as conn:
24+
c = conn.cursor()
25+
for row in c.execute("select type from sqlite_master group by type"):
26+
result.append(row[0].capitalize())
27+
return result
28+
29+
def get_object_list(self, object_type):
30+
object_list = []
31+
with sqlite3.connect(self.db_file) as conn:
32+
c = conn.cursor()
33+
for _row in c.execute("select * from sqlite_master where type = ?", (object_type,)):
34+
object_list.append(_row[1])
35+
return object_list
36+
37+
def get_meta_of_table(self, table_name):
38+
meta_data = []
39+
with sqlite3.connect(self.db_file) as conn:
40+
cur = conn.cursor()
41+
for row in cur.execute("PRAGMA table_info(%s)" % table_name):
42+
print(row)
43+
meta_data.append(TableMeta(row[0], row[1], row[2], row[3], row[4], row[5]))
44+
return meta_data

events.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
import wx.lib.newevent
22

33
ForwardMainEvent, EVT_FORWARD_MAIN_EVENT = wx.lib.newevent.NewEvent()
4+
CreateTabEvent, EVT_CREATE_MAIN_EVENT = wx.lib.newevent.NewEvent()

main.py

Lines changed: 57 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -2,18 +2,47 @@
22
"""
33
Main frame
44
"""
5+
56
import wx
6-
import sqlite3
77
from wx import aui
88

9+
from db import DBUtils
10+
from events import EVT_CREATE_MAIN_EVENT, CreateTabEvent
911
from sql_editor import SQLEditor
1012

1113

14+
class TableMetaPanel(wx.Panel):
15+
def __init__(self, parent, data_list):
16+
wx.Panel.__init__(self, parent=parent)
17+
18+
meta_data_list_ctrl = wx.ListCtrl(self, style=wx.LC_REPORT)
19+
meta_data_list_ctrl.InsertColumn(0, "")
20+
meta_data_list_ctrl.InsertColumn(1, "PK")
21+
meta_data_list_ctrl.InsertColumn(2, "Name")
22+
meta_data_list_ctrl.InsertColumn(3, "Type")
23+
meta_data_list_ctrl.InsertColumn(4, "Null?")
24+
meta_data_list_ctrl.InsertColumn(5, "Default Value")
25+
26+
for item in data_list:
27+
meta_data_list_ctrl.Append(
28+
(item.idx, item.pk_field, item.column_name, item.column_type, item.allow_null, item.default_value))
29+
meta_data_list_ctrl.SetColumnWidth(0, 20)
30+
meta_data_list_ctrl.SetColumnWidth(1, 40)
31+
meta_data_list_ctrl.SetColumnWidth(2, 150)
32+
meta_data_list_ctrl.SetColumnWidth(5, 150)
33+
root_sizer = wx.BoxSizer(wx.VERTICAL)
34+
root_sizer.Add(meta_data_list_ctrl, 1, wx.EXPAND)
35+
36+
self.SetSizer(root_sizer)
37+
38+
1239
class SideBar(wx.Panel):
1340
def __init__(self, parent, db_fp):
1441
super(SideBar, self).__init__(
1542
parent, style=wx.TAB_TRAVERSAL | wx.CLIP_CHILDREN)
1643
self.db_fp = db_fp
44+
self.db_utils = DBUtils(self.db_fp)
45+
self.parent = parent
1746

1847
self.tree = wx.TreeCtrl(self, -1, wx.Point(0, 0), wx.Size(160, 250),
1948
wx.TR_DEFAULT_STYLE | wx.NO_BORDER)
@@ -28,7 +57,8 @@ def __init__(self, parent, db_fp):
2857
self.tree.Bind(wx.EVT_TREE_ITEM_ACTIVATED, self.on_node_activated)
2958

3059
root = self.tree.AddRoot(self.db_fp, 0)
31-
self.tree.AppendItem(root, u'Tables', 0, data='TABLES')
60+
for item in self.db_utils.get_object_type():
61+
self.tree.AppendItem(root, item, 0, data=item.upper())
3262
self.tree.Expand(root)
3363

3464
main_sizer = wx.BoxSizer(wx.VERTICAL)
@@ -37,16 +67,15 @@ def __init__(self, parent, db_fp):
3767

3868
def on_node_activated(self, evt):
3969
selected_item_data = self.tree.GetItemData(evt.GetItem())
40-
if 'TABLES' == selected_item_data:
41-
with sqlite3.connect(self.db_fp) as conn:
42-
for row in conn.execute(
43-
"select name from sqlite_master where type = 'table'"):
44-
self.tree.AppendItem(
45-
evt.GetItem(), row[0], 1, data='TABLE')
46-
self.tree.Expand(evt.GetItem())
47-
elif 'TABLE' == selected_item_data:
70+
if selected_item_data in ['TABLE', 'INDEX', 'TRIGGER', 'VIEW']:
71+
for name in self.db_utils.get_object_list(selected_item_data.lower()):
72+
self.tree.AppendItem(evt.GetItem(), name, 1, data='EACH-%s' % selected_item_data)
73+
self.tree.Expand(evt.GetItem())
74+
elif 'EACH-TABLE' == selected_item_data:
4875
selected_item_text = self.tree.GetItemText(evt.GetItem())
49-
# open tab page
76+
table_metadata = self.db_utils.get_meta_of_table(selected_item_text)
77+
wx.PostEvent(self.parent, CreateTabEvent(table_metadata=table_metadata,
78+
tab_name="Table %s" % selected_item_text))
5079

5180

5281
class MainFrame(wx.Frame):
@@ -65,13 +94,9 @@ def __init__(self, app, db_fp):
6594

6695
self.main_panel = wx.Panel(self)
6796
self.left = SideBar(self.main_panel, self.db_fp)
68-
self.right = aui.AuiNotebook(
69-
self.main_panel, -1, style=wx.CLIP_CHILDREN)
97+
self.right = aui.AuiNotebook(self.main_panel, -1, style=wx.CLIP_CHILDREN)
7098
self.right.AddPage(SQLEditor(self.right, self), "Welcome")
71-
self.logger = wx.TextCtrl(
72-
self.main_panel,
73-
-1,
74-
style=wx.TE_MULTILINE | wx.TE_READONLY | wx.HSCROLL)
99+
self.logger = wx.TextCtrl(self.main_panel, style=wx.TE_MULTILINE | wx.TE_READONLY | wx.HSCROLL)
75100

76101
self.mgr = aui.AuiManager()
77102
self.mgr.SetManagedWindow(self.main_panel)
@@ -80,18 +105,29 @@ def __init__(self, app, db_fp):
80105
self.mgr.AddPane(self.left,
81106
aui.AuiPaneInfo().Left().Layer(2).BestSize(
82107
(240, -1)).MinSize((240, -1)).Floatable(
83-
self.allowAuiFloating).FloatingSize(
84-
(240, 700)).Caption("DB")
108+
self.allowAuiFloating).FloatingSize(
109+
(240, 700)).Caption("DB")
85110
.CloseButton(False).Name("Tree"))
86111
self.mgr.AddPane(self.logger,
87112
aui.AuiPaneInfo().Bottom().BestSize(
88113
(-1, 150)).MinSize((-1, 140)).Floatable(
89-
self.allowAuiFloating).FloatingSize(
90-
(500, 160)).Caption("Log Messages")
114+
self.allowAuiFloating).FloatingSize(
115+
(500, 160)).Caption("Log Messages")
91116
.CloseButton(False).Name("LogWindow"))
92117
self.Center(wx.BOTH)
93118
self.mgr.Update()
94119
self.Bind(wx.EVT_CLOSE, self.on_exit)
120+
self.main_panel.Bind(EVT_CREATE_MAIN_EVENT, self.on_create_new_tab)
121+
122+
def on_create_new_tab(self, evt):
123+
has_created = False
124+
for i in xrange(0, self.right.GetPageCount()):
125+
if self.right.GetPageText(i) == evt.tab_name:
126+
self.right.ChangeSelection(i)
127+
has_created = True
128+
break
129+
if not has_created:
130+
self.right.AddPage(TableMetaPanel(self.right, evt.table_metadata), caption=evt.tab_name, select=True)
95131

96132
def create_menu_bar(self):
97133
fileMenu = wx.Menu()

requirements.txt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,2 @@
11
wxPython
22
pyinstaller
3-
yapf

0 commit comments

Comments
 (0)