00001
00002
00003
00004
00005
00006
00007
00008 #include "Order.h"
00009 #include "User.h"
00010
00011 #define KEY_ORD_OID "oid"
00012 #define KEY_ORD_UID "uid"
00013 #define KEY_ORD_DATE "date"
00014 #define KEY_ORD_TOTAL "total"
00015
00016
00017 Order::Order() : ManagedObject("orders")
00018 {
00019 _user = NULL;
00020 }
00021
00022 Order::Order(Row &aRow) : ManagedObject("orders", aRow)
00023 {
00024 _user = User::userByID(intForKey(KEY_ORD_UID));
00025 }
00026
00027 Order::~Order()
00028 {
00029 if (_user)
00030 delete _user;
00031 }
00032
00033 Order * Order::create(int anUid, Basket & bsk)
00034 {
00035 Order *o = new Order();
00036
00037 o->setIntForKey(KEY_ORD_OID, 0);
00038 o->setFloatForKey(KEY_ORD_TOTAL, bsk.total());
00039 o->setValueForKey(KEY_ORD_DATE, "date()");
00040 o->setIntForKey(KEY_ORD_UID, anUid);
00041 if (!o->store()) {
00042 delete o;
00043 return NULL;
00044 }
00045
00046 ulonglong oid = o->getLastInsertID();
00047
00048 Database& db = Database::Instance();
00049 Connection *conn = db.getConnection();
00050 Query q = conn->query();
00051
00052 for (Basket::iterator it=bsk.begin(); it != bsk.end(); it++) {
00053 q << "INSERT INTO order_details VALUES (" << oid << ", " << (*it).first
00054 << ", " << (*it).second << ")";
00055 q.exec();
00056 q.reset();
00057 }
00058
00059 return o;
00060 }
00061
00062 vector<Order *> & Order::ordersForUser(User & pp)
00063 {
00064 vector<Order *> *orders = NULL;
00065
00066 Database& db = Database::Instance();
00067
00068 try {
00069 Connection *conn = db.getConnection();
00070 Query q = conn->query();
00071 q << "SELECT * FROM orders WHERE uid = " << pp.uniqueID()
00072 << " ORDER BY oid, date";
00073
00074 StoreQueryResult res = q.store();
00075 if (!res.empty()) {
00076 orders = new vector<Order *>;
00077 orders->reserve(res.num_rows());
00078 StoreQueryResult::const_iterator it;
00079
00080 for (it = res.begin(); it != res.end(); it++){
00081 Row row = *it;
00082 orders->push_back(new Order(row));
00083 }
00084 }
00085 } catch (std::exception &e) {
00086 cerr << "an error occurred: " << e.what() << endl;
00087 }
00088
00089 return *orders;
00090 }
00091
00092 map<int, int>& Order::products()
00093 {
00094 map<int, int> *prd = NULL;
00095
00096 Database& db = Database::Instance();
00097
00098 try {
00099 Connection *conn = db.getConnection();
00100 Query q = conn->query();
00101 q << "SELECT * FROM order_details WHERE oid = "
00102 << valueForKey(KEY_ORD_OID);
00103
00104 StoreQueryResult res = q.store();
00105 if (!res.empty()) {
00106 prd = new map<int, int>;
00107 StoreQueryResult::const_iterator it;
00108
00109 for (it = res.begin(); it != res.end(); it++){
00110 Row row = *it;
00111 int key = atoi(row["pid"]);
00112 int qty = atoi(row["qty"]);
00113 (*prd)[key] = qty;
00114 }
00115 }
00116 } catch (std::exception &e) {
00117 cerr << "an error occurred: " << e.what() << endl;
00118 }
00119
00120 return *prd;
00121 }
00122
00123 string Order::primaryKey()
00124 {
00125 return KEY_ORD_OID;
00126 }
00127
00128 ostream& operator<<(ostream& aStream, Order & o) {
00129 return aStream << "ORDER DETAIL\n" <<
00130 "Buyer : " << o._user->fullName() << endl <<
00131 "Date : " << o.valueForKey(KEY_ORD_DATE) << endl <<
00132 "Total : " << o.valueForKey(KEY_ORD_TOTAL) << endl;
00133 }
00134
00135