From 3d9d1a1d5f439983738af0862e412efc7c5c4a7b Mon Sep 17 00:00:00 2001
From: anima
Date: Sat, 5 Jun 2021 11:39:28 +0200
Subject: [PATCH] db handling optimized
---
timeTrack.py | 189 ++++++++++++++++++++++++---------------------------
1 file changed, 89 insertions(+), 100 deletions(-)
diff --git a/timeTrack.py b/timeTrack.py
index ed43b6d..d8a6b57 100644
--- a/timeTrack.py
+++ b/timeTrack.py
@@ -3,7 +3,7 @@
#
# timeTrack.py
# by 4nima
-# v.2.0.2
+# v.2.0.3
#
#########################
# simple time tracking with database
@@ -24,6 +24,7 @@ class TimeTrack:
self.USERNAME = ''
self.OLDEVENT = 2
self.LOGFILE = 'timetrack.log'
+ self.DBCON = sqlite3.connect(self.DATABASE, detect_types=sqlite3.PARSE_DECLTYPES | sqlite3.PARSE_COLNAMES)
logging.basicConfig(
filename=self.LOGFILE,
level=logging.DEBUG,
@@ -33,6 +34,9 @@ class TimeTrack:
self.db_setup()
self.load_config()
+ def __del__(self):
+ self.DBCON.close()
+
## Prepartation
### Check OS and clear screen
def clear_screen(self):
@@ -95,22 +99,19 @@ class TimeTrack:
)
""")
- connect = sqlite3.connect(self.DATABASE)
- cursor = connect.cursor()
logging.debug('Create initial database tables')
- for SQL in sql:
- try:
- cursor.execute(SQL)
- except:
- logging.error('Table could not be created')
- logging.debug(SQL)
- print('TimeTrack wird beendet: Fehler bei Datanbank Setup')
- quit()
- else:
- logging.debug('Table was created successfully or already exists')
-
- connect.commit()
- connect.close()
+ try:
+ with self.DBCON as con:
+ for SQL in sql:
+ con.execute(SQL)
+ except sqlite3.Error as err:
+ logging.error('Table could not be created')
+ logging.debug(sql)
+ logging.error('SQLError: {}'.format(err))
+ print('TimeTrack wird beendet: Fehler bei Datanbank Setup')
+ quit()
+ else:
+ logging.debug('Table was created successfully or already exists')
### Loads or creates a config file
def load_config(self):
@@ -160,21 +161,16 @@ class TimeTrack:
logging.debug('Accepted username: {}'.format(username))
- connect = sqlite3.connect(self.DATABASE)
- cursor = connect.cursor()
-
sql = "INSERT INTO users ( name ) values ( ? )"
-
try:
- cursor.execute(sql, [username])
- except:
+ with self.DBCON as con:
+ con.execute(sql, [username])
+ except sqlite3.Error as err:
logging.error('User could not be saved in database')
logging.debug(sql)
+ logging.error('SQLError: {}'.format(err))
else:
logging.info('User was saved successfully')
- connect.commit()
-
- connect.close()
### Outputs existing users from the DB
def get_users(self, UID=0, NAME=''):
@@ -191,25 +187,23 @@ class TimeTrack:
data = ''
sql = "SELECT * FROM users"
- connect = sqlite3.connect(self.DATABASE)
- cursor = connect.cursor()
-
try:
- if data:
- cursor.execute(sql, [data])
- else:
- cursor.execute(sql)
- except:
+ with self.DBCON as con:
+ cur = con.cursor()
+ if data:
+ cur.execute(sql, [data])
+ else:
+ cur.execute(sql)
+ data = cur.fetchall()
+ except sqlite3.Error as err:
logging.error('Could not get user')
logging.debug(sql)
+ logging.error('SQLError: {}'.format(err))
print('Fehler beim Zugriff auf die Benutzer Datenbank')
return 1
else:
logging.debug('User database read out successfully')
- connect.commit()
- data = cursor.fetchall()
- connect.close()
return data
### Defines a user for the session
@@ -231,23 +225,22 @@ class TimeTrack:
def save_event(self, TIME=datetime.datetime.now()):
if not self.get_event(USERID=self.USERID):
logging.debug('No active events found for the user: {}'.format(self.USERID))
- connect = sqlite3.connect(self.DATABASE)
- cursor = connect.cursor()
- sql = "INSERT INTO active_events ( starttime, user_id ) VALUES ( ?, ? )"
+ sql = "INSERT INTO active_events ( starttime, user_id ) VALUES ( ?, ? )"
try:
- cursor.execute(sql, [TIME, self.USERID])
- except:
+ with self.DBCON as con:
+ con.execute(sql, [TIME, self.USERID])
+ except sqlite3.Error as err:
logging.error('Event could not be created')
logging.debug(sql)
+ logging.error('SQLError: {}'.format(err))
print('Event konnte nicht gespeichert werden.')
return False
else:
logging.info('Event was created successfully')
- connect.commit()
-
- connect.close()
+
return True
+
else:
logging.warning('Active events found for the user, new event could not be created')
return False
@@ -267,20 +260,16 @@ class TimeTrack:
print('Keine angabe was gelöscht werden soll')
return 0
- connect = sqlite3.connect(self.DATABASE, detect_types=sqlite3.PARSE_DECLTYPES | sqlite3.PARSE_COLNAMES)
- cursor = connect.cursor()
-
try:
- cursor.execute(sql, [data])
- except:
+ with self.DBCON as con:
+ con.execute(sql, [data])
+ except sqlite3.Error as err:
logging.error('Event could not be deleted')
logging.debug(sql)
+ logging.error('SQLError: {}'.format(err))
print('Fehler beim löschen des Events.')
else:
logging.debug('Event was successfully deleted')
- connect.commit()
-
- connect.close()
### Get an active event based on a user or event ID
def get_event(self, ENTRYID='', USERID=''):
@@ -296,29 +285,30 @@ class TimeTrack:
sql = "SELECT * FROM active_events"
data = ''
- connect = sqlite3.connect(self.DATABASE, detect_types=sqlite3.PARSE_DECLTYPES | sqlite3.PARSE_COLNAMES)
- cursor = connect.cursor()
try:
- if data:
- logging.debug('Search event')
- cursor.execute(sql, [data])
- else:
- logging.debug('Get all Events')
- cursor.execute(sql)
- except:
+ with self.DBCON as con:
+ cur = con.cursor()
+ if data:
+ logging.debug('Search event')
+ cur.execute(sql, [data])
+ else:
+ logging.debug('Get all Events')
+ cur.execute(sql)
+ data = cur.fetchall()
+ except sqlite3.Error as err:
logging.error('Events could not be read')
logging.debug(sql)
+ logging.error('SQLError: {}'.format(err))
print('Fehler beim auslesen der aktiven Events')
else:
logging.debug('Events could be read out successfully')
- data = cursor.fetchall()
- connect.close()
- if data == []:
- logging.debug('No active events found')
- return 0
- else:
- logging.debug('{} events found'.format(len(data)))
- return data[0]
+
+ if data == []:
+ logging.debug('No active events found')
+ return 0
+ else:
+ logging.debug('{} events found'.format(len(data)))
+ return data[0]
def time_start(self, AUTOFORWARD=True):
self.clear_screen()
@@ -421,44 +411,41 @@ class TimeTrack:
endtime = datetime.datetime.now()
logging.debug('Event end process start at {}'.format(endtime))
- connect = sqlite3.connect(self.DATABASE)
- cursor = connect.cursor()
- sql = "INSERT INTO time_entries ( starttime, endtime, user_id, activity ) VALUES ( ?, ?, ?, ? )"
+ sql = "INSERT INTO time_entries ( starttime, endtime, user_id, activity ) VALUES ( ?, ?, ?, ? )"
try:
- cursor.execute(sql, [data[1], endtime, self.USERID, action])
- except:
+ with self.DBCON as con:
+ con.execute(sql, [data[1], endtime, self.USERID, action])
+ except sqlite3.Error as err:
logging.error('Time entry could not be created')
logging.debug(sql)
+ logging.error('SQLError: {}'.format(err))
print('Zeiteintrag konnte nicht gespeichert werden.')
return False
else:
logging.info('Time entry was created successfully')
- connect.commit()
- self.delete_event(data[0])
- self.print_time_entry(STARTTIME=data[1], ENDTIME=endtime, ACTIVITY=action)
- print('Zeiteintrag wurde gespeichert.')
- userinput = 0
- while not 0 < int(userinput) < 3:
- print('Nächsten Zeiteintrag beginnen ?')
- print('[1] Ja')
- print('[2] Nein')
- userinput = input('Aktion: ')
- logging.debug('User input: {}'.format(userinput))
- try:
- int(userinput)
- except ValueError:
- userinput = 0
- self.clear_screen()
-
- if userinput == "1":
- self.time_start()
- else:
- logging.debug('Terminated by the user')
- exit()
-
- connect.close()
+ self.delete_event(data[0])
+ self.print_time_entry(STARTTIME=data[1], ENDTIME=endtime, ACTIVITY=action)
+ print('Zeiteintrag wurde gespeichert.')
+ userinput = 0
+ while not 0 < int(userinput) < 3:
+ print('Nächsten Zeiteintrag beginnen ?')
+ print('[1] Ja')
+ print('[2] Nein')
+ userinput = input('Aktion: ')
+ logging.debug('User input: {}'.format(userinput))
+ try:
+ int(userinput)
+ except ValueError:
+ userinput = 0
+ self.clear_screen()
+
+ if userinput == "1":
+ self.time_start()
+ else:
+ logging.debug('Terminated by the user')
+ exit()
elif userinput == "2":
logging.info('Event should be deleted (eventid: {})'.format(data[0]))
@@ -484,5 +471,7 @@ class TimeTrack:
print(ACTIVITY)
print(50*"-")
-test = TimeTrack()
-test.time_start()
\ No newline at end of file
+if __name__ == "__main__":
+ test = TimeTrack()
+ test.time_start()
+ test.DBCON.close()
\ No newline at end of file