⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 podbc.cxx

📁 sloedgy open sip stack source code
💻 CXX
📖 第 1 页 / 共 3 页
字号:
/*
 * podbc.cxx
 *
 * Virteos ODBC Implementation for PWLib Library.
 *
 * Virteos is a Trade Mark of ISVO (Asia) Pte Ltd.
 *
 * Copyright (c) 2004 ISVO (Asia) Pte Ltd. All Rights Reserved.
 *
 * The contents of this file are subject to the Mozilla 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.mozilla.org/MPL/
 *
 * 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 is derived from and used in conjunction with the 
 * pwlib Libaray of the OpenH323 Project (www.openh323.org/)
 *
 * The Initial Developer of the Original Code is ISVO (Asia) Pte Ltd.
 *
 *	 Portions: Simple ODBC Wrapper Article www.codeproject.com
 *
 * Contributor(s): ______________________________________.
 *
 * $Log: podbc.cxx,v $
 * Revision 1.1  2006/06/29 04:18:40  joegenbaclor
 * *** empty log message ***
 *
 * Revision 1.1  2006/01/27 06:38:11  shorne
 * Rename ODBC file to lower case
 *
 * Revision 1.3  2005/11/30 12:47:42  csoutheren
 * Removed tabs, reformatted some code, and changed tags for Doxygen
 *
 * Revision 1.2  2005/08/09 09:08:12  rjongbloed
 * Merged new video code from branch back to the trunk.
 *
 * Revision 1.1.2.1  2005/04/25 13:09:49  shorne
 * Initial version
 *
 *
*/

#include <ptlib.h>
#include <ptlib/msos/ptlib/podbc.h>

#pragma warning(disable:4244)
#pragma warning(disable:4100)

//// Utilities
//////////////////////////////////////////////////////////////////

static void AddField(PODBC::Field & newField, const PString FieldName, 
							PODBC::FieldTypes odbctype, PODBC::PwType pwtype)
{
  if (newField.Name.GetLength() == 0)   /// If not already set..
  {
	newField.ODBCType = odbctype;
	newField.Name = FieldName;
	newField.Type = pwtype;
  }
}

/// Simple converters
///////////////////////////////////////////////////////////////////////////////////////
/// To Bound Data

static void Convert(long int & data, PString field)
{
	data = field.AsInteger();
}

static void Convert(short int & data, PString field)
{
	data = field.AsInteger();
}

static void Convert(unsigned char * data, PString field)
{
    data = (unsigned char *)(const char *)field;
}


static void Convert(unsigned char & data, PString field)
{
	int f = field.AsInteger();
	data = (unsigned char)f;
}


static void Convert(_int64 & data, PString field)
{
	data = field.AsInt64();
}

static void Convert(double & data, PString field,int Precision = PODBCRecord::Precision)
{
	/// Reformat to the Required Decimal places
	data = PString(PString::Decimal,field.AsReal(),Precision).AsReal();
}

static void Convert(DATE_STRUCT & data, PString field)
{
	PTime t = PTime(field);

	data.day = t.GetDay();
	data.month = t.GetMonth();
	data.year = t.GetYear();
}

static void Convert(TIME_STRUCT & data, PString field)
{
	PTime t = PTime(field);

	data.second = t.GetSecond();
	data.minute = t.GetMinute();
	data.hour = t.GetHour();
}
			   		
static void Convert(TIMESTAMP_STRUCT & data, PString field)
{
	PTime t = PTime(field);

	data.day = t.GetDay();
	data.month = t.GetMonth();
	data.year = t.GetYear();
	data.second = t.GetSecond();
	data.minute = t.GetMinute();
	data.hour = t.GetHour();
}

static void Convert(SQLGUID & data, PString field)
{
// Yet To Be Implemented.
	field = PString();
}


/// To PString
///////////////////////////////////////////////////////////////////////////////////////
template <typename SQLField>
static PString Convert(SQLField field)
{
	return PString(field);
}

static PString Convert(double field,int Precision = PODBCRecord::Precision)
{
	return PString(PString::Decimal,field,Precision);
}

static PString Convert(unsigned char * field)
{
	return PString(*field);
}

static PString Convert(DATE_STRUCT date)
{
	return PTime(0,0,0,date.day,date.month,date.year).AsString(PODBCRecord::TimeFormat);
}

static PString Convert(TIME_STRUCT time)
{
	return PTime(time.second,time.minute,time.hour,0,0,0).AsString(PODBCRecord::TimeFormat);
}
			   		
static PString Convert(TIMESTAMP_STRUCT	timestamp)
{
	return PTime(timestamp.second,timestamp.minute,
		timestamp.hour,timestamp.day,timestamp.month,timestamp.year).AsString(PODBCRecord::TimeFormat);
}

static PString Convert(SQLGUID guid)
{
// To Be Implemented.
	return PString();
}


///PODBC
/////////////////////////////////////////////////////////////////


PODBC::PODBC()
{
	m_hDBC              = NULL;
	m_hEnv              = NULL;
	m_nReturn           = SQL_ERROR;
}

PODBC::~PODBC()
{
   if( m_hDBC != NULL ) {
    m_nReturn = SQLFreeHandle( SQL_HANDLE_DBC,  m_hDBC );
   }
   if( m_hEnv!=NULL )
    m_nReturn = SQLFreeHandle( SQL_HANDLE_ENV, m_hEnv );
}


BOOL PODBC::Connect(LPCTSTR svSource)
{
   int nConnect = SQLAllocHandle( SQL_HANDLE_ENV, SQL_NULL_HANDLE, &m_hEnv );
   if( nConnect == SQL_SUCCESS || nConnect == SQL_SUCCESS_WITH_INFO ) {
    nConnect = SQLSetEnvAttr( m_hEnv, 
                      SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, 0 );
    if( nConnect == SQL_SUCCESS || nConnect == SQL_SUCCESS_WITH_INFO ) {
     nConnect = SQLAllocHandle( SQL_HANDLE_DBC, m_hEnv, &m_hDBC );
     if( nConnect == SQL_SUCCESS || nConnect == SQL_SUCCESS_WITH_INFO ) {
      SQLSetConnectOption( m_hDBC,SQL_LOGIN_TIMEOUT,5 );                
      short shortResult = 0;
      SQLTCHAR szOutConnectString[ 1024 ];
      nConnect = SQLDriverConnect( m_hDBC,	// Connection Handle
          NULL,                           // Window Handle
          (SQLTCHAR*)svSource,			  // InConnectionString
          _tcslen(svSource),              // StringLength1
          szOutConnectString,             // OutConnectionString
          sizeof( szOutConnectString ),   // Buffer length
          &shortResult,                   // StringLength2Ptr
          SQL_DRIVER_NOPROMPT );          // no User prompt
      return ((nConnect == SQL_SUCCESS) || (nConnect == SQL_SUCCESS_WITH_INFO));
     }
    }
   }
   if( m_hDBC != NULL ) {
    m_nReturn = SQLDisconnect( m_hDBC );
    m_nReturn = SQLFreeHandle( SQL_HANDLE_DBC,  m_hDBC );
   }
   if( m_hEnv!=NULL )
    m_nReturn = SQLFreeHandle( SQL_HANDLE_ENV, m_hEnv );
   m_hDBC              = NULL;
   m_hEnv              = NULL;
   m_nReturn           = SQL_ERROR;
   return ((m_nReturn == SQL_SUCCESS) || (m_nReturn == SQL_SUCCESS_WITH_INFO));
}


void PODBC::Disconnect()
  {
   if( m_hDBC != NULL )
   {
    m_nReturn = SQLDisconnect( m_hDBC );
    m_hDBC = NULL;
   }
}


//--

BOOL PODBC::Connect_MSSQL(PString User,PString Pass, 
         PString Host,BOOL Trusted, 
         MSSQLProtocols Proto)
{  
	PString Network = PString();

        switch(Proto) {
	   case MSSQLNamedPipes:
		Network ="dbnmpntw";
		break;
	   case MSSQLWinSock:
		Network ="dbmssocn";
		break;
	   case MSSQLIPX:
		Network = "dbmsspxn";
		break;
	   case MSSQLBanyan:
		Network = "dbmsvinn";
		break;
	   case MSSQLRPC:
		Network = "dbmsrpcn";
		break;
	   default:
		Network = "dbmssocn";
		break;
	 }

	PString ConStr = "Driver={SQL Server};Server=" + Host + ";Uid=" + User + ";Pwd=" +
		 Pass +";Trusted_Connection=" + (Trusted ? "Yes" : "No") + ";Network=" + Network + ";";

   return PODBC::Connect(ConStr);
}


 //--
BOOL PODBC::Connect_DB2(PFilePath DBPath)
{
   PString ConStr ="Driver={Microsoft dBASE Driver (*.dbf)};DriverID=277;Dbq=" + DBPath + ";";
   return PODBC::Connect(ConStr);
}

 //--
BOOL PODBC::Connect_XLS(PFilePath XLSPath,PString DefDir)
{
   PString ConStr = "Driver={Microsoft Excel Driver (*.xls)};DriverId=790;bq="+ XLSPath 
						+ ";DefaultDir=" + DefDir + ";";
   return PODBC::Connect(ConStr);
}

 //--
BOOL PODBC::Connect_TXT(PFilePath TXTPath)
{
   PString ConStr = "Driver={Microsoft Text Driver (*.txt; *.csv)};Dbq="+ TXTPath 
						+ ";Extensions=asc,csv,tab,txt;";

   return PODBC::Connect(ConStr);
}

 //--
BOOL PODBC::Connect_FOX(PFilePath DBPath,PString User,
          PString Pass,PString Type,
          BOOL Exclusive)
{
   PString ConStr = "Driver={Microsoft Visual Foxpro Driver};Uid=" + User + ";Pwd=" + Pass 
				+";SourceDB=" + DBPath + ";SourceType=" + Type + ";Exclusive=" + (Exclusive ? "yes": "no") + ";";
   
   return PODBC::Connect(ConStr);
}

 //--
BOOL PODBC::Connect_MDB(PFilePath MDBPath,PString User,
            PString Pass,BOOL Exclusive)
{
   PString ConStr = "Driver={Microsoft Access Driver (*.mdb)};Dbq=" + MDBPath + ";Uid=" + User +
	   ";Pwd=" + Pass + ";Exclusive=" + (Exclusive ? "yes" : "no");

   return PODBC::Connect(ConStr);
}

 //--
BOOL PODBC::Connect_PDOX(PDirectory DBPath,PDirectory DefaultDir,int version)
{
   PString driver = "3.X";
  if (version == 4) 
    driver = "4.X";
  if (version > 4) 
    driver = "5.X";

   PString ConStr = "Driver={Microsoft Paradox Driver (*.db )};DriverID=538;Fil=Paradox " + 
						 driver + ";DefaultDir=" + DefaultDir +
						 "\\;Dbq=" + DBPath + "\\;CollatingSequence=ASCII;";

   return PODBC::Connect(ConStr);
}

 //--
BOOL PODBC::Connect_DBASE(PDirectory DBPath)
{
   PString ConStr = "Driver={Microsoft dBASE Driver (*.dbf)};DriverID=277;Dbq=" + DBPath + ";";
   return PODBC::Connect(ConStr);
}
 //--
BOOL PODBC::Connect_Oracle(PString Server,PString User, PString Pass)
{
  PString ConStr = "Driver={Microsoft ODBC for Oracle};Server=" + Server + 
					";Uid=" + User + ";Pwd=" + Pass + ";";

  return PODBC::Connect(ConStr);
}

 //--
BOOL PODBC::Connect_mySQL(PString User,PString Pass,PString Host, int Port,int Option)
{
   PString ConStr = "Driver={MySQL ODBC 3.51 Driver};Uid=" + User + ";Pwd=" + Pass
				 + ";Server=" + Host + ";Port=" + PString(Port) + ";";

   return PODBC::Connect(ConStr);
}

BOOL PODBC::ConnectDB_mySQL(PString DB,PString User,PString Pass,PString Host, int Port,int Option)
{
   PString ConStr = "Driver={MySQL ODBC 3.51 Driver};Database=" + DB + ";Uid=" + User
					+ ";Pwd=" + Pass +";Server=" + Host + ";Port=" + PString(Port) + ";";

   return PODBC::Connect(ConStr);
}

BOOL PODBC::Connect_postgreSQL(PString DB,PString User,
        PString Pass,PString Host, int Port,int Option)
{
   PString ConStr = "Driver={PostgreSQL};Database=" + DB + ";Uid=" + User
					+ ";Pwd=" + Pass +";Server=" + Host + ";Port=" + PString(Port) + ";";

   return PODBC::Connect(ConStr);
}

 //--
BOOL PODBC::DataSource(DataSources Source, ConnectData Data)
{
   dbase = Source;

   switch (Source)
   {
     case PODBC::mySQL:
       if (Data.Host.GetLength() == 0) 
         Data.Host = "localhost";
       if (Data.Port == 0) 
         Data.Port = 3306;
       if (Data.DefDir.GetLength() == 0) {
         return Connect_mySQL(Data.User,Data.Pass,Data.Host,Data.Port,Data.opt);
        } else {
          return ConnectDB_mySQL(Data.DefDir,Data.User,Data.Pass,Data.Host,Data.Port,Data.opt);
        }
     case PODBC::MSSQL:
       if (Data.Host.GetLength() == 0) 
         Data.Host = "(local)";
         return Connect_MSSQL(Data.User,Data.Pass,Data.Host,Data.Excl_Trust, (MSSQLProtocols)Data.opt);
     case PODBC::Oracle:
         return Connect_Oracle(Data.Host,Data.User, Data.Pass);
     case PODBC::IBM_DB2:
         return Connect_DB2(Data.DBPath);
     case PODBC::DBASE:
         return Connect_DBASE(Data.DBPath);
     case PODBC::Paradox:
         return Connect_PDOX(Data.DBPath,Data.DefDir,Data.opt);
     case PODBC::Excel:
         return Connect_XLS(Data.DBPath,Data.DefDir);
     case PODBC::Ascii:
         return Connect_TXT(Data.DBPath);
     case PODBC::Foxpro:
         return Connect_FOX(Data.DBPath,Data.User,Data.Pass,"DBF",Data.Excl_Trust);
     case PODBC::MSAccess:
         return Connect_MDB(Data.DBPath,Data.User,Data.Pass,Data.Excl_Trust);
     case PODBC::postgreSQL:
         return Connect_postgreSQL(Data.User,Data.Pass,Data.Host,Data.Port,Data.opt);
   };

	return FALSE;
}

PStringArray PODBC::TableList(PString option)
{
    PODBCStmt data(this);
	return data.TableList(option);
}

PODBC::Table PODBC::LoadTable(PString table)
{
  PODBC::Table newTable(this,table);
  return newTable;
}

BOOL PODBC::Query(PString Query)
{
  if (m_hDBC == NULL)
	  return FALSE;

   PODBCStmt stmt(this);
	return stmt.Query(Query);
}

void PODBC::SetPrecision(int Digit)
{
	PODBCRecord::Precision = Digit;
}

void PODBC::SetTimeFormat(PTime::TimeFormat tformat)
{
	PODBCRecord::TimeFormat = tformat;
}

BOOL PODBC::NeedLongDataLen()
{
  
  PString  f;

  SQLGetInfo(m_hDBC,SQL_NEED_LONG_DATA_LEN,
   f.GetPointer(2),2, NULL);

	if (f == "N")   
		  return FALSE;
	else                                 
		  return TRUE;
}
/////////////////////////////////////////////////////////////////////////////
// PODBC::Field

PString PODBC::Field::AsString()
{
Bind & b = Data;	   /// Bound Buffer container		
BOOL B = isReadOnly;   /// ReadOnly Columns are not Buffer Bound and have to get Data;
SQLINTEGER len = MAX_DATA_LEN;   

     switch (ODBCType) {
      case PODBC::BigInt:
        if (B) 
          SQLGetData(*row->rec->Stmt,col,ODBCType,&b.sbint,0,&b.dataLen);
          return Convert(b.sbint);

      case PODBC::TinyInt:
      case PODBC::Bit:
        if (B) 
          SQLGetData(*row->rec->Stmt,col,ODBCType,&b.sbit,0,&b.dataLen);
          return Convert(b.sbit);				
	
      case PODBC::Char:
        if (B) 
          SQLGetData(*row->rec->Stmt,col,ODBCType,&b.suchar,0,&b.dataLen);
          return Convert(b.suchar);		

      case PODBC::Integer:
        if (B) 
          SQLGetData(*row->rec->Stmt,col,ODBCType,&b.slint,0,&b.dataLen);
          return Convert(b.slint);
				
      case PODBC::SmallInt:
        if (B) 
          SQLGetData(*row->rec->Stmt,col,ODBCType,&b.ssint,0,&b.dataLen);
          return Convert(b.ssint);

      case PODBC::Numeric:
      case PODBC::Decimal:
      case PODBC::Float:
      case PODBC::Real:
      case PODBC::Double:
        if (B) 
          SQLGetData(*row->rec->Stmt,col,ODBCType,&b.sdoub,0,&b.dataLen);
          return Convert(b.sdoub,Decimals);

      /// Date Times
      case PODBC::Date: 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -