1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071 |
- // +build go1.8
- package mssql
- import (
- "context"
- "database/sql"
- "database/sql/driver"
- "errors"
- )
- var _ driver.Pinger = &MssqlConn{}
- // Ping is used to check if the remote server is avaiable and satisfies the Pinger interface.
- func (c *MssqlConn) Ping(ctx context.Context) error {
- stmt := &MssqlStmt{c, `select 1;`, 0, nil}
- _, err := stmt.ExecContext(ctx, nil)
- return err
- }
- var _ driver.ConnBeginTx = &MssqlConn{}
- // BeginTx satisfies ConnBeginTx.
- func (c *MssqlConn) BeginTx(ctx context.Context, opts driver.TxOptions) (driver.Tx, error) {
- if opts.ReadOnly {
- return nil, errors.New("Read-only transactions are not supported")
- }
- var tdsIsolation isoLevel
- switch sql.IsolationLevel(opts.Isolation) {
- case sql.LevelDefault:
- tdsIsolation = isolationUseCurrent
- case sql.LevelReadUncommitted:
- tdsIsolation = isolationReadUncommited
- case sql.LevelReadCommitted:
- tdsIsolation = isolationReadCommited
- case sql.LevelWriteCommitted:
- return nil, errors.New("LevelWriteCommitted isolation level is not supported")
- case sql.LevelRepeatableRead:
- tdsIsolation = isolationRepeatableRead
- case sql.LevelSnapshot:
- tdsIsolation = isolationSnapshot
- case sql.LevelSerializable:
- tdsIsolation = isolationSerializable
- case sql.LevelLinearizable:
- return nil, errors.New("LevelLinearizable isolation level is not supported")
- default:
- return nil, errors.New("Isolation level is not supported or unknown")
- }
- return c.begin(ctx, tdsIsolation)
- }
- func (c *MssqlConn) PrepareContext(ctx context.Context, query string) (driver.Stmt, error) {
- return c.prepareContext(ctx, query)
- }
- func (s *MssqlStmt) QueryContext(ctx context.Context, args []driver.NamedValue) (driver.Rows, error) {
- list := make([]namedValue, len(args))
- for i, nv := range args {
- list[i] = namedValue(nv)
- }
- return s.queryContext(ctx, list)
- }
- func (s *MssqlStmt) ExecContext(ctx context.Context, args []driver.NamedValue) (driver.Result, error) {
- list := make([]namedValue, len(args))
- for i, nv := range args {
- list[i] = namedValue(nv)
- }
- return s.exec(ctx, list)
- }
|