summaryrefslogtreecommitdiffstats
path: root/db.vala
diff options
context:
space:
mode:
Diffstat (limited to 'db.vala')
-rw-r--r--db.vala299
1 files changed, 0 insertions, 299 deletions
diff --git a/db.vala b/db.vala
deleted file mode 100644
index 10687f4..0000000
--- a/db.vala
+++ /dev/null
@@ -1,299 +0,0 @@
-/* Copyright 2012, Sebastian Reichel <sre@ring0.de>
- *
- * Permission to use, copy, modify, and/or distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
- * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
- * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
- * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
- * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- */
-
-public struct StockEntry {
- public string id;
- public string name;
- public int amount;
- public string memberprice;
- public string guestprice;
-}
-
-public class Database {
- private Sqlite.Database db;
- private Sqlite.Statement product_stmt;
- private Sqlite.Statement products_stmt;
- private Sqlite.Statement purchase_stmt1;
- private Sqlite.Statement purchase_stmt2;
- private Sqlite.Statement undo_stmt1;
- private Sqlite.Statement undo_stmt2;
- private Sqlite.Statement undo_stmt3;
- private Sqlite.Statement stock_stmt1;
- private Sqlite.Statement stock_stmt2;
- private Sqlite.Statement price_stmt;
- private Sqlite.Statement stock_status_stmt;
- int32 user = 0;
- bool logged_in = false;
- private static string product_query = "SELECT name FROM products WHERE id = ?";
- private static string products_query = "SELECT id, name FROM products";
- private static string purchase_query1 = "INSERT INTO purchases ('user', 'product', 'timestamp') VALUES (?, ?, ?)";
- private static string purchase_query2 = "UPDATE products SET amount = amount - 1 WHERE id = ?";
- private static string undo_query1 = "SELECT product FROM purchases WHERE user = ? ORDER BY timestamp DESC LIMIT 1";
- private static string undo_query2 = "DELETE FROM purchases WHERE user = ? ORDER BY timestamp DESC LIMIT 1";
- private static string undo_query3 = "UPDATE products SET amount = amount + 1 WHERE id = ?";
- private static string stock_query1 = "INSERT INTO restock ('user', 'product', 'amount', 'timestamp') VALUES (?, ?, ?, ?)";
- private static string stock_query2 = "UPDATE products SET amount = amount + ? WHERE id = ?";
- private static string price_query = "SELECT memberprice, guestprice FROM prices WHERE product = ? AND valid_from <= ? ORDER BY valid_from DESC LIMIT 1";
- private static string stock_status_query = "SELECT id, name, amount, memberprice, guestprice FROM products, prices WHERE products.id = prices.product AND products.amount > 0 AND prices.valid_from = (SELECT valid_from FROM prices WHERE product = products.id ORDER BY valid_from DESC LIMIT 1)";
-
- public Database(string file) {
- int rc;
-
- rc = Sqlite.Database.open(file, out db);
- if(rc != Sqlite.OK) {
- error("could not open database!");
- }
-
- rc = this.db.prepare_v2(purchase_query1, -1, out purchase_stmt1);
- if(rc != Sqlite.OK) {
- error("could not prepare first purchase statement!");
- }
-
- rc = this.db.prepare_v2(purchase_query2, -1, out purchase_stmt2);
- if(rc != Sqlite.OK) {
- error("could not prepare second purchase statement!");
- }
-
- rc = this.db.prepare_v2(product_query, -1, out product_stmt);
- if(rc != Sqlite.OK) {
- error("could not prepare article statement!");
- }
-
- rc = this.db.prepare_v2(products_query, -1, out products_stmt);
- if(rc != Sqlite.OK) {
- error("could not prepare products statement!");
- }
-
- rc = this.db.prepare_v2(undo_query1, -1, out undo_stmt1);
- if(rc != Sqlite.OK) {
- error("could not prepare first undo statement!");
- }
-
- rc = this.db.prepare_v2(undo_query2, -1, out undo_stmt2);
- if(rc != Sqlite.OK) {
- error("could not prepare second undo statement!");
- }
-
- rc = this.db.prepare_v2(undo_query3, -1, out undo_stmt3);
- if(rc != Sqlite.OK) {
- error("could not prepare third undo statement!");
- }
-
- rc = this.db.prepare_v2(stock_query1, -1, out stock_stmt1);
- if(rc != Sqlite.OK) {
- error("could not prepare first stock statement!");
- }
-
- rc = this.db.prepare_v2(stock_query2, -1, out stock_stmt2);
- if(rc != Sqlite.OK) {
- error("could not prepare second stock statement!");
- }
-
- rc = this.db.prepare_v2(price_query, -1, out price_stmt);
- if(rc != Sqlite.OK) {
- error("could not prepare price statement!");
- }
-
- rc = this.db.prepare_v2(stock_status_query, -1, out stock_status_stmt);
- if(rc != Sqlite.OK) {
- error("could not prepare stock status statement!");
- }
- }
-
- public bool login(int32 id) {
- this.user = id;
- this.logged_in = true;
- return true;
- }
-
- public bool logout() {
- this.user = 0;
- this.logged_in = false;
- return true;
- }
-
- public Gee.HashMap<string,string> get_products() {
- var result = new Gee.HashMap<string,string>(null, null);
- this.products_stmt.reset();
-
- while(this.products_stmt.step() == Sqlite.ROW)
- result[this.products_stmt.column_text(0)] = this.products_stmt.column_text(1);
-
- return result;
- }
-
- public Gee.List<StockEntry?> get_stock() {
- var result = new Gee.ArrayList<StockEntry?>();
- this.stock_status_stmt.reset();
-
- while(this.stock_status_stmt.step() == Sqlite.ROW) {
- StockEntry entry = {
- this.stock_status_stmt.column_text(0),
- this.stock_status_stmt.column_text(1),
- this.stock_status_stmt.column_int(2),
- null,
- null
- };
-
- entry.memberprice = "%d.%02d€".printf(this.stock_status_stmt.column_int(3) / 100, this.stock_status_stmt.column_int(3) % 100);
- entry.guestprice = "%d.%02d€".printf(this.stock_status_stmt.column_int(4) / 100, this.stock_status_stmt.column_int(4) % 100);
-
- result.add(entry);
- }
-
- return result;
- }
-
- public bool buy(uint64 article) {
- if(is_logged_in()) {
- int rc = 0;
- int64 timestamp = (new DateTime.now_utc()).to_unix();
-
- this.purchase_stmt1.reset();
- this.purchase_stmt1.bind_text(1, "%d".printf(user));
- this.purchase_stmt1.bind_text(2, "%llu".printf(article));
- this.purchase_stmt1.bind_text(3, "%llu".printf(timestamp));
-
- rc = this.purchase_stmt1.step();
- if(rc != Sqlite.DONE)
- error("[interner Fehler: %d]".printf(rc));
-
- this.purchase_stmt2.reset();
- this.purchase_stmt2.bind_text(1, "%llu".printf(article));
-
- rc = this.purchase_stmt2.step();
- if(rc != Sqlite.DONE)
- error("[interner Fehler: %d]".printf(rc));
-
- return true;
- } else {
- return false;
- }
- }
-
- public string get_product_name(uint64 article) {
- this.product_stmt.reset();
- this.product_stmt.bind_text(1, "%llu".printf(article));
-
- int rc = this.product_stmt.step();
-
- switch(rc) {
- case Sqlite.ROW:
- return this.product_stmt.column_text(0);
- case Sqlite.DONE:
- return "unbekanntes Produkt: %llu".printf(article);
- default:
- return "[interner Fehler: %d]".printf(rc);
- }
- }
-
- public int get_product_price(uint64 article) {
- int64 timestamp = (new DateTime.now_utc()).to_unix();
- bool member = user != 0;
-
- this.price_stmt.reset();
- this.price_stmt.bind_text(1, "%llu".printf(article));
- this.price_stmt.bind_text(2, "%lld".printf(timestamp));
-
- int rc = this.price_stmt.step();
-
- switch(rc) {
- case Sqlite.ROW:
- if(member)
- return this.price_stmt.column_int(0);
- else
- return this.price_stmt.column_int(1);
- case Sqlite.DONE:
- write_to_log("unbekanntes Produkt: %llu\n", article);
- return 0;
- default:
- write_to_log("[interner Fehler: %d]\n", rc);
- return 0;
- }
- }
-
- public bool undo() {
- if(is_logged_in()) {
- uint64 pid = 0;
- int rc = 0;
-
- this.undo_stmt1.reset();
- this.undo_stmt1.bind_text(1, "%d".printf(user));
-
- rc = this.undo_stmt1.step();
- switch(rc) {
- case Sqlite.ROW:
- pid = uint64.parse(this.undo_stmt1.column_text(0));
- break;
- case Sqlite.DONE:
- write_to_log("undo not possible without purchases");
- return false;
- default:
- error("[interner Fehler: %d]".printf(rc));
- }
-
- this.undo_stmt2.reset();
- this.undo_stmt2.bind_text(1, "%d".printf(user));
-
- rc = this.undo_stmt2.step();
- if(rc != Sqlite.DONE)
- error("[interner Fehler: %d]".printf(rc));
-
- this.undo_stmt3.reset();
- this.undo_stmt3.bind_text(1, "%llu".printf(pid));
-
- rc = this.undo_stmt3.step();
- if(rc != Sqlite.DONE)
- error("[interner Fehler: %d]".printf(rc));
-
- return true;
- }
-
- return false;
- }
-
- public bool restock(uint64 product, uint64 amount) {
- if(is_logged_in()) {
- int rc = 0;
- int64 timestamp = (new DateTime.now_utc()).to_unix();
-
- this.stock_stmt1.reset();
- this.stock_stmt1.bind_text(1, "%d".printf(user));
- this.stock_stmt1.bind_text(2, "%llu".printf(product));
- this.stock_stmt1.bind_text(3, "%llu".printf(amount));
- this.stock_stmt1.bind_text(4, "%llu".printf(timestamp));
-
- rc = this.stock_stmt1.step();
- if(rc != Sqlite.DONE)
- error("[interner Fehler: %d]".printf(rc));
-
- this.stock_stmt2.reset();
- this.stock_stmt2.bind_text(1, "%llu".printf(amount));
- this.stock_stmt2.bind_text(2, "%llu".printf(product));
-
- rc = this.stock_stmt2.step();
- if(rc != Sqlite.DONE)
- error("[interner Fehler: %d]".printf(rc));
-
- return true;
- }
-
- return false;
- }
-
- public bool is_logged_in() {
- return this.logged_in;
- }
-}