3
3
using namespace sqlite ;
4
4
using namespace std ;
5
5
6
+ /*
7
+ template <typename T>
8
+ struct function_traits
9
+ : public function_traits<decltype(&T::operator())>
10
+ {};
11
+
12
+ template <typename ClassType, typename ReturnType, typename... Args>
13
+ struct function_traits<ReturnType(ClassType::*)(Args...) const>
14
+ // we specialize for pointers to member function
15
+ {
16
+ enum { arity = sizeof...(Args) };
17
+ // arity is the number of arguments.
18
+
19
+ typedef ReturnType result_type;
20
+
21
+ template <size_t i>
22
+ struct arg
23
+ {
24
+ typedef typename std::tuple_element<i, std::tuple<Args...>>::type type;
25
+ // the i-th argument is equivalent to the i-th tuple element of a tuple
26
+ // composed of those arguments.
27
+ };
28
+ };
29
+
30
+ class database_bind {};
31
+
32
+ template<int N>
33
+ class A {
34
+ template<typename F>
35
+ static void run(F l);
36
+ };
37
+
38
+ template<>
39
+ struct A<1> {
40
+ template<typename F>
41
+ static void run(F l) {
42
+ typedef function_traits<decltype(l)> traits;
43
+ typedef typename traits::arg<0>::type type_1;
44
+
45
+ type_1 col_1;
46
+ get_from_db(0,col_1);
47
+
48
+ l(col_1);
49
+ }
50
+ };
51
+ template<>
52
+ struct A<2> {
53
+ template<typename F>
54
+ static void run(F l) {
55
+ typedef function_traits<decltype(l)> traits;
56
+ typedef typename traits::arg<0>::type type_1;
57
+ typedef typename traits::arg<1>::type type_2;
58
+
59
+ type_1 col_1;
60
+ type_2 col_2;
61
+ get_from_db(0,col_1);
62
+ get_from_db(1,col_2);
63
+
64
+ l(col_1, col_2);
65
+ }
66
+ };
67
+
68
+
69
+ void get_from_db(int col_inx, string& str){
70
+ // code to get a column from with col_inx from the database
71
+ // for simplicity
72
+ str = "str_col";
73
+ }
74
+ void get_from_db(int col_inx, int& i){
75
+ // just for simplicity
76
+ i = 12;
77
+ }
78
+
79
+
80
+ template<typename F>
81
+ void operator>>(database_bind dbb, F l)
82
+ {
83
+ typedef function_traits<decltype(l)> traits;
84
+ A<traits::arity>::run(l);
85
+ }
86
+
87
+ */
88
+
6
89
int main (){
7
90
try {
8
91
// creates a database file 'dbfile.db' if not exists
9
92
database db (" dbfile.db" );
10
93
11
94
// executes the query and creates a 'user' table
12
95
db <<
13
- " create table user ("
96
+ " create table if not exists user ("
14
97
" age int,"
15
98
" name text,"
16
99
" weight real"
17
100
" );" ;
18
101
19
102
// inserts a new user and binds the values to ?
20
- // note that only types allowed for bindings are
21
- // 1 - numeric types( int ,long , long long, float, double , ... )
22
- // 2 - string , wstring
103
+ // note that only types allowed for bindings are :
104
+ // int ,long, long long, float, double
105
+ // string , wstring
23
106
db << " insert into user (age,name,weight) values (?,?,?);"
24
107
<< 20
25
108
<< " bob"
26
109
<< 83.0 ;
27
110
28
111
db << " insert into user (age,name,weight) values (?,?,?);"
29
112
<< 21
30
- << L" jak "
113
+ << L" jack "
31
114
<< 68.5 ;
32
115
33
116
// slects from table user on a condition ( age > 18 ) and executes
34
- // the body of magid_mapper for every row returned .
35
- // node : magic_mapper is just a simple macro , the next sample is
36
- // equivalent to this one without the use of magic_mapper macro
117
+ // the lambda for every row returned .
118
+
37
119
db << " select age,name,weight from user where age > ? ;"
38
120
<< 18
39
- >> magic_mapper (int age, string name, double weight) {
121
+ >> [&] (int age, string name, double weight) {
40
122
cout << age << ' ' << name << ' ' << weight << endl;
41
123
};
42
124
43
- db << " select age,name,weight from user where age > ? ;"
44
- << 18
45
- >> function<void (int ,string,double )>([&](int age, string name, double weight) {
46
- cout << age << ' ' << name << ' ' << weight << endl;
47
- });
48
-
49
- // i am currently working on a solution to avoid magic mapper
50
- // i future i want to this syntax also work
51
- /*
52
- db << "select age,name,weight from user where age > ? ;"
53
- << 18
54
- >> [&](int age, string name, double weight) {
55
- cout << age << ' ' << name << ' ' << weight << endl;
56
- };
57
- */
125
+ // selects the count(*) of table user
126
+ // note that you can extract a single culumn single row answer only to : int,long,long,float,double,string,wstring
127
+ int count = 0 ;
128
+ db << " select count(*) from user" >> count;
129
+ cout << " cout : " << count << endl;
58
130
131
+ // this also works and the returned value will automatically converted to string
132
+ string scount;
133
+ db << " select count(*) from user" >> scount;
134
+ cout << " scount : " << scount << endl;
59
135
}
60
136
catch (exception& e){
61
137
cout << e.what () << endl;
62
138
}
139
+
63
140
}
0 commit comments