aboutsummaryrefslogtreecommitdiff
path: root/syncapi/storage/postgres/receipt_table.go
diff options
context:
space:
mode:
Diffstat (limited to 'syncapi/storage/postgres/receipt_table.go')
-rw-r--r--syncapi/storage/postgres/receipt_table.go26
1 files changed, 23 insertions, 3 deletions
diff --git a/syncapi/storage/postgres/receipt_table.go b/syncapi/storage/postgres/receipt_table.go
index c5ec6cbc..23c66910 100644
--- a/syncapi/storage/postgres/receipt_table.go
+++ b/syncapi/storage/postgres/receipt_table.go
@@ -30,11 +30,12 @@ import (
)
const receiptsSchema = `
-CREATE SEQUENCE IF NOT EXISTS syncapi_stream_id;
+CREATE SEQUENCE IF NOT EXISTS syncapi_receipt_id;
+
-- Stores data about receipts
CREATE TABLE IF NOT EXISTS syncapi_receipts (
-- The ID
- id BIGINT PRIMARY KEY DEFAULT nextval('syncapi_stream_id'),
+ id BIGINT PRIMARY KEY DEFAULT nextval('syncapi_receipt_id'),
room_id TEXT NOT NULL,
receipt_type TEXT NOT NULL,
user_id TEXT NOT NULL,
@@ -50,7 +51,7 @@ const upsertReceipt = "" +
" (room_id, receipt_type, user_id, event_id, receipt_ts)" +
" VALUES ($1, $2, $3, $4, $5)" +
" ON CONFLICT (room_id, receipt_type, user_id)" +
- " DO UPDATE SET id = nextval('syncapi_stream_id'), event_id = $4, receipt_ts = $5" +
+ " DO UPDATE SET id = nextval('syncapi_receipt_id'), event_id = $4, receipt_ts = $5" +
" RETURNING id"
const selectRoomReceipts = "" +
@@ -58,10 +59,14 @@ const selectRoomReceipts = "" +
" FROM syncapi_receipts" +
" WHERE room_id = ANY($1) AND id > $2"
+const selectMaxReceiptIDSQL = "" +
+ "SELECT MAX(id) FROM syncapi_receipts"
+
type receiptStatements struct {
db *sql.DB
upsertReceipt *sql.Stmt
selectRoomReceipts *sql.Stmt
+ selectMaxReceiptID *sql.Stmt
}
func NewPostgresReceiptsTable(db *sql.DB) (tables.Receipts, error) {
@@ -78,6 +83,9 @@ func NewPostgresReceiptsTable(db *sql.DB) (tables.Receipts, error) {
if r.selectRoomReceipts, err = db.Prepare(selectRoomReceipts); err != nil {
return nil, fmt.Errorf("unable to prepare selectRoomReceipts statement: %w", err)
}
+ if r.selectMaxReceiptID, err = db.Prepare(selectMaxReceiptIDSQL); err != nil {
+ return nil, fmt.Errorf("unable to prepare selectRoomReceipts statement: %w", err)
+ }
return r, nil
}
@@ -104,3 +112,15 @@ func (r *receiptStatements) SelectRoomReceiptsAfter(ctx context.Context, roomIDs
}
return res, rows.Err()
}
+
+func (s *receiptStatements) SelectMaxReceiptID(
+ ctx context.Context, txn *sql.Tx,
+) (id int64, err error) {
+ var nullableID sql.NullInt64
+ stmt := sqlutil.TxStmt(txn, s.selectMaxReceiptID)
+ err = stmt.QueryRowContext(ctx).Scan(&nullableID)
+ if nullableID.Valid {
+ id = nullableID.Int64
+ }
+ return
+}