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