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 }