/* * Primary developers: Hedin & Kevin */ #include "StdAfx.h" #include ".\MicrosoftDBLayer.h" MicrosoftDBLayer::MicrosoftDBLayer(ConfigFile &config) { CString dsn; dsn.Format("ODBC; Description=; DRIVER=SQL Server; SERVER=%s; UID=%s; PWD=%s", config.host, config.username, config.password); db.OpenEx(dsn, CDatabase::noOdbcDialog); CString sql; sql.Format("USE %s", config.database); db.ExecuteSQL(sql); } MicrosoftDBLayer::~MicrosoftDBLayer(void) { db.Close(); } vector MicrosoftDBLayer::GetPersonAll(void) { vector buffer; CString id, inits, name, isadmin, pass; CRecordset rs(&db); rs.Open(AFX_DB_USE_DEFAULT_TYPE, "SELECT PersonID, Initialer, Navn, Admin, Pass FROM Person ORDER BY Initialer DESC"); while(!rs.IsEOF()) { rs.GetFieldValue((short)0,id); rs.GetFieldValue(1,inits); rs.GetFieldValue(2,name); rs.GetFieldValue(3,isadmin); rs.GetFieldValue(4,pass); Person p; p.id = id; p.inits = inits; p.name = name; p.isadmin = (isadmin == 1); p.pass = pass; buffer.push_back(p); rs.MoveNext(); } rs.Close(); return buffer; } Person MicrosoftDBLayer::GetPerson(CString wantInits) { CString id, inits, name, isadmin, pass; CString SQL; Person p; wantInits.Replace("'","\""); SQL = "SELECT PersonID, Initialer, Navn, Admin, Pass FROM Person WHERE (Initialer = '" + wantInits + "')"; CRecordset rs(&db); rs.Open(AFX_DB_USE_DEFAULT_TYPE, SQL); if(!rs.IsEOF() ) { rs.GetFieldValue((short)0,id); rs.GetFieldValue(1,inits); rs.GetFieldValue(2,name); rs.GetFieldValue(3,isadmin); rs.GetFieldValue(4,pass); p.id = id; p.inits = inits; p.name = name; p.isadmin = (isadmin == "1"); p.pass = pass; } return p; } bool MicrosoftDBLayer::AddPerson(Person NewPerson) { CString SQL; NewPerson.inits.Replace("'","\""); NewPerson.name.Replace("'","\""); NewPerson.pass.Replace("'","\""); SQL.Format("INSERT into Person(Initialer, Navn, Admin, Pass) VALUES('%s', '%s', '%d', '%s')",NewPerson.inits, NewPerson.name, NewPerson.isadmin, NewPerson.pass); db.ExecuteSQL(SQL); return true; } bool MicrosoftDBLayer::UpdatePerson(Person ChangePerson) { CString SQL; ChangePerson.inits.Replace("'","\""); ChangePerson.name.Replace("'","\""); ChangePerson.pass.Replace("'","\""); ChangePerson.id.Replace("'","\""); SQL.Format("UPDATE Person SET Initialer = '%s', Navn = '%s', Pass = '%s', Admin = '%d' WHERE PersonID = '%s'", ChangePerson.inits, ChangePerson.name, ChangePerson.pass, ChangePerson.isadmin, ChangePerson.id); db.ExecuteSQL(SQL); return true; } bool MicrosoftDBLayer::DeletePerson(Person RemovePerson) { CString SQL; RemovePerson.id.Replace("'","\""); SQL.Format("DELETE FROM Person WHERE PersonID = '%s'", RemovePerson.id); db.ExecuteSQL(SQL); return true; } bool MicrosoftDBLayer::ReturnEquipment(CString barcode) { CString SQL; barcode.Replace("'","\""); SQL.Format("UPDATE Udstyr SET Status = '3' WHERE Stregkode= '%s'", barcode); db.ExecuteSQL(SQL); SQL.Format("UPDATE Udlån SET Afleveringsdato = Getdate() WHERE Stregkode= '%s' AND Afleveringsdato IS NULL ", barcode); db.ExecuteSQL(SQL); checkReservations(barcode); return true; } bool MicrosoftDBLayer::CheckoutEquipment(Person CheckPersID, Equipment CheckEquip, int Numdays) { CString SQL; CheckEquip.barcode.Replace("'","\""); CheckPersID.id.Replace("'","\""); SQL.Format("UPDATE Udstyr SET Status = '1' WHERE Stregkode = '%s' ", CheckEquip.barcode); db.ExecuteSQL(SQL); SQL.Format("INSERT INTO Udlån (PersonID, Stregkode, Startdato, Antaldage) VALUES( '%s','%s', GetDate(),'%d')", CheckPersID.id, CheckEquip.barcode, Numdays); db.ExecuteSQL(SQL); return true; } bool MicrosoftDBLayer::EquipmentReservation(CString barcode, Person CheckPerson) { CString SQL; CheckPerson.id.Replace("'","\""); barcode.Replace("'","\""); SQL.Format("INSERT INTO Resevation (PersonID, Stregkode, Startdato) VALUES( '%s','%s', GetDate())", CheckPerson.id, barcode); db.ExecuteSQL(SQL); checkReservations(barcode); return true; } bool MicrosoftDBLayer::UpdateEquipment(Equipment CheckEquip) { CString SQL; CheckEquip.name.Replace("'","\""); CheckEquip.description.Replace("'","\""); CheckEquip.placement.Replace("'","\""); CheckEquip.status.Replace("'","\""); CheckEquip.barcode.Replace("'","\""); SQL.Format("UPDATE Udstyr SET Navn = '%s', Beskrivelse = '%s', Placering = '%s', Status = '%s' WHERE Stregkode = '%s'", CheckEquip.name, CheckEquip.description, CheckEquip.placement, CheckEquip.status, CheckEquip.barcode); db.ExecuteSQL(SQL); return true; } bool MicrosoftDBLayer::AddEquipment(Equipment AddEquip) { CString SQL; AddEquip.barcode.Replace("'","\""); AddEquip.name.Replace("'","\""); AddEquip.description.Replace("'","\""); AddEquip.placement.Replace("'","\""); SQL.Format("INSERT into Udstyr(Stregkode, Navn, Beskrivelse, Placering, Status) VALUES('%s', '%s', '%s', '%s', '%s')",AddEquip.barcode, AddEquip.name, AddEquip.description, AddEquip.placement, "3"); db.ExecuteSQL(SQL); return true; } vector MicrosoftDBLayer::GetEquipmentAll(void) { vector buffer; CString barcode, name, description, placement, status; CRecordset rs(&db); rs.Open(AFX_DB_USE_DEFAULT_TYPE, "SELECT Stregkode, Navn, Beskrivelse, Placering, Status FROM Udstyr"); while(!rs.IsEOF()) { rs.GetFieldValue((short)0,barcode); rs.GetFieldValue(1,name); rs.GetFieldValue(2,description); rs.GetFieldValue(3,placement); rs.GetFieldValue(4,status); Equipment p; p.barcode = barcode; p.name = name; p.description = description; p.placement = placement; p.status = status; buffer.push_back(p); rs.MoveNext(); } rs.Close(); return buffer; } Equipment MicrosoftDBLayer::GetEquipment(CString wantBarcode) { CString barcode,name,description,placement,status; CString SQL; wantBarcode.Replace("'","\""); Equipment e; SQL.Format("SELECT Stregkode,Navn,Udstyr.Beskrivelse,Placering,Status.Beskrivelse FROM Udstyr INNER JOIN Status ON Udstyr.Status = Status.StatusID Where (Stregkode = '%s')", wantBarcode); CRecordset rs(&db); rs.Open(AFX_DB_USE_DEFAULT_TYPE, SQL); if (!rs.IsEOF() ) { rs.GetFieldValue((short)0,barcode); rs.GetFieldValue(1,name); rs.GetFieldValue(2,description); rs.GetFieldValue(3,placement); rs.GetFieldValue(4,status); e.barcode = barcode; e.name = name; e.description = description; e.placement = placement; e.status = status; } rs.Close(); return e; } bool MicrosoftDBLayer::DeleteEquipment(Equipment DelEquip) { CString SQL; DelEquip.barcode.Replace("'","\""); SQL.Format("DELETE FROM Udstyr WHERE Stregkode = '%s'", DelEquip.barcode); db.ExecuteSQL(SQL); return true; } // Developed by Torben H. Nielsen vector MicrosoftDBLayer::Search(CString barcode, CString name, CString inits, bool available, bool reserved, bool deposited) { vector buffer; barcode.Replace("'","\""); name.Replace("'","\""); inits.Replace("'","\""); //here are the wanted equipments found through 3 seperate queries - I could also //find them all in one query where I joined the 3 selects via a UNION CString SQL; if (available == true) { SQL = "SELECT DISTINCT Udstyr.stregkode,Udstyr.Navn,Udstyr.Beskrivelse,Udstyr.Placering,Status.Beskrivelse \ FROM Udstyr \ INNER JOIN Status ON Udstyr.status = Status.StatusID WHERE Udstyr.Status = 3 "; if (barcode != "") SQL += " AND Udstyr.stregkode = '" + barcode + "' "; if (name != "") SQL += " AND Udstyr.Navn LIKE '%" + name + "%' "; CRecordset rs(&db); rs.Open(AFX_DB_USE_DEFAULT_TYPE, SQL); FillEquipmentVector(buffer,rs); rs.Close(); } if (reserved == true) { SQL = "SELECT DISTINCT Udstyr.stregkode,Udstyr.Navn,Udstyr.Beskrivelse,Udstyr.Placering,Status.Beskrivelse \r\n\ FROM Udstyr \r\n\ INNER JOIN Status ON Udstyr.status = Status.StatusID \r\n\ INNER JOIN Resevation ON Udstyr.Stregkode = Resevation.stregkode \r\n\ INNER JOIN Person ON Resevation.PersonID = Person.PersonID\r\n\ WHERE ( Udstyr.Status = 2 OR Person.Initialer = '" + inits + "') "; if (barcode != "") SQL += " AND Udstyr.stregkode = '" + barcode + "' "; if (name != "") SQL += " AND Udstyr.Navn LIKE '%" + name + "%' "; //if (inits != "") // SQL += " AND Person.Initialer = '" + inits + "' "; CRecordset rs(&db); rs.Open(AFX_DB_USE_DEFAULT_TYPE, SQL); FillEquipmentVector(buffer,rs); rs.Close(); } if (deposited == true) { SQL = "SELECT DISTINCT Udstyr.stregkode,Udstyr.Navn,Udstyr.Beskrivelse,Udstyr.Placering,Status.Beskrivelse \r\n\ FROM Udstyr \r\n\ INNER JOIN Status ON Udstyr.status = Status.StatusID \r\n\ INNER JOIN Udlån ON Udstyr.Stregkode = Udlån.stregkode \r\n\ INNER JOIN Person ON Udlån.PersonID = person.PersonID\r\n\ WHERE Udstyr.Status = 1 \r\n\ AND Udlån.Afleveringsdato IS NULL"; if (barcode != "") SQL += " AND Udstyr.stregkode = '" + barcode + "' "; if (name != "") SQL += " AND Udstyr.Navn LIKE '%" + name + "%' "; if (inits != "") SQL += " AND Person.Initialer = '" + inits + "' "; CRecordset rs(&db); rs.Open(AFX_DB_USE_DEFAULT_TYPE, SQL); FillEquipmentVector(buffer,rs); rs.Close(); } // now I have the equipment rows the user asked for, now I need some more checkout and // reservation data for each piece of equipment for (int i=0; i0) { rs.MoveFirst(); while ( !rs.IsEOF() ) { Checkout check; rs.GetFieldValue((short)0, check.startdate); rs.GetFieldValue(1, check.enddate); rs.GetFieldValue(2, check.numdays); rs.GetFieldValue(3, check.inits); buffer[i].checkouts.push_back(check); rs.MoveNext(); } } rs.Close(); // fill Equipment::reservations SQL = "SELECT Resevation.ResevationID, Resevation.StartDato, Person.Initialer\ FROM Resevation\ INNER JOIN Person ON Resevation.PersonID = Person.PersonID "; SQL += "WHERE Resevation.Stregkode = " + buffer[i].barcode + " ORDER BY STARTDATO ASC"; rs.Open(AFX_DB_USE_DEFAULT_TYPE, SQL); if (rs.GetRecordCount()>0) { rs.MoveFirst(); while ( !rs.IsEOF() ) { Reservation res; rs.GetFieldValue((short)0, res.reservationID); rs.GetFieldValue(1, res.startdate); rs.GetFieldValue(2, res.inits); buffer[i].reservations.push_back(res); rs.MoveNext(); } } rs.Close(); } return buffer; } // Developed by Torben H. Nielsen void MicrosoftDBLayer::FillEquipmentVector(vector &buffer, CRecordset &rs) { CString barcode,name,description,placement,status; if (rs.GetRecordCount()>0) { rs.MoveFirst(); while (!rs.IsEOF() ) { Equipment eq; rs.GetFieldValue((short)0, eq.barcode); rs.GetFieldValue(1, eq.name); rs.GetFieldValue(2, eq.description); rs.GetFieldValue(3, eq.placement); rs.GetFieldValue(4, eq.status); buffer.push_back(eq); rs.MoveNext(); } } } //Developed by Torben H. Nielsen void MicrosoftDBLayer::checkReservations(CString barcode) { CString scount,status; barcode.Replace("'","\""); CString SQL = "SELECT count(*) FROM Resevation WHERE Resevation.Stregkode = '" + barcode + "'"; CRecordset rs(&db); rs.Open(AFX_DB_USE_DEFAULT_TYPE,SQL); rs.MoveFirst(); rs.GetFieldValue((short)0,scount); int reservationCount = atoi(scount); rs.Close(); SQL = "SELECT status FROM Udstyr WHERE Udstyr.Stregkode = '" + barcode + "'"; rs.Open(AFX_DB_USE_DEFAULT_TYPE,SQL); if (rs.GetRecordCount() >0) { rs.MoveFirst(); rs.GetFieldValue((short)0,status); } rs.Close(); if (reservationCount > 0 && status == "3") {//equipment is available and has at lease one reservation SQL = "UPDATE Udstyr SET Status = 2 WHERE Stregkode = '" + barcode + "'"; db.ExecuteSQL(SQL); } } //Developed by Torben H. Nielsen bool MicrosoftDBLayer::DeleteReservation(CString barcode, CString resid) { barcode.Replace("'","\""); resid.Replace("'","\""); CString SQL = "DELETE FROM Resevation WHERE resevationid = " + resid; db.ExecuteSQL(SQL); checkReservations(barcode); return true; }