Author: turnstep
Date: Sun Jun  1 18:20:45 2008
New Revision: 11364

Modified:
   DBD-Pg/trunk/Changes
   DBD-Pg/trunk/Pg.pm
   DBD-Pg/trunk/t/03dbmethod.t

Log:
Go over all get_info() values, add new tests for transaction_read_only.


Modified: DBD-Pg/trunk/Changes
==============================================================================
--- DBD-Pg/trunk/Changes        (original)
+++ DBD-Pg/trunk/Changes        Sun Jun  1 18:20:45 2008
@@ -1,6 +1,6 @@
 ('GSM' is Greg Sabino Mullane, [EMAIL PROTECTED])
 
-2.8.0
+2.8.0 Released June 1, 2008
 
        - Added in payload strings for LISTEN/NOTIFY in 8.4 
                via $dbh->pg_notifies() [GSM]
@@ -8,6 +8,7 @@
                from working [GSM]
        - Fix tests in t.04misc.t to handle Windows newlines.
                (CPAN bug #36237) [Ian Macdonald]
+       - Clean up get_info() information. [GSM]
 
 2.7.2 Released May 14, 2008 (subversion r11269)
 

Modified: DBD-Pg/trunk/Pg.pm
==============================================================================
--- DBD-Pg/trunk/Pg.pm  (original)
+++ DBD-Pg/trunk/Pg.pm  Sun Jun  1 18:20:45 2008
@@ -1,4 +1,4 @@
-# -*-cperl-*-
+#  -*-cperl-*-
 #  $Id$
 #
 #  Copyright (c) 2002-2008 Greg Sabino Mullane and others: see the Changes file
@@ -513,7 +513,7 @@
                        }
 
                        if ( $typtype eq 'e' ) {
-                               my $SQL = 'SELECT enumlabel FROM 
pg_catalog.pg_enum WHERE enumtypid = $typoid ORDER BY oid';
+                               my $SQL = "SELECT enumlabel FROM 
pg_catalog.pg_enum WHERE enumtypid = $typoid ORDER BY oid";
                                $row->[23] = $dbh->selectcol_arrayref($SQL);
                        }
                        else {
@@ -1341,94 +1341,95 @@
 
 ## Driver information:
 
-     116 => ['SQL_ACTIVE_ENVIRONMENTS',             0                         
],
-   10021 => ['SQL_ASYNC_MODE',                      0                         
],
-     120 => ['SQL_BATCH_ROW_COUNT',                 2                         
],
-     121 => ['SQL_BATCH_SUPPORT',                   3                         
], ## ??
+     116 => ['SQL_ACTIVE_ENVIRONMENTS',             0                         
], ## unlimited
+   10021 => ['SQL_ASYNC_MODE',                      2                         
], ## SQL_AM_STATEMENT
+     120 => ['SQL_BATCH_ROW_COUNT',                 2                         
], ## SQL_BRC_EXPLICIT
+     121 => ['SQL_BATCH_SUPPORT',                   3                         
], ## 12 SELECT_PROC + ROW_COUNT_PROC
        2 => ['SQL_DATA_SOURCE_NAME',                "dbi:Pg:$dbh->{Name}"     
],
-       3 => ['SQL_DRIVER_HDBC',                     0                         
], ## ??
-     135 => ['SQL_DRIVER_HDESC',                    0                         
],
-       4 => ['SQL_DRIVER_HENV',                     0                         
],
-      76 => ['SQL_DRIVER_HLIB',                     0                         
],
-       5 => ['SQL_DRIVER_HSTMT',                    0                         
],
-       6 => ['SQL_DRIVER_NAME',                     'DBD/Pg.pm'               
],
-      77 => ['SQL_DRIVER_ODBC_VERSION',             '03.00'                   
], ## ??
-       7 => ['SQL_DRIVER_VER',                      'DBDVERSION'              
],
-     144 => ['SQL_DYNAMIC_CURSOR_ATTRIBUTES1',      0                         
], ## ?? 519
-     145 => ['SQL_DYNAMIC_CURSOR_ATTRIBUTES2',      0                         
], ## ?? 5209
-      84 => ['SQL_FILE_USAGE',                      0                         
],
-     146 => ['SQL_FORWARD_ONLY_CURSOR_ATTRIBUTES1', 519                       
], ## ??
-     147 => ['SQL_FORWARD_ONLY_CURSOR_ATTRIBUTES2', 5209                      
], ## ??
-      81 => ['SQL_GETDATA_EXTENSIONS',              15                        
],
-     149 => ['SQL_INFO_SCHEMA_VIEWS',               3932149                   
], # not: assert, charset, collat, trans
-     150 => ['SQL_KEYSET_CURSOR_ATTRIBUTES1',       0                         
],
-     151 => ['SQL_KEYSET_CURSOR_ATTRIBUTES2',       0                         
],
-   10022 => ['SQL_MAX_ASYNC_CONCURRENT_STATEMENTS', 0                         
],
-       0 => ['SQL_MAX_DRIVER_CONNECTIONS',          'MAXCONNECTIONS'          
],
-     152 => ['SQL_ODBC_INTERFACE_CONFORMANCE',      1                         
], ## ??
-      10 => ['SQL_ODBC_VER',                        '03.00.0000'              
], ## ??
-     153 => ['SQL_PARAM_ARRAY_ROW_COUNTS',          2                         
],
-     154 => ['SQL_PARAM_ARRAY_SELECTS',             3                         
],
+       3 => ['SQL_DRIVER_HDBC',                     0                         
], ## not applicable
+     135 => ['SQL_DRIVER_HDESC',                    0                         
], ## not applicable
+       4 => ['SQL_DRIVER_HENV',                     0                         
], ## not applicable
+      76 => ['SQL_DRIVER_HLIB',                     0                         
], ## not applicable
+       5 => ['SQL_DRIVER_HSTMT',                    0                         
], ## not applicable
+          ## Not clear what should go here. Some things suggest 'Pg', others 
'Pg.pm'. We'll use DBD::Pg for now
+       6 => ['SQL_DRIVER_NAME',                     'DBD::Pg'                 
],
+      77 => ['SQL_DRIVER_ODBC_VERSION',             '03.00'                   
],
+       7 => ['SQL_DRIVER_VER',                      'DBDVERSION'              
], ## magic word
+     144 => ['SQL_DYNAMIC_CURSOR_ATTRIBUTES1',      0                         
], ## we can FETCH, but not via methods
+     145 => ['SQL_DYNAMIC_CURSOR_ATTRIBUTES2',      0                         
], ## same as above
+      84 => ['SQL_FILE_USAGE',                      0                         
], ## SQL_FILE_NOT_SUPPORTED (this is good)
+     146 => ['SQL_FORWARD_ONLY_CURSOR_ATTRIBUTES1', 519                       
], ## not clear what this refers to in DBD context
+     147 => ['SQL_FORWARD_ONLY_CURSOR_ATTRIBUTES2', 5209                      
], ## see above
+      81 => ['SQL_GETDATA_EXTENSIONS',              15                        
], ## 1+2+4+8
+     149 => ['SQL_INFO_SCHEMA_VIEWS',               3932149                   
], ## not: assert, charset, collat, trans
+     150 => ['SQL_KEYSET_CURSOR_ATTRIBUTES1',       0                         
], ## applies to us?
+     151 => ['SQL_KEYSET_CURSOR_ATTRIBUTES2',       0                         
], ## see above
+   10022 => ['SQL_MAX_ASYNC_CONCURRENT_STATEMENTS', 0                         
], ## unlimited, probably
+       0 => ['SQL_MAX_DRIVER_CONNECTIONS',          'MAXCONNECTIONS'          
], ## magic word
+     152 => ['SQL_ODBC_INTERFACE_CONFORMANCE',      1                         
], ## SQL_OIC_LEVEL_1
+      10 => ['SQL_ODBC_VER',                        '03.00.0000'              
],
+     153 => ['SQL_PARAM_ARRAY_ROW_COUNTS',          2                         
], ## correct?
+     154 => ['SQL_PARAM_ARRAY_SELECTS',             3                         
], ## PAS_NO_SELECT
       11 => ['SQL_ROW_UPDATES',                     'N'                       
],
       14 => ['SQL_SEARCH_PATTERN_ESCAPE',           '\\'                      
],
-      13 => ['SQL_SERVER_NAME',                     'CURRENTDB'               
],
+      13 => ['SQL_SERVER_NAME',                     'CURRENTDB'               
], ## magic word
      166 => ['SQL_STANDARD_CLI_CONFORMANCE',        2                         
], ## ??
      167 => ['SQL_STATIC_CURSOR_ATTRIBUTES1',       519                       
], ## ??
      168 => ['SQL_STATIC_CURSOR_ATTRIBUTES2',       5209                      
], ## ??
 
 ## DBMS Information
 
-      16 => ['SQL_DATABASE_NAME',                   'CURRENTDB'               
],
+      16 => ['SQL_DATABASE_NAME',                   'CURRENTDB'               
], ## magic word
       17 => ['SQL_DBMS_NAME',                       'PostgreSQL'              
],
-      18 => ['SQL_DBMS_VERSION',                    'ODBCVERSION'             
],
+      18 => ['SQL_DBMS_VERSION',                    'ODBCVERSION'             
], ## magic word
 
 ## Data source information
 
-      20 => ['SQL_ACCESSIBLE_PROCEDURES',           'Y'                       
],
-      19 => ['SQL_ACCESSIBLE_TABLES',               'Y'                       
],
+      20 => ['SQL_ACCESSIBLE_PROCEDURES',           'Y'                       
], ## is this really true?
+      19 => ['SQL_ACCESSIBLE_TABLES',               'Y'                       
], ## is this really true?
       82 => ['SQL_BOOKMARK_PERSISTENCE',            0                         
],
-      42 => ['SQL_CATALOG_TERM',                    ''                        
],
-   10004 => ['SQL_COLLATION_SEQ',                   'ENCODING'                
], ## ??
-      22 => ['SQL_CONCAT_NULL_BEHAVIOR',            0                         
],
-      23 => ['SQL_CURSOR_COMMIT_BEHAVIOR',          1                         
],
-      24 => ['SQL_CURSOR_ROLLBACK_BEHAVIOR',        1                         
],
-   10001 => ['SQL_CURSOR_SENSITIVITY',              1                         
],
-      25 => ['SQL_DATA_SOURCE_READ_ONLY',           'N'                       
],
-      26 => ['SQL_DEFAULT_TXN_ISOLATION',           8                         
],
+      42 => ['SQL_CATALOG_TERM',                    ''                        
], ## empty = catalogs are not supported
+   10004 => ['SQL_COLLATION_SEQ',                   'ENCODING'                
], ## magic word
+      22 => ['SQL_CONCAT_NULL_BEHAVIOR',            0                         
], ## SQL_CB_NULL
+      23 => ['SQL_CURSOR_COMMIT_BEHAVIOR',          1                         
], ## SQL_CB_CLOSE
+      24 => ['SQL_CURSOR_ROLLBACK_BEHAVIOR',        1                         
], ## SQL_CB_CLOSE
+   10001 => ['SQL_CURSOR_SENSITIVITY',              1                         
], ## SQL_INSENSITIVE
+      25 => ['SQL_DATA_SOURCE_READ_ONLY',           'READONLY'                
], ## magic word
+      26 => ['SQL_DEFAULT_TXN_ISOLATION',           'DEFAULTTXN'              
], ## magic word (2 or 8)
    10002 => ['SQL_DESCRIBE_PARAMETER',              'Y'                       
],
       36 => ['SQL_MULT_RESULT_SETS',                'Y'                       
],
       37 => ['SQL_MULTIPLE_ACTIVE_TXN',             'Y'                       
],
      111 => ['SQL_NEED_LONG_DATA_LEN',              'N'                       
],
-      85 => ['SQL_NULL_COLLATION',                  0                         
],
+      85 => ['SQL_NULL_COLLATION',                  0                         
], ## SQL_NC_HIGH
       40 => ['SQL_PROCEDURE_TERM',                  'function'                
], ## for now
       39 => ['SQL_SCHEMA_TERM',                     'schema'                  
],
-      44 => ['SQL_SCROLL_OPTIONS',                  8                         
], ## ??
+      44 => ['SQL_SCROLL_OPTIONS',                  8                         
], ## not really for DBD?
       45 => ['SQL_TABLE_TERM',                      'table'                   
],
-      46 => ['SQL_TXN_CAPABLE',                     2                         
],
-      72 => ['SQL_TXN_ISOLATION_OPTION',            15                        
],
+      46 => ['SQL_TXN_CAPABLE',                     2                         
], ## SQL_TC_ALL
+      72 => ['SQL_TXN_ISOLATION_OPTION',            10                        
], ## 2+8
       47 => ['SQL_USER_NAME',                       $dbh->{CURRENT_USER}      
],
 
 ## Supported SQL
 
-     169  => ['SQL_AGGREGATE_FUNCTIONS',            127                       
],
-     117  => ['SQL_ALTER_DOMAIN',                   31                        
],
+     169  => ['SQL_AGGREGATE_FUNCTIONS',            127                       
], ## all of 'em
+     117  => ['SQL_ALTER_DOMAIN',                   31                        
], ## all but deferred
       86  => ['SQL_ALTER_TABLE',                    32639                     
], ## no collate
      114  => ['SQL_CATALOG_LOCATION',               0                         
],
    10003  => ['SQL_CATALOG_NAME',                   'N'                       
],
       41  => ['SQL_CATALOG_NAME_SEPARATOR',         ''                        
],
       92  => ['SQL_CATALOG_USAGE',                  0                         
],
       87  => ['SQL_COLUMN_ALIAS',                   'Y'                       
],
-      74  => ['SQL_CORRELATION_NAME',               2                         
],
+      74  => ['SQL_CORRELATION_NAME',               2                         
], ## SQL_CN_ANY
      127  => ['SQL_CREATE_ASSERTION',               0                         
],
      128  => ['SQL_CREATE_CHARACTER_SET',           0                         
],
      129  => ['SQL_CREATE_COLLATION',               0                         
],
-     130  => ['SQL_CREATE_DOMAIN',                  23                        
],
-     131  => ['SQL_CREATE_SCHEMA',                  3                         
],
-     132  => ['SQL_CREATE_TABLE',                   13845                     
],
+     130  => ['SQL_CREATE_DOMAIN',                  23                        
], ## no collation, no defer
+     131  => ['SQL_CREATE_SCHEMA',                  3                         
], ## 1+2 schema + authorize
+     132  => ['SQL_CREATE_TABLE',                   13845                     
], ## no collation
      133  => ['SQL_CREATE_TRANSLATION',             0                         
],
-     134  => ['SQL_CREATE_VIEW',                    9                         
],
-     119  => ['SQL_DATETIME_LITERALS',              65535                     
],
-     170  => ['SQL_DDL_INDEX',                      3                         
],
+     134  => ['SQL_CREATE_VIEW',                    9                         
], ## local + create?
+     119  => ['SQL_DATETIME_LITERALS',              65535                     
], ## all?
+     170  => ['SQL_DDL_INDEX',                      3                         
], ## create + drop
      136  => ['SQL_DROP_ASSERTION',                 0                         
],
      137  => ['SQL_DROP_CHARACTER_SET',             0                         
],
      138  => ['SQL_DROP_COLLATION',                 0                         
],
@@ -1438,52 +1439,52 @@
      142  => ['SQL_DROP_TRANSLATION',               0                         
],
      143  => ['SQL_DROP_VIEW',                      7                         
],
       27  => ['SQL_EXPRESSIONS_IN_ORDERBY',         'Y'                       
],
-      88  => ['SQL_GROUP_BY',                       2                         
],
-      28  => ['SQL_IDENTIFIER_CASE',                2                         
], ## kinda
-      29  => ['SQL_IDENTIFIER_QUOTE_CHAR',          q{'}                      
],
-     148  => ['SQL_INDEX_KEYWORDS',                 0                         
],
-     172  => ['SQL_INSERT_STATEMENT',               7                         
],
+      88  => ['SQL_GROUP_BY',                       2                         
], ## GROUP_BY_CONTAINS_SELECT
+      28  => ['SQL_IDENTIFIER_CASE',                2                         
], ## SQL_IC_LOWER
+      29  => ['SQL_IDENTIFIER_QUOTE_CHAR',          q{"}                      
],
+     148  => ['SQL_INDEX_KEYWORDS',                 0                         
], ## not needed for Pg
+     172  => ['SQL_INSERT_STATEMENT',               7                         
], ## 1+2+4 = all
       73  => ['SQL_INTEGERITY',                     'Y'                       
], ## e.g. ON DELETE CASCADE?
-      89  => ['SQL_KEYWORDS',                       'KEYWORDS'                
],
+      89  => ['SQL_KEYWORDS',                       'KEYWORDS'                
], ## magic word
      113  => ['SQL_LIKE_ESCAPE_CLAUSE',             'Y'                       
],
-      75  => ['SQL_NON_NULLABLE_COLUMNS',           1                         
],
-     115  => ['SQL_OJ_CAPABILITIES',                127                       
],
+      75  => ['SQL_NON_NULLABLE_COLUMNS',           1                         
], ## NNC_NOT_NULL
+     115  => ['SQL_OJ_CAPABILITIES',                127                       
], ## all
       90  => ['SQL_ORDER_BY_COLUMNS_IN_SELECT',     'N'                       
],
       38  => ['SQL_OUTER_JOINS',                    'Y'                       
],
       21  => ['SQL_PROCEDURES',                     'Y'                       
],
-      93  => ['SQL_QUOTED_IDENTIFIER_CASE',         3                         
],
-      91  => ['SQL_SCHEMA_USAGE',                   31                        
],
-      94  => ['SQL_SPECIAL_CHARACTERS',             '$'                       
],
-     118  => ['SQL_SQL_CONFORMANCE',                4                         
], ## ??
-      95  => ['SQL_SUBQUERIES',                     31                        
],
-      96  => ['SQL_UNION',                          3                         
],
+      93  => ['SQL_QUOTED_IDENTIFIER_CASE',         3                         
], ## SQL_IC_SENSITIVE
+      91  => ['SQL_SCHEMA_USAGE',                   31                        
], ## all
+      94  => ['SQL_SPECIAL_CHARACTERS',             '$'                       
], ## there are actually many more...
+     118  => ['SQL_SQL_CONFORMANCE',                4                         
], ## SQL92_INTERMEDIATE ??
+      95  => ['SQL_SUBQUERIES',                     31                        
], ## all
+      96  => ['SQL_UNION',                          3                         
], ## 1+2 = all
 
 ## SQL limits
 
      112  => ['SQL_MAX_BINARY_LITERAL_LEN',         0                         
],
       34  => ['SQL_MAX_CATALOG_NAME_LEN',           0                         
],
      108  => ['SQL_MAX_CHAR_LITERAL_LEN',           0                         
],
-      30  => ['SQL_MAX_COLUMN_NAME_LEN',            'NAMEDATALEN'             
],
+      30  => ['SQL_MAX_COLUMN_NAME_LEN',            'NAMEDATALEN'             
], ## magic word
       97  => ['SQL_MAX_COLUMNS_IN_GROUP_BY',        0                         
],
       98  => ['SQL_MAX_COLUMNS_IN_INDEX',           0                         
],
       99  => ['SQL_MAX_COLUMNS_IN_ORDER_BY',        0                         
],
      100  => ['SQL_MAX_COLUMNS_IN_SELECT',          0                         
],
-     101  => ['SQL_MAX_COLUMNS_IN_TABLE',           1600                      
], ## depends on column types
-      31  => ['SQL_MAX_CURSOR_NAME_LEN',            'NAMEDATALEN'             
],
-   10005  => ['SQL_MAX_IDENTIFIER_LEN',             'NAMEDATALEN'             
],
+     101  => ['SQL_MAX_COLUMNS_IN_TABLE',           250                       
], ## 250-1600 (depends on column types)
+      31  => ['SQL_MAX_CURSOR_NAME_LEN',            'NAMEDATALEN'             
], ## magic word
+   10005  => ['SQL_MAX_IDENTIFIER_LEN',             'NAMEDATALEN'             
], ## magic word
      102  => ['SQL_MAX_INDEX_SIZE',                 0                         
],
-     102  => ['SQL_MAX_PROCEDURE_NAME_LEN',         'NAMEDATALEN'             
],
+     102  => ['SQL_MAX_PROCEDURE_NAME_LEN',         'NAMEDATALEN'             
], ## magic word
      104  => ['SQL_MAX_ROW_SIZE',                   0                         
], ## actually 1.6 TB, but too big to represent here
      103  => ['SQL_MAX_ROW_SIZE_INCLUDES_LONG',     'Y'                       
],
-      32  => ['SQL_MAX_SCHEMA_NAME_LEN',            'NAMEDATALEN'             
],
+      32  => ['SQL_MAX_SCHEMA_NAME_LEN',            'NAMEDATALEN'             
], ## magic word
      105  => ['SQL_MAX_STATEMENT_LEN',              0                         
],
-      35  => ['SQL_MAX_TABLE_NAME_LEN',             'NAMEDATALEN'             
],
+      35  => ['SQL_MAX_TABLE_NAME_LEN',             'NAMEDATALEN'             
], ## magic word
      106  => ['SQL_MAX_TABLES_IN_SELECT',           0                         
],
-     107  => ['SQL_MAX_USER_NAME_LEN',              'NAMEDATALEN'             
],
+     107  => ['SQL_MAX_USER_NAME_LEN',              'NAMEDATALEN'             
], ## magic word
 
 ## Scalar function information
 
-      48  => ['SQL_CONVERT_FUNCTIONS',              2                         
], ## ??
+      48  => ['SQL_CONVERT_FUNCTIONS',              2                         
], ## CVT_CAST only?
       49  => ['SQL_NUMERIC_FUNCTIONS',              16777215                  
], ## ?? all but some naming clashes: rand(om), trunc(ate), log10=ln, etc.
       50  => ['SQL_STRING_FUNCTIONS',               16280984                  
], ## ??
       51  => ['SQL_SYSTEM_FUNCTIONS',               0                         
], ## ??
@@ -1553,11 +1554,22 @@
                 elsif ($ans eq 'KEYWORDS') {
                        ## 
http://www.postgresql.org/docs/current/static/sql-keywords-appendix.html
                        ## Basically, we want ones that are 'reserved' for 
PostgreSQL but not 'reserved' in SQL:2003
+                       ## 
                        return join ',' => (qw(ANALYSE ANALYZE ASC DEFERRABLE 
DESC DO FREEZE ILIKE INITIALLY ISNULL LIMIT NOTNULL OFF OFFSET PLACING 
RETURNING VERBOSE));
                 }
                 elsif ($ans eq 'CURRENTDB') {
                         return $dbh->selectall_arrayref('SELECT 
pg_catalog.current_database()')->[0][0];
                 }
+                elsif ($ans eq 'READONLY') {
+                        my $SQL = q{SELECT CASE WHEN setting = 'on' THEN 'Y' 
ELSE 'N' END FROM pg_settings WHERE name = 'transaction_read_only'};
+                        my $info = $dbh->selectall_arrayref($SQL);
+                        return defined $info->[0] ? $info->[0][0] : 'N';
+                }
+                elsif ($ans eq 'DEFAULTTXN') {
+                        my $SQL = q{SELECT CASE WHEN setting = 'read 
committed' THEN 2 ELSE 8 END FROM pg_settings WHERE name = 
'default_transaction_isolation'};
+                        my $info = $dbh->selectall_arrayref($SQL);
+                        return defined $info->[0] ? $info->[0][0] : 2;
+                }
 
                 return $ans;
        } # end of get_info

Modified: DBD-Pg/trunk/t/03dbmethod.t
==============================================================================
--- DBD-Pg/trunk/t/03dbmethod.t (original)
+++ DBD-Pg/trunk/t/03dbmethod.t Sun Jun  1 18:20:45 2008
@@ -25,7 +25,7 @@
 if (! defined $dbh) {
        plan skip_all => 'Connection to database failed, cannot continue 
testing';
 }
-plan tests => 222;
+plan tests => 224;
 
 isnt( $dbh, undef, 'Connect to database for database handle method testing');
 
@@ -383,6 +383,14 @@
 my $maxcon = $dbh->get_info(0);
 like( $maxcon, qr{^\d+$}, q{DB handle method "get_info" returns a number for 
SQL_MAX_DRIVER_CONNECTIONS});
 
+$t=q{DB handle method "get_info" returns correct string for 
SQL_DATA_SOURCE_READ_ONLY when "on"};
+$dbh->do("SET transaction_read_only = 'on'");
+is($dbh->get_info(25), 'Y', $t);
+
+$t=q{DB handle method "get_info" returns correct string for 
SQL_DATA_SOURCE_READ_ONLY when "off"};
+$dbh->do("SET transaction_read_only = 'off'");
+is($dbh->get_info(25), 'N', $t);
+
 #
 # Test of the "table_info" database handle method
 #

Reply via email to