forked from tangled.org/core
Monorepo for Tangled — https://tangled.org
1package db 2 3import ( 4 "fmt" 5 "strings" 6 "time" 7 8 "github.com/bluesky-social/indigo/atproto/syntax" 9) 10 11type Pipeline struct { 12 Id int 13 Rkey string 14 Knot string 15 RepoOwner syntax.DID 16 RepoName string 17 TriggerId int 18 Sha string 19 20 // populate when querying for revers mappings 21 Trigger *Trigger 22} 23 24type Trigger struct { 25 Id int 26 Kind string 27 28 // push trigger fields 29 PushRef *string 30 PushNewSha *string 31 PushOldSha *string 32 33 // pull request trigger fields 34 PRSourceBranch *string 35 PRTargetBranch *string 36 PRSourceSha *string 37 PRAction *string 38} 39 40type PipelineStatus struct { 41 ID int 42 Spindle string 43 Rkey string 44 PipelineKnot string 45 PipelineRkey string 46 Created time.Time 47 Workflow string 48 Status string 49 Error *string 50 ExitCode int 51} 52 53func GetPipelines(e Execer, filters ...filter) ([]Pipeline, error) { 54 var pipelines []Pipeline 55 56 var conditions []string 57 var args []any 58 for _, filter := range filters { 59 conditions = append(conditions, filter.Condition()) 60 args = append(args, filter.arg) 61 } 62 63 whereClause := "" 64 if conditions != nil { 65 whereClause = " where " + strings.Join(conditions, " and ") 66 } 67 68 query := fmt.Sprintf(`select id, rkey, knot, repo_owner, repo_name, sha from pipelines %s`, whereClause) 69 70 rows, err := e.Query(query, args...) 71 72 if err != nil { 73 return nil, err 74 } 75 defer rows.Close() 76 77 for rows.Next() { 78 var pipeline Pipeline 79 err = rows.Scan( 80 &pipeline.Id, 81 &pipeline.Rkey, 82 &pipeline.Knot, 83 &pipeline.RepoOwner, 84 &pipeline.RepoName, 85 &pipeline.Sha, 86 ) 87 if err != nil { 88 return nil, err 89 } 90 91 pipelines = append(pipelines, pipeline) 92 } 93 94 if err = rows.Err(); err != nil { 95 return nil, err 96 } 97 98 return pipelines, nil 99} 100 101func AddPipeline(e Execer, pipeline Pipeline) error { 102 args := []any{ 103 pipeline.Rkey, 104 pipeline.Knot, 105 pipeline.RepoOwner, 106 pipeline.RepoName, 107 pipeline.TriggerId, 108 pipeline.Sha, 109 } 110 111 placeholders := make([]string, len(args)) 112 for i := range placeholders { 113 placeholders[i] = "?" 114 } 115 116 query := fmt.Sprintf(` 117 insert or ignore into pipelines ( 118 rkey, 119 knot, 120 repo_owner, 121 repo_name, 122 trigger_id, 123 sha 124 ) values (%s) 125 `, strings.Join(placeholders, ",")) 126 127 _, err := e.Exec(query, args...) 128 129 return err 130} 131 132func AddTrigger(e Execer, trigger Trigger) (int64, error) { 133 args := []any{ 134 trigger.Kind, 135 trigger.PushRef, 136 trigger.PushNewSha, 137 trigger.PushOldSha, 138 trigger.PRSourceBranch, 139 trigger.PRTargetBranch, 140 trigger.PRSourceSha, 141 trigger.PRAction, 142 } 143 144 placeholders := make([]string, len(args)) 145 for i := range placeholders { 146 placeholders[i] = "?" 147 } 148 149 query := fmt.Sprintf(`insert or ignore into triggers ( 150 kind, 151 push_ref, 152 push_new_sha, 153 push_old_sha, 154 pr_source_branch, 155 pr_target_branch, 156 pr_source_sha, 157 pr_action 158 ) values (%s)`, strings.Join(placeholders, ",")) 159 160 res, err := e.Exec(query, args...) 161 if err != nil { 162 return 0, err 163 } 164 165 return res.LastInsertId() 166} 167 168func AddPipelineStatus(e Execer, status PipelineStatus) error { 169 args := []any{ 170 status.Spindle, 171 status.Rkey, 172 status.PipelineKnot, 173 status.PipelineRkey, 174 status.Workflow, 175 status.Status, 176 status.Error, 177 status.ExitCode, 178 } 179 180 placeholders := make([]string, len(args)) 181 for i := range placeholders { 182 placeholders[i] = "?" 183 } 184 185 query := fmt.Sprintf(` 186 insert or ignore into pipeline_statuses ( 187 spindle, 188 rkey, 189 pipeline_knot, 190 pipeline_rkey, 191 workflow, 192 status, 193 error, 194 exit_code 195 ) values (%s) 196 `, strings.Join(placeholders, ",")) 197 198 _, err := e.Exec(query, args...) 199 return err 200}