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

📄 qsql_mysql.cpp

📁 这个是Linux的qt源代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	setOpenError( FALSE );    } else {	qServerInit();    }}void QMYSQLDriver::init(){    qSqlOpenExtDict()->insert( this, new QMYSQLOpenExtension(this) );    d = new QMYSQLDriverPrivate();    d->mysql = 0;}QMYSQLDriver::~QMYSQLDriver(){    delete d;    if ( !qSqlOpenExtDict()->isEmpty() ) {	QSqlOpenExtension *ext = qSqlOpenExtDict()->take( this );	delete ext;    }#ifndef Q_NO_MYSQL_EMBEDDED# if MYSQL_VERSION_ID > 40000    mysql_server_end();# endif#endif}bool QMYSQLDriver::hasFeature( DriverFeature f ) const{    switch ( f ) {    case Transactions:// CLIENT_TRANSACTION should be defined in all recent mysql client libs > 3.23.34#ifdef CLIENT_TRANSACTIONS	if ( d->mysql ) {	    if ( ( d->mysql->server_capabilities & CLIENT_TRANSACTIONS ) == CLIENT_TRANSACTIONS )		return TRUE;	}#endif	return FALSE;    case QuerySize:	return TRUE;    case BLOB:	return TRUE;    case Unicode:	return FALSE;    default:	return FALSE;    }}bool QMYSQLDriver::open( const QString&,			 const QString&,			 const QString&,			 const QString&,			 int ){    qWarning("QMYSQLDriver::open(): This version of open() is no longer supported." );    return FALSE;}bool QMYSQLDriver::open( const QString& db,			 const QString& user,			 const QString& password,			 const QString& host,			 int port,			 const QString& connOpts ){    if ( isOpen() )	close();     unsigned int optionFlags = 0;        QStringList raw = QStringList::split( ';', connOpts );    QStringList opts;    QStringList::ConstIterator it;        // extract the real options from the string    for ( it = raw.begin(); it != raw.end(); ++it ) {	QString tmp( *it );	int idx;	if ( (idx = tmp.find( '=' )) != -1 ) {	    QString val( tmp.mid( idx + 1 ) );	    val.simplifyWhiteSpace();	    if ( val == "TRUE" || val == "1" )		opts << tmp.left( idx );	    else		qWarning( "QMYSQLDriver::open: Illegal connect option value '%s'", tmp.latin1() );	} else {	    opts << tmp;	}    }        for ( it = opts.begin(); it != opts.end(); ++it ) {	QString opt( (*it).upper() );	if ( opt == "CLIENT_COMPRESS" )	    optionFlags |= CLIENT_COMPRESS;	else if ( opt == "CLIENT_FOUND_ROWS" )	    optionFlags |= CLIENT_FOUND_ROWS;	else if ( opt == "CLIENT_IGNORE_SPACE" )	    optionFlags |= CLIENT_IGNORE_SPACE;	else if ( opt == "CLIENT_INTERACTIVE" )	    optionFlags |= CLIENT_INTERACTIVE;	else if ( opt == "CLIENT_NO_SCHEMA" )	    optionFlags |= CLIENT_NO_SCHEMA;	else if ( opt == "CLIENT_ODBC" )	    optionFlags |= CLIENT_ODBC;	else if ( opt == "CLIENT_SSL" )	    optionFlags |= CLIENT_SSL;	else 	    qWarning( "QMYSQLDriver::open: Unknown connect option '%s'", (*it).latin1() );    }    if ( (d->mysql = mysql_init((MYSQL*) 0)) &&	    mysql_real_connect( d->mysql,				host,				user,				password,				db.isNull() ? QString("") : db,				(port > -1) ? port : 0,				NULL,				optionFlags ) )    {	if ( mysql_select_db( d->mysql, db )) {	    setLastError( qMakeError("Unable open database '" + db + "'", QSqlError::Connection, d ) );	    mysql_close( d->mysql );	    setOpenError( TRUE );	    return FALSE;	}    } else {	    setLastError( qMakeError( "Unable to connect", QSqlError::Connection, d ) );	    mysql_close( d->mysql );	    setOpenError( TRUE );	    return FALSE;    }    setOpen( TRUE );    setOpenError( FALSE );    return TRUE;}void QMYSQLDriver::close(){    if ( isOpen() ) {	mysql_close( d->mysql );	setOpen( FALSE );	setOpenError( FALSE );    }}QSqlQuery QMYSQLDriver::createQuery() const{    return QSqlQuery( new QMYSQLResult( this ) );}QStringList QMYSQLDriver::tables( const QString& typeName ) const{    QStringList tl;    if ( !isOpen() )	return tl;    if ( !typeName.isEmpty() && !(typeName.toInt() & (int)QSql::Tables) )	return tl;    MYSQL_RES* tableRes = mysql_list_tables( d->mysql, NULL );    MYSQL_ROW	row;    int i = 0;    while ( tableRes && TRUE ) {	mysql_data_seek( tableRes, i );	row = mysql_fetch_row( tableRes );	if ( !row )	    break;	tl.append( QString(row[0]) );	i++;    }    mysql_free_result( tableRes );    return tl;}QSqlIndex QMYSQLDriver::primaryIndex( const QString& tablename ) const{    QSqlIndex idx;    if ( !isOpen() )	return idx;    QSqlQuery i = createQuery();    QString stmt( "show index from %1;" );    QSqlRecord fil = record( tablename );    i.exec( stmt.arg( tablename ) );    while ( i.isActive() && i.next() ) {	if ( i.value(2).toString() == "PRIMARY" ) {	    idx.append( *fil.field( i.value(4).toString() ) );	    idx.setCursorName( i.value(0).toString() );	    idx.setName( i.value(2).toString() );	}    }    return idx;}QSqlRecord QMYSQLDriver::record( const QString& tablename ) const{    QSqlRecord fil;    if ( !isOpen() )	return fil;    MYSQL_RES* r = mysql_list_fields( d->mysql, tablename.local8Bit().data(), 0);    if ( !r ) {	return fil;    }    MYSQL_FIELD* field;    while ( (field = mysql_fetch_field( r ))) {	QSqlField f ( QString( field->name ) , qDecodeMYSQLType( (int)field->type, field->flags ) );	fil.append ( f );    }    mysql_free_result( r );    return fil;}QSqlRecord QMYSQLDriver::record( const QSqlQuery& query ) const{    QSqlRecord fil;    if ( !isOpen() )	return fil;    if ( query.isActive() && query.isSelect() && query.driver() == this ) {	QMYSQLResult* result =  (QMYSQLResult*)query.result();	QMYSQLResultPrivate* p = result->d;	if ( !mysql_errno( p->mysql ) ) {	    for ( ;; ) {		MYSQL_FIELD* f = mysql_fetch_field( p->result );		if ( f ) {		    QSqlField fi( QString((const char*)f->name), qDecodeMYSQLType( f->type, f->flags ) );		    fil.append( fi  );		} else		    break;	    }	}	mysql_field_seek( p->result, 0 );    }    return fil;}QSqlRecordInfo QMYSQLDriver::recordInfo( const QString& tablename ) const{    QSqlRecordInfo info;    if ( !isOpen() )	return info;    MYSQL_RES* r = mysql_list_fields( d->mysql, tablename.local8Bit().data(), 0);    if ( !r ) {	return info;    }    MYSQL_FIELD* field;    while ( (field = mysql_fetch_field( r ))) {	info.append ( QSqlFieldInfo( QString( field->name ),				qDecodeMYSQLType( (int)field->type, field->flags ),				IS_NOT_NULL( field->flags ),				(int)field->length,				(int)field->decimals,				QString( field->def ),				(int)field->type ) );    }    mysql_free_result( r );    return info;}QSqlRecordInfo QMYSQLDriver::recordInfo( const QSqlQuery& query ) const{    QSqlRecordInfo info;    if ( !isOpen() )	return info;    if ( query.isActive() && query.isSelect() && query.driver() == this ) {	QMYSQLResult* result =  (QMYSQLResult*)query.result();	QMYSQLResultPrivate* p = result->d;	if ( !mysql_errno( p->mysql ) ) {	    for ( ;; ) {		MYSQL_FIELD* field = mysql_fetch_field( p->result );		if ( field ) {		    info.append ( QSqlFieldInfo( QString( field->name ),				qDecodeMYSQLType( (int)field->type, field->flags ),				IS_NOT_NULL( field->flags ),				(int)field->length,				(int)field->decimals,				QVariant(),				(int)field->type ) );				} else		    break;	    }	}	mysql_field_seek( p->result, 0 );    }    return info;}MYSQL* QMYSQLDriver::mysql(){     return d->mysql;}bool QMYSQLDriver::beginTransaction(){#ifndef CLIENT_TRANSACTIONS    return FALSE;#endif    if ( !isOpen() ) {#ifdef QT_CHECK_RANGE	qWarning( "QMYSQLDriver::beginTransaction: Database not open" );#endif	return FALSE;    }    if ( mysql_query( d->mysql, "BEGIN WORK" ) ) {	setLastError( qMakeError("Unable to begin transaction", QSqlError::Statement, d ) );	return FALSE;    }    return TRUE;}bool QMYSQLDriver::commitTransaction(){#ifndef CLIENT_TRANSACTIONS    return FALSE;#endif    if ( !isOpen() ) {#ifdef QT_CHECK_RANGE	qWarning( "QMYSQLDriver::commitTransaction: Database not open" );#endif	return FALSE;    }    if ( mysql_query( d->mysql, "COMMIT" ) ) {	setLastError( qMakeError("Unable to commit transaction", QSqlError::Statement, d ) );	return FALSE;    }    return TRUE;}bool QMYSQLDriver::rollbackTransaction(){#ifndef CLIENT_TRANSACTIONS    return FALSE;#endif    if ( !isOpen() ) {#ifdef QT_CHECK_RANGE	qWarning( "QMYSQLDriver::rollbackTransaction: Database not open" );#endif	return FALSE;    }    if ( mysql_query( d->mysql, "ROLLBACK" ) ) {	setLastError( qMakeError("Unable to rollback transaction", QSqlError::Statement, d ) );	return FALSE;    }    return TRUE;}QString QMYSQLDriver::formatValue( const QSqlField* field, bool trimStrings ) const{    QString r;    if ( field->isNull() ) {	r = nullText();    } else {	switch( field->type() ) {	case QVariant::ByteArray: {		    const QByteArray ba = field->value().toByteArray();	    // buffer has to be at least length*2+1 bytes	    char* buffer = new char[ ba.size() * 2 + 1 ];	    /*uint escapedSize =*/ mysql_escape_string( buffer, ba.data(), ba.size() );	    r = QString( "'%1'" ).arg( buffer );	    delete[] buffer;	}	break;	case QVariant::String:	case QVariant::CString: {	    // Escape '\' characters	    r = QSqlDriver::formatValue( field );	    r.replace( "\\", "\\\\" );	    break;	}	default:	    r = QSqlDriver::formatValue( field, trimStrings );	}    }    return r;}

⌨️ 快捷键说明

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