From 648f05c2045c2834a78a703583d08ee9d1ecdcfe Mon Sep 17 00:00:00 2001 From: Kegan Dougal Date: Wed, 12 Feb 2020 16:06:54 +0000 Subject: [PATCH] Support sending messages --- roomserver/storage/sqlite3/sql.go | 10 +++++--- .../storage/sqlite3/state_block_table.go | 23 +++++++++++++++---- 2 files changed, 25 insertions(+), 8 deletions(-) diff --git a/roomserver/storage/sqlite3/sql.go b/roomserver/storage/sqlite3/sql.go index c424a2fe9..408b46e0b 100644 --- a/roomserver/storage/sqlite3/sql.go +++ b/roomserver/storage/sqlite3/sql.go @@ -62,10 +62,14 @@ func (s *statements) prepare(db *sql.DB) error { // Hack of the century func queryVariadic(count int) string { + return queryVariadicOffset(count, 0) +} + +func queryVariadicOffset(count, offset int) string { str := "(" - for i := 1; i <= count; i++ { - str += fmt.Sprintf("$%d", i) - if i < count { + for i := 0; i < count; i++ { + str += fmt.Sprintf("$%d", i+offset+1) + if i < (count - 1) { str += ", " } } diff --git a/roomserver/storage/sqlite3/state_block_table.go b/roomserver/storage/sqlite3/state_block_table.go index 9fd497a2c..44d9fc4db 100644 --- a/roomserver/storage/sqlite3/state_block_table.go +++ b/roomserver/storage/sqlite3/state_block_table.go @@ -204,12 +204,25 @@ func (s *stateBlockStatements) bulkSelectFilteredStateBlockEntries( sort.Sort(tuples) eventTypeNIDArray, eventStateKeyNIDArray := tuples.typesAndStateKeysAsArrays() - selectStmt := common.TxStmt(txn, s.bulkSelectFilteredStateBlockEntriesStmt) - rows, err := selectStmt.QueryContext( + sqlStatement := strings.Replace(bulkSelectFilteredStateBlockEntriesSQL, "($1)", queryVariadic(len(stateBlockNIDs)), 1) + sqlStatement = strings.Replace(sqlStatement, "($2)", queryVariadicOffset(len(eventTypeNIDArray), len(stateBlockNIDs)), 1) + sqlStatement = strings.Replace(sqlStatement, "($3)", queryVariadicOffset(len(eventStateKeyNIDArray), len(stateBlockNIDs)+len(eventTypeNIDArray)), 1) + + var params []interface{} + for _, val := range stateBlockNIDs { + params = append(params, int64(val)) + } + for _, val := range eventTypeNIDArray { + params = append(params, val) + } + for _, val := range eventStateKeyNIDArray { + params = append(params, val) + } + + rows, err := s.db.QueryContext( ctx, - stateBlockNIDsAsArray(stateBlockNIDs), - eventTypeNIDArray, - sqliteIn(eventStateKeyNIDArray), + sqlStatement, + params..., ) if err != nil { fmt.Println("bulkSelectFilteredStateBlockEntries s.bulkSelectFilteredStateBlockEntriesStmt.QueryContext:", err)