package dbwrapper import ( "context" "database/sql" _ "github.com/microsoft/go-mssqldb" ) type mssqlRowResult struct { columns []string rows *sql.Rows } func (mr *mssqlRowResult) Close() error { return mr.rows.Close() } func (mr *mssqlRowResult) Columns() ([]string, error) { if mr.columns != nil { return mr.columns, nil } return mr.rows.Columns() } func (mr *mssqlRowResult) Err() error { return mr.rows.Err() } func (mr *mssqlRowResult) Next() bool { return mr.rows.Next() } func (mr *mssqlRowResult) Scan(dest ...any) error { return mr.rows.Scan(dest...) } func (mr *mssqlRowResult) Values() ([]any, error) { columns, err := mr.Columns() if err != nil { return nil, err } rowValues := make([]any, len(columns)) scanArgs := make([]any, len(columns)) for i := range rowValues { scanArgs[i] = &rowValues[i] } if err := mr.rows.Scan(scanArgs...); err != nil { return nil, err } return rowValues, nil } type mssqlDbWrapper struct { db *sql.DB dialect string } func (mw *mssqlDbWrapper) Connect(ctx context.Context, dbUrl string) error { db, err := sql.Open("sqlserver", dbUrl) if err != nil { return err } if err := db.PingContext(ctx); err != nil { if err := db.Close(); err != nil { return err } return err } mw.db = db return nil } func (mw *mssqlDbWrapper) Close() error { return mw.db.Close() } func (mw *mssqlDbWrapper) Exec(ctx context.Context, query string, args ...any) (ExecResult, error) { result, execErr := mw.db.ExecContext(ctx, query, args...) if execErr != nil { return ExecResult{}, execErr } affectedRows, err := result.RowsAffected() if err != nil { return ExecResult{}, err } return ExecResult{AffectedRows: affectedRows}, nil } func (mw *mssqlDbWrapper) GetDialect() string { return mw.dialect } func (mw *mssqlDbWrapper) Query(ctx context.Context, query string, args ...any) (RowsResult, error) { rows, err := mw.db.QueryContext(ctx, query, args...) if err != nil { return nil, err } return &mssqlRowResult{columns: nil, rows: rows}, nil } func (mw *mssqlDbWrapper) SaveMassive(ctx context.Context, schema string, table string, columnNames []string, rows [][]any) (int64, error) { return 0, MethodNotSupported }