1 module htestmain;
2 
3 import std.stdio;
4 import std.string;
5 import std.conv;
6 import hibernated.core;
7 import std.traits;
8 
9 // Annotations of entity classes
10 @Table( "gebruiker" )
11 class User {
12     long id;
13     string name;
14     int some_field_with_underscore;
15     @ManyToMany // cannot be inferred, requires annotation
16     LazyCollection!Role roles;
17     //@ManyToOne
18     MyGroup group;
19 
20     override string toString() {
21         return format("{id:%s, name:%s, roles:%s, group:%s}", id, name, roles, group);
22     }
23 }
24 
25 class Role {
26     int id;
27     string name;
28     @ManyToMany // w/o this annotation will be OneToMany by convention
29     LazyCollection!User users;
30 
31     override string toString() {
32         return format("{id:%s, name:%s}", id, name);
33     }
34 }
35 
36 @Entity
37 class MyGroup {
38     long id;
39     string name;
40     @OneToMany
41     LazyCollection!User users;
42 
43     override string toString() {
44         return format("{id:%s, name:%s}", id, name);
45     }
46 }
47 
48 void testHibernate() {
49     // setup DB connection
50     version( USE_SQLITE )
51     {
52         import ddbc.drivers.sqliteddbc;
53         SQLITEDriver driver = new SQLITEDriver();
54         string[string] params;
55         DataSource ds = new ConnectionPoolDataSourceImpl(driver, "zzz.db", params);
56         Dialect dialect = new SQLiteDialect();
57     }
58     else version( USE_PGSQL )
59     {
60         import ddbc.drivers.pgsqlddbc;
61         string url = PGSQLDriver.generateUrl( "/tmp", 5432, "testdb" );
62         string[string] params;
63         params["user"] = "hdtest";
64         params["password"] = "secret";
65         params["ssl"] = "true";
66         PGSQLDriver driver = new PGSQLDriver();
67         DataSource ds = new ConnectionPoolDataSourceImpl(driver,url, params);
68         Dialect dialect = new PGSQLDialect();
69     }
70 
71     // create metadata from annotations
72     writeln("Creating schema from class list");
73     EntityMetaData schema = new SchemaInfoImpl!(User, Role, MyGroup);
74     //writeln("Creating schema from module list");
75     //EntityMetaData schema2 = new SchemaInfoImpl!(htestmain);
76 
77 
78     writeln("Creating session factory");
79     // create session factory
80     SessionFactory factory = new SessionFactoryImpl(schema, dialect, ds);
81     scope(exit) factory.close();
82 
83     writeln("Creating DB schema");
84     DBInfo db = factory.getDBMetaData();
85     {
86         Connection conn = ds.getConnection();
87         scope(exit) conn.close();
88         db.updateDBSchema(conn, true, true);
89     }
90 
91 
92     // create session
93     Session sess = factory.openSession();
94     scope(exit) sess.close();
95 
96     // use session to access DB
97 
98     writeln("Querying empty DB");
99     Query q = sess.createQuery("FROM User ORDER BY name");
100     User[] list = q.list!User();
101     writeln("Result size is " ~ to!string(list.length));
102 
103     // create sample data
104     writeln("Creating sample schema");
105     MyGroup grp1 = new MyGroup();
106     grp1.name = "Group-1";
107     MyGroup grp2 = new MyGroup();
108     grp2.name = "Group-2";
109     MyGroup grp3 = new MyGroup();
110     grp3.name = "Group-3";
111     //
112     Role r10 = new Role();
113     r10.name = "role10";
114     Role r11 = new Role();
115     r11.name = "role11";
116     //
117     User u10 = new User();
118     u10.name = "Alex";
119     u10.roles = [r10, r11];
120     u10.group = grp3;
121     User u12 = new User();
122     u12.name = "Arjan";
123     u12.roles = [r10, r11];
124     u12.group = grp2;
125     User u13 = new User();
126     u13.name = "Wessel";
127     u13.roles = [r10, r11];
128     u13.group = grp2;
129 
130     writeln("saving group 1-2-3" );
131     sess.save( grp1 );
132     sess.save( grp2 );
133     sess.save( grp3 );
134     writeln("Saving r10");
135     sess.save(r10);
136     writeln("Saving r11");
137     sess.save(r11);
138     writeln("Saving u10");
139     sess.save(u10);
140     writeln("Saving u12");
141     sess.save(u12);
142     writeln("Saving u13");
143     sess.save(u13);
144 
145     writeln("Loading User");
146     // load and check data
147     auto qresult = sess.createQuery("FROM User WHERE name=:Name and some_field_with_underscore != 42").setParameter("Name", "Alex");
148     writefln( "query result: %s", qresult.listRows() );
149     User u11 = qresult.uniqueResult!User();
150     //User u11 = sess.createQuery("FROM User WHERE name=:Name and some_field_with_underscore != 42").setParameter("Name", "Alex").uniqueResult!User();
151     writefln("Checking User 11 : %s", u11);
152     assert(u11.roles.length == 2);
153     assert(u11.roles[0].name == "role10" || u11.roles.get()[0].name == "role11");
154     assert(u11.roles[1].name == "role10" || u11.roles.get()[1].name == "role11");
155     assert(u11.roles[0].users.length == 3);
156     assert(u11.roles[0].users[0] == u10);
157 
158     writeln("Test retrieving users by group... (ManyToOne relationship)");
159     auto qUsersByGroup = sess.createQuery("FROM User WHERE group=:group_id").setParameter("group_id", grp2.id);
160     User[] usersByGroup = qUsersByGroup.list!User();
161     assert(usersByGroup.length == 2); // user 2 and user 2
162 
163     //writeln("Removing User");
164     // remove reference
165     //std.algorithm.remove(u11.roles.get(), 0);
166     //sess.update(u11);
167 
168     // remove entity
169     //sess.remove(u11);
170 }
171 
172 void main()
173 {
174     testHibernate();
175 }