From a25d477cdb8f1ba49b3b5e9d931f808ae45b4853 Mon Sep 17 00:00:00 2001
From: Kegsay <kegan@matrix.org>
Date: Wed, 13 May 2020 17:28:42 +0100
Subject: Initial syncapi storage refactor to share pq/sqlite code (#1030)

* Initial syncapi storage refactor to share pq/sqlite code

This goes down a different route than https://github.com/matrix-org/dendrite/pull/985
which tried to even reduce the boilerplate of `ExecContext` etc. The previous pattern
fails badly when there are subtle differences in parameters and hence the shared
boilerplate to read from `QueryContext` breaks. Rather than attacking it at that level,
the main place where we want to reuse code is for the `syncserver.go` itself - the
database implementation which has lots of complex logic. So instead, this commit:
 - Makes `invites_table.go` an interface.
 - Makes `SyncServerDatasource` use that interface
 - This means some functions are now identical for pq/sqlite, so factor them out
   to a temporary `shared.Database` struct which will grow until it replaces all of
   `SyncServerDatasource`.

* Missing files
---
 syncapi/storage/postgres/invites_table.go | 28 +++++++++++++++-------------
 1 file changed, 15 insertions(+), 13 deletions(-)

(limited to 'syncapi/storage/postgres/invites_table.go')

diff --git a/syncapi/storage/postgres/invites_table.go b/syncapi/storage/postgres/invites_table.go
index ca0c64fb..78ca4d6d 100644
--- a/syncapi/storage/postgres/invites_table.go
+++ b/syncapi/storage/postgres/invites_table.go
@@ -21,6 +21,7 @@ import (
 	"encoding/json"
 
 	"github.com/matrix-org/dendrite/common"
+	"github.com/matrix-org/dendrite/syncapi/storage/tables"
 	"github.com/matrix-org/dendrite/syncapi/types"
 	"github.com/matrix-org/gomatrixserverlib"
 )
@@ -66,28 +67,29 @@ type inviteEventsStatements struct {
 	selectMaxInviteIDStmt         *sql.Stmt
 }
 
-func (s *inviteEventsStatements) prepare(db *sql.DB) (err error) {
-	_, err = db.Exec(inviteEventsSchema)
+func NewPostgresInvitesTable(db *sql.DB) (tables.Invites, error) {
+	s := &inviteEventsStatements{}
+	_, err := db.Exec(inviteEventsSchema)
 	if err != nil {
-		return
+		return nil, err
 	}
 	if s.insertInviteEventStmt, err = db.Prepare(insertInviteEventSQL); err != nil {
-		return
+		return nil, err
 	}
 	if s.selectInviteEventsInRangeStmt, err = db.Prepare(selectInviteEventsInRangeSQL); err != nil {
-		return
+		return nil, err
 	}
 	if s.deleteInviteEventStmt, err = db.Prepare(deleteInviteEventSQL); err != nil {
-		return
+		return nil, err
 	}
 	if s.selectMaxInviteIDStmt, err = db.Prepare(selectMaxInviteIDSQL); err != nil {
-		return
+		return nil, err
 	}
-	return
+	return s, nil
 }
 
-func (s *inviteEventsStatements) insertInviteEvent(
-	ctx context.Context, inviteEvent gomatrixserverlib.HeaderedEvent,
+func (s *inviteEventsStatements) InsertInviteEvent(
+	ctx context.Context, txn *sql.Tx, inviteEvent gomatrixserverlib.HeaderedEvent,
 ) (streamPos types.StreamPosition, err error) {
 	var headeredJSON []byte
 	headeredJSON, err = json.Marshal(inviteEvent)
@@ -105,7 +107,7 @@ func (s *inviteEventsStatements) insertInviteEvent(
 	return
 }
 
-func (s *inviteEventsStatements) deleteInviteEvent(
+func (s *inviteEventsStatements) DeleteInviteEvent(
 	ctx context.Context, inviteEventID string,
 ) error {
 	_, err := s.deleteInviteEventStmt.ExecContext(ctx, inviteEventID)
@@ -114,7 +116,7 @@ func (s *inviteEventsStatements) deleteInviteEvent(
 
 // selectInviteEventsInRange returns a map of room ID to invite event for the
 // active invites for the target user ID in the supplied range.
-func (s *inviteEventsStatements) selectInviteEventsInRange(
+func (s *inviteEventsStatements) SelectInviteEventsInRange(
 	ctx context.Context, txn *sql.Tx, targetUserID string, startPos, endPos types.StreamPosition,
 ) (map[string]gomatrixserverlib.HeaderedEvent, error) {
 	stmt := common.TxStmt(txn, s.selectInviteEventsInRangeStmt)
@@ -143,7 +145,7 @@ func (s *inviteEventsStatements) selectInviteEventsInRange(
 	return result, rows.Err()
 }
 
-func (s *inviteEventsStatements) selectMaxInviteID(
+func (s *inviteEventsStatements) SelectMaxInviteID(
 	ctx context.Context, txn *sql.Tx,
 ) (id int64, err error) {
 	var nullableID sql.NullInt64
-- 
cgit v1.2.3