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:
63
cmd/headers/headers.go
Normal file
63
cmd/headers/headers.go
Normal 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)
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user