Skip to content

Commit 6b7a999

Browse files
committed
poly (WIP), etc...
array util into nullable rows/results writeRow width ColumnSet/Columns/Column auto run query in statement if not run when rows accessed chars fix row level into into(Range) (WIP)
1 parent f27e73b commit 6b7a999

18 files changed

Lines changed: 1088 additions & 211 deletions

File tree

README.md

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -35,9 +35,8 @@ import std.database.mysql;
3535
auto db = createDatabase("mysql://127.0.0.1/test");
3636
auto con = db.connection();
3737
auto stmt = con.statement("select * from table");
38-
auto rowSet = stmt.query();
39-
auto range = stmt[];
40-
foreach (row; range) {
38+
auto rows = stmt.query.rows;
39+
foreach (row; rows) {
4140
for(size_t col = 0; col != row.columns; ++col) write(rowr[col]), " ");
4241
writeln();
4342
}
@@ -47,17 +46,17 @@ foreach (row; range) {
4746
```D
4847
import std.database.sqlite;
4948
createDatabase("file:///demo.sqlite")
50-
.connection()
49+
.connection
5150
.query("select * from t1")
52-
.writeResult();
51+
.writeRows;
5352
```
5453

5554
#### field access
5655
```D
5756
import std.database.sqlite;
5857
auto db = createDatabase("file:///testdb");
59-
auto rowSet = db.connection().query("select name,score from score");
60-
foreach (r; rowSet) {
58+
auto rows = db.connection.query("select name,score from score").rows;
59+
foreach (r; rows) {
6160
writeln(r[0].as!string,",",r[1].as!int);
6261
}
6362
```
@@ -67,9 +66,9 @@ foreach (r; rowSet) {
6766
import std.database.sqlite;
6867
int minScore = 50;
6968
createDatabase("file:///demo.sqlite")
70-
.connection()
69+
.connection
7170
.query("select * from t1 where score >= ?", minScore)
72-
.writeResult();
71+
.writeRows;
7372
```
7473

7574
#### insert with input binding

freetds/test.d

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,16 +24,16 @@ void dateTest() {
2424
con.query("drop table d1");
2525
con.query("create table d1(a date)");
2626
con.query("insert into d1 values ('2016-01-15')");
27-
auto rs = con.query("select * from d1");
28-
writeResult(rs[]);
27+
auto rows = con.query("select * from d1").rows;
28+
rows.writeRows;
2929
}
3030

3131
void example() {
3232
import std.database.freetds;
3333
//auto db = createDatabase("freetds://server/test?username=sa&password=admin");
3434
auto db = createDatabase("freetds://10.211.55.3:1433/test?username=sa&password=admin");
35-
auto result = db.query("SELECT 1,2,'abc'");
36-
foreach (r; result) {
35+
auto rows = db.query("SELECT 1,2,'abc'").rows;
36+
foreach (r; rows) {
3737
for(int c = 0; c != r.columns; ++c) writeln("column: ",c,", value: ",r[c].as!string);
3838
}
3939
}

mysql/test.d

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,19 +12,19 @@ unittest {
1212
testAll!DB("mysql");
1313

1414
//negativeNotExecuteTest();
15-
1615
}
1716

17+
1818
void negativeNotExecuteTest() {
1919
auto db = createDatabase("mysql://127.0.0.1/test");
2020
auto con = db.connection();
21-
//con.statement("select * from score").writeResult();
22-
con.statement("select * from score").writeResult();
21+
//con.statement("select * from score").writeRows;
22+
con.statement("select * from score").writeRows;
2323
}
2424

2525
unittest {
2626
//perf1();
27-
//con.query("select * from tuple").writeResult();
27+
//con.query("select * from tuple").writeRows;
2828
}
2929

3030
//auto db = createDatabase("mysql://127.0.0.1/test");

oracle/dub.json

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
],
99
"sourcePaths": [".", "../src"],
1010
"libs" : ["occi","clntsh"],
11-
"versions": ["StdLoggerDisableLogging"],
1211
"dependencies": {
1312
},
1413
"configurations": [

oracle/test.d

Lines changed: 4 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -17,33 +17,9 @@ unittest {
1717
/*
1818
auto database3 = createDatabase();
1919
auto database4 = std.database.oracle.createDatabase();
20-
*/
2120
2221
//auto database = Database!DefaultPolicy.create("oracle");
2322
//auto database = Database.create("oracle");
24-
25-
//auto database = database("oracle");
26-
//auto con = database.connection();
27-
28-
/*
29-
auto db = database("oracle");
30-
auto con = db.connection();
31-
32-
try {
33-
con.query("drop table t");
34-
} catch (Exception e) {
35-
}
36-
37-
con.query("create table t(name varchar(20), age int)");
38-
con.query("insert into t values('Bob',12)");
39-
con.query("insert into t values('Joe',9)");
40-
41-
con.statement("select * from t");
42-
//auto res = result(stmt);
43-
//writeResult(res);
44-
45-
//writeResultRange(stmt.range());
46-
writeResultRange(con.statement("select * from t").range());
4723
*/
4824

4925
}
@@ -71,12 +47,12 @@ void testArrayOutputBinding() {
7147
real[N] durationsUsecs;
7248

7349
foreach(i; 0..N) {
74-
auto rs = con.rowArraySize(100).query("select * from t1");
50+
auto rows = con.rowArraySize(100).query("select * from t1").rows;
7551
StopWatch sw;
7652
sw.start();
7753

7854
int s;
79-
foreach(r;rs) {
55+
foreach(r;rows) {
8056
s += r[0].as!int + r[1].as!int;
8157
}
8258

@@ -102,7 +78,7 @@ void dateTest() {
10278
con.query("drop table d1");
10379
con.query("create table d1(a date, b int)");
10480
con.query("insert into d1 values(to_date('2015/04/05','yyyy/mm/dd'), 123)");
105-
auto rs = con.query("select * from d1");
106-
assert(rs[].front()[0].as!Date == Date(2015,4,5));
81+
auto rows = con.query("select * from d1").rows;
82+
assert(rows.front()[0].as!Date == Date(2015,4,5));
10783
}
10884

poly/dub.json

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
{
2+
"name": "oracle",
3+
"description": "Phobos std.database candidate",
4+
"homepage": "",
5+
"copyright": "Copyright © 2015-, Erik Smith",
6+
"authors": [
7+
"Erik Smith"
8+
],
9+
"sourcePaths": [".", "../src"],
10+
"libs" : ["occi","clntsh"],
11+
"dependencies": {
12+
},
13+
"configurations": [
14+
{
15+
"name": "library",
16+
"targetType": "executable",
17+
},
18+
{
19+
"name": "unittest",
20+
"targetType": "executable",
21+
"targetName": "unittest",
22+
"dflags": ["-main"],
23+
},
24+
],
25+
}
26+

poly/test.d

Lines changed: 187 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,187 @@
1+
import std.database.util;
2+
import std.stdio;
3+
import std.database.oracle;
4+
import std.experimental.logger;
5+
import std.datetime;
6+
import std.variant;
7+
8+
struct Resource(T) {}
9+
struct Policy {}
10+
11+
auto create(alias T)() {
12+
T!Policy r;
13+
return r;
14+
}
15+
16+
auto r = create!Resource;
17+
18+
struct TestOutputRange {
19+
void put(int i) {
20+
log("I: ", i);
21+
}
22+
void put(string s) {
23+
log("S: ", s);
24+
}
25+
}
26+
27+
28+
unittest {
29+
import std.database.testsuite;
30+
//alias DB = Database!DefaultPolicy;
31+
//testAll!DB("oracle");
32+
33+
// these are all heading to test suite
34+
35+
if (true) {
36+
auto db = createDatabase;
37+
auto con1 = db.connection("oracle").autoCommit(false);
38+
auto con2 = db.connection("oracle").autoCommit(false);
39+
40+
scope(failure) con1.rollback;
41+
scope(failure) con2.rollback;
42+
43+
//con1.begin.query("insert into account(id,amount) values(1,100)");
44+
//con2.begin.query("insert into account(id,amount) values(2,-100)");
45+
46+
con1.commit;
47+
con2.commit;
48+
}
49+
50+
if (false) {
51+
auto db = createDatabase("oracle");
52+
auto con = db.connection;
53+
auto stmt = con.statement("select * from score");
54+
auto row = stmt.query.rows.front();
55+
//stmt.query.rows.writeRows;
56+
57+
TestOutputRange r;
58+
row.into(r);
59+
}
60+
61+
if (false) {
62+
auto db = createDatabase("oracle");
63+
auto con = db.connection;
64+
auto stmt = con.statement("select * from score");
65+
auto rows = stmt.query.rows;
66+
//stmt.query.rows.writeRows;
67+
68+
foreach (row; rows) {
69+
string name;
70+
int score;
71+
row.into(name,score);
72+
writeln("name: ", name, ", score: ", score);
73+
}
74+
}
75+
76+
if (false) { // classic example 2
77+
auto db = createDatabase("oracle");
78+
auto con = db.connection;
79+
auto stmt = con.statement("select * from t");
80+
auto rows = stmt.query.rows;
81+
82+
foreach (row; rows) {
83+
foreach (column; rows.columns) {
84+
auto field = row[column];
85+
writeln("name: ", column.name, ", value: ", field);
86+
}
87+
writeln;
88+
}
89+
}
90+
91+
if (false) { // classic example
92+
auto db = createDatabase("oracle");
93+
auto con = db.connection;
94+
auto stmt = con.statement("select * from t");
95+
auto rows = stmt.query.rows;
96+
97+
foreach (row; rows) {
98+
for(int c = 0; c != row.width; ++c) {
99+
auto field = row[c];
100+
write(field," ");
101+
}
102+
writeln;
103+
}
104+
}
105+
106+
107+
if (false) {
108+
auto db = createDatabase;
109+
//auto db = Database.create();
110+
//auto db = DB.create;
111+
112+
auto con = db.connection("oracle");
113+
con.query("drop table t");
114+
con.query("create table t (a varchar(10), b integer, c integer, d date)");
115+
con.query("insert into t values('one', 2, 3, TO_DATE('2015/02/03', 'yyyy/mm/dd'))");
116+
auto row = con.query("select * from t").rows.front;
117+
assert(row[0].option!string == "one");
118+
assert(row[1].option!int == 2);
119+
}
120+
121+
if (false) {
122+
auto db = createDatabase;
123+
auto con = db.connection("oracle");
124+
con.query("drop table t");
125+
con.query("create table t (a varchar(10), b integer, c integer, d date)");
126+
con.query("insert into t values('one', 2, 3, TO_DATE('2015/02/03', 'yyyy/mm/dd'))");
127+
auto row = con.query("select * from t").rows.front;
128+
assert(row[0].get!string == "one");
129+
assert(row[1].get!int == 2);
130+
}
131+
132+
if (false) {
133+
// into
134+
auto db = createDatabase;
135+
auto con = db.connection("oracle");
136+
con.query("drop table t");
137+
con.query("create table t (a varchar(10), b integer, c integer, d date)");
138+
con.query("insert into t values('one', 2, 3, TO_DATE('2015/02/03', 'yyyy/mm/dd'))");
139+
string a;
140+
int b;
141+
Variant c;
142+
Date d;
143+
con.query("select * from t").into(a,b,c,d);
144+
assert(a == "one");
145+
assert(b == 2);
146+
147+
auto v = Variant(234);
148+
assert(v == 234);
149+
150+
assert(c == "3"); // fix variant to support string
151+
assert(d == Date(2015,2,3));
152+
}
153+
154+
if (false) {
155+
alias DB = Database!DefaultPolicy;
156+
polyTest!DB("oracle");
157+
158+
if (false) {
159+
auto db = createDatabase;
160+
auto con = db.connection("oracle");
161+
con.query("select * from score").writeRows;
162+
}
163+
164+
}
165+
}
166+
167+
void polyTest(DB) (string source) {
168+
import std.database.poly;
169+
import std.experimental.logger;
170+
import std.database.front: Feature;
171+
172+
registerDatabase!DB("oracle");
173+
auto polyDB = createDatabase;
174+
175+
auto db = polyDB.database("oracle");
176+
177+
log("ConnectionPool: ", db.hasFeature(Feature.ConnectionPool));
178+
log("OutputArrayBinding: ", db.hasFeature(Feature.OutputArrayBinding));
179+
180+
auto con = db.connection("oracle");
181+
auto stmt = con.statement("select * from score");
182+
183+
stmt.query("joe",20);
184+
stmt.query();
185+
186+
}
187+

sqlite/test.d

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,9 @@ unittest {
1111

1212
unittest {
1313
auto db = createDatabase("path:///testdb");
14-
//auto rowSet = db.connection().statement("select name,score from score").query;
15-
auto rowSet = db.connection().query("select name,score from score");
16-
foreach (r; rowSet) {
14+
//auto rows = db.connection().statement("select name,score from score").query.rows;
15+
auto rows = db.connection().query("select name,score from score").rows;
16+
foreach (r; rows) {
1717
writeln(r[0].as!string,",",r[1].as!int);
1818
//writeln(r[0],", ",r[1]);
1919
}

0 commit comments

Comments
 (0)