aboutsummaryrefslogtreecommitdiff
path: root/appservice/storage/txn_id_counter_table.go
diff options
context:
space:
mode:
Diffstat (limited to 'appservice/storage/txn_id_counter_table.go')
-rw-r--r--appservice/storage/txn_id_counter_table.go52
1 files changed, 52 insertions, 0 deletions
diff --git a/appservice/storage/txn_id_counter_table.go b/appservice/storage/txn_id_counter_table.go
new file mode 100644
index 00000000..7b0fa378
--- /dev/null
+++ b/appservice/storage/txn_id_counter_table.go
@@ -0,0 +1,52 @@
+// Copyright 2018 New Vector Ltd
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package storage
+
+import (
+ "context"
+ "database/sql"
+)
+
+const txnIDSchema = `
+-- Keeps a count of the current transaction ID
+CREATE SEQUENCE IF NOT EXISTS txn_id_counter START 1;
+`
+
+const selectTxnIDSQL = "SELECT nextval('txn_id_counter')"
+
+type txnStatements struct {
+ selectTxnIDStmt *sql.Stmt
+}
+
+func (s *txnStatements) prepare(db *sql.DB) (err error) {
+ _, err = db.Exec(txnIDSchema)
+ if err != nil {
+ return
+ }
+
+ if s.selectTxnIDStmt, err = db.Prepare(selectTxnIDSQL); err != nil {
+ return
+ }
+
+ return
+}
+
+// selectTxnID selects the latest ascending transaction ID
+func (s *txnStatements) selectTxnID(
+ ctx context.Context,
+) (txnID int, err error) {
+ err = s.selectTxnIDStmt.QueryRowContext(ctx).Scan(&txnID)
+ return
+}