From d5a8a1ff9671b81dae098b75f37431669daf7ae4 Mon Sep 17 00:00:00 2001 From: SingingBush Date: Fri, 12 Feb 2021 00:05:22 +0000 Subject: [PATCH] cater for sqlserver and oracle being defined in connection string (both will be ODBC driver) --- README.md | 16 +++++++++++++++- source/ddbc/common.d | 6 +++--- source/ddbc/core.d | 17 ++++++++++++++++- 3 files changed, 34 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 737594e..6aba338 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ DDBC [![Gitter](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/buggins/ddbc?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) -![CI](https://github.com/buggins/ddbc/workflows/CI/badge.svg) +[![CI](https://github.com/buggins/ddbc/workflows/CI/badge.svg)](https://github.com/buggins/ddbc/actions?query=workflow%3ACI) [![Build Status](https://travis-ci.org/buggins/ddbc.svg?branch=master)](https://travis-ci.org/buggins/ddbc) @@ -148,9 +148,23 @@ ddbc:postgresql://127.0.0.1:5432 ### Microsoft SQL Server (via ODBC) ``` +ddbc:sqlserver://localhost,1433?user=sa,password=bbk4k77JKH88g54,driver=FreeTDS + +or + ddbc:odbc://localhost,1433?user=sa,password=bbk4k77JKH88g54,driver=FreeTDS ``` +### Oracle (via ODBC) **experimental** + +``` +ddbc:oracle://localhost:1521?user=sa,password=bbk4k77JKH88g54,driver=FreeTDS + +or + +ddbc:odbc://localhost:1521?user=sa,password=bbk4k77JKH88g54,driver=FreeTDS +``` + ### DSN connections for Microsoft SQL Server The correct format to use for a dsn connection string is `odbc://?dsn=`. Note that the server portion before the `?` is empty, so the default server for diff --git a/source/ddbc/common.d b/source/ddbc/common.d index 4ff59ea..2ffd93d 100644 --- a/source/ddbc/common.d +++ b/source/ddbc/common.d @@ -552,9 +552,9 @@ string extractDriverNameFromURL(string url) { url = stripDdbcPrefix(url); import std.string; int colonPos = cast(int)url.indexOf(":"); - if (colonPos < 0) - return url; - return url[0 .. colonPos]; + + string dbName = colonPos < 0 ? url : url[0 .. colonPos]; + return dbName == "sqlserver" || dbName == "oracle" ? "odbc" : dbName; } /// extract parameters from URL string to string[string] map, update url to strip params diff --git a/source/ddbc/core.d b/source/ddbc/core.d index 096b7f2..a039b1c 100644 --- a/source/ddbc/core.d +++ b/source/ddbc/core.d @@ -411,7 +411,7 @@ string makeDDBCUrl(string driverName, string[string] params) { string makeDDBCUrl(string driverName, string host = null, int port = 0, string dbName = null, string[string] params = null) { import std.algorithm.searching : canFind; - enforce(canFind(["sqlite", "postgresql", "mysql", "odbc"], driverName), "driver must be one of sqlite|postgresql|mysql|odbc"); + enforce(canFind(["sqlite", "postgresql", "mysql", "sqlserver", "oracle", "odbc"], driverName), "driver must be one of sqlite|postgresql|mysql|sqlserver|oracle|odbc"); import std.conv : to; char[] res; res.assumeSafeAppend; @@ -462,6 +462,21 @@ private unittest { assert(url == "ddbc:mysql://127.0.0.1:3306/mydb", "MySQL URL is not correct: "~url); } +private unittest { + string url = makeDDBCUrl("sqlserver", "127.0.0.1", 1433, "mydb"); + assert(url == "ddbc:sqlserver://127.0.0.1:1433/mydb", "SQL Server URL is not correct: "~url); +} + +private unittest { + string url = makeDDBCUrl("oracle", "127.0.0.1", 1521, "mydb"); + assert(url == "ddbc:oracle://127.0.0.1:1521/mydb", "Oracle URL is not correct: "~url); +} + +private unittest { + string url = makeDDBCUrl("odbc", "127.0.0.1", 3306, "mydb"); + assert(url == "ddbc:odbc://127.0.0.1:3306/mydb", "ODBC URL is not correct: "~url); +} + private unittest { string[string] params; params["user"] = "sa";