- Timestamp:
- Oct 15, 2021, 8:39:14 PM (4 years ago)
- Location:
- trunk
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/db_postgres.go
r640 r645 2 2 3 3 import ( 4 "context" 4 5 "database/sql" 5 6 "errors" … … 11 12 _ "github.com/lib/pq" 12 13 ) 14 15 const postgresQueryTimeout = 5 * time.Second 13 16 14 17 const postgresConfigSchema = ` … … 146 149 147 150 func (db *PostgresDB) Stats() (*DatabaseStats, error) { 151 ctx, cancel := context.WithTimeout(context.TODO(), postgresQueryTimeout) 152 defer cancel() 153 148 154 var stats DatabaseStats 149 row := db.db.QueryRow (`SELECT155 row := db.db.QueryRowContext(ctx, `SELECT 150 156 (SELECT COUNT(*) FROM "User") AS users, 151 157 (SELECT COUNT(*) FROM "Network") AS networks, … … 159 165 160 166 func (db *PostgresDB) ListUsers() ([]User, error) { 161 rows, err := db.db.Query(`SELECT id, username, password, admin, realname FROM "User"`) 167 ctx, cancel := context.WithTimeout(context.TODO(), postgresQueryTimeout) 168 defer cancel() 169 170 rows, err := db.db.QueryContext(ctx, 171 `SELECT id, username, password, admin, realname FROM "User"`) 162 172 if err != nil { 163 173 return nil, err … … 184 194 185 195 func (db *PostgresDB) GetUser(username string) (*User, error) { 196 ctx, cancel := context.WithTimeout(context.TODO(), postgresQueryTimeout) 197 defer cancel() 198 186 199 user := &User{Username: username} 187 200 188 201 var password, realname sql.NullString 189 row := db.db.QueryRow (202 row := db.db.QueryRowContext(ctx, 190 203 `SELECT id, password, admin, realname FROM "User" WHERE username = $1`, 191 204 username) … … 199 212 200 213 func (db *PostgresDB) StoreUser(user *User) error { 214 ctx, cancel := context.WithTimeout(context.TODO(), postgresQueryTimeout) 215 defer cancel() 216 201 217 password := toNullString(user.Password) 202 218 realname := toNullString(user.Realname) … … 204 220 var err error 205 221 if user.ID == 0 { 206 err = db.db.QueryRow (`222 err = db.db.QueryRowContext(ctx, ` 207 223 INSERT INTO "User" (username, password, admin, realname) 208 224 VALUES ($1, $2, $3, $4) … … 210 226 user.Username, password, user.Admin, realname).Scan(&user.ID) 211 227 } else { 212 _, err = db.db.Exec (`228 _, err = db.db.ExecContext(ctx, ` 213 229 UPDATE "User" 214 230 SET password = $1, admin = $2, realname = $3 … … 220 236 221 237 func (db *PostgresDB) DeleteUser(id int64) error { 222 _, err := db.db.Exec(`DELETE FROM "User" WHERE id = $1`, id) 238 ctx, cancel := context.WithTimeout(context.TODO(), postgresQueryTimeout) 239 defer cancel() 240 241 _, err := db.db.ExecContext(ctx, `DELETE FROM "User" WHERE id = $1`, id) 223 242 return err 224 243 } 225 244 226 245 func (db *PostgresDB) ListNetworks(userID int64) ([]Network, error) { 227 rows, err := db.db.Query(` 246 ctx, cancel := context.WithTimeout(context.TODO(), postgresQueryTimeout) 247 defer cancel() 248 249 rows, err := db.db.QueryContext(ctx, ` 228 250 SELECT id, name, addr, nick, username, realname, pass, connect_commands, sasl_mechanism, 229 251 sasl_plain_username, sasl_plain_password, sasl_external_cert, sasl_external_key, enabled … … 266 288 267 289 func (db *PostgresDB) StoreNetwork(userID int64, network *Network) error { 290 ctx, cancel := context.WithTimeout(context.TODO(), postgresQueryTimeout) 291 defer cancel() 292 268 293 netName := toNullString(network.Name) 269 294 netUsername := toNullString(network.Username) … … 290 315 var err error 291 316 if network.ID == 0 { 292 err = db.db.QueryRow (`317 err = db.db.QueryRowContext(ctx, ` 293 318 INSERT INTO "Network" ("user", name, addr, nick, username, realname, pass, connect_commands, 294 319 sasl_mechanism, sasl_plain_username, sasl_plain_password, sasl_external_cert, … … 300 325 network.SASL.External.PrivKeyBlob, network.Enabled).Scan(&network.ID) 301 326 } else { 302 _, err = db.db.Exec (`327 _, err = db.db.ExecContext(ctx, ` 303 328 UPDATE "Network" 304 329 SET name = $2, addr = $3, nick = $4, username = $5, realname = $6, pass = $7, … … 315 340 316 341 func (db *PostgresDB) DeleteNetwork(id int64) error { 317 _, err := db.db.Exec(`DELETE FROM "Network" WHERE id = $1`, id) 342 ctx, cancel := context.WithTimeout(context.TODO(), postgresQueryTimeout) 343 defer cancel() 344 345 _, err := db.db.ExecContext(ctx, `DELETE FROM "Network" WHERE id = $1`, id) 318 346 return err 319 347 } 320 348 321 349 func (db *PostgresDB) ListChannels(networkID int64) ([]Channel, error) { 322 rows, err := db.db.Query(` 350 ctx, cancel := context.WithTimeout(context.TODO(), postgresQueryTimeout) 351 defer cancel() 352 353 rows, err := db.db.QueryContext(ctx, ` 323 354 SELECT id, name, key, detached, detached_internal_msgid, relay_detached, reattach_on, detach_after, 324 355 detach_on … … 351 382 352 383 func (db *PostgresDB) StoreChannel(networkID int64, ch *Channel) error { 384 ctx, cancel := context.WithTimeout(context.TODO(), postgresQueryTimeout) 385 defer cancel() 386 353 387 key := toNullString(ch.Key) 354 388 detachAfter := int64(math.Ceil(ch.DetachAfter.Seconds())) … … 356 390 var err error 357 391 if ch.ID == 0 { 358 err = db.db.QueryRow (`392 err = db.db.QueryRowContext(ctx, ` 359 393 INSERT INTO "Channel" (network, name, key, detached, detached_internal_msgid, relay_detached, reattach_on, 360 394 detach_after, detach_on) … … 364 398 ch.RelayDetached, ch.ReattachOn, detachAfter, ch.DetachOn).Scan(&ch.ID) 365 399 } else { 366 _, err = db.db.Exec (`400 _, err = db.db.ExecContext(ctx, ` 367 401 UPDATE "Channel" 368 402 SET name = $2, key = $3, detached = $4, detached_internal_msgid = $5, … … 376 410 377 411 func (db *PostgresDB) DeleteChannel(id int64) error { 378 _, err := db.db.Exec(`DELETE FROM "Channel" WHERE id = $1`, id) 412 ctx, cancel := context.WithTimeout(context.TODO(), postgresQueryTimeout) 413 defer cancel() 414 415 _, err := db.db.ExecContext(ctx, `DELETE FROM "Channel" WHERE id = $1`, id) 379 416 return err 380 417 } 381 418 382 419 func (db *PostgresDB) ListDeliveryReceipts(networkID int64) ([]DeliveryReceipt, error) { 383 rows, err := db.db.Query(` 420 ctx, cancel := context.WithTimeout(context.TODO(), postgresQueryTimeout) 421 defer cancel() 422 423 rows, err := db.db.QueryContext(ctx, ` 384 424 SELECT id, target, client, internal_msgid 385 425 FROM "DeliveryReceipt" … … 406 446 407 447 func (db *PostgresDB) StoreClientDeliveryReceipts(networkID int64, client string, receipts []DeliveryReceipt) error { 448 ctx, cancel := context.WithTimeout(context.TODO(), postgresQueryTimeout) 449 defer cancel() 450 408 451 tx, err := db.db.Begin() 409 452 if err != nil { … … 412 455 defer tx.Rollback() 413 456 414 _, err = tx.Exec(`DELETE FROM "DeliveryReceipt" WHERE network = $1 AND client = $2`, 457 _, err = tx.ExecContext(ctx, 458 `DELETE FROM "DeliveryReceipt" WHERE network = $1 AND client = $2`, 415 459 networkID, client) 416 460 if err != nil { … … 418 462 } 419 463 420 stmt, err := tx.Prepare (`464 stmt, err := tx.PrepareContext(ctx, ` 421 465 INSERT INTO "DeliveryReceipt" (network, target, client, internal_msgid) 422 466 VALUES ($1, $2, $3, $4) … … 429 473 for i := range receipts { 430 474 rcpt := &receipts[i] 431 err := stmt.QueryRow(networkID, rcpt.Target, client, rcpt.InternalMsgID).Scan(&rcpt.ID) 475 err := stmt. 476 QueryRowContext(ctx, networkID, rcpt.Target, client, rcpt.InternalMsgID). 477 Scan(&rcpt.ID) 432 478 if err != nil { 433 479 return err -
trunk/db_sqlite.go
r620 r645 2 2 3 3 import ( 4 "context" 4 5 "database/sql" 5 6 "fmt" … … 11 12 _ "github.com/mattn/go-sqlite3" 12 13 ) 14 15 const sqliteQueryTimeout = 5 * time.Second 13 16 14 17 const sqliteSchema = ` … … 210 213 defer db.lock.RUnlock() 211 214 215 ctx, cancel := context.WithTimeout(context.TODO(), sqliteQueryTimeout) 216 defer cancel() 217 212 218 var stats DatabaseStats 213 row := db.db.QueryRow (`SELECT219 row := db.db.QueryRowContext(ctx, `SELECT 214 220 (SELECT COUNT(*) FROM User) AS users, 215 221 (SELECT COUNT(*) FROM Network) AS networks, … … 233 239 defer db.lock.RUnlock() 234 240 235 rows, err := db.db.Query("SELECT id, username, password, admin, realname FROM User") 241 ctx, cancel := context.WithTimeout(context.TODO(), sqliteQueryTimeout) 242 defer cancel() 243 244 rows, err := db.db.QueryContext(ctx, 245 "SELECT id, username, password, admin, realname FROM User") 236 246 if err != nil { 237 247 return nil, err … … 261 271 defer db.lock.RUnlock() 262 272 273 ctx, cancel := context.WithTimeout(context.TODO(), sqliteQueryTimeout) 274 defer cancel() 275 263 276 user := &User{Username: username} 264 277 265 278 var password, realname sql.NullString 266 row := db.db.QueryRow("SELECT id, password, admin, realname FROM User WHERE username = ?", username) 279 row := db.db.QueryRowContext(ctx, 280 "SELECT id, password, admin, realname FROM User WHERE username = ?", 281 username) 267 282 if err := row.Scan(&user.ID, &password, &user.Admin, &realname); err != nil { 268 283 return nil, err … … 276 291 db.lock.Lock() 277 292 defer db.lock.Unlock() 293 294 ctx, cancel := context.WithTimeout(context.TODO(), sqliteQueryTimeout) 295 defer cancel() 278 296 279 297 args := []interface{}{ … … 286 304 var err error 287 305 if user.ID != 0 { 288 _, err = db.db.Exec("UPDATE User SET password = :password, admin = :admin, realname = :realname WHERE username = :username", args...) 306 _, err = db.db.ExecContext(ctx, ` 307 UPDATE User SET password = :password, admin = :admin, 308 realname = :realname WHERE username = :username`, 309 args...) 289 310 } else { 290 311 var res sql.Result 291 res, err = db.db.Exec("INSERT INTO User(username, password, admin, realname) VALUES (:username, :password, :admin, :realname)", args...) 312 res, err = db.db.ExecContext(ctx, ` 313 INSERT INTO 314 User(username, password, admin, realname) 315 VALUES (:username, :password, :admin, :realname)`, 316 args...) 292 317 if err != nil { 293 318 return err … … 303 328 defer db.lock.Unlock() 304 329 330 ctx, cancel := context.WithTimeout(context.TODO(), sqliteQueryTimeout) 331 defer cancel() 332 305 333 tx, err := db.db.Begin() 306 334 if err != nil { … … 309 337 defer tx.Rollback() 310 338 311 _, err = tx.Exec (`DELETE FROM DeliveryReceipt339 _, err = tx.ExecContext(ctx, `DELETE FROM DeliveryReceipt 312 340 WHERE id IN ( 313 341 SELECT DeliveryReceipt.id … … 320 348 } 321 349 322 _, err = tx.Exec (`DELETE FROM Channel350 _, err = tx.ExecContext(ctx, `DELETE FROM Channel 323 351 WHERE id IN ( 324 352 SELECT Channel.id … … 331 359 } 332 360 333 _, err = tx.Exec ("DELETE FROM Network WHERE user = ?", id)334 if err != nil { 335 return err 336 } 337 338 _, err = tx.Exec ("DELETE FROM User WHERE id = ?", id)361 _, err = tx.ExecContext(ctx, "DELETE FROM Network WHERE user = ?", id) 362 if err != nil { 363 return err 364 } 365 366 _, err = tx.ExecContext(ctx, "DELETE FROM User WHERE id = ?", id) 339 367 if err != nil { 340 368 return err … … 348 376 defer db.lock.RUnlock() 349 377 350 rows, err := db.db.Query(`SELECT id, name, addr, nick, username, realname, pass, 378 ctx, cancel := context.WithTimeout(context.TODO(), sqliteQueryTimeout) 379 defer cancel() 380 381 rows, err := db.db.QueryContext(ctx, ` 382 SELECT id, name, addr, nick, username, realname, pass, 351 383 connect_commands, sasl_mechanism, sasl_plain_username, sasl_plain_password, 352 384 sasl_external_cert, sasl_external_key, enabled … … 392 424 db.lock.Lock() 393 425 defer db.lock.Unlock() 426 427 ctx, cancel := context.WithTimeout(context.TODO(), sqliteQueryTimeout) 428 defer cancel() 394 429 395 430 var saslMechanism, saslPlainUsername, saslPlainPassword sql.NullString … … 430 465 var err error 431 466 if network.ID != 0 { 432 _, err = db.db.Exec (`467 _, err = db.db.ExecContext(ctx, ` 433 468 UPDATE Network 434 469 SET name = :name, addr = :addr, nick = :nick, username = :username, … … 440 475 } else { 441 476 var res sql.Result 442 res, err = db.db.Exec (`477 res, err = db.db.ExecContext(ctx, ` 443 478 INSERT INTO Network(user, name, addr, nick, username, realname, pass, 444 479 connect_commands, sasl_mechanism, sasl_plain_username, … … 460 495 defer db.lock.Unlock() 461 496 497 ctx, cancel := context.WithTimeout(context.TODO(), sqliteQueryTimeout) 498 defer cancel() 499 462 500 tx, err := db.db.Begin() 463 501 if err != nil { … … 466 504 defer tx.Rollback() 467 505 468 _, err = tx.Exec ("DELETE FROM DeliveryReceipt WHERE network = ?", id)469 if err != nil { 470 return err 471 } 472 473 _, err = tx.Exec ("DELETE FROM Channel WHERE network = ?", id)474 if err != nil { 475 return err 476 } 477 478 _, err = tx.Exec ("DELETE FROM Network WHERE id = ?", id)506 _, err = tx.ExecContext(ctx, "DELETE FROM DeliveryReceipt WHERE network = ?", id) 507 if err != nil { 508 return err 509 } 510 511 _, err = tx.ExecContext(ctx, "DELETE FROM Channel WHERE network = ?", id) 512 if err != nil { 513 return err 514 } 515 516 _, err = tx.ExecContext(ctx, "DELETE FROM Network WHERE id = ?", id) 479 517 if err != nil { 480 518 return err … … 488 526 defer db.lock.RUnlock() 489 527 490 rows, err := db.db.Query(`SELECT 528 ctx, cancel := context.WithTimeout(context.TODO(), sqliteQueryTimeout) 529 defer cancel() 530 531 rows, err := db.db.QueryContext(ctx, `SELECT 491 532 id, name, key, detached, detached_internal_msgid, 492 533 relay_detached, reattach_on, detach_after, detach_on … … 521 562 db.lock.Lock() 522 563 defer db.lock.Unlock() 564 565 ctx, cancel := context.WithTimeout(context.TODO(), sqliteQueryTimeout) 566 defer cancel() 523 567 524 568 args := []interface{}{ … … 538 582 var err error 539 583 if ch.ID != 0 { 540 _, err = db.db.Exec (`UPDATE Channel584 _, err = db.db.ExecContext(ctx, `UPDATE Channel 541 585 SET network = :network, name = :name, key = :key, detached = :detached, 542 586 detached_internal_msgid = :detached_internal_msgid, relay_detached = :relay_detached, … … 545 589 } else { 546 590 var res sql.Result 547 res, err = db.db.Exec (`INSERT INTO Channel(network, name, key, detached, detached_internal_msgid, relay_detached, reattach_on, detach_after, detach_on)591 res, err = db.db.ExecContext(ctx, `INSERT INTO Channel(network, name, key, detached, detached_internal_msgid, relay_detached, reattach_on, detach_after, detach_on) 548 592 VALUES (:network, :name, :key, :detached, :detached_internal_msgid, :relay_detached, :reattach_on, :detach_after, :detach_on)`, args...) 549 593 if err != nil { … … 559 603 defer db.lock.Unlock() 560 604 561 _, err := db.db.Exec("DELETE FROM Channel WHERE id = ?", id) 605 ctx, cancel := context.WithTimeout(context.TODO(), sqliteQueryTimeout) 606 defer cancel() 607 608 _, err := db.db.ExecContext(ctx, "DELETE FROM Channel WHERE id = ?", id) 562 609 return err 563 610 } … … 567 614 defer db.lock.RUnlock() 568 615 569 rows, err := db.db.Query(`SELECT id, target, client, internal_msgid 616 ctx, cancel := context.WithTimeout(context.TODO(), sqliteQueryTimeout) 617 defer cancel() 618 619 rows, err := db.db.QueryContext(ctx, ` 620 SELECT id, target, client, internal_msgid 570 621 FROM DeliveryReceipt 571 622 WHERE network = ?`, networkID) … … 596 647 defer db.lock.Unlock() 597 648 649 ctx, cancel := context.WithTimeout(context.TODO(), sqliteQueryTimeout) 650 defer cancel() 651 598 652 tx, err := db.db.Begin() 599 653 if err != nil { … … 602 656 defer tx.Rollback() 603 657 604 _, err = tx.Exec ("DELETE FROM DeliveryReceipt WHERE network = ? AND client IS ?",658 _, err = tx.ExecContext(ctx, "DELETE FROM DeliveryReceipt WHERE network = ? AND client IS ?", 605 659 networkID, toNullString(client)) 606 660 if err != nil { … … 611 665 rcpt := &receipts[i] 612 666 613 res, err := tx.Exec(`INSERT INTO DeliveryReceipt(network, target, client, internal_msgid) 667 res, err := tx.ExecContext(ctx, ` 668 INSERT INTO DeliveryReceipt(network, target, client, internal_msgid) 614 669 VALUES (:network, :target, :client, :internal_msgid)`, 615 670 sql.Named("network", networkID),
Note:
See TracChangeset
for help on using the changeset viewer.