freetds AT lists.ibiblio.org
Subject: FreeTDS Development Group
List archive
[Fwd: [freetds] [patch] Add CS_SERVERADDR, CS_VER_STRING, CS_VERSION to ctlib]
- From: Frediano Ziglio <freddyz77 AT tin.it>
- To: FreeTDS <freetds AT lists.ibiblio.org>
- Subject: [Fwd: [freetds] [patch] Add CS_SERVERADDR, CS_VER_STRING, CS_VERSION to ctlib]
- Date: Sun, 06 Feb 2005 07:49:48 +0100
I found this patch on ML not applied...
------- Messaggio inoltrato -------
Da: Alex Kiesel <alex.kiesel AT document-root.de>
Rispondi-a: FreeTDS Development Group <freetds AT lists.ibiblio.org>
A: freetds AT lists.ibiblio.org
Oggetto: [freetds] [patch] Add CS_SERVERADDR, CS_VER_STRING, CS_VERSION
to ctlib
Data: Tue, 17 Aug 2004 14:23:20 +0200
Hi,
the attached patch includes the following changes:
* ct_config():
- implemented CS_VER_STRING (this returns the following format:
"freetds v0.63.dev.20040814 (non-threadsafe, default tds
version=5.0)"
- implemented CS_VERSION (this returns the following:
"freetds v0.63.dev.20040814"
(both are from tds_get_compiletime_settings())
- on failure return CS_FAIL instead of CS_FALSE to comply with
documentation. Both constants are of same value, so this is not a BC
break.
* ct_con_props():
- implemented CS_SERVERADDR property
this property can be used to override the servername and port from
the interfaces file; this was possible with "server:port" notation
with FreeTDS before, but this method is compatible to Sybase's one.
See also: <1088147142.2082.34.camel AT elanor.peppler.org> on this
list.
Furthermore, one question: shouldn't ct_config(), ct_con_props() and
similar function be changed to return CS_FAIL in case the given property
was unknown (not implemented) or ignored?
Regards,
-Alex
------- Messaggio inoltrato -------
freddy77
Index: include/cspublic.h
===================================================================
RCS file: /cvsroot/freetds/freetds/include/cspublic.h,v
retrieving revision 1.52
diff -u -r1.52 cspublic.h
--- include/cspublic.h 23 Mar 2004 12:05:30 -0000 1.52
+++ include/cspublic.h 17 Aug 2004 12:11:11 -0000
@@ -349,8 +349,10 @@
#define CS_VER_STRING CS_VER_STRING
CS_SERVERNAME,
#define CS_SERVERNAME CS_SERVERNAME
- CS_PORT
+ CS_PORT,
#define CS_PORT CS_PORT
+ CS_SERVERADDR
+#define CS_SERVERADDR CS_SERVERADDR
};
/* Arbitrary precision math operators */
Index: include/tds.h
===================================================================
RCS file: /cvsroot/freetds/freetds/include/tds.h,v
retrieving revision 1.186
diff -u -r1.186 tds.h
--- include/tds.h 6 Aug 2004 08:13:05 -0000 1.186
+++ include/tds.h 17 Aug 2004 12:11:12 -0000
@@ -662,6 +662,7 @@
typedef struct tds_login
{
DSTR server_name;
+ DSTR server_addr;
int port;
TDS_TINYINT major_version; /* TDS version */
TDS_TINYINT minor_version; /* TDS version */
@@ -1180,6 +1181,7 @@
void tds_set_user(TDSLOGIN * tds_login, const char *username);
void tds_set_app(TDSLOGIN * tds_login, const char *application);
void tds_set_host(TDSLOGIN * tds_login, const char *hostname);
+void tds_set_server_addr(TDSLOGIN * tds_login, const char *server_addr);
void tds_set_library(TDSLOGIN * tds_login, const char *library);
void tds_set_server(TDSLOGIN * tds_login, const char *server);
void tds_set_client_charset(TDSLOGIN * tds_login, const char *charset);
Index: src/ctlib/ct.c
===================================================================
RCS file: /cvsroot/freetds/freetds/src/ctlib/ct.c,v
retrieving revision 1.122
diff -u -r1.122 ct.c
--- src/ctlib/ct.c 29 Jul 2004 10:22:40 -0000 1.122
+++ src/ctlib/ct.c 17 Aug 2004 12:11:13 -0000
@@ -297,7 +297,7 @@
tds_login = con->tds_login;
if (action == CS_SET) {
- if (property == CS_USERNAME || property == CS_PASSWORD || property == CS_APPNAME || property == CS_HOSTNAME) {
+ if (property == CS_USERNAME || property == CS_PASSWORD || property == CS_APPNAME || property == CS_HOSTNAME || property == CS_SERVERADDR) {
if (buflen == CS_NULLTERM) {
maxcp = strlen((char *) buffer);
set_buffer = (char *) malloc(maxcp + 1);
@@ -331,6 +331,20 @@
case CS_PORT:
tds_set_port(tds_login, *((int *) buffer));
break;
+ case CS_SERVERADDR: {
+ /* Format of this property: "[hostname] [port]" */
+ char *host, *port;
+ int portno;
+ host= strsep(&set_buffer, " ");
+ port= strsep(&set_buffer, " ");
+ if (!host || !port)
+ return CS_FAIL;
+
+ portno= (int)strtol(port, (char **)NULL, 10);
+ tds_set_server_addr(tds_login, host);
+ tds_set_port(tds_login, portno);
+ break;
+ }
case CS_LOC_PROP:
con->locale = (CS_LOCALE *) buffer;
break;
@@ -521,7 +535,9 @@
tdsdump_log(TDS_DBG_FUNC, "ct_connect() servername = %s\n", servername ? servername : "NULL");
- if (snamelen == 0 || snamelen == CS_UNUSED) {
+ if (!tds_dstr_isempty(&con->tds_login->server_addr)) {
+ server = tds_dstr_cstr(&con->tds_login->server_addr);
+ } else if (snamelen == 0 || snamelen == CS_UNUSED) {
server = NULL;
} else if (snamelen == CS_NULLTERM) {
server = (char *) servername;
@@ -1896,7 +1912,7 @@
break;
case CS_SET:
if (*buf != CS_TRUE && *buf != CS_FALSE)
- ret = CS_FALSE;
+ ret = CS_FAIL;
else
ctx->config.cs_expose_formats = *buf;
break;
@@ -1904,13 +1920,51 @@
if (buf)
*buf = ctx->config.cs_expose_formats;
else
- ret = CS_FALSE;
+ ret = CS_FAIL;
break;
case CS_CLEAR:
ctx->config.cs_expose_formats = CS_FALSE;
break;
default:
- ret = CS_FALSE;
+ ret = CS_FAIL;
+ }
+ break;
+ case CS_VER_STRING: {
+ ret = CS_FAIL;
+ switch (action) {
+ case CS_GET: {
+ if (buffer && buflen && outlen) {
+ const TDS_COMPILETIME_SETTINGS *settings= tds_get_compiletime_settings();
+ *outlen= snprintf((char*)buffer, buflen, "%s (%s, default tds version=%s)",
+ settings->freetds_version,
+ (settings->threadsafe ? "threadsafe" : "non-threadsafe"),
+ settings->tdsver
+ );
+ ((char*)buffer)[buflen]= 0;
+ ret = CS_SUCCEED;
+ }
+ break;
+ default:
+ ret = CS_FAIL;
+ break;
+ }
+ }
+ }
+ break;
+ case CS_VERSION:
+ ret = CS_FAIL;
+ switch (action) {
+ case CS_GET: {
+ if (buffer && buflen && outlen) {
+ const TDS_COMPILETIME_SETTINGS *settings= tds_get_compiletime_settings();
+ *outlen= snprintf(buffer, buflen, "%s", settings->freetds_version);
+ ret = CS_SUCCEED;
+ }
+ break;
+ default:
+ ret = CS_FAIL;
+ break;
+ }
}
break;
default:
Index: src/tds/login.c
===================================================================
RCS file: /cvsroot/freetds/freetds/src/tds/login.c,v
retrieving revision 1.126
diff -u -r1.126 login.c
--- src/tds/login.c 29 Jul 2004 10:22:41 -0000 1.126
+++ src/tds/login.c 17 Aug 2004 12:11:14 -0000
@@ -159,6 +159,14 @@
}
void
+tds_set_server_addr(TDSLOGIN * tds_login, const char *server_addr)
+{
+ if (server_addr) {
+ tds_dstr_copy(&tds_login->server_addr, server_addr);
+ }
+}
+
+void
tds_set_library(TDSLOGIN * tds_login, const char *library)
{
tds_dstr_copy(&tds_login->library, library);
@@ -256,7 +264,7 @@
/* verify that ip_addr is not NULL */
if (tds_dstr_isempty(&connection->ip_addr)) {
- tdsdump_log(TDS_DBG_ERROR, "IP address pointer is NULL\n");
+ tdsdump_log(TDS_DBG_ERROR, "IP address pasdointer is NULL\n");
if (connection->server_name) {
tdsdump_log(TDS_DBG_ERROR, "Server %s not found!\n", tds_dstr_cstr(&connection->server_name));
} else {
Index: src/tds/mem.c
===================================================================
RCS file: /cvsroot/freetds/freetds/src/tds/mem.c,v
retrieving revision 1.114
diff -u -r1.114 mem.c
--- src/tds/mem.c 29 Jul 2004 10:22:41 -0000 1.114
+++ src/tds/mem.c 17 Aug 2004 12:11:14 -0000
@@ -680,6 +680,7 @@
return NULL;
memset(tds_login, '\0', sizeof(TDSLOGIN));
tds_dstr_init(&tds_login->server_name);
+ tds_dstr_init(&tds_login->server_addr);
tds_dstr_init(&tds_login->language);
tds_dstr_init(&tds_login->server_charset);
tds_dstr_init(&tds_login->host_name);
@@ -700,6 +701,7 @@
tds_dstr_zero(&login->password);
tds_dstr_free(&login->password);
tds_dstr_free(&login->server_name);
+ tds_dstr_free(&login->server_addr);
tds_dstr_free(&login->language);
tds_dstr_free(&login->server_charset);
tds_dstr_free(&login->host_name);
- [Fwd: [freetds] [patch] Add CS_SERVERADDR, CS_VER_STRING, CS_VERSION to ctlib], Frediano Ziglio, 02/06/2005
Archive powered by MHonArc 2.6.24.