116 lines
3.2 KiB
V
116 lines
3.2 KiB
V
// vtest build: started_mssql?
|
|
module main
|
|
|
|
import db.mssql
|
|
import os
|
|
import time
|
|
|
|
const default_mssql_conn_str = 'Driver={FreeTDS};Server=127.0.0.1;Port=1433;UID=sa;PWD=Vlang12345678!;Database=master;TDS_Version=7.4;ClientCharset=UTF-8'
|
|
|
|
fn test_config_get_conn_str() {
|
|
assert mssql.Config{
|
|
driver: 'ODBC Driver 18 for SQL Server'
|
|
server: 'tcp:localhost'
|
|
uid: 'sa'
|
|
pwd: 'secret'
|
|
dbname: 'master'
|
|
}.get_conn_str() == 'Driver={ODBC Driver 18 for SQL Server};Server=tcp:localhost;UID=sa;PWD=secret;Database=master'
|
|
assert mssql.Config{
|
|
driver: 'FreeTDS'
|
|
server: '127.0.0.1'
|
|
port: 1433
|
|
user: 'sa'
|
|
password: 'secret'
|
|
options: {
|
|
'ClientCharset': 'UTF-8'
|
|
'TDS_Version': '7.4'
|
|
}
|
|
}.get_conn_str() == 'Driver=FreeTDS;Server=127.0.0.1;Port=1433;UID=sa;PWD=secret;ClientCharset=UTF-8;TDS_Version=7.4'
|
|
assert mssql.Config{
|
|
dsn: 'Reporting DB'
|
|
user: 'sa'
|
|
password: 'secret'
|
|
dbname: 'master'
|
|
options: {
|
|
'Encrypt': 'yes'
|
|
'TrustServerCertificate': 'yes'
|
|
}
|
|
}.get_conn_str() == 'DSN={Reporting DB};UID=sa;PWD=secret;Database=master;Encrypt=yes;TrustServerCertificate=yes'
|
|
assert mssql.Config{
|
|
conn_str: 'DSN=Accounting;Trusted_Connection=Yes'
|
|
driver: 'ignored'
|
|
}.get_conn_str() == 'DSN=Accounting;Trusted_Connection=Yes'
|
|
}
|
|
|
|
fn test_row_helpers() {
|
|
row := mssql.Row{
|
|
vals: ['1', 'alice']
|
|
}
|
|
assert row.val(0) == '1'
|
|
assert row.val(1) == 'alice'
|
|
assert row.values() == ['1', 'alice']
|
|
}
|
|
|
|
fn test_connection_and_query() {
|
|
$if !network ? {
|
|
eprintln('> Skipping test ${@FN}, since `-d network` is not passed.')
|
|
eprintln('> This test requires a working sql server running on localhost.')
|
|
return
|
|
}
|
|
|
|
mut conn := connect_with_retry()!
|
|
defer {
|
|
conn.close()
|
|
}
|
|
|
|
conn.query("if object_id('vlang_mssql_test', 'U') is not null drop table vlang_mssql_test") or {}
|
|
defer {
|
|
conn.query("if object_id('vlang_mssql_test', 'U') is not null drop table vlang_mssql_test") or {}
|
|
}
|
|
|
|
create_result := conn.query('create table vlang_mssql_test (
|
|
id int identity(1,1) primary key,
|
|
name varchar(32) not null
|
|
)')!
|
|
assert create_result.rows == []mssql.Row{}
|
|
|
|
first_insert := conn.query("insert into vlang_mssql_test (name) values ('alice')")!
|
|
assert first_insert.rows == []mssql.Row{}
|
|
assert first_insert.num_rows_affected == 1
|
|
|
|
second_insert := conn.query("insert into vlang_mssql_test (name) values ('bob')")!
|
|
assert second_insert.rows == []mssql.Row{}
|
|
assert second_insert.num_rows_affected == 1
|
|
|
|
result := conn.query('select id, name from vlang_mssql_test order by id')!
|
|
assert result.rows == [
|
|
mssql.Row{
|
|
vals: ['1', 'alice']
|
|
},
|
|
mssql.Row{
|
|
vals: ['2', 'bob']
|
|
},
|
|
]
|
|
}
|
|
|
|
fn connect_with_retry() !mssql.Connection {
|
|
conn_str := os.getenv_opt('VMSSQL_CONN_STR') or { default_mssql_conn_str }
|
|
mut last_err := 'could not connect to sql server'
|
|
for _ in 0 .. 30 {
|
|
mut conn := mssql.Connection{}
|
|
if _ := conn.connect(conn_str) {
|
|
// SQL Server can accept a connection before it is ready to execute statements.
|
|
if _ := conn.query('select 1') {
|
|
return conn
|
|
} else {
|
|
last_err = err.msg()
|
|
conn.close()
|
|
}
|
|
} else {
|
|
last_err = err.msg()
|
|
}
|
|
time.sleep(2 * time.second)
|
|
}
|
|
return error(last_err)
|
|
}
|