Add import for 'important' headers.
Process and normalize some headers that will be used in quickly recalling messages.
This commit is contained in:
75
db/util.go
75
db/util.go
@@ -5,6 +5,7 @@ import (
|
||||
"flag"
|
||||
"fmt"
|
||||
"net/mail"
|
||||
"time"
|
||||
"unicode/utf8"
|
||||
|
||||
"github.com/golang/glog"
|
||||
@@ -140,7 +141,7 @@ VALUES
|
||||
for k, vs := range hdrs {
|
||||
for _, v := range vs {
|
||||
if !utf8.ValidString(v) {
|
||||
glog.Infof("%s: value for %q invalid UTF-8 %q", hash, k, v)
|
||||
glog.Warningf("%s: value for %q invalid UTF-8 %q", hash, k, v)
|
||||
continue
|
||||
}
|
||||
if _, err := stmt.Exec(hash, k, v); err != nil {
|
||||
@@ -150,3 +151,75 @@ VALUES
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (c *Conn) InsertSearchHeaders(hash string, hdrs mail.Header) (err error) {
|
||||
var tx *sql.Tx
|
||||
tx, err = c.Begin()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer func() {
|
||||
if err != nil {
|
||||
if err := tx.Rollback(); err != nil {
|
||||
glog.Error(err)
|
||||
}
|
||||
return
|
||||
}
|
||||
err = tx.Commit()
|
||||
}()
|
||||
|
||||
stmt, err := tx.Prepare(`
|
||||
INSERT INTO
|
||||
search_header (hash, name, value)
|
||||
VALUES
|
||||
($1, $2, $3)
|
||||
`)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// Save the following headers to the database untouched.
|
||||
otherHdrs := []string{"Subject", "Message-Id", "In-Reply-To", "References"}
|
||||
for _, k := range otherHdrs {
|
||||
for _, v := range hdrs[k] {
|
||||
if !utf8.ValidString(v) {
|
||||
glog.Warningf("%s: value for %q invalid UTF-8 %q", hash, k, v)
|
||||
continue
|
||||
}
|
||||
if _, err := stmt.Exec(hash, k, v); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Parse the following headers as addresses, and save each email address
|
||||
// found to the database independently.
|
||||
addrHdrs := []string{"To", "From", "Cc"}
|
||||
for _, k := range addrHdrs {
|
||||
for _, value := range hdrs[k] {
|
||||
addrs, err := mail.ParseAddressList(value)
|
||||
if err != nil {
|
||||
glog.Warningf("%s: error parsing address list for %q: %v", hash, k, err)
|
||||
continue
|
||||
}
|
||||
|
||||
for _, v := range addrs {
|
||||
if _, err := stmt.Exec(hash, k, v.Address); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Normalize date field.
|
||||
t, err := hdrs.Date()
|
||||
if err != nil {
|
||||
glog.Warningf("%s: failed to parse date header: %v", hash, err)
|
||||
return nil
|
||||
}
|
||||
v := t.UTC().Format(time.RFC3339Nano)
|
||||
if _, err := stmt.Exec(hash, "Date", v); err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user