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