Skip to content

Commit 6b9ac07

Browse files
vnayarSingingBush
authored andcommitted
Add Simple Single-Threaded Transaction Implementation
1 parent b810b14 commit 6b9ac07

File tree

5 files changed

+270
-27
lines changed

5 files changed

+270
-27
lines changed

dub.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
"homepage": "https://github.com/buggins/hibernated",
66
"license": "BSL-1.0",
77
"dependencies": {
8-
"ddbc": "~>0.5.8"
8+
"ddbc": "~>0.6.0"
99
},
1010
"targetType": "staticLibrary",
1111
"targetPath": "lib",

hdtest/source/embeddedtest.d

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ module embeddedtest;
22

33
import hibernated.core;
44

5-
import testrunner : BeforeClass, Test, AfterClass, runTests;
5+
import testrunner : Test;
66
import hibernatetest : HibernateTest;
77

88
@Embeddable

hdtest/source/htestmain.d

+5
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import testrunner : runTests;
1212
import hibernatetest : ConnectionParams;
1313
import generaltest : GeneralTest;
1414
import embeddedtest : EmbeddedTest;
15+
import transactiontest : TransactionTest;
1516

1617
int main(string[] args) {
1718

@@ -32,6 +33,10 @@ int main(string[] args) {
3233
test2.setConnectionParams(par);
3334
runTests(test2);
3435

36+
TransactionTest test3 = new TransactionTest();
37+
test3.setConnectionParams(par);
38+
runTests(test3);
39+
3540
writeln("All scenarios worked successfully");
3641
return 0;
3742
}

hdtest/source/transactiontest.d

+106
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
module transactiontest;
2+
3+
import std.format;
4+
5+
import hibernated.core;
6+
7+
import testrunner : BeforeClass, Test;
8+
import hibernatetest : HibernateTest;
9+
10+
// A test entity to apply transactions to.
11+
class BankTxn {
12+
@Id @Generated
13+
long id;
14+
15+
string crAcct; // Account to credit (from).
16+
string drAcct; // Account to debit (to).
17+
int amount; // Always positive.
18+
19+
override
20+
string toString() const {
21+
return format("{crAcct: \"%s\", drAcct: \"%s\", amount: %d}", crAcct, drAcct, amount);
22+
}
23+
}
24+
25+
class TransactionTest : HibernateTest {
26+
override
27+
EntityMetaData buildSchema() {
28+
return new SchemaInfoImpl!(BankTxn);
29+
}
30+
31+
@BeforeClass
32+
void enableLogger() {
33+
// import std.logger;
34+
// (cast() sharedLog).logLevel = LogLevel.trace;
35+
// globalLogLevel = LogLevel.trace;
36+
}
37+
38+
@Test("transaction.commit")
39+
void commitTest() {
40+
Session sess = sessionFactory.openSession();
41+
Transaction transaction = sess.beginTransaction();
42+
assert(transaction.isActive() == true);
43+
44+
BankTxn bankTxn = new BankTxn();
45+
with (bankTxn) {
46+
crAcct = "0101";
47+
drAcct = "0112";
48+
amount = 5;
49+
}
50+
sess.save(bankTxn);
51+
transaction.commit();
52+
sess.close(); // Close the session so we can test without a cache.
53+
54+
sess = sessionFactory.openSession();
55+
auto q1 = sess.createQuery("FROM BankTxn WHERE amount = :Amount")
56+
.setParameter("Amount", 5);
57+
assert(q1.uniqueResult!BankTxn() !is null);
58+
sess.close();
59+
}
60+
61+
@Test("transaction.rollback")
62+
void rollbackTest() {
63+
Session sess = sessionFactory.openSession();
64+
Transaction transaction = sess.beginTransaction();
65+
assert(transaction.isActive() == true);
66+
67+
BankTxn bankTxn = new BankTxn();
68+
with (bankTxn) {
69+
crAcct = "0101";
70+
drAcct = "0112";
71+
amount = 6;
72+
}
73+
sess.save(bankTxn);
74+
transaction.rollback();
75+
sess.close(); // Close the session so we can test without a cache.
76+
77+
sess = sessionFactory.openSession();
78+
auto q1 = sess.createQuery("FROM BankTxn WHERE amount = :Amount")
79+
.setParameter("Amount", 6);
80+
assert(q1.uniqueResult!BankTxn() is null);
81+
sess.close();
82+
}
83+
84+
@Test("transaction.closeSessionWithoutCommit")
85+
void closeSessionWithoutCommitTest() {
86+
Session sess = sessionFactory.openSession();
87+
Transaction transaction = sess.beginTransaction();
88+
assert(transaction.isActive() == true);
89+
90+
BankTxn bankTxn = new BankTxn();
91+
with (bankTxn) {
92+
crAcct = "0101";
93+
drAcct = "0112";
94+
amount = 7;
95+
}
96+
sess.save(bankTxn);
97+
// Neither transaction.commit() or transaction.rollback() is called.
98+
sess.close(); // Close the session so we can test without a cache.
99+
100+
sess = sessionFactory.openSession();
101+
auto q1 = sess.createQuery("FROM BankTxn WHERE amount = :Amount")
102+
.setParameter("Amount", 6);
103+
assert(q1.uniqueResult!BankTxn() is null);
104+
sess.close();
105+
}
106+
}

0 commit comments

Comments
 (0)