Full MYSQL 5 QT Model mit export funktionen

Code-Schnippsel, oder Tipps und Tricks, die einem beim Programmieren mit Qt helfen können.
Antworten
patrik08
Beiträge: 746
Registriert: 27. Februar 2006 10:48
Wohnort: DE Freiburg

Full MYSQL 5 QT Model mit export funktionen

Beitrag von patrik08 »

Ich hatte es sat ... jedesmal den Grossen Mysql Amministrator zu oeffnen oder auf window den Heidi sql zu starten um nur einen Mysql dump zu machen oder ein par wenige zeilen zu editieren....

Somit habe ich den Mysql Amministrator auf einen simple QT4 Model niedergeschrieben .. um schlank zu sein ohne 1000 von optionen.. eben nur dass wass man wirklich braucht...

Was ist daraus geworden?

Ein beispiel mit meinen Lan namen connection xx.go vieleicht hat www.denic.de auch go namen... :-)

Bild


Das ganze habe ich so integriert dass man es auch als QWidget gebrauchen kann um eine tabelle in einen anderen projekt zu editieren..

Dann ist mir aufgefallen dass Grossgeschriebene Tabelle auf window einfach nicht grossgeschrieben sind ... sondern eben alles klein!
Damit frage ich beim oeffnen der connection wass der server ist (SHOW GLOBAL VARIABLES) ... um eben dass Grossgeschriebene richtig zu interpretieren ... da man sonst auf Linux exportiert und alles falsch ist.....

Dann brauchte ich eben genau zu wissen wass fuer query UPDATE das model macht... damit ich es auf einem zweitem 2° mysql server auch updaten kann

void Mysql_Table::WakeUpTable(const QModelIndex & a , const QModelIndex & b )

gibt ein signal was passiert mit dem update und eine QStringList speichert alle query bis zum naechsten commit ... und dort kann man loggen oder eben eine andere db aktualiesieren (so back-up db, in meinen fall eine lan db und eine server web db - select sind einfach schneller im Lan...)


Die QTableView subclass ist dann so....

Code: Alles auswählen


// Class automatically generated by Dev-C++ New Class wizard

#include "mysql_table.h" // class's header file

// class constructor
Mysql_Table::Mysql_Table( QWidget* parent )
     :QTableView(parent)
{
    this->setContextMenuPolicy( Qt::CustomContextMenu );
    connect(this, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(ContexMenu(QPoint)));
}


void Mysql_Table::ContexMenu( const QPoint & pos )
{
    lastp.setX( pos.x());
    lastp.setY( pos.y());
    TContext = new QMenu(this); 
    QAction *openweb1 = new QAction(this);
    openweb1->setText(tr("Reload Table"));
    openweb1->setStatusTip(tr("Reload Table")); 
    connect(openweb1, SIGNAL(activated()), this,  SLOT(ReloadTable()));
    
    TContext->addAction(tr( "Save current" ), this , SLOT( BigCommit() ) );
    TContext->addAction(openweb1);
    TContext->addAction(tr( "Insert a new row" ), this , SLOT( InsertNewRow() ) );
    
    TContext->exec(QCursor::pos()); 
	
}


void Mysql_Table::InsertNewRow()
{
   qDebug() << "### InsertNewRow ";
    model->insertRecord(-1, QSqlRecord());
}




// class destructor
Mysql_Table::~Mysql_Table()
{
	// insert your code here
}

// No description
void Mysql_Table::SetDB(QSqlDatabase dbin , QString tablein , int limiter)
{
	limit = limiter;
    DirtySQL = false;
    status = 0;
	db = dbin;
	table = tablein;
	UpdateSumm();
	MysqlModel(limit,0);
    //////show();
    /////////update();
}


void Mysql_Table::SetOrder( const QString fieldorder )
{
    if ( tr("Select order on %1").arg(table) == fieldorder) {
    orderby = "";
    return;
    }
	orderby = fieldorder;
	MysqlModel(limit,status);
}


void Mysql_Table::ReloadTable()
{
    MysqlModel(limit,status);
}

// No description
void Mysql_Table::MysqlModel( int maxrow , int status )
{
        indexcolumn = -1;
        if (DirtySQL) {
       /* hey you like save chanche? */ 
        QApplication::restoreOverrideCursor();
        QString msgDB =tr("You like save chanche?");
        int removeyes = QMessageBox::question(0, tr("Pleas confirm!"),msgDB,
                                                            tr("&Yes"), tr("&No"),
                                                             QString(),8888,9999);
        
         
         if (removeyes == 0 )  {
         BigCommit();
         }
         DirtySQL = false;
       }
       
   QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
   
 
   status = status; 
   limit = maxrow;
   model = new QSqlTableModel(this,db);
   model->setTable(table);
    
    if (INDEXFIELD.size() > 0) {
         for (int i = 0; i < FieldNameList.size(); ++i) {
          const QString af = FieldNameList.at(i);
             if (af == INDEXFIELD) {
             model->setHeaderData(i, Qt::Horizontal, tr("A/%1").arg(INDEXFIELD));
             indexcolumn = i;
             } else {
             model->setHeaderData(i, Qt::Horizontal,af);  
             }
           } 
           if (orderby.size() < 1) {
           model->setFilter(QString("%3!=0 LIMIT %1, %2").arg(status).arg(maxrow).arg(INDEXFIELD));
           } else {
           model->setFilter(QString("%3!=0 ORDER BY %4 LIMIT %1, %2").arg(status).arg(maxrow).arg(INDEXFIELD).arg(orderby));
           }
        } else {
        model->setFilter(QString("1 LIMIT %1, %2").arg(status).arg(maxrow));
            
            /* indexfield not exist */
            
        }
    
   bool greps = model->select();
    Q_ASSERT(greps);
        
    if (haveindex && greps) {
    setModel(model);
    setItemDelegate(new QSqlRelationalDelegate(this));
    model->setEditStrategy(QSqlTableModel::OnManualSubmit);
        
        std::cout << "ROWS=" << model->rowCount() << std::endl;
        std::cout << "COOLS=" << model->columnCount() << std::endl;
        
       
        
        
    horizontalheader = new QHeaderView(Qt::Horizontal,this);
    horizontalheader = horizontalHeader();
    vertikalheader = new QHeaderView(Qt::Vertical,this);  
    vertikalheader = verticalHeader();
    connect (horizontalheader,SIGNAL(sectionClicked(int)),this,SLOT(HeaderColumn(int)));
    connect (vertikalheader,SIGNAL( sectionDoubleClicked(int)),this,SLOT(VertikalRow(int)));
    } else if (greps) {
     setModel(model);
     model->setEditStrategy(QSqlTableModel::OnManualSubmit);
    }   

    connect(model, SIGNAL(dataChanged(QModelIndex,QModelIndex)), this, SLOT(WakeUpTable(QModelIndex,QModelIndex)));  
    //////connect(model, SIGNAL(primeInsert(int,QSqlRecord&)), this, SLOT(WakeSqlNext(int)));

     qDebug() << "### indexcolumn " << indexcolumn;
     qDebug() << "### indexcolumn " << indexcolumn;
    
    QApplication::restoreOverrideCursor();
    emit ModelError(greps);
}

void Mysql_Table::WakeSqlNext( int r)
{
   
    qDebug() << "### WakeSqlNext " << r ;
}


void Mysql_Table::CommingQuery( QSqlRecord * rec )
{
   
    qDebug() << "### CommingQuery ";
}


void Mysql_Table::HeaderColumn( int cools )
{
    /*  currentIndex ()   */
     
    
   /////qDebug() << "### HeaderColumn " << cools << rootIndex().data().toString();
    
}

void Mysql_Table::VertikalRow( int rows )
{
   qDebug() << "### VertikalRow " << rows;
    
}


void Mysql_Table::WakeUpTable(const QModelIndex & a ,  const QModelIndex & b )
{
    if (a.isValid() && b.isValid()) {
        
        if (model->isDirty(a) && model->isDirty(b)) {
            /* user mods data set new wath? */
            const QString fieldnametouch = FieldNameList.at(a.column());
            const QString indexfieldname = INDEXFIELD;  /* discovery on SHOW COLUMNS FROM table + make qstringlist FieldNameList */
            
            DirtySQL = true;  
            if (INDEXFIELD.size() > 0) {
                /* QModelIndex index field */
                QModelIndex base = a.sibling(a.row(),indexcolumn); 
                /* Prepare Dirty sqlupdate */
                const QString pending = QString("UPDATE %1 SET %2='%3' WHERE %4='%5' LIMIT 1")
                .arg(table)
                .arg(fieldnametouch)
                .arg(SQLQuote(a.data(Qt::DisplayRole).toString()))  /* escape quote */
                .arg(INDEXFIELD)
                .arg(base.data(Qt::DisplayRole).toString()); 
                /* append on a list wakeup on submit ... */
                DirtyPendingQuery.append(pending);
                ////////////qDebug() << "### Pendingsql one line  " << pending;
                //////////qDebug() << "### WakeUpTable " << table << " fieldname active " << fieldnametouch << " - " << a.data().toString() << " - " << a.row() << "x" << a.column() << " on " << base.data(Qt::DisplayRole).toString();
            }
        }
    }
    
}


/* discovery total row whitout limit mysql / to play next prev ...  button */
void Mysql_Table::UpdateSumm()
{
   QString grepprimary,grepauto;
   /* reset index  fieldname */
    /* SHOW INDEX FROM USER_ASSO_0  */
    
   INDEXFIELD = "";
   FieldNameList.clear();
   const QString info = QString("SHOW COLUMNS FROM %1").arg(table);
    QSqlQuery query(info,db);
       QSqlRecord rec = query.record();
       ////int sumcol = rec.count();
            while (query.next()) {
                grepprimary = query.value(3).toString();
                grepprimary = grepprimary.toLower();
                grepauto = query.value(5).toString();
                grepauto = grepauto.toLower();
                ///////Q_ASSERT(grepauto.size() > 1);  /* no mysql or not connect! or grand not...*/
                if (grepprimary == "pri" && grepauto.contains("auto")) {
                    INDEXFIELD = query.value(0).toString();
                    //////////qDebug() << "### INDEXFIELD have found " << INDEXFIELD  ;
                }
                FieldNameList.append(query.value(0).toString());
            }
            
            
     if (INDEXFIELD.size() < 1) {
      haveindex = false;
     } else {
      haveindex = true; 
     }
     
     
     totalrow = 0;
     if (haveindex) {
         const QString summitem = QString("SELECT COUNT(%2) FROM %1").arg(table).arg(INDEXFIELD);
         query.exec(summitem);
         while (query.next()) {
             totalrow = query.value(0).toInt();  
         }
    
     }
     qDebug() << "### totalrow " << totalrow;

}

/* return qlist name fields */
QStringList Mysql_Table::GetFields()
{
	return FieldNameList;
}

/* check if have a mysql index int */
bool Mysql_Table::HaveIndex()
{
	return haveindex;
}
/* get summ of total row */
int Mysql_Table::GetSummRow()
{
	return totalrow;
}

/* save all DirtySQL true value and reset DirtySQL to false */
void Mysql_Table::BigCommit()
{
	if (model->submitAll()) {
        model->database().commit();
        DirtySQL = false;
        emit ModelError(true);
        emit ExcecQuerys(DirtyPendingQuery);
        qDebug() << "### DirtyPendingQuery  " << DirtyPendingQuery;
        DirtyPendingQuery.clear();
        return;
    } else {
        model->database().rollback();
        DirtyPendingQuery.clear();
        if (!haveindex) {
        QMessageBox::warning(0, tr("Table %1 ").arg(table),tr("The database reported an error: %1\nAnd table not having index!").arg(model->lastError().text())); 
        } else {
        QMessageBox::warning(0, tr("Table %1 ").arg(table),tr("The database reported an error: %1").arg(model->lastError().text()));
        }emit ModelError(false);
        return;
    }
}

// No description
void Mysql_Table::SetLimit(int newlimit)
{
	/* TODO (#1#): Implement Mysql_Table::SetLimit() */
}



QString Mysql_Table::SQLQuote( QString xml )
{
   QString text = xml;
   text.replace("\"","\\\"");  /* 228 ``*/
   text.replace("'","`");
   return text;
}


wer den source moechte kann hier folgen http://ppk.ciz.ch/qt_c++/mysql_model_br ... _Model.zip

Naturlich auf linux - Mac - Window getestet und geht prima...

Fehlt nur noch den dump import dann braucht mann den Mysql amministrator ueberhaupt nicht...

fuer import nehme ich mir einfach eine console

Aber wen jemand den QRegExp schreiben moechte um ein dump zu importieren moechte ich es naturlich wissen...



### export command
mysqldump -hlocalhost -uroot -ppass dbname >dbname.sql
### import command
mysql -hlocalhost -uroot -ppass dbname < dbname.sql
.........................
speack português italiano deutsch english castellà qt
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Um die Groß-/Kleinschreibung in der Datenbank zu beurteilen ist nicht das Hostsystem von Interesse sonder die Variable lower_case_table_names. Außerdem glaube ich nicht, daß du einen mysqldump einfach so per QRegExp zerlegen und zurückspielen kannst. (Ich sag nur Views, Procedures,...)
patrik08
Beiträge: 746
Registriert: 27. Februar 2006 10:48
Wohnort: DE Freiburg

Beitrag von patrik08 »

upsala hat geschrieben:Um die Groß-/Kleinschreibung in der Datenbank zu beurteilen ist nicht das Hostsystem von Interesse sonder die Variable lower_case_table_names.
Eben es geht nur um den default wert:

Linux && Mac;
lower_case_table_names 0
Window OS:
lower_case_table_names 1

Wer installiert auf window Mysql und kontrolliert 200 und + konfiguartionen?

Der dump import geht auf sqlite3 mit meinen ersten QT4 programm (Dass unterdessen fast 4000 mal downloaded geworden ist ... ) http://sourceforge.net/projects/qtexcel-xslt/ da bei sqlite3 der dump immer eine flache zeile ist.

Aber dass ist ja kein problem wenn die console auch noch da ist...

Wass mich am meisten sorgen macht , ist dass QDomDocument keinen XML export schreiben kann mit ueber 10'000 zeilen ... jedoch wenn man dass XML mit QTextStream schreib geht es...


an lepsai:
Uebringens es gibt leute die noch auf eine verprechung warten...
http://www.qtforum.de/forum/viewtopic.php?p=20074#20074 :wink:
.........................
speack português italiano deutsch english castellà qt
Antworten