M database.go +1 -1
@@ 1177,7 1177,7 @@ func prepareStatements(db *sql.DB) {
stmtCheckFileHash = preparetodie(db, "select xid from filehashes where hash = ?")
stmtGetFileMedia = preparetodie(db, "select media from filehashes where xid = ?")
stmtFindXonk = preparetodie(db, "select honkid from honks where userid = ? and xid = ?")
- stmtGetFileInfo = preparetodie(db, "select url from filemeta where xid = ?")
+ stmtGetFileInfo = preparetodie(db, "select url, media, meta from filemeta where xid = ?")
stmtFindFile = preparetodie(db, "select fileid, xid from filemeta where url = ? and local = 1")
stmtFindFileId = preparetodie(db, "select xid, local, description from filemeta where fileid = ? and url = ? and local = 1")
stmtUserByName = preparetodie(db, "select userid, username, displayname, about, pubkey, seckey, options from users where username = ? and userid > 0")
M filestoragemanagerfactory.go +18 -9
@@ 35,6 35,19 @@ func hashfiledata(data []byte) string {
return fmt.Sprintf("%x", h.Sum(nil))
}
+func needfilehash(data []byte, xid *string) string {
+ hash := hashfiledata(data)
+ row := stmtCheckFileHash.QueryRow(hash)
+ err := row.Scan(xid)
+ if err == nil {
+ return ""
+ }
+ if err != sql.ErrNoRows {
+ elog.Printf("error checking file hash: %s", err)
+ }
+ return hash
+}
+
func filepath(xid string) string {
parts := strings.SplitN(xid, ".", 2)
subdir := "xx"
@@ 65,10 78,7 @@ func savefiledata(xid string, data []byt
func savefileandxid(name string, desc string, url string, media string, local bool, data []byte, meta *DonkMeta) (int64, string, error) {
var xid string
if local {
- hash := hashfiledata(data)
- row := stmtCheckFileHash.QueryRow(hash)
- err := row.Scan(&xid)
- if err == sql.ErrNoRows {
+ if hash := needfilehash(data, &xid); hash != "" {
xid = xfildate()
switch media {
case "image/png":
@@ 82,16 92,13 @@ func savefileandxid(name string, desc st
case "text/plain":
xid += ".txt"
}
- err = savefiledata(xid, data)
+ err := savefiledata(xid, data)
if err == nil {
_, err = stmtSaveFileHash.Exec(xid, hash, media)
}
if err != nil {
return 0, "", err
}
- } else if err != nil {
- elog.Printf("error checking file hash: %s", err)
- return 0, "", err
}
if url == "" {
url = serverURL("/d/%s", xid)
@@ 113,9 120,11 @@ func savefileandxid(name string, desc st
func getfileinfo(xid string) *Donk {
donk := new(Donk)
row := stmtGetFileInfo.QueryRow(xid)
- err := row.Scan(&donk.URL)
+ var j string
+ err := row.Scan(&donk.URL, &donk.Media, &j)
if err == nil {
donk.XID = xid
+ unjsonify(j, &donk.Meta)
return donk
}
if err != sql.ErrNoRows {
M web.go +12 -3
@@ 1972,10 1972,19 @@ func formtodonk(w http.ResponseWriter, r
io.Copy(&buf, file)
file.Close()
data := buf.Bytes()
- var media, name string
+ var xid, media, name string
var donkmeta DonkMeta
- img, err := bigshrink(data)
- if err == nil {
+ if needfilehash(data, &xid) == "" {
+ d := getfileinfo(xid)
+ if d == nil {
+ elog.Printf("lost a file xid somehow: %s", xid)
+ } else {
+ name = d.Name
+ donkmeta.Width = d.Meta.Width
+ donkmeta.Height = d.Meta.Height
+ media = d.Media
+ }
+ } else if img, err := bigshrink(data); err == nil {
data = img.Data
donkmeta.Width = img.Width
donkmeta.Height = img.Height