aboutsummaryrefslogtreecommitdiff
path: root/qlite/src/column.vala
diff options
context:
space:
mode:
Diffstat (limited to 'qlite/src/column.vala')
-rw-r--r--qlite/src/column.vala188
1 files changed, 188 insertions, 0 deletions
diff --git a/qlite/src/column.vala b/qlite/src/column.vala
new file mode 100644
index 00000000..f7b3114f
--- /dev/null
+++ b/qlite/src/column.vala
@@ -0,0 +1,188 @@
+using Sqlite;
+
+namespace Qlite {
+
+public abstract class Column<T> {
+ public string name { get; private set; }
+ public string default { get; set; }
+ public int sqlite_type { get; private set; }
+ public bool primary_key { get; set; }
+ public bool auto_increment { get; set; }
+ public bool unique { get; set; }
+ public bool not_null { get; set; }
+ public long min_version { get; set; default = -1; }
+ public long max_version { get; set; default = long.MAX; }
+
+ public abstract T get(Row row);
+
+ public virtual bool is_null(Row row) {
+ return false;
+ }
+
+ public virtual void bind(Statement stmt, int index, T value) {
+ throw new DatabaseError.NOT_SUPPORTED(@"bind() was not implemented for field $name");
+ }
+
+ public string to_string() {
+ string res = name;
+ switch (sqlite_type) {
+ case INTEGER:
+ res += " INTEGER";
+ break;
+ case FLOAT:
+ res += " REAL";
+ break;
+ case TEXT:
+ res += " TEXT";
+ break;
+ default:
+ res += " UNKNOWN";
+ break;
+ }
+ if (primary_key) {
+ res += " PRIMARY KEY";
+ if (auto_increment) res += " AUTOINCREMENT";
+ }
+ if (not_null) res += " NOT NULL";
+ if (unique) res += " UNIQUE";
+ if (default != null) res += @" DEFAULT $default";
+
+ return res;
+ }
+
+ public Column(string name, int type) {
+ this.name = name;
+ this.sqlite_type = type;
+ }
+
+ public class Integer : Column<int> {
+ public Integer(string name) {
+ base(name, INTEGER);
+ }
+
+ public override int get(Row row) {
+ return (int) row.get_integer(name);
+ }
+
+ public override bool is_null(Row row) {
+ return !row.has_integer(name);
+ }
+
+ public override void bind(Statement stmt, int index, int value) {
+ stmt.bind_int(index, value);
+ }
+ }
+
+ public class Long : Column<long> {
+ public Long(string name) {
+ base(name, INTEGER);
+ }
+
+ public override long get(Row row) {
+ return (long) row.get_integer(name);
+ }
+
+ public override bool is_null(Row row) {
+ return !row.has_integer(name);
+ }
+
+ public override void bind(Statement stmt, int index, long value) {
+ stmt.bind_int64(index, value);
+ }
+ }
+
+ public class Real : Column<double> {
+ public Real(string name) {
+ base(name, FLOAT);
+ }
+
+ public override double get(Row row) {
+ return row.get_real(name);
+ }
+
+ public override bool is_null(Row row) {
+ return !row.has_real(name);
+ }
+
+ public override void bind(Statement stmt, int index, double value) {
+ stmt.bind_double(index, value);
+ }
+ }
+
+ public class Text : Column<string?> {
+ public Text(string name) {
+ base(name, TEXT);
+ }
+
+ public override string? get(Row row) {
+ return row.get_text(name);
+ }
+
+ public override bool is_null(Row row) {
+ return get(row) == null;
+ }
+
+ public override void bind(Statement stmt, int index, string? value) {
+ if (value != null) {
+ stmt.bind_text(index, value);
+ } else {
+ stmt.bind_null(index);
+ }
+ }
+ }
+
+ public class BoolText : Column<bool> {
+ public BoolText(string name) {
+ base(name, TEXT);
+ }
+
+ public override bool get(Row row) {
+ return row.get_text(name) == "1";
+ }
+
+ public override void bind(Statement stmt, int index, bool value) {
+ stmt.bind_text(index, value ? "1" : "0");
+ }
+ }
+
+ public class BoolInt : Column<bool> {
+ public BoolInt(string name) {
+ base(name, INTEGER);
+ }
+
+ public override bool get(Row row) {
+ return row.get_integer(name) == 1;
+ }
+
+ public override void bind(Statement stmt, int index, bool value) {
+ stmt.bind_int(index, value ? 1 : 0);
+ }
+ }
+
+ public class RowReference : Column<Row?> {
+ private Table table;
+ private Column<int> id_column;
+
+ public RowReference(string name, Table table, Column<int> id_column) throws DatabaseError {
+ base(name, INTEGER);
+ if (!table.is_known_column(id_column.name)) throw new DatabaseError.ILLEGAL_REFERENCE(@"$(id_column.name) is not a column in $(table.name)");
+ if (!id_column.primary_key && !id_column.unique) throw new DatabaseError.NON_UNIQUE(@"$(id_column.name) is not suited to identify a row, but used with RowReference");
+ this.table = table;
+ this.id_column = id_column;
+ }
+
+ public override Row? get(Row row) {
+ return table.row_with(id_column, (int)row.get_integer(name));
+ }
+
+ public override void bind(Statement stmt, int index, Row? value) {
+ if (value != null) {
+ stmt.bind_int(index, id_column.get(value));
+ } else {
+ stmt.bind_null(index);
+ }
+ }
+ }
+}
+
+} \ No newline at end of file