DBI: Column metadata

Both, SQL/CLI and ODBC define a function 'SQLColumns' for obtaining
column metadata:

  SQLRETURN SQLColumns
  (
    SQLHSTMT  StatementHandle
  , SQLCHAR*  CatalogName    , SQLSMALLINT  NameLength1
  , SQLCHAR*  SchemaName     , SQLSMALLINT  NameLength2
  , SQLCHAR*  TableName      , SQLSMALLINT  NameLength3
  , SQLCHAR*  ColumnName     , SQLSMALLINT  NameLength4
  );

A perlish interface - similar to table_info etc. - may look like:

  $sth = $dbh->column_info( $catalog, $schema, $table, $column );

- Except for $catalog, these parameters can contain string search
  patterns.

- The result set is ordered by TABLE_CAT, TABLE_SCHEM, TABLE_NAME
  and ORDINAL_POSITION.

- ODBC defines less columns in the result set than SQL/CLI:

   #  SQL/CLI            ODBC
  --  -----------------  -------------
   1  TABLE_CAT          TABLE_CAT
   2  TABLE_SCHEM        TABLE_SCHEM
   3  TABLE_NAME         TABLE_NAME
   4  COLUMN_NAME        COLUMN_NAME
   5  DATA_TYPE          DATA_TYPE
   6  TYPE_NAME          TYPE_NAME
   7  COLUMN_SIZE        COLUMN_SIZE
   8  BUFFER_LENGTH      BUFFER_LENGTH
   9  DECIMAL_DIGITS     DECIMAL_DIGITS
  10  NUM_PREC_RADIX     NUM_PREC_RADIX
  11  NULLABLE           NULLABLE
  12  REMARKS            REMARKS
  13  COLUMN_DEF         COLUMN_DEF
  14  SQL_DATA_TYPE      SQL_DATA_TYPE
  15  SQL_DATETIME_SUB   SQL_DATETIME_SUB
  16  CHAR_OCTET_LENGTH  CHAR_OCTET_LENGTH
  17  ORDINAL_POSITION   ORDINAL_POSITION
  18  IS_NULLABLE        IS_NULLABLE
  19  CHAR_SET_CAT
  20  CHAR_SET_SCHEM
  21  CHAR_SET_NAME
  22  COLLATION_CAT
  23  COLLATION_SCHEM
  24  COLLATION_NAME
  25  UDT_CAT
  26  UDT_SCHEM
  27  UDT_NAME
  28  DOMAIN_CAT
  29  DOMAIN_SCHEM
  30  DOMAIN_NAME
  31  SCOPE_CAT
  32  SCOPE_SCHEM
  33  SCOPE_NAME
  34  MAX_CARDINALITY
  35  DTD_IDENTIFIER
  36  IS_SELF_REF

  Luckily, the only difference is, that SQL/CLI defines more columns,
  columns 1-18 are the same (and have the same meaning).

- A driver may provide column metadata not only for base tables, but
  also for derived objects like SYNONYMS etc.

- There is some overlap with statement attributes (in perl) and
  SQLDescribeCol (in ODBC).
  However, SQLColumns provides more metadata.

If nobody raises objections, I'll prepare a patch for DBI.


Steffen

0
s
10/15/2001 3:19:02 PM
perl.dbi.dev 1899 articles. 0 followers. Follow

29 Replies
2164 Views

Similar Articles

[PageSpeed] 22

On Mon, Oct 15, 2001 at 05:19:02PM +0200, Steffen Goeldner wrote:
> 
> If nobody raises objections, I'll prepare a patch for DBI.

Bless you!

:-)

Tim.
0
Tim
10/15/2001 4:07:34 PM
--------------8F516752E457721A464A2595
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: 7bit

Attached is a patch for DBI which defines the column_info
interface.


Steffen
--------------8F516752E457721A464A2595
Content-Type: text/plain; charset=us-ascii; name="DBI.pm.diff"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline; filename="DBI.pm.diff"

*** DBI-1.20/DBI.pm	Sat Aug 25 01:33:52 2001
--- DBI.pm	Sat Oct 20 19:19:07 2001
***************
*** 296,301 ****
--- 296,302 ----
  
  	tables          => { U =>[1,6,'$catalog, $schema, $table, $type [, \%attr ]' ] },
  	table_info      => { U =>[1,6,'$catalog, $schema, $table, $type [, \%attr ]' ] },
+ 	column_info     => { U =>[1,6,'$catalog, $schema, $table, $column [, \%attr ]' ] },
  	primary_key_info=> { U =>[4,5,'$catalog, $schema, $table [, \%attr ]' ] },
  	primary_key     => { U =>[4,5,'$catalog, $schema, $table [, \%attr ]' ] },
  	type_info_all	=> { U =>[1,1] },
***************
*** 1068,1073 ****
--- 1069,1078 ----
  	shift->_not_impl('table_info');
      }
  
+     sub column_info {
+ 	shift->_not_impl('column_info');
+     }
+ 
      sub primary_key_info {
  	shift->_not_impl('primary_key_info');
      }
***************
*** 2719,2724 ****
--- 2724,2850 ----
  be part of the Data Access SDK.
  
  See also page 306 of the (very large) SQL/CLI specification:
+ 
+   http://www.jtc1sc32.org/sc32/jtc1sc32.nsf/Attachments/DF86E81BE70151D58525699800643F56/$FILE/32N0595T.PDF
+ 
+ 
+ =item C<column_info> I<NEW>
+ 
+ B<Warning:> This method is experimental and may change.
+ 
+   $sth = $dbh->column_info( $catalog, $schema, $table, $column );
+ 
+ Returns an active statement handle that can be used to fetch
+ information about columns in specified tables.
+ 
+ The arguments $schema, $table and $column may accept search patterns
+ according to the database/driver, for example: $table = '%FOO%';
+ 
+ Note: The support for the selection criteria is driver specific. If the
+ driver doesn't support one or more of them then you may get back more
+ than you asked for and can do the filtering yourself.
+ 
+ The statement handle returned has at least the following fields in the
+ order shown below. Other fields, after these, may also be present.
+ 
+ B<TABLE_CAT>: The catalog identifier.
+ This field is NULL (C<undef>) if not applicable to the data source,
+ which is often the case.  This field is empty if not applicable to the
+ table.
+ 
+ B<TABLE_SCHEM>: The schema identifier.
+ This field is NULL (C<undef>) if not applicable to the data source,
+ and empty if not applicable to the table.
+ 
+ B<TABLE_NAME>: The table identifier.
+ Note: A driver may provide column metadata not only for base tables, but
+ also for derived objects like SYNONYMS etc.
+ 
+ B<COLUMN_NAME>: The column identifier.
+ 
+ B<DATA_TYPE>: The concise data type code.
+ 
+ B<TYPE_NAME>: A data source dependent data type name.
+ 
+ B<COLUMN_SIZE>: The column size.
+ This is the maximum length in characters for character data types,
+ the number of digits or bits for numeric data types or the length
+ in the representation of temporal types.
+ See the relevant specifications for detailed information.
+ 
+ B<BUFFER_LENGTH>: The length in bytes of transferred data.
+ 
+ B<DECIMAL_DIGITS>: The total number of significant digits to the right of
+ the decimal point.
+ 
+ B<NUM_PREC_RADIX>: The radix for numeric precision.
+ The value is 10 or 2 for numeric data types and NULL (C<undef>) if not
+ applicable.
+ 
+ B<NULLABLE>: Indicates if a column can accept NULLs.
+ The following codes are defined:
+ 
+   SQL_NO_NULLS          0
+   SQL_NULLABLE          1
+   SQL_NULLABLE_UNKNOWN  2
+ 
+ B<REMARKS>: A description of the column.
+ 
+ B<COLUMN_DEF>: The default value of the column.
+ 
+ B<SQL_DATA_TYPE>: The SQL data type.
+ 
+ B<SQL_DATETIME_SUB>: The subtype code for datetime and interval data types.
+ 
+ B<CHAR_OCTET_LENGTH>: The maximum length in bytes of a character or binary
+ data type column.
+ 
+ B<ORDINAL_POSITION>: The column sequence number (starting with 1).
+ 
+ B<IS_NULLABLE>: Indicates if the column can accept NULLs.
+ Possible values are: 'NO', 'YES' and ''.
+ 
+ SQL/CLI defines the following additional columns:
+ 
+   CHAR_SET_CAT
+   CHAR_SET_SCHEM
+   CHAR_SET_NAME
+   COLLATION_CAT
+   COLLATION_SCHEM
+   COLLATION_NAME
+   UDT_CAT
+   UDT_SCHEM
+   UDT_NAME
+   DOMAIN_CAT
+   DOMAIN_SCHEM
+   DOMAIN_NAME
+   SCOPE_CAT
+   SCOPE_SCHEM
+   SCOPE_NAME
+   MAX_CARDINALITY
+   DTD_IDENTIFIER
+   IS_SELF_REF
+ 
+ The result set is ordered by TABLE_CAT, TABLE_SCHEM, TABLE_NAME
+ and ORDINAL_POSITION.
+ 
+ Note: There is some overlap with statement attributes (in perl) and
+ SQLDescribeCol (in ODBC). However, SQLColumns provides more metadata.
+ 
+ For more detailed information about the fields and their meanings,
+ you can refer to:
+ 
+   http://msdn.microsoft.com/library/en-us/odbc/htm/odbcsqlcolumns.asp
+ 
+ If that URL ceases to work then use the MSDN search facility at:
+ 
+   http://search.microsoft.com/us/dev/
+ 
+ and search for C<SQLColumns returns> using the exact phrase option.
+ The link you want will probably just be called C<SQLColumns> and will
+ be part of the Data Access SDK.
+ 
+ See also page 135 of the current SQL/CLI Working Draft:
  
    http://www.jtc1sc32.org/sc32/jtc1sc32.nsf/Attachments/DF86E81BE70151D58525699800643F56/$FILE/32N0595T.PDF
  

--------------8F516752E457721A464A2595--

0
s
10/22/2001 9:33:02 AM
--------------7D2B9D6F6FE7C047E76270D2
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: 7bit

I'm working on an implementation for DBD::Oracle, but the SQL
statement (the decode() expressions, to be precise) exceeds the
limit of my editor ;-)
In the meantime - to satisfy the impatient people - I extented
a previous test case

 http://archive.develooper.com/dbi-dev@perl.org/msg00056.html


Steffen
--------------7D2B9D6F6FE7C047E76270D2
Content-Type: text/plain; charset=us-ascii; name="TypeTest.sql"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline; filename="TypeTest.sql"

DROP   TABLE tst.TypeTest
/
CREATE TABLE tst.TypeTest
(
  cINTEGER           INTEGER NOT NULL
, cNUMBER            NUMBER
, cNUMBER_38_0       NUMBER  ( 38, 0 )
, cNUMBER_11_2       NUMBER  ( 11, 2 )
, cNUMBER_xx_2       NUMBER  (  *, 2 )
, cFLOAT             FLOAT
, cFLOAT_11          FLOAT   ( 11 )
, cREAL              REAL
, cDOUBLE_PRECISION  DOUBLE PRECISION
, cDATE              DATE DEFAULT sysdate
, cCHAR              CHAR
, cVARCHAR           VARCHAR (  7 )
, cVARCHAR2          VARCHAR2(  7 )
)
/
COMMENT ON COLUMN tst.TypeTest.cINTEGER IS 'This is an integer.'
/

SELECT *
  FROM
(
  SELECT tc.OWNER
       , tc.TABLE_NAME
       , tc.COLUMN_NAME
       , tc.DATA_TYPE
       , tc.DATA_LENGTH
       , tc.DATA_PRECISION
       , tc.DATA_SCALE
       , tc.NULLABLE
       , tc.COLUMN_ID
       , tc.DEFAULT_LENGTH
       , tc.DATA_DEFAULT
       , cc.COMMENTS
    FROM ALL_TAB_COLUMNS  tc
       , ALL_COL_COMMENTS cc
   WHERE tc.TABLE_NAME    = cc.TABLE_NAME
     AND tc.COLUMN_NAME   = cc.COLUMN_NAME
     AND tc.OWNER         = cc.OWNER
)
 WHERE OWNER      LIKE 'TST'
   AND TABLE_NAME LIKE 'TYPETEST'
 ORDER by OWNER, TABLE_NAME, COLUMN_ID
/


/*

OWNER TABLE    COLUMN            DATA     DATA   DATA      DATA  NULLABLE COLUMN DEFAULT DATA    COMMENTS
      NAME     NAME              TYPE     LENGTH PRECISION SCALE          ID     LENGTH  DEFAULT
----- -------- ----------------- -------- ------ --------- ----- -------- ------ ------- ------- --------------------
TST   TYPETEST CINTEGER          NUMBER       22               0        N      1                 This is an integer.
TST   TYPETEST CNUMBER           NUMBER       22                        Y      2
TST   TYPETEST CNUMBER_38_0      NUMBER       22        38     0        Y      3
TST   TYPETEST CNUMBER_11_2      NUMBER       22        11     2        Y      4
TST   TYPETEST CNUMBER_XX_2      NUMBER       22               2        Y      5
TST   TYPETEST CFLOAT            FLOAT        22       126              Y      6
TST   TYPETEST CFLOAT_11         FLOAT        22        11              Y      7
TST   TYPETEST CREAL             FLOAT        22        63              Y      8
TST   TYPETEST CDOUBLE_PRECISION FLOAT        22       126              Y      9
TST   TYPETEST CDATE             DATE          7                        Y     10       8 sysdate
TST   TYPETEST CCHAR             CHAR          1                        Y     11
TST   TYPETEST CVARCHAR          VARCHAR2      7                        Y     12
TST   TYPETEST CVARCHAR2         VARCHAR2      7                        Y     13

*/

--------------7D2B9D6F6FE7C047E76270D2--

0
s
10/23/2001 8:41:48 AM
--------------252EC21CD9CDE48B09DB1330
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: 7bit

Let's begin with MS ODBC for Oracle!

The biggest problem is: it's a Level 2 driver:

 - the column names conform to Level 1
 - most Level 3 columns are missing
 - the old datatypes are used (DATE=11)

The REMARKS field is empty. I don't know if the driver or the test
tool purges that string.

The PRECISION = 15 for FLOATS is dubious. This value is defined in
the ODBC spec:

 <http://msdn.microsoft.com/library/en-us/odbc/htm/odbccolumn_size.asp>

(the purpose is unclear to me), but does not correspond to the
declared value.

The LENGTH for FLOATS looks dubious. How fit 8 bytes into 126 bits?

But the SQL (grabbed from V$SQLAREA) looks very interesting!


Steffen
--------------252EC21CD9CDE48B09DB1330
Content-Type: text/plain; charset=us-ascii; name="ms.txt"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline; filename="ms.txt"

MS ODBC for Oracle:
===================

MS ODBC Test 2.60.0905
----------------------

Get Info All:
  SQL_DBMS_NAME       =  17,  6, "Oracle"
  SQL_DBMS_VER        =  18, 69, "08.01.0000 Oracle8i Enterprise Edition Release 8.1.7.2.1 - Production"
  SQL_DM_VER          = 171, 15, "03.52.6019.0000"
  SQL_DRIVER_NAME     =   6, 12, "msorcl32.dll"
  SQL_DRIVER_ODBC_VER =  77,  5, "02.50"
  SQL_DRIVER_VER      =   7, 11, "02.573.6019"
  SQL_ODBC_VER        =  10, 10, "03.52.0000"

SQLColumns:
  In:
    StatementHandle = 0x008A1860
    CatalogName     = SQL_NULL_HANDLE, NameLength1 = 0
    SchemaName      = "TST"          , NameLength2 = 3
    TableName       = "TYPETEST"     , NameLength3 = 8
    ColumnName      = SQL_NULL_HANDLE, NameLength4 = 0
  Return:
    SQL_SUCCESS     = 0

Get Data All:

TABLE     TABLE TABLE    COLUMN_NAME       DATA TYPE   PRECISION LENGTH SCALE   RADIX NULLABLE REMARKS ORDINAL
QUALIFIER OWNER NAME                       TYPE NAME                                                   POSITION
--------- ----- -------- ----------------- ---- ------ --------- ------ ------ ------ -------- ------- --------
   <Null>   TST TYPETEST CINTEGER             3 NUMBER        38     40      0     10        0    ""          1
   <Null>   TST TYPETEST CNUMBER              3 NUMBER        15      8 <Null>     10        1 <Null>         2
   <Null>   TST TYPETEST CNUMBER_38_0         3 NUMBER        38     40      0     10        1 <Null>         3
   <Null>   TST TYPETEST CNUMBER_11_2         3 NUMBER        11     13      2     10        1 <Null>         4
   <Null>   TST TYPETEST CNUMBER_XX_2         3 NUMBER        38     40      2     10        1 <Null>         5
   <Null>   TST TYPETEST CFLOAT               8 FLOAT         15      8 <Null>     10        1 <Null>         6
   <Null>   TST TYPETEST CFLOAT_11            8 FLOAT         15      8 <Null>     10        1 <Null>         7
   <Null>   TST TYPETEST CREAL                8 FLOAT         15      8 <Null>     10        1 <Null>         8
   <Null>   TST TYPETEST CDOUBLE_PRECISION    8 FLOAT         15      8 <Null>     10        1 <Null>         9
   <Null>   TST TYPETEST CDATE               11 DATE          19     16      0     10        1 <Null>        10
   <Null>   TST TYPETEST CCHAR                1 CHAR           1      1 <Null> <Null>        1 <Null>        11
   <Null>   TST TYPETEST CVARCHAR            12 VARCHAR2       7      7 <Null> <Null>        1 <Null>        12
   <Null>   TST TYPETEST CVARCHAR2           12 VARCHAR2       7      7 <Null> <Null>        1 <Null>        13


select null
     , co.owner
     , co.table_name
     , co.column_name
     , decode( data_type
       , 'CHAR'    ,  1
       , 'DATE'    , 11
       , 'FLOAT'   ,  8
       , 'LONG'    , -1
       , 'LONG RAW', -4
       , 'NUMBER'  ,  3
       , 'RAW'     , -3
       , 'VARCHAR2', 12
       , 'ROWID'   ,  1
       , 0
       )
     , data_type
     , decode( data_type
       , 'DATE'    , 19
       , 'FLOAT'   , 15
       , 'LONG'    , 2147483647
       , 'LONG RAW', 2147483647
       , 'ROWID'   , 18
       , 'NUMBER'  , decode( data_precision
                     , null, decode( data_scale
                             , null, 15
                             , 0   , 38
                             , 38
                             )
                     , data_precision
                     )
       , data_length
       )
     , decode( data_type
       , 'LONG'    , 2147483647
       , 'FLOAT'   , 8
       , 'NUMBER'  , decode( data_precision
                     , null, decode( data_scale
                             , null, 8
                             , 0   , 40
                             , 40
                             )
                     , data_precision + 2
                     )
       , 'DATE'    , 16
       , 'ROWID'   , 18
       , data_length
       )
     , decode( data_type
       , 'DATE'    , 0
       , 'FLOAT'   , null
       , data_scale
       )
     , decode( data_type
       , 'NUMBER'  , 10
       , 'FLOAT'   , 10
       , 'DATE'    , 10
       , null
       )
     , decode( nullable
       , 'N', 0
       , 'Y', 1
       , 2
       )
     , cm.comments
     , co.column_id
  from all_tab_columns  co
     , all_col_comments cm
 where co.table_name    = cm.table_name
   and co.column_name   = cm.column_name
   and co.owner         = cm.owner
   and co.owner      like 'TST' escape '\'
   and co.table_name like 'TYPETEST' escape '\'
order by 1, 2, 3, 13

--------------252EC21CD9CDE48B09DB1330--

0
s
10/24/2001 3:02:31 PM
--------------FBA6A96C5BD1229B360FBD30
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: 7bit

Let's continue with Oracle's ODBC driver!

It seems, that many column values are processed at the client
side. It's a pity, because in this way the SQL statement contains
less useful information.

REMARKS are omitted at all! (There is no join with ALL_COL_COMMENTS.)

COLUMN_DEFs are omitted! Maybe, because ALL_TAB_COLUMNS.DATA_DEFAULT
is a LONG?

CHAR_OCTET_LENGTHs are omitted!

The BUFFER_LENGTH for FLOATS looks dubious. How fit 8 bytes into
126 bits ... er ... vice versa: how fit 126 bits (the max. binary
precision of FLOATs) into an 8 byte buffer?

In addition to base tables, they provide the column information for
SYNONYMS too.


Steffen
--------------FBA6A96C5BD1229B360FBD30
Content-Type: text/plain; charset=us-ascii; name="ora817.txt"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline; filename="ora817.txt"

Oracle ODBC 8.1.7:
==================

MS ODBC Test 2.60.0905
----------------------

Get Info All:
  SQL_DBMS_NAME       =  17,  6, "Oracle"
  SQL_DBMS_VER        =  18, 10, "08.01.0721"
  SQL_DM_VER          = 171, 15, "03.52.6019.0000"
  SQL_DRIVER_NAME     =   6, 11, "SQORA32.DLL"
  SQL_DRIVER_ODBC_VER =  77,  5, "03.51"
  SQL_DRIVER_VER      =   7, 10, "08.01.0704"
  SQL_ODBC_VER        =  10, 10, "03.52.0000"

SQLColumns:
  In:
    StatementHandle = 0x008A1860
    CatalogName     = SQL_NULL_HANDLE, NameLength1 = 0
    SchemaName      = "TST"          , NameLength2 = 3
    TableName       = "TYPETEST"     , NameLength3 = 8
    ColumnName      = SQL_NULL_HANDLE, NameLength4 = 0
  Return:
    SQL_SUCCESS     = 0

Get Data All:
TABLE TABLE TABLE    COLUMN          DATA TYPE         COLUMN BUFFER DECIMAL NUM_PREC NULLABLE REMARKS COLUMN SQL_DATA SQL_DATE CHAR_OCTET ORDINAL  IS
CAT   SCHEM NAME     NAME            TYPE NAME           SIZE LENGTH DIGITS  RADIX                     DEF    TYPE     TIME_SUB LENGTH     POSITION NULLABLE
----- ----- -------- --------------- ---- ------------ ------ ------ ------- -------- -------- ------- ------ -------- -------- ---------- -------- --------
""    TST   TYPETEST CINTEGER           3 DECIMAL          38     40       0       10        0 ""      ""            3                            1 NO
""    TST   TYPETEST CNUMBER            8 DOUBLE PRECISION  0     40  <Null>       10        1 ""      ""            8                            2 YES
""    TST   TYPETEST CNUMBER_38_0       3 DECIMAL          38     40       0       10        1 ""      ""            3                            3 YES
""    TST   TYPETEST CNUMBER_11_2       3 DECIMAL          11     13       2       10        1 ""      ""            3                            4 YES
""    TST   TYPETEST CNUMBER_XX_2       3 DECIMAL          38     40       2       10        1 ""      ""            3                            5 YES
""    TST   TYPETEST CFLOAT             8 DOUBLE PRECISION 38      8  <Null>       10        1 ""      ""            8                            6 YES
""    TST   TYPETEST CFLOAT_11          8 DOUBLE PRECISION  4      8  <Null>       10        1 ""      ""            8                            7 YES
""    TST   TYPETEST CREAL              8 DOUBLE PRECISION 19      8  <Null>       10        1 ""      ""            8                            8 YES
""    TST   TYPETEST CDOUBLE_PRECISION  8 DOUBLE PRECISION 38      8  <Null>       10        1 ""      ""            8                            9 YES
""    TST   TYPETEST CDATE             93 DATE             19     16  <Null>   <Null>        1 ""      ""            9        3                  10 YES
""    TST   TYPETEST CCHAR              1 CHAR              1      1  <Null>   <Null>        1 ""      ""            1                           11 YES
""    TST   TYPETEST CVARCHAR          12 VARCHAR2          7      7  <Null>   <Null>        1 ""      ""           12                           12 YES
""    TST   TYPETEST CVARCHAR2         12 VARCHAR2          7      7  <Null>   <Null>        1 ""      ""           12                           13 YES
13 rows fetched from 18 columns.


SELECT /*+ RULE */
       ''
     , owner
     , table_name
     , column_name
     , 0
     , data_type
     , data_precision
     , decode( data_type
       ,'DATE'    ,         16
       ,'FLOAT'   ,          8
       ,'LONG RAW', 2147483647
       ,'LONG'    , 2147483647
       ,'CLOB'    , 2147483647
       ,'BLOB'    , 2147483647
       ,'BFILE'   , 2147483647
       ,'NUMBER'  , NVL( data_precision + 2, 40 )
       , data_length
       )
     , data_scale
     , 0
     , decode( nullable, 'Y', 1, 'N', 0 )
     , ''
     , ''
     , 0
     , 0
     , 0
     , column_id
     , decode( nullable, 'Y', 'YES', 'N', 'NO')
  FROM all_tab_columns
 WHERE TABLE_NAME LIKE 'TYPETES%'
   AND OWNER         = 'TST'

   UNION

SELECT /*+ RULE */
       ''
     , b.owner
     , b.synonym_name
     , a.column_name
     , 0
     , a.data_type
     , a.data_precision
     , a.data_length
     , a.data_scale
     , 0
     , decode(a.nullable, 'Y', 1, 'N', 0)
     , ''
     , ''
     , 0
     , 0
     , 0
     , a.column_id
     , decode(a.nullable, 'Y', 'YES', 'N', 'NO')
 FROM all_tab_columns a
    , all_synonyms    b
WHERE a.table_name      = b.table_name
  and a.owner           = b.table_owner
  AND b.synonym_name LIKE 'TYPETES%'
  AND b.OWNER           = 'TST'

 ORDER BY 2,3,17

--------------FBA6A96C5BD1229B360FBD30--

0
s
10/25/2001 10:03:33 AM
--------------40D955F6B834D9A8AB99B6B3
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: 7bit

Attached is a possible implementation for DBD::Oracle.


Steffen
--------------40D955F6B834D9A8AB99B6B3
Content-Type: text/plain; charset=us-ascii; name="Oracle.pm.diff"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline; filename="Oracle.pm.diff"

*** DBD-Oracle-1.12/Oracle.pm	Fri Aug 31 18:27:18 2001
--- Oracle.pm	Sun Oct 28 15:53:27 2001
***************
*** 442,447 ****
--- 442,578 ----
  	$sth;
  }
  
+ 
+     sub column_info {
+ 	my $dbh  = shift;
+ 	my $attr = ( ref $_[0] eq 'HASH') ? $_[0] : {
+ 	    'TABLE_SCHEM' => $_[1],'TABLE_NAME' => $_[2],'COLUMN_NAME' => $_[3] };
+ 	my $Sql = <<'SQL';
+ SELECT *
+   FROM
+ (
+   SELECT to_char( NULL )     TABLE_CAT
+        , tc.OWNER            TABLE_SCHEM
+        , tc.TABLE_NAME       TABLE_NAME
+        , tc.COLUMN_NAME      COLUMN_NAME
+        , decode( tc.DATA_TYPE
+          , 'MLSLABEL' , -9106
+          , 'ROWID'    , -9104
+          , 'UROWID'   , -9104
+          , 'BFILE'    ,    -4 -- 31?
+          , 'LONG RAW' ,    -4
+          , 'RAW'      ,    -3
+          , 'LONG'     ,    -1
+          , 'UNDEFINED',     0
+          , 'CHAR'     ,     1
+          , 'NCHAR'    ,     1
+          , 'NUMBER'   ,     decode( tc.DATA_SCALE, NULL, 8, 3 )
+          , 'FLOAT'    ,     8
+          , 'VARCHAR2' ,    12
+          , 'NVARCHAR2',    12
+          , 'BLOB'     ,    30
+          , 'CLOB'     ,    40
+          , 'NCLOB'    ,    40
+          , 'DATE'     ,    93
+          , NULL
+          )                   DATA_TYPE          -- ...
+        , tc.DATA_TYPE        TYPE_NAME          -- std.?
+        , decode( tc.DATA_TYPE
+          , 'LONG RAW' , 2147483647
+          , 'LONG'     , 2147483647
+          , 'CLOB'     , 2147483647
+          , 'NCLOB'    , 2147483647
+          , 'BLOB'     , 2147483647
+          , 'BFILE'    , 2147483647
+          , 'NUMBER'   , decode( tc.DATA_SCALE
+                         , NULL, 126
+                         , nvl( tc.DATA_PRECISION, 38 )
+                         )
+          , 'FLOAT'    , tc.DATA_PRECISION
+          , 'DATE'     , 19
+          , tc.DATA_LENGTH
+          )                   COLUMN_SIZE
+        , decode( tc.DATA_TYPE
+          , 'LONG RAW' , 2147483647
+          , 'LONG'     , 2147483647
+          , 'CLOB'     , 2147483647
+          , 'NCLOB'    , 2147483647
+          , 'BLOB'     , 2147483647
+          , 'BFILE'    , 2147483647
+          , 'NUMBER'   , nvl( tc.DATA_PRECISION, 38 ) + 2
+          , 'FLOAT'    ,  8 -- ?
+          , 'DATE'     , 16
+          , tc.DATA_LENGTH
+          )                   BUFFER_LENGTH
+        , decode( tc.DATA_TYPE
+          , 'DATE'     ,  0
+          , tc.DATA_SCALE
+          )                   DECIMAL_DIGITS     -- ...
+        , decode( tc.DATA_TYPE
+          , 'FLOAT'    ,  2
+          , 'NUMBER'   ,  decode( tc.DATA_SCALE, NULL, 2, 10 )
+          , NULL
+          )                   NUM_PREC_RADIX
+        , decode( tc.NULLABLE
+          , 'Y'        ,  1
+          , 'N'        ,  0
+          , NULL
+          )                   NULLABLE
+        , cc.COMMENTS         REMARKS
+        , tc.DATA_DEFAULT     COLUMN_DEF         -- Column is LONG!
+        , decode( tc.DATA_TYPE
+          , 'MLSLABEL' , -9106
+          , 'ROWID'    , -9104
+          , 'UROWID'   , -9104
+          , 'BFILE'    ,    -4 -- 31?
+          , 'LONG RAW' ,    -4
+          , 'RAW'      ,    -3
+          , 'LONG'     ,    -1
+          , 'UNDEFINED',     0
+          , 'CHAR'     ,     1
+          , 'NCHAR'    ,     1
+          , 'NUMBER'   ,     decode( tc.DATA_SCALE, NULL, 8, 3 )
+          , 'FLOAT'    ,     8
+          , 'VARCHAR2' ,    12
+          , 'NVARCHAR2',    12
+          , 'BLOB'     ,    30
+          , 'CLOB'     ,    40
+          , 'NCLOB'    ,    40
+          , 'DATE'     ,     9 -- not 93!
+          , NULL
+          )                   SQL_DATA_TYPE      -- ...
+        , decode( tc.DATA_TYPE
+          , 'DATE'     ,     3
+          , NULL
+          )                   SQL_DATETIME_SUB   -- ...
+        , null                CHAR_OCTET_LENGTH  -- TODO
+        , tc.COLUMN_ID        ORDINAL_POSITION
+        , decode( tc.NULLABLE
+          , 'Y'        , 'YES'
+          , 'N'        , 'NO'
+          , NULL
+          )                   IS_NULLABLE
+     FROM ALL_TAB_COLUMNS  tc
+        , ALL_COL_COMMENTS cc
+    WHERE tc.OWNER         = cc.OWNER
+      AND tc.TABLE_NAME    = cc.TABLE_NAME
+      AND tc.COLUMN_NAME   = cc.COLUMN_NAME
+ )
+  WHERE 1              = 1
+ SQL
+ 	my @BindVals = ();
+ 	while ( my ( $k, $v ) = each %$attr ) {
+ 	    if ( $v ) {
+ 		$Sql .= "   AND $k LIKE ?\n";
+ 		push @BindVals, $v;
+ 	    }
+ 	}
+ 	$Sql .= " ORDER BY TABLE_SCHEM, TABLE_NAME, ORDINAL_POSITION\n";
+ 	my $sth = $dbh->prepare( $Sql ) or return undef;
+ 	$sth->execute( @BindVals ) or return undef;
+ 	$sth;
+     }
+ 
      sub type_info_all {
  	my ($dbh) = @_;
  	my $names = {
***************
*** 903,908 ****
--- 1034,1061 ----
  Oracle returns it.
  See L</table_info()> for more detailed information.
  
+ =head2 C<column_info()>
+ 
+ Oracle does not support catalogs so TABLE_CAT is ignored as
+ selection criterion.
+ The TABLE_CAT field of a fetched row is always NULL (undef).
+ See L</table_info()> for more detailed information.
+ 
+ The CHAR_OCTET_LENGTH field is (currently) always NULL (undef).
+ 
+ Don't rely on the values of the BUFFER_LENGTH field!
+ Especially the length of FLOATs may be wrong.
+ 
+ Datatype codes for non-standard types are subject to change.
+ 
+ Attention! The DATA_DEFAULT (COLUMN_DEF) column is of type LONG.
+ 
+ The result set is ordered by TABLE_SCHEM, TABLE_NAME, ORDINAL_POSITION.
+ 
+ An identifier is passed I<as is>, i.e. as the user provides or
+ Oracle returns it.
+ See L</table_info()> for more detailed information.
+ 
  
  =head1 International NLS / 8-bit text issues
  

--------------40D955F6B834D9A8AB99B6B3--

0
s
10/29/2001 10:28:28 AM
On Mon, Oct 29, 2001 at 11:28:28AM +0100, Steffen Goeldner wrote:
> Attached is a possible implementation for DBD::Oracle.

Many thanks Steffen!

Tim.
0
Tim
10/29/2001 10:25:57 PM
--------------8D9353B86731E6D5B2F6A929
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: 7bit

Attached is *not* a patch - it's a first cut and a cry for help!
I have problems mapping the ADO fields to SQL/CLI (ODBC, DBI)
fields, especially the datatype related fields.
I guess that the magic DBD::ADO::_determine_type_support() may
provide part of a solution.
Any suggestions, hints, insides, patches, ... are welcome!

BTW: It seems, that the statement handle attributes need the
     same mapping.


Steffen
--------------8D9353B86731E6D5B2F6A929
Content-Type: text/plain; charset=us-ascii; name="column_info"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline; filename="column_info"


	sub column_info {
		my( $dbh, @Criteria ) = @_;
		my $Criteria = \@Criteria if @Criteria;
		my $QueryType = 'adSchemaColumns';
		my @Rows;
		my $conn = $dbh->{ado_conn};
		my $tmpCursorLocation = $conn->{CursorLocation};
		$conn->{CursorLocation} = $ado_consts->{adUseClient};

		my $RecSet = $conn->OpenSchema( $ado_consts->{$QueryType}, $Criteria );
		my $lastError = DBD::ADO::errors($conn);
		return DBI::set_err($dbh, $DBD::ADO::err,
			"Error occurred with call to OpenSchema ($QueryType): $lastError")
				if $lastError;

		$RecSet->{Sort} = 'TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, ORDINAL_POSITION';
		$lastError = DBD::ADO::errors($conn);
		return DBI::set_err($dbh, $DBD::ADO::err,
			"Error occurred defining sort order : $lastError")
				if $lastError;

		while ( ! $RecSet->{EOF} ) {
			my @Fields;
#			my @Fields = map { $RecSet->Fields($_)->{Value} } ( 0..3,11,x,6..9,12..14,16,15,17 );
			$Fields[ 0] = $RecSet->Fields('TABLE_CATALOG'           )->{Value}; # TABLE_CAT
			$Fields[ 1] = $RecSet->Fields('TABLE_SCHEMA'            )->{Value}; # TABLE_SCHEM
			$Fields[ 2] = $RecSet->Fields('TABLE_NAME'              )->{Value}; # TABLE_NAME
			$Fields[ 3] = $RecSet->Fields('COLUMN_NAME'             )->{Value}; # COLUMN_NAME
			$Fields[ 4] = $RecSet->Fields('DATA_TYPE'               )->{Value}; # DATA_TYPE !!!
			$Fields[ 5] = $RecSet->Fields('COLUMN_FLAGS'            )->{Value}; # TYPE_NAME !!!
			$Fields[ 6] = $RecSet->Fields('NUMERIC_SCALE'           )->{Value}; # COLUMN_SIZE !!!
			$Fields[ 7] = $RecSet->Fields('CHARACTER_MAXIMUM_LENGTH')->{Value}; # BUFFER_LENGTH !!!
			$Fields[ 8] = $RecSet->Fields('NUMERIC_PRECISION'       )->{Value}; # DECIMAL_DIGITS ???
#			$Fields[ 9] = $RecSet->Fields(''                        )->{Value}; # NUM_PREC_RADIX !!!
			$Fields[10] = $RecSet->Fields('IS_NULLABLE'             )->{Value}; # NULLABLE !!!
			$Fields[11] = $RecSet->Fields('DESCRIPTION'             )->{Value}; # REMARKS
			$Fields[12] = $RecSet->Fields('COLUMN_DEFAULT'          )->{Value}; # COLUMN_DEF
#			$Fields[13] = $RecSet->Fields(''                        )->{Value}; # SQL_DATA_TYPE !!!
#			$Fields[14] = $RecSet->Fields(''                        )->{Value}; # SQL_DATETIME_SUB !!!
			$Fields[15] = $RecSet->Fields('CHARACTER_OCTET_LENGTH'  )->{Value}; # CHAR_OCTET_LENGTH
			$Fields[16] = $RecSet->Fields('ORDINAL_POSITION'        )->{Value}; # ORDINAL_POSITION
			$Fields[17] = $RecSet->Fields('IS_NULLABLE'             )->{Value}; # IS_NULLABLE !!!

#			TODO:
#			$Fields[ 4] = ado2sql_type( ... );
#			...

			push( @Rows, \@Fields );
			$RecSet->MoveNext;
		}
		$RecSet->Close; undef $RecSet;
		$conn->{CursorLocation} = $tmpCursorLocation;

		DBI->connect('dbi:Sponge:','','', { RaiseError => 1 })->prepare(
			$QueryType, { rows => \@Rows, NAME =>
			[ qw( TABLE_CAT TABLE_SCHEM TABLE_NAME COLUMN_NAME DATA_TYPE TYPE_NAME COLUMN_SIZE BUFFER_LENGTH DECIMAL_DIGITS NUM_PREC_RADIX NULLABLE REMARKS COLUMN_DEF SQL_DATA_TYPE SQL_DATETIME_SUB CHAR_OCTET_LENGTH ORDINAL_POSITION IS_NULLABLE ) ]});
	}


--------------8D9353B86731E6D5B2F6A929--

0
s
10/31/2001 8:26:14 AM
--------------A8BADF322172088E2A68C415
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: 7bit

Steffen Goeldner wrote:
> 
> Attached is *not* a patch - it's a first cut and a cry for help!
> I have problems mapping the ADO fields to SQL/CLI (ODBC, DBI)
> fields, especially the datatype related fields.
> I guess that the magic DBD::ADO::_determine_type_support() may
> provide part of a solution.
> Any suggestions, hints, insides, patches, ... are welcome!
> 

No, I didn't give up! I'm still playing with OpenSchema() and
investigate the results. Thereby, I encountered some difficulties
with the DBD::ADO constants ($ado_consts) - more precisely: how
they are stored.
It's easy to lookup DBD::ADO constants by name, e.g.:

  $ado_consts->{adChar} == 129

Unfortunately, Win32::OLE::Const does not preserve the namespace
of the enums. It's a matter of taste, but I think

  $ado_consts->{DataTypeEnum}{adChar} == 129

makes the code more self-documented. Furthermore, many DBD::ADO
methods return numeric codes. Transforming these codes into human
readable strings requires an inverse lookup by value. Building the
reverse hash for e.g. all datatypes requires that datatype constants
can be distinguished from other constants, i.e. we need the namespace
preserved.
The Enums() method of the attached package returns a hash of hashes
for exactly this purpose. Now you can do:

  my $Enums = Local::DBI::ADO::TypeInfo->Enums;
  my %Types = reverse %{$Enums->{DataTypeEnum}};

  my $sth = $dbh->func('adSchemaColumns', @Criteria, 'OpenSchema');
  while ( my $Row = $sth->fetch ) {
    ...
    print $Row->[11] , ' is ', $Types{$Row->[11]};  # DATA_TYPE
    ...
  }


Steffen
--------------A8BADF322172088E2A68C415
Content-Type: text/plain; charset=us-ascii; name="TypeInfo.pm"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline; filename="TypeInfo.pm"

package Local::DBI::ADO::TypeInfo;

use Win32::OLE();
use Win32::OLE::TypeInfo();

my $ProgId  = 'ADODB.Connection';
my $VarSkip = Win32::OLE::TypeInfo::VARFLAG_FHIDDEN()
            | Win32::OLE::TypeInfo::VARFLAG_FRESTRICTED()
            | Win32::OLE::TypeInfo::VARFLAG_FNONBROWSABLE()
            ;
my $Enums;

# -----------------------------------------------------------------------------
sub Enums
# -----------------------------------------------------------------------------
{
  my $class = shift;

  return $Enums if $Enums;

  my $TypeLib = Win32::OLE->new( $ProgId )->GetTypeInfo->GetContainingTypeLib;

  for my $i ( 0 .. $TypeLib->_GetTypeInfoCount - 1 )
  {
    my $TypeInfo = $TypeLib->_GetTypeInfo( $i );
    my $TypeAttr = $TypeInfo->_GetTypeAttr;
    next unless $TypeAttr->{typekind} == Win32::OLE::TypeInfo::TKIND_ENUM();
    my $Enum = $Enums->{$TypeInfo->_GetDocumentation->{Name}} = {};
    for my $i ( 0 .. $TypeAttr->{cVars} - 1 )
    {
      my $VarDesc = $TypeInfo->_GetVarDesc( $i );
      next if $VarDesc->{wVarFlags} & $VarSkip;
      my $Documentation = $TypeInfo->_GetDocumentation( $VarDesc->{memid} );
      $Enum->{$Documentation->{Name}} = $VarDesc->{varValue};
    }
  }
  return $Enums;
}
# -----------------------------------------------------------------------------
__PACKAGE__;

=head1 NAME

Local::DBI::ADO::TypeInfo - ADO TypeInfo

=head1 SYNOPSIS

  use Local::DBI::ADO::TypeInfo();

  $\ = "\n";

  my $Enums = Local::DBI::ADO::TypeInfo->Enums;

  for my $Enum ( sort keys %$Enums )
  {
    print $Enum;
    for my $Const ( sort keys %{$Enums->{$Enum}} )
    {
      printf "  %-35s 0x%X\n", $Const, $Enums->{$Enum}{$Const};
    }
  }

=cut

--------------A8BADF322172088E2A68C415--

0
s
11/23/2001 9:22:14 AM
On Wed, Oct 31, 2001 at 09:26:14AM +0100, Steffen Goeldner wrote:
> Attached is *not* a patch - it's a first cut and a cry for help!
> I have problems mapping the ADO fields to SQL/CLI (ODBC, DBI)
> fields, especially the datatype related fields.
> I guess that the magic DBD::ADO::_determine_type_support() may
> provide part of a solution.
> Any suggestions, hints, insides, patches, ... are welcome!

> BTW: It seems, that the statement handle attributes need the
>      same mapping.

Now that I'm looking at this again I remember why I skipped it ;->

> 
> 	sub column_info {

I'm beginning to remember why converting ADO to the SQL/ODBC was such a
pain:  Take a simple example of what OpenSchema(adSchemaProviderType)
returns verse what the table column types return.

The Provider supports:

-> data type Short:          2 
-> data type Long:           3 
-> data type Single:         4 
-> data type Double:         5 
-> data type Currency:       6
-> data type DateTime:       7
-> data type Bit:           11
-> data type Byte:          17
-> data type GUID:          72
-> data type BigBinary:    128
-> data type LongBinary:   128
-> data type VarBinary:    128
-> data type LongText:     130
-> data type VarChar:      130
-> data type Decimal:      131

However, my table columns types are
		Number:     5 (adDouble)
        Text:     202 (adVarWChar)
        Number:   131 (adNumeric)
        Number:   131 (adNumeric)
        Date/Time:  7 (adDate)
        Memo:     203 (adLongVarWChar)

Type 5   is     supported at mytest.pl line 36
Type 202 is not supported at mytest.pl line 36
Type 131 is     supported at mytest.pl line 36
Type 131 is     supported at mytest.pl line 36
Type 7   is     supported at mytest.pl line 36
Type 203 is not supported at mytest.pl line 36

So the Provider does not supply any information on how to support
data types adVarWChar and adLongVarWChar. 

Converting from the an ADO type to the SQL/ODBC type, without support
from the provider, may be difficult.
We'll need to look at more then just the type in an attempt to map it.
As the provider above shows, the same data type may have different
column type depending on the other attributes:

		 TYPE_NAME 
		*DATA_TYPE 
		*COLUMN_SIZE 
		 LITERAL_PREFIX 
		 LITERAL_SUFFIX 
		 CREATE_PARAMS 
		 IS_NULLABLE 
		 CASE_SENSITIVE 
		 SEARCHABLE 
		*UNSIGNED_ATTRIBUTE 
		*FIXED_PREC_SCALE 
		*AUTO_UNIQUE_VALUE 
		*LOCAL_TYPE_NAME 
		 MINIMUM_SCALE 
		 MAXIMUM_SCALE
		 GUID 
		 TYPELIB 
		 VERSION 
		*IS_LONG 
		*BEST_MATCH 
		*IS_FIXEDLENGTH 

I'll look at mapping the SQL_* types to ADO attributes.

Tom

_________________________________________________________
Do You Yahoo!?
Get your free @yahoo.com address at http://mail.yahoo.com

0
stlowery
11/25/2001 3:03:39 AM
On Sat, Nov 24, 2001 at 10:03:39PM -0500, Thomas A.Lowery wrote:
> 
> On Wed, Oct 31, 2001 at 09:26:14AM +0100, Steffen Goeldner wrote:
> > Attached is *not* a patch - it's a first cut and a cry for help!
> > I have problems mapping the ADO fields to SQL/CLI (ODBC, DBI)
> > fields, especially the datatype related fields.
> > I guess that the magic DBD::ADO::_determine_type_support() may
> > provide part of a solution.
> > Any suggestions, hints, insides, patches, ... are welcome!
> 
> > BTW: It seems, that the statement handle attributes need the
> >      same mapping.
> 
> Now that I'm looking at this again I remember why I skipped it ;->
> 
> > 
> > 	sub column_info {
> 
> I'm beginning to remember why converting ADO to the SQL/ODBC was such a
> pain:  Take a simple example of what OpenSchema(adSchemaProviderType)
> returns verse what the table column types return.
> 
> The Provider supports:
> 
> -> data type Short:          2 
> -> data type Long:           3 
> -> data type Single:         4 
> -> data type Double:         5 
> -> data type Currency:       6
> -> data type DateTime:       7
> -> data type Bit:           11
> -> data type Byte:          17
> -> data type GUID:          72
> -> data type BigBinary:    128
> -> data type LongBinary:   128
> -> data type VarBinary:    128
> -> data type LongText:     130
> -> data type VarChar:      130
> -> data type Decimal:      131
> 
> However, my table columns types are
> 		Number:     5 (adDouble)
>         Text:     202 (adVarWChar)
>         Number:   131 (adNumeric)
>         Number:   131 (adNumeric)
>         Date/Time:  7 (adDate)
>         Memo:     203 (adLongVarWChar)
> 
> Type 5   is     supported at mytest.pl line 36
> Type 202 is not supported at mytest.pl line 36
> Type 131 is     supported at mytest.pl line 36
> Type 131 is     supported at mytest.pl line 36
> Type 7   is     supported at mytest.pl line 36
> Type 203 is not supported at mytest.pl line 36
> 
> So the Provider does not supply any information on how to support
> data types adVarWChar and adLongVarWChar. 

Perhaps ADO char types already support unicode.

Tim.

> Converting from the an ADO type to the SQL/ODBC type, without support
> from the provider, may be difficult.
> We'll need to look at more then just the type in an attempt to map it.
> As the provider above shows, the same data type may have different
> column type depending on the other attributes:
> 
> 		 TYPE_NAME 
> 		*DATA_TYPE 
> 		*COLUMN_SIZE 
> 		 LITERAL_PREFIX 
> 		 LITERAL_SUFFIX 
> 		 CREATE_PARAMS 
> 		 IS_NULLABLE 
> 		 CASE_SENSITIVE 
> 		 SEARCHABLE 
> 		*UNSIGNED_ATTRIBUTE 
> 		*FIXED_PREC_SCALE 
> 		*AUTO_UNIQUE_VALUE 
> 		*LOCAL_TYPE_NAME 
> 		 MINIMUM_SCALE 
> 		 MAXIMUM_SCALE
> 		 GUID 
> 		 TYPELIB 
> 		 VERSION 
> 		*IS_LONG 
> 		*BEST_MATCH 
> 		*IS_FIXEDLENGTH 
> 
> I'll look at mapping the SQL_* types to ADO attributes.
> 
> Tom
> 
> _________________________________________________________
> Do You Yahoo!?
> Get your free @yahoo.com address at http://mail.yahoo.com
> 
0
Tim
11/25/2001 10:33:22 AM
> > > BTW: It seems, that the statement handle attributes need the
> > >      same mapping.
> > 
> > So the Provider does not supply any information on how to support
> > data types adVarWChar and adLongVarWChar. 
> 
> Perhaps ADO char types already support unicode.

I does appear that the Jet driver supports unicode, however it would
be very helpful if the Provider informed us ... <sigh>  In other
words, type_info_all has no knowledge of the unicode support because
the provider does not list the data types in a call to
OpenSchema(adSchemaProviderType).

Here is a beginning conversion table:
	I need to create a patch for DBI to support SQL_UNKNOWN_TYPE, but
	for now it's a constant.

	use constant SQL_UNKNOWN_TYPE		=> 0;

	$myado_types_supported = {
	  $ado_consts->{adArray}				=>      SQL_UNKNOWN_TYPE
	, $ado_consts->{adBigInt}				=>      SQL_UNKNOWN_TYPE
	, $ado_consts->{adBinary}				=> DBI::SQL_BINARY
	, $ado_consts->{adBoolean}				=>      SQL_UNKNOWN_TYPE
	, $ado_consts->{adBSTR}					=>      SQL_UNKNOWN_TYPE
	, $ado_consts->{adChapter}				=>      SQL_UNKNOWN_TYPE
	, $ado_consts->{adChar}					=> DBI::SQL_CHAR
	, $ado_consts->{adCurrency}				=>      SQL_UNKNOWN_TYPE
	, $ado_consts->{adDate}					=> DBI::SQL_DATE
	, $ado_consts->{adDBDate}				=> DBI::SQL_DATE
	, $ado_consts->{adDBTime}				=> DBI::SQL_TIMESTAMP
	, $ado_consts->{adDBTimeStamp}			=> DBI::SQL_TIMESTAMP
	, $ado_consts->{adDecimal}				=> DBI::SQL_DECIMAL
	, $ado_consts->{adDouble}				=> DBI::SQL_DOUBLE
	, $ado_consts->{adEmpty}				=>      SQL_UNKNOWN_TYPE
	, $ado_consts->{adError}				=>      SQL_UNKNOWN_TYPE
	, $ado_consts->{adFileTime}				=> DBI::SQL_TIMESTAMP
	, $ado_consts->{adGUID}					=>      SQL_UNKNOWN_TYPE
	, $ado_consts->{adIDispatch}			=>      SQL_UNKNOWN_TYPE
	, $ado_consts->{adInteger}				=> DBI::SQL_INTEGER
	, $ado_consts->{adIUnknown}				=>      SQL_UNKNOWN_TYPE
	, $ado_consts->{adLongVarBinary}		=> DBI::SQL_LONGVARBINARY
	, $ado_consts->{adLongVarChar}			=> DBI::SQL_LONGVARCHAR
	, $ado_consts->{adLongVarWChar}			=> DBI::SQL_WLONGVARCHAR
	, $ado_consts->{adNumeric}				=> DBI::SQL_NUMERIC
	, $ado_consts->{adPropVariant}			=>      SQL_UNKNOWN_TYPE
	, $ado_consts->{adSingle}				=>      SQL_UNKNOWN_TYPE
	, $ado_consts->{adSmallInt}				=> DBI::SQL_SMALLINT
	, $ado_consts->{adTinyInt}				=> DBI::SQL_TINYINT
	, $ado_consts->{adUnsignedBigInt}		=>      SQL_UNKNOWN_TYPE
	, $ado_consts->{adUnsignedInt}			=>      SQL_UNKNOWN_TYPE
	, $ado_consts->{adUnsignedSmallInt}		=>      SQL_UNKNOWN_TYPE
	, $ado_consts->{adUnsignedTinyInt}		=>      SQL_UNKNOWN_TYPE
	, $ado_consts->{adUserDefined}			=>      SQL_UNKNOWN_TYPE
	, $ado_consts->{adVarBinary}			=> DBI::SQL_VARBINARY
	, $ado_consts->{adVarChar}				=> DBI::SQL_VARCHAR
	, $ado_consts->{adVariant}				=>      SQL_UNKNOWN_TYPE
	, $ado_consts->{adVarNumeric}			=> DBI::SQL_INTEGER
	, $ado_consts->{adVarWChar}				=> DBI::SQL_WVARCHAR
	, $ado_consts->{adWChar}				=> DBI::SQL_WCHAR
	};

	Changes welcomed!

Tom


-- 
Thomas A. Lowery
See DBI/FAQ http://tlowery.hypermart.net

_________________________________________________________
Do You Yahoo!?
Get your free @yahoo.com address at http://mail.yahoo.com

0
stlowery
11/26/2001 4:21:16 AM
--------------3368F3285D26D0A18AF89C48
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: 7bit

Thomas A. Lowery wrote:
> 
> On Wed, Oct 31, 2001 at 09:26:14AM +0100, Steffen Goeldner wrote:
> > Attached is *not* a patch - it's a first cut and a cry for help!
> > I have problems mapping the ADO fields to SQL/CLI (ODBC, DBI)
> > fields, especially the datatype related fields.
> > I guess that the magic DBD::ADO::_determine_type_support() may
> > provide part of a solution.
> > Any suggestions, hints, insides, patches, ... are welcome!
> 
> > BTW: It seems, that the statement handle attributes need the
> >      same mapping.
> 
> Now that I'm looking at this again I remember why I skipped it ;->
> 
> >
> >       sub column_info {
> 
> I'm beginning to remember why converting ADO to the SQL/ODBC was such a
> pain:  Take a simple example of what OpenSchema(adSchemaProviderType)
  ---- !!!

> returns verse what the table column types return.
> 
> The Provider supports:
> 
> -> data type Short:          2
> -> data type Long:           3
> -> data type Single:         4
> -> data type Double:         5
> -> data type Currency:       6
> -> data type DateTime:       7
> -> data type Bit:           11
> -> data type Byte:          17
> -> data type GUID:          72
> -> data type BigBinary:    128
> -> data type LongBinary:   128
> -> data type VarBinary:    128
> -> data type LongText:     130
> -> data type VarChar:      130
> -> data type Decimal:      131
> 

Looks like Microsoft.Jet.OLEDB.4.0?

> However, my table columns types are
>                 Number:     5 (adDouble)
>         Text:     202 (adVarWChar)
>         Number:   131 (adNumeric)
>         Number:   131 (adNumeric)
>         Date/Time:  7 (adDate)
>         Memo:     203 (adLongVarWChar)
>

Can you list some provider properties, please?
My provider returns other results, see attachment.
 
> Type 5   is     supported at mytest.pl line 36
> Type 202 is not supported at mytest.pl line 36
> Type 131 is     supported at mytest.pl line 36
> Type 131 is     supported at mytest.pl line 36
> Type 7   is     supported at mytest.pl line 36
> Type 203 is not supported at mytest.pl line 36
> 
> So the Provider does not supply any information on how to support
> data types adVarWChar and adLongVarWChar.
>

IMO, the provider is buggy! From the ADO docs:

 adVarChar      200 Indicates a string value
                    (Parameter object only).
 adVarWChar     202 Indicates a null-terminated Unicode character
                    string (Parameter object only).
 adLongVarWChar 203 Indicates a long null-terminated Unicode string
                    value (Parameter object only).

Note: Parameter object only! Thus, a Field object should never
      contain these datatypes.

Further, these types are no valid 'Type Indicators' for the
DATA_TYPE column of the COLUMNS Rowset.
 
> Converting from the an ADO type to the SQL/ODBC type, without support
> from the provider, may be difficult.
> We'll need to look at more then just the type in an attempt to map it.

>From the COLUMNS Rowset (adSchemaColumns), we'll need:

 - DATA_TYPE                     !
 - IS_NULLABLE                   ? see COLUMN_FLAGS
 - COLUMN_FLAGS                  ! not all flags, but:
   - DBCOLUMNFLAGS_ISFIXEDLENGTH !
   - DBCOLUMNFLAGS_ISLONG        !
   - DBCOLUMNFLAGS_ISNULLABLE    ? see IS_NULLABLE
   - DBCOLUMNFLAGS_MAYBENULL     ? see DBCOLUMNFLAGS_ISNULLABLE
   - ...                         ? e.g. DBCOLUMNFLAGS_ISROWID

Thus, a DBD::ADO method (to be written!) like:

   $sql_type = ado2sql( $ado_type, $is_fix, $is_long )

should give us an appropriate SQL DATA_TYPE (in most cases).
Finding the TYPE_NAME seems much harder (I think we'll need
adSchemaProviderType).

Unfortunately, every source (COLUMNS Rowset, PROVIDER_TYPES Rowset,
Field object) returns the type info in a slightly different way :-(

> As the provider above shows, the same data type may have different
> column type depending on the other attributes:
> 
>                  TYPE_NAME
>                 *DATA_TYPE
>                 *COLUMN_SIZE
>                  LITERAL_PREFIX
>                  LITERAL_SUFFIX
>                  CREATE_PARAMS
>                  IS_NULLABLE
>                  CASE_SENSITIVE
>                  SEARCHABLE
>                 *UNSIGNED_ATTRIBUTE
>                 *FIXED_PREC_SCALE
>                 *AUTO_UNIQUE_VALUE
>                 *LOCAL_TYPE_NAME
>                  MINIMUM_SCALE
>                  MAXIMUM_SCALE
>                  GUID
>                  TYPELIB
>                  VERSION
>                 *IS_LONG
>                 *BEST_MATCH
>                 *IS_FIXEDLENGTH
> 
> I'll look at mapping the SQL_* types to ADO attributes.
> 
> Tom
> 

Steffen
--------------3368F3285D26D0A18AF89C48--

0
s
11/26/2001 1:50:09 PM
Thomas A. Lowery wrote:
> 
> > > > BTW: It seems, that the statement handle attributes need the
> > > >      same mapping.
> > >
> > > So the Provider does not supply any information on how to support
> > > data types adVarWChar and adLongVarWChar.
> >
> > Perhaps ADO char types already support unicode.
> 
> I does appear that the Jet driver supports unicode, however it would

That's new in Jet 4.0 (Access 2000), see e.g.:

 <http://support.microsoft.com/support/kb/articles/q275/5/61.asp>

> be very helpful if the Provider informed us ... <sigh>  In other
> words, type_info_all has no knowledge of the unicode support because
> the provider does not list the data types in a call to
> OpenSchema(adSchemaProviderType).

It does: 130 == adWChar!
However, it seems that the result of OpenSchema(adSchemaProviderType)
depends on the provider, but not on the data source. I got the same
results for an old Access 2.0 (< Jet 4.0) datafile format.

> 
> Here is a beginning conversion table:
>         I need to create a patch for DBI to support SQL_UNKNOWN_TYPE, but
>         for now it's a constant.
> 
>         use constant SQL_UNKNOWN_TYPE           => 0;
> 
>         $myado_types_supported = {
>           $ado_consts->{adArray}                                =>      SQL_UNKNOWN_TYPE
>         , $ado_consts->{adBigInt}                               =>      SQL_UNKNOWN_TYPE
>         , $ado_consts->{adBinary}                               => DBI::SQL_BINARY
>         , $ado_consts->{adBoolean}                              =>      SQL_UNKNOWN_TYPE
>         , $ado_consts->{adBSTR}                                 =>      SQL_UNKNOWN_TYPE
>         , $ado_consts->{adChapter}                              =>      SQL_UNKNOWN_TYPE
>         , $ado_consts->{adChar}                                 => DBI::SQL_CHAR
>         , $ado_consts->{adCurrency}                             =>      SQL_UNKNOWN_TYPE
>         , $ado_consts->{adDate}                                 => DBI::SQL_DATE
>         , $ado_consts->{adDBDate}                               => DBI::SQL_DATE
>         , $ado_consts->{adDBTime}                               => DBI::SQL_TIMESTAMP
>         , $ado_consts->{adDBTimeStamp}                  => DBI::SQL_TIMESTAMP
>         , $ado_consts->{adDecimal}                              => DBI::SQL_DECIMAL
>         , $ado_consts->{adDouble}                               => DBI::SQL_DOUBLE
>         , $ado_consts->{adEmpty}                                =>      SQL_UNKNOWN_TYPE
>         , $ado_consts->{adError}                                =>      SQL_UNKNOWN_TYPE
>         , $ado_consts->{adFileTime}                             => DBI::SQL_TIMESTAMP
>         , $ado_consts->{adGUID}                                 =>      SQL_UNKNOWN_TYPE
>         , $ado_consts->{adIDispatch}                    =>      SQL_UNKNOWN_TYPE
>         , $ado_consts->{adInteger}                              => DBI::SQL_INTEGER
>         , $ado_consts->{adIUnknown}                             =>      SQL_UNKNOWN_TYPE
>         , $ado_consts->{adLongVarBinary}                => DBI::SQL_LONGVARBINARY
>         , $ado_consts->{adLongVarChar}                  => DBI::SQL_LONGVARCHAR
>         , $ado_consts->{adLongVarWChar}                 => DBI::SQL_WLONGVARCHAR
>         , $ado_consts->{adNumeric}                              => DBI::SQL_NUMERIC
>         , $ado_consts->{adPropVariant}                  =>      SQL_UNKNOWN_TYPE
>         , $ado_consts->{adSingle}                               =>      SQL_UNKNOWN_TYPE
>         , $ado_consts->{adSmallInt}                             => DBI::SQL_SMALLINT
>         , $ado_consts->{adTinyInt}                              => DBI::SQL_TINYINT
>         , $ado_consts->{adUnsignedBigInt}               =>      SQL_UNKNOWN_TYPE
>         , $ado_consts->{adUnsignedInt}                  =>      SQL_UNKNOWN_TYPE
>         , $ado_consts->{adUnsignedSmallInt}             =>      SQL_UNKNOWN_TYPE
>         , $ado_consts->{adUnsignedTinyInt}              =>      SQL_UNKNOWN_TYPE
>         , $ado_consts->{adUserDefined}                  =>      SQL_UNKNOWN_TYPE
>         , $ado_consts->{adVarBinary}                    => DBI::SQL_VARBINARY
>         , $ado_consts->{adVarChar}                              => DBI::SQL_VARCHAR
>         , $ado_consts->{adVariant}                              =>      SQL_UNKNOWN_TYPE
>         , $ado_consts->{adVarNumeric}                   => DBI::SQL_INTEGER
>         , $ado_consts->{adVarWChar}                             => DBI::SQL_WVARCHAR
>         , $ado_consts->{adWChar}                                => DBI::SQL_WCHAR
>         };
> 
>         Changes welcomed!
>

The next DBI release (Tim?) may allow a more complete mapping, see:

 <http://archive.develooper.com/dbi-dev@perl.org/msg00483.html>


Steffen

0
s
11/26/2001 2:17:32 PM
On Mon, Nov 26, 2001 at 03:17:32PM +0100, Steffen Goeldner wrote:
> 
> The next DBI release (Tim?) may allow a more complete mapping, see:
> 
>  <http://archive.develooper.com/dbi-dev@perl.org/msg00483.html>

Yeap.

Tim.
0
Tim
11/26/2001 9:24:32 PM
--C7zPtVaVf+AK4Oqc
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline

Steffen,

        So that we're talking apples to apples, I've attached a zip file
        that includes an experimental version of DBD::ADO (2.4_01), an
        Access 2000 mdb (mytest.mdb) with a table called demo that
        includes all the different data types, a perl test script
        (mytest.pl), various short cut commands, and the results of
        mytest.pl (out.txt).

        Are you seeing the same results?  Also, do you have a pre Jet 4.0
        (Access 2000) mdb that you would send me?


Tom

p.s. I'm guessing that the list server will strip the binary file, so
anyone else who would like a copy please email me directly.  Also, DO
NOT use this version in production.

On Mon, Nov 26, 2001 at 03:17:32PM +0100, Steffen Goeldner wrote:
> Thomas A. Lowery wrote:
> > 
> > > > > BTW: It seems, that the statement handle attributes need the
> > > > >      same mapping.
> > > >
> > > > So the Provider does not supply any information on how to support
> > > > data types adVarWChar and adLongVarWChar.
> > >
> > > Perhaps ADO char types already support unicode.
> > 
> > I does appear that the Jet driver supports unicode, however it would
> 
> That's new in Jet 4.0 (Access 2000), see e.g.:
> 
>  <http://support.microsoft.com/support/kb/articles/q275/5/61.asp>
> 
> > be very helpful if the Provider informed us ... <sigh>  In other
> > words, type_info_all has no knowledge of the unicode support because
> > the provider does not list the data types in a call to
> > OpenSchema(adSchemaProviderType).
> 
> It does: 130 == adWChar!
> However, it seems that the result of OpenSchema(adSchemaProviderType)
> depends on the provider, but not on the data source. I got the same
> results for an old Access 2.0 (< Jet 4.0) datafile format.

-- 
Thomas A. Lowery
See DBI/FAQ http://tlowery.hypermart.net

--C7zPtVaVf+AK4Oqc
Content-Type: application/zip
Content-Disposition: attachment; filename="dbd_ado_t_2_4_01.zip"
Content-Transfer-Encoding: base64

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
AQAAmIgAAAAA

--C7zPtVaVf+AK4Oqc--

_________________________________________________________
Do You Yahoo!?
Get your free @yahoo.com address at http://mail.yahoo.com

0
stlowery
11/27/2001 3:03:40 AM
--------------E92C233B8CA16B379479ADE7
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: 7bit

Thomas A. Lowery wrote:
> 
> Steffen,
> 
>         So that we're talking apples to apples, I've attached a zip file
>         that includes an experimental version of DBD::ADO (2.4_01), an
>         Access 2000 mdb (mytest.mdb) with a table called demo that
>         includes all the different data types, a perl test script
>         (mytest.pl), various short cut commands, and the results of
>         mytest.pl (out.txt).
> 
>         Are you seeing the same results?

Yes, except for

 Microsoft.Jet.OLEDB.4.0	2.5

Indeed, I compared apples and oranges! The strange types in your
example are from the 'Type' property of a 'Field' (of a
'Recordset'), but most of my tests use OpenSchema(), e.g.:

 perl OpenSchema.pl adSchemaColumns "" "" demo

where I never encountered these strange type values.
I'm sure enough: it's a buggy implementation of the provider.
Nevertheless, we have to cope with this.

Interestingly, ADO defines for 3 sources of type information:

 - Type Property in the Field Object
 - DATA_TYPE in the COLUMNS Rowset (adSchemaColumns)
 - DATA_TYPE in the PROVIDER_TYPES Rowset (adSchemaProviderTypes)

3 different domains:

 - DataTypeEnum
 - DBTYPEENUM 
 - (undefined)

>         Also, do you have a pre Jet 4.0
>         (Access 2000) mdb that you would send me?
> 

Attached. You can create older formats with

 ODBC Data Source Administrator
 -> (choose a MS Access Data Source)
    -> Configure ...
       -> Create ...
          -> (choose a format: 4.x, 3.x, 2.x)


> Tom
> 

Let me add some remarks for convert_ado_to_odbc():

 - adArray is a special case: it's not a type of it's own, but
   'always combined with another data type constant'
   (according to the ADO docs, I have no test case)

 - SQL/CLI and ODBC need 2 additional type codes for temporal types:

   - SQL_DATA_TYPE (!= DATA_TYPE)
   - SQL_DATETIME_SUB

   => a case for wantarray?


Steffen
--------------E92C233B8CA16B379479ADE7
Content-Type: application/x-gzip; name="2x.mdb.tar.gz"
Content-Transfer-Encoding: base64
Content-Disposition: inline; filename="2x.mdb.tar.gz"

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
CIIgCIIgCIIgCIJc9vwfTpShmQAYAQA=
--------------E92C233B8CA16B379479ADE7--

0
s
11/27/2001 2:04:42 PM
Steffen Goeldner wrote:
> 
> From the COLUMNS Rowset (adSchemaColumns), we'll need:
> 
>  - DATA_TYPE                     !
>  - IS_NULLABLE                   ? see COLUMN_FLAGS
>  - COLUMN_FLAGS                  ! not all flags, but:
>    - DBCOLUMNFLAGS_ISFIXEDLENGTH !
>    - DBCOLUMNFLAGS_ISLONG        !
>    - DBCOLUMNFLAGS_ISNULLABLE    ? see IS_NULLABLE
>    - DBCOLUMNFLAGS_MAYBENULL     ? see DBCOLUMNFLAGS_ISNULLABLE
>    - ...                         ? e.g. DBCOLUMNFLAGS_ISROWID
> 

DBCOLUMNFLAGS are defined in oledb.h and (AFAIK) not available via
TypeLib. However, there is a quite good match between DBCOLUMNFLAGS
and ADO's FieldAttributeEnum's:

 %DBCOLUMNFLAGS =    #   oledb.h # %FieldAttributeEnum =   # adoint.h
 (                               # (
   ISBOOKMARK        =>      0x1 #
 , MAYDEFER          =>      0x2 #   adFldMayDefer         =>     0x2
 , WRITE             =>      0x4 # , adFldUpdatable        =>     0x4
 , WRITEUNKNOWN      =>      0x8 # , adFldUnknownUpdatable =>     0x8
 , ISFIXEDLENGTH     =>     0x10 # , adFldFixed            =>    0x10
 , ISNULLABLE        =>     0x20 # , adFldIsNullable       =>    0x20
 , MAYBENULL         =>     0x40 # , adFldMayBeNull        =>    0x40
 , ISLONG            =>     0x80 # , adFldLong             =>    0x80
 , ISROWID           =>    0x100 # , adFldRowID            =>   0x100
 , ISROWVER          =>    0x200 # , adFldRowVersion       =>   0x200
 , CACHEDEFERRED     =>   0x1000 # , adFldCacheDeferred    =>  0x1000
 , ISCHAPTER         =>   0x2000 # , adFldIsChapter        =>  0x2000
 , SCALEISNEGATIVE   =>   0x4000 # , adFldNegativeScale    =>  0x4000
 , RESERVED          =>   0x8000 # , adFldKeyColumn        =>  0x8000
 , ISROWURL          =>  0x10000 # , adFldIsRowURL         => 0x10000
 , ISDEFAULTSTREAM   =>  0x20000 # , adFldIsDefaultStream  => 0x20000
 , ISCOLLECTION      =>  0x40000 # , adFldIsCollection     => 0x40000
 , ISSTREAM          =>  0x80000 #
 , ISROWSET          => 0x100000 #
 , ISROW             => 0x200000 #
 , ROWSPECIFICCOLUMN => 0x400000 #
                                 # , adFldUnspecified      =>      -1
 };                              # };

Tom, what's your opinion? Can we use the FieldAttributeEnum's or
should we add %DBCOLUMNFLAGS to DBD::ADO?


> Thus, a DBD::ADO method (to be written!) like:
> 
>    $sql_type = ado2sql( $ado_type, $is_fix, $is_long )
> 
> should give us an appropriate SQL DATA_TYPE (in most cases).
> Finding the TYPE_NAME seems much harder (I think we'll need
> adSchemaProviderType).
> 
> Unfortunately, every source (COLUMNS Rowset, PROVIDER_TYPES Rowset,
> Field object) returns the type info in a slightly different way :-(
> 


Steffen

0
s
11/30/2001 10:26:14 AM
> Tom, what's your opinion? Can we use the FieldAttributeEnum's or
> should we add %DBCOLUMNFLAGS to DBD::ADO?

My opinion is to use FieldAttritueEnum. Two reasons:  It's supported
in TypeLib, and inherit to ADO.  Less problems with changes in the
future.

Tom

On Fri, Nov 30, 2001 at 11:26:14AM +0100, Steffen Goeldner wrote:
> Steffen Goeldner wrote:
> > 
> > From the COLUMNS Rowset (adSchemaColumns), we'll need:
> > 
> >  - DATA_TYPE                     !
> >  - IS_NULLABLE                   ? see COLUMN_FLAGS
> >  - COLUMN_FLAGS                  ! not all flags, but:
> >    - DBCOLUMNFLAGS_ISFIXEDLENGTH !
> >    - DBCOLUMNFLAGS_ISLONG        !
> >    - DBCOLUMNFLAGS_ISNULLABLE    ? see IS_NULLABLE
> >    - DBCOLUMNFLAGS_MAYBENULL     ? see DBCOLUMNFLAGS_ISNULLABLE
> >    - ...                         ? e.g. DBCOLUMNFLAGS_ISROWID
> > 
> 
> DBCOLUMNFLAGS are defined in oledb.h and (AFAIK) not available via
> TypeLib. However, there is a quite good match between DBCOLUMNFLAGS
> and ADO's FieldAttributeEnum's:
> 
>  %DBCOLUMNFLAGS =    #   oledb.h # %FieldAttributeEnum =   # adoint.h
>  (                               # (
>    ISBOOKMARK        =>      0x1 #
>  , MAYDEFER          =>      0x2 #   adFldMayDefer         =>     0x2
>  , WRITE             =>      0x4 # , adFldUpdatable        =>     0x4
>  , WRITEUNKNOWN      =>      0x8 # , adFldUnknownUpdatable =>     0x8
>  , ISFIXEDLENGTH     =>     0x10 # , adFldFixed            =>    0x10
>  , ISNULLABLE        =>     0x20 # , adFldIsNullable       =>    0x20
>  , MAYBENULL         =>     0x40 # , adFldMayBeNull        =>    0x40
>  , ISLONG            =>     0x80 # , adFldLong             =>    0x80
>  , ISROWID           =>    0x100 # , adFldRowID            =>   0x100
>  , ISROWVER          =>    0x200 # , adFldRowVersion       =>   0x200
>  , CACHEDEFERRED     =>   0x1000 # , adFldCacheDeferred    =>  0x1000
>  , ISCHAPTER         =>   0x2000 # , adFldIsChapter        =>  0x2000
>  , SCALEISNEGATIVE   =>   0x4000 # , adFldNegativeScale    =>  0x4000
>  , RESERVED          =>   0x8000 # , adFldKeyColumn        =>  0x8000
>  , ISROWURL          =>  0x10000 # , adFldIsRowURL         => 0x10000
>  , ISDEFAULTSTREAM   =>  0x20000 # , adFldIsDefaultStream  => 0x20000
>  , ISCOLLECTION      =>  0x40000 # , adFldIsCollection     => 0x40000
>  , ISSTREAM          =>  0x80000 #
>  , ISROWSET          => 0x100000 #
>  , ISROW             => 0x200000 #
>  , ROWSPECIFICCOLUMN => 0x400000 #
>                                  # , adFldUnspecified      =>      -1
>  };                              # };
> 
> > Thus, a DBD::ADO method (to be written!) like:
> > 
> >    $sql_type = ado2sql( $ado_type, $is_fix, $is_long )
> > 
> > should give us an appropriate SQL DATA_TYPE (in most cases).
> > Finding the TYPE_NAME seems much harder (I think we'll need
> > adSchemaProviderType).
> > 
> > Unfortunately, every source (COLUMNS Rowset, PROVIDER_TYPES Rowset,
> > Field object) returns the type info in a slightly different way :-(

-- 
Thomas A. Lowery
See DBI/FAQ http://tlowery.hypermart.net

_________________________________________________________
Do You Yahoo!?
Get your free @yahoo.com address at http://mail.yahoo.com

0
stlowery
12/1/2001 6:26:35 PM
Local::DBI::ADO::TypeInfo - ADO TypeInfo

I'd like to include this with DBD::ADO, except using the package name
DBD::ADO::TypeInfo. This is excellent work and does increase the self
documenting code and clarity. OK?

Steffen, THANK YOU for all your contributions!

Tom

On Fri, Nov 23, 2001 at 10:22:14AM +0100, Steffen Goeldner wrote:

> No, I didn't give up! I'm still playing with OpenSchema() and
> investigate the results. Thereby, I encountered some difficulties
> with the DBD::ADO constants ($ado_consts) - more precisely: how
> they are stored.
> It's easy to lookup DBD::ADO constants by name, e.g.:
> 
>   $ado_consts->{adChar} == 129
> 
> Unfortunately, Win32::OLE::Const does not preserve the namespace
> of the enums. It's a matter of taste, but I think
> 
>   $ado_consts->{DataTypeEnum}{adChar} == 129
> 
> makes the code more self-documented. Furthermore, many DBD::ADO
> methods return numeric codes. Transforming these codes into human
> readable strings requires an inverse lookup by value. Building the
> reverse hash for e.g. all datatypes requires that datatype constants
> can be distinguished from other constants, i.e. we need the namespace
> preserved.
> The Enums() method of the attached package returns a hash of hashes
> for exactly this purpose. Now you can do:
> 
>   my $Enums = Local::DBI::ADO::TypeInfo->Enums;
>   my %Types = reverse %{$Enums->{DataTypeEnum}};
> 
>   my $sth = $dbh->func('adSchemaColumns', @Criteria, 'OpenSchema');
>   while ( my $Row = $sth->fetch ) {
>     ...
>     print $Row->[11] , ' is ', $Types{$Row->[11]};  # DATA_TYPE
>     ...
>   }

-- 
Thomas A. Lowery
See DBI/FAQ http://tlowery.hypermart.net

_________________________________________________________
Do You Yahoo!?
Get your free @yahoo.com address at http://mail.yahoo.com

0
stlowery
12/1/2001 6:47:16 PM
Thomas A. Lowery wrote:
> 
> Local::DBI::ADO::TypeInfo - ADO TypeInfo
> 
> I'd like to include this with DBD::ADO, except using the package name
> DBD::ADO::TypeInfo. This is excellent work and does increase the self
> documenting code and clarity. OK?
> 

Yes, of course!


Steffen

0
s
12/3/2001 3:10:25 PM
Thomas A. Lowery wrote:
> 
> > Tom, what's your opinion? Can we use the FieldAttributeEnum's or
> > should we add %DBCOLUMNFLAGS to DBD::ADO?
> 
> My opinion is to use FieldAttritueEnum. Two reasons:  It's supported
> in TypeLib, and inherit to ADO.  Less problems with changes in the
> future.
> 

O.k.! The use of the FieldAttritueEnum flags in column_info() may
look like:

  sub column_info {
    ...
    while ( ! $RecSet->{EOF} ) {
      ...
      my @Fields;
      my $AdoType  = $RecSet->Fields('DATA_TYPE'   )->{Value};
      my $ColFlags = $RecSet->Fields('COLUMN_FLAGS')->{Value};
      my $IsLong   = ( $ColFlags & $ado_consts->{adFldLong } ) ? 1 : 0;
      my $IsFixed  = ( $ColFlags & $ado_consts->{adFldFixed} ) ? 1 : 0;
      my $SqlType  = DBD::ADO::db::convert_ado_to_odbc( $dbh, $AdoType, $IsLong, $IsFixed );
      ...
      $Fields[ 4]  = $SqlType;  # DATA_TYPE
      ...

In order to handle $IsLong and $IsFixed, convert_ado_to_odbc() needs
a small extension:

  sub convert_ado_to_odbc {
    my ($dbh, $AdoType, $IsLong, $IsFixed ) = @_;

    return $dbh->DBI::set_err( -1,
      "convert_ado_to_odbc: call without any attributes.")
      unless $AdoType;

    unless( $ado_types_supported ) {
      &_determine_type_support($dbh);
    }

    if ( exists $myado_types_supported2->{$AdoType}{$IsLong}{$IsFixed} ) {
      return $myado_types_supported2->{$AdoType}{$IsLong}{$IsFixed};
    }

    if ( exists $myado_types_supported->{$AdoType} ) {
      return $myado_types_supported->{$AdoType};
    }

    return $AdoType;
  }

where $myado_types_supported2 may look like:

  $myado_types_supported2 = {
                # AdoType     IsLong IsFixed => SqlType
    $ado_consts->{adBinary   } => { 0 => { 0 =>      SQL_VARBINARY
                                         , 1 =>      SQL_BINARY        }
                                  , 1 => { 0 =>      SQL_LONGVARBINARY
                                         , 1 =>      SQL_UNKNOWN_TYPE  }}
  , $ado_consts->{adChar     } => { 0 => { 0 => DBI::SQL_VARCHAR
                                         , 1 => DBI::SQL_CHAR          }
                                  , 1 => { 0 =>      SQL_LONGVARCHAR
                                         , 1 =>      SQL_UNKNOWN_TYPE  }}
  , $ado_consts->{adWChar    } => { 0 => { 0 =>      SQL_WVARCHAR
                                         , 1 =>      SQL_WCHAR         }
                                  , 1 => { 0 =>      SQL_WLONGVARCHAR
                                         , 1 =>      SQL_UNKNOWN_TYPE  }}
# , $ado_consts->{adVarBinary} =>
# , $ado_consts->{adVarChar  } =>
# , $ado_consts->{adVarWChar } =>
  };

Excuse the code snippets - there are still many open issues ...
For your demo table in mytest.mdb, the following DATA_TYPE's
are returned:

 ID   :   4
 num1 :   4
 num2 :   5
 num3 :   6
 num4 :   8
 num5 : -11
 num6 :   2
 txt1 :  -9
 txt2 :  -9
 memo1: -10
 dt1  :   9
 cur1 :   2
 cur2 :   2
 cur3 :   2
 cur4 :   2
 cur5 :   2
 cur6 :   2
 cur7 :   2
 an2  : -11
 yn1  :  16
 yn2  :  16
 yn3  :  16
 oo1  :  -4
 hl1  : -10


Steffen

0
s
12/4/2001 3:32:44 PM
--------------75C91CBCF9411E4C6227F592
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: 7bit

This is still far from complete, but I made minor
improvements:

 - convert_ado_to_odbc() handles the very special 'adArray'
 - convert_ado_to_odbc() handles temporal datatypes
 - column_info() provides a more complete mapping

For your demo table, column_info() returns:

 demo ID      4 Long        10        0              4        1 NO
 demo num1    4 Long        10        1          0   4        2 YES
 demo num2    5 Short        5        1          0   5        3 YES
 demo num3    6 Single       7        1          0   6        4 YES
 demo num4    8 Double      15        1          0   8        5 YES
 demo num5  -11                       1            -11        6 YES
 demo num6    2 Decimal     18     0  1          0   2        7 YES
 demo txt1   -9 VarChar     50 100    1             -9   100  8 YES
 demo txt2   -9 VarChar    255 510    1             -9   510  9 YES
 demo memo1 -10 LongText     0   0    1            -10     0 10 YES
 demo dt1    93                       1              9 3     11 YES
 demo cur1    2 Decimal     19        1          0   2       12 YES
 demo cur2    2 Decimal     19        1          0   2       13 YES
 demo cur3    2 Decimal     19        1          0   2       14 YES
 demo cur4    2 Decimal     19        1          0   2       15 YES
 demo cur5    2 Decimal     19        1          0   2       16 YES
 demo cur6    2 Decimal     19        1          0   2       17 YES
 demo cur7    2 Decimal     19        1          0   2       18 YES
 demo an2   -11                       1  GenGUID() -11       19 YES
 demo yn1    16              2        0             16       20 NO
 demo yn2    16              2        0             16       21 NO
 demo yn3    16              2        0             16       22 NO
 demo oo1    -4 LongBinary   0   0    1             -4     0 23 YES
 demo hl1   -10 LongText     0   0    1            -10     0 24 YES

Next, I'll try to find proper TYPE_NAME's. I think about restricting
SchemaProviderTypes by $AdoType, $IsLong, $IsFixed. This gives:

 1)  0 records, if the provider is buggy
 2)  1 record in most cases
 3) >1 records, e.g. for different max column sizes

Case 2) is trivial.
Case 1) may return NULL (undef) or an standard SQL name?
Case 3) should return the first type which has a large enough
        COLUMN_SIZE


Steffen
--------------75C91CBCF9411E4C6227F592
Content-Type: text/plain; charset=us-ascii; name="ADO.pm.diff"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline; filename="ADO.pm.diff"

*** F:\tmp\DBD-ADO\lib\DBD\ADO.pm	Mon Nov 26 21:48:40 2001
--- W:\info\lang\perl\test\DBI\DBD\ADO.pm	Wed Dec 05 22:11:54 2001
***************
*** 95,100 ****
--- 95,101 ----
  my %connect_options;
  
  my $myado_types_supported = ();
+ my $myado_types_supported2 = ();
  
  
  
***************
*** 114,121 ****
  	use constant DBPROPVAL_TC_NONE	=> 0;
  
  	use constant SQL_GUID													=> -11;
! 	use constant SQL_BIGINT												=> - 6;
  	use constant SQL_UNKNOWN_TYPE									=>   0;
  	use constant SQL_BIT                          =>   14;
  	use constant SQL_BIT_VARYING                  =>   15;
  	use constant SQL_BOOLEAN                      =>   16;
--- 115,132 ----
  	use constant DBPROPVAL_TC_NONE	=> 0;
  
  	use constant SQL_GUID                         =>  -11;
! 	use constant SQL_WLONGVARCHAR                 =>  -10;
! 	use constant SQL_WVARCHAR                     =>   -9;
! 	use constant SQL_WCHAR                        =>   -8;
! 	use constant SQL_BIT                          =>   -7;
! 	use constant SQL_TINYINT                      =>   -6;
! 	use constant SQL_BIGINT                       =>   -5;
! 	use constant SQL_LONGVARBINARY                =>   -4;
! 	use constant SQL_VARBINARY                    =>   -3;
! 	use constant SQL_BINARY                       =>   -2;
! 	use constant SQL_LONGVARCHAR                  =>   -1;
  	use constant SQL_UNKNOWN_TYPE                 =>    0;
+ 
  	use constant SQL_BIT                          =>   14;
  	use constant SQL_BIT_VARYING                  =>   15;
  	use constant SQL_BOOLEAN                      =>   16;
***************
*** 162,167 ****
--- 173,198 ----
  	    $VT_I4_BYREF = Win32::OLE::Variant::VT_I4()
  			 | Win32::OLE::Variant::VT_BYREF();
  
+ 
+ 	$myado_types_supported2 = {
+ 	              # AdoType     IsLong IsFixed => SqlType
+ 	  $ado_consts->{adBinary   } => { 0 => { 0 =>      SQL_VARBINARY
+ 	                                       , 1 =>      SQL_BINARY        }
+ 	                                , 1 => { 0 =>      SQL_LONGVARBINARY
+ 	                                       , 1 =>      SQL_UNKNOWN_TYPE  }}
+ 	, $ado_consts->{adChar     } => { 0 => { 0 => DBI::SQL_VARCHAR
+ 	                                       , 1 => DBI::SQL_CHAR          }
+ 	                                , 1 => { 0 =>      SQL_LONGVARCHAR
+ 	                                       , 1 =>      SQL_UNKNOWN_TYPE  }}
+ 	, $ado_consts->{adWChar    } => { 0 => { 0 =>      SQL_WVARCHAR
+ 	                                       , 1 =>      SQL_WCHAR         }
+ 	                                , 1 => { 0 =>      SQL_WLONGVARCHAR
+ 	                                       , 1 =>      SQL_UNKNOWN_TYPE  }}
+ #	, $ado_consts->{adVarBinary} =>
+ #	, $ado_consts->{adVarChar  } =>
+ #	, $ado_consts->{adVarWChar } =>
+ 	};
+ 
  	$myado_types_supported = {
  	  $ado_consts->{adArray}						=>      SQL_ARRAY
  	, $ado_consts->{adBigInt}						=>      SQL_BIGINT
***************
*** 171,180 ****
  	, $ado_consts->{adChapter}					=>      SQL_UNKNOWN_TYPE
  	, $ado_consts->{adChar}							=> DBI::SQL_CHAR
  	, $ado_consts->{adCurrency}					=> DBI::SQL_NUMERIC
! 	, $ado_consts->{adDate}							=> DBI::SQL_DATE
! 	, $ado_consts->{adDBDate}						=> DBI::SQL_DATE
! 	, $ado_consts->{adDBTime}						=> DBI::SQL_TIME
! 	, $ado_consts->{adDBTimeStamp}			=> DBI::SQL_TIMESTAMP
  	, $ado_consts->{adDecimal}					=> DBI::SQL_DECIMAL
  	, $ado_consts->{adDouble}						=> DBI::SQL_DOUBLE
  	, $ado_consts->{adEmpty}						=>      SQL_UNKNOWN_TYPE
--- 202,211 ----
  	, $ado_consts->{adChapter}					=>      SQL_UNKNOWN_TYPE
  	, $ado_consts->{adChar}							=> DBI::SQL_CHAR
  	, $ado_consts->{adCurrency}					=> DBI::SQL_NUMERIC
! 	, $ado_consts->{adDate}							=>      SQL_TYPE_TIMESTAMP # XXX Not really!
! 	, $ado_consts->{adDBDate}						=>      SQL_TYPE_DATE
! 	, $ado_consts->{adDBTime}						=>      SQL_TYPE_TIME
! 	, $ado_consts->{adDBTimeStamp}			=>      SQL_TYPE_TIMESTAMP
  	, $ado_consts->{adDecimal}					=> DBI::SQL_DECIMAL
  	, $ado_consts->{adDouble}						=> DBI::SQL_DOUBLE
  	, $ado_consts->{adEmpty}						=>      SQL_UNKNOWN_TYPE
***************
*** 754,759 ****
--- 785,853 ----
  		$sth;
  	}
  
+ 	sub column_info {
+ 		my( $dbh, @Criteria ) = @_;
+ 		my $Criteria = \@Criteria if @Criteria;
+ 		my $QueryType = 'adSchemaColumns';
+ 		my @Rows;
+ 		my $conn = $dbh->{ado_conn};
+ 		my $tmpCursorLocation = $conn->{CursorLocation};
+ 		$conn->{CursorLocation} = $ado_consts->{adUseClient};
+ 
+ 		my $RecSet = $conn->OpenSchema( $ado_consts->{$QueryType}, $Criteria );
+ 		my $lastError = DBD::ADO::errors($conn);
+ 		return DBI::set_err($dbh, $DBD::ADO::err,
+ 			"Error occurred with call to OpenSchema ($QueryType): $lastError")
+ 				if $lastError;
+ 
+ 		$RecSet->{Sort} = 'TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, ORDINAL_POSITION';
+ 		$lastError = DBD::ADO::errors($conn);
+ 		return DBI::set_err($dbh, $DBD::ADO::err,
+ 			"Error occurred defining sort order : $lastError")
+ 				if $lastError;
+ 
+ 		while ( ! $RecSet->{EOF} ) {
+ 			my @Fields;
+ 			my $AdoType  = $RecSet->Fields('DATA_TYPE'   )->{Value};
+ 			my $ColFlags = $RecSet->Fields('COLUMN_FLAGS')->{Value};
+ 			my $IsLong   = ( $ColFlags & $ado_consts->{adFldLong } ) ? 1 : 0;
+ 			my $IsFixed  = ( $ColFlags & $ado_consts->{adFldFixed} ) ? 1 : 0;
+ 			my @SqlType  = DBD::ADO::db::convert_ado_to_odbc( $dbh, $AdoType, $IsLong, $IsFixed );
+ 			my $TypeInfo = $dbh->type_info( $SqlType[0] );
+ 			my $TypeName = $TypeInfo ? $TypeInfo->{TYPE_NAME} : undef;
+ 			my $IsNullable = $RecSet->Fields('IS_NULLABLE')->{Value} ? 'YES' : 'NO';
+ 
+ 			$Fields[ 0] = $RecSet->Fields('TABLE_CATALOG'           )->{Value}; # TABLE_CAT
+ 			$Fields[ 1] = $RecSet->Fields('TABLE_SCHEMA'            )->{Value}; # TABLE_SCHEM
+ 			$Fields[ 2] = $RecSet->Fields('TABLE_NAME'              )->{Value}; # TABLE_NAME
+ 			$Fields[ 3] = $RecSet->Fields('COLUMN_NAME'             )->{Value}; # COLUMN_NAME
+ 			$Fields[ 4] = $SqlType[0]                                         ; # DATA_TYPE !!!
+ 			$Fields[ 5] = $TypeName                                           ; # TYPE_NAME !!!
+ 			$Fields[ 6] = $RecSet->Fields('NUMERIC_PRECISION'       )->{Value}
+ 			           || $RecSet->Fields('CHARACTER_MAXIMUM_LENGTH')->{Value}; # COLUMN_SIZE !!! MAX for *LONG*
+ 			$Fields[ 7] = $RecSet->Fields('CHARACTER_OCTET_LENGTH'  )->{Value}; # BUFFER_LENGTH !!! MAX for *LONG*, ... (e.g. num)
+ 			$Fields[ 8] = $RecSet->Fields('NUMERIC_SCALE'           )->{Value}; # DECIMAL_DIGITS ???
+ 			$Fields[ 9] = undef                                               ; # NUM_PREC_RADIX !!!
+ 			$Fields[10] = $RecSet->Fields('IS_NULLABLE'             )->{Value}; # NULLABLE !!!
+ 			$Fields[11] = $RecSet->Fields('DESCRIPTION'             )->{Value}; # REMARKS
+ 			$Fields[12] = $RecSet->Fields('COLUMN_DEFAULT'          )->{Value}; # COLUMN_DEF
+ 			$Fields[13] = $SqlType[1]                                         ; # SQL_DATA_TYPE !!!
+ 			$Fields[14] = $SqlType[2]                                         ; # SQL_DATETIME_SUB !!!
+ 			$Fields[15] = $RecSet->Fields('CHARACTER_OCTET_LENGTH'  )->{Value}; # CHAR_OCTET_LENGTH !!! MAX for *LONG*
+ 			$Fields[16] = $RecSet->Fields('ORDINAL_POSITION'        )->{Value}; # ORDINAL_POSITION
+ 			$Fields[17] = $IsNullable                                         ; # IS_NULLABLE !!!
+ 
+ 			push( @Rows, \@Fields );
+ 			$RecSet->MoveNext;
+ 		}
+ 		$RecSet->Close; undef $RecSet;
+ 		$conn->{CursorLocation} = $tmpCursorLocation;
+ 
+ 		DBI->connect('dbi:Sponge:','','', { RaiseError => 1 })->prepare(
+ 			$QueryType, { rows => \@Rows, NAME =>
+ 			[ qw( TABLE_CAT TABLE_SCHEM TABLE_NAME COLUMN_NAME DATA_TYPE TYPE_NAME COLUMN_SIZE BUFFER_LENGTH DECIMAL_DIGITS NUM_PREC_RADIX NULLABLE REMARKS COLUMN_DEF SQL_DATA_TYPE SQL_DATETIME_SUB CHAR_OCTET_LENGTH ORDINAL_POSITION IS_NULLABLE ) ]});
+ 	}
+ 
  	sub primary_key_info {
  		my( $dbh, @Criteria ) = @_;
  		my $QueryType = 'adSchemaPrimaryKeys';
***************
*** 1011,1030 ****
  
  	# Attempt to convert an ADO data type into an ODBC/SQL data type.
  	sub convert_ado_to_odbc {
! 		my ($dbh, $attrib) = @_;
  
  			return $dbh->DBI::set_err( -1,
  				"convert_ado_to_odbc: call without any attributes.")
! 			unless $attrib;
  
  			unless( $ado_types_supported ) {
  				&_determine_type_support($dbh);
  			}
! 			if ( exists $myado_types_supported->{$attrib} ) {
! 				return $myado_types_supported->{$attrib};
  			}
  
! 		return $attrib;
  	}
  
  	sub OpenSchema {
--- 1105,1147 ----
  
  	# Attempt to convert an ADO data type into an ODBC/SQL data type.
  	sub convert_ado_to_odbc {
! 		my ($dbh, $AdoType, $IsLong, $IsFixed ) = @_;
  
  		return $dbh->DBI::set_err( -1,
  			"convert_ado_to_odbc: call without any attributes.")
! 			unless $AdoType;
  
  		unless( $ado_types_supported ) {
  			&_determine_type_support($dbh);
  		}
! 
! 		my $SqlType = 0;
! 
! 		if ( $AdoType & $ado_consts->{adArray} ) {
! 			$SqlType = 50;  # XXX DBI::SQL_ARRAY();
! 		}
! 		elsif ( exists $myado_types_supported2->{$AdoType}{$IsLong}{$IsFixed} ) {
! 			$SqlType = $myado_types_supported2->{$AdoType}{$IsLong}{$IsFixed};
! 		}
! 		elsif ( exists $myado_types_supported->{$AdoType} ) {
! 			$SqlType = $myado_types_supported->{$AdoType};
  		}
  
! 		if ( wantarray ) {  # DATA_TYPE, SQL_DATA_TYPE, SQL_DATETIME_SUB
! 			my @a = ( $SqlType );
! 
! 			if ( 90 < $SqlType && $SqlType < 100 ) {  # SQL_DATETIME
! 				push @a, 9, $SqlType - 90;
! 			}
! 			elsif ( 100 < $SqlType && $SqlType < 120 ) {  # SQL_INTERVAL
! 				push @a, 10, $SqlType - 100;
! 			}
! 			else {
! 				push @a, $SqlType, undef;
! 			}
! 			return @a;
! 		}
! 		return $SqlType;
  	}
  
  	sub OpenSchema {

--------------75C91CBCF9411E4C6227F592--

0
s
12/7/2001 2:08:14 PM
--------------A6C6A23DFC9AE6AB3B61A48C
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: 7bit

Steffen Goeldner wrote:
> 
> Next, I'll try to find proper TYPE_NAME's. I think about restricting
> SchemaProviderTypes by $AdoType, $IsLong, $IsFixed. This gives:
> 
>  1)  0 records, if the provider is buggy
>  2)  1 record in most cases
>  3) >1 records, e.g. for different max column sizes
> 
> Case 2) is trivial.
> Case 1) may return NULL (undef) or an standard SQL name?
> Case 3) should return the first type which has a large enough
>         COLUMN_SIZE
> 

For your demo table, column_info() returns:

||demo|   ID|  4|      Long| 10|   | ||0||         |  4| |   | 1| NO
||demo| num1|  4|      Long| 10|   | ||1||        0|  4| |   | 2|YES
||demo| num2|  5|     Short|  5|   | ||1||        0|  5| |   | 3|YES
||demo| num3|  6|    Single|  7|   | ||1||        0|  6| |   | 4|YES
||demo| num4|  8|    Double| 15|   | ||1||        0|  8| |   | 5|YES
||demo| num5|-11|      GUID|   |   | ||1||         |-11| |   | 6|YES
||demo| num6|  2|   Decimal| 18|   |0||1||        0|  2| |   | 7|YES
||demo| txt1| -9|   VarChar| 50|100| ||1||         | -9| |100| 8|YES
||demo| txt2| -9|   VarChar|255|510| ||1||         | -9| |510| 9|YES
||demo|memo1|-10|  LongText|  0|  0| ||1||         |-10| |  0|10|YES
||demo|  dt1| 93|  DateTime|   |   | ||1||         |  9|3|   |11|YES
||demo| cur1|  2|  Currency| 19|   | ||1||        0|  2| |   |12|YES
||demo| cur2|  2|  Currency| 19|   | ||1||        0|  2| |   |13|YES
||demo| cur3|  2|  Currency| 19|   | ||1||        0|  2| |   |14|YES
||demo| cur4|  2|  Currency| 19|   | ||1||        0|  2| |   |15|YES
||demo| cur5|  2|  Currency| 19|   | ||1||        0|  2| |   |16|YES
||demo| cur6|  2|  Currency| 19|   | ||1||        0|  2| |   |17|YES
||demo| cur7|  2|  Currency| 19|   | ||1||        0|  2| |   |18|YES
||demo|  an2|-11|      GUID|   |   | ||1||GenGUID()|-11| |   |19|YES
||demo|  yn1| 16|       Bit|  2|   | ||0||         | 16| |   |20| NO
||demo|  yn2| 16|       Bit|  2|   | ||0||         | 16| |   |21| NO
||demo|  yn3| 16|       Bit|  2|   | ||0||         | 16| |   |22| NO
||demo|  oo1| -4|LongBinary|  0|  0| ||1||         | -4| |  0|23|YES
||demo|  hl1|-10|  LongText|  0|  0| ||1||         |-10| |  0|24|YES

And for this table:

create table demo3
(
  cShort      Short
, cLong       Long
, cSingle     Single
, cDouble     Double
, cCurrency   Currency
, cDateTime   DateTime
, cBit        Bit
, cByte       Byte
, cGUID       GUID
, cBigBinary  BigBinary
, cLongBinary LongBinary
, cVarBinary  VarBinary (20)
, cLongText   LongText
, cVarChar    VarChar   (10)
, cDecimal    Decimal   (11,2)
)

column_info() returns:

||demo3|     cShort|  5|     Short|   5|    | ||1|||  5| |    | 1|YES
||demo3|      cLong|  4|      Long|  10|    | ||1|||  4| |    | 2|YES
||demo3|    cSingle|  6|    Single|   7|    | ||1|||  6| |    | 3|YES
||demo3|    cDouble|  8|    Double|  15|    | ||1|||  8| |    | 4|YES
||demo3|  cCurrency|  2|  Currency|  19|    | ||1|||  2| |    | 5|YES
||demo3|  cDateTime| 93|  DateTime|    |    | ||1|||  9|3|    | 6|YES
||demo3|       cBit| 16|       Bit|   2|    | ||0||| 16| |    | 7| NO
||demo3|      cByte|  0|      Byte|   3|    | ||1|||  0| |    | 8|YES
||demo3|      cGUID|-11|      GUID|    |    | ||1|||-11| |    | 9|YES
||demo3| cBigBinary| -3| BigBinary|4000|4000| ||1||| -3| |4000|10|YES
||demo3|cLongBinary| -4|LongBinary|   0|   0| ||1||| -4| |   0|11|YES
||demo3| cVarBinary| -3| VarBinary|  20|  20| ||1||| -3| |  20|12|YES
||demo3|  cLongText|-10|  LongText|   0|   0| ||1|||-10| |   0|13|YES
||demo3|   cVarChar| -9|   VarChar|  10|  20| ||1||| -9| |  20|14|YES
||demo3|   cDecimal|  2|   Decimal|  11|    |2||1|||  2| |    |15|YES


Steffen
--------------A6C6A23DFC9AE6AB3B61A48C
Content-Type: text/plain; charset=us-ascii; name="ADO.pm.diff"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline; filename="ADO.pm.diff"

*** F:\tmp\DBD-ADO\lib\DBD\ADO.pm	Mon Nov 26 21:48:40 2001
--- W:\info\lang\perl\test\DBI\DBD\ADO.pm	Sat Dec 08 21:55:57 2001
***************
*** 95,100 ****
--- 95,101 ----
  my %connect_options;
  
  my $myado_types_supported = ();
+ my $myado_types_supported2 = ();
  
  
  
***************
*** 114,121 ****
  	use constant DBPROPVAL_TC_NONE	=> 0;
  
  	use constant SQL_GUID													=> -11;
! 	use constant SQL_BIGINT												=> - 6;
  	use constant SQL_UNKNOWN_TYPE									=>   0;
  	use constant SQL_BIT                          =>   14;
  	use constant SQL_BIT_VARYING                  =>   15;
  	use constant SQL_BOOLEAN                      =>   16;
--- 115,132 ----
  	use constant DBPROPVAL_TC_NONE	=> 0;
  
  	use constant SQL_GUID                         =>  -11;
! 	use constant SQL_WLONGVARCHAR                 =>  -10;
! 	use constant SQL_WVARCHAR                     =>   -9;
! 	use constant SQL_WCHAR                        =>   -8;
! 	use constant SQL_BIT                          =>   -7;
! 	use constant SQL_TINYINT                      =>   -6;
! 	use constant SQL_BIGINT                       =>   -5;
! 	use constant SQL_LONGVARBINARY                =>   -4;
! 	use constant SQL_VARBINARY                    =>   -3;
! 	use constant SQL_BINARY                       =>   -2;
! 	use constant SQL_LONGVARCHAR                  =>   -1;
  	use constant SQL_UNKNOWN_TYPE                 =>    0;
+ 
  	use constant SQL_BIT                          =>   14;
  	use constant SQL_BIT_VARYING                  =>   15;
  	use constant SQL_BOOLEAN                      =>   16;
***************
*** 162,167 ****
--- 173,198 ----
  	    $VT_I4_BYREF = Win32::OLE::Variant::VT_I4()
  			 | Win32::OLE::Variant::VT_BYREF();
  
+ 
+ 	$myado_types_supported2 = {
+ 	              # AdoType     IsLong IsFixed => SqlType
+ 	  $ado_consts->{adBinary   } => { 0 => { 0 =>      SQL_VARBINARY
+ 	                                       , 1 =>      SQL_BINARY        }
+ 	                                , 1 => { 0 =>      SQL_LONGVARBINARY
+ 	                                       , 1 =>      SQL_UNKNOWN_TYPE  }}
+ 	, $ado_consts->{adChar     } => { 0 => { 0 => DBI::SQL_VARCHAR
+ 	                                       , 1 => DBI::SQL_CHAR          }
+ 	                                , 1 => { 0 =>      SQL_LONGVARCHAR
+ 	                                       , 1 =>      SQL_UNKNOWN_TYPE  }}
+ 	, $ado_consts->{adWChar    } => { 0 => { 0 =>      SQL_WVARCHAR
+ 	                                       , 1 =>      SQL_WCHAR         }
+ 	                                , 1 => { 0 =>      SQL_WLONGVARCHAR
+ 	                                       , 1 =>      SQL_UNKNOWN_TYPE  }}
+ #	, $ado_consts->{adVarBinary} =>
+ #	, $ado_consts->{adVarChar  } =>
+ #	, $ado_consts->{adVarWChar } =>
+ 	};
+ 
  	$myado_types_supported = {
  	  $ado_consts->{adArray}						=>      SQL_ARRAY
  	, $ado_consts->{adBigInt}						=>      SQL_BIGINT
***************
*** 171,180 ****
  	, $ado_consts->{adChapter}					=>      SQL_UNKNOWN_TYPE
  	, $ado_consts->{adChar}							=> DBI::SQL_CHAR
  	, $ado_consts->{adCurrency}					=> DBI::SQL_NUMERIC
! 	, $ado_consts->{adDate}							=> DBI::SQL_DATE
! 	, $ado_consts->{adDBDate}						=> DBI::SQL_DATE
! 	, $ado_consts->{adDBTime}						=> DBI::SQL_TIME
! 	, $ado_consts->{adDBTimeStamp}			=> DBI::SQL_TIMESTAMP
  	, $ado_consts->{adDecimal}					=> DBI::SQL_DECIMAL
  	, $ado_consts->{adDouble}						=> DBI::SQL_DOUBLE
  	, $ado_consts->{adEmpty}						=>      SQL_UNKNOWN_TYPE
--- 202,211 ----
  	, $ado_consts->{adChapter}					=>      SQL_UNKNOWN_TYPE
  	, $ado_consts->{adChar}							=> DBI::SQL_CHAR
  	, $ado_consts->{adCurrency}					=> DBI::SQL_NUMERIC
! 	, $ado_consts->{adDate}							=>      SQL_TYPE_TIMESTAMP # XXX Not really!
! 	, $ado_consts->{adDBDate}						=>      SQL_TYPE_DATE
! 	, $ado_consts->{adDBTime}						=>      SQL_TYPE_TIME
! 	, $ado_consts->{adDBTimeStamp}			=>      SQL_TYPE_TIMESTAMP
  	, $ado_consts->{adDecimal}					=> DBI::SQL_DECIMAL
  	, $ado_consts->{adDouble}						=> DBI::SQL_DOUBLE
  	, $ado_consts->{adEmpty}						=>      SQL_UNKNOWN_TYPE
***************
*** 754,759 ****
--- 785,862 ----
  		$sth;
  	}
  
+ 	sub column_info {
+ 		my( $dbh, @Criteria ) = @_;
+ 		my $Criteria = \@Criteria if @Criteria;
+ 		my $QueryType = 'adSchemaColumns';
+ 		my @Rows;
+ 		my $conn = $dbh->{ado_conn};
+ 		my $tmpCursorLocation = $conn->{CursorLocation};
+ 		$conn->{CursorLocation} = $ado_consts->{adUseClient};
+ 
+ 		my $RecSet = $conn->OpenSchema( $ado_consts->{$QueryType}, $Criteria );
+ 		my $lastError = DBD::ADO::errors($conn);
+ 		return DBI::set_err($dbh, $DBD::ADO::err,
+ 			"Error occurred with call to OpenSchema ($QueryType): $lastError")
+ 				if $lastError;
+ 
+ 		$RecSet->{Sort} = 'TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, ORDINAL_POSITION';
+ 		$lastError = DBD::ADO::errors($conn);
+ 		return DBI::set_err($dbh, $DBD::ADO::err,
+ 			"Error occurred defining sort order : $lastError")
+ 				if $lastError;
+ 
+ 		while ( ! $RecSet->{EOF} ) {
+ 			my @Fields;
+ 			my $AdoType    = $RecSet->Fields('DATA_TYPE'   )->{Value};
+ 			my $ColFlags   = $RecSet->Fields('COLUMN_FLAGS')->{Value};
+ 			my $IsLong     = ( $ColFlags & $ado_consts->{adFldLong } ) ? 1 : 0;
+ 			my $IsFixed    = ( $ColFlags & $ado_consts->{adFldFixed} ) ? 1 : 0;
+ 			my @SqlType    = DBD::ADO::db::convert_ado_to_odbc( $dbh, $AdoType, $IsFixed, $IsLong );
+ #			my $TypeInfo   = $dbh->type_info( $SqlType[0] );
+ #			my $TypeName   = $TypeInfo ? $TypeInfo->{TYPE_NAME} : undef;
+ 			my $TypeName;
+ 			my $IsNullable = $RecSet->Fields('IS_NULLABLE')->{Value} ? 'YES' : 'NO';
+ 			my $ColSize    = $RecSet->Fields('NUMERIC_PRECISION'       )->{Value}
+ 			              || $RecSet->Fields('CHARACTER_MAXIMUM_LENGTH')->{Value};
+ 			my $ado_tis    = DBD::ADO::db::_ado_get_type_info_for( $dbh, $AdoType, $IsFixed, $IsLong );
+ #			print '***', $AdoType, $IsFixed, $IsLong, ' => ', $ColSize, $RecSet->Fields('COLUMN_NAME')->{Value};
+ 			for my $ti ( sort { $a->{COLUMN_SIZE} <=> $b->{COLUMN_SIZE} } @$ado_tis )
+ 			{
+ 				$TypeName = $ti->{TYPE_NAME};
+ #				print '***', $AdoType, $IsFixed, $IsLong, ' => ', $ti->{TYPE_NAME}, $ti->{COLUMN_SIZE}, $ColSize, $RecSet->Fields('COLUMN_NAME')->{Value};
+ 				last if $ti->{COLUMN_SIZE} >= $ColSize;
+ 			}
+ 			$Fields[ 0] = $RecSet->Fields('TABLE_CATALOG'           )->{Value}; # TABLE_CAT
+ 			$Fields[ 1] = $RecSet->Fields('TABLE_SCHEMA'            )->{Value}; # TABLE_SCHEM
+ 			$Fields[ 2] = $RecSet->Fields('TABLE_NAME'              )->{Value}; # TABLE_NAME
+ 			$Fields[ 3] = $RecSet->Fields('COLUMN_NAME'             )->{Value}; # COLUMN_NAME
+ 			$Fields[ 4] = $SqlType[0]                                         ; # DATA_TYPE !!!
+ 			$Fields[ 5] = $TypeName                                           ; # TYPE_NAME !!!
+ 			$Fields[ 6] = $ColSize                                            ; # COLUMN_SIZE !!! MAX for *LONG*
+ 			$Fields[ 7] = $RecSet->Fields('CHARACTER_OCTET_LENGTH'  )->{Value}; # BUFFER_LENGTH !!! MAX for *LONG*, ... (e.g. num)
+ 			$Fields[ 8] = $RecSet->Fields('NUMERIC_SCALE'           )->{Value}; # DECIMAL_DIGITS ???
+ 			$Fields[ 9] = undef                                               ; # NUM_PREC_RADIX !!!
+ 			$Fields[10] = $RecSet->Fields('IS_NULLABLE'             )->{Value}; # NULLABLE !!!
+ 			$Fields[11] = $RecSet->Fields('DESCRIPTION'             )->{Value}; # REMARKS
+ 			$Fields[12] = $RecSet->Fields('COLUMN_DEFAULT'          )->{Value}; # COLUMN_DEF
+ 			$Fields[13] = $SqlType[1]                                         ; # SQL_DATA_TYPE !!!
+ 			$Fields[14] = $SqlType[2]                                         ; # SQL_DATETIME_SUB !!!
+ 			$Fields[15] = $RecSet->Fields('CHARACTER_OCTET_LENGTH'  )->{Value}; # CHAR_OCTET_LENGTH !!! MAX for *LONG*
+ 			$Fields[16] = $RecSet->Fields('ORDINAL_POSITION'        )->{Value}; # ORDINAL_POSITION
+ 			$Fields[17] = $IsNullable                                         ; # IS_NULLABLE !!!
+ 
+ 			push( @Rows, \@Fields );
+ 			$RecSet->MoveNext;
+ 		}
+ 		$RecSet->Close; undef $RecSet;
+ 		$conn->{CursorLocation} = $tmpCursorLocation;
+ 
+ 		DBI->connect('dbi:Sponge:','','', { RaiseError => 1 })->prepare(
+ 			$QueryType, { rows => \@Rows, NAME =>
+ 			[ qw( TABLE_CAT TABLE_SCHEM TABLE_NAME COLUMN_NAME DATA_TYPE TYPE_NAME COLUMN_SIZE BUFFER_LENGTH DECIMAL_DIGITS NUM_PREC_RADIX NULLABLE REMARKS COLUMN_DEF SQL_DATA_TYPE SQL_DATETIME_SUB CHAR_OCTET_LENGTH ORDINAL_POSITION IS_NULLABLE ) ]});
+ 	}
+ 
  	sub primary_key_info {
  		my( $dbh, @Criteria ) = @_;
  		my $QueryType = 'adSchemaPrimaryKeys';
***************
*** 1009,1030 ****
  			return \@prov_type_return;
  		}
  
  	# Attempt to convert an ADO data type into an ODBC/SQL data type.
  	sub convert_ado_to_odbc {
! 		my ($dbh, $attrib) = @_;
  
  			return $dbh->DBI::set_err( -1,
  				"convert_ado_to_odbc: call without any attributes.")
! 			unless $attrib;
  
  			unless( $ado_types_supported ) {
  				&_determine_type_support($dbh);
  			}
! 			if ( exists $myado_types_supported->{$attrib} ) {
! 				return $myado_types_supported->{$attrib};
  			}
  
! 		return $attrib;
  	}
  
  	sub OpenSchema {
--- 1112,1168 ----
  			return \@prov_type_return;
  		}
  
+ 	sub _ado_get_type_info_for {
+ 		my ($dbh, $AdoType, $IsFixed, $IsLong ) = @_;
+ 
+ 		unless( $dbh->{ado_type_info_hash} ) {
+ 			my $sth = $dbh->func('adSchemaProviderTypes','OpenSchema');
+ 			while ( my $r = $sth->fetchrow_hashref ) {
+ 				push @{$dbh->{ado_type_info_hash}{$r->{DATA_TYPE}}{$r->{IS_FIXEDLENGTH}}{$r->{IS_LONG}}}, $r;
+ 			}
+ 		}
+ 		$dbh->{ado_type_info_hash}{$AdoType}{$IsFixed}{$IsLong} || [];
+ 	}
+ 
  	# Attempt to convert an ADO data type into an ODBC/SQL data type.
  	sub convert_ado_to_odbc {
! 		my ($dbh, $AdoType, $IsFixed, $IsLong ) = @_;
  
  		return $dbh->DBI::set_err( -1,
  			"convert_ado_to_odbc: call without any attributes.")
! 			unless $AdoType;
  
  		unless( $ado_types_supported ) {
  			&_determine_type_support($dbh);
  		}
! 
! 		my $SqlType = 0;
! 
! 		if ( $AdoType & $ado_consts->{adArray} ) {
! 			$SqlType = 50;  # XXX DBI::SQL_ARRAY();
! 		}
! 		elsif ( exists $myado_types_supported2->{$AdoType}{$IsLong}{$IsFixed} ) {
! 			$SqlType = $myado_types_supported2->{$AdoType}{$IsLong}{$IsFixed};
  		}
+ 		elsif ( exists $myado_types_supported->{$AdoType} ) {
+ 			$SqlType = $myado_types_supported->{$AdoType};
+ 		}
+ 
+ 		if ( wantarray ) {  # DATA_TYPE, SQL_DATA_TYPE, SQL_DATETIME_SUB
+ 			my @a = ( $SqlType );
  
! 			if ( 90 < $SqlType && $SqlType < 100 ) {  # SQL_DATETIME
! 				push @a, 9, $SqlType - 90;
! 			}
! 			elsif ( 100 < $SqlType && $SqlType < 120 ) {  # SQL_INTERVAL
! 				push @a, 10, $SqlType - 100;
! 			}
! 			else {
! 				push @a, $SqlType, undef;
! 			}
! 			return @a;
! 		}
! 		return $SqlType;
  	}
  
  	sub OpenSchema {

--------------A6C6A23DFC9AE6AB3B61A48C--

0
s
12/10/2001 8:50:29 AM
--7JfCtLOvnd9MIVvH
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline

Great stuff, I've applied your patch to the attached copy. I haven't had
to much time to test.

I did change the where the ado_consts, myado_types* to attributes of
the database handler, instead of package variable. I was having some
"score" problems.

One challenge is supporting two different values for SQL_BIT. Which
version is truly needed?


Take a look ... let me know.

Tom 

NOTE:
Again, this is a beta (test) copy of the ADO driver. I do NOT recommend
using it for a production environment. ;-)

-- 
Thomas A. Lowery
See DBI/FAQ http://tlowery.hypermart.net

--7JfCtLOvnd9MIVvH
Content-Type: application/zip
Content-Disposition: attachment; filename="dbd_ado_t_2_4_02.zip"
Content-Transfer-Encoding: base64

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
uoI7LY9LlnGNKorUyui/zwzS/tn4qDzvohRbX73+TXQVTxPaTeO8ISq9tA+gvtf9j9z78OSY
AykDvEtRuZ5DEwENJ+M0tK3rXHq8qp1e+uaGUFFZLoWTDI60nmff/S3i9UpNbytNIeM0uc25
s9X5gzt1p3IpnJdwty3lN2cFd8a20jgyTrFtrgK6dJXPvVrOR6DKG1cCGae4NmeObuIq43f2
Ij5Y9f44s7c6a1yhO5FL4axYO+q17NAPZ9Moh3K5fY/3NZVn8VEt5vUCyua1PCrUlPhQe7Ty
qbzuIZHteDjFEevFXEe49Pj4K2FVSNO5fgavpXF9vXQmv07lV0GzuITutZhLFvCWVNa5Wose
rZ0MrVYhd3eR1o5ebyaXES15tGUJ0zz21TEC7BH26HTskbX2xvT5f5l4/h8YGBgYGBgYGBgY
GBgYmJWYaf6fRegbMDAwMDAwMDAwMDAwMDALMdP8P5vQN2BgYGBgYGBgYGBgYGBgFmKm+X8O
oW/AwMDAwMDAwMDAwMDAwCzETPP/XELfgIGBgYGBgYGBgYGBgYFZiJnm/1Pw/D8wMDAwMDAw
MDAwMDAwMCsx0/x/Kp7/BwYGBgYGBgYGBgYGBgZmJWaa/+fh+X9gYGBgYGBgYGBgYGBgYFZi
pvl/Pp7/BwYGBgYGBgYGBgYGBgZmJWaa/xfg+X9gYGBgYGBgYGBgYGBgYFZipvl/IZ7/BwYG
BgYGBgYGBgYGBgZmJWaa/xfh+X9gYGBgYGBgYGBgYGBgYFZipvn/RXj+HxgYGBgYGBgYGBgY
GBiYlZhp/l+M5/+BgYGBgYGBgYGBgYGBgVmJmeb/JXj+HxgYGBgYGBgYGBgYGBiYlZhp/j8N
z/8DAwMDAwMDAwMDAwMDA7MSM83/p+P5f2BgYGBgYGBgYGBgYGBgVmKm+f/FeP4fGBgYGBgY
GBgYGBgYGJiVmMz/B8Xbna35/0yi/OIk+k4haqSBNIPmUxUtonJe1vOylmqomJYxq+hk6zTe
soLXIqmQ6phVMKv32R5CWayqeL2Ct4dppco1nUYrKaLDeiHXCKMCrl/NLJ+Xi9lzOnuq4iiq
eetMrf16WtiBt/np247naOXLtbgiKYOXS6lMi3RxuxhrmVVrcffXSpXxtmptf4t4ns/romYE
5XL5xey7XotuKV3B8aZrcUpvfbX6C5gt0/Zb77VlzMK5LytoCetF3FoFRzWQyy5iL4u1NlZq
kYv+q9P2YBCl8msV6+U0S9u3WsrT9qRS64EhNJ31Io6tVttDUbuafdVpsS71xhPh7Y9cJtla
2+XkZjWdSQYNDhBvA6f2ZggkxWYjRQhSAoT4yEHBTnrfEbQnbLoocWLPsFFXhmTlbco5d8Xj
Y5u+EOxQ0Zj3n449kEJeE5FUc4u6uc+LfLds+7zMx4albq/OcaS5TLzUaMcq0VujZuYzvZe/
+MuMOyZuHznr/ie3dF4jyVvj12NWrL73mz65Wwa8XHvytR1BnddI9tY4Fh66I/zvVxesG7h9
zoKYZ7/qvMYob42oh2e9njW2T9rj6uTndv9qzcbOa4z21tjy3uvNn0bNy79tknL36xsnxnde
Y4y3xj0JY6aH/fXDlJsnzdh8LNx5s1mNeu3TJvtqw9+ab0+c+G3qqs9HrXp5aUpT5zVkX/39
xP/t/8TxfOrOerv6dOTVvc1qVHuPoGzlsonfpRWV90u7L69m7T8Sq2PN6pT7RJWXe0+t40RN
9s7bU6PKXn1qnFn5Mt7zutYaH+9/q3n9a3dkrJ0y+6pHZl6ldF5D7kfWuLTREZ/uTb+v4s2V
ddc8O7PzGvKYN/ZvfLXo4v9mbZ8zy7W6YUZq5zXkMQ/PGp37zqPxU367IP/Ny75878+d15DH
vP8jjdfHHX86/c6cEccKp08YblZDfOp0m/7G/n9/scme++ijfQaEPzBkcOf+5Tuk6ONd465Z
XJi3elrznFl9SnI6rzHWW2PRkRtnpPZfOfVxT15oSnPLPLMa8/ksIfs1+uIp45tGD8peE7Ik
5tjdrgfMyq/k8vLI1R5Vk0L3NmZcl5d4IHRqr6GdlZf+W96OTlye+0Xh9nvzln5UkljbWXl5
1D5+5eaDM+/5d+59T8YULLv0a9WsfK3Pe7XsobALR+Y2p+3+zf3OC+58uc6s/EI+G4ryYbQq
qDef+/T970tK4Nl8jq6Mnj7sZFNlVlNen+LII1cGLyXxfXkYv7pJnqlCiOwuclALm9Bu1sLE
iTNQP4MqthAWLUGkhKhk47+/jJRwsY2RvRej6tYmbz+0euOFsVvS7kzYfMOhfR/tNDaZdKqb
XBL5l+jE/XPzmw4vj52w+YGHjU0mn+omaw4np8c8WJy1IXinJ/j4rg3GJked6iYvarpqw+bJ
6fmbJx2qejvhL/HzDE2O9qvJzvxP7fX7j6937cpetyR43trUiROMuzTmVO/Sutc+yX7y+Xdy
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
S5LFjv+f4P5/GIZhGIZhGIZhGJYkyzuLPTPk36/zjVmRTPAbAHF0Tus8Xe18nde6khJXhuM/
tYnOabNMEBVusISJlFSaFxy/I/NCqvTCCafKvJBSTo16QSRvXkgrpENdpSSvc5POS3ReqnOz
zimzZp2HhoQ4dfQFD950k+j+8M43iW51b4ZNPmWTmTaZZRLdAV7BJjU2mW2TT5tE95N3gU0u
tMkcm1xkEv2O8mptUmeTeptcbBLd895cm3zGJvNsMt8kOU0W2OQSmzTY5NK+/qB4sUmVTaaa
xNTs2GSiSUyFKZtMsolnElNY2iaTbTLFJJM1+aRNptmk2iTVmlxlk+U2udokNZostUmzTZaZ
pE6Tm2yywSZfMMlLmjyriXOfJk/b5Fs2eaZvd7BPXZtkbHKOTc41idkIeZOY9561Sc4mn7DJ
eX2PiAmvwiaVNpkwnAhBEARBEARBjEvkx27ysYvJYzc5ZTjOMc/mOvz5eWkiCIIgCIIgCIIg
iOTF2fOLhdBf2D94/CWdOM6bk54o5Rk56O32bvLmeX+a5JzUbu1Jz81f97Phv8BXzq+cUVlR
uaeir6Kr4saKwfyr+R/kn8435Gflq/LHc9ty3bkNuRW517L7s/uy+14+1fRYdnbWy76XeSDT
k+n50dhTa+Y37uvu64fOxumAu8ptdBsPNR668EPZt8THOHKuOSVAhk54sq+tSirFCdNzT/1q
sPDCLsk+3vH24gM7Dv565vLnf1c/p3v7DXv+8MvadUcP/vY7P73l4aO7jlT1rli0031564tf
rPv+3pXbljU8/2T6lR1bO7+9Zsbh+7OLDj6zqvYXS9/dnT7n2sM/vG/73XsfjV3tfc770pmr
pCl/9J3BE29Nfndnf/PtJ692YKSSumi9dWd8M8UWZ1cbKq46Wlx1eYqrjhZXEy2upjzF1USL
y4n0Dw1pcZ0BeSNkW4VoPOsNrXbfSCXZaL3ZaL3Z8tSbjdabidabidabKU+9mWi9brReN1qv
W5563Wi96Wi96Wi96fLUm47Wm4rWm4rWmypPvalovfoPQb857y304SVRMn8zCy8YonH+iLOr
DX3EmfPwot81Xhm2rzl9MPwvQYjGf0/7lyaHdljm/Sg73vvQjVbilqcSc8r0deO/2tSZXq2U
4kMZpheGM7d0snvhoTeKndIrDXKZLJB22SIbpUea01J0vhG0rJeZUqXvM/hQN6GLNIYa/0yk
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
McYYY4yxkqy2/n/c/H+MMcYYY4wxxlhJNlitaKeS//64XtcfQl/3XwBCFabH1a3QCK3J7W/F
XeLaTMd0Y0a8tzmeN8LMdEdqpOrc0Ri/48lqdrqjEbkx7Y4QBtMdzQjNKU01wmBcV8b14riu
iutIXBvpzHHduzeI/cdY96Z9Ykri9WiflJI46u2Tc/K8nJySk1NTEi9Aeygn83NyWk5OT0m8
Tu0zcnJmTs7KydkpiT9R7QU5WZiTRTk5JyXxyrcX5+T5OVmSk3NTMhCTpTk5LyfLcnL+2I5u
50NOZufkmJSkPlc5OSolqYeNnBydk3ZKUseaOZmTk7kpmROT5+bkhJzMS8m8mFySk0tzcllK
5sdkVU5GcrI6JQtjcn1ObsjJq1LyQEw+HpPqjph8MCcfysmHx+7uXtNWTvpycmxOjktJGoTB
lKTH3p+TgZw8JyfHj+0MKdozcjIzJ7MmkiCEEEIIIcRBicED7/KsizkH3mW/UVV72jmP5c+j
44sQQgghhBBCCFFuHD7/wDDlnfafP55OI1X17aMfH8/7wkPtu9vXt5e0f3x0z/v/+2ynd/f7
p74DP/PcmSfPnDHznhljM7bMuG7G7sGvDn5m8IODywZPHZw9+KOBOwe2DtwwcPnA1/rv77+v
/74v7G/5nf7T+tv9P+n7jb5tfds+f+Blfd93Wl9vff3hw3F5sHVla3lr+cPTlzOfkesrnmUx
0EofCQh7n2yH+0Znh5mhmkoffd83dw996l2h/3c3/dmKB9/20J+ccunHfrDorK13veKev/zj
BWufeOi7n/jya37ziXc9Pnv75Re9vfWFN3/2VxZ++t1X3Ll62cfubT7ytjdv/vhVJz/2lv6L
HvrwlQu+ser7dzePfcljn7vjrje++7dqT3tH9ZT0y+vJysEnvrf7yT+d8/237xh5/b6n3TXZ
k4W9/V34Sx+m2s7l007p3Lzezs07NJ2b19u5+b2dm39oOje/t3MDIezYuzd2bnOX2pOU95pC
B7O/U05732RP+nv729/b3/5D09/+3v729fa3r7e/fYemv329/W319rfV29/Woelvq7e/zd7+
Nnv72zw0/W329rfR299Gb38bh6a/jd7+xr8IdqTPvU355RV6Kb1nNvXAKXSQf8Xl0075FZc+
h9f7U9M+BOObPj449W+CKXTwr3Tnq8lTLljfU1H/wb6Grd6etA5NT9JHpl968E/b+GWfNozH
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
TkZysjolC2NyfU5uyMmrUvLemLw3J7+Xk3+Wkgdi8vtjd3evaSsnfTk5NifHpSQNwmBK0mPv
z8lATp6Tk+PHdoYU7Rk5mZmTWRNJEEIIIYQQ4qDEjgPu8SyM6sC77C+qak8757H8eXR86Wn2
6n22U3UfVyW5EEIIIYQQQojDIAbC5NtV1eB+djxcY/iAezyNGN7Pffn7/3uXX7Uiff+/80b9
86qwNNwQzgsXxeW2mC0NrySEEEIIIYQQQsgRKz3z/z0ak1Mqo0QIIYQQQgghhBQk+9b/H0jf
Bji1MkqEEEIIIYQQQkhBsm/9/0h7ZzsMVUaJEEIIIYQQQggpSAarFZ35/+4P3fn/+/K8APvM
E3B1KzTSBIE55lehimtzcv7/ydn804TjM+vn/3+ymj19/v99/scAzQjNKU01wmBcV8b14riu
iutIXBvpzPP9DwGeRpj//8id/z89fdp/mJI7YvLBnHwoJx82/78QQgghhCg4jsQJ/H7ZMefA
u+w3nmr+fyGEEEIIIYQQovg4fP6hYco77j9/7K+Rqvr20UPjb/b3hYfad7evby9p//jon/n/
/zfz3Jknz5wx854ZYzO2zLhuxu7Brw5+ZvCDg8sGTx2cPfijgTsHtg7cMHD5wNf67++/r/++
L+xv+Z3+0/rb/T/p+42+bX3bPn/gZX3fd1pfb3394cNxebB1ZWt5a/nDT72c+YxcY/EsiIFW
5039vU+2w32js8PMuDGFPvq+b+4e+tS7Qv/vbvqzFQ++7aE/OeXSj/1g0Vlb73rFPX/5xwvW
PvHQdz/x5df85hPvenz29ssvenvrC2/+7K8s/PS7r7hz9bKP3dt85G1v3vzxq05+7C39Fz30
4SsXfGPV9+9uHvuSxz53x11vfPdv1Z72jqemX15PVg4+8b3dT/7pnO+/fcfI6/c97a7JniwM
PZ3LdJA7l087pXPzejs379B0bl5v5+b3dm7+oenc/N7ODYSwY+/e2LnNXWpPUt5rCh3M/k45
7X2TPenv7W9/b3/7D01/+3v729fb377e/vYdmv729fa31dvfVm9/W4emv63e/jZ7+9vs7W/z
0PS32dvfRm9/G739bRya/jZ6+xv/ItiR/q6a+rdjL6X3zKYeOIUO8q+4fNopv+LS5/B6f2ra
h2B808cHp/5NMIUO/pVOU5NPvWB9T0X9B/satnp70jo0PUkfmX7pwT9t45d92vzy9xkpy4cm
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
SwUGAAAAABAAEAABBAAArkEBAAAA

--7JfCtLOvnd9MIVvH--

_________________________________________________________
Do You Yahoo!?
Get your free @yahoo.com address at http://mail.yahoo.com

0
stlowery
12/13/2001 6:41:20 AM
Thomas A. Lowery wrote:
> 
> Great stuff, I've applied your patch to the attached copy.

Thank you, I like intermediate releases!

> I did change the where the ado_consts, myado_types* to attributes of
> the database handler, instead of package variable. I was having some
> "score" problems.

I already encountered problems after a reconnect to another data
source. I think

  my $ado_type;

(line 433) is still problematic.

> One challenge is supporting two different values for SQL_BIT. Which
> version is truly needed?

Big trap! I mentioned this problem in

 http://archive.develooper.com/dbi-dev@perl.org/msg00481.html

See also Tim's reply:

 http://archive.develooper.com/dbi-dev@perl.org/msg00482.html

I still prefer SQL/CLI (#define SQL_BIT  14). If someone really needs
to test against ODBC values (e.g. DBD::ODBC), your approach (separate
MS namespace like SQL_BIT_MS) may help.

> 
> Take a look ... let me know.
> 

Are you sure that

 $AdoType == $ado_consts->{adArray}

(line 1179) is correct? I have no example, but as I understand the
docs, adArray is 'always combined with another data type constant'
(I assume or'ed together). For example, if we have a type

  INTEGER ARRAY[]

then - I guess! - ADO will return

  adInteger | adArray

???


Steffen

0
s
12/14/2001 10:56:49 AM
On Fri, Dec 14, 2001 at 11:56:49AM +0100, Steffen Goeldner wrote:
> Thomas A. Lowery wrote:
> 
> > I did change the where the ado_consts, myado_types* to attributes of
> > the database handler, instead of package variable. I was having some
> > "score" problems.
     scope ... <sigh>

> I already encountered problems after a reconnect to another data
> source. I think
> 
>   my $ado_type;
> 
> (line 433) is still problematic.

In reviewing this variable, and what it's used for, I need to revisit
this section of code.  $ado_type is only used in GetTypeInfo, which was an
early attempt to support "ODBC" defined functions.  I doubt this is
needed.  If it is, then I'll move to the inner db handle.

.....
my $ado_type;
.....

	# Get information from the current provider.
	sub GetTypeInfo {
		my($dbh, $attribs) = @_;
		my $sth;
		my $lastError;

	# If the type information is previously obtained, use it.
	unless (defined $ado_type) {
		$ado_type = &_determine_type_support;
	}

	my $sponge = DBI->connect("dbi:Sponge:","","",{ RaiseError => 1 });
	$sth = $sponge->prepare("adSchemaProviderTypes", {
		rows=>   [ @$ado_type ] , NAME=> $ado_info,
	});
	$sth;
    }


  	sub type_info_all {
		my ($dbh) = @_;
		my $names = {
          TYPE_NAME		=> 0,
          DATA_TYPE		=> 1,
          COLUMN_SIZE		=> 2,
          LITERAL_PREFIX	=> 3,
          LITERAL_SUFFIX	=> 4,
          CREATE_PARAMS		=> 5,
          NULLABLE		=> 6,
          CASE_SENSITIVE	=> 7,
          SEARCHABLE		=> 8,
          UNSIGNED_ATTRIBUTE	=> 9,
          FIXED_PREC_SCALE	=>10,
          AUTO_UNIQUE_VALUE	=>11,
          LOCAL_TYPE_NAME	=>12,
          MINIMUM_SCALE		=>13,
          MAXIMUM_SCALE		=>14,
        };
		# Based on the values from the current provider.
		my @myti;
		my $sth = $dbh->func( DBI::SQL_ALL_TYPES(), 'GetTypeInfo' );
		while(my $row = $sth->fetchrow_hashref) {
			my @tyinfo;
			# Only add items from the above names list.  When
			# this list explans, the code 'should' still work.
			for my $n (keys %{$names}){
				$tyinfo[ $names->{$n} ] = $row->{$n} || '';
			}
			push( @myti, \@tyinfo );
		}
		$sth->finish;
		my $ti = [ $names, @myti ];
		return $ti;
	}

Thanks!
> 
> Are you sure that

No ... I'm not sure.  I'll change it back.


>  $AdoType == $ado_consts->{adArray}
> 
> (line 1179) is correct? I have no example, but as I understand the
> docs, adArray is 'always combined with another data type constant'
> (I assume or'ed together). For example, if we have a type
> 
>   INTEGER ARRAY[]

> then - I guess! - ADO will return

>   adInteger | adArray

Tom


-- 
Thomas A. Lowery
See DBI/FAQ http://tlowery.hypermart.net

_________________________________________________________
Do You Yahoo!?
Get your free @yahoo.com address at http://mail.yahoo.com

0
stlowery
12/14/2001 3:55:50 PM
--------------0B6FB8B05111D929FB73ACB7
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: 7bit

Thomas A. Lowery wrote:
> 
> Great stuff, I've applied your patch to the attached copy. I haven't had
> to much time to test.
> 
> I did change the where the ado_consts, myado_types* to attributes of
> the database handler, instead of package variable. I was having some
> "score" problems.
> 
> One challenge is supporting two different values for SQL_BIT. Which
> version is truly needed?

The problem moved to SQL_BIGINT :-(
The attached patch drops (most of) the datatype constants and uses
the DBI 1.21 constants.


Steffen
--------------0B6FB8B05111D929FB73ACB7
Content-Type: text/plain; charset=us-ascii; name="ADO.pm.diff"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline; filename="ADO.pm.diff"

*** DBD-ADO-2.4.02-orig/lib/DBD\ADO.pm	Thu Dec 13 01:17:30 2001
--- ADO.pm	Fri Feb 08 09:29:08 2002
***************
*** 111,160 ****
  
  	use constant DBPROPVAL_TC_NONE	=> 0;
  
! 	use constant SQL_GUID													=> -11;
! 	use constant SQL_WLONGVARCHAR                 =>  -10;
! 	use constant SQL_WVARCHAR                     =>   -9;
! 	use constant SQL_WCHAR                        =>   -8;
! 	use constant SQL_BIT_MS                       =>   -7;
! 	use constant SQL_TINYINT                      =>   -6;
! 	use constant SQL_BIGINT                       =>   -5;
! 	use constant SQL_LONGVARBINARY                =>   -4;
! 	use constant SQL_VARBINARY                    =>   -3;
! 	use constant SQL_BINARY                       =>   -2;
! 	use constant SQL_LONGVARCHAR                  =>   -1;
! 	use constant SQL_UNKNOWN_TYPE									=>   0;
! 
! 	use constant SQL_BIT                          =>   14;
! 	use constant SQL_BIT_VARYING                  =>   15;
! 	use constant SQL_BOOLEAN                      =>   16;
! 	use constant SQL_UDT                          =>   17;
! 	use constant SQL_UDT_LOCATOR                  =>   18;
! 	use constant SQL_ROW                          =>   19;
! 	use constant SQL_REF                          =>   20;
! 	use constant SQL_BLOB                         =>   30;
! 	use constant SQL_BLOB_LOCATOR                 =>   31;
! 	use constant SQL_CLOB                         =>   40;
! 	use constant SQL_CLOB_LOCATOR                 =>   41;
! 	use constant SQL_ARRAY                        =>   50;
! 	use constant SQL_ARRAY_LOCATOR                =>   51;
! 	use constant SQL_TYPE_DATE                    =>   91;
! 	use constant SQL_TYPE_TIME                    =>   92;
! 	use constant SQL_TYPE_TIMESTAMP               =>   93;
! 	use constant SQL_TYPE_TIME_WITH_TIMEZONE      =>   94;
! 	use constant SQL_TYPE_TIMESTAMP_WITH_TIMEZONE =>   95;
! 	use constant SQL_INTERVAL_YEAR                =>  101;
! 	use constant SQL_INTERVAL_MONTH               =>  102;
! 	use constant SQL_INTERVAL_DAY                 =>  103;
! 	use constant SQL_INTERVAL_HOUR                =>  104;
! 	use constant SQL_INTERVAL_MINUTE              =>  105;
! 	use constant SQL_INTERVAL_SECOND              =>  106;
! 	use constant SQL_INTERVAL_YEAR_TO_MONTH       =>  107;
! 	use constant SQL_INTERVAL_DAY_TO_HOUR         =>  108;
! 	use constant SQL_INTERVAL_DAY_TO_MINUTE       =>  109;
! 	use constant SQL_INTERVAL_DAY_TO_SECOND       =>  110;
! 	use constant SQL_INTERVAL_HOUR_TO_MINUTE      =>  111;
! 	use constant SQL_INTERVAL_HOUR_TO_SECOND      =>  112;
! 	use constant SQL_INTERVAL_MINUTE_TO_SECOND    =>  113;
    
  	my $ado_consts = ();
  	my $myado_types_supported = ();
--- 111,119 ----
  
  	use constant DBPROPVAL_TC_NONE	=> 0;
  
! 	# additional datatypes:
! 	use constant ODBC_BIGINT => -5;
! 	use constant  SQL_BIGINT => 25;
    
  	my $ado_consts = ();
  	my $myado_types_supported = ();
***************
*** 176,236 ****
  
  	$myado_types_supported2 = {
  	              # AdoType     IsLong IsFixed => SqlType
! 	  $ado_consts->{adBinary   } => { 0 => { 0 =>      SQL_VARBINARY
! 	                                       , 1 =>      SQL_BINARY        }
! 	                                , 1 => { 0 =>      SQL_LONGVARBINARY
! 	                                       , 1 =>      SQL_UNKNOWN_TYPE  }}
  	, $ado_consts->{adChar     } => { 0 => { 0 => DBI::SQL_VARCHAR
  	                                       , 1 => DBI::SQL_CHAR          }
! 	                                , 1 => { 0 =>      SQL_LONGVARCHAR
! 	                                       , 1 =>      SQL_UNKNOWN_TYPE  }}
! 	, $ado_consts->{adWChar    } => { 0 => { 0 =>      SQL_WVARCHAR
! 	                                       , 1 =>      SQL_WCHAR         }
! 	                                , 1 => { 0 =>      SQL_WLONGVARCHAR
! 	                                       , 1 =>      SQL_UNKNOWN_TYPE  }}
  #	, $ado_consts->{adVarBinary} =>
  #	, $ado_consts->{adVarChar  } =>
  #	, $ado_consts->{adVarWChar } =>
  	};
  
  	$myado_types_supported = {
! 	  $ado_consts->{adArray}						=>      SQL_ARRAY
! 	, $ado_consts->{adBigInt}						=>      SQL_BIGINT
  	, $ado_consts->{adBinary}						=> DBI::SQL_BINARY
! 	, $ado_consts->{adBoolean}					=>      SQL_BOOLEAN
! 	, $ado_consts->{adBSTR}							=>      SQL_UNKNOWN_TYPE
! 	, $ado_consts->{adChapter}					=>      SQL_UNKNOWN_TYPE
  	, $ado_consts->{adChar}							=> DBI::SQL_CHAR
  	, $ado_consts->{adCurrency}					=> DBI::SQL_NUMERIC
! 	, $ado_consts->{adDate}							=>      SQL_TYPE_TIMESTAMP # XXX Not really!
! 	, $ado_consts->{adDBDate}						=>      SQL_TYPE_DATE
! 	, $ado_consts->{adDBTime}						=>      SQL_TYPE_TIME
! 	, $ado_consts->{adDBTimeStamp}			=>      SQL_TYPE_TIMESTAMP
  	, $ado_consts->{adDecimal}					=> DBI::SQL_DECIMAL
  	, $ado_consts->{adDouble}						=> DBI::SQL_DOUBLE
! 	, $ado_consts->{adEmpty}						=>      SQL_UNKNOWN_TYPE
! 	, $ado_consts->{adError}						=>      SQL_UNKNOWN_TYPE
  	, $ado_consts->{adFileTime}					=> DBI::SQL_TIMESTAMP
! 	, $ado_consts->{adGUID}							=>      SQL_GUID
! 	, $ado_consts->{adIDispatch}				=>      SQL_UNKNOWN_TYPE
  	, $ado_consts->{adInteger}					=> DBI::SQL_INTEGER
! 	, $ado_consts->{adIUnknown}					=>      SQL_UNKNOWN_TYPE
  	, $ado_consts->{adLongVarBinary}		=> DBI::SQL_LONGVARBINARY
  	, $ado_consts->{adLongVarChar}			=> DBI::SQL_LONGVARCHAR
  	, $ado_consts->{adLongVarWChar}			=> DBI::SQL_WLONGVARCHAR
  	, $ado_consts->{adNumeric}					=> DBI::SQL_NUMERIC
! 	, $ado_consts->{adPropVariant}			=>      SQL_UNKNOWN_TYPE
  	, $ado_consts->{adSingle}						=> DBI::SQL_FLOAT
  	, $ado_consts->{adSmallInt}					=> DBI::SQL_SMALLINT
  	, $ado_consts->{adTinyInt}					=> DBI::SQL_TINYINT
! 	, $ado_consts->{adUnsignedBigInt}		=>      SQL_UNKNOWN_TYPE
  	, $ado_consts->{adUnsignedInt}			=> DBI::SQL_WCHAR
! 	, $ado_consts->{adUnsignedSmallInt}	=>      SQL_UNKNOWN_TYPE
! 	, $ado_consts->{adUnsignedTinyInt}	=>      SQL_UNKNOWN_TYPE
! 	, $ado_consts->{adUserDefined}			=>      SQL_UNKNOWN_TYPE
  	, $ado_consts->{adVarBinary}				=> DBI::SQL_VARBINARY
  	, $ado_consts->{adVarChar}					=> DBI::SQL_VARCHAR
! 	, $ado_consts->{adVariant}					=>      SQL_UNKNOWN_TYPE
  	, $ado_consts->{adVarNumeric}				=> DBI::SQL_INTEGER
  	, $ado_consts->{adVarWChar}					=> DBI::SQL_WVARCHAR
  	, $ado_consts->{adWChar}						=> DBI::SQL_WCHAR
--- 135,195 ----
  
  	$myado_types_supported2 = {
  	              # AdoType     IsLong IsFixed => SqlType
! 	  $ado_consts->{adBinary   } => { 0 => { 0 => DBI::SQL_VARBINARY
! 	                                       , 1 => DBI::SQL_BINARY        }
! 	                                , 1 => { 0 => DBI::SQL_LONGVARBINARY
! 	                                       , 1 => DBI::SQL_UNKNOWN_TYPE  }}
  	, $ado_consts->{adChar     } => { 0 => { 0 => DBI::SQL_VARCHAR
  	                                       , 1 => DBI::SQL_CHAR          }
! 	                                , 1 => { 0 => DBI::SQL_LONGVARCHAR
! 	                                       , 1 => DBI::SQL_UNKNOWN_TYPE  }}
! 	, $ado_consts->{adWChar    } => { 0 => { 0 => DBI::SQL_WVARCHAR
! 	                                       , 1 => DBI::SQL_WCHAR         }
! 	                                , 1 => { 0 => DBI::SQL_WLONGVARCHAR
! 	                                       , 1 => DBI::SQL_UNKNOWN_TYPE  }}
  #	, $ado_consts->{adVarBinary} =>
  #	, $ado_consts->{adVarChar  } =>
  #	, $ado_consts->{adVarWChar } =>
  	};
  
  	$myado_types_supported = {
! 	  $ado_consts->{adArray}						=> DBI::SQL_ARRAY
! 	, $ado_consts->{adBigInt}						=>     ODBC_BIGINT  # XXX SQL_BIGINT?
  	, $ado_consts->{adBinary}						=> DBI::SQL_BINARY
! 	, $ado_consts->{adBoolean}					=> DBI::SQL_BOOLEAN
! 	, $ado_consts->{adBSTR}							=> DBI::SQL_UNKNOWN_TYPE
! 	, $ado_consts->{adChapter}					=> DBI::SQL_UNKNOWN_TYPE
  	, $ado_consts->{adChar}							=> DBI::SQL_CHAR
  	, $ado_consts->{adCurrency}					=> DBI::SQL_NUMERIC
! 	, $ado_consts->{adDate}							=> DBI::SQL_TYPE_TIMESTAMP # XXX Not really!
! 	, $ado_consts->{adDBDate}						=> DBI::SQL_TYPE_DATE
! 	, $ado_consts->{adDBTime}						=> DBI::SQL_TYPE_TIME
! 	, $ado_consts->{adDBTimeStamp}			=> DBI::SQL_TYPE_TIMESTAMP
  	, $ado_consts->{adDecimal}					=> DBI::SQL_DECIMAL
  	, $ado_consts->{adDouble}						=> DBI::SQL_DOUBLE
! 	, $ado_consts->{adEmpty}						=> DBI::SQL_UNKNOWN_TYPE
! 	, $ado_consts->{adError}						=> DBI::SQL_UNKNOWN_TYPE
  	, $ado_consts->{adFileTime}					=> DBI::SQL_TIMESTAMP
! 	, $ado_consts->{adGUID}							=> DBI::SQL_GUID
! 	, $ado_consts->{adIDispatch}				=> DBI::SQL_UNKNOWN_TYPE
  	, $ado_consts->{adInteger}					=> DBI::SQL_INTEGER
! 	, $ado_consts->{adIUnknown}					=> DBI::SQL_UNKNOWN_TYPE
  	, $ado_consts->{adLongVarBinary}		=> DBI::SQL_LONGVARBINARY
  	, $ado_consts->{adLongVarChar}			=> DBI::SQL_LONGVARCHAR
  	, $ado_consts->{adLongVarWChar}			=> DBI::SQL_WLONGVARCHAR
  	, $ado_consts->{adNumeric}					=> DBI::SQL_NUMERIC
! 	, $ado_consts->{adPropVariant}			=> DBI::SQL_UNKNOWN_TYPE
  	, $ado_consts->{adSingle}						=> DBI::SQL_FLOAT
  	, $ado_consts->{adSmallInt}					=> DBI::SQL_SMALLINT
  	, $ado_consts->{adTinyInt}					=> DBI::SQL_TINYINT
! 	, $ado_consts->{adUnsignedBigInt}		=> DBI::SQL_UNKNOWN_TYPE
  	, $ado_consts->{adUnsignedInt}			=> DBI::SQL_WCHAR
! 	, $ado_consts->{adUnsignedSmallInt}	=> DBI::SQL_UNKNOWN_TYPE
! 	, $ado_consts->{adUnsignedTinyInt}	=> DBI::SQL_UNKNOWN_TYPE
! 	, $ado_consts->{adUserDefined}			=> DBI::SQL_UNKNOWN_TYPE
  	, $ado_consts->{adVarBinary}				=> DBI::SQL_VARBINARY
  	, $ado_consts->{adVarChar}					=> DBI::SQL_VARCHAR
! 	, $ado_consts->{adVariant}					=> DBI::SQL_UNKNOWN_TYPE
  	, $ado_consts->{adVarNumeric}				=> DBI::SQL_INTEGER
  	, $ado_consts->{adVarWChar}					=> DBI::SQL_WVARCHAR
  	, $ado_consts->{adWChar}						=> DBI::SQL_WCHAR

--------------0B6FB8B05111D929FB73ACB7--

0
s
2/8/2002 8:46:00 AM
--------------8BB89E9D548DB335D4F619EE
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: 7bit

Attached is a small patch for column_info().
$TypeName was set before the test

  $ti->{COLUMN_SIZE} >= $ColSize;

Thus, if no type has a large enough COLUMN_SIZE (hypothetical
case), $TypeName may contain a wrong type name.
Now, $TypeName remains undefined in this case.


Steffen
--------------8BB89E9D548DB335D4F619EE
Content-Type: text/plain; charset=us-ascii; name="ADO.pm.diff"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline; filename="ADO.pm.diff"

*** DBD-ADO-2.4_04-orig/lib/DBD/ADO.pm	Tue Apr 09 04:51:22 2002
--- ADO.pm	Wed Apr 10 21:12:54 2002
***************
*** 1057,1083 ****
  				if $lastError;
  
  		while ( ! $RecSet->{EOF} ) {
- 			my @Fields;
  			my $AdoType    = $RecSet->Fields('DATA_TYPE'   )->{Value};
  			my $ColFlags   = $RecSet->Fields('COLUMN_FLAGS')->{Value};
  			my $IsLong     = ( $ColFlags & $ado_consts->{adFldLong } ) ? 1 : 0;
  			my $IsFixed    = ( $ColFlags & $ado_consts->{adFldFixed} ) ? 1 : 0;
  			my @SqlType    = DBD::ADO::db::convert_ado_to_odbc( $dbh, $AdoType, $IsFixed, $IsLong );
- #			my $TypeInfo   = $dbh->type_info( $SqlType[0] );
- #			my $TypeName   = $TypeInfo ? $TypeInfo->{TYPE_NAME} : undef;
- 			my $TypeName;
  			my $IsNullable = $RecSet->Fields('IS_NULLABLE')->{Value} ? 'YES' : 'NO';
  			my $ColSize    = $RecSet->Fields('NUMERIC_PRECISION'       )->{Value}
  			              || $RecSet->Fields('CHARACTER_MAXIMUM_LENGTH')->{Value}
  										|| 0;  # Default value to stop warnings ???
  			my $ado_tis    = DBD::ADO::db::_ado_get_type_info_for( $dbh, $AdoType, $IsFixed, $IsLong );
! #			print '***', $AdoType, $IsFixed, $IsLong, ' => ', $ColSize, $RecSet->Fields('COLUMN_NAME')->{Value};
! 			for my $ti ( sort { $a->{COLUMN_SIZE} <=> $b->{COLUMN_SIZE} } @$ado_tis )
! 			{
  				$TypeName = $ti->{TYPE_NAME};
! #				print '***', $AdoType, $IsFixed, $IsLong, ' => ', $ti->{TYPE_NAME}, $ti->{COLUMN_SIZE}, $ColSize, $RecSet->Fields('COLUMN_NAME')->{Value};
! 				last if $ti->{COLUMN_SIZE} >= $ColSize;
  			}
  			$Fields[ 0] = $RecSet->Fields('TABLE_CATALOG'           )->{Value}; # TABLE_CAT
  			$Fields[ 1] = $RecSet->Fields('TABLE_SCHEMA'            )->{Value}; # TABLE_SCHEM
  			$Fields[ 2] = $RecSet->Fields('TABLE_NAME'              )->{Value}; # TABLE_NAME
--- 1057,1085 ----
  				if $lastError;
  
  		while ( ! $RecSet->{EOF} ) {
  			my $AdoType    = $RecSet->Fields('DATA_TYPE'   )->{Value};
  			my $ColFlags   = $RecSet->Fields('COLUMN_FLAGS')->{Value};
  			my $IsLong     = ( $ColFlags & $ado_consts->{adFldLong } ) ? 1 : 0;
  			my $IsFixed    = ( $ColFlags & $ado_consts->{adFldFixed} ) ? 1 : 0;
  			my @SqlType    = DBD::ADO::db::convert_ado_to_odbc( $dbh, $AdoType, $IsFixed, $IsLong );
  			my $IsNullable = $RecSet->Fields('IS_NULLABLE')->{Value} ? 'YES' : 'NO';
  			my $ColSize    = $RecSet->Fields('NUMERIC_PRECISION'       )->{Value}
  			              || $RecSet->Fields('CHARACTER_MAXIMUM_LENGTH')->{Value}
  										|| 0;  # Default value to stop warnings ???
+ 			my $TypeName;
  			my $ado_tis    = DBD::ADO::db::_ado_get_type_info_for( $dbh, $AdoType, $IsFixed, $IsLong );
! 			$dbh->trace_msg('  *** ' . $RecSet->Fields('COLUMN_NAME')->{Value} . "($ColSize): $AdoType, $IsFixed, $IsLong\n", 3 );
! 			# find the first type which has a large enough COLUMN_SIZE:
! 			for my $ti ( sort { $a->{COLUMN_SIZE} <=> $b->{COLUMN_SIZE} } @$ado_tis ) {
! 				$dbh->trace_msg("    * => $ti->{TYPE_NAME}($ti->{COLUMN_SIZE})\n", 3 );
! 				if ( $ti->{COLUMN_SIZE} >= $ColSize ) {
  				$TypeName = $ti->{TYPE_NAME};
! 					last ;
  			}
+ 			}
+ 			# unless $TypeName: Standard SQL type name???
+ 
+ 			my @Fields;
  			$Fields[ 0] = $RecSet->Fields('TABLE_CATALOG'           )->{Value}; # TABLE_CAT
  			$Fields[ 1] = $RecSet->Fields('TABLE_SCHEMA'            )->{Value}; # TABLE_SCHEM
  			$Fields[ 2] = $RecSet->Fields('TABLE_NAME'              )->{Value}; # TABLE_NAME

--------------8BB89E9D548DB335D4F619EE--

0
s
4/11/2002 2:43:07 PM
Reply:

Similar Artilces:

[perl5-dbi/DBI-Test] a2d1b2: create separate tests for DBI and DBI::Mock ...
----==_mimepart_51f946a54bb1b_2af891bd4c100430 Date: Wed, 31 Jul 2013 10:17:25 -0700 Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit Content-ID: <51f946a54c721_2af891bd4c100582@hookshot-fe3-pe1-prd.aws.github.net.mail> Branch: refs/heads/master Home: https://github.com/perl5-dbi/DBI-Test Commit: a2d1b22d134be0ca353e0f0b312fb14da24c798e https://github.com/perl5-dbi/DBI-Test/commit/a2d1b22d134be0ca353e0f0b312fb14da24c798e Author: Jens Rehsack <sno@netbsd.org> Date: 2013-07-31 (Wed, 31 Jul 2013) Changed ...

[perl5-dbi/dbi]
----==_mimepart_515e8f3785207_523740c1306299e Date: Fri, 05 Apr 2013 01:45:43 -0700 Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit Content-ID: <515e8f3787c27_523740c13063084@hookshot-fe5-pe1-prd.aws.github.net.mail> Branch: refs/heads/trunk Home: https://github.com/perl5-dbi/dbi ----==_mimepart_515e8f3785207_523740c1306299e-- ...

[perl5-dbi/dbi] fc2ec2: add DBI::Test dependency
----==_mimepart_5169ac8ba2c2a_4a479bb1304466c Date: Sat, 13 Apr 2013 12:05:47 -0700 Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit Content-ID: <5169ac8ba5319_4a479bb13044782@hookshot-fe3-pe1-prd.aws.github.net.mail> Branch: refs/heads/dbi-test Home: https://github.com/perl5-dbi/dbi Commit: fc2ec21c76f2d70d504dfa53fa4766c477eb8ac5 https://github.com/perl5-dbi/dbi/commit/fc2ec21c76f2d70d504dfa53fa4766c477eb8ac5 Author: Jens Rehsack <sno@netbsd.org> Date: 2013-04-13 (Sat, 13 Apr 2013) Changed paths: ...

[perl5-dbi/dbi] 98586f: Fix loading issue without DBI.so
----==_mimepart_52398602338f6_63d8e3bd5410714f Date: Wed, 18 Sep 2013 03:52:50 -0700 Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit Content-ID: <523986023429c_63d8e3bd54107271@hookshot-fe2-pe1-prd.aws.github.net.mail> Branch: refs/heads/dbi-test-conditional Home: https://github.com/perl5-dbi/dbi Commit: 98586fedb09129c4569dcc0f9cdd444384b144f2 https://github.com/perl5-dbi/dbi/commit/98586fedb09129c4569dcc0f9cdd444384b144f2 Author: Jens Rehsack <sno@netbsd.org> Date: 2013-09-18 (Wed, 18 Sep 2013) Chan...

[perl5-dbi/dbi] 735101: rename testcases to basename DBI::Test::Case
----==_mimepart_51ffd5906fa93_69e95a7d505505 Date: Mon, 05 Aug 2013 09:40:48 -0700 Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit Content-ID: <51ffd590709ac_69e95a7d50551df@hookshot-fe6-pe1-prd.aws.github.net.mail> Branch: refs/heads/dbi-test Home: https://github.com/perl5-dbi/dbi Commit: 735101b43ae1899ddaa6dfc696401839f8b1fffa https://github.com/perl5-dbi/dbi/commit/735101b43ae1899ddaa6dfc696401839f8b1fffa Author: Jens Rehsack <sno@netbsd.org> Date: 2013-08-05 (Mon, 05 Aug 2013) Changed paths: ...

[perl5-dbi/dbi] 0b3fe3: Fixed VERSION regression in DBI::SQL::Nano
----==_mimepart_519541eb800_3b43d7fdd4200cf Date: Thu, 16 May 2013 13:30:35 -0700 Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit Content-ID: <519541eb3946_3b43d7fdd42019d@hookshot-fe6-pe1-prd.aws.github.net.mail> Branch: refs/heads/master Home: https://github.com/perl5-dbi/dbi Commit: 0b3fe3d8b14c2280e27032c8ea52d1a3c4c133c1 https://github.com/perl5-dbi/dbi/commit/0b3fe3d8b14c2280e27032c8ea52d1a3c4c133c1 Author: Tim Bunce <Tim.Bunce@pobox.com> Date: 2013-05-16 (Thu, 16 May 2013) Changed paths: M...

[perl5-dbi/dbi] 0c17b7: Include Jens' work for DBI-Test
----==_mimepart_521d9d9e8d573_74699e7d4814086d Date: Tue, 27 Aug 2013 23:50:06 -0700 Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit Content-ID: <521d9d9e8e411_74699e7d48140935@hookshot-fe4-pe1-prd.aws.github.net.mail> Branch: refs/heads/dir_search_hashes Home: https://github.com/perl5-dbi/dbi Commit: 0c17b78ff80873945276cd8ffc08876be8ebfd8d https://github.com/perl5-dbi/dbi/commit/0c17b78ff80873945276cd8ffc08876be8ebfd8d Author: H.Merijn Brand - Tux <h.m.brand@xs4all.nl> Date: 2013-08-12 (Mon, 12 Aug 2013)...

[perl5-dbi/dbi] b80de3: Make DBI::_handles return only the outer handle in...
----==_mimepart_5286b894b9afd_601c6e3d54169385 Date: Fri, 15 Nov 2013 16:13:08 -0800 Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit Content-ID: <5286b894ba6b0_601c6e3d541694af@hookshot-fe2-pe1-prd.aws.github.net.mail> Branch: refs/heads/master Home: https://github.com/perl5-dbi/dbi Commit: b80de3eb5d5bd1c469391218dbc91e9f5895e4a5 https://github.com/perl5-dbi/dbi/commit/b80de3eb5d5bd1c469391218dbc91e9f5895e4a5 Author: Tim Bunce <Tim.Bunce@pobox.com> Date: 2013-11-14 (Thu, 14 Nov 2013) Changed paths: ...

DBI::Format in DBI-1.34 vs. DBI-Shell-11.91
There seem to be conflicting versions of DBI::Format in DBI-1.34 and DBI-Shell-11.91. After upgrading to the recent DBI-1.34 I again get a warning from the CPAN "r" command which reports that there is a more recent version of DBI::Format to be found in DBI-Shell-11.91.tar. When I read that the new DBI-1.34 removed the old DBI::Shell from distribution, I was surporised that it kept DBI::Format. I couldn't find any perl references in DBI-1.34 that refered to DBI::Format, so perhaps if the official DBI::Format is being kept up to date in DBI-Shell-11.91, you could ...

[perl5-dbi/DBI-Test] 297a33: Move FixtureProvider into DBI::Test namespace.
----==_mimepart_5325d285a2e16_f5df47d38194b5 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit Branch: refs/heads/master Home: https://github.com/perl5-dbi/DBI-Test Commit: 297a33aaf239b376f49ea6665cee7a23c4e720e6 https://github.com/perl5-dbi/DBI-Test/commit/297a33aaf239b376f49ea6665cee7a23c4e720e6 Author: Tim Bunce <Tim.Bunce@pobox.com> Date: 2014-03-16 (Sun, 16 Mar 2014) Changed paths: A sandbox/tim/lib/DBI/Test/FixtureProvider/CSV.pm A sandbox/tim/lib/DBI/Test/FixtureProvider/DBM.pm A sandbox/tim/lib/DBI/Test/Fi...

[perl5-dbi/DBI-Test] 259b89: perltidy lib/DBI/Mock.pm
----==_mimepart_51de492438906_56b10afdd8124440 Date: Wed, 10 Jul 2013 22:56:52 -0700 Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit Content-ID: <51de492439365_56b10afdd81245a8@hookshot-fe2-pe1-prd.aws.github.net.mail> Branch: refs/heads/master Home: https://github.com/perl5-dbi/DBI-Test Commit: 259b8946d0112c630dfc1d1807824fd6305ca46c https://github.com/perl5-dbi/DBI-Test/commit/259b8946d0112c630dfc1d1807824fd6305ca46c Author: Jens Rehsack <sno@netbsd.org> Date: 2013-07-10 (Wed, 10 Jul 2013) Changed ...

[perl5-dbi/DBI-Test] 9016ab: Replace %$DBD_DBM_SETTINGS our var with use of DBI...
----==_mimepart_52cd4b65d99a9_473dd75d481011f8 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit Branch: refs/heads/master Home: https://github.com/perl5-dbi/DBI-Test Commit: 9016ab6b16ca17737ba583c93ae0248be4649a6d https://github.com/perl5-dbi/DBI-Test/commit/9016ab6b16ca17737ba583c93ae0248be4649a6d Author: Tim Bunce <Tim.Bunce@pobox.com> Date: 2014-01-08 (Wed, 08 Jan 2014) Changed paths: M sandbox/tim/lib/Context.pm M sandbox/tim/tumbler.pl Log Message: ----------- Replace %$DBD_DBM_SETTINGS our var with us...

[perl5-dbi/dbi] #2
----==_mimepart_55abb537d371c_49b33fa3c33e32c04821d Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit Branch: refs/tags/1.633_91 Home: https://github.com/perl5-dbi/dbi ----==_mimepart_55abb537d371c_49b33fa3c33e32c04821d-- ...

[perl5-dbi/dbi] #2
----==_mimepart_55aa5173255ee_15573fa5459ab29c229052a Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit Branch: refs/tags/1.633_90 Home: https://github.com/perl5-dbi/dbi ----==_mimepart_55aa5173255ee_15573fa5459ab29c229052a-- ...

Web resources about - DBI: Column metadata - perl.dbi.dev

Metadata - Wikipedia, the free encyclopedia
Metadata is " data about data". The term is ambiguous, as it is used for two fundamentally different concepts ( types ). Structural metadata ...

Metadata, Content Security: Metadatarisk.org
Metadatarisk.org is a public-benefit site offering information on content security. If you have an article or relevant website that you would ...

Metadata Working Group (MWG)
The MWG publishes technical specifications that describe how to effectively storemetadata into digital media files. These royalty-free specifications ...

Why Metadata Matters: The NSA and the Future of Privacy
Over at Slate, Dahlia Lithwick and Steve Vladeck have a great piece about why "metadata" matters. It is very much worth reading. Here are some ...

TrashExif - Metadata of photo remover with presetting on the App Store on iTunes
Get TrashExif - Metadata of photo remover with presetting on the App Store. See screenshots and ratings, and read customer reviews.

All sizes - Hillmann's Real Metadata. - Flickr - Photo Sharing!
Flickr is almost certainly the best online photo management and sharing application in the world. Show off your favorite photos and videos to ...

dekePod Episode 001: Metadata Forensics, What a Crock - YouTube
We all know digital photos can be modified. So much so that, at least in the popular lexicon, Photoshop is synonymous with turning fact into ...

MP urges Bill Shorten to consult more with caucus as Labor agrees to back the Coalition's metadata retention ...
Bill Shorten has been sent a warning shot to fix the way he operates and consult his colleagues more during an extended debate on metadata in ...

Malcolm Turnbull's Sky News interview basically renders the metadata retention laws useless
Mal comms in the middle. After several months of the Abbott Government telling Australians how important the metadata laws are to catch paedophiles ...

Access to metadata is vital for crime fighting: says internet safety advocate
OPINION: Alastair MacGibbon argues access to metadata is vital for criminal investigations, provided proper oversight is in place.

Resources last updated: 12/17/2015 7:24:26 PM