1 module utils.db; 2 3 import 4 std.typecons, 5 6 utils.except; 7 8 public import 9 utils.db.mysql, 10 utils.db.sqlite; 11 12 13 template query(T...) 14 { 15 auto query(R, A...)(R db, string sql, A args) if(is(R == SQLite) || is(R == MySQL)) 16 { 17 auto stmt = db.prepare(sql); 18 db.bind(stmt, args); 19 20 static if(T.length) 21 { 22 return db.process!T(stmt); 23 } 24 else 25 { 26 db.process(stmt); 27 return tuple!(`affected`, `lastId`)(db.affected(stmt), db.lastId(stmt)); 28 } 29 } 30 } 31 32 template queryOne(T...) 33 { 34 auto queryOne(R, A...)(R db, string sql, A args) if(is(R == SQLite) || is(R == MySQL)) 35 { 36 auto res = db.query!T(sql, args); 37 res.empty && throwError(`query returned no rows`); 38 39 auto e = res.front; 40 41 res.popFront; 42 res.empty || throwError(`query returned multiple rows`); 43 44 return e; 45 } 46 } 47 48 unittest 49 { 50 { 51 scope db = new SQLite(`:memory:`); 52 53 auto res = db.query!(uint, string)(`select ?, ?;`, 123, `hello`); 54 auto res2 = db.queryOne!uint(`select ?;`, 123); 55 } 56 57 { 58 MySQL db; 59 60 auto res = db.query!(uint, string)(`select ?, ?;`, 123, `hello`); 61 auto res2 = db.queryOne!uint(`select ?;`, 123); 62 } 63 }