Skip to content

Commit ffa3999

Browse files
committed
freetds date out(WIP), Impl->Driver
statement state var, oracle bind functions (WIP)
1 parent 4bd11e4 commit ffa3999

12 files changed

Lines changed: 270 additions & 97 deletions

File tree

freetds/test.d

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,23 @@ unittest {
1111
alias DB = Database!DefaultPolicy;
1212
testAll!DB("freetds");
1313

14+
dateTest();
1415
//example();
1516
//backTest();
1617
}
1718

19+
void dateTest() {
20+
import std.database.freetds;
21+
import std.datetime;
22+
auto db = createDatabase("freetds");
23+
auto con = db.connection();
24+
con.query("drop table d1");
25+
con.query("create table d1(a date)");
26+
con.query("insert into d1 values ('2016-01-15')");
27+
auto rs = con.query("select * from d1");
28+
writeResult(rs[]);
29+
}
30+
1831
void example() {
1932
import std.database.freetds;
2033
//auto db = createDatabase("freetds://server/test?username=sa&password=admin");

mysql/test.d

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,16 @@ unittest {
1010
import std.database.testsuite;
1111
alias DB = Database!DefaultPolicy;
1212
testAll!DB("mysql");
13+
14+
//negativeNotExecuteTest();
15+
16+
}
17+
18+
void negativeNotExecuteTest() {
19+
auto db = createDatabase("mysql://127.0.0.1/test");
20+
auto con = db.connection();
21+
//con.statement("select * from score").writeResult();
22+
con.statement("select * from score").writeResult();
1323
}
1424

1525
unittest {

src/std/database/freetds/bindings.d

Lines changed: 46 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,13 +69,54 @@ extern(System) {
6969
SYBFLTN = 109,
7070
SYBMONEYN = 110,
7171
SYBDATETIMN = 111,
72-
SYBNVARCHAR = 103
72+
SYBNVARCHAR = 103,
73+
74+
SYBMSDATE = 40
7375
};
7476

7577
enum {
7678
NTBSTRINGBIND = 2,
79+
DATETIMEBIND = 11
80+
}
81+
82+
struct DBDATETIME {
83+
DBINT dtdays;
84+
DBINT dttime;
7785
}
7886

87+
struct tds_microsoft_dbdaterec {
88+
DBINT year; /* 1753 - 9999 */
89+
DBINT quarter; /* 1 - 4 */
90+
DBINT month; /* 1 - 12 */
91+
DBINT day; /* 1 - 31 */
92+
DBINT dayofyear; /* 1 - 366 */
93+
DBINT week; /* 1 - 54 (for leap years) */
94+
DBINT weekday; /* 1 - 7 (Mon. - Sun.) */
95+
DBINT hour; /* 0 - 23 */
96+
DBINT minute; /* 0 - 59 */
97+
DBINT second; /* 0 - 59 */
98+
DBINT millisecond; /* 0 - 999 */
99+
DBINT tzone; /* -840 - 840 */
100+
};
101+
102+
struct tds_microsoft_dbdaterec2 {
103+
DBINT year; /* 1753 - 9999 */
104+
DBINT quarter; /* 1 - 4 */
105+
DBINT month; /* 1 - 12 */
106+
DBINT day; /* 1 - 31 */
107+
DBINT dayofyear; /* 1 - 366 */
108+
DBINT week; /* 1 - 54 (for leap years) */
109+
DBINT weekday; /* 1 - 7 (Mon. - Sun.) */
110+
DBINT hour; /* 0 - 23 */
111+
DBINT minute; /* 0 - 59 */
112+
DBINT second; /* 0 - 59 */
113+
DBINT nanosecond; /* 0 - 999999999 */
114+
DBINT tzone; /* 0 - 127 (Sybase only) */
115+
};
116+
117+
alias tds_microsoft_dbdaterec DBDATEREC;
118+
alias tds_microsoft_dbdaterec2 DBDATEREC2;
119+
79120
RETCODE dbinit();
80121
void dbexit();
81122

@@ -128,6 +169,10 @@ extern(System) {
128169

129170
STATUS dbnextrow(DBPROCESS * dbproc);
130171

172+
// date functions
173+
RETCODE dbdatecrack(DBPROCESS * dbproc, DBDATEREC * di, DBDATETIME * dt);
174+
RETCODE dbanydatecrack(DBPROCESS * dbproc, DBDATEREC2 * di, int type, const void *data);
175+
131176
// tds functions (from tds.h), not accessible from dblib :)
132177
alias ubyte TDS_TINYINT;
133178

src/std/database/freetds/database.d

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,21 +14,21 @@ import std.typecons;
1414
import std.container.array;
1515
import std.experimental.logger;
1616
public import std.database.allocator;
17-
import std.database.impl;
17+
import std.database.front;
1818
import std.datetime;
1919

2020
struct DefaultPolicy {
2121
alias Allocator = MyMallocator;
2222
}
2323

24-
alias Database(T) = BasicDatabase!(Impl!T,T);
24+
alias Database(T) = BasicDatabase!(Driver!T,T);
2525

2626
auto createDatabase()(string defaultURI="") {
2727
return Database!DefaultPolicy(defaultURI);
2828
}
2929

3030

31-
struct Impl(Policy) {
31+
struct Driver(Policy) {
3232
alias Allocator = Policy.Allocator;
3333

3434
private static bool isError(RETCODE ret) {
@@ -124,7 +124,7 @@ struct Impl(Policy) {
124124
db = db_;
125125
source = source_;
126126

127-
info("Connection: ");
127+
//info("Connection: ");
128128

129129
login = check("dblogin", dblogin());
130130

@@ -150,7 +150,7 @@ struct Impl(Policy) {
150150
}
151151

152152
~this() {
153-
info("~Connection: ", source);
153+
//info("~Connection: ", source);
154154
if (con) dbclose(con);
155155
if (login) dbloginfree(login);
156156
}
@@ -292,6 +292,12 @@ struct Impl(Policy) {
292292
allocSize = b.size+1;
293293
b.bindType = NTBSTRINGBIND;
294294
break;
295+
case SYBMSDATE:
296+
b.type = ValueType.Date;
297+
b.size = DBDATETIME.sizeof;
298+
allocSize = b.size;
299+
b.bindType = DATETIMEBIND;
300+
break;
295301
default:
296302
b.type = ValueType.String;
297303
b.size = 255;
@@ -348,7 +354,10 @@ struct Impl(Policy) {
348354
}
349355

350356
auto get(X:Date)(Bind *b) {
351-
return Date(2016,1,1); // fix
357+
auto ptr = cast(DBDATETIME*) b.data.ptr;
358+
DBDATEREC d;
359+
check("dbdatecrack", dbdatecrack(dbproc, &d, ptr));
360+
return Date(d.year, d.month, d.day);
352361
}
353362

354363
void checkType(int a, int b) {

0 commit comments

Comments
 (0)