X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fdata%2Fpsql-reader.c;h=4a49ba0cf92c413c551811b1ce1a87dd9e64c062;hb=8d6bfdd2a100bf8166b3b0b3f006d46f3e7a59e9;hp=2d9a2678086380725b8cb812305f5682373e8bf0;hpb=d9fc15ceb74cdc66487ba9aaed04246170729640;p=pspp diff --git a/src/data/psql-reader.c b/src/data/psql-reader.c index 2d9a267808..4a49ba0cf9 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, 2010, 2011 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 @@ -32,8 +32,9 @@ #include "libpspp/misc.h" #include "libpspp/str.h" -#include "gl/xalloc.h" +#include "gl/c-strcase.h" #include "gl/minmax.h" +#include "gl/xalloc.h" #include "gettext.h" #define _(msgid) gettext (msgid) @@ -251,7 +252,7 @@ psql_open_reader (struct psql_read_info *info, struct dictionary **dict) } { - int ver_num; + int ver_num = 0; const char *vers = PQparameterStatus (r->conn, "server_version"); sscanf (vers, "%d", &ver_num); @@ -270,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 @@ -297,17 +298,22 @@ psql_open_reader (struct psql_read_info *info, struct dictionary **dict) if we find this value. */ encoding = enc ? pg_encoding_to_char (enc) : get_default_encoding (); - } - /* Create the dictionary and populate it */ - *dict = r->dict = dict_create (); + /* Create the dictionary and populate it */ + *dict = r->dict = dict_create (encoding); + } + const int version = PQserverVersion (r->conn); + ds_init_empty (&query); /* - select count (*) from (select * from medium) stupid_sql_standard; - */ - ds_init_cstr (&query, - "BEGIN READ ONLY ISOLATION LEVEL SERIALIZABLE; " - "DECLARE pspp BINARY CURSOR FOR "); + Versions before 9.1 don't have the REPEATABLE READ isolation level. + However according to if the server is in the + "hot standby" mode then SERIALIZABLE won't work. + */ + ds_put_c_format (&query, + "BEGIN READ ONLY ISOLATION LEVEL %s; " + "DECLARE pspp BINARY CURSOR FOR ", + (version < 90100) ? "SERIALIZABLE" : "REPEATABLE READ"); ds_put_substring (&query, info->sql.ss); @@ -370,11 +376,11 @@ psql_open_reader (struct psql_read_info *info, struct dictionary **dict) int width = 0; int length ; - /* If there are no data then make a finger in the air + /* If there are no data then make a finger in the air guess at the contents */ if ( n_tuples > 0 ) length = PQgetlength (qres, 0, i); - else + else length = PSQL_DEFAULT_WIDTH; switch (type) @@ -538,7 +544,7 @@ psql_open_reader (struct psql_read_info *info, struct dictionary **dict) &psql_casereader_class, r); error: - dict_destroy (*dict); + dict_unref (*dict); psql_casereader_destroy (NULL, r); return NULL;