bde55b33b507a8c1fe11903662b81c468811f2fa
[multilist] / src / multilistclasses / libspeichern.py
1 #!/usr/bin/env python
2 # -*- coding: utf-8 -*-
3
4 import time
5 import sqlite3
6 import shelve
7 import sys
8 import string
9 import shutil
10 import os
11 import logging
12
13 class Speichern():
14         def speichereDirekt(self,schluessel,daten):
15                 self.d[schluessel]=daten
16                 logging.info("speichereDirekt "+str(schluessel)+" "+str(daten)+" lesen: "+str(self.d[schluessel]))
17
18         
19         def ladeDirekt(self,schluessel,default=""):
20                 #print "ladeDirekt",schluessel, "Schluessel vorhanden",self.d.has_key(schluessel)
21                 if (self.d.has_key(schluessel)==True):
22                         data=self.d[schluessel]
23                         #print data
24                         return data
25                 else:
26                         return default
27                                 
28                                 
29         def speichereSQL(self,sql,tupel=None,commit=True,host="self",log=True,pcdatum=None,rowid=""):
30                 #print "speichereSQL:",sql,tupel
31                 try:
32                         programSQLError=True
33                         if (tupel==None):
34                                 self.cur.execute(sql)
35                         else:
36                                 self.cur.execute(sql,tupel)
37                         programSQLError=False   
38                         
39                         #print int(time.time()), sql, pickle.dumps(tupel), host
40                         if (log==True):
41                                 strtupel=[]
42                                 if (tupel!=None):
43                                         for t in tupel:
44                                                 strtupel.append(str(t))
45
46
47                                 if pcdatum==None: pcdatum=int(time.time())
48                                 self.cur.execute("INSERT INTO logtable ( pcdatum,sql,param,host,rowid ) VALUES (?,?,?,?,?)",(pcdatum, sql, string.join(strtupel," <<Tren-ner>> "), host,str(rowid) ))
49                         if (commit==True): self.conn.commit()
50                         
51                         return True
52                 except:
53                         s=str(sys.exc_info())
54                         if (s.find(" already exists")==-1):
55                         #if len(s)>0:
56                                 if (programSQLError==True):
57                                         logging.error("speichereSQL-Exception "+str(sys.exc_info())+" "+str(sql)+" "+str(tupel))
58                                 else:
59                                         logging.error("speichereSQL-Exception in Logging!!!! :"+str(sys.exc_info())+" "+str(sql)+" "+str(tupel))
60                         return False
61
62         def commitSQL(self):
63                 self.conn.commit()
64                 
65                 
66         def ladeSQL(self,sql,tupel=None):
67                 #print sql,tupel
68                 try:
69                         if (tupel==None):
70                                 self.cur.execute(sql)
71                         else:
72                                 self.cur.execute(sql,tupel)
73                         return self.cur.fetchall()
74                 except:
75                         logging.error("ladeSQL-Exception "+str(sys.exc_info())+" "+str(sql)+" "+str(tupel))
76                         return ()
77                 
78         def ladeHistory(self,sql_condition,param_condition):
79                 sql="SELECT * FROM logtable WHERE sql LIKE '%"+str(sql_condition)+"%' AND param LIKE '%"+str(param_condition)+"%'"
80                 rows=self.ladeSQL(sql)
81                 #print rows 
82                 i=0
83                 erg=[]
84                 while i<len(rows):
85                         datum=time.strftime("%d.%m.%y %H:%M:%S", (time.localtime(rows[i][1])))
86                         erg.append([rows[i][1],datum,rows[i][2],rows[i][3],rows[i][3].split(" <<Tren-ner>> ")])
87                                         #pcdatum #datum #sql # Param_org #param 
88                         
89                         i+=1
90                         
91                 return erg
92                 
93         def delHistory(self,sql_condition,param_condition,exceptTheLastXSeconds=0):
94                 pcdatum=int(time.time())-exceptTheLastXSeconds
95                 sql="DELETE FROM logtable WHERE sql LIKE '%"+str(sql_condition)+"%' AND param LIKE '%"+str(param_condition)+"%' AND pcdatum<?"
96                 self.speichereSQL(sql,(pcdatum,))
97                 
98         def delHistoryWithRowID(self,rowid,sql_condition=" ",exceptTheLastXSeconds=0):
99                 pcdatum=int(time.time())-exceptTheLastXSeconds
100                 sql="DELETE FROM logtable WHERE rowid=? AND pcdatum<? AND sql LIKE '%"+str(sql_condition)+"%'"
101                 self.speichereSQL(sql,(rowid,pcdatum,))
102                 
103         def openDB(self):
104                 try:
105                         self.cur.close()
106                 except:
107                         pass
108                 try:
109                         self.conn.close()
110                 except:
111                         pass
112                 
113                 db=self.ladeDirekt("datenbank")
114                 if db=="": 
115                         home_dir = os.path.expanduser('~')
116                         db=os.path.join(home_dir, "multilist.s3db") 
117                         
118                 
119                 datum=time.strftime("%Y-%m-%d--", (time.localtime(time.time())))+str(int(time.time()))+"--"
120                 if (os.path.exists(db))and(os.path.exists(os.path.dirname(db)+os.sep+"backup/")):
121                         try:
122                                 shutil.copyfile(db,str(os.path.dirname(db))+os.sep+"backup"+os.sep+datum+os.path.basename(db))
123                                 #logging.debug(str(os.path.dirname(db))+os.sep+"backup"+os.sep+datum+os.path.basename(db))
124                         except:
125                                 logging.info("Achtung Backup-Datei NICHT (!!!) angelegt!")
126                                 #print db,str(os.path.dirname(db))+os.sep+"backup"+os.sep+datum+os.path.basename(db)
127                 
128                 self.conn = sqlite3.connect(db)         
129                 self.cur = self.conn.cursor()
130                 try:
131                         sql="CREATE TABLE logtable (id INTEGER PRIMARY KEY AUTOINCREMENT, pcdatum INTEGER ,sql TEXT, param TEXT, host TEXT, rowid TEXT)"
132                         self.cur.execute(sql)
133                         self.conn.commit()
134                 except:
135                         pass
136                 
137                 #Add rowid line (not in old versions included)
138                 try:
139                         sql="ALTER TABLE logtable ADD rowid TEXT"
140                         self.cur.execute(sql)
141                         self.conn.commit()
142                 except:
143                         pass
144                 
145                 
146         def __init__(self):
147                 home_dir = os.path.expanduser('~')
148                 filename=os.path.join(home_dir, ".multilist.dat") 
149                 self.d = shelve.open(filename)
150                 self.openDB()
151
152         
153
154                 
155                 
156         def close(self):
157                 try:
158                         self.d.close()
159                 except:
160                         pass
161                 try:
162                         self.cur.close()
163                 except:
164                         pass
165                 try:
166                         self.conn.close()
167                 except:
168                         pass
169                 logging.info("Alle Daten gespeichert")
170                 
171         def __del__(self):
172                 self.close()