Skip to content

GitLab

  • Projects
  • Groups
  • Snippets
  • Help
    • Loading...
  • Help
    • Help
    • Support
    • Community forum
    • Submit feedback
    • Contribute to GitLab
  • Sign in / Register
gajim
gajim
  • Project overview
    • Project overview
    • Details
    • Activity
    • Releases
  • Repository
    • Repository
    • Files
    • Commits
    • Branches
    • Tags
    • Contributors
    • Graph
    • Compare
  • Issues 207
    • Issues 207
    • List
    • Boards
    • Labels
    • Service Desk
    • Milestones
  • Merge Requests 21
    • Merge Requests 21
  • CI / CD
    • CI / CD
    • Pipelines
    • Jobs
    • Schedules
  • Operations
    • Operations
    • Incidents
    • Environments
  • Analytics
    • Analytics
    • CI / CD
    • Repository
    • Value Stream
  • Wiki
    • Wiki
  • Members
    • Members
  • Collapse sidebar
  • Activity
  • Graph
  • Create a new issue
  • Jobs
  • Commits
  • Issue Boards
  • gajim
  • gajimgajim
  • Wiki
    • Development
  • databaseextract

Last edited by Daniel Brötzmann Aug 24, 2018
Page history

databaseextract

A script to extract entries from logs database

Usage example:

    $ python export_gajim.py .local/share/gajim/logs.db
    exporting log history to .local/share/gajim/logs

Which will yield files like: 2011-08-contact@jabber.fr.

Containing:

    Fri 26 Aug 2011 - CST
    22:49:13 | [contact@jabber.fr] Hello
    22:49:24 | [me] I what's up?

Here is the code:

    # -*- encoding: utf-8 -*-
    
    import sys
    import os
    import sqlite3 as sqlite
    from time import localtime, strftime
    import codecs
    
    logs = {}
    
    def mkline(log_id, line, folder):
        try:
            file = logs[log_id]
            if file is None:
                raise KeyError
        except KeyError:
            # log_id may contain slashes -- think resource in MUC
            log_id = log_id.replace("/", "_")
            filename = os.path.join(folder, "%s.log" % log_id)
            try:
                #print "open %s" % filename
                logs[log_id] = codecs.open(filename, "w", "utf-8")
            except IOError: # Too many opened files
                print "purge opened files"
                for id in logs:
                    logs[id].close()
                    logs[id] = None
                print "open %s" % filename
                logs[log_id] = codecs.open(filename, "a", "utf-8")
            file = logs[log_id]
        file.write(line)
        file.write("\n")
        #print line
    
    def export_logs(database, folder):
        link = sqlite.connect(database)
        cur = link.cursor()
        
        result = cur.execute("""
            SELECT
                jids.jid, jids.type, logs.contact_name, logs.time, logs.kind, 
                logs.show, logs.message, logs.subject
            FROM
                jids, logs
            WHERE
                jids.jid_id = logs.jid_id
            ORDER BY logs.time ASC;""")
    
        current_day = None
    
        for row in result:
            jid, type, contact_name, time, kind, show, message, subject = row
            t = localtime(time)          
            time_str = strftime("%H:%M:%S", t)
            groupchat = (kind == 1 or kind == 2)
            privatechat = (kind == 4 or kind == 6)
            privatemsg = (kind == 5 or kind == 7)
            log_id = strftime("%Y-%m", t) + "-" + jid
    
            if groupchat:
                log_id = "group-" + log_id
            else:
                if not contact_name:
                    contact_name = jid
                else:
                    contact_name = "%s|%s" % (jid, contact_name)
            
            # add a new line and the current date when the day changes
            if t[2] != current_day:
                current_day = t[2]
                mkline(log_id, "", folder)            
                mkline(log_id, strftime("%a %d %b %Y - %Z", t), folder)
    
            if show:
                show = ("online", "chat", "away", "xa", "dnd", "offline")[show]
            
            kind = ("status",
                    "status", # groupchat
                    "msg", # groupchat
                    "recvmsg", # privatemsg
                    "recvchat", # privatechat
                    "sentmsg", # privatemsg
                    "sentchat",   # privatechat
                    "error")[kind]
    
            if groupchat:
                prefix1 = "%s | %s |" % (time_str, jid)
                prefix2 = prefix1
                prefix3 = "%s %s" % (prefix2, ("<%s>" % contact_name).rjust(30))
            else:
                prefix1 = "%s |" %  time_str
                if show:
                    prefix2 = "%s %s" % (prefix1, ("[%s]" % show).ljust(9))
                else:
                    prefix2 = prefix1
                prefix3 = prefix2
    
            if subject:
                line = prefix3 + " Subject: %s" % subject
                mkline(log_id, line, folder)
    
            if kind == 'status':
                line = prefix1 + " status %s %s: %s" % (contact_name, show, 
        message)
            elif kind == 'msg':
                line = prefix3 + " %s" % message
            elif kind == 'recvmsg':
                line = prefix3 + " [%s] %s" % (contact_name, message)
            elif kind == 'recvchat':
                line = prefix3 + " [%s] %s" % (contact_name, message)
            elif kind == 'sentmsg':
                line = prefix3 + " [me] %s" % message
            elif kind == 'sentchat':
                line = prefix3 + " [me] %s" % message
            else:
                line = prefix3 + " %s %s" % (("[%s]" % kind), message)
    
            mkline(log_id, line, folder)
    
    def usage():
        print("usage : export_gajim.py path/to/logs.db")
    
    if __name__ == "__main__":
        if len(sys.argv) < 2:
            usage()
            sys.exit(0)
    
        database = sys.argv[1]  
        if not os.path.isfile(database):
            print("database not found")
            usage()
            sys.exit(0)
    
        export_folder = os.path.join(os.path.dirname(database), "logs")
        try:
            os.mkdir(export_folder)
        except OSError:
            pass
        print "exporting log history to %s" % export_folder
    
        export_logs(database, export_folder)
Clone repository
  • GajimFaq
  • community
    • Community
    • gajimvimpastebin
  • development
    • Development
    • Firststepsfordebugging
    • MUC Invite Logic
    • Ubuntu Development Setup
    • codingstandards
    • databaseextract
    • devdebian
    • devgit
    • devtranslate
    • filetransfer
    • gajimdevsslang
    • gajimgsoc
View All Pages