X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fdata%2Fpsql-reader.c;h=630a720711ce14af83784137085cd8cb72f57ab2;hb=ea5c4e8eb004d6414d03b65bd3407cc7ad3e2dfd;hp=68ea7e5672cea1c483fb356e75b5834852642c1d;hpb=bd17d2af982332ee1791998361b1ac6731fe14fa;p=pspp diff --git a/src/data/psql-reader.c b/src/data/psql-reader.c index 68ea7e5672..630a720711 100644 --- a/src/data/psql-reader.c +++ b/src/data/psql-reader.c @@ -1,5 +1,5 @@ /* PSPP - a program for statistical analysis. - Copyright (C) 2008, 2009 Free Software Foundation, Inc. + Copyright (C) 2008, 2009, 2010, 2011, 2012 Free Software Foundation, Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -16,23 +16,25 @@ #include -#include -#include -#include -#include +#include "data/psql-reader.h" + +#include #include #include -#include "psql-reader.h" -#include "variable.h" -#include "format.h" -#include "calendar.h" - -#include -#include -#include +#include "data/calendar.h" +#include "data/casereader-provider.h" +#include "data/dictionary.h" +#include "data/format.h" +#include "data/variable.h" +#include "libpspp/i18n.h" +#include "libpspp/message.h" +#include "libpspp/misc.h" +#include "libpspp/str.h" -#include "minmax.h" +#include "gl/c-strcase.h" +#include "gl/minmax.h" +#include "gl/xalloc.h" #include "gettext.h" #define _(msgid) gettext (msgid) @@ -180,15 +182,12 @@ create_var (struct psql_reader *r, const struct fmt_spec *fmt, { unsigned long int vx = 0; struct variable *var; - char name[VAR_NAME_LEN + 1]; - - if ( ! dict_make_unique_var_name (r->dict, suggested_name, &vx, name)) - { - msg (ME, _("Cannot create variable name from %s"), suggested_name); - return NULL; - } + char *name; + name = dict_make_unique_var_name (r->dict, suggested_name, &vx); var = dict_create_var (r->dict, name, width); + free (name); + var_set_both_formats (var, fmt); if ( col != -1) @@ -232,6 +231,7 @@ psql_open_reader (struct psql_read_info *info, struct dictionary **dict) int n_fields, n_tuples; PGresult *qres = NULL; casenumber n_cases = CASENUMBER_MAX; + const char *encoding; struct psql_reader *r = xzalloc (sizeof *r); struct string query ; @@ -271,7 +271,7 @@ psql_open_reader (struct psql_read_info *info, struct dictionary **dict) { const char *dt = PQparameterStatus (r->conn, "integer_datetimes"); - r->integer_datetimes = ( 0 == strcasecmp (dt, "on")); + r->integer_datetimes = ( 0 == c_strcasecmp (dt, "on")); } #if USE_SSL @@ -286,12 +286,7 @@ psql_open_reader (struct psql_read_info *info, struct dictionary **dict) } } - r->postgres_epoch = - calendar_gregorian_to_offset (2000, 1, 1, NULL, NULL); - - - /* Create the dictionary and populate it */ - *dict = r->dict = dict_create (); + r->postgres_epoch = calendar_gregorian_to_offset (2000, 1, 1, NULL); { const int enc = PQclientEncoding (r->conn); @@ -299,11 +294,13 @@ psql_open_reader (struct psql_read_info *info, struct dictionary **dict) /* According to section 22.2 of the Postgresql manual a value of zero (SQL_ASCII) indicates "a declaration of ignorance about the encoding". - Accordingly, we don't set the dictionary's encoding + Accordingly, we use the default encoding if we find this value. */ - if ( enc != 0 ) - dict_set_encoding (r->dict, pg_encoding_to_char (enc)); + encoding = enc ? pg_encoding_to_char (enc) : get_default_encoding (); + + /* Create the dictionary and populate it */ + *dict = r->dict = dict_create (encoding); } /* @@ -838,7 +835,7 @@ set_value (struct psql_reader *r) case VARCHAROID: case BPCHAROID: case BYTEAOID: - memcpy (value_str_rw (val, var_width), (char *) vptr, + memcpy (value_str_rw (val, var_width), vptr, MIN (length, var_width)); break;