3 using System
.Collections
;
4 using System
.Collections
.Generic
;
8 // An ISchemaBackend that uses a DBus connection to Versaplex as a backing
11 internal class VxDbusSchema
: ISchemaBackend
15 public static void wvmoniker_register()
17 WvMoniker
<ISchemaBackend
>.register("vx",
18 (string m
, object o
) => new VxDbusSchema(m
));
26 public VxDbusSchema(string bus_moniker
)
29 bus
= WvDbus
.session_bus
;
31 bus
= new WvDbus(bus_moniker
);
34 // If you've already got a Bus you'd like to use.
35 public VxDbusSchema(WvDbus _bus
)
48 static WvDbusMsg
methodcall(string method
, string signature
)
50 return new WvDbusCall("vx.versaplexd", "/db",
51 "vx.db", method
, signature
);
55 // The ISchema interface
58 // Note: this implementation ignores the sums.
59 public VxSchemaErrors
Put(VxSchema schema
, VxSchemaChecksums sums
,
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());
75 reply
.check(VxSchemaErrors
.GetDbusSignature());
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();
89 writer
.WriteArray(4, keys
, (w2
, k
) => {
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());
100 public VxSchema
Get(IEnumerable
<string> keys
)
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
);
117 public VxSchemaErrors
DropSchema(IEnumerable
<string> keys
)
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
) => {
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());
140 reply
.check(VxSchemaErrors
.GetDbusSignature());
144 public string GetSchemaData(string tablename
, int seqnum
, string where
)
146 WvDbusMsg call
= methodcall("GetSchemaData", "ss");
148 WvDbusWriter writer
= new WvDbusWriter();
153 writer
.Write(tablename
);
155 call
.Body
= writer
.ToArray();
157 WvDbusMsg reply
= bus
.send_and_wait(call
);
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
);
170 call
.Body
= writer
.ToArray();
172 WvDbusMsg reply
= bus
.send_and_wait(call
);