Files
EdgeNode/internal/utils/dbs/stmt.go

107 lines
2.3 KiB
Go
Raw Permalink Normal View History

2024-05-17 18:30:33 +08:00
// Copyright 2022 GoEdge goedge.cdn@gmail.com. All rights reserved.
package dbs
import (
"context"
"database/sql"
2024-07-27 15:42:50 +08:00
2023-10-06 20:56:27 +08:00
fsutils "github.com/TeaOSLab/EdgeNode/internal/utils/fs"
)
type Stmt struct {
db *DB
rawStmt *sql.Stmt
query string
enableStat bool
}
func NewStmt(db *DB, rawStmt *sql.Stmt, query string) *Stmt {
return &Stmt{
db: db,
rawStmt: rawStmt,
query: query,
}
}
func (this *Stmt) EnableStat() {
this.enableStat = true
}
2023-10-06 20:56:27 +08:00
func (this *Stmt) ExecContext(ctx context.Context, args ...any) (result sql.Result, err error) {
// check database status
if this.db.BeginUpdating() {
defer this.db.EndUpdating()
} else {
return nil, errDBIsClosed
}
if this.enableStat {
defer SharedQueryStatManager.AddQuery(this.query).End()
}
fsutils.WriterLimiter.Ack()
2023-10-06 20:56:27 +08:00
result, err = this.rawStmt.ExecContext(ctx, args...)
fsutils.WriterLimiter.Release()
2023-10-06 20:56:27 +08:00
return
}
2023-10-06 20:56:27 +08:00
func (this *Stmt) Exec(args ...any) (result sql.Result, err error) {
// check database status
if this.db.BeginUpdating() {
defer this.db.EndUpdating()
} else {
return nil, errDBIsClosed
}
if this.enableStat {
defer SharedQueryStatManager.AddQuery(this.query).End()
}
2023-10-06 20:56:27 +08:00
fsutils.WriterLimiter.Ack()
2023-10-06 20:56:27 +08:00
result, err = this.rawStmt.Exec(args...)
fsutils.WriterLimiter.Release()
2023-10-06 20:56:27 +08:00
return
}
2023-08-09 11:17:13 +08:00
func (this *Stmt) QueryContext(ctx context.Context, args ...any) (*sql.Rows, error) {
if this.enableStat {
defer SharedQueryStatManager.AddQuery(this.query).End()
}
return this.rawStmt.QueryContext(ctx, args...)
}
2023-08-09 11:17:13 +08:00
func (this *Stmt) Query(args ...any) (*sql.Rows, error) {
if this.enableStat {
defer SharedQueryStatManager.AddQuery(this.query).End()
}
2023-08-09 11:17:13 +08:00
rows, err := this.rawStmt.Query(args...)
if err != nil {
return nil, err
}
var rowsErr = rows.Err()
if rowsErr != nil {
_ = rows.Close()
return nil, rowsErr
}
return rows, nil
}
2023-08-09 11:17:13 +08:00
func (this *Stmt) QueryRowContext(ctx context.Context, args ...any) *sql.Row {
if this.enableStat {
defer SharedQueryStatManager.AddQuery(this.query).End()
}
return this.rawStmt.QueryRowContext(ctx, args...)
}
2023-08-09 11:17:13 +08:00
func (this *Stmt) QueryRow(args ...any) *sql.Row {
if this.enableStat {
defer SharedQueryStatManager.AddQuery(this.query).End()
}
return this.rawStmt.QueryRow(args...)
}
func (this *Stmt) Close() error {
return this.rawStmt.Close()
}