freetds AT lists.ibiblio.org
Subject: FreeTDS Development Group
List archive
- From: christos AT zoulas.com (Christos Zoulas)
- To: freetds AT lists.ibiblio.org
- Subject: [freetds] bug fixes
- Date: Tue, 24 May 2011 14:09:03 -0400
Hello,
Here are a bunch of fixes, some I sent before:
- Add a new getpassarg function in replacements that centralizes password
retrieval from the command line arguments, and setting the command line
argument to *'s so that it is not visible with ps. This was done
differently in many places. Handling it in one place only makes sense.
- Fix the freebcp usage to mention queryout.
- In tsql add a usage function, and a flag [-a] to set the application
name from the command line.
- Delete trailing spaces from ct.c
- bcp queryout broke recently: Fix broken code in bulk.c that attempted
to get just the metadata using "select * from %s where 0 = 1".
Guess what? %s is not the table name in queryout... Fix it properly
using FMTONLY like it was done in freebcp.c. Again this code is
duplicated from freebcp.c and we probably don't need to do it
there anymore, and we should move the functionality to the library.
christos
--- /dev/null 2011-05-24 09:57:14.000000000 -0400
+++ getpassarg.c 2011-05-24 14:00:53.000000000 -0400
@@ -0,0 +1,74 @@
+/* FreeTDS - Library of routines accessing Sybase and Microsoft databases
+ * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 Brian Bruns
+ * Copyright (C) 2006, 2007, 2008, 2009, 2010 Frediano Ziglio
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#if HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <stdio.h>
+
+#if HAVE_LIMITS_H
+#include <limits.h>
+#endif
+
+#if HAVE_STRING_H
+#include <string.h>
+#endif /* HAVE_STRING_H */
+
+#include <tds.h>
+#include <tdsthread.h>
+#include <tdsconvert.h>
+#include <replacements.h>
+#include <sybfront.h>
+#include <sybdb.h>
+#include <syberror.h>
+#include <dblib.h>
+
+#ifdef DMALLOC
+#include <dmalloc.h>
+#endif
+
+TDS_RCSID(var, "Id: getpass.c,v 1.1.1.14 2010/06/07 14:37:14 christos Exp");
+
+/*
+ * return a copy of the password, reading from stdin if arg is '-'
+ * trashing he argument in the process.
+ */
+char *
+getpassarg(char *arg)
+{
+ char pwd[255], *ptr, *q;
+
+ if (strcmp(arg, "-") == 0) {
+ memset(pwd, 0, sizeof(pwd));
+ if (fgets(pwd, sizeof(pwd), stdin) == NULL)
+ return NULL;
+ ptr = strchr(pwd, '\n');
+ if (ptr) *ptr = '\0';
+ arg = pwd;
+ }
+
+ ptr = strdup(arg);
+
+ for (q = arg; *q; *q++ = '*')
+ continue;
+
+ return ptr;
+}
Index: include/replacements.h
===================================================================
RCS file:
/src/twosigma/cvsroot/external/public/freetds/include/replacements.h,v
retrieving revision 1.1.1.9
retrieving revision 1.3
diff -u -r1.1.1.9 -r1.3
--- include/replacements.h 23 May 2011 18:18:07 -0000 1.1.1.9
+++ include/replacements.h 23 May 2011 18:29:07 -0000 1.3
@@ -96,6 +96,8 @@
char *tds_basename(char *path);
#endif
+char *getpassarg(char *arg);
+
/*
* Microsoft's C Runtime library is missing strcasecmp and strncasecmp.
* Other Win32 C runtime libraries, notably minwg, may define it.
Index: src/apps/bsqldb.c
===================================================================
RCS file: /src/twosigma/cvsroot/external/public/freetds/src/apps/bsqldb.c,v
retrieving revision 1.1.1.8
retrieving revision 1.4
diff -u -r1.1.1.8 -r1.4
--- src/apps/bsqldb.c 23 May 2011 18:18:07 -0000 1.1.1.8
+++ src/apps/bsqldb.c 23 May 2011 21:04:43 -0000 1.4
@@ -828,8 +828,7 @@
username = strdup(optarg);
break;
case 'P':
- password = strdup(optarg);
- memset(optarg, 0, strlen(optarg));
+ password = getpassarg(optarg);
break;
case 'S':
options->servername = strdup(optarg);
@@ -889,10 +888,10 @@
DBSETLPWD(login, password);
memset(password, 0, strlen(password));
} else if (username) {
- char password[128];
+ char pwd[128];
- readpassphrase("Password: ", password, sizeof(password),
RPP_ECHO_OFF);
- DBSETLPWD(login, password);
+ readpassphrase("Password: ", pwd, sizeof(pwd), RPP_ECHO_OFF);
+ DBSETLPWD(login, pwd);
}
if (!options->servername) {
Index: src/apps/bsqlodbc.c
===================================================================
RCS file: /src/twosigma/cvsroot/external/public/freetds/src/apps/bsqlodbc.c,v
retrieving revision 1.1.1.5
retrieving revision 1.3
diff -u -r1.1.1.5 -r1.3
Index: src/apps/defncopy.c
===================================================================
RCS file: /src/twosigma/cvsroot/external/public/freetds/src/apps/defncopy.c,v
retrieving revision 1.1.1.7
retrieving revision 1.3
diff -u -r1.1.1.7 -r1.3
--- src/apps/defncopy.c 23 May 2011 18:18:07 -0000 1.1.1.7
+++ src/apps/defncopy.c 23 May 2011 18:29:07 -0000 1.3
@@ -652,6 +652,7 @@
get_login(int argc, char *argv[], OPTIONS *options)
{
LOGINREC *login;
+ char *password;
int ch;
int fdomain = TRUE;
@@ -682,8 +683,7 @@
fdomain = FALSE;
break;
case 'P':
- DBSETLPWD(login, optarg);
- memset(optarg, 0, strlen(optarg));
+ password = getpassarg(optarg);
fdomain = FALSE;
break;
case 'S':
Index: src/apps/freebcp.c
===================================================================
RCS file: /src/twosigma/cvsroot/external/public/freetds/src/apps/freebcp.c,v
retrieving revision 1.1.1.12
retrieving revision 1.4
diff -u -r1.1.1.12 -r1.4
--- src/apps/freebcp.c 23 May 2011 18:18:07 -0000 1.1.1.12
+++ src/apps/freebcp.c 23 May 2011 21:56:14 -0000 1.4
@@ -267,18 +267,7 @@
break;
case 'P':
pdata->Pflag++;
- if ((strcmp(optarg, "-")) == 0) {
- char pwd[255], *nl;
- memset(pwd, 0, 255);
- fgets(pwd, 255, stdin);
- nl = strchr(pwd, '\n');
- if(nl) *nl = '\0';
- pdata->pass = strdup(pwd);
- memset(pwd, 0, 255);
- } else {
- pdata->pass = strdup(optarg);
- memset(optarg, 0, strlen(optarg));
- }
+ pdata->pass = getpassarg(optarg);
break;
case 'i':
free(pdata->inputfile);
@@ -761,7 +750,7 @@
void
pusage(void)
{
- fprintf(stderr, "usage: freebcp [[database_name.]owner.]table_name
{in | out} datafile\n");
+ fprintf(stderr, "usage: freebcp
[[database_name.]owner.]table_name|query {in | out | queryout } datafile\n");
fprintf(stderr, " [-m maxerrors] [-f formatfile] [-e
errfile]\n");
fprintf(stderr, " [-F firstrow] [-L lastrow] [-b
batchsize]\n");
fprintf(stderr, " [-n] [-c] [-t field_terminator] [-r
row_terminator]\n");
Index: src/apps/tsql.c
===================================================================
RCS file: /src/twosigma/cvsroot/external/public/freetds/src/apps/tsql.c,v
retrieving revision 1.1.1.12
retrieving revision 1.20
diff -u -r1.1.1.12 -r1.20
--- src/apps/tsql.c 23 May 2011 18:18:07 -0000 1.1.1.12
+++ src/apps/tsql.c 23 May 2011 18:29:07 -0000 1.20
@@ -292,6 +292,23 @@
}
static void
+tsql_print_usage(const char *progname)
+{
+ fprintf(stderr,
+ "Usage:\t%s [-a <appname>] [-S <server> | -H <hostname> -p
<port>] -U <username> [-P <password>] [-I <config file>] [-o <options>] [-t
delim] [-r delim] [-D database]\n"
+ "\t%s -C\n"
+ "Options:\n"
+ "\tf\tDo not print footer\n"
+ "\th\tDo not print header\n"
+ "\tt\tPrint time informations\n"
+ "\tv\tPrint TDS version\n"
+ "\tq\tQuiet\n\n"
+ "\tDelimiters can be multi-char strings appropriately escaped
for your shell.\n"
+ "\tDefault column delimitor is <tab>; default row delimiter
is <newline>\n",
+ progname, progname);
+}
+
+static void
reset_getopt(void)
{
#ifdef HAVE_GETOPT_OPTRESET
@@ -390,12 +410,18 @@
char *hostname = NULL, *servername = NULL;
char *username = NULL, *password = NULL;
char *confile = NULL;
+ const char *appname = "TSQL";
+ const char *locale = NULL;
int opt, port=0, use_domain_login=0;
const char *charset = NULL;
char *opt_flags_str = NULL;
- while ((opt = getopt(argc, argv, "H:S:I:J:P:U:p:Co:t:r:D:Lv")) != -1)
{
+ while ((opt = getopt(argc, argv, "a:H:S:I:J:P:U:p:Co:t:r:D:Lv")) !=
-1)
+ {
switch (opt) {
+ case 'a':
+ appname = optarg;
+ break;
case 't':
opt_col_term = strdup(optarg);
break;
@@ -422,8 +448,7 @@
break;
case 'P':
free(password);
- password = strdup(optarg);
- memset(optarg, 0, strlen(optarg));
+ password = getpassarg(optarg);
break;
case 'I':
free(confile);
@@ -461,7 +486,7 @@
exit(0);
break;
default:
- fprintf(stderr, "%s: error: invalid option %c\n",
argv[0], (char)opt);
+ tsql_print_usage(argv[0]);
exit(1);
break;
}
@@ -544,7 +569,7 @@
/* if it's a servername */
if (servername) {
tds_set_user(login, username);
- tds_set_app(login, "TSQL");
+ tds_set_app(login, appname);
tds_set_library(login, "TDS-Library");
tds_set_server(login, servername);
if (charset) tds_set_client_charset(login, charset);
@@ -556,7 +581,7 @@
/* else we specified hostname/port */
} else {
tds_set_user(login, username);
- tds_set_app(login, "TSQL");
+ tds_set_app(login, appname);
tds_set_library(login, "TDS-Library");
tds_set_server(login, hostname);
tds_set_port(login, port);
Index: src/ctlib/ct.c
===================================================================
RCS file: /src/twosigma/cvsroot/external/public/freetds/src/ctlib/ct.c,v
retrieving revision 1.1.1.16
retrieving revision 1.17
diff -u -r1.1.1.16 -r1.17
--- src/ctlib/ct.c 23 May 2011 18:18:07 -0000 1.1.1.16
+++ src/ctlib/ct.c 23 May 2011 18:29:08 -0000 1.17
@@ -620,11 +620,11 @@
/* override locale settings with CS_CONNECTION settings, if any */
if (con->locale) {
if (con->locale->charset) {
- if (!tds_dstr_copy(&connection->server_charset,
con->locale->charset))
+ if (!tds_dstr_copy(&connection->server_charset,
con->locale->charset))
goto Cleanup;
}
if (con->locale->language) {
- if (!tds_dstr_copy(&connection->language,
con->locale->language))
+ if (!tds_dstr_copy(&connection->language,
con->locale->language))
goto Cleanup;
}
if (con->locale->time && con->tds_socket->tds_ctx) {
@@ -3467,7 +3467,7 @@
case CS_FALSE:
break; /* end valid choices */
default:
- if (action == CS_SET)
+ if (action == CS_SET)
return CS_FAIL;
}
break;
@@ -3480,7 +3480,7 @@
tds_option = TDS_OPT_ARITHABORTOFF;
break;
default:
- if (action == CS_SET)
+ if (action == CS_SET)
return CS_FAIL;
tds_option = TDS_OPT_ARITHABORTON;
}
@@ -3496,7 +3496,7 @@
tds_option = TDS_OPT_ARITHIGNOREOFF;
break;
default:
- if (action == CS_SET)
+ if (action == CS_SET)
return CS_FAIL;
}
tds_argument.i = TDS_OPT_ARITHOVERFLOW | TDS_OPT_NUMERICTRUNC;
@@ -3538,7 +3538,7 @@
tds_argument.ti = TDS_OPT_SATURDAY;
break;
default:
- if (action == CS_SET)
+ if (action == CS_SET)
return CS_FAIL;
}
tds_argsize = (action == CS_SET) ? 1 : 0;
@@ -3565,7 +3565,7 @@
tds_argument.ti = TDS_OPT_FMTDYM;
break;
default:
- if (action == CS_SET)
+ if (action == CS_SET)
return CS_FAIL;
}
tds_argsize = (action == CS_SET) ? 1 : 0;
@@ -3584,7 +3584,7 @@
tds_argument.ti = TDS_OPT_LEVEL3;
break;
default:
- if (action == CS_SET)
+ if (action == CS_SET)
return CS_FAIL;
}
tds_argsize = (action == CS_SET) ? 1 : 0;
@@ -3596,7 +3596,7 @@
case CS_FALSE:
break;
default:
- if (action == CS_SET)
+ if (action == CS_SET)
return CS_FAIL;
}
tds_argument.ti = !*(char *) param;
Index: src/replacements/Makefile.am
===================================================================
RCS file:
/src/twosigma/cvsroot/external/public/freetds/src/replacements/Makefile.am,v
retrieving revision 1.1.1.10
retrieving revision 1.2
diff -u -r1.1.1.10 -r1.2
--- src/replacements/Makefile.am 23 May 2011 18:18:07 -0000
1.1.1.10
+++ src/replacements/Makefile.am 23 Jun 2010 21:16:33 -0000 1.2
@@ -1,13 +1,12 @@
-# Id: Makefile.am,v 1.17 2010/10/12 15:36:24 jklowden Exp
+# $Id: Makefile.am,v 1.2 2010/06/23 21:16:33 christos Exp $
AM_CPPFLAGS= -I$(top_srcdir)/include
-I$(top_srcdir)/src/replacements
noinst_LTLIBRARIES= libreplacements.la
-libreplacements_la_SOURCES= iconv.c gettimeofday.c fakepoll.c
+libreplacements_la_SOURCES= iconv.c gettimeofday.c fakepoll.c getpassarg.c
libreplacements_la_LDFLAGS=
libreplacements_la_LIBADD= @LTLIBOBJS@
EXTRA_DIST= asprintf.c \
atoll.c \
basename.c \
- getopt.c \
readpassphrase.c \
strlcat.c \
strlcpy.c \
Index: src/tds/bulk.c
===================================================================
RCS file: /src/twosigma/cvsroot/external/public/freetds/src/tds/bulk.c,v
retrieving revision 1.1.1.4
retrieving revision 1.2
diff -u -r1.1.1.4 -r1.2
--- src/tds/bulk.c 23 May 2011 18:18:07 -0000 1.1.1.4
+++ src/tds/bulk.c 23 May 2011 21:55:06 -0000 1.2
@@ -37,6 +37,7 @@
#include "tds_checks.h"
#include "tdsbytes.h"
#include "replacements.h"
+#include "sybdb.h"
#ifdef DMALLOC
#include <dmalloc.h>
#endif
@@ -68,11 +69,17 @@
TDSCOLUMN *curcol;
TDS_INT result_type;
int i, rc;
+ const char *fmt;
/* FIXME don't leave state in processing state */
/* TODO quote tablename if needed */
- if (tds_submit_queryf(tds, "select * from %s where 0 = 1",
bcpinfo->tablename) == TDS_FAIL)
+ if (bcpinfo->direction != DB_QUERYOUT)
+ fmt = "SET FMTONLY ON select * from %s SET FMTONLY OFF";
+ else
+ fmt = "SET FMTONLY ON %s SET FMTONLY OFF";
+
+ if (tds_submit_queryf(tds, fmt, bcpinfo->tablename) == TDS_FAIL)
/* TODO return an error ?? */
/* Attempt to use Bulk Copy with a non-existent Server table
(might be why ...) */
return TDS_FAIL;
-
[freetds] bug fixes,
Christos Zoulas, 05/24/2011
- Re: [freetds] bug fixes, Frediano Ziglio, 05/25/2011
-
Re: [freetds] bug fixes,
Frediano Ziglio, 05/27/2011
- Re: [freetds] bug fixes, Frediano Ziglio, 05/27/2011
Archive powered by MHonArc 2.6.24.