123
[meabook] / database / db.py
1 #!/usr/bin/python -tt
2 # -*- coding: utf-8 -*-
3 # vim: sw=4 ts=4 expandtab ai
4
5 """Module for work with database"""
6
7 import os
8 import sqlite3
9 import pygtk
10 pygtk.require('2.0')
11 import gtk
12
13 class DbSqlite:
14
15     """class for work with database"""
16
17     def __init__(self):
18         self.conn = self.connect()
19
20     def connect(self):
21
22         """connect to database"""
23         dbname = "meabookdb_oblgas"
24         if os.access(dbname, os.F_OK|os.R_OK|os.W_OK):
25             conn = sqlite3.connect(dbname)
26         else:
27             print "access to database file error"
28             conn = None
29         return conn
30
31     def get_record(self,  id):
32         
33         """return record field"""
34         cur = self.conn.cursor()
35         cur.execute("select field.name, data.value "
36                     "from data left join field "
37                     "on data.id_field=field.id "
38                     "where data.id=?", (id,))
39         self.data = {} 
40         for row in cur:
41             print "key = %s value = %s" % (row[0], row[1])
42             self.data[row[0]] = row[1]
43         return self.data
44
45     def get_allrecords(self, field, struct):
46         
47         """return records"""
48         cur = self.conn.cursor()
49         cur.execute("select data.id, data.value "
50                     "from data left join field "
51                     "on data.id_field=field.id "
52                     "left join relation on data.id=relation.id_data "
53                     "where field.name=? and relation.id_struct=?", (field, struct))
54         self.data = {}
55         for row in cur:
56             #print row
57             self.data[row[0]] = row[1]
58         return self.data
59
60     def get_id(self, table, value):
61         
62         """get id for value into table"""
63         if self.conn is None:
64             return None
65         cur = self.conn.cursor()
66         query = "select id from %s where name='%s'" % (table, value)
67         cur.execute(query)
68         res = cur.fetchone()
69         id = 0
70         if res is None:
71             query = "insert into %s (name) values ('%s')" % (table, value)
72             cur.execute(query)
73             id = cur.lastrowid
74         else:
75             id = res[0]
76         return id
77     
78     def get_parent(self, id):
79         
80         if self.conn is None:
81             return None
82         cur = self.conn.cursor()
83         cur.execute("select parent from struct where id=?", (id,))
84         res = cur.fetchone()
85         id = 0
86         if res != None:
87             id = res[0]
88         return id
89     
90     def get_name_struct(self, id):
91         
92         if self.conn is None:
93             return None
94         cur = self.conn.cursor()
95         cur.execute("select name from struct where id=?", (id,))
96         res = cur.fetchone()
97         name = "All"
98         if res != None:
99             name = res[0]
100         return name
101
102     def get_id_struct(self, value, parent):
103         
104         """get id for value into struct"""
105         if self.conn is None:
106             return None
107         cur = self.conn.cursor()
108         cur.execute("select id from struct where name=? and parent=?", (value, parent))
109         res = cur.fetchone()
110         id = 0
111         if res is None:
112             cur.execute("insert into struct (name, parent) values (?, ?)", (value, parent))
113             id = cur.lastrowid
114         else:
115             id = res[0]
116         return id
117
118     def ins_record(self, rec):
119
120         """insert record into database"""
121         #get id new record
122         #conn = self.connect()
123         if self.conn is None:
124             print "database connect error"
125             return None
126         cur = self.conn.cursor()
127         cur.execute("select max(id) from data")
128         id_record = cur.fetchone()[0]
129         if id_record is None:
130             id_record = 1
131         else:
132             id_record = id_record + 1
133         print "id_record=%s" % (id_record,)
134         
135         struct = ["", ""]
136         for key, val in rec.items():
137             if val == None:
138                 continue
139             id_field = self.get_id("field", key)
140             if key == 'company':
141                 struct[0] = val
142             if key == 'department':
143                 struct[1] = val
144             #for i in val:
145             cur.execute("insert into data (id, id_field, value) values (?, ?, ?)", 
146                 (id_record, id_field, val))
147         #insert comppane into table struct
148         id0 = self.get_id("struct", struct[0])
149         cur.execute("update struct set parent=0 where id=?", (id0,))
150         
151         id1 = self.get_id_struct(struct[1], id0)
152         #cur.execute("update struct set parent=? where id=?", (id0, id1))
153         cur.execute("insert into relation (id_data, id_struct) values (?, ?)", (id_record, id1))
154         self.conn.commit()
155         #conn.close()
156
157     def clear_data(self):
158
159         """clear all record from table data"""
160         conn = self.connect()
161         if conn is None:
162             print "database connect error"
163             return None
164         cur = conn.cursor()
165         cur.execute("delete from data")
166         cur.execute("delete from field")
167         cur.execute("delete from struct")
168         cur.execute("delete from relation")
169         conn.commit()
170         conn.close()
171
172     def make_tree(self):
173
174         """create TreeStore from database table Struct"""
175         ts = gtk.TreeStore(int, str)
176         
177         conn = self.connect()
178         if conn is None:
179             return None
180         cur = conn.cursor()
181         cur.execute("select id, name, parent from struct")
182         item = {}
183         for row in cur:
184             if (row[2] == 0):
185                 item[row[0]] = ts.append(None, [row[0], row[1]]) 
186             else :
187                 ts.append(item[row[2]], [row[0], row[1]])
188         return ts
189
190     def get_list(self, parent):
191         
192         """return list of struct with same parent"""
193         conn = self.connect()
194         if conn is None:
195             return None
196         cur = conn.cursor()
197         cur.execute("select id, name from struct where parent=?", (parent,))
198         data = {}
199         for row in cur:
200             data[row[0]] = row[1]
201         
202         return data    
203