github.com/code-to-go/safepool.lib@v0.0.0-20221205180519-ee25e63c226e/sql/files.go2 (about) 1 package sql 2 3 import ( 4 "database/sql" 5 "github.com/code-to-go/safepool.lib/core" 6 "github.com/code-to-go/safepool.lib/model" 7 8 "github.com/sirupsen/logrus" 9 ) 10 11 func getFiles(rows *sql.Rows) []model.File { 12 var files []model.File 13 for rows.Next() { 14 var file model.File 15 16 var author string 17 var hash string 18 var modTime int64 19 err := rows.Scan(&file.Domain, &file.Name, &file.Id, &author, &modTime, &file.State, &hash) 20 if !core.IsErr(err, "cannot read file row from db: %v") { 21 file.ModTime = DecodeTime(modTime) 22 // file.Author, _ = security.IdentityFromBase64(author) 23 file.Hash = DecodeBase64(hash) 24 files = append(files, file) 25 } 26 } 27 return files 28 } 29 30 func GetFiles(domain string) ([]model.File, error) { 31 // -- GET_FILES 32 // SELECT domain, name, id, firstId, author, modTime, state, hash FROM files " + 33 // "WHERE domain=:domain 34 35 rows, err := Query("GET_FILES", Args{"domain": domain}) 36 if core.IsErr(err, "cannot read file rows from db: %v") { 37 return nil, err 38 } 39 40 return getFiles(rows), nil 41 } 42 43 func GetFilesWithUpdates(domain string) ([]model.File, error) { 44 // -- GET_FILES_WITH_UPDATES 45 // SELECT domain,name, id, firstId, author, modTime, state, hash FROM files " + 46 // "WHERE domain=:domain AND state != 0 47 48 rows, err := Query("GET_FILES_WITH_UPDATES", Args{"domain": domain}) 49 if core.IsErr(err, "cannot read file rows from db: %v") { 50 return nil, err 51 } 52 53 return getFiles(rows), nil 54 } 55 56 func GetFilesByFirstId(domain string, firstId uint64) ([]model.File, error) { 57 // -- GET_FILES_BY_FIRSTID 58 // SELECT domain,name, id, firstId, author, modTime, state, hash FROM files " + 59 // "WHERE domain=:domain AND firstId=:firstId 60 61 rows, err := Query("GET_FILES_BY_FIRSTID", Args{"domain": domain}) 62 if core.IsErr(err, "cannot read file rows from db: %v") { 63 return nil, err 64 } 65 66 return getFiles(rows), nil 67 } 68 69 func GetFileByName(domain string, name string) (model.File, error) { 70 rows, err := Query("GET_FILE_BY_NAME", Args{"domain": domain, "name": name}) 71 if core.IsErr(err, "cannot read file rows from db: %v") { 72 return model.File{}, err 73 } 74 75 files := getFiles(rows) 76 if len(files) == 0 { 77 return model.File{}, sql.ErrNoRows 78 } 79 return files[0], nil 80 } 81 82 func GetFilesByName(domain string, name string) ([]model.File, error) { 83 rows, err := Query("GET_FILES_BY_NAME", Args{"domain": domain, "name": name}) 84 if core.IsErr(err, "cannot read file rows from db: %v") { 85 return nil, err 86 } 87 return getFiles(rows), nil 88 } 89 90 func GetFilesByHash(hash []byte) ([]model.File, error) { 91 //SELECT domain, name, author, modTime, state FROM files WHERE hash=:hash 92 rows, err := Query("GET_FILE_BY_HASH", Args{"hash": EncodeBase64(hash)}) 93 if err != nil { 94 return nil, err 95 } 96 97 return getFiles(rows), nil 98 } 99 100 func SetFile(file model.File) error { 101 author := "" 102 _, err := Exec("SET_FILE", Args{"domain": file.Domain, "name": file.Name, 103 "firstId": file.FirstId, "lastId": file.Id, 104 "author": author, "hash": EncodeBase64(file.Hash), 105 "modtime": EncodeTime(file.ModTime), "state": file.State}) 106 return err 107 } 108 109 func GetMerkleTree(domain string, name string, author string) (tree []byte, err error) { 110 err = QueryRow("GET_MERKLE_TREE", Args{"domain": domain, "name": name, "author": author}, &tree) 111 if err != nil { 112 logrus.Errorf("get merkle") 113 } 114 return tree, err 115 } 116 117 func SetMerkleTree(domain string, name string, author string, tree []byte) error { 118 _, err := Exec("SET_MERKLE_TREE", Args{"name": name, "author": author, "tree": tree}) 119 return err 120 }