about summary refs log tree commit diff stats
path: root/src/server
diff options
context:
space:
mode:
authorChristian Krinitsin <mail@krinitsin.com>2025-03-21 16:33:37 +0100
committerChristian Krinitsin <mail@krinitsin.com>2025-03-21 16:33:37 +0100
commit435ffba7c3005e643a8d6f7fed54d0f556ee2ad7 (patch)
tree115e7af89ed5a83ed5433bbc5d306a4e263fdbd1 /src/server
parentf1af8679481cfc4199b6423d723f67188145ea46 (diff)
downloadBT-Programming-Assignment-435ffba7c3005e643a8d6f7fed54d0f556ee2ad7.tar.gz
BT-Programming-Assignment-435ffba7c3005e643a8d6f7fed54d0f556ee2ad7.zip
get response for every operation and print it
Diffstat (limited to 'src/server')
-rw-r--r--src/server/hashtable.h13
-rw-r--r--src/server/shared_memory_server.h44
2 files changed, 45 insertions, 12 deletions
diff --git a/src/server/hashtable.h b/src/server/hashtable.h
index 786d8f5..2538e76 100644
--- a/src/server/hashtable.h
+++ b/src/server/hashtable.h
@@ -6,6 +6,7 @@
 #include <mutex>
 #include <optional>
 #include <shared_mutex>
+#include <sstream>
 #include <vector>
 
 template <typename K, typename V>
@@ -65,18 +66,22 @@ public:
         return false;
     }
 
-    void print()
+    std::string string()
     {
+        std::ostringstream output;
+
         size_t index { 0 };
         for (auto bucket : table) {
-            std::cout << "Bucket " << index << ": [";
+            output << "Bucket " << index << ": [";
             std::shared_lock<std::shared_mutex> lock(bucket_mutexes.at(index));
             for (auto pair : bucket) {
-                std::cout << "(" << pair.first << ", " << pair.second << ")";
+                output << "(" << pair.first << ", " << pair.second << ")";
             }
-            std::cout << "]" << "\n";
+            output << "]" << "\n";
             ++index;
         }
+
+        return output.str();
     }
 
 private:
diff --git a/src/server/shared_memory_server.h b/src/server/shared_memory_server.h
index 74abedf..d50797c 100644
--- a/src/server/shared_memory_server.h
+++ b/src/server/shared_memory_server.h
@@ -57,33 +57,61 @@ public:
 
             switch (request->type) {
             case INSERT:
-                std::cout << "Inserting" << '\n';
-                hash_table.insert(key, value);
+                std::cout << "Insert operation" << '\n';
+                if (hash_table.insert(key, value)) {
+                    strncpy(
+                        request->response,
+                        serialize<std::string>("Inserted successfully").c_str(),
+                        MAX_VALUE_SIZE);
+                } else {
+                    strncpy(
+                        request->response,
+                        serialize<std::string>("Key is already available").c_str(),
+                        MAX_VALUE_SIZE);
+                }
                 break;
             case GET: {
-                std::cout << "Getting" << '\n';
+                std::cout << "Get operation" << '\n';
                 hash_table.insert(key, value);
                 std::optional<V> result = hash_table.get(key);
                 if (result.has_value()) {
                     std::string response = serialize<V>(result.value());
                     strncpy(request->response, response.c_str(), MAX_VALUE_SIZE);
-                    pthread_cond_signal(&shared_memory->cond_var);
+                } else {
+                    strncpy(
+                        request->response,
+                        serialize<std::string>("Couldn't get any value").c_str(),
+                        MAX_VALUE_SIZE);
                 }
                 break;
             }
             case DELETE:
-                std::cout << "Deleting" << '\n';
-                hash_table.remove(key);
+                std::cout << "Remove operation" << '\n';
+                if (hash_table.remove(key)) {
+                    strncpy(
+                        request->response,
+                        serialize<std::string>("Key successfully deleted").c_str(),
+                        MAX_VALUE_SIZE);
+                } else {
+                    strncpy(
+                        request->response,
+                        serialize<std::string>("Couldn't find key'").c_str(),
+                        MAX_VALUE_SIZE);
+                }
                 break;
             case PRINT:
-                std::cout << "Printing" << '\n';
-                hash_table.print();
+                std::cout << "Print operation" << '\n';
+                strncpy(
+                    request->response,
+                    serialize<std::string>(hash_table.string()).c_str(),
+                    MAX_VALUE_SIZE);
                 break;
             default:
                 break;
             }
             shared_memory->tail = (1 + shared_memory->tail) % QUEUE_SIZE;
             shared_memory->full = false;
+            pthread_cond_signal(&shared_memory->cond_var);
             pthread_mutex_unlock(&shared_memory->mutex);
         }
     }