?? qsql_psql.cpp
字號:
if ( val.at( i ) == backslash ) { if ( val.at( i + 1 ).isDigit() ) { ba[ index++ ] = (char)(val.mid( i + 1, 3 ).toInt( 0, 8 )); i += 4; } else { ba[ index++ ] = val.at( i + 1 ); i += 2; } } else { ba[ index++ ] = val.at( i++ ).unicode(); } } ba.resize( index ); return QVariant( ba ); } QByteArray ba; ((QSqlDriver*)driver())->beginTransaction(); Oid oid = val.toInt(); int fd = lo_open( d->connection, oid, INV_READ );#ifdef QT_CHECK_RANGE if ( fd < 0) { qWarning( "QPSQLResult::data: unable to open large object for read" ); ((QSqlDriver*)driver())->commitTransaction(); return QVariant( ba ); }#endif int size = 0; int retval = lo_lseek( d->connection, fd, 0L, SEEK_END ); if ( retval >= 0 ) { size = lo_tell( d->connection, fd ); lo_lseek( d->connection, fd, 0L, SEEK_SET ); } if ( size == 0 ) { lo_close( d->connection, fd ); ((QSqlDriver*)driver())->commitTransaction(); return QVariant( ba ); } char * buf = new char[ size ];#ifdef Q_OS_WIN32 // ### For some reason lo_read() fails if we try to read more than // ### 32760 bytes char * p = buf; int nread = 0; while( size < nread ){ retval = lo_read( d->connection, fd, p, 32760 ); nread += retval; p += retval; }#else retval = lo_read( d->connection, fd, buf, size );#endif if (retval < 0) { qWarning( "QPSQLResult::data: unable to read large object" ); } else { ba.duplicate( buf, size ); } delete [] buf; lo_close( d->connection, fd ); ((QSqlDriver*)driver())->commitTransaction(); return QVariant( ba ); } default: case QVariant::Invalid:#ifdef QT_CHECK_RANGE qWarning("QPSQLResult::data: unknown data type");#endif ; } return QVariant();}bool QPSQLResult::isNull( int field ){ PQgetvalue( d->result, at(), field ); return PQgetisnull( d->result, at(), field );}bool QPSQLResult::reset ( const QString& query ){ cleanup(); if ( !driver() ) return FALSE; if ( !driver()->isOpen() || driver()->isOpenError() ) return FALSE; setActive( FALSE ); setAt( QSql::BeforeFirst ); if ( d->result ) PQclear( d->result ); if ( d->isUtf8 ) { d->result = PQexec( d->connection, query.utf8().data() ); } else { d->result = PQexec( d->connection, query.local8Bit().data() ); } int status = PQresultStatus( d->result ); if ( status == PGRES_COMMAND_OK || status == PGRES_TUPLES_OK ) { if ( status == PGRES_TUPLES_OK ) { setSelect( TRUE ); currentSize = PQntuples( d->result ); } else { setSelect( FALSE ); currentSize = -1; } setActive( TRUE ); return TRUE; } setLastError( qMakeError( "Unable to create query", QSqlError::Statement, d ) ); return FALSE;}int QPSQLResult::size(){ return currentSize;}int QPSQLResult::numRowsAffected(){ return QString( PQcmdTuples( d->result ) ).toInt();}///////////////////////////////////////////////////////////////////static bool setEncodingUtf8( PGconn* connection ){ PGresult* result = PQexec( connection, "SET CLIENT_ENCODING TO 'UNICODE'" ); int status = PQresultStatus( result ); PQclear( result ); return status == PGRES_COMMAND_OK;}static void setDatestyle( PGconn* connection ){ PGresult* result = PQexec( connection, "SET DATESTYLE TO 'ISO'" );#ifdef QT_CHECK_RANGE int status = PQresultStatus( result ); if ( status != PGRES_COMMAND_OK ) qWarning( "%s", PQerrorMessage( connection ) );#endif PQclear( result );}static QPSQLDriver::Protocol getPSQLVersion( PGconn* connection ){ PGresult* result = PQexec( connection, "select version()" ); int status = PQresultStatus( result ); if ( status == PGRES_COMMAND_OK || status == PGRES_TUPLES_OK ) { QString val( PQgetvalue( result, 0, 0 ) ); PQclear( result ); QRegExp rx( "(\\d+)\\.(\\d+)" ); rx.setMinimal ( TRUE ); // enforce non-greedy RegExp if ( rx.search( val ) != -1 ) { int vMaj = rx.cap( 1 ).toInt(); int vMin = rx.cap( 2 ).toInt(); if ( vMaj < 6 ) {#ifdef QT_CHECK_RANGE qWarning( "This version of PostgreSQL is not supported and may not work." );#endif return QPSQLDriver::Version6; } if ( vMaj == 6 ) { return QPSQLDriver::Version6; } else if ( vMaj == 7 ) { if ( vMin < 1 ) return QPSQLDriver::Version7; else if ( vMin < 3 ) return QPSQLDriver::Version71; } return QPSQLDriver::Version73; } } else {#ifdef QT_CHECK_RANGE qWarning( "This version of PostgreSQL is not supported and may not work." );#endif } return QPSQLDriver::Version6;}QPSQLDriver::QPSQLDriver( QObject * parent, const char * name ) : QSqlDriver(parent,name ? name : "QPSQL"), pro( QPSQLDriver::Version6 ){ init();}QPSQLDriver::QPSQLDriver( PGconn * conn, QObject * parent, const char * name ) : QSqlDriver(parent,name ? name : "QPSQL"), pro( QPSQLDriver::Version6 ){ init(); d->connection = conn; if ( conn ) { pro = getPSQLVersion( d->connection ); setOpen( TRUE ); setOpenError( FALSE ); }}void QPSQLDriver::init(){ qSqlDriverExtDict()->insert( this, new QPSQLDriverExtension(this) ); qSqlOpenExtDict()->insert( this, new QPSQLOpenExtension(this) ); d = new QPSQLPrivate();}QPSQLDriver::~QPSQLDriver(){ if ( d->connection ) PQfinish( d->connection ); delete d; if ( !qSqlDriverExtDict()->isEmpty() ) { QSqlDriverExtension *ext = qSqlDriverExtDict()->take( this ); delete ext; } if ( !qSqlOpenExtDict()->isEmpty() ) { QSqlOpenExtension *ext = qSqlOpenExtDict()->take( this ); delete ext; }}PGconn* QPSQLDriver::connection(){ return d->connection;}bool QPSQLDriver::hasFeature( DriverFeature f ) const{ switch ( f ) { case Transactions: return TRUE; case QuerySize: return TRUE; case BLOB: return pro >= QPSQLDriver::Version71; case Unicode: return d->isUtf8; default: return FALSE; }}bool QPSQLDriver::open( const QString&, const QString&, const QString&, const QString&, int ){ qWarning("QPSQLDriver::open(): This version of open() is no longer supported." ); return FALSE;}bool QPSQLDriver::open( const QString & db, const QString & user, const QString & password, const QString & host, int port, const QString& connOpts ){ if ( isOpen() ) close(); QString connectString; if ( host.length() ) connectString.append( "host=" ).append( host ); if ( db.length() ) connectString.append( " dbname=" ).append( db ); if ( user.length() ) connectString.append( " user=" ).append( user ); if ( password.length() ) connectString.append( " password=" ).append( password ); if ( port > -1 ) connectString.append( " port=" ).append( QString::number( port ) ); // add any connect options - the server will handle error detection if ( !connOpts.isEmpty() ) connectString += " " + QStringList::split( ';', connOpts ).join( " " ); d->connection = PQconnectdb( connectString.local8Bit().data() ); if ( PQstatus( d->connection ) == CONNECTION_BAD ) { setLastError( qMakeError("Unable to connect", QSqlError::Connection, d ) ); setOpenError( TRUE ); return FALSE; } pro = getPSQLVersion( d->connection ); d->isUtf8 = setEncodingUtf8( d->connection ); setDatestyle( d->connection ); setOpen( TRUE ); setOpenError( FALSE ); return TRUE;}void QPSQLDriver::close(){ if ( isOpen() ) { if (d->connection) PQfinish( d->connection ); d->connection = 0; setOpen( FALSE ); setOpenError( FALSE ); }}QSqlQuery QPSQLDriver::createQuery() const{ return QSqlQuery( new QPSQLResult( this, d ) );}bool QPSQLDriver::beginTransaction(){ if ( !isOpen() ) {#ifdef QT_CHECK_RANGE qWarning( "QPSQLDriver::beginTransaction: Database not open" );#endif return FALSE; } PGresult* res = PQexec( d->connection, "BEGIN" ); if ( !res || PQresultStatus( res ) != PGRES_COMMAND_OK ) { PQclear( res ); setLastError( qMakeError( "Could not begin transaction", QSqlError::Transaction, d ) ); return FALSE; } PQclear( res ); return TRUE;}bool QPSQLDriver::commitTransaction(){ if ( !isOpen() ) {#ifdef QT_CHECK_RANGE qWarning( "QPSQLDriver::commitTransaction: Database not open" );#endif return FALSE; } PGresult* res = PQexec( d->connection, "COMMIT" ); if ( !res || PQresultStatus( res ) != PGRES_COMMAND_OK ) { PQclear( res ); setLastError( qMakeError( "Could not commit transaction", QSqlError::Transaction, d ) ); return FALSE; } PQclear( res ); return TRUE;}bool QPSQLDriver::rollbackTransaction(){ if ( !isOpen() ) {#ifdef QT_CHECK_RANGE qWarning( "QPSQLDriver::rollbackTransaction: Database not open" );#endif return FALSE; } PGresult* res = PQexec( d->connection, "ROLLBACK" ); if ( !res || PQresultStatus( res ) != PGRES_COMMAND_OK ) { setLastError( qMakeError( "Could not rollback transaction", QSqlError::Transaction, d ) ); PQclear( res ); return FALSE; } PQclear( res ); return TRUE;}QStringList QPSQLDriver::tables( const QString& typeName ) const{ QStringList tl;
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -