From 56bc45ce4d07a7a9a415e9dc8ad2f7c3f3c9e48d Mon Sep 17 00:00:00 2001 From: fiaxh Date: Thu, 2 Mar 2017 15:37:32 +0100 Subject: Initial commit --- qlite/src/table.vala | 84 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 84 insertions(+) create mode 100644 qlite/src/table.vala (limited to 'qlite/src/table.vala') diff --git a/qlite/src/table.vala b/qlite/src/table.vala new file mode 100644 index 00000000..209a5a96 --- /dev/null +++ b/qlite/src/table.vala @@ -0,0 +1,84 @@ +using Sqlite; + +namespace Qlite { + +public class Table { + protected Database db; + public string name { get; private set; } + protected Column[] columns; + + public Table(Database db, string name) { + this.db = db; + this.name = name; + } + + public void init(Column[] columns) { + this.columns = columns; + } + + private void ensure_init() throws DatabaseError { + if (columns == null) throw new DatabaseError.NOT_INITIALIZED(@"Table $name was not initialized, call init()"); + } + + public QueryBuilder select(Column[]? columns = null) throws DatabaseError { + ensure_init(); + return db.select(columns).from(this); + } + + public InsertBuilder insert() throws DatabaseError { + ensure_init(); + return db.insert().into(this); + } + + public UpdateBuilder update() throws DatabaseError { + ensure_init(); + return db.update(this); + } + + public DeleteBuilder delete() throws DatabaseError { + ensure_init(); + return db.delete().from(this); + } + + public Row? row_with(Column column, T value) throws DatabaseError { + ensure_init(); + if (!column.unique && !column.primary_key) throw new DatabaseError.NON_UNIQUE(@"$(column.name) is not suited to identify a row, but used with row_with()"); + return select().with(column, "=", value).row(); + } + + public bool is_known_column(string column) throws DatabaseError { + ensure_init(); + foreach (Column c in columns) { + if (c.name == column) return true; + } + return false; + } + + public void create_table_at_version(long version) throws DatabaseError { + ensure_init(); + string sql = @"CREATE TABLE IF NOT EXISTS $name ("; + for(int i = 0; i < columns.length; i++) { + Column c = columns[i]; + if (c.min_version <= version && c.max_version >= version) { + sql += @"$(i > 0 ? "," : "") $c"; + } + } + sql += ")"; + db.exec(sql); + } + + public void add_columns_for_version(long old_version, long new_version) throws DatabaseError { + ensure_init(); + foreach (Column c in columns) { + if (c.min_version <= new_version && c.max_version >= new_version && c.min_version > old_version && c.max_version < old_version) { + db.exec(@"ALTER TABLE $name ADD COLUMN $c"); + } + } + } + + public void delete_columns_for_version(long old_version, long new_version) throws DatabaseError { + // TODO: Rename old table, create table at new_version, transfer data + } +} + +} \ No newline at end of file -- cgit v1.2.3-54-g00ecf