diff --git a/plugin/packages/wakatime/wakatime/queue.py b/plugin/packages/wakatime/wakatime/queue.py index d9263e4..423d59d 100644 --- a/plugin/packages/wakatime/wakatime/queue.py +++ b/plugin/packages/wakatime/wakatime/queue.py @@ -14,6 +14,7 @@ import logging import os import sqlite3 +import traceback from time import sleep @@ -24,7 +25,6 @@ class Queue(object): DB_FILE = os.path.join(os.path.expanduser('~'), '.wakatime.db') def connect(self): - exists = os.path.exists(self.DB_FILE) conn = sqlite3.connect(self.DB_FILE) c = conn.cursor() c.execute('''CREATE TABLE IF NOT EXISTS action ( @@ -41,27 +41,34 @@ class Queue(object): def push(self, data, plugin): - conn, c = self.connect() - action = { - 'file': data.get('file'), - 'time': data.get('time'), - 'project': data.get('project'), - 'language': data.get('language'), - 'lines': data.get('lines'), - 'branch': data.get('branch'), - 'is_write': 1 if data.get('is_write') else 0, - 'plugin': plugin, - } - c.execute('INSERT INTO action VALUES (:file,:time,:project,:language,:lines,:branch,:is_write,:plugin)', action) - conn.commit() - conn.close() + try: + conn, c = self.connect() + action = { + 'file': data.get('file'), + 'time': data.get('time'), + 'project': data.get('project'), + 'language': data.get('language'), + 'lines': data.get('lines'), + 'branch': data.get('branch'), + 'is_write': 1 if data.get('is_write') else 0, + 'plugin': plugin, + } + c.execute('INSERT INTO action VALUES (:file,:time,:project,:language,:lines,:branch,:is_write,:plugin)', action) + conn.commit() + conn.close() + except sqlite3.Error, e: + log.error(str(e)) def pop(self): tries = 3 wait = 0.1 action = None - conn, c = self.connect() + try: + conn, c = self.connect() + except sqlite3.Error, e: + log.debug(traceback.format_exc()) + return None loop = True while loop and tries > -1: try: @@ -69,9 +76,20 @@ class Queue(object): c.execute('SELECT * FROM action LIMIT 1') row = c.fetchone() if row is not None: - c.execute('''DELETE FROM action WHERE - file=? AND time=? AND project=? AND language=? AND - lines=? AND branch=? AND is_write=?''', row[0:7]) + values = [] + clauses = [] + index = 0 + for row_name in ['file', 'time', 'project', 'language', 'lines', 'branch', 'is_write']: + if row[index] is not None: + clauses.append('{0}=?'.format(row_name)) + values.append(row[index]) + else: + clauses.append('{0} IS NULL'.format(row_name)) + index += 1 + if len(values) > 0: + c.execute('DELETE FROM action WHERE {0}'.format(u' AND '.join(clauses)), values) + else: + c.execute('DELETE FROM action WHERE {0}'.format(u' AND '.join(clauses))) conn.commit() if row is not None: action = { @@ -86,8 +104,11 @@ class Queue(object): } loop = False except sqlite3.Error, e: - log.debug(str(e)) + log.debug(traceback.format_exc()) sleep(wait) tries -= 1 - conn.close() + try: + conn.close() + except sqlite3.Error, e: + log.debug(traceback.format_exc()) return action