X-Git-Url: http://shamusworld.gotdns.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;ds=sidebyside;f=src%2Fmainwin.cpp;h=5feacc5c1cb9c082d91770d65b9b3d883dd757c7;hb=83b9c871148f01ee15671b08dc807bd8901c8b22;hp=fe7931f6e6b7964cda186a3e8d17a187fa23c243;hpb=6df1a447a1fa1b9e51fd177a806f910813657b09;p=schematic diff --git a/src/mainwin.cpp b/src/mainwin.cpp index fe7931f..5feacc5 100644 --- a/src/mainwin.cpp +++ b/src/mainwin.cpp @@ -26,7 +26,6 @@ MainWindow::MainWindow(): aboutWin(new AboutWindow(this)), - scmWidget(new SCMWidget(this)), boldFont(new QFont), loggedInUID(0) { @@ -106,40 +105,42 @@ MainWindow::MainWindow(): aboutWin(new AboutWindow(this)), // Finally, set up database connection - db = QSqlDatabase::addDatabase("QMYSQL"); + db = QSqlDatabase::addDatabase("QODBC"); bool ok = false; // Prime the SQL Settings dialog (in case we need it) SQLSettingsDialog sqlSettings; - sqlSettings.edit1->setText(dbHostName); - sqlSettings.edit2->setText(dbName); - sqlSettings.edit3->setText(dbUserName); - sqlSettings.edit4->setText(dbPassword); + sqlSettings.edit1->setText(dbDriver); + sqlSettings.edit2->setText(dbHostName); + sqlSettings.edit3->setText(dbName); + sqlSettings.edit4->setText(dbUserName); + sqlSettings.edit5->setText(dbPassword); do { - // Set up the DB connection with saved settings - db.setHostName(dbHostName); - db.setDatabaseName(dbName); - db.setUserName(dbUserName); - db.setPassword(dbPassword); + // Set up the ODBC DB connection with saved settings + // NB: For this to work properly on 64-bit Windows, you need to use the 32-bit driver! + QString odbc = QString("DRIVER={%1};DATABASE=%2;SERVER=%3;UID=%4;PASSWORD=%5") + .arg(dbDriver).arg(dbName).arg(dbHostName).arg(dbUserName).arg(dbPassword); + db.setDatabaseName(odbc); ok = db.open(); -//printf("Error: %s\n", db.lastError().databaseText().toAscii().data()); -//printf("Error: %s\n", db.lastError().driverText().toAscii().data()); - // If unsuccessful, run the SQL settings/test dialog if (!ok) { + sqlSettings.error1->setText(db.lastError().databaseText()); + sqlSettings.error2->setText(db.lastError().driverText()); + if (sqlSettings.exec()) { // User thinks this will work (hit OK button), so prime the variables // for the next attempt - dbHostName = sqlSettings.edit1->text(); - dbName = sqlSettings.edit2->text(); - dbUserName = sqlSettings.edit3->text(); - dbPassword = sqlSettings.edit4->text(); + dbDriver = sqlSettings.edit1->text(); + dbHostName = sqlSettings.edit2->text(); + dbName = sqlSettings.edit3->text(); + dbUserName = sqlSettings.edit4->text(); + dbPassword = sqlSettings.edit5->text(); } else return; // User cancelled the dialog, so quit @@ -147,39 +148,58 @@ MainWindow::MainWindow(): aboutWin(new AboutWindow(this)), } while (!ok); - // Do Login dialog - LoginDialog loginDlg; - bool done = false; + // Check to see how many users are in the system; if less than 2, we don't do a login + QSqlQuery query; + query.prepare("SELECT COUNT(*) FROM User"); + query.exec(); + query.next(); - do + if (query.value(0).toInt() > 1) { - bool accept = loginDlg.exec(); + // Do Login dialog + LoginDialog loginDlg; + bool done = false; - // Check to see if user cancelled out - if (!accept) - done = true; - else + do { - // Search DB for this username/login pair - QSqlQuery query("SELECT UID, name, login FROM User WHERE Login=? AND Password=?"); - query.addBindValue(loginDlg.edit1->text()); - query.addBindValue(loginDlg.edit2->text()); - query.exec(); + bool accept = loginDlg.exec(); - while (query.next()) - { - // We have a winner! - loggedInUID = query.value(0).toInt(); - fullName = query.value(1).toString(); - login = query.value(2).toString(); + // Check to see if user cancelled out + if (!accept) done = true; + else + { + // Search DB for this username/login pair + QSqlQuery query; + query.prepare("SELECT UID, name, login FROM User WHERE Login=? AND Password=?"); + query.addBindValue(loginDlg.edit1->text()); + query.addBindValue(loginDlg.edit2->text()); + query.exec(); + + while (query.next()) + { + // We have a winner! + loggedInUID = query.value(0).toInt(); + fullName = query.value(1).toString(); + login = query.value(2).toString(); + done = true; + } } } + while (!done); + } + else + { + fullName = "Administrator"; + login = "admin"; + loggedInUID = 1; } - while (!done); + scmWidget = new SCMWidget(this); QString s = QString("User: %1 (%2)").arg(fullName).arg(login); scmWidget->username->setText(s); + scmWidget->currentUID = loggedInUID; + scmWidget->UpdateNotes(); setCentralWidget(scmWidget); } @@ -230,15 +250,132 @@ void MainWindow::HandleNewVendorDialog(void) // Presumably, the user has given us good data, so we try to populate the // database with this new vendor data. - QSqlQuery query1("INSERT INTO VALUES (?, ?, ?)"); + // First, see if there is anything missing from the dialog... + + // Create new vendor entry... + int vid = -1; + bool hasNDA = (dialog.checkbox1->checkState() == Qt::Checked ? true : false); + int vlid = dialog.combo1->itemData(dialog.combo1->currentIndex()).toInt(); + QSqlQuery query; + query.prepare("INSERT INTO Vendor VALUES ('', ?, ?, ?)"); + query.addBindValue(vlid); + query.addBindValue(hasNDA); + query.addBindValue(dialog.edit1->text()); + query.exec(); + + // Get VID from record just inserted + query.prepare("SELECT vid FROM Vendor WHERE vlid=? AND signedNDA=? AND name=?"); + query.addBindValue(vlid); + query.addBindValue(hasNDA); + query.addBindValue(dialog.edit1->text()); + query.exec(); + query.next(); + vid = query.value(0).toInt(); +//printf("NVD: New Vendor VID=%i\n", vid); + + // Add primary address... + query.prepare("INSERT INTO Location VALUES ('', ?, ?, ?, ?, ?, ?)"); + query.addBindValue(vid); + query.addBindValue(dialog.address->field1->text()); + query.addBindValue(dialog.address->field2->text()); + query.addBindValue(dialog.address->field3->text()); + query.addBindValue(dialog.address->field4->text()); + query.addBindValue(dialog.address->field5->text()); + query.exec(); + + // Fix up primary contact type + int ctid = -1; + + // -1 in currentIndex() means nothing was selected, so create new entry +//NOT SO FAST: Seems it defaults to whatever is found there. So need to fix that. >:-( +// if (dialog.contact->field1->currentIndex() == -1) + if (dialog.contact->newContactType) + { + query.prepare("INSERT INTO ContactType VALUES ('', ?)"); + query.addBindValue(dialog.contact->field1->currentText()); + query.exec(); + + query.prepare("SELECT ctid FROM ContactType WHERE description=?"); + query.addBindValue(dialog.contact->field1->currentText()); + query.exec(); + query.next(); + ctid = query.value(0).toInt(); + } + else + { + ctid = dialog.contact->field1->itemData(dialog.contact->field1->currentIndex()).toInt(); + } + + // Add primary contact... + query.prepare("INSERT INTO Contact VALUES ('', ?, ?, ?, ?, ?, ?, ?, ?)"); + query.addBindValue(vid); + query.addBindValue(ctid); + query.addBindValue(dialog.contact->field2->text()); + query.addBindValue(dialog.contact->field3->text()); + query.addBindValue(dialog.contact->field4->text()); + query.addBindValue(dialog.contact->field5->text()); + query.addBindValue(dialog.contact->field6->text()); + query.addBindValue(dialog.contact->field7->text()); + query.exec(); + + // Add vendor classes... + for(int i=0; icount(); i++) + { + QListWidgetItem * item = dialog.list->item(i); + + if (item->checkState() == Qt::Checked) + { + int vtid = item->data(Qt::UserRole).toInt(); + query.prepare("INSERT INTO VendorSpecificTypes VALUES (?, ?)"); + query.addBindValue(vid); + query.addBindValue(vtid); + query.exec(); + } + } + + // Update UI + scmWidget->GetVendorIDs(); + scmWidget->GetVendor(vid); + +//printf("NVD: Contact Type index = %i\n", dialog.contact->field1->currentIndex()); +//printf("NVD: Contact type ='%s'\n", dialog.contact->field1->currentText().toAscii().data()); +//-1 means no contact selected; check currentText() to see if it has anything in it or not + + // Tables to fill: +#if 0 +Vendor +VID (P-key) | VLID | signedNDA | Name +CREATE TABLE Vendor (vid INT NOT NULL PRIMARY KEY AUTO_INCREMENT, vlid INT, signedNDA TINYINT(1) NOT NULL DEFAULT 0, name VARCHAR(100), FOREIGN KEY (vlid) REFERENCES VendorLevel(vlid)) ENGINE=INNODB; + +VendorType +VTID (P-key) | VGID | SeqNo | Description +CREATE TABLE VendorType (vtid INT NOT NULL PRIMARY KEY AUTO_INCREMENT, vgid INT, seqNo INT(4) NOT NULL, description VARCHAR(100), FOREIGN KEY (vgid) REFERENCES VendorGroup(vgid)) ENGINE=INNODB; + +VendorSpecificTypes +VID (multi) | VTID (multi) +CREATE TABLE VendorSpecificTypes (vid INT, vtid INT, FOREIGN KEY (vid) REFERENCES Vendor(vid), FOREIGN KEY (vtid) REFERENCES VendorType(vtid)) ENGINE=INNODB; + +Location +LID (P-key) | VID | Address | City | State | Country | Code +CREATE TABLE Location (lid INT NOT NULL PRIMARY KEY AUTO_INCREMENT, vid INT, address VARCHAR(100), city VARCHAR(64), state VARCHAR(64), country VARCHAR(64), code VARCHAR(32), FOREIGN KEY (vid) REFERENCES Vendor(vid)) ENGINE=INNODB; + +Contact +CID (P-key) | VID | CTID | Name | Email | Address | Phone1 | Phone2 | Fax +CREATE TABLE Contact (cid INT NOT NULL PRIMARY KEY AUTO_INCREMENT, vid INT, CTID int, name VARCHAR(64), email VARCHAR(64), address VARCHAR(200), phone1 VARCHAR(32), phone2 VARCHAR(32), fax VARCHAR(32), FOREIGN KEY (vid) REFERENCES Vendor(vid), FOREIGN KEY (ctid) REFERENCES ContactType(ctid)) ENGINE=INNODB; + +ContactType +CTID (P-key) | Description +CREATE TABLE ContactType (ctid INT NOT NULL PRIMARY KEY AUTO_INCREMENT, description VARCHAR(100)) ENGINE=INNODB; +#endif } void MainWindow::FillVendorLevelCombo(QComboBox * combo) { - QSqlQuery query("SELECT VLID, Description FROM VendorLevel"); + QSqlQuery query; + query.prepare("SELECT VLID, Description FROM VendorLevel"); query.exec(); while (query.next()) @@ -253,7 +390,8 @@ void MainWindow::FillVendorLevelCombo(QComboBox * combo) void MainWindow::FillContactTypeCombo(QComboBox * combo) { - QSqlQuery query("SELECT CTID, Description FROM ContactType"); + QSqlQuery query; + query.prepare("SELECT CTID, Description FROM ContactType"); query.exec(); while (query.next()) @@ -271,7 +409,8 @@ void MainWindow::FillVendorClassList(QListWidget * list) std::vector groupList; // Pull in definitions from DB for Vendor Classes/Groups - QSqlQuery query1("SELECT vgid, description FROM VendorGroup ORDER BY seqNo"); + QSqlQuery query1; + query1.prepare("SELECT vgid, description FROM VendorGroup ORDER BY seqNo"); query1.exec(); while (query1.next()) @@ -282,18 +421,19 @@ void MainWindow::FillVendorClassList(QListWidget * list) groupList.push_back(v); } - QSqlQuery query2("SELECT vtid, vgid, description FROM VendorType ORDER BY seqNo"); - query2.exec(); +// QSqlQuery query2; + query1.prepare("SELECT vtid, vgid, description FROM VendorType ORDER BY seqNo"); + query1.exec(); int previousID = -1, groupListIndex = 0; QListWidgetItem * item; - while (query2.next()) + while (query1.next()) { // VendorType v; - int vtid = query2.value(0).toInt(); - int vgid = query2.value(1).toInt(); - QString description = query2.value(2).toString(); + int vtid = query1.value(0).toInt(); + int vgid = query1.value(1).toInt(); + QString description = query1.value(2).toString(); // Check to see if we need to insert new header yet. // If we're not still in same group, push the next group header into the list @@ -327,6 +467,7 @@ void MainWindow::ReadSettings(void) // ((TTEdit *)qApp)->charWnd->resize(size); // ((TTEdit *)qApp)->charWnd->move(pos); + dbDriver = settings.value("dbDriver", "myodbc-5.1").toString(); dbHostName = settings.value("dbHostName", "localhost").toString(); dbName = settings.value("dbName", "schematic").toString(); dbUserName = settings.value("dbUserName", "scm_user").toString(); @@ -342,6 +483,7 @@ void MainWindow::WriteSettings(void) // settings.setValue("charWndPos", ((TTEdit *)qApp)->charWnd->pos()); // settings.setValue("charWndSize", ((TTEdit *)qApp)->charWnd->size()); + settings.setValue("dbDriver", dbDriver); settings.setValue("dbHostName", dbHostName); settings.setValue("dbName", dbName); settings.setValue("dbUserName", dbUserName);