| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071 | // +build go1.8package mssqlimport (	"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)}
 |