Header import, and dumporiginal extensions.

Add ability to dump headers or mimetypes for original messages.
Add ability to dump all messages, instead of just hashes listed.
Add new command  cmd/headers to import all headers from messages in table
    original.  Utility can work incrementally or do fully table imports.
Moved 'fetch all original messages' code to db/util.go.  Added conditional
version given table name that will only return original messages that do not
    have matching hashes in the specified table.
This commit is contained in:
2014-04-01 23:18:12 -07:00
parent 61c61a1075
commit 2f6b083f47
5 changed files with 284 additions and 4 deletions

63
cmd/headers/headers.go Normal file
View File

@@ -0,0 +1,63 @@
package main
import (
"bytes"
"flag"
"io"
"net/mail"
"xinu.tv/email/db"
"github.com/golang/glog"
)
var (
all = flag.Bool("all", false,
"extract headers from all messages. Default is to only extract from unprocessed messages.")
)
func insertHeaders(c *db.Conn, hash string, r io.Reader) error {
msg, err := mail.ReadMessage(r)
if err != nil {
return err
}
glog.Infoln("Insert", hash)
return c.InsertHeaders(hash, msg.Header)
}
func insertAllHeaders(c *db.Conn, all bool) error {
oCh := make(chan db.Original)
errc := make(chan error)
donec := make(chan struct{})
defer close(donec)
if all {
go c.Originals(oCh, errc, donec)
} else {
go c.OriginalsNotInTable("header", oCh, errc, donec)
}
for {
select {
case o := <-oCh:
r := bytes.NewReader(o.Blob)
if err := insertHeaders(c, o.Hash, r); err != nil {
return err
}
case err := <-errc:
return err
}
}
}
func main() {
defer glog.Flush()
flag.Parse()
c, err := db.NewConn("")
if err != nil {
glog.Fatal(err)
}
if err := insertAllHeaders(c, *all); err != nil {
glog.Fatal(err)
}
}