1 module uim.sql.tables.update;
2 
3 import uim.sql;
4 
5 class DSQLUpdate : DSQLUpdateStatement  {
6 	protected string _table;
7      
8 	this() { super(); }
9 	this(string tableName) { this(); table(tableName); }
10 	this(string tableName, string[string] values, string condition = "") { this(tableName); sets(values).where(condition); }
11 	this(string tableName, string value = "", string condition = "") { this(tableName); sets(value).where(condition); }
12 	this(string tableName, string[string] values, string[] conditions) { this(tableName); sets(values).where(conditions); }
13 	this(string tableName, string value, string[] conditions) { this(tableName); sets(value).where(conditions); }
14 
15 	auto table(string name) {
16 		if (name.length > 0) _table = name;
17 		return this;
18 	} 
19 
20 	protected string _sets;
21 	auto sets(string[string] values) { 
22 		string[] s;
23 		foreach(k, v; values) s ~= k~"="~v;
24 		return sets(s);
25 	}
26 	auto sets(string[] values...) { 
27 		return sets(values);
28 	}
29 	auto sets(string[] values) { 
30 		_sets = values.join(","); 
31 		return this;
32 	}
33 
34 	protected string _where;
35 	auto where(string[] conditions...) {
36 		return where(conditions);
37 	} 
38 	auto where(string[] conditions = null) {
39 		if (conditions.length > 0) _where = conditions.join(" AND ");
40 		return this;
41 	} 
42 
43     override string toSQL() {
44 		auto sql = "UPDATE "~_table~" SET "~_sets;
45 		if (_where.length > 0) sql ~= " WHERE "~_where;
46 		return sql;
47 	}
48 }
49 auto SQLUpdate() { return new DSQLUpdate(); }
50 auto SQLUpdate(string table) { return new DSQLUpdate(table); }
51 auto SQLUpdate(string table, string values, string condition = "") { return new DSQLUpdate(table, values, condition); }
52 auto SQLUpdate(string table, string values, string[] conditions) { return new DSQLUpdate(table, values, conditions); }
53 auto SQLUpdate(string table, string[string] values, string condition = "") { return new DSQLUpdate(table, values, condition); }
54 auto SQLUpdate(string table, string[string] values, string[] conditions) { return new DSQLUpdate(table, values, conditions); }
55 
56 unittest {
57 	writeln("Testing ", __MODULE__);
58 	
59 	assert(SQLUpdate("tab", "x = 1") == "UPDATE tab SET x = 1"); 
60 	assert(SQLUpdate.table("tab").sets("x = 1") == "UPDATE tab SET x = 1"); 
61 	assert(SQLUpdate.table("tab").sets("x = 1", "y = 2") == "UPDATE tab SET x = 1,y = 2"); 
62 	assert(SQLUpdate.table("tab").sets(["x = 1", "y = 2"]) == "UPDATE tab SET x = 1,y = 2"); 
63 
64 	assert(SQLUpdate("tab", "x = 1", "a > b") == "UPDATE tab SET x = 1 WHERE a > b"); 
65 	assert(SQLUpdate.table("tab").sets("x = 1").where("a > b") == "UPDATE tab SET x = 1 WHERE a > b"); 
66 	assert(SQLUpdate.table("tab").sets("x = 1", "y = 2").where("a > b") == "UPDATE tab SET x = 1,y = 2 WHERE a > b"); 
67 	assert(SQLUpdate.table("tab").sets(["x = 1", "y = 2"]).where("a > b") == "UPDATE tab SET x = 1,y = 2 WHERE a > b"); 
68 
69 	assert(SQLUpdate("tab", "x = 1", ["(a > b)", "(c < d)"]) == "UPDATE tab SET x = 1 WHERE (a > b) AND (c < d)"); 
70 	assert(SQLUpdate.table("tab").sets("x = 1").where(["(a > b)", "(c < d)"]) == "UPDATE tab SET x = 1 WHERE (a > b) AND (c < d)"); 
71 	assert(SQLUpdate.table("tab").sets("x = 1", "y = 2").where(["(a > b)", "(c < d)"]) == "UPDATE tab SET x = 1,y = 2 WHERE (a > b) AND (c < d)"); 
72 	assert(SQLUpdate.table("tab").sets(["x = 1", "y = 2"]).where(["(a > b)", "(c < d)"]) == "UPDATE tab SET x = 1,y = 2 WHERE (a > b) AND (c < d)"); 
73 }