···
func NewIssue(tx *sql.Tx, issue *Issue) error {
insert or ignore into repo_issue_seqs (repo_at, next_issue_id)
-
set next_issue_id = next_issue_id + 1
-
returning next_issue_id - 1
-
`, issue.RepoAt).Scan(&nextId)
-
insert into issues (repo_at, owner_did, rkey, issue_at, issue_id, title, body)
-
values (?, ?, ?, ?, ?, ?, ?)
-
`, issue.RepoAt, issue.OwnerDid, issue.Rkey, issue.AtUri(), issue.IssueId, issue.Title, issue.Body)
-
lastID, err := res.LastInsertId()
-
if err := tx.Commit(); err != nil {
···
func NewIssue(tx *sql.Tx, issue *Issue) error {
+
// ensure sequence exists
insert or ignore into repo_issue_seqs (repo_at, next_issue_id)
+
// check if issue already exists
+
var existingRowId, existingIssueId sql.NullInt64
+
select rowid, issue_id from issues
+
where did = ? and rkey = ?
+
`, issue.Did, issue.Rkey).Scan(&existingRowId, &existingIssueId)
+
case err == sql.ErrNoRows:
+
return createNewIssue(tx, issue)
+
// Case 3: Issue exists - update it
+
return updateIssue(tx, issue, existingRowId.Int64, int(existingIssueId.Int64))
+
func createNewIssue(tx *sql.Tx, issue *Issue) error {
+
set next_issue_id = next_issue_id + 1
+
returning next_issue_id - 1
+
`, issue.RepoAt).Scan(&newIssueId)
+
insert into issues (repo_at, did, rkey, issue_id, title, body)
+
values (?, ?, ?, ?, ?, ?)
+
returning rowid, issue_id
+
`, issue.RepoAt, issue.Did, issue.Rkey, newIssueId, issue.Title, issue.Body)
+
return row.Scan(&issue.Id, &issue.IssueId)
+
func updateIssue(tx *sql.Tx, issue *Issue, existingRowId int64, existingIssueId int) error {
+
// update existing issue
+
set title = ?, body = ?
+
where did = ? and rkey = ?
+
`, issue.Title, issue.Body, issue.Did, issue.Rkey)
+
// set the values from existing record
+
issue.Id = existingRowId
+
issue.IssueId = existingIssueId