Monorepo for Tangled
at master 143 lines 2.7 kB view raw
1package db 2 3import ( 4 "database/sql" 5 "fmt" 6 "strings" 7 "time" 8 9 "github.com/go-git/go-git/v5/plumbing" 10 "github.com/ipfs/go-cid" 11 "tangled.org/core/appview/models" 12 "tangled.org/core/orm" 13) 14 15func AddArtifact(e Execer, artifact models.Artifact) error { 16 var repoDid *string 17 if artifact.RepoDid != "" { 18 repoDid = &artifact.RepoDid 19 } 20 _, err := e.Exec( 21 `insert or ignore into artifacts ( 22 did, 23 rkey, 24 repo_at, 25 repo_did, 26 tag, 27 created, 28 blob_cid, 29 name, 30 size, 31 mimetype 32 ) 33 values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, 34 artifact.Did, 35 artifact.Rkey, 36 artifact.RepoAt, 37 repoDid, 38 artifact.Tag[:], 39 artifact.CreatedAt.Format(time.RFC3339), 40 artifact.BlobCid.String(), 41 artifact.Name, 42 artifact.Size, 43 artifact.MimeType, 44 ) 45 return err 46} 47 48func GetArtifact(e Execer, filters ...orm.Filter) ([]models.Artifact, error) { 49 var artifacts []models.Artifact 50 51 var conditions []string 52 var args []any 53 for _, filter := range filters { 54 conditions = append(conditions, filter.Condition()) 55 args = append(args, filter.Arg()...) 56 } 57 58 whereClause := "" 59 if conditions != nil { 60 whereClause = " where " + strings.Join(conditions, " and ") 61 } 62 63 query := fmt.Sprintf(`select 64 did, 65 rkey, 66 repo_at, 67 repo_did, 68 tag, 69 created, 70 blob_cid, 71 name, 72 size, 73 mimetype 74 from artifacts %s`, 75 whereClause, 76 ) 77 78 rows, err := e.Query(query, args...) 79 if err != nil { 80 return nil, err 81 } 82 defer rows.Close() 83 84 for rows.Next() { 85 var artifact models.Artifact 86 var createdAt string 87 var tag []byte 88 var blobCid string 89 var repoDid sql.NullString 90 91 if err := rows.Scan( 92 &artifact.Did, 93 &artifact.Rkey, 94 &artifact.RepoAt, 95 &repoDid, 96 &tag, 97 &createdAt, 98 &blobCid, 99 &artifact.Name, 100 &artifact.Size, 101 &artifact.MimeType, 102 ); err != nil { 103 return nil, err 104 } 105 if repoDid.Valid { 106 artifact.RepoDid = repoDid.String 107 } 108 109 artifact.CreatedAt, err = time.Parse(time.RFC3339, createdAt) 110 if err != nil { 111 artifact.CreatedAt = time.Now() 112 } 113 artifact.Tag = plumbing.Hash(tag) 114 artifact.BlobCid = cid.MustParse(blobCid) 115 116 artifacts = append(artifacts, artifact) 117 } 118 119 if err := rows.Err(); err != nil { 120 return nil, err 121 } 122 123 return artifacts, nil 124} 125 126func DeleteArtifact(e Execer, filters ...orm.Filter) error { 127 var conditions []string 128 var args []any 129 for _, filter := range filters { 130 conditions = append(conditions, filter.Condition()) 131 args = append(args, filter.Arg()...) 132 } 133 134 whereClause := "" 135 if conditions != nil { 136 whereClause = " where " + strings.Join(conditions, " and ") 137 } 138 139 query := fmt.Sprintf(`delete from artifacts %s`, whereClause) 140 141 _, err := e.Exec(query, args...) 142 return err 143}