denisenkom / go-mssqldb

Microsoft SQL server driver written in go language
BSD 3-Clause "New" or "Revised" License
1.82k stars 495 forks source link

Implement sqlexp Messages for Query/QueryContext #690

Closed shueybubbles closed 2 years ago

shueybubbles commented 3 years ago

This is a minimally invasive addition to address #221.
For existing callers, the only change is the log will include messages for language and database changes. Apps that want to take advantage of https://github.com/golang-sql/sqlexp can now write a message loop to retrieve data sets, errors, and messages.

A sample loop might look like this:

        db := sql.OpenDB(connector)
    defer db.Close()
    retmsg := &sqlexp.ReturnMessage{}
    ctx := context.Background()
    rows, err := db.QueryContext(ctx, `select name from sys.tables
PRINT N'This is a message'
select 199
RAISERROR (N'Testing!' , 11, 1)
select 300
`, retmsg)
    if err != nil {
        log.Fatalf("QueryContext failed: %v", err)
    }
    active := true
    for active {
        msg := retmsg.Message(ctx)
        switch m := msg.(type) {
        case sqlexp.MsgNotice:
            fmt.Println(m.Message)
        case sqlexp.MsgNext:
            inresult := true
            for inresult {
                inresult = rows.Next()
                                if inresult {
                    cols, err := rows.Columns()
                    if err != nil {
                        log.Fatalf("Columns failed: %v", err)
                    }
                    fmt.Println(cols)
                    var d interface{}
                    rows.Scan(&d)
                    fmt.Println(d)
                }
            }
        case sqlexp.MsgNextResultSet:
            active = rows.NextResultSet()
        case sqlexp.MsgError:
            fmt.Fprintln(os.Stderr, m.Error)
        case sqlexp.MsgRowsAffected:
            fmt.Println("Rows affected:", m.Count)
        }
    }
codecov[bot] commented 2 years ago

Codecov Report

Merging #690 (4cc6bc3) into master (f6fd477) will increase coverage by 0.19%. The diff coverage is 69.02%.

:exclamation: Current head 4cc6bc3 differs from pull request most recent head fab6304. Consider uploading reports for the commit fab6304 to get more accurate results Impacted file tree graph

@@            Coverage Diff             @@
##           master     #690      +/-   ##
==========================================
+ Coverage   70.96%   71.16%   +0.19%     
==========================================
  Files          24       24              
  Lines        5208     5386     +178     
==========================================
+ Hits         3696     3833     +137     
- Misses       1285     1305      +20     
- Partials      227      248      +21     
Impacted Files Coverage Δ
mssql.go 87.75% <67.42%> (-4.03%) :arrow_down:
token.go 63.62% <70.21%> (+1.77%) :arrow_up:
mssql_go19.go 95.86% <100.00%> (+0.11%) :arrow_up:
tds.go 65.49% <100.00%> (+0.76%) :arrow_up:

Continue to review full report at Codecov.

Legend - Click here to learn more Δ = absolute <relative> (impact), ø = not affected, ? = missing data Powered by Codecov. Last update f6fd477...fab6304. Read the comment docs.

shueybubbles commented 2 years ago

I have a consumer application for this feature. See https://github.com/microsoft/go-sqlcmd/blob/c3cd43b19dd77c0fc6761b552c03e599b7e7b338/pkg/sqlcmd/sqlcmd.go#L452

kardianos commented 2 years ago

I just merged azure. If you could update?