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/insert_builder.vala | 102 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 102 insertions(+) create mode 100644 qlite/src/insert_builder.vala (limited to 'qlite/src/insert_builder.vala') diff --git a/qlite/src/insert_builder.vala b/qlite/src/insert_builder.vala new file mode 100644 index 00000000..654935a6 --- /dev/null +++ b/qlite/src/insert_builder.vala @@ -0,0 +1,102 @@ +using Sqlite; + +namespace Qlite { + +public class InsertBuilder : StatementBuilder { + + // INSERT [OR ...] + private bool replace_val; + private string or_val; + + // INTO [...] + private Table table; + private string table_name; + + // VALUES [...] + private StatementBuilder.Field[] fields; + + protected InsertBuilder(Database db) { + base(db); + } + + public InsertBuilder replace() { + this.replace_val = true; + return this; + } + + public InsertBuilder or(string or) { + this.or_val = or; + return this; + } + + public InsertBuilder into(Table table) { + this.table = table; + this.table_name = table.name; + return this; + } + + public InsertBuilder into_name(string table) { + this.table_name = table; + return this; + } + + public InsertBuilder value(Column column, T value) { + if (fields == null) { + fields = { new StatementBuilder.Field(column, value) }; + } else { + StatementBuilder.Field[] fields_new = new StatementBuilder.Field[fields.length+1]; + for (int i = 0; i < fields.length; i++) { + fields_new[i] = fields[i]; + } + fields_new[fields.length] = new Field(column, value); + fields = fields_new; + } + return this; + } + + public InsertBuilder value_null(Column column) { + if (column.not_null) throw new DatabaseError.ILLEGAL_QUERY(@"Can't set non-null column $(column.name) to null"); + if (fields == null) { + fields = { new NullField(column) }; + } else { + StatementBuilder.Field[] fields_new = new StatementBuilder.Field[fields.length+1]; + for (int i = 0; i < fields.length; i++) { + fields_new[i] = fields[i]; + } + fields_new[fields.length] = new NullField(column); + fields = fields_new; + } + return this; + } + + public override Statement prepare() throws DatabaseError { + string fields_text = ""; + string value_qs = ""; + for (int i = 0; i < fields.length; i++) { + if (i != 0) { + value_qs += ", "; + fields_text += ", "; + } + fields_text += fields[i].column.name; + value_qs += "?"; + } + string sql = replace_val ? "REPLACE" : "INSERT"; + if (!replace_val && or_val != null) sql += @" OR $or_val"; + sql += @" INTO $table_name ( $fields_text ) VALUES ($value_qs)"; + Statement stmt = db.prepare(sql); + for (int i = 0; i < fields.length; i++) { + fields[i].bind(stmt, i+1); + } + return stmt; + } + + public int64 perform() throws DatabaseError { + if (prepare().step() != DONE) { + throw new DatabaseError.EXEC_ERROR(@"SQLite error: $(db.errcode()) - $(db.errmsg())"); + } + return db.last_insert_rowid(); + } + +} + +} \ No newline at end of file -- cgit v1.2.3-54-g00ecf