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

📄 qsql_psql.cpp

📁 qt专门用于嵌入式的图形开发GUI
💻 CPP
📖 第 1 页 / 共 3 页
字号:
			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;    if ( !isOpen() )	return tl;    int type = typeName.toInt();    QSqlQuery t = createQuery();    t.setForwardOnly( TRUE );

⌨️ 快捷键说明

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