2021-01-22 14:55:08 +00:00
// Copyright 2020 The Matrix.org Foundation C.I.C.
//
// 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 postgres
import (
"context"
"database/sql"
"time"
2021-11-24 10:45:23 +00:00
"github.com/matrix-org/dendrite/federationapi/types"
2021-01-22 14:55:08 +00:00
"github.com/matrix-org/dendrite/internal"
"github.com/matrix-org/dendrite/internal/sqlutil"
2023-04-19 14:50:33 +00:00
"github.com/matrix-org/gomatrixserverlib/spec"
2021-01-22 14:55:08 +00:00
)
const outboundPeeksSchema = `
CREATE TABLE IF NOT EXISTS federationsender_outbound_peeks (
room_id TEXT NOT NULL ,
server_name TEXT NOT NULL ,
peek_id TEXT NOT NULL ,
creation_ts BIGINT NOT NULL ,
renewed_ts BIGINT NOT NULL ,
renewal_interval BIGINT NOT NULL ,
UNIQUE ( room_id , server_name , peek_id )
) ;
`
const insertOutboundPeekSQL = "" +
"INSERT INTO federationsender_outbound_peeks (room_id, server_name, peek_id, creation_ts, renewed_ts, renewal_interval) VALUES ($1, $2, $3, $4, $5, $6)"
const selectOutboundPeekSQL = "" +
"SELECT room_id, server_name, peek_id, creation_ts, renewed_ts, renewal_interval FROM federationsender_outbound_peeks WHERE room_id = $1 and server_name = $2 and peek_id = $3"
const selectOutboundPeeksSQL = "" +
2022-12-22 09:56:20 +00:00
"SELECT room_id, server_name, peek_id, creation_ts, renewed_ts, renewal_interval FROM federationsender_outbound_peeks WHERE room_id = $1 ORDER BY creation_ts"
2021-01-22 14:55:08 +00:00
const renewOutboundPeekSQL = "" +
"UPDATE federationsender_outbound_peeks SET renewed_ts=$1, renewal_interval=$2 WHERE room_id = $3 and server_name = $4 and peek_id = $5"
const deleteOutboundPeekSQL = "" +
2022-12-22 09:56:20 +00:00
"DELETE FROM federationsender_outbound_peeks WHERE room_id = $1 and server_name = $2 and peek_id = $3"
2021-01-22 14:55:08 +00:00
const deleteOutboundPeeksSQL = "" +
"DELETE FROM federationsender_outbound_peeks WHERE room_id = $1"
type outboundPeeksStatements struct {
db * sql . DB
insertOutboundPeekStmt * sql . Stmt
selectOutboundPeekStmt * sql . Stmt
selectOutboundPeeksStmt * sql . Stmt
renewOutboundPeekStmt * sql . Stmt
deleteOutboundPeekStmt * sql . Stmt
deleteOutboundPeeksStmt * sql . Stmt
}
func NewPostgresOutboundPeeksTable ( db * sql . DB ) ( s * outboundPeeksStatements , err error ) {
s = & outboundPeeksStatements {
db : db ,
}
_ , err = db . Exec ( outboundPeeksSchema )
if err != nil {
return
}
2022-12-22 09:56:20 +00:00
return s , sqlutil . StatementList {
{ & s . insertOutboundPeekStmt , insertOutboundPeekSQL } ,
{ & s . selectOutboundPeekStmt , selectOutboundPeekSQL } ,
{ & s . selectOutboundPeeksStmt , selectOutboundPeeksSQL } ,
{ & s . renewOutboundPeekStmt , renewOutboundPeekSQL } ,
{ & s . deleteOutboundPeeksStmt , deleteOutboundPeeksSQL } ,
{ & s . deleteOutboundPeekStmt , deleteOutboundPeekSQL } ,
} . Prepare ( db )
2021-01-22 14:55:08 +00:00
}
func ( s * outboundPeeksStatements ) InsertOutboundPeek (
2023-04-19 14:50:33 +00:00
ctx context . Context , txn * sql . Tx , serverName spec . ServerName , roomID , peekID string , renewalInterval int64 ,
2021-01-22 14:55:08 +00:00
) ( err error ) {
nowMilli := time . Now ( ) . UnixNano ( ) / int64 ( time . Millisecond )
stmt := sqlutil . TxStmt ( txn , s . insertOutboundPeekStmt )
_ , err = stmt . ExecContext ( ctx , roomID , serverName , peekID , nowMilli , nowMilli , renewalInterval )
return
}
func ( s * outboundPeeksStatements ) RenewOutboundPeek (
2023-04-19 14:50:33 +00:00
ctx context . Context , txn * sql . Tx , serverName spec . ServerName , roomID , peekID string , renewalInterval int64 ,
2021-01-22 14:55:08 +00:00
) ( err error ) {
nowMilli := time . Now ( ) . UnixNano ( ) / int64 ( time . Millisecond )
_ , err = sqlutil . TxStmt ( txn , s . renewOutboundPeekStmt ) . ExecContext ( ctx , nowMilli , renewalInterval , roomID , serverName , peekID )
return
}
func ( s * outboundPeeksStatements ) SelectOutboundPeek (
2023-04-19 14:50:33 +00:00
ctx context . Context , txn * sql . Tx , serverName spec . ServerName , roomID , peekID string ,
2021-01-22 14:55:08 +00:00
) ( * types . OutboundPeek , error ) {
row := sqlutil . TxStmt ( txn , s . selectOutboundPeeksStmt ) . QueryRowContext ( ctx , roomID )
outboundPeek := types . OutboundPeek { }
err := row . Scan (
& outboundPeek . RoomID ,
& outboundPeek . ServerName ,
& outboundPeek . PeekID ,
& outboundPeek . CreationTimestamp ,
& outboundPeek . RenewedTimestamp ,
& outboundPeek . RenewalInterval ,
)
if err == sql . ErrNoRows {
return nil , nil
}
if err != nil {
return nil , err
}
return & outboundPeek , nil
}
func ( s * outboundPeeksStatements ) SelectOutboundPeeks (
ctx context . Context , txn * sql . Tx , roomID string ,
) ( outboundPeeks [ ] types . OutboundPeek , err error ) {
rows , err := sqlutil . TxStmt ( txn , s . selectOutboundPeeksStmt ) . QueryContext ( ctx , roomID )
if err != nil {
return
}
defer internal . CloseAndLogIfError ( ctx , rows , "SelectOutboundPeeks: rows.close() failed" )
for rows . Next ( ) {
outboundPeek := types . OutboundPeek { }
if err = rows . Scan (
& outboundPeek . RoomID ,
& outboundPeek . ServerName ,
& outboundPeek . PeekID ,
& outboundPeek . CreationTimestamp ,
& outboundPeek . RenewedTimestamp ,
& outboundPeek . RenewalInterval ,
) ; err != nil {
return
}
outboundPeeks = append ( outboundPeeks , outboundPeek )
}
return outboundPeeks , rows . Err ( )
}
func ( s * outboundPeeksStatements ) DeleteOutboundPeek (
2023-04-19 14:50:33 +00:00
ctx context . Context , txn * sql . Tx , serverName spec . ServerName , roomID , peekID string ,
2021-01-22 14:55:08 +00:00
) ( err error ) {
_ , err = sqlutil . TxStmt ( txn , s . deleteOutboundPeekStmt ) . ExecContext ( ctx , roomID , serverName , peekID )
return
}
func ( s * outboundPeeksStatements ) DeleteOutboundPeeks (
ctx context . Context , txn * sql . Tx , roomID string ,
) ( err error ) {
_ , err = sqlutil . TxStmt ( txn , s . deleteOutboundPeeksStmt ) . ExecContext ( ctx , roomID )
return
}