📄 qsql_mysql.cpp
字号:
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 + -