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;