public class Database { public string feeds_table = "feeds"; public string items_table = "items"; public struct Field { string name; string val; } private Sqlite.Database db; private string db_name = "speedyrss"; public Database() { int rc; rc = Sqlite.Database.open(this.db_name + ".db", out this.db); if (rc != Sqlite.OK) { stderr.printf("Cannot open database: %d, %s", rc, db.errmsg ()); } } public void insert(string table, Field[] fields) { string query = "INSERT INTO " + table + " ("; foreach (Field data in fields) { query += data.name + ", "; } // remove ", " after latest name query = query[0:-2]; query += ") VALUES ("; foreach (Field data in fields) { query += "'" + validate(data.val) + "', "; } // remove ", " after latest name query = query[0:-2]; query += ");"; this.exec(query); } public void update(string table, Field[] fields, string id) { string query = "UPDATE " + table + " SET "; foreach (Field data in fields) { query += data.name + " = '" + validate(data.val) + "', "; } // remove ", " after latest name query = query[0:-2]; query += " WHERE id = '" + id + "';"; this.exec(query); } public void remove(string table, Field field) { string query = "DELETE FROM " + table + " WHERE " + field.name + " = '" + validate(field.val) + "';"; this.exec(query); } public Field[,] search(string table, Field field) { string query = "SELECT * FROM " + table + " WHERE " + field.name + " = '" + validate(field.val) + "';"; Field[,] fields = this.prepare(query); return fields; } public Field[,] prepare(string query) { int rc, row = 0, col, cols; Sqlite.Statement stmt; stderr.printf("Prepare: %s\n", query); rc = this.db.prepare(query, -1, out stmt, null); if (rc != Sqlite.OK) { stderr.printf("SQL error: %d, %s\n", rc, this.db.errmsg()); } cols = stmt.column_count(); stderr.printf("DB - Cols: %d\n", cols); // init array Field[,] fields = {}; do { rc = stmt.step(); switch (rc) { case Sqlite.DONE: break; case Sqlite.ROW: for (col = 0; col < cols; col++) { fields[row,cols] = Field() { name = stmt.column_name(col), val = stmt.column_text(col) }; } // row read row++; break; default: stderr.printf("Error: %d, %s\n", rc, db.errmsg()); break; } } while (rc == Sqlite.ROW); if (row != 0) { return fields; } else { return null; } } public void exec(string query) { int rc; stderr.printf("Exec: %s\n", query); rc = this.db.exec(query, null, null); if (rc != Sqlite.OK) { stderr.printf("SQL error: %d, %s\n", rc, this.db.errmsg()); } } private string validate(string val) { // eliminate SQL injection val.replace("'", "\\'"); return val; } }