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