Add several missing IDisposables in schemamatic.
[versaplex.git] / versaplexd / vxdbusschema.cs
blobd287a1055316ccf4abaefb69e0e16ff71d85875f
1 using System;
2 using System.Linq;
3 using System.Collections;
4 using System.Collections.Generic;
5 using Wv;
6 using Wv.Extensions;
8 // An ISchemaBackend that uses a DBus connection to Versaplex as a backing
9 // store.
10 [WvMoniker]
11 internal class VxDbusSchema : ISchemaBackend
13 WvDbus bus;
15 public static void wvmoniker_register()
17 WvMoniker<ISchemaBackend>.register("vx",
18 (string m, object o) => new VxDbusSchema(m));
21 public VxDbusSchema()
22 : this((string)null)
26 public VxDbusSchema(string bus_moniker)
28 if (bus_moniker.e())
29 bus = WvDbus.session_bus;
30 else
31 bus = new WvDbus(bus_moniker);
34 // If you've already got a Bus you'd like to use.
35 public VxDbusSchema(WvDbus _bus)
37 bus = _bus;
40 public void Dispose()
42 using (bus)
44 bus = null;
48 static WvDbusMsg methodcall(string method, string signature)
50 return new WvDbusCall("vx.versaplexd", "/db",
51 "vx.db", method, signature);
54 //
55 // The ISchema interface
58 // Note: this implementation ignores the sums.
59 public VxSchemaErrors Put(VxSchema schema, VxSchemaChecksums sums,
60 VxPutOpts opts)
62 WvDbusMsg call = methodcall("PutSchema",
63 String.Format("{0}i", VxSchema.GetDbusSignature()));
65 WvDbusWriter writer = new WvDbusWriter();
67 schema.WriteSchema(writer);
68 writer.Write((int)opts);
69 call.Body = writer.ToArray();
71 WvDbusMsg reply = bus.send_and_wait(call);
72 if (reply.signature == VxSchemaErrors.GetDbusSignature())
73 return new VxSchemaErrors(reply.iter().pop());
74 else
75 reply.check(VxSchemaErrors.GetDbusSignature());
76 return null;
79 // Utility API so you can say Get("foo").
80 public VxSchema Get(params string[] keys)
82 WvDbusMsg call = methodcall("GetSchema", "as");
84 WvDbusWriter writer = new WvDbusWriter();
86 if (keys == null)
87 keys = new string[0];
89 writer.WriteArray(4, keys, (w2, k) => {
90 w2.Write(k);
91 });
92 call.Body = writer.ToArray();
94 WvDbusMsg reply = bus.send_and_wait(call);
95 reply.check("a(sssy)");
96 VxSchema schema = new VxSchema(reply.iter().pop());
97 return schema;
100 public VxSchema Get(IEnumerable<string> keys)
102 if (keys == null)
103 keys = new string[0];
104 return Get(keys.ToArray());
107 public VxSchemaChecksums GetChecksums()
109 WvDbusMsg call = methodcall("GetSchemaChecksums", "");
111 WvDbusMsg reply = bus.send_and_wait(call);
112 reply.check("a(sat)");
113 VxSchemaChecksums sums = new VxSchemaChecksums(reply);
114 return sums;
117 public VxSchemaErrors DropSchema(IEnumerable<string> keys)
119 if (keys == null)
120 keys = new string[0];
121 return DropSchema(keys.ToArray());
124 // A method exported over DBus but not exposed in ISchemaBackend
125 public VxSchemaErrors DropSchema(params string[] keys)
127 WvDbusMsg call = methodcall("DropSchema", "as");
129 WvDbusWriter writer = new WvDbusWriter();
131 writer.WriteArray(4, keys, (w2, k) => {
132 w2.Write(k);
134 call.Body = writer.ToArray();
136 WvDbusMsg reply = bus.send_and_wait(call);
137 if (reply.signature == VxSchemaErrors.GetDbusSignature())
138 return new VxSchemaErrors(reply.iter().pop());
139 else
140 reply.check(VxSchemaErrors.GetDbusSignature());
141 return null;
144 public string GetSchemaData(string tablename, int seqnum, string where)
146 WvDbusMsg call = methodcall("GetSchemaData", "ss");
148 WvDbusWriter writer = new WvDbusWriter();
150 if (where == null)
151 where = "";
153 writer.Write(tablename);
154 writer.Write(where);
155 call.Body = writer.ToArray();
157 WvDbusMsg reply = bus.send_and_wait(call);
158 reply.check("s");
159 return reply.iter().pop();
162 public void PutSchemaData(string tablename, string text, int seqnum)
164 WvDbusMsg call = methodcall("PutSchemaData", "ss");
166 WvDbusWriter writer = new WvDbusWriter();
168 writer.Write(tablename);
169 writer.Write(text);
170 call.Body = writer.ToArray();
172 WvDbusMsg reply = bus.send_and_wait(call);
173 reply.check("");