podbc.h

Go to the documentation of this file.
00001 /*
00002  * podbc.h
00003  *
00004  * Virteos ODBC Implementation for PWLib Library.
00005  *
00006  * Virteos is a Trade Mark of ISVO (Asia) Pte Ltd.
00007  *
00008  * Copyright (c) 2005 ISVO (Asia) Pte Ltd. All Rights Reserved.
00009  *
00010  * The contents of this file are subject to the Mozilla Public License
00011  * Version 1.0 (the "License"); you may not use this file except in
00012  * compliance with the License. You may obtain a copy of the License at
00013  * http://www.mozilla.org/MPL/
00014  *
00015  * Software distributed under the License is distributed on an "AS IS"
00016  * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
00017  * the License for the specific language governing rights and limitations
00018  * under the License.
00019  *
00020  *
00021  * The Original Code is derived from and used in conjunction with the 
00022  * pwlib Libaray of the OpenH323 Project (www.openh323.org/)
00023  *
00024  * The Initial Developer of the Original Code is ISVO (Asia) Pte Ltd.
00025  *
00026  *   Portions: Simple ODBC Wrapper Article www.codeproject.com
00027  *
00028  * Contributor(s): ______________________________________.
00029  *
00030  * $Revision: 22250 $
00031  * $Author: rjongbloed $
00032  * $Date: 2009-03-22 23:04:50 -0500 (Sun, 22 Mar 2009) $
00033  */
00034 
00088 //--
00089 
00090 #ifndef PTLIB_PODBC_H
00091 #define PTLIB_PODBC_H
00092 
00093 #if _MSC_VER > 1000
00094 #pragma once
00095 #endif // _MSC_VER > 1000
00096 
00097 
00098 #if defined(P_ODBC) && !defined(_WIN32_WCE)
00099 
00100 #include <odbcinst.h>
00101 #include <sql.h> 
00102 #include <sqlext.h>
00103 
00104 #ifdef _MSC_VER
00105  #include <tchar.h>
00106  #pragma comment(lib,"odbc32.lib")
00107  #pragma comment(lib,"odbcCP32.lib")
00108 #else
00109 
00110   #ifdef UNICODE
00111   typedef WCHAR                 TCHAR;
00112   typedef LPWSTR                LPTSTR;
00113   typedef LPCWSTR               LPCTSTR;
00114   // Needs a definition one day ... #define _T(x)
00115   #else
00116   typedef CHAR                  TCHAR;
00117   typedef LPSTR                 LPTSTR;
00118   typedef LPCSTR                LPCTSTR;
00119   #define _T(x) x
00120   #endif
00121 
00122 #endif // _MSC_VER
00123 
00124 // Max SQL String Data Length
00125 #define MAX_DATA_LEN 1024
00126 
00134 class PODBC;
00135 class PODBCRecord;
00136 
00137 
00138 class PODBCStmt : public PObject
00139 {
00140     PCLASSINFO(PODBCStmt, PObject);
00141 
00142   public:
00148     PODBCStmt(PODBC * odbc);
00149 
00154     ~PODBCStmt();
00156 
00161     operator HSTMT() { return m_hStmt; };
00163 
00164 
00170     PBoolean IsValid();
00171 
00175     DWORD GetChangedRowCount(void);
00176 
00181     PBoolean Query(PString strSQL);
00183 
00188     PBoolean Fetch();
00189 
00193     PBoolean FetchRow(PINDEX nRow,PBoolean Absolute=1);
00194 
00197     PBoolean FetchPrevious();
00198 
00201     PBoolean FetchNext();
00202 
00205     PBoolean FetchFirst();
00206 
00209     PBoolean FetchLast();
00210 
00213     PBoolean Cancel();
00215 
00223     PStringArray TableList(PString option = "");
00224 
00225 
00230     PBoolean SQL_OK(SQLRETURN res);
00231 
00235     void GetLastError();
00236 
00237     PODBC * GetLink() const { return odbclink; }
00238     int GetDBase() const { return dbase; }
00240 
00241   protected:
00242     HSTMT   m_hStmt;
00243     PODBC * odbclink; 
00244     int     dbase;    
00245 };
00246 
00247 
00248 
00259 class PODBC  : public PObject
00260 {
00261     PCLASSINFO(PODBC, PObject);
00262 
00263   public:
00268     PODBC();
00269 
00272     ~PODBC();
00274 
00283     enum FieldTypes
00284     {
00285       LongVarChar   =-1,   
00286       Binary        =-2,
00287       VarBinary     =-3,
00288       LongVarBinary =-4,
00289       BigInt        =-5,
00290       TinyInt       =-6,
00291       Bit           =-7,   
00292       Guid          =-11,
00293       Unknown       = 0,
00294       Char          = 1,
00295       Numeric       = 2,
00296       Decimal       = 3,
00297       Integer       = 4,
00298       SmallInt      = 5,
00299       Float         = 6,
00300       Real          = 7,
00301       Double        = 8,
00302       DateTime      = 9,
00303       VarChar       =12,    
00304       Date          =91,    
00305       Time          =92,    
00306       TimeStamp     =93     
00307     };
00308 
00314     enum PwType
00315     { 
00316       oPString,   // String Value
00317       oBOOL,      // Boolean 
00318       ochar,      // Character
00319       oshort,     // Short  
00320       oint,       // Integer  use .AsInteger()
00321       olong,      // long    
00322       odouble,    // Double   use .AsReal()
00323       oPBYTEArray,// Binary Data
00324       oPInt64,    // BigInt  use .AsInt64()
00325       oPTime,     // Time    use  PTime( "Value" ) 
00326       oPGUID      // GUID    use  PGUID( "Value" ) To Be Implemented...?
00327     };
00328 
00333     enum DataSources
00334     {
00335       mySQL,      
00336       MSSQL,      
00337       Oracle,      
00338       IBM_DB2,
00339       DBASE,
00340       Paradox,
00341       Excel,
00342       Ascii,
00343       Foxpro,
00344       MSAccess,
00345       postgreSQL
00346     };
00347 
00350     enum MSSQLProtocols
00351     {
00352       MSSQLNamedPipes,
00353       MSSQLWinSock,
00354       MSSQLIPX,
00355       MSSQLBanyan,
00356       MSSQLRPC
00357     };
00358 
00360 
00370     class ConnectData
00371     {
00372     public:
00373       PFilePath DBPath;    
00374       PString DefDir;     
00375       PString User;       
00376       PString Pass;       
00377       PBoolean Excl_Trust;     
00378       PString Host;       
00379       int Port;         
00380       int opt;         
00381     };
00383 
00384 
00389     class Row;
00390     class Field : public PObject
00391     {
00392         PCLASSINFO(Field, PObject);
00393       public:
00394 
00400         class Bind
00401         {
00402           public:
00403             PString          sbin;      
00404             PString          sbinlong;  
00405             short int        ssint;     
00406             long int         slint;     
00407             double           sdoub;     
00408             unsigned char    sbit;      
00409             unsigned char *  suchar;    
00410             PInt64           sbint;     
00411             DATE_STRUCT      date;      
00412             TIME_STRUCT      time;      
00413             TIMESTAMP_STRUCT timestamp; 
00414             SQLGUID          guid;      
00415             SQLLEN           dataLen;   
00416         };
00417 
00420         PBoolean Post();
00421 
00424         PString operator=(const PString & str);
00425 
00428         PString AsString();  
00429 
00433         void SetValue(PString value);  
00434 
00437         void SetDefaultValues();
00438 
00442         PBoolean DataFragment(PString & Buffer ,PINDEX & fragment, SQLINTEGER & size);
00443 
00446 
00447         Bind  Data;       
00448         PwType  Type;       
00449         FieldTypes ODBCType;   
00450 
00452         PString Name;       
00453         PINDEX col;       
00454 
00456         PBoolean isReadOnly;     
00457         PBoolean isNullable;     
00458         PBoolean isAutoInc;     
00459         int Decimals;       
00460         PBoolean LongData;     
00461 
00463         Row * row;       
00464     };
00466 
00467 
00476     class Row : public PObject
00477     {
00478       public:
00479 
00485         Row(PODBCStmt * stmt);
00486 
00490         Field & Column(PINDEX col);
00491 
00494         Field & Column(PString name);
00495 
00498         PStringArray ColumnNames();
00499 
00502         PINDEX Columns();
00503 
00506         PINDEX Rows();
00507 
00510         Field & operator[] (PINDEX col);
00511 
00514         Field & operator[] (PString col);
00515 
00518         PBoolean Navigate(PINDEX row);
00519 
00522         void SetNewRow();
00523 
00530         PBoolean Post();
00531 
00535         PBoolean Delete(PINDEX row =0);
00536 
00537         PODBCRecord * rec;      
00538 
00539         PINDEX CurRow;          
00540         PBoolean NewRow;        
00541         PINDEX RowCount;      
00542 
00543       protected:
00544         PArray<Field> Fields;    
00545     };
00547 
00553     class Table : public PObject
00554     {
00555       public:
00556 
00563         Table(PODBC * odbc, PString Query);
00564 
00567         ~Table();
00569 
00574         Row NewRow();
00575 
00578         PBoolean DeleteRow(PINDEX row = 0);
00579 
00582         PBoolean Post();
00584 
00589         PINDEX Rows();
00590 
00593         PINDEX Columns();
00594 
00597         PStringArray ColumnNames();
00598 
00603         Row & RecordHandler();
00604 
00607         Row & operator[] (PINDEX row);
00608 
00613         Field & operator() (PINDEX row, PINDEX col);
00614 
00618         Field & Column(PINDEX col);
00619 
00622         Field & Column(PString Name);
00624 
00625       protected:
00626         PODBCStmt stmt;      
00627         PString tableName;    
00628         Row * RowHandler;      
00629     };
00630 
00639     Table LoadTable(PString table);
00640 
00646     PBoolean Query(PString Query);
00648 
00649 
00659     PBoolean DataSource(DataSources Source, ConnectData Data);
00660 
00665     virtual PBoolean Connect(LPCTSTR svSource);
00666 
00669     PBoolean Connect_DB2(PFilePath DBPath);
00670 
00673     PBoolean Connect_XLS(PFilePath XLSPath,PString DefDir = "");
00674 
00677     PBoolean Connect_TXT(PFilePath TXTPath);
00678 
00681     PBoolean Connect_FOX(PFilePath DBPath,PString User = "",
00682       PString Pass = "",PString Type= "DBF",
00683       PBoolean Exclusive=PFalse);
00684 
00687     PBoolean Connect_MDB(PFilePath MDBPath,PString User ="",
00688       PString Pass = "",PBoolean Exclusive=PFalse);
00689 
00692     PBoolean Connect_PDOX(PDirectory DBPath,PDirectory DefaultDir,
00693       int version =5);
00694 
00697     PBoolean Connect_Oracle(PString Server,PString User="", PString Pass="");
00698 
00701     PBoolean Connect_DBASE(PDirectory DBPath);
00702 
00705     PBoolean Connect_MSSQL(PString User="",PString Pass="", 
00706       PString Host ="(local)",PBoolean Trusted = PTrue, 
00707       MSSQLProtocols Proto=MSSQLNamedPipes);
00708 
00711     PBoolean Connect_mySQL(PString User="",PString Pass="",
00712       PString Host= "localhost",
00713       int Port=3306,int Option=0);
00714 
00717     PBoolean ConnectDB_mySQL(PString DB,PString User="",
00718       PString Pass="",PString Host= "localhost",
00719       int Port=3306,int Option=0);
00720 
00723     PBoolean Connect_postgreSQL(PString DB,PString User,
00724       PString Pass,PString Host, int Port=5432,int Option=0);
00725 
00728     void Disconnect();
00730 
00737     PStringArray TableList(PString option = "");
00738 
00742     PBoolean NeedLongDataLen();
00743 
00746     virtual void OnSQLError(PString RetCode, PString RetString) {};
00747 
00748 
00755     void SetPrecision(int Digit);
00756 
00759     void SetTimeFormat(PTime::TimeFormat tformat);
00760 
00763     operator HDBC() { return m_hDBC; };
00765 
00766     PODBC::DataSources  dbase; 
00767 
00768   protected:
00769     SQLRETURN       m_nReturn;      // Internal SQL Error code
00770     HENV            m_hEnv;         // Handle to environment
00771     HDBC            m_hDBC;         // Handle to database connection
00772 };
00773 
00774 
00781 class PDSNConnection : public PODBC
00782 {
00783     PCLASSINFO(PDSNConnection, PODBC);
00784 
00785   public:
00788     PDSNConnection();
00789     ~PDSNConnection();
00791 
00798     PBoolean Connect( PString Source ,PString Username, PString Password);
00799 };
00800 
00801 
00802  //--
00809 class PODBCRecord : public PObject
00810 {
00811     PCLASSINFO(PODBCRecord, PObject);
00812 
00813   public:
00818     PODBCRecord(PODBCStmt * hStmt);
00819 
00822     ~PODBCRecord(){};
00824 
00830     void Data(PINDEX Column, PODBC::Field & field);
00831 
00836     PBoolean InternalGetData(
00837       USHORT Column,
00838       LPVOID pBuffer, 
00839       ULONG pBufLen,
00840       SQLINTEGER * dataLen=NULL,
00841       int Type=SQL_C_DEFAULT
00842       );
00843 
00844     /* Get Long Character Data. Long Data fields cannot be bound
00845     and Data must be Got from the RecordSet.
00846     */
00847     PString GetLongData(PINDEX Column);
00848 
00851     PBoolean PostNew(PODBC::Row & rec);
00852 
00855     PBoolean PostUpdate(PODBC::Row & rec);
00856 
00860     PBoolean PostDelete(PINDEX row= 1);
00861 
00864     PBoolean InternalSaveLongData(SQLRETURN nRet,PODBC::Row & rec);
00865 
00868     PBoolean InternalBindColumn(
00869       USHORT Column,LPVOID pBuffer,
00870       ULONG pBufferSize,
00871       LONG * pReturnedBufferSize=NULL,
00872       USHORT nType=SQL_C_TCHAR
00873       );
00875 
00881     PINDEX ColumnByName(PString Column);
00882 
00885     PINDEX ColumnCount();
00886 
00889     PODBC::FieldTypes ColumnType(PINDEX Column );
00890 
00893     DWORD ColumnSize( PINDEX Column );
00894 
00897     DWORD ColumnScale( PINDEX Column );
00898 
00901     PString ColumnName( PINDEX Column);
00902 
00907     unsigned int ColumnPrecision( PINDEX Column );
00908 
00911     PBoolean IsColumnNullable( PINDEX Column );
00912 
00915     PBoolean IsColumnUpdatable( PINDEX Column );
00916 
00919     PBoolean IsColumnAutoIndex( PINDEX Column );
00920 
00922 
00927     static unsigned int Precision;      
00928     static int MaxCharSize;          
00929     static PTime::TimeFormat TimeFormat;
00930 
00931 
00932   protected:
00933     HSTMT m_hStmt;
00934     PODBCStmt * Stmt;          
00935     PODBC::DataSources dbase;      
00936 
00937   friend class PODBC::Field;
00938   friend class PODBC::Row;
00939 };
00940 
00941 #endif // P_ODBC
00942 
00943 #endif // PTLIB_PODBC_H
00944 
00945 
00946 // End Of File ///////////////////////////////////////////////////////////////

Generated on Thu May 27 01:36:48 2010 for PTLib by  doxygen 1.4.7