func (r *FileRepo) ListFilesExcludingDefaultBackend(prefix string) ([]BackendFile, error) { rows, err := r.db.Query( "SELECT file_id, file_oid, external_id, backend, name, type, size, sha512, updated_at FROM files WHERE backend != $1 AND NAME LIKE $2 || '%' AND deleted_at IS NULL", r.defaultBackend.Name(), prefix, ) if err != nil { return nil, err } defer rows.Close() var res []BackendFile for rows.Next() { var info backend.FileInfo var backendName string var externalID *string var sha512 []byte if rows.Scan(&info.ID, &info.Oid, &externalID, &backendName, &info.Name, &info.Type, &info.Size, &sha512, &info.ModTime); err != nil { return nil, err } if externalID != nil { info.ExternalID = *externalID } info.ETag = base64.StdEncoding.EncodeToString(sha512) f := BackendFile{FileInfo: info} f.Backend, _ = r.getBackend(backendName) res = append(res, f) } return res, rows.Err() }
// Get is like Open, except the FileStream is not populated (useful for HEAD requests) func (r *FileRepo) Get(name string, body bool) (*backend.File, error) { tx, err := r.db.Begin() if err != nil { return nil, err } var info backend.FileInfo var backendName string var externalID *string var sha512 []byte if err := tx.QueryRow( "SELECT file_id, file_oid, external_id, backend, name, type, size, sha512, updated_at FROM files WHERE name = $1 AND deleted_at IS NULL", name, ).Scan(&info.ID, &info.Oid, &externalID, &backendName, &info.Name, &info.Type, &info.Size, &sha512, &info.ModTime); err != nil { if err == pgx.ErrNoRows { err = backend.ErrNotFound } tx.Rollback() return nil, err } if externalID != nil { info.ExternalID = *externalID } info.ETag = base64.StdEncoding.EncodeToString(sha512) if !body { tx.Rollback() return &backend.File{FileInfo: info, FileStream: fakeSizeSeekerFileStream{info.Size}}, nil } b, err := r.getBackend(backendName) if err != nil { tx.Rollback() return nil, err } stream, err := b.Open(tx, info, true) if err != nil { tx.Rollback() return nil, err } return &backend.File{FileInfo: info, FileStream: stream}, nil }