<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array"/>
  <modified type="array">
    <modified>
      <diff>@@ -8,7 +8,7 @@
 #   the nodes are the persons
 #   the edges have a type to/cc and a weight (number of mails)
 
-import sys, os, datetime, getopt, ConfigParser, platform
+import sys, os, cStringIO, codecs, datetime, getopt, platform, csv #TODO , ConfigParser
 if(platform.machine()=='i686'):
    import psyco
 from sqlobject import *
@@ -17,8 +17,8 @@ from lib.utils import decode_header
 
 CONFIG = {'database': os.path.abspath('../db/messages.db'),
           'personmapfile' : '../db/persons.map',
-          'format': &quot;dot&quot;, # dot|graphxml|log
-          'stats': True,   # display overall stats
+          'format': &quot;csv&quot;, # dot|graphxml|log|csv
+          'stats': False,   # display overall stats
           'egg': False,    # filter out entity:
           'egger': 'Marsiske Stefan',
           }
@@ -32,7 +32,7 @@ def usage():
    print &quot;\t-h                                  This Help&quot;
    print &quot;\t-s|--stats                          Display top ten stats on in/out contacts.&quot;
 #   print &quot;\t-f |--format== [dot,log,graphxml]   Output format.&quot;
-   print &quot;\t-f |--format== [dot,log]            Output format.&quot;
+   print &quot;\t-f |--format== [dot,log,csv]        Output format.&quot;
 
 def counter(start=0):
     while True:
@@ -41,6 +41,31 @@ def counter(start=0):
 nodeIdGenerator=iter(counter(0))
 edgeIdGenerator=iter(counter(0))
 
+class UnicodeWriter:
+    &quot;&quot;&quot;
+    A CSV writer which will write rows to CSV file &quot;f&quot;,
+    which is encoded in the given encoding.
+    &quot;&quot;&quot;
+    def __init__(self, f, dialect=csv.excel, encoding=&quot;utf-8&quot;, **kwds):
+        # Redirect output to a queue
+        self.queue = cStringIO.StringIO()
+        self.writer = csv.writer(self.queue, dialect=dialect, **kwds)
+        self.stream = f
+        self.encoder = codecs.getincrementalencoder(encoding)()
+
+    def writerow(self, row):
+        #ORIG:self.writer.writerow([s.encode(&quot;utf-8&quot;) for s in row])
+        self.writer.writerow(row)
+        # Fetch UTF-8 output from the queue ...
+        data = self.queue.getvalue()
+        data = data.decode(&quot;utf-8&quot;)
+        # ... and reencode it into the target encoding
+        data = self.encoder.encode(data)
+        # write to the target stream
+        self.stream.write(data)
+        # empty queue
+        self.queue.truncate(0)
+
 class Node:
     def __init__(self,name,receivers = []):
         self.__dict__['id'] = &quot;n&quot;+str(nodeIdGenerator.next())
@@ -205,30 +230,35 @@ def loadPersonMap():
             personmap[email] = name.strip()
 
 def buildGraph():
-    graph = Graph()
-    q = Role.select()
-    for edge in q:
-        sender = edge.msg
-        if(edge.msg.sender and edge.msg.sender.owner):
-            sender = edge.msg.sender.owner.fullname
-        elif(edge.msg.sender):
-            sender = edge.msg.sender.username+&quot;@&quot;+edge.msg.sender.mailserver
-        if(sender and personmap.has_key(sender)):
-            sender = personmap[sender]
-
-        receiver = edge.email
-        if(edge.email and edge.email.owner):
-            receiver = edge.email.owner.fullname
-        elif(edge.email):
-            receiver = edge.email.username+&quot;@&quot;+edge.email.mailserver
-        if(receiver and personmap.has_key(receiver)):
-           receiver = personmap[receiver]
-
-        if(CONFIG['format']==&quot;log&quot;):
-            print edge.msg.delivered,sender, edge.header.name, receiver
-
-        graph.addToGraph(edge.msg.delivered,sender,edge.header.name, receiver)
-    return graph
+   graph = Graph()
+   q = Role.select()
+   csvcoder=None
+   if(CONFIG['format']==&quot;csv&quot;):
+      csvcoder=UnicodeWriter(sys.stdout)
+   for edge in q:
+      sender = edge.msg
+      if(edge.msg.sender and edge.msg.sender.owner):
+         sender = edge.msg.sender.owner.fullname
+      elif(edge.msg.sender):
+         sender = edge.msg.sender.username+&quot;@&quot;+edge.msg.sender.mailserver
+      if(sender and personmap.has_key(sender)):
+         sender = personmap[sender]
+
+      receiver = edge.email
+      if(edge.email and edge.email.owner):
+         receiver = edge.email.owner.fullname
+      elif(edge.email):
+         receiver = edge.email.username+&quot;@&quot;+edge.email.mailserver
+      if(receiver and personmap.has_key(receiver)):
+         receiver = personmap[receiver]
+
+      if(CONFIG['format']==&quot;log&quot;):
+         print edge.msg.delivered,sender, edge.header.name, receiver
+      elif(CONFIG['format']==&quot;csv&quot;):
+         csvcoder.writerow(map(lambda x: str(x),(edge.msg.delivered,sender, edge.header.name, receiver)))
+
+      graph.addToGraph(edge.msg.delivered,sender,edge.header.name, receiver)
+   return graph
 
 def dumpResults(graph):
     #print graph
@@ -266,7 +296,7 @@ if __name__=='__main__':
       elif o in (&quot;-s&quot;, &quot;--stats&quot;):
           CONFIG['stats'] = True
       elif o in (&quot;-f&quot;, &quot;--format&quot;):
-         if(a and a in (&quot;dot&quot;,&quot;log&quot;,&quot;graphxml&quot;)):
+         if(a and a in (&quot;dot&quot;, &quot;log&quot;, &quot;graphxml&quot;, &quot;csv&quot;)):
             CONFIG['format'] = a
          else:
             usage()</diff>
      <filename>utils/getgraph</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>6ef7d3e6e984fa49642cba9c5b7f7578efdb656a</id>
    </parent>
  </parents>
  <author>
    <name>Stefan Marsiske</name>
    <email>stefan.marsiske@gmail.com</email>
  </author>
  <url>http://github.com/stef/maelstrom/commit/898a3bf88dd7e5c3e723c7cf495824481caaf6b3</url>
  <id>898a3bf88dd7e5c3e723c7cf495824481caaf6b3</id>
  <committed-date>2009-03-07T14:59:11-08:00</committed-date>
  <authored-date>2009-03-07T14:59:11-08:00</authored-date>
  <message>[enh] added csv export of log style output</message>
  <tree>77f5d9df95d88a0f8953332217481c2d6b1a76ca</tree>
  <committer>
    <name>Stefan Marsiske</name>
    <email>stefan.marsiske@gmail.com</email>
  </committer>
</commit>
