#!/usr/bin/env python """ Quassel Search 0.1 for Quassel 0.4 ---------------------------------- This is a quick, simple and easy script to search a Quassel database for some text in your backlog. Written by Raoul Snyman [raoul.snyman AT saturnlaboratories DOT co DOT za] License: -------- Copyright (c) 2009 Raoul Snyman. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. """ import os import sys import codecs import sqlite3 as sqlite from datetime import datetime from exceptions import Exception from optparse import OptionParser def main(): sys.stdout = codecs.getwriter('utf8')(sys.stdout) version = u'Quassel Search 0.1 for Quassel 0.4\nCopyright (c) 2009 Raoul Snyman\nThis program is licensed under the GNU General Public License' usage = u'%prog [options] ' parser = OptionParser(version=version, usage=usage) parser.add_option('-d', '--database', dest='database', metavar='FILE', default='quassel-storage.sqlite', help='Specify the database file to be used. If no file is specified, "quassel-storage.sqlite" in the current directory will be used.') parser.add_option('-u', '--username', dest='username', metavar='USER', default=None, help='Specify a username. [REQUIRED]') parser.add_option('-n', '--network', dest='network', metavar='NETWORK', default=None, help='Specify the network to search.') parser.add_option('-b', '--buffer', dest='buffer', metavar='BUFFER', default=None, help='Specify the Quassel buffer to search (channels must be prefixed with #).') (options, args) = parser.parse_args() if options.username is None: parser.error(u'The username is required.\n') if options.buffer is not None and options.network is None: parser.error(u'You have to specify a network when searching by buffer.\n') user_id = 0 network_id = 0 buffer_ids = [] connection = sqlite.connect(os.path.abspath(options.database)) cursor = connection.cursor() try: cursor.execute(u'SELECT userid FROM quasseluser WHERE username LIKE ?', (options.username,)) except Exception, e: print u'An error occurred: "%s"' % e.message return 1 user = cursor.fetchone() if user is None: print u'There are no users with the username "%s". Please note that the username is case sensitive.' % options.username return 1 else: user_id = user[0] if options.network is not None: try: cursor.execute(u'SELECT networkid FROM network WHERE LOWER(networkname) LIKE LOWER(?) AND userid = ?', (options.network, user_id)) except Exception, e: print u'An error occurred: "%s"' % e.message return 1 network = cursor.fetchone() if network is None: print u'There was no network with the name "%s"' % options.network return 1 else: network_id = network[0] if options.buffer is not None: try: cursor.execute(u'SELECT bufferid FROM buffer WHERE buffercname LIKE LOWER(?) AND userid = ? AND networkid = ?', (options.buffer, user_id, network_id)) except Exception, e: print u'An error occurred: %s' % e.message return 1 buffer = cursor.fetchone() if buffer is None: print u'There are no buffers with the name "%s"' % buffer return 1 else: buffer_ids.append(buffer[0]) else: try: cursor.execute(u'SELECT bufferid FROM buffer WHERE userid = ? AND networkid = ?', (user_id, network_id)) except Exception, e: print u'An error occurred: %s' % e.message return 1 buffers = cursor.fetchall() if len(buffers) == 0: print u'There are no buffers for the network named "%s"' % options.network return 1 else: for buffer in buffers: buffer_ids.append(buffer[0]) else: try: cursor.execute(u'SELECT bufferid FROM buffer WHERE userid = ?', (user_id,)) except Exception, e: print u'An error occurred: %s' % e.message return 1 buffers = cursor.fetchall() if len(buffers) == 0: print u'There are no buffers for the user "%s"' % options.username return 1 for buffer in buffers: buffer_ids.append(buffer[0]) search_sql = u'SELECT network.networkname, buffer.buffername, ' + \ u'backlog.time, sender.sender, backlog.message FROM backlog ' + \ u'JOIN sender ON backlog.senderid = sender.senderid ' + \ u'JOIN buffer ON backlog.bufferid = buffer.bufferid ' + \ u'JOIN network ON buffer.networkid = network.networkid ' + \ u'WHERE backlog.message LIKE "%%%s%%"' % args[0] try: cursor.execute(search_sql) except Exception, e: print u'An error occurred: %s' % e.message return 1 try: results = cursor.fetchall() except Exception, e: print search_sql print u'An error occurred: %s' % e.message return 1 if len(results) == 0: print u'No results for your search query' return 0 else: for row in results: network_name = row[0] channel_name = row[1] message_time = str(datetime.fromtimestamp(row[2])) sender_name = unicode(row[3]).rsplit(u'!')[0] message_text = row[4] print u'(%s.%s) %s <%s> %s' % (network_name, channel_name, message_time, sender_name, message_text) #for line in display: # print line if __name__ == u'__main__': main()