freetds AT lists.ibiblio.org
Subject: FreeTDS Development Group
List archive
- From: Frediano Ziglio <freddy77 AT gmail.com>
- To: FreeTDS Development Group <freetds AT lists.ibiblio.org>
- Subject: Re: [freetds] bug fixes
- Date: Wed, 25 May 2011 09:04:23 +0200
Thanks Christos,
Your patch contains a lot of stuff. I think that the only really bug
fix is queryout, other stuff will go to HEAD. Note that defncopy patch
is wrong, you save password to a variable and not use it.
Regards
Frediano
2011/5/24 Christos Zoulas <christos AT zoulas.com>:
> 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 mailing list
> FreeTDS AT lists.ibiblio.org
> http://lists.ibiblio.org/mailman/listinfo/freetds
>
-
[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.