Create a new small table in DB to remember rooms last_history_line at next
launch. This is necessary because with a big history get_last_date_that_has_logs can take about 5 seconds on first launch. Created new gajim subversion.
This commit is contained in:
parent
29dd9d2576
commit
f32901d243
6 changed files with 80 additions and 14 deletions
|
@ -1,5 +1,5 @@
|
||||||
AC_INIT([Gajim - A Jabber Instant Messager],
|
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])
|
AC_PREREQ([2.59])
|
||||||
AM_INIT_AUTOMAKE([1.8])
|
AM_INIT_AUTOMAKE([1.8])
|
||||||
AC_CONFIG_HEADER(config.h)
|
AC_CONFIG_HEADER(config.h)
|
||||||
|
|
|
@ -86,6 +86,10 @@ def create_log_db():
|
||||||
ver TEXT,
|
ver TEXT,
|
||||||
ext TEXT,
|
ext TEXT,
|
||||||
data BLOB);
|
data BLOB);
|
||||||
|
|
||||||
|
CREATE TABLE IF NOT EXISTS rooms_last_message_time(
|
||||||
|
jid_id INTEGER PRIMARY KEY UNIQUE,
|
||||||
|
time INTEGER
|
||||||
'''
|
'''
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
@ -1443,13 +1443,19 @@ class Connection(ConnectionHandlers):
|
||||||
# last date/time in history to avoid duplicate
|
# last date/time in history to avoid duplicate
|
||||||
if not self.last_history_line.has_key(room_jid):
|
if not self.last_history_line.has_key(room_jid):
|
||||||
# Not in memory, get it from DB
|
# Not in memory, get it from DB
|
||||||
last_log = None
|
|
||||||
no_log_for = gajim.config.get_per('accounts', self.name, 'no_log_for')\
|
no_log_for = gajim.config.get_per('accounts', self.name, 'no_log_for')\
|
||||||
.split()
|
.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
|
# Do not check if we are not logging for this room
|
||||||
last_log = gajim.logger.get_last_date_that_has_logs(room_jid,
|
if self.name not in no_log_for and room_jid not in no_log_for:
|
||||||
is_room = True)
|
# 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:
|
if last_log is None:
|
||||||
last_log = 0
|
last_log = 0
|
||||||
self.last_history_line[room_jid]= last_log
|
self.last_history_line[room_jid]= last_log
|
||||||
|
@ -1497,6 +1503,12 @@ class Connection(ConnectionHandlers):
|
||||||
ptype = None
|
ptype = None
|
||||||
if show == 'offline':
|
if show == 'offline':
|
||||||
ptype = 'unavailable'
|
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)
|
xmpp_show = helpers.get_xmpp_show(show)
|
||||||
p = common.xmpp.Presence(to = '%s/%s' % (jid, nick), typ = ptype,
|
p = common.xmpp.Presence(to = '%s/%s' % (jid, nick), typ = ptype,
|
||||||
show = xmpp_show, status = status)
|
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
|
# send instantly so when we go offline, status is sent to gc before we
|
||||||
# disconnect from jabber server
|
# disconnect from jabber server
|
||||||
self.connection.send(p)
|
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 = ''):
|
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'''
|
'''role is for all the life of the room so it's based on nick'''
|
||||||
|
|
|
@ -2,7 +2,7 @@ docdir = '../'
|
||||||
|
|
||||||
datadir = '../'
|
datadir = '../'
|
||||||
|
|
||||||
version = '0.11.4.2-svn'
|
version = '0.11.4.3-svn'
|
||||||
|
|
||||||
import sys, os.path
|
import sys, os.path
|
||||||
for base in ('.', 'common'):
|
for base in ('.', 'common'):
|
||||||
|
|
|
@ -553,10 +553,10 @@ class Logger:
|
||||||
result = self.cur.fetchall()
|
result = self.cur.fetchall()
|
||||||
|
|
||||||
# Copy all interesting times in a temporary table
|
# 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:
|
for line in result:
|
||||||
self.cur.execute('''
|
self.cur.execute('''
|
||||||
INSERT INTO blabla (time) VALUES (%d)
|
INSERT INTO temp_table (time) VALUES (%d)
|
||||||
''' % (line[0]))
|
''' % (line[0]))
|
||||||
|
|
||||||
# then search in this small temp table for each day
|
# 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
|
# just ask one row to see if we have sth for this date
|
||||||
self.cur.execute('''
|
self.cur.execute('''
|
||||||
SELECT time FROM blabla
|
SELECT time FROM temp_table
|
||||||
WHERE time BETWEEN %d AND %d
|
WHERE time BETWEEN %d AND %d
|
||||||
LIMIT 1
|
LIMIT 1
|
||||||
''' % (start_of_day, last_second_of_day))
|
''' % (start_of_day, last_second_of_day))
|
||||||
|
@ -575,7 +575,7 @@ class Logger:
|
||||||
days_with_logs[0:0]=[day]
|
days_with_logs[0:0]=[day]
|
||||||
|
|
||||||
# Delete temporary table
|
# Delete temporary table
|
||||||
self.cur.execute('DROP TABLE blabla')
|
self.cur.execute('DROP TABLE temp_table')
|
||||||
result = self.cur.fetchone()
|
result = self.cur.fetchone()
|
||||||
return days_with_logs
|
return days_with_logs
|
||||||
|
|
||||||
|
@ -599,9 +599,38 @@ class Logger:
|
||||||
result = results[0]
|
result = results[0]
|
||||||
else:
|
else:
|
||||||
result = None
|
result = None
|
||||||
|
|
||||||
return result
|
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):
|
def _build_contact_where(self, account, jid):
|
||||||
'''build the where clause for a jid, including metacontacts
|
'''build the where clause for a jid, including metacontacts
|
||||||
jid(s) if any'''
|
jid(s) if any'''
|
||||||
|
|
|
@ -178,6 +178,8 @@ class OptionsParser:
|
||||||
self.update_config_to_01141()
|
self.update_config_to_01141()
|
||||||
if old < [0, 11, 4, 2] and new >= [0, 11, 4, 2]:
|
if old < [0, 11, 4, 2] and new >= [0, 11, 4, 2]:
|
||||||
self.update_config_to_01142()
|
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.logger.init_vars()
|
||||||
gajim.config.set('version', new_version)
|
gajim.config.set('version', new_version)
|
||||||
|
@ -543,3 +545,25 @@ class OptionsParser:
|
||||||
gajim.config.set_per('soundevents', 'next_message_received_focused',
|
gajim.config.set_per('soundevents', 'next_message_received_focused',
|
||||||
'path', path)
|
'path', path)
|
||||||
gajim.config.set('version', '0.11.1.2')
|
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')
|
||||||
|
|
Loading…
Add table
Reference in a new issue