87aa0e95e6f0 — Ted Unangst 16 days ago
pull the upload hash check forward.
reuploading a downloaded converted file shouldn't make a new copy.
3 files changed, 31 insertions(+), 13 deletions(-)

M database.go
M filestoragemanagerfactory.go
M web.go
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