1 module fdb.main;
2 
3 import
4     std.concurrency,
5     std.exception,
6     std.string;
7 
8 import
9     fdb.cluster,
10     fdb.error,
11     fdb.fdb_c,
12     fdb.future,
13     fdb.networkoptions;
14 
15 private shared auto networkStarted = false;
16 private shared bool apiSelected    = false;
17 
18 private auto FBD_RUNTIME_API_VERSION = FDB_API_VERSION;
19 
20 void selectAPIVersion(in int apiVersion)
21 in
22 {
23     enforce(!apiSelected, "API version already selected");
24 }
25 body
26 {
27     auto err = fdb_select_api_version(apiVersion);
28     enforceError(err);
29 }
30 
31 auto networkThread()
32 in
33 {
34     assert(ownerTid != Tid.init);
35 }
36 body
37 {
38     auto err = fdb_run_network();
39     ownerTid.send(err);
40 }
41 
42 void startNetwork()
43 in
44 {
45     assert(!networkStarted);
46 }
47 body
48 {
49     if (networkStarted) return;
50 
51     if (!apiSelected)
52         selectAPIVersion(FBD_RUNTIME_API_VERSION);
53 
54     NetworkOptions.init;
55     auto err = fdb_setup_network();
56     enforceError(err);
57 
58     spawn(&networkThread);
59     networkStarted = true;
60 }
61 
62 void stopNetwork()
63 in
64 {
65     assert(networkStarted);
66 }
67 body
68 {
69     if (!networkStarted) return;
70 
71     auto err = fdb_stop_network();
72     enforceError(err);
73 
74     auto taskErr = receiveOnly!fdb_error_t;
75     enforceError(taskErr);
76 
77     networkStarted = false;
78 }
79 
80 auto createCluster(in string clusterFilePath = null)
81 in
82 {
83     assert(networkStarted);
84 }
85 out (result)
86 {
87     assert(result !is null);
88 }
89 body
90 {
91     auto fh = fdb_create_cluster(clusterFilePath.toStringz);
92     scope auto future = createFuture!VoidFuture(fh);
93     future.await;
94 
95     ClusterHandle ch;
96     auto err = fdb_future_get_cluster(fh, &ch);
97     enforceError(err);
98 
99     return new shared Cluster(ch);
100 }
101 
102 auto open(in string clusterFilePath = null)
103 {
104     startNetwork;
105     auto cluster = createCluster(clusterFilePath);
106     auto db      = cluster.openDatabase;
107     return db;
108 }
109 
110 alias close = stopNetwork;