abstracted creating a log. added "ADDUPC" records
authorJacob Parker <j3parker@uwaterloo.ca>
Fri, 11 Nov 2011 00:20:01 +0000 (19:20 -0500)
committerJacob Parker <j3parker@uwaterloo.ca>
Fri, 11 Nov 2011 00:20:01 +0000 (19:20 -0500)
database/db.cpp
database/db.h
database/log.cpp
database/log.h

index c22063c..4926808 100644 (file)
@@ -75,6 +75,11 @@ void PosDb::acceptLogEntry(const LogEntry & l) {
     break;
   }
 
+  case ET_ADDUPC: {
+    upc_to_name[l.AddUPC.upc] = l.AddUPC.name;
+    break;
+  }
+
        case ET_REVERT: {
                sto_it q = serial_to_object.find(l.Revert.revert_serial);
                if((q == serial_to_object.end()) || (q->second.type != ET_TRANS)) {
@@ -146,15 +151,11 @@ uint64_t PosDb::associateHash(const SHA1Hash & hash, uint32_t account) {
        if(getAccountFromHash(hash)) {
                return 0;
        } else {
-               LogEntry l;
-               memset(&l, 0, sizeof(LogEntry));
-               l.ts = (uint64_t)time(NULL);
-               l.type = ET_HASH;
+    LogEntry l = log.newLogEntry(ET_HASH);
                l.HashChange.uid = account;
                l.HashChange.add = true;
                hash.get((unsigned char *)l.HashChange.hash);
 
-               l.serial = log.nextSerial();
                acceptLogEntry(l);
                return log.writeEntry(l);
        }
@@ -171,17 +172,13 @@ uint64_t PosDb::deassociateHash(const SHA1Hash & hash) {
        if(!acct) {
                return 0;
        } else {
-               LogEntry l;
-               memset(&l, 0, sizeof(LogEntry));
-    l.ts = (uint64_t)time(NULL);
-                l.type = ET_HASH;
-                l.HashChange.uid = acct;
-                l.HashChange.add = false;
-                hash.get((unsigned char *)l.HashChange.hash);
-
-               l.serial = log.nextSerial();
-                acceptLogEntry(l);
-                return log.writeEntry(l);
+    LogEntry l = log.newLogEntry(ET_HASH);
+    l.HashChange.uid = acct;
+    l.HashChange.add = false;
+    hash.get((unsigned char *)l.HashChange.hash);
+
+    acceptLogEntry(l);
+    return log.writeEntry(l);
        }
 }
 
@@ -194,17 +191,16 @@ int32_t PosDb::getUPCPrice(UPC upc) {
 }
 
 uint64_t PosDb::setUPCPrice(UPC upc, int32_t price) {
-  LogEntry l;
-  memset(&l, 0, sizeof(LogEntry));
-  l.ts = (uint64_t)time(NULL);
-  l.type = ET_PRICE;
+  LogEntry l = log.newLogEntry(ET_PRICE);
   l.PriceChange.upc = upc;
   l.PriceChange.price = price;
-  l.serial = log.nextSerial();
+
   acceptLogEntry(l);
   return log.writeEntry(l);
 }
 
+// NOTE: this in theory could be deprecated. The client should
+//       probably get the uid from the hash before doing a transaction.
 uint64_t PosDb::doTransaction(const SHA1Hash & hash, int32_t delta) {
        // verify hash associated with something
        uint32_t acct = getAccountFromHash(hash);
@@ -212,28 +208,20 @@ uint64_t PosDb::doTransaction(const SHA1Hash & hash, int32_t delta) {
        if(!acct) {
                return 0;
        } else {
-               LogEntry l;
-               memset(&l, 0, sizeof(LogEntry));
-                l.ts = (uint64_t)time(NULL);
-                l.type = ET_TRANS;
+    LogEntry l = log.newLogEntry(ET_TRANS);
                l.Transaction.delta = delta;
                l.Transaction.uid = acct;
 
-               l.serial = log.nextSerial();
                acceptLogEntry(l);
                return log.writeEntry(l);
        }
 }
 
 uint64_t PosDb::doTransaction(const uint32_t account, int32_t delta) {
-       LogEntry l;
-       memset(&l, 0, sizeof(LogEntry));
-       l.ts = (uint64_t)time(NULL);
-       l.type = ET_TRANS;
+  LogEntry l = log.newLogEntry(ET_TRANS);
        l.Transaction.delta = delta;
        l.Transaction.uid = account;
 
-       l.serial = log.nextSerial();
        acceptLogEntry(l);
        return log.writeEntry(l);
 }
@@ -255,13 +243,9 @@ uint64_t PosDb::revertTransaction(uint64_t serial) {
                if(p != serial_to_object.end())
                        return 0;
 
-               LogEntry l;
-               memset(&l, 0, sizeof(LogEntry));
-               l.ts = (uint64_t)time(NULL);
-               l.type = ET_REVERT;
+    LogEntry l = log.newLogEntry(ET_REVERT);
                l.Revert.revert_serial = serial;
 
-               l.serial = log.nextSerial();
                acceptLogEntry(l);
                return log.writeEntry(l);
        }
@@ -276,19 +260,30 @@ int32_t PosDb::getStock(UPC upc) {
 }
 
 uint64_t PosDb::doStockChange(UPC upc, int32_t delta) {
-       LogEntry l;
-       memset(&l, 0, sizeof(LogEntry));
-       l.ts = (uint64_t)time(NULL);
-       l.type = ET_SALE;
+  LogEntry l = log.newLogEntry(ET_SALE);
        l.StockChange.delta = delta;
        l.StockChange.upc = upc;
 
-       l.serial = log.nextSerial();
        acceptLogEntry(l);
        return log.writeEntry(l);
 }
 
-std::vector<std::string> PosDb::toString() {
+std::string PosDb::getUPCName(UPC upc) {
+  std::map<UPC, std::string>::iterator it = upc_to_name.find(upc);
+  if(it == upc_to_name.end()) return "UNKNOWN UPC";
+  return upc_to_name[upc];
+}
 
+
+uint64_t PosDb::setUPCName (UPC upc, std::string name) {
+  LogEntry l = log.newLogEntry(ET_ADDUPC);
+  l.AddUPC.upc = upc;
+  strncpy(l.AddUPC.name, name.c_str(), 32);
+  l.AddUPC.name[32] = 0;
+
+  acceptLogEntry(l);
+  return log.writeEntry(l);
+}
+std::vector<std::string> PosDb::toString() {
   return log.toString();
 }
index beb4f65..6af9571 100644 (file)
@@ -22,17 +22,20 @@ public:
        uint64_t associateHash(const SHA1Hash & hash, std::string account);
        uint64_t deassociateHash(const SHA1Hash & hash);
 
-  int32_t getUPCPrice(UPC upc);
-  uint64_t setUPCPrice(UPC upc, int32_t price);
-
        uint64_t doTransaction(const SHA1Hash & hash, int32_t delta);
        uint64_t doTransaction(const uint32_t account, int32_t delta);
        uint64_t doTransaction(std::string account, int32_t delta);
        uint64_t revertTransaction(uint64_t serial);
 
-       int32_t getStock(UPC upc);
+  int32_t getUPCPrice(UPC upc);
+  uint64_t setUPCPrice(UPC upc, int32_t price);
+
+  int32_t getStock(UPC upc);
        uint64_t doStockChange(UPC upc, int32_t delta);
 
+  std::string getUPCName(UPC upc);
+  uint64_t setUPCName (UPC upc, std::string name);
+
   std::vector<std::string> toString();
 
 private:
@@ -43,6 +46,7 @@ private:
 
        std::map<UPC, int32_t, UPCLess> upc_to_stock;
   std::map<UPC, int32_t, UPCLess> upc_to_price;
+  std::map<UPC, std::string, UPCLess> upc_to_name;
 
        std::map<uint64_t, LogEntry> serial_to_object;
 
index db7de3e..34df55a 100644 (file)
@@ -24,7 +24,7 @@ Log::Log(const char * fn)
 }
 
 uint64_t Log::writeEntry(LogEntry ent)
-{              
+{
        FILE * fh = fopen(log_name.c_str(), "a");
        if(!fh) {
                fprintf(stderr, "Log: FATAL: Could not open log file '%s' for append. Aborting.\n", log_name.c_str());
@@ -69,6 +69,7 @@ std::string logTypeToString (E_OBJ_TYPE type) {
     case ET_HASH:   return "HASH";
     case ET_SALE:   return "SALE";
     case ET_PRICE:  return "PRICE";
+    case ET_ADDUPC: return "ADDUPC";
     case ET_REVERT: return "REVERT";
     default: fprintf(stderr, "logTypeToString: unhandled case in switch.\n"); abort();
   }
@@ -116,6 +117,10 @@ std::vector<std::string> Log::toString()
         out += ThingToString<uint64_t>(it->PriceChange.upc.l) + ThingToString<uint64_t>(it->PriceChange.upc.h) + "\t"
              + ThingToString<int32_t>(it->PriceChange.price);
         break;
+      case ET_ADDUPC:
+        out += ThingToString<uint64_t>(it->AddUPC.upc.l) + ThingToString<uint64_t>(it->AddUPC.upc.h) + "\t"
+             + it->AddUPC.name;
+        break;
       case ET_REVERT:
         out += ThingToString<uint64_t>(it->Revert.revert_serial);
         break;
@@ -126,3 +131,13 @@ std::vector<std::string> Log::toString()
   }
   return ans;
 }
+
+LogEntry Log::newLogEntry(E_OBJ_TYPE type) {
+  LogEntry l;
+  memset(&l, 0, sizeof(LogEntry));
+  l.ts = (uint64_t)time(NULL);
+  l.type = type;
+  l.serial = nextSerial();
+  return l;
+}
+
index 96bdbca..f58e20b 100644 (file)
@@ -6,7 +6,7 @@
 #include <string>
 #include <vector>
 
-enum E_OBJ_TYPE { ET_TRANS, ET_HASH, ET_SALE, ET_PRICE, ET_REVERT };
+enum E_OBJ_TYPE { ET_TRANS, ET_HASH, ET_SALE, ET_PRICE, ET_ADDUPC, ET_REVERT };
 
 struct __attribute__ ((packed)) UPC {
        uint64_t h, l;
@@ -49,6 +49,11 @@ struct __attribute__ ((aligned (64), packed)) LogEntry
       int32_t price;
     } PriceChange;
 
+    struct __attribute__ ((packed)) {
+      UPC upc;
+      char name[33];
+    } AddUPC;
+
                struct __attribute__ ((packed)) {
                        uint64_t revert_serial;
                } Revert;
@@ -60,9 +65,11 @@ public:
        Log(const char * fn);
        uint64_t writeEntry(LogEntry ent);
        uint64_t nextSerial();
+  LogEntry newLogEntry(E_OBJ_TYPE type);
 
   std::vector<std::string> toString();
 
+
        std::list<LogEntry>::const_iterator begin();
        std::list<LogEntry>::const_iterator end();