diff --git a/configure.ac b/configure.ac index d06f12820..6188951d2 100644 --- a/configure.ac +++ b/configure.ac @@ -1,5 +1,5 @@ AC_INIT([Gajim - A Jabber Instant Messager], - [0.11.4.2-svn],[http://trac.gajim.org/],[gajim]) + [0.11.4.3-svn],[http://trac.gajim.org/],[gajim]) AC_PREREQ([2.59]) AM_INIT_AUTOMAKE([1.8]) AC_CONFIG_HEADER(config.h) diff --git a/src/common/check_paths.py b/src/common/check_paths.py index aba84008c..f453b9318 100644 --- a/src/common/check_paths.py +++ b/src/common/check_paths.py @@ -86,6 +86,10 @@ def create_log_db(): ver TEXT, ext TEXT, data BLOB); + + CREATE TABLE IF NOT EXISTS rooms_last_message_time( + jid_id INTEGER PRIMARY KEY UNIQUE, + time INTEGER ''' ) diff --git a/src/common/connection.py b/src/common/connection.py index 0ce9ea976..644b053dd 100644 --- a/src/common/connection.py +++ b/src/common/connection.py @@ -1443,13 +1443,19 @@ class Connection(ConnectionHandlers): # last date/time in history to avoid duplicate if not self.last_history_line.has_key(room_jid): # Not in memory, get it from DB - last_log = None no_log_for = gajim.config.get_per('accounts', self.name, 'no_log_for')\ .split() - if self.name not in no_log_for and room_jid not in no_log_for: + last_log = None # Do not check if we are not logging for this room - last_log = gajim.logger.get_last_date_that_has_logs(room_jid, - is_room = True) + if self.name not in no_log_for and room_jid not in no_log_for: + # Check time first in the FAST table + last_log = gajim.logger.get_room_last_message_time(room_jid) + if last_log is None: + # Not in special table, get it from messages DB + last_log = gajim.logger.get_last_date_that_has_logs(room_jid, + is_room = True) + # Create self.last_history_line[room_jid] even if not logging, + # could be used in connection_handlers if last_log is None: last_log = 0 self.last_history_line[room_jid]= last_log @@ -1497,6 +1503,12 @@ class Connection(ConnectionHandlers): ptype = None if show == 'offline': ptype = 'unavailable' + # Save the time we quit to avoid duplicate logs AND be faster than + # get that date from DB. Save it in mem AND in a small table (with + # fast access) + log_time = time_time() + self.last_history_line[jid] = log_time + gajim.logger.set_room_last_message_time(jid, log_time) xmpp_show = helpers.get_xmpp_show(show) p = common.xmpp.Presence(to = '%s/%s' % (jid, nick), typ = ptype, show = xmpp_show, status = status) @@ -1506,9 +1518,6 @@ class Connection(ConnectionHandlers): # send instantly so when we go offline, status is sent to gc before we # disconnect from jabber server self.connection.send(p) - # Save the time we quit to avoid duplicate logs AND be faster than - # get that date from DB - self.last_history_line[jid] = time_time() def gc_set_role(self, room_jid, nick, role, reason = ''): '''role is for all the life of the room so it's based on nick''' diff --git a/src/common/defs.py b/src/common/defs.py index 7cdfe0111..d3ddd971f 100644 --- a/src/common/defs.py +++ b/src/common/defs.py @@ -2,7 +2,7 @@ docdir = '../' datadir = '../' -version = '0.11.4.2-svn' +version = '0.11.4.3-svn' import sys, os.path for base in ('.', 'common'): diff --git a/src/common/logger.py b/src/common/logger.py index c2739b1d7..2ce4925a5 100644 --- a/src/common/logger.py +++ b/src/common/logger.py @@ -553,10 +553,10 @@ class Logger: result = self.cur.fetchall() # Copy all interesting times in a temporary table - self.cur.execute('CREATE TEMPORARY TABLE blabla(time,INTEGER)') + self.cur.execute('CREATE TEMPORARY TABLE temp_table(time,INTEGER)') for line in result: self.cur.execute(''' - INSERT INTO blabla (time) VALUES (%d) + INSERT INTO temp_table (time) VALUES (%d) ''' % (line[0])) # then search in this small temp table for each day @@ -566,7 +566,7 @@ class Logger: # just ask one row to see if we have sth for this date self.cur.execute(''' - SELECT time FROM blabla + SELECT time FROM temp_table WHERE time BETWEEN %d AND %d LIMIT 1 ''' % (start_of_day, last_second_of_day)) @@ -575,7 +575,7 @@ class Logger: days_with_logs[0:0]=[day] # Delete temporary table - self.cur.execute('DROP TABLE blabla') + self.cur.execute('DROP TABLE temp_table') result = self.cur.fetchone() return days_with_logs @@ -599,9 +599,38 @@ class Logger: result = results[0] else: result = None - return result + def get_room_last_message_time(self, jid): + '''returns FASTLY last time (in seconds since EPOCH) for which + we had logs for that room from rooms_last_message_time table''' + jid_id = self.get_jid_id(jid, 'ROOM') + where_sql = 'jid_id = %s' % jid_id + self.cur.execute(''' + SELECT time FROM rooms_last_message_time + WHERE (%s) + ''' % (where_sql)) + + results = self.cur.fetchone() + if results is not None: + result = results[0] + else: + result = None + return result + + def set_room_last_message_time(self, jid, time): + '''set last time (in seconds since EPOCH) for which + we had logs for that room in rooms_last_message_time table''' + jid_id = self.get_jid_id(jid, 'ROOM') + # jid_id is unique in this table, create or update : + sql = 'REPLACE INTO rooms_last_message_time VALUES (%d, %d)' % \ + (jid_id, time) + self.cur.execute(sql) + try: + self.con.commit() + except sqlite.OperationalError, e: + print >> sys.stderr, str(e) + def _build_contact_where(self, account, jid): '''build the where clause for a jid, including metacontacts jid(s) if any''' diff --git a/src/common/optparser.py b/src/common/optparser.py index 72b6fe6e7..a7d74a396 100644 --- a/src/common/optparser.py +++ b/src/common/optparser.py @@ -178,6 +178,8 @@ class OptionsParser: self.update_config_to_01141() if old < [0, 11, 4, 2] and new >= [0, 11, 4, 2]: self.update_config_to_01142() + if old < [0, 11, 4, 3] and new >= [0, 11, 4, 3]: + self.update_config_to_01143() gajim.logger.init_vars() gajim.config.set('version', new_version) @@ -543,3 +545,25 @@ class OptionsParser: gajim.config.set_per('soundevents', 'next_message_received_focused', 'path', path) gajim.config.set('version', '0.11.1.2') + + def update_config_to_01143(self): + print "updating" + back = os.getcwd() + os.chdir(logger.LOG_DB_FOLDER) + con = sqlite.connect(logger.LOG_DB_FILE) + os.chdir(back) + cur = con.cursor() + try: + cur.executescript( + ''' + CREATE TABLE IF NOT EXISTS rooms_last_message_time( + jid_id INTEGER PRIMARY KEY UNIQUE, + time INTEGER + ); + ''' + ) + con.commit() + except sqlite.OperationalError, e: + pass + con.close() + gajim.config.set('version', '0.11.4.3')