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 }