You can subscribe to this list here.
2001 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
(1) |
Aug
(23) |
Sep
(6) |
Oct
(2) |
Nov
(2) |
Dec
(5) |
---|---|---|---|---|---|---|---|---|---|---|---|---|
2002 |
Jan
|
Feb
(14) |
Mar
(16) |
Apr
(14) |
May
(25) |
Jun
(38) |
Jul
(22) |
Aug
(39) |
Sep
(3) |
Oct
(13) |
Nov
(47) |
Dec
(3) |
2003 |
Jan
(38) |
Feb
(39) |
Mar
(24) |
Apr
(57) |
May
(30) |
Jun
|
Jul
(39) |
Aug
(90) |
Sep
(41) |
Oct
(141) |
Nov
(158) |
Dec
(137) |
2004 |
Jan
(86) |
Feb
(169) |
Mar
(100) |
Apr
(83) |
May
(94) |
Jun
(77) |
Jul
(85) |
Aug
(54) |
Sep
(45) |
Oct
(36) |
Nov
(42) |
Dec
(70) |
2005 |
Jan
(46) |
Feb
(44) |
Mar
(50) |
Apr
(73) |
May
(90) |
Jun
(87) |
Jul
(41) |
Aug
(47) |
Sep
(28) |
Oct
(23) |
Nov
(44) |
Dec
(81) |
2006 |
Jan
(21) |
Feb
(9) |
Mar
(82) |
Apr
(14) |
May
(109) |
Jun
(175) |
Jul
(188) |
Aug
(44) |
Sep
(5) |
Oct
(47) |
Nov
(15) |
Dec
(34) |
2007 |
Jan
(75) |
Feb
(24) |
Mar
(30) |
Apr
(4) |
May
(28) |
Jun
(9) |
Jul
(13) |
Aug
(13) |
Sep
(29) |
Oct
(15) |
Nov
(19) |
Dec
(12) |
2008 |
Jan
(7) |
Feb
(19) |
Mar
(1) |
Apr
(7) |
May
(13) |
Jun
(19) |
Jul
(17) |
Aug
(29) |
Sep
(15) |
Oct
(37) |
Nov
(18) |
Dec
(29) |
2009 |
Jan
(23) |
Feb
(12) |
Mar
(8) |
Apr
(16) |
May
(11) |
Jun
(1) |
Jul
(2) |
Aug
(1) |
Sep
|
Oct
(9) |
Nov
(17) |
Dec
(31) |
2010 |
Jan
(15) |
Feb
(5) |
Mar
(4) |
Apr
(8) |
May
(1) |
Jun
(5) |
Jul
(17) |
Aug
(2) |
Sep
(12) |
Oct
(33) |
Nov
(14) |
Dec
(24) |
2011 |
Jan
(11) |
Feb
(2) |
Mar
(34) |
Apr
(11) |
May
(12) |
Jun
(3) |
Jul
(6) |
Aug
(11) |
Sep
(10) |
Oct
(1) |
Nov
(8) |
Dec
|
2012 |
Jan
(16) |
Feb
(2) |
Mar
|
Apr
(2) |
May
(6) |
Jun
(2) |
Jul
(7) |
Aug
|
Sep
|
Oct
(7) |
Nov
(22) |
Dec
(2) |
2013 |
Jan
(1) |
Feb
(24) |
Mar
(15) |
Apr
(2) |
May
(3) |
Jun
|
Jul
(2) |
Aug
|
Sep
(2) |
Oct
(6) |
Nov
(10) |
Dec
|
2014 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
(4) |
Nov
|
Dec
(5) |
2015 |
Jan
(1) |
Feb
(4) |
Mar
(3) |
Apr
(3) |
May
|
Jun
(3) |
Jul
(1) |
Aug
(2) |
Sep
|
Oct
|
Nov
|
Dec
(1) |
2016 |
Jan
(1) |
Feb
(9) |
Mar
(4) |
Apr
|
May
(6) |
Jun
|
Jul
|
Aug
|
Sep
|
Oct
(7) |
Nov
(13) |
Dec
|
2017 |
Jan
|
Feb
|
Mar
|
Apr
(1) |
May
|
Jun
|
Jul
(1) |
Aug
|
Sep
(12) |
Oct
(4) |
Nov
|
Dec
|
2018 |
Jan
(6) |
Feb
|
Mar
|
Apr
|
May
(6) |
Jun
|
Jul
(9) |
Aug
(4) |
Sep
(2) |
Oct
|
Nov
|
Dec
|
2019 |
Jan
(1) |
Feb
|
Mar
(4) |
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
2020 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
(2) |
Jul
(3) |
Aug
|
Sep
|
Oct
(3) |
Nov
|
Dec
|
2021 |
Jan
|
Feb
|
Mar
|
Apr
|
May
(4) |
Jun
|
Jul
(2) |
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
2023 |
Jan
|
Feb
(1) |
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
(1) |
2025 |
Jan
|
Feb
(2) |
Mar
|
Apr
(2) |
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
From: Carlos G.A. <car...@ho...> - 2002-08-10 12:31:24
|
Hello: The SQLStatistics cannot be called with a null pointer for the table parameter RETCODE OdbcStatement::sqlStatistics(SQLCHAR * catalog, int catLength, SQLCHAR * schema, int schemaLength, SQLCHAR * table, int tableLength, int unique, int reservedSic) { clearErrors(); releaseStatement(); char temp [1024], *p = temp; const char *cat = getString (&p, catalog, catLength, NULL); const char *scheme = getString (&p, schema, schemaLength, NULL); const char *tbl = getString (&p, table, tableLength, NULL); if ( *tbl ) { try { DatabaseMetaData *metaData = connection->getMetaData(); setResultSet (metaData->getIndexInfo (cat, scheme, tbl, unique == SQL_INDEX_UNIQUE, reservedSic == SQL_QUICK)); } catch (SQLException& exception) { postError ("HY000", exception); return SQL_ERROR; } } else return sqlReturn (SQL_ERROR, "HY009", "Invalid use of null pointer"); return sqlSuccess(); } Best Regards Carlos Guzmán Álvarez _________________________________________________________________ MSN. Más Útil cada Día. http://www.msn.es/intmap/ |
From: Carlos G.A. <car...@ho...> - 2002-08-10 12:30:21
|
Hello: A little fix for SQLTables The order of the SQLTables resultset is not according to the ODBC documentation IscTablesResultSet.cpp Change: sql += " order by rdb$owner_name, rdb$relation_name"; for sql += " order by rdb$system_flag desc, rdb$owner_name, rdb$relation_name"; Best regards Carlos Guzmán Álvarez _________________________________________________________________ Charle con sus amigos online usando MSN Messenger: http://messenger.msn.com |
From: Carlos G.A. <car...@ho...> - 2002-08-10 12:29:02
|
Hello: Two questions about SQLSpecialColumns: 1. The File IscSpecialColumnsResultSet.cpp don´t have the license information 2. The line 10 of the SQL statment don´t have the comma It should be: "\ti.rdb$index_id,\n" //10 Best Regards Carlos Guzman Álvarez _________________________________________________________________ Charle con sus amigos online usando MSN Messenger: http://messenger.msn.com |
From: Carlos G.A. <car...@ho...> - 2002-08-10 11:13:42
|
Hello: A little fix for SQLTables The order of the SQLTables resultset is not according to the ODBC documentation IscTablesResultSet.cpp Change: sql += " order by rdb$owner_name, rdb$relation_name"; for sql += " order by rdb$system_flag desc, rdb$owner_name, rdb$relation_name"; Best regards Carlos Guzmán Álvarez _________________________________________________________________ Únase al mayor servicio mundial de correo electrónico: http://www.hotmail.com/es |
From: Carlos G.A. <car...@ho...> - 2002-08-09 19:20:56
|
Hello: Little correction instead of: int nullable = resultSet->getInt(7); if ( nullable ) resultSet->setValue( 7, "YES" ); else resultSet->setValue( 7, "NO" ); use int isGrantable = resultSet->getInt(7); if ( isGrantable ) resultSet->setValue( 7, "YES" ); else resultSet->setValue( 7, "NO" ); Best regards Carlos Guzmán Álvarez >From: "Carlos G.A." <car...@ho...> >Reply-To: fir...@li... >To: fir...@li..., pr...@ib... >Subject: [Firebird-odbc-devel] Little modifications for the implementation >of SQLTablePrivileges >Date: Fri, 09 Aug 2002 17:33:50 +0200 > >Hello: > >Little modifications for the implementation of SQLTablePrivileges: > >IscTablePrivileges.cpp > >IscTablePrivilegesResultSet::next() > >Add this before return true; > > int nullable = resultSet->getInt(7); > if ( nullable ) > resultSet->setValue( 7, "YES" ); > else > resultSet->setValue( 7, "NO" ); > > >and add this before const char *privilege = resultSet->getString(6);: > > trimBlanks(3); > trimBlanks(4); > trimBlanks(5); > > >IscTablePrivileges.h > >Change: > >#endif // >!defined(AFX_ISCTABLESRESULTSET_H__6C3E2AB7_229F_11D4_98DF_0000C01D2301__INCLUDED_) > >for > >#endif // >!defined(AFX_ISCTABLEPRIVILEGESRESULTSET_H__6C3E2AB7_229F_11D4_98DF_0000C01D2301__INCLUDED_) > > >Best Regards >Carlos Guzmán Álvarez >Vigo-España > >_________________________________________________________________ >Únase al mayor servicio mundial de correo electrónico: >http://www.hotmail.com/es > > > >------------------------------------------------------- >This sf.net email is sponsored by:ThinkGeek >Welcome to geek heaven. >http://thinkgeek.com/sf >_______________________________________________ >Firebird-odbc-devel mailing list >Fir...@li... >https://lists.sourceforge.net/lists/listinfo/firebird-odbc-devel Un saludo Carlos Guzmán Álvarez Vigo-España "No tengo dones especiales.Sólo soy apasionadamente curioso" Albert Einstein, científico. _________________________________________________________________ MSN Fotos: la forma más fácil de compartir e imprimir fotos. http://photos.msn.es/support/worldwide.aspx |
From: Carlos G.A. <car...@ho...> - 2002-08-09 18:49:11
|
Hello: I made the implementation for SQLNumParams here is the code: Main.cpp ///// SQLNumParams ///// RETCODE SQL_API SQLNumParams (HSTMT arg0, SWORD * arg1) { /* notYetImplemented("SQLNumParams called\n"); return(SQL_SUCCESS); */ TRACE("SQLMoreResults"); return ((OdbcStatement*) arg0)->sqlNumParams(arg1); } OdbcStatement.h New declaration RETCODE sqlNumParams (SWORD *params); OdbcStatement.cpp New definition RETCODE OdbcStatement::sqlNumParams(SWORD * params) { clearErrors(); if (statement) try { *params = statement->getNumParams(); } catch (SQLException& exception) { postError ("HY000", exception); return SQL_ERROR; } else *params = 0; return sqlSuccess(); } IscConection.h New declaration in class PreparedStatement : public Statement virtual int getNumParams() = 0; IscPreparedStatement.h New declaration virtual int getNumParams(); IscPreparedStatement.cpp New definition int IscPreparedStatement::getNumParams() { return parameters.count; } IscCallableStatement.h New declaration virtual int getNumParams(); IscCallableStatement.cpp New definition int IscCallableStatement::getNumParams() { return Parent::getNumParams(); } Best regards Carlos Guzmán Álvarez _________________________________________________________________ Charle con sus amigos online usando MSN Messenger: http://messenger.msn.com |
From: Carlos G.A. <car...@ho...> - 2002-08-09 18:47:54
|
Hello: Another little fix InfoItems.h Change: UITEM (SQL_SCHEMA_USAGE, 0) UITEM (SQL_GROUP_BY, 0) for NITEM (SQL_SCHEMA_USAGE, 0) SITEM (SQL_GROUP_BY, 0) OdbcConnection.cpp SQLGetInfo Add: case SQL_SCHEMA_USAGE: if (metaData->supportsSchemasInDataManipulation()) value |= SQL_SU_DML_STATEMENTS ; if (metaData->supportsSchemasInProcedureCalls()) value |= SQL_SU_PROCEDURE_INVOCATION; if (metaData->supportsSchemasInTableDefinitions()) value |= SQL_SU_TABLE_DEFINITION; if (metaData->supportsCatalogsInIndexDefinitions()) value |= SQL_SU_INDEX_DEFINITION; if (metaData->supportsSchemasInPrivilegeDefinitions()) value |= SQL_SU_PRIVILEGE_DEFINITION ; break; case SQL_GROUP_BY: if ( metaData->supportsGroupBy() ) value = SQL_GB_GROUP_BY_CONTAINS_SELECT; else value = SQL_GB_NOT_SUPPORTED; break; Best Regards Carlos Guzman Álvarez _________________________________________________________________ MSN. Más Útil cada Día. http://www.msn.es/intmap/ |
From: Carlos G.A. <car...@ho...> - 2002-08-09 15:35:54
|
Hello: I made the implementation of SQLColumnPrivileges here is the code: Main.cpp ///// SQLColumnPrivileges ///// RETCODE SQL_API SQLColumnPrivileges (HSTMT arg0, UCHAR * arg1, SWORD arg2, UCHAR * arg3, SWORD arg4, UCHAR * arg5, SWORD arg6, UCHAR * arg7, SWORD arg8) { /* notYetImplemented("SQLColumnPrivileges called\n"); return(SQL_SUCCESS); */ TRACE ("SQLColumnPrivileges"); return ((OdbcStatement*) arg0)->sqlColumnPrivileges (arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8); } OdbcStatement.h New definition: RETCODE sqlColumnPrivileges (SQLCHAR* catalog, int catLength, SQLCHAR* schema, int schemaLength, SQLCHAR*table, int tableLength, SQLCHAR * column, int columnLength); OdbcStatement.cpp New implementation: RETCODE OdbcStatement::sqlColumnPrivileges(SQLCHAR * catalog, int catLength, SQLCHAR * schema, int schemaLength, SQLCHAR * table, int tableLength, SQLCHAR * column, int columnLength) { clearErrors(); releaseStatement(); char temp [1024], *p = temp; const char *cat = getString (&p, catalog, catLength, NULL); const char *scheme = getString (&p, schema, schemaLength, NULL); const char *tbl = getString (&p, table, tableLength, NULL); const char *col = getString (&p, column, columnLength, NULL); try { DatabaseMetaData *metaData = connection->getMetaData(); setResultSet (metaData->getColumnPrivileges (cat, scheme, tbl, col)); } catch (SQLException &exception) { postError ("HY000", exception); return SQL_ERROR; } return sqlSuccess(); } Project IscDbc IscDatabaseMetadata.cpp 1. New include: #include "IscColumnPrivilegesResultSet.h" 2. Modify IscDatabaseMetaData::getColumnPrivileges: ResultSet* IscDatabaseMetaData::getColumnPrivileges(const char* catalog, const char* schema, const char* table, const char* columnNamePattern) { IscColumnPrivilegesResultSet *resultSet = new IscColumnPrivilegesResultSet (this); try { resultSet->getColumnPrivileges (catalog, schema, table, columnNamePattern); } catch (...) { delete resultSet; throw; } return resultSet; } 3. Two new files IscColumnPrivilegesResultSet /* * * The contents of this file are subject to the Initial * Developer's Public License Version 1.0 (the "License"); * you may not use this file except in compliance with the * License. You may obtain a copy of the License at * http://www.ibphoenix.com/idpl.html. * * Software distributed under the License is distributed on * an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either * express or implied. See the License for the specific * language governing rights and limitations under the License. * * * The Original Code was created by James A. Starkey for IBPhoenix. * * Copyright (c) 1999, 2000, 2001 James A. Starkey * All Rights Reserved. */ // IscColumnPrivilegesResultSet.h: interface for the IscColumnPrivilegesResultSet class. // ///////////////////////////////////////////////////////////////////////////////////////// #if !defined(AFX_IscColumnPrivilegesResultSet_H__6C3E2AB7_229F_11D4_98DF_0000C01D2301__INCLUDED_) #define AFX_IscColumnPrivilegesResultSet_H__6C3E2AB7_229F_11D4_98DF_0000C01D2301__INCLUDED_ #if _MSC_VER >= 1000 #pragma once #endif // _MSC_VER >= 1000 #include "IscMetaDataResultSet.h" class IscColumnPrivilegesResultSet : public IscMetaDataResultSet { public: virtual bool next(); void getColumnPrivileges(const char * catalog, const char * schemaPattern, const char * tableNamePattern, const char * columnNamePattern); IscColumnPrivilegesResultSet(IscDatabaseMetaData *metaData); virtual ~IscColumnPrivilegesResultSet(); typedef IscMetaDataResultSet Parent; virtual int getColumnDisplaySize(int index); virtual int getColumnType(int index); virtual int getColumnPrecision(int index); }; #endif // !defined(AFX_ISCCOLUMNPRIVILEGESRESULTSET_H__6C3E2AB7_229F_11D4_98DF_0000C01D2301__INCLUDED_) IscColumnPrivilegesResultSet.cpp /* * * The contents of this file are subject to the Initial * Developer's Public License Version 1.0 (the "License"); * you may not use this file except in compliance with the * License. You may obtain a copy of the License at * http://www.ibphoenix.com/idpl.html. * * Software distributed under the License is distributed on * an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either * express or implied. See the License for the specific * language governing rights and limitations under the License. * * * The Original Code was created by James A. Starkey for IBPhoenix. * * Copyright (c) 1999, 2000, 2001 James A. Starkey * All Rights Reserved. */ // IscColumnPrivilegesResultSet.cpp: implementation of the IscColumnPrivilegesResultSet class. // ///////////////////////////////////////////////////////////////////////////////////////////////// #include <stdio.h> #include <string.h> #include "IscDbc.h" #include "IscColumnPrivilegesResultSet.h" #include "IscConnection.h" #include "IscDatabaseMetaData.h" #include "IscResultSet.h" #include "IscPreparedStatement.h" #include "IscBlob.h" #define TABLE_TYPE 4 ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// IscColumnPrivilegesResultSet::IscColumnPrivilegesResultSet(IscDatabaseMetaData *metaData) : IscMetaDataResultSet(metaData) { resultSet = NULL; } IscColumnPrivilegesResultSet::~IscColumnPrivilegesResultSet() { if (resultSet) resultSet->release(); } void IscColumnPrivilegesResultSet::getColumnPrivileges(const char * catalog, const char * schemaPattern, const char * tableNamePattern, const char * columnNamePattern) { JString sql = "select NULL as table_cat," "NULL as table_schem," "tbl.rdb$relation_name as table_name," "usp.rdb$field_name as column_name," "usp.rdb$grantor as grantor," "usp.rdb$user as grantee," "usp.rdb$privilege as privilege," "usp.rdb$grant_option as isgrantable " "from rdb$relations tbl, rdb$user_privileges usp\n" " where tbl.rdb$relation_name = usp.rdb$relation_name\n"; if (tableNamePattern) sql += expandPattern (" and tbl.rdb$relation_name %s '%s'", tableNamePattern); if (columnNamePattern) sql += expandPattern (" and usp.rdb$field_name %s '%s'", columnNamePattern); sql += " order by tbl.rdb$relation_name, usp.rdb$field_name, usp.rdb$privilege"; prepareStatement (sql); numberColumns = 8; } bool IscColumnPrivilegesResultSet::next() { if (!resultSet->next()) return false; trimBlanks(3); trimBlanks(4); trimBlanks(5); trimBlanks(6); const char *privilege = resultSet->getString(7); switch ( *privilege ) { case 'S': resultSet->setValue( 7, "SELECT" ); break; case 'I': resultSet->setValue( 7, "INSERT" ); break; case 'U': resultSet->setValue( 7, "UPDATE" ); break; case 'D': resultSet->setValue( 7, "DELETE" ); break; case 'R': resultSet->setValue( 7, "REFERENCES" ); break; } int nullable = resultSet->getInt(8); if ( nullable ) resultSet->setValue( 8, "YES" ); else resultSet->setValue( 8, "NO" ); return true; } int IscColumnPrivilegesResultSet::getColumnDisplaySize(int index) { switch (index) { case TABLE_TYPE: // change from blob to text return 128; } return Parent::getColumnDisplaySize (index); } int IscColumnPrivilegesResultSet::getColumnType(int index) { switch (index) { case TABLE_TYPE: // change from blob to text return JDBC_VARCHAR; } return Parent::getColumnType (index); } int IscColumnPrivilegesResultSet::getColumnPrecision(int index) { switch (index) { case TABLE_TYPE: // change from blob to text return 128; } return Parent::getPrecision (index); } Best regards Carlos Guzmán Álvarez _________________________________________________________________ MSN Fotos: la forma más fácil de compartir e imprimir fotos. http://photos.msn.es/support/worldwide.aspx |
From: Carlos G.A. <car...@ho...> - 2002-08-09 15:34:07
|
Hello: Little modifications for the implementation of SQLTablePrivileges: IscTablePrivileges.cpp IscTablePrivilegesResultSet::next() Add this before return true; int nullable = resultSet->getInt(7); if ( nullable ) resultSet->setValue( 7, "YES" ); else resultSet->setValue( 7, "NO" ); and add this before const char *privilege = resultSet->getString(6);: trimBlanks(3); trimBlanks(4); trimBlanks(5); IscTablePrivileges.h Change: #endif // !defined(AFX_ISCTABLESRESULTSET_H__6C3E2AB7_229F_11D4_98DF_0000C01D2301__INCLUDED_) for #endif // !defined(AFX_ISCTABLEPRIVILEGESRESULTSET_H__6C3E2AB7_229F_11D4_98DF_0000C01D2301__INCLUDED_) Best Regards Carlos Guzmán Álvarez Vigo-España _________________________________________________________________ Únase al mayor servicio mundial de correo electrónico: http://www.hotmail.com/es |
From: Carlos G.A. <car...@ho...> - 2002-08-09 14:35:40
|
Hello: This is bad: case SQL_MAX_USER_NAME_LEN: case SQL_MAX_OWNER_NAME_LEN: value = metaData->getMaxUserNameLength(); break; It should be: case SQL_MAX_USER_NAME_LEN: value = metaData->getMaxUserNameLength(); break; Best Regards Carlos Guzmán Álvarez _________________________________________________________________ Charle con sus amigos online usando MSN Messenger: http://messenger.msn.com |
From: Carlos G.A. <car...@ho...> - 2002-08-09 12:26:23
|
Hello: More little fixes: Note: SQL 1. InfoItems.h Change UITEM (SQL_CURSOR_SENSITIVITY, 0) UITEM (SQL_MAX_USER_NAME_LEN, 0) UITEM (SQL_MAX_COLUMNS_IN_TABLE, 0) UITEM (SQL_MAX_INDEX_SIZE, 0) UITEM (SQL_MAX_SCHEMA_NAME_LEN, 0) UITEM (SQL_MAX_CATALOG_NAME_LEN, 0) UITEM (SQL_MAX_ROW_SIZE, 0) UITEM (SQL_MAX_ROW_SIZE_INCLUDES_LONG, 0) UITEM (SQL_MAX_TABLES_IN_SELECT, 0) The next definitions are changed because the driver crash when an application calls SQLGetInfo with it, all will return 0 in this moment, if any knows the correct values please say to me. UITEM (SQL_MAX_BINARY_LITERAL_LEN, 0) UITEM (SQL_MAX_CHAR_LITERAL_LEN, 0) UITEM (SQL_MAX_IDENTIFIER_LEN, 0) UITEM (SQL_MAX_COLUMNS_IN_GROUP_BY, 0) UITEM (SQL_MAX_COLUMNS_IN_ORDER_BY, 0) UITEM (SQL_MAX_COLUMNS_IN_INDEX, 0) UITEM (SQL_MAX_COLUMNS_IN_SELECT, 0) for SITEM (SQL_CURSOR_SENSITIVITY, SQL_UNSPECIFIED) SITEM (SQL_MAX_USER_NAME_LEN, 0) NITEM (SQL_MAX_COLUMNS_IN_TABLE, 0) SITEM (SQL_MAX_INDEX_SIZE, 0) SITEM (SQL_MAX_SCHEMA_NAME_LEN, 0) SITEM (SQL_MAX_CATALOG_NAME_LEN, 0) NITEM (SQL_MAX_ROW_SIZE, 0) CITEM (SQL_MAX_ROW_SIZE_INCLUDES_LONG, 0) SITEM (SQL_MAX_TABLES_IN_SELECT, 0) NITEM (SQL_MAX_BINARY_LITERAL_LEN, 0) SITEM (SQL_MAX_CHAR_LITERAL_LEN, 0) SITEM (SQL_MAX_IDENTIFIER_LEN, 0) SITEM (SQL_MAX_COLUMNS_IN_GROUP_BY, 0) SITEM (SQL_MAX_COLUMNS_IN_ORDER_BY, 0) SITEM (SQL_MAX_COLUMNS_IN_INDEX, 0) SITEM (SQL_MAX_COLUMNS_IN_SELECT, 0) 2. OdbcConnection.cpp Add to SQLGetInfo this: case SQL_MAX_USER_NAME_LEN: case SQL_MAX_OWNER_NAME_LEN: value = metaData->getMaxUserNameLength(); break; case SQL_MAX_COLUMNS_IN_INDEX: value = metaData->getMaxColumnsInIndex(); break; case SQL_MAX_COLUMNS_IN_TABLE: value = metaData->getMaxColumnsInTable(); break; case SQL_MAX_INDEX_SIZE: value = metaData->getMaxIndexLength(); break; case SQL_MAX_SCHEMA_NAME_LEN: value = metaData->getMaxSchemaNameLength(); break; case SQL_MAX_CATALOG_NAME_LEN: value = metaData->getMaxCatalogNameLength(); break; case SQL_MAX_ROW_SIZE: value = metaData->getMaxRowSize(); break; case SQL_MAX_ROW_SIZE_INCLUDES_LONG: string = metaData->doesMaxRowSizeIncludeBlobs() ? "Y" : "N"; break; case SQL_MAX_TABLES_IN_SELECT: value = metaData->getMaxTablesInSelect(); break; case SQL_MAX_DRIVER_CONNECTIONS: value = metaData->getMaxConnections(); break; 3. OdbcStatement.cpp OdbcStatement::sqlColAttribute Change case SQL_DESC_NAME: string = metaData->getColumnName (column); break; for case SQL_DESC_BASE_COLUMN_NAME: case SQL_DESC_NAME: string = metaData->getColumnName (column); break; Best Regards Carlos Guzmán Álvarez Vigo-España _________________________________________________________________ MSN. Más Útil cada Día. http://www.msn.es/intmap/ |
From: Carlos G.A. <car...@ho...> - 2002-08-09 09:19:51
|
Hello: A couple of little fixes. OdbcStatement.cpp 1. OdbcStatement::OdbcStatement rowArraySize = applicationRowDescriptor->descArraySize; 2. OdbcStatement::sqlGetStmtAttr Add SQL_ROWSET_SIZE under SQL_ATTR_ROW_ARRAY_SIZE case SQL_ATTR_ROW_ARRAY_SIZE: case SQL_ROWSET_SIZE: value = rowArraySize; break; 3. OdbcStatement::sqlGetStmtAttr Add SQL_ATTR_USE_BOOKMARKS: case SQL_ATTR_USE_BOOKMARKS: value = SQL_UB_OFF; break; 4. OdbcStatement::sqlSetStmtAttr Add SQL_ROWSET_SIZE under SQL_ATTR_ROW_ARRAY_SIZE case SQL_ATTR_ROW_ARRAY_SIZE: // 27 case SQL_ROWSET_SIZE: // 9 rowArraySize = (int) ptr; applicationRowDescriptor->descArraySize = rowArraySize; break; 5. OdbcStatement::sqlSetStmtAttr case SQL_ATTR_USE_BOOKMARKS: // SQL_USE_BOOKMARKS 12 break; 6. OdbcStatement::sqlColAttribute Change : /*** case SQL_DESC_MONEY: value = (metaData->isCurrency (column)) ? 1 : 0; break; case SQL_DESC_AUTO_INCREMENT: value = (metaData->isAutoIncrement (column)) ? 1 : 0; break; ***/ for /*** case SQL_DESC_MONEY: value = (metaData->isCurrency (column)) ? 1 : 0; break; ***/ case SQL_DESC_AUTO_UNIQUE_VALUE: // REVISAR value = (metaData->isAutoIncrement (column)) ? 1 : 0; break; 7. OdbcStatement::sqlGetStmtAttr Add SQL_ATTR_CURSOR_SENSITIVITY case SQL_ATTR_CURSOR_SENSITIVITY: value = SQL_UNSPECIFIED; break; 8. OdbcStatement::sqlSetStmtAttr case SQL_ATTR_CURSOR_SENSITIVITY: // (-2) break; Best Regards Carlos Guzmán Álvarez _________________________________________________________________ Charle con sus amigos online usando MSN Messenger: http://messenger.msn.com |
From: Carlos G.A. <car...@ho...> - 2002-08-09 08:41:46
|
Hello: I made the implementation for SQLTablePrivileges, here is the code ( I will made the implementation for SQLColumnPrivileges as soon as possible .. :)) ): Main.cpp ///// SQLTablePrivileges ///// RETCODE SQL_API SQLTablePrivileges ( HSTMT arg0, UCHAR * arg1, SWORD arg2, UCHAR * arg3, SWORD arg4, UCHAR * arg5, SWORD arg6) { /* notYetImplemented("SQLTablePrivileges called\n"); return(SQL_SUCCESS); */ TRACE ("SQLTablePrivileges"); return ((OdbcStatement*) arg0)->sqlTablePrivileges (arg1,arg2,arg3,arg4,arg5,arg6); } OdbcStatement.h New declaration: RETCODE sqlTablePrivileges (SQLCHAR* catalog, int catLength, SQLCHAR* schema, int schemaLength, SQLCHAR*table, int tableLength); OdbcStatement.cpp New implementation: RETCODE OdbcStatement::sqlTablePrivileges(SQLCHAR * catalog, int catLength, SQLCHAR * schema, int schemaLength, SQLCHAR * table, int tableLength) { clearErrors(); releaseStatement(); char temp [1024], *p = temp; const char *cat = getString (&p, catalog, catLength, NULL); const char *scheme = getString (&p, schema, schemaLength, NULL); const char *tbl = getString (&p, table, tableLength, NULL); try { DatabaseMetaData *metaData = connection->getMetaData(); setResultSet (metaData->getTablePrivileges (cat, scheme, tbl)); } catch (SQLException &exception) { postError ("HY000", exception); return SQL_ERROR; } return sqlSuccess(); } IscDbc project: IscDatabaseMetadata.cpp Nw include: #include "IscTablePrivilegesResultSet.h" Modified the definition of IscDatabaseMetaData::getTablePrivileges ResultSet* IscDatabaseMetaData::getTablePrivileges(const char* catalog, const char* schemaPattern, const char* tableNamePattern) { IscTablePrivilegesResultSet *resultSet = new IscTablePrivilegesResultSet (this); try { resultSet->getTablePrivileges (catalog, schemaPattern, tableNamePattern); } catch (...) { delete resultSet; throw; } return resultSet; } Two new files : IscTablePrivilegesResultSet.h /* * * The contents of this file are subject to the Initial * Developer's Public License Version 1.0 (the "License"); * you may not use this file except in compliance with the * License. You may obtain a copy of the License at * http://www.ibphoenix.com/idpl.html. * * Software distributed under the License is distributed on * an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either * express or implied. See the License for the specific * language governing rights and limitations under the License. * * * The Original Code was created by James A. Starkey for IBPhoenix. * * Copyright (c) 1999, 2000, 2001 James A. Starkey * All Rights Reserved. */ // IscTablePrivilegesResultSet.h: interface for the IscTablePrivilegesResultSet class. // ///////////////////////////////////////////////////////////////////////////////////////// #if !defined(AFX_ISCTABLEPRIVILEGESRESULTSET_H__6C3E2AB7_229F_11D4_98DF_0000C01D2301__INCLUDED_) #define AFX_ISCTABLEPRIVILEGESRESULTSET_H__6C3E2AB7_229F_11D4_98DF_0000C01D2301__INCLUDED_ #if _MSC_VER >= 1000 #pragma once #endif // _MSC_VER >= 1000 #include "IscMetaDataResultSet.h" class IscTablePrivilegesResultSet : public IscMetaDataResultSet { public: virtual bool next(); void getTablePrivileges(const char * catalog, const char * schemaPattern, const char * tableNamePattern); IscTablePrivilegesResultSet(IscDatabaseMetaData *metaData); virtual ~IscTablePrivilegesResultSet(); typedef IscMetaDataResultSet Parent; virtual int getColumnDisplaySize(int index); virtual int getColumnType(int index); virtual int getColumnPrecision(int index); }; #endif // !defined(AFX_ISCTABLESRESULTSET_H__6C3E2AB7_229F_11D4_98DF_0000C01D2301__INCLUDED_) IscTablePrivilegesResultSet.cpp /* * * The contents of this file are subject to the Initial * Developer's Public License Version 1.0 (the "License"); * you may not use this file except in compliance with the * License. You may obtain a copy of the License at * http://www.ibphoenix.com/idpl.html. * * Software distributed under the License is distributed on * an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either * express or implied. See the License for the specific * language governing rights and limitations under the License. * * * The Original Code was created by James A. Starkey for IBPhoenix. * * Copyright (c) 1999, 2000, 2001 James A. Starkey * All Rights Reserved. */ // IscTablePrivilegesResultSet.cpp: implementation of the IscTablePrivilegesResultSet class. // ///////////////////////////////////////////////////////////////////////////////////////////////// #include <stdio.h> #include <string.h> #include "IscDbc.h" #include "IscTablePrivilegesResultSet.h" #include "IscConnection.h" #include "IscDatabaseMetaData.h" #include "IscResultSet.h" #include "IscPreparedStatement.h" #include "IscBlob.h" #define TABLE_TYPE 4 ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// IscTablePrivilegesResultSet::IscTablePrivilegesResultSet(IscDatabaseMetaData *metaData) : IscMetaDataResultSet(metaData) { resultSet = NULL; } IscTablePrivilegesResultSet::~IscTablePrivilegesResultSet() { if (resultSet) resultSet->release(); } void IscTablePrivilegesResultSet::getTablePrivileges(const char * catalog, const char * schemaPattern, const char * tableNamePattern) { JString sql = "select NULL as table_cat," "NULL as table_schem," "tbl.rdb$relation_name as table_name," "usp.rdb$grantor as grantor," "usp.rdb$user as grantee," "usp.rdb$privilege as privilege," "usp.rdb$grant_option as isgrantable " "from rdb$relations tbl, rdb$user_privileges usp\n" " where tbl.rdb$relation_name = usp.rdb$relation_name\n"; if (tableNamePattern) sql += expandPattern (" and tbl.rdb$relation_name %s '%s'", tableNamePattern); sql += " order by tbl.rdb$relation_name, usp.rdb$privilege, usp.rdb$user"; prepareStatement (sql); numberColumns = 7; } bool IscTablePrivilegesResultSet::next() { if (!resultSet->next()) return false; const char *privilege = resultSet->getString(6); switch ( *privilege ) { case 'S': resultSet->setValue( 6, "SELECT" ); break; case 'I': resultSet->setValue( 6, "INSERT" ); break; case 'U': resultSet->setValue( 6, "UPDATE" ); break; case 'D': resultSet->setValue( 6, "DELETE" ); break; case 'R': resultSet->setValue( 6, "REFERENCES" ); break; } return true; } int IscTablePrivilegesResultSet::getColumnDisplaySize(int index) { switch (index) { case TABLE_TYPE: // change from blob to text return 128; } return Parent::getColumnDisplaySize (index); } int IscTablePrivilegesResultSet::getColumnType(int index) { switch (index) { case TABLE_TYPE: // change from blob to text return JDBC_VARCHAR; } return Parent::getColumnType (index); } int IscTablePrivilegesResultSet::getColumnPrecision(int index) { switch (index) { case TABLE_TYPE: // change from blob to text return 128; } return Parent::getPrecision (index); } Best Regards Carlos Guzmán Álvarez Vigo-España _________________________________________________________________ MSN Fotos: la forma más fácil de compartir e imprimir fotos. http://photos.msn.es/support/worldwide.aspx |
From: Carlos G.A. <car...@ho...> - 2002-08-08 11:46:22
|
Hello: The SQLColumns function gives bad results in the column size in Visual Foxpro and the MS ODBC test application. 1. Visual Foxpro For decimal and numeric fields it returns always 20 insted of the precision of the field. For BLOB fields it returns always 8. 2. MS ODBC Test Application. It returns always the size of the first field ( i think because in my test retuns always 15 that is the size of the first field ), this seems to be a problem with the conversions. Best regards Carlos Guzmán Álvarez Vigo-España _________________________________________________________________ MSN Fotos: la forma más fácil de compartir e imprimir fotos. http://photos.msn.es/support/worldwide.aspx |
From: <car...@ho...> - 2002-08-07 14:20:48
|
Hello: The same but for SQLColAttribute. OdbcStatement.cpp: OdbcStatement::sqlColAttribute case SQL_DESC_TYPE_NAME: string = metaData->getColumnTypeName (column); break; Best regards Carlos Guzmán Álvarez Vigo-España |
From: Carlos G.A. <car...@ho...> - 2002-08-07 12:33:08
|
Hello: The SQLColAttributes with SQL_COLUMN_TYPE_NAME returns the number of the SQL_TYPE instead of the name of the type Here is te fix for this: OdbcStatement.cpp: OdbcStatement::sqlColAttributes case SQL_COLUMN_TYPE_NAME: string = metaData->getColumnTypeName (column); break; Sqlda.h: New definition: const char* getColumnTypeName (int index); Sqlda.cpp: New implementation: const char* Sqlda::getColumnTypeName(int index) { XSQLVAR *var = sqlda->sqlvar + index - 1; return getSqlTypeName (var->sqltype, var->sqlsubtype, var->sqlscale); } IscResultSetMetaData.h New definition: virtual const char* getColumnTypeName (int index); IscResultSetMetaData.cpp New implementation: const char* IscResultSetMetaData::getColumnTypeName(int index) { return resultSet->getColumnTypeName (index); } IscResultSet.h New definition: virtual const char* getColumnTypeName (int index); IscResultSet.cpp New implementation: const char* IscResultSet::getColumnTypeName(int index) { return sqlda->getColumnTypeName (index); } IscMetaDataResultSet.h New definition: virtual const char* getColumnTypeName (int index); IscMetaDataResultSet.cpp New implementation: const char* IscMetaDataResultSet::getColumnTypeName(int index) { return resultSet->getColumnTypeName (index); } IscConnection.h New definition in class ResultSetMetaData as public: virtual const char* getColumnTypeName (int index) = 0; Best regards Carlos Guzmán Álvarez Vigo-España _________________________________________________________________ Charle con sus amigos online usando MSN Messenger: http://messenger.msn.com |
From: Paul S. <pa...@tr...> - 2002-08-06 19:27:25
|
Dear List: I have asked this question before, and will probably ask it again, in Crystal Reports it creates a construct that looks like this: ORDER_DATETIME = { ts ' 2002-08-06 14:06:00' } Which I will assume converts the string ' 2002-08-06 14:06:00' into a date/time field for the comparison. I know that if I create the SQL myself then Firebird is happy to do the conversion internally. So where in the ODBCJDBC driver code, should I look, in order to implement {ts } and the other two variations of this functionality? I don't mind hacking in the changes, I just am not sure where.... Thanks Paul Schmidt, President Tricat Technologies pa...@tr... www.tricattechnologies.com |
From: Carlos G.A. <car...@ho...> - 2002-08-06 18:17:50
|
Hello: The SQLGetConnectOption is not in the supported functions array ( supportedFunctions[] ): OdbcConnection.cpp Add this after SQL_API_SQLSETCONNECTOPTION, : SQL_API_SQLGETCONNECTOPTION, Best regards Carlos Guzmán Álvarez _________________________________________________________________ MSN. Más Útil cada Día. http://www.msn.es/intmap/ |
From: Carlos G.A. <car...@ho...> - 2002-08-06 17:03:38
|
Hello: The IscDbc project have two files ( IscDbc.h, Types.h ) that deifine the same constants with different names ( like jdbcDATE and JDBC_DATE ), i made changes for using only the constants defined in IscDbc.h ( that have the correct values ): Types.h: Remove: enum JdbcType { jdbcNULL = 0, TINYINT = (-7), // byte / C char SMALLINT = 5, // short INTEGER = 4, BIGINT = (-5), // QUAD (64 bit) jdbcFLOAT = 6, jdbcDOUBLE = 8, jdbcCHAR = 1, VARCHAR = 12, LONGVARCHAR = (-1), jdbcDATE = 91, TIME = 92, TIMESTAMP = 93, TYPE_SQL_NUMERIC = 2, TYPE_SQL_DECIMAL = 3, TYPE_SQL_LONGVARBINARY = -4, TYPE_SQL_LONGVARCHAR = -1, TYPE_SQL_DATE = 9, TYPE_SQL_TIME = 10, TYPE_SQL_TIMESTAMP = 11, jdbcBLOB = 2004, jdbcCLOB = 2005, CLOB = 2005, }; TypesResultSet.cpp: Changes static const Types types [] = { ALPHA ("CHAR", jdbcCHAR,32767), ALPHA ("VARCHAR", VARCHAR,32765), NUMERIC ("NUMERIC", TYPE_SQL_NUMERIC, 18, "precision,scale", 0, 18), NUMERIC ("DECIMAL", TYPE_SQL_DECIMAL, 18, "precision,scale", 0, 18), NUMERIC ("SMALLINT", SMALLINT, 5, NULL, 0, 0), NUMERIC ("INTEGER", INTEGER, 10, NULL, 0, 0), NUMERIC ("FLOAT", jdbcFLOAT, 15, NULL, 0, 0), NUMERIC ("DOUBLE PRECISION", jdbcDOUBLE, 15, NULL, 0, 0), BLOB ("LONG VARCHAR", TYPE_SQL_LONGVARCHAR,"'","'"), BLOB ("LONG VARBINARY", TYPE_SQL_LONGVARBINARY,NULL,NULL), DATETIME("DATE",jdbcDATE,10,"{d'","'}"), DATETIME("TIME",TIME,8,"{t'","'}"), DATETIME("TIMESTAMP",TIMESTAMP,23,"{ts'","'}"), }; to: static const Types types [] = { NUMERIC ("NUMERIC", JDBC_NUMERIC, MAX_NUMERIC_LENGTH, "precision,scale", 0, MAX_NUMERIC_LENGTH), NUMERIC ("DECIMAL", JDBC_DECIMAL, MAX_DECIMAL_LENGTH, "precision,scale", 0, MAX_DECIMAL_LENGTH), NUMERIC ("SMALLINT", JDBC_SMALLINT, MAX_SMALLINT_LENGTH, NULL, 0, 0), NUMERIC ("INTEGER", JDBC_INTEGER, MAX_INT_LENGTH, NULL, 0, 0), NUMERIC ("FLOAT", JDBC_FLOAT, MAX_FLOAT_LENGTH, NULL, 0, 0), NUMERIC ("DOUBLE PRECISION", JDBC_DOUBLE, MAX_DOUBLE_LENGTH, NULL, 0, 0), DATETIME("DATE",JDBC_DATE,MAX_DATE_LENGTH,"{d'","'}"), DATETIME("TIME",JDBC_TIME,MAX_TIME_LENGTH,"{t'","'}"), DATETIME("TIMESTAMP",JDBC_TIMESTAMP,MAX_TIMESTAMP_LENGTH,"{ts'","'}"), ALPHA ("CHAR", JDBC_CHAR,MAX_CHAR_LENGTH), ALPHA ("VARCHAR", JDBC_VARCHAR,MAX_VARCHAR_LENGTH), BLOB ("BLOB SUB_TYPE 1", JDBC_LONGVARCHAR,"'","'"), BLOB ("BLOB", JDBC_LONGVARBINARY,NULL,NULL), }; And changes: static const Fields fields [] = { FIELD ("TYPE_NAME", VARCHAR, 128), FIELD ("DATA_TYPE", SMALLINT, 5), FIELD ("PRECISION", INTEGER, 10), FIELD ("LITERAL_PREFIX", VARCHAR, 128), FIELD ("LITERAL_SUFFIX", VARCHAR, 128), FIELD ("CREATE_PARAMS", VARCHAR, 128), FIELD ("NULLABLE", SMALLINT, 5), FIELD ("CASE_SENSITIVE", SMALLINT, 5), FIELD ("SEARCHABLE", SMALLINT, 5), FIELD ("UNSIGNED_ATTRIBUTE", SMALLINT, 5), FIELD ("MONEY", SMALLINT, 5), FIELD ("AUTO_INCREMENT", SMALLINT, 5), FIELD ("LOCAL_TYPE_NAME", VARCHAR, 128), FIELD ("MINIMUM_SCALE", SMALLINT, 5), FIELD ("MAXIMUM_SCALE", SMALLINT, 5), FIELD ("SQL_DATA_TYPE", SMALLINT, 5), FIELD ("SQL_DATETIME_SUB", SMALLINT, 5), FIELD ("NUM_PREC_RADIX", INTEGER, 10), FIELD ("SQL_INTERVAL_PRECISION", SMALLINT, 5), }; to: static const Fields fields [] = { FIELD ("TYPE_NAME" , JDBC_VARCHAR , 128), FIELD ("DATA_TYPE" , JDBC_SMALLINT , 5), FIELD ("PRECISION" , JDBC_INTEGER , 10), FIELD ("LITERAL_PREFIX" , JDBC_VARCHAR , 128), FIELD ("LITERAL_SUFFIX" , JDBC_VARCHAR , 128), FIELD ("CREATE_PARAMS" , JDBC_VARCHAR , 128), FIELD ("NULLABLE" , JDBC_SMALLINT , 5), FIELD ("CASE_SENSITIVE" , JDBC_SMALLINT , 5), FIELD ("SEARCHABLE" , JDBC_SMALLINT , 5), FIELD ("UNSIGNED_ATTRIBUTE" , JDBC_SMALLINT , 5), FIELD ("MONEY" , JDBC_SMALLINT , 5), FIELD ("AUTO_INCREMENT" , JDBC_SMALLINT , 5), FIELD ("LOCAL_TYPE_NAME" , JDBC_VARCHAR , 128), FIELD ("MINIMUM_SCALE" , JDBC_SMALLINT , 5), FIELD ("MAXIMUM_SCALE" , JDBC_SMALLINT , 5), FIELD ("SQL_DATA_TYPE" , JDBC_SMALLINT , 5), FIELD ("SQL_DATETIME_SUB" , JDBC_SMALLINT , 5), FIELD ("NUM_PREC_RADIX" , JDBC_INTEGER , 10), FIELD ("SQL_INTERVAL_PRECISION", JDBC_SMALLINT, 5), }; Sqlda.cpp: Changes: int Sqlda::getSqlType(int iscType, int subType, int sqlScale) { switch (iscType & ~1) { case SQL_TEXT: return JDBC_CHAR; case SQL_VARYING: return JDBC_VARCHAR; case SQL_SHORT: if ( sqlScale < 0 ) return JDBC_DECIMAL; return JDBC_SMALLINT; case SQL_LONG: if ( sqlScale < 0 ) return JDBC_DECIMAL; return JDBC_INTEGER; case SQL_INT64: if ( sqlScale < 0 ) return JDBC_DECIMAL; return JDBC_BIGINT; case SQL_QUAD: return JDBC_BIGINT; case SQL_FLOAT: return JDBC_REAL; case SQL_DOUBLE: if ( sqlScale < 0 ) return JDBC_DECIMAL; return JDBC_DOUBLE; case SQL_TIMESTAMP: return JDBC_TIMESTAMP; case SQL_TYPE_TIME: return TIME; case SQL_TYPE_DATE: return jdbcDATE; case SQL_BLOB: if (subType == 1) return JDBC_LONGVARCHAR; return JDBC_LONGVARBINARY; case SQL_ARRAY: NOT_SUPPORTED("array", 0, "", 0, ""); } return 0; } to: int Sqlda::getSqlType(int iscType, int subType, int sqlScale) { switch (iscType & ~1) { case SQL_TEXT: return JDBC_CHAR; case SQL_VARYING: return JDBC_VARCHAR; case SQL_SHORT: if ( sqlScale < 0 ) return JDBC_DECIMAL; return JDBC_SMALLINT; case SQL_LONG: if ( sqlScale < 0 ) return JDBC_DECIMAL; return JDBC_INTEGER; case SQL_FLOAT: return JDBC_FLOAT; // return JDBC_REAL; case SQL_DOUBLE: if ( sqlScale < 0 ) return JDBC_DECIMAL; return JDBC_DOUBLE; case SQL_QUAD: return JDBC_BIGINT; case SQL_INT64: if ( sqlScale < 0 ) return JDBC_DECIMAL; return JDBC_BIGINT; case SQL_BLOB: if (subType == 1) return JDBC_LONGVARCHAR; return JDBC_LONGVARBINARY; case SQL_TIMESTAMP: return JDBC_TIMESTAMP; case SQL_TYPE_TIME: return JDBC_TIME; case SQL_TYPE_DATE: return JDBC_DATE; case SQL_ARRAY: NOT_SUPPORTED("array", 0, "", 0, ""); } return 0; } Best regards Carlos Guzmán Álvarez Vigo-España _________________________________________________________________ MSN. Más Útil cada Día. http://www.msn.es/intmap/ |
From: Paul R. <pr...@ib...> - 2002-08-06 14:48:10
|
Paul Reeves wrote: > > Blob support is still dubious and > Access still doesn't work with the driver. > > Thanks are due to the contributors who have made this possible. > That wasn't very well written, was it? Of course, what I meant to say was thankyou to the contributors who have helped improve the driver, not imply that they are responsible for it not working with Access. Paul -- Paul Reeves http://www.ibphoenix.com Supporting users of Firebird and InterBase |
From: Paul R. <pr...@ib...> - 2002-08-06 14:08:24
|
A Win32 snapshot of the current codebase is now available for download here: http://www.ibphoenix.com/downloads/OdbcJdbc-20020802-snapshot.zip This is a beta release and the readme warns of this. The main purpose is to verify that the fixes don't break existing functionality. If all goes well we will do a proper release in the coming weeks. The change.log lists the changes. Nothing remarkable or dramatic, but lots of small fixes that should help the driver work better with the wide variety of tools that use ODBC. Blob support is still dubious and Access still doesn't work with the driver. Thanks are due to the contributors who have made this possible. Paul -- Paul Reeves http://www.ibphoenix.com Supporting users of Firebird and InterBase |
From: Carlos G.A. <car...@ho...> - 2002-08-06 13:32:27
|
Hello: I´m making test to the driver with the microsoft odbc test program, this program have an option for creating a table, a index in the table, make a select and insert data in the table created, using the information returned by SQLGetTypeInfo, well, the 3 first steps works well but the insert of data fails, i made a fix for this: IscStatement.h Add this at line 91: /* * Values for state: * 0 = preparado * 1 = ejecutado */ int state; IscStatement.cpp IscStatement::IscStatement(IscConnection *connect): Add this: state = 1; IscStatement::getResultSet() Change : if (outputSqlda.sqlda->sqld < 1) throw SQLEXCEPTION (RUNTIME_ERROR, "current statement doesn't return results"); for: if ( state == 1 ) if (outputSqlda.sqlda->sqld < 1) throw SQLEXCEPTION (RUNTIME_ERROR, "current statement doesn't return results"); IscStatement::prepareStatement(const char * sqlString) Add this at the end: state = 0; IscStatement::execute() Add this before return: state = 1; OdbcStatement::sqlPrepare(SQLCHAR * sql, int sqlLength) Move this : if( updatePreparedResultSet ) setResultSet ( statement->getResultSet() ); into try...catch block: try { if (isStoredProcedureEscape (string)) statement = callableStatement = connection->connection->prepareCall (string); else statement = connection->connection->prepareStatement (string); if( updatePreparedResultSet ) setResultSet ( statement->getResultSet() ); } catch (SQLException& exception) { postError ("HY000", exception); return SQL_ERROR; } Best regards Carlos Guzmán Álvarez Vigo-España _________________________________________________________________ MSN Fotos: la forma más fácil de compartir e imprimir fotos. http://photos.msn.es/support/worldwide.aspx |
From: Carlos G.A. <car...@ho...> - 2002-07-30 11:40:57
|
Hello: In visual foxpro when you execute a Statement with sqlexec like this: sqlexec( gnHConn,"SELECT SUM(field) FROM TABLE", "CURSOR") if the field in the sum is a DECIMAL field in Firebird, Visual Foxpro converts it in Character because the driver returns JDBC_BIGINT as column type i have a little fix for this issue and return JDBC_DECIMAL instead of SQL_BIGINT for DECIMAL/NUMERIC FIELDS. Sqlda.h: Change: static int getSqlType (int iscType, int subType); static const char* getSqlTypeName (int iscType, int subType); to : static int getSqlType (int iscType, int subType, int sqlScale); static const char* getSqlTypeName (int iscType, int subType, int sqlScale); Sqlda.cpp: int Sqlda::getColumnType(int index) { XSQLVAR *var = sqlda->sqlvar + index - 1; return getSqlType (var->sqltype, var->sqlsubtype, var->sqlscale); } int Sqlda::getSqlType(int iscType, int subType, int sqlScale) { switch (iscType & ~1) { case SQL_TEXT: return JDBC_CHAR; case SQL_VARYING: return JDBC_VARCHAR; case SQL_SHORT: if ( sqlScale < 0 ) return JDBC_DECIMAL; return JDBC_SMALLINT; case SQL_LONG: if ( sqlScale < 0 ) return JDBC_DECIMAL; return JDBC_INTEGER; case SQL_INT64: if ( sqlScale < 0 ) return JDBC_DECIMAL; return JDBC_BIGINT; case SQL_QUAD: return JDBC_BIGINT; case SQL_FLOAT: return JDBC_REAL; case SQL_DOUBLE: if ( sqlScale < 0 ) return JDBC_DECIMAL; return JDBC_DOUBLE; case SQL_TIMESTAMP: return JDBC_TIMESTAMP; case SQL_TYPE_TIME: return TIME; case SQL_TYPE_DATE: return jdbcDATE; case SQL_BLOB: if (subType == 1) return JDBC_LONGVARCHAR; return JDBC_LONGVARBINARY; case SQL_ARRAY: NOT_SUPPORTED("array", 0, "", 0, ""); } return 0; } const char* Sqlda::getSqlTypeName(int iscType, int subType, int sqlScale) { switch (iscType & ~1) { case SQL_TEXT: return "CHAR"; case SQL_VARYING: return "VARCHAR"; case SQL_SHORT: if ( sqlScale < 0 ) return "DECIMAL"; return "SMALLINT"; case SQL_LONG: if ( sqlScale < 0 ) return "DECIMAL"; return "INTEGER"; case SQL_INT64: if ( sqlScale < 0 ) return "DECIMAL"; return "BIGINT"; case SQL_FLOAT: return "REAL"; case SQL_DOUBLE: if ( sqlScale < 0 ) return "DECIMAL"; return "DOUBLE PRECISION"; case SQL_QUAD: return "BIGINT"; case SQL_BLOB: if (subType == 1) return "LONG VARCHAR"; return "LONG VARBINARY"; case SQL_TIMESTAMP: return "TIMESTAMP"; case SQL_TYPE_TIME: return "TIME"; case SQL_TYPE_DATE: return "DATE"; case SQL_ARRAY: return "ARRAY"; default: NOT_YET_IMPLEMENTED; } return "*unknown type*"; } Best regards Carlos Guzman Alvarez P.D.: I already send this post in 19/06/2002, but it´s not included in CVS sources and i want to know if anybody found a problem with the fix..... _________________________________________________________________ MSN Fotos: la forma más fácil de compartir e imprimir fotos. http://photos.msn.es/support/worldwide.aspx |
From: Carlos G. Á. <car...@ho...> - 2002-07-08 10:33:28
|
Hello: When i save a date ( in VFP ) with the value 01/01/1900 it saves the value well but when i made a requery of the remote view it retrieves 07/02/2036, i think i have all changes related to dates and datetimes in my private tree of sources. Best Regards Carlos Guzmán Álvarez Vigo-España <sc...@de...> escribió en el mensaje news:3D2971B6.17594.C14BD9@localhost... > >Hello: > > > >The driver gives bad dates when the date value is not in the range > >31/12/1901-31/12/2037, i see this in Visual Foxpro, the dates are > >good saved but the values in the select-sql statments are incorrect. > > > >Best Regards > > > >Carlos Guzm=E1n =C1lvarez > >Vigo-Espa=F1a > > I'm sorry, but I can't reproduce this behaviour. I just fetched the > latest CVS-tree and everything concerning DATE and DATETIME > works fine... > > > > > ------------------------------------------------------- > This sf.net email is sponsored by:ThinkGeek > Oh, it's good to be a geek. > http://thinkgeek.com/sf > _______________________________________________ > Firebird-odbc-devel mailing list > Fir...@li... > https://lists.sourceforge.net/lists/listinfo/firebird-odbc-devel > |
From: Carlos G. Á. <car...@ho...> - 2002-07-08 10:31:11
|
Hello: The changes are for OdbcStatement::sqlColAttributte not for OdbcStatement::sqlColAttributtes.... :)) Best regards Carlos Guzman Alvarez Vigo-España |