aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--frontend/DB.cpp24
-rw-r--r--frontend/DB.h47
-rw-r--r--frontend/GameData.cpp26
3 files changed, 88 insertions, 9 deletions
diff --git a/frontend/DB.cpp b/frontend/DB.cpp
index d51601e..28fd164 100644
--- a/frontend/DB.cpp
+++ b/frontend/DB.cpp
@@ -20,9 +20,9 @@ DBStatement DB::prepare(const string & query) {
return DBStatement(*this, query);
}
-DBStatement::DBStatement(DB & db, const string & query) : db(db) {
+DBStatement::DBStatement(DB & parent, const string & query) : parent(parent) {
sqlite3_stmt * stmt = NULL;
- int ret = sqlite3_prepare_v2(this->db.db.get(), query.c_str(), query.size(), &stmt, NULL);
+ int ret = sqlite3_prepare_v2(this->parent.db.get(), query.c_str(), query.size(), &stmt, NULL);
this->stmt = {
stmt,
[] (sqlite3_stmt * stmt) {
@@ -62,3 +62,23 @@ void DBStatement::execute() {
throw Exception("sqlite3_step: %d", ret);
}
+DBQueryRow DBStatement::row() {
+ int ret = sqlite3_step(this->stmt.get());
+ if (ret != SQLITE_ROW)
+ throw Exception("sqlite3_step: %d", ret);
+
+ return { *this };
+}
+
+DBQueryRow::DBQueryRow(DBStatement & parent) : parent(parent) { }
+
+template <>
+const char * DBQueryRow::col<const char*>(int index) {
+ return reinterpret_cast<const char *>(sqlite3_column_text(this->parent.stmt.get(), index));
+}
+
+template <>
+int DBQueryRow::col<int>(int index) {
+ return sqlite3_column_int(this->parent.stmt.get(), index);
+}
+
diff --git a/frontend/DB.h b/frontend/DB.h
index 5c88940..77b3f7a 100644
--- a/frontend/DB.h
+++ b/frontend/DB.h
@@ -5,9 +5,49 @@
#include <sqlite3.h>
class DB;
+class DBStatement;
+
+class DBQueryRow {
+public:
+ DBQueryRow(DBStatement &);
+
+public:
+ template <typename T>
+ T col(int index);
+
+private:
+ DBStatement & parent;
+};
+
+// class DBQueryRowRange {
+// public:
+// DBQueryRowRange();
+//
+// private:
+// class DBQueryRowIterator {
+// public:
+// DBQueryRowIterator(DBQueryRow & row);
+//
+// public:
+// DBQueryRow & operator * () const;
+// DBQueryRowIterator & operator ++ ();
+// bool operator != (const DBQueryRowIterator &) const;
+//
+// private:
+// DBQueryRow & row;
+// };
+//
+// public:
+// DBQueryRowIterator begin() const;
+// DBQueryRowIterator end() const;
+//
+// private:
+// DBQueryRow row;
+// };
class DBStatement {
- std::unique_ptr<sqlite3_stmt, std::function<void(sqlite3_stmt*)>> stmt;
+ friend class DBQueryRow;
+
public:
DBStatement(DB &, const std::string & query);
@@ -17,10 +57,13 @@ public:
DBStatement & bind(const int & number);
public:
void execute();
+ DBQueryRow row();
+ // DBQueryRowRange rows();
private:
+ std::unique_ptr<sqlite3_stmt, std::function<void(sqlite3_stmt*)>> stmt;
int param_index = 1;
- DB & db;
+ DB & parent;
};
class DB {
diff --git a/frontend/GameData.cpp b/frontend/GameData.cpp
index 0cf6a1d..b036695 100644
--- a/frontend/GameData.cpp
+++ b/frontend/GameData.cpp
@@ -1,4 +1,5 @@
#include <memory>
+#include <unordered_map>
#include "backend/Enemy.h"
#include "backend/EnemyFactory.h"
@@ -23,13 +24,28 @@ Enemy * GameData::create_enemy(const string & name) {
return enemy;
}
+static const unordered_map<string, ObjectType> type_map = {
+ { "teleportatiedrank", ObjectType::CONSUMABLE },
+ { "ervaringsdrank", ObjectType::CONSUMABLE },
+ { "levenselixer", ObjectType::CONSUMABLE },
+ { "wapenrusting", ObjectType::ARMOR },
+ { "wapen", ObjectType::WEAPON },
+ { "goudstukken", ObjectType::GOLD },
+};
+
Object * GameData::create_object(const string & name) {
- DBStatement query = this->db->prepare("select type from Objecten where naam = ?");
+ DBStatement query = this->db->prepare("select type, omschrijving from Objecten where naam = ?");
query.bind(name);
- // TODO: uhhhhhhhhh data ophalen
-
- Object * object = ObjectFactory::create_object();
- return object;
+
+ try {
+ auto row = query.row();
+ string type = row.col<const char *>(0);
+ const char * description = row.col<const char *>(1);
+ if (!type_map.contains(type)) throw std::exception();
+ return ObjectFactory::create_object(type_map.at(type), name.c_str(), description);
+ } catch (...) {
+ return ObjectFactory::create_object(name.c_str());
+ }
}
void GameData::leaderbord_add(const string & name, unsigned int gold) {