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