Пример #1
0
    private WvDbusMsg setup_msg(string query)
    {
	WvDbusMsg msg = methodcall("ExecChunkRecordset", "s");

	WvDbusWriter mw = new WvDbusWriter();
	mw.Write(query);

	msg.Body = mw.ToArray();

	return msg;
    }
Пример #2
0
	public WvDbusMsg err_reply(string errcode, string errstr)
	{
	    WvDbusMsg r = reply();
	    r.type = Dbus.MType.Error;
	    r.err = errcode;
	    if (errstr.ne())
	    {
		r.signature = "s";
		var w = new WvDbusWriter();
		w.Write(errstr);
		r.Body = w.ToArray();
	    }
	    return r;
	}
Пример #3
0
    private WvDbusMsg setup_msg(string call, string sig, object data)
    {
	WvDbusMsg msg = methodcall(call, sig);

	WvDbusWriter mw = new WvDbusWriter();
	if (sig == "s")
	    mw.Write((string)data);
	if (sig == "u")
	    mw.Write((uint)data);

	msg.Body = mw.ToArray();

	return msg;
    }
Пример #4
0
    // 
    // The ISchema interface
    //

    // Note: this implementation ignores the sums.
    public VxSchemaErrors Put(VxSchema schema, VxSchemaChecksums sums, 
        VxPutOpts opts)
    {
        WvDbusMsg call = methodcall("PutSchema", 
            String.Format("{0}i", VxSchema.GetDbusSignature()));

        WvDbusWriter writer = new WvDbusWriter();

        schema.WriteSchema(writer);
        writer.Write((int)opts);
        call.Body = writer.ToArray();

        WvDbusMsg reply = bus.send_and_wait(call);
	if (reply.signature == VxSchemaErrors.GetDbusSignature())
	    return new VxSchemaErrors(reply.iter().pop());
	else
	    reply.check(VxSchemaErrors.GetDbusSignature());
	return null;
    }
Пример #5
0
	void wwu(WvDbusWriter w, Dbus.Field c, string sig, uint val)
	{
	    w.Write((byte)c);
	    w.WriteSig(sig);
	    w.Write(val);
	}
Пример #6
0
    // Utility API so you can say Get("foo").
    public VxSchema Get(params string[] keys)
    {
        WvDbusMsg call = methodcall("GetSchema", "as");

        WvDbusWriter writer = new WvDbusWriter();

        if (keys == null)
            keys = new string[0];

        writer.WriteArray(4, keys, (w2, k) => {
	    w2.Write(k);
	});
        call.Body = writer.ToArray();

        WvDbusMsg reply = bus.send_and_wait(call);
	reply.check("a(sssy)");
	VxSchema schema = new VxSchema(reply.iter().pop());
	return schema;
    }
Пример #7
0
    public void PutSchemaData(string tablename, string text, int seqnum)
    {
        WvDbusMsg call = methodcall("PutSchemaData", "ss");

        WvDbusWriter writer = new WvDbusWriter();

        writer.Write(tablename);
        writer.Write(text);
        call.Body = writer.ToArray();

        WvDbusMsg reply = bus.send_and_wait(call);
	reply.check("");
    }
Пример #8
0
    public string GetSchemaData(string tablename, int seqnum, string where,
                                Dictionary<string,string> replaces, List<string> skipfields)
    {
        WvDbusMsg call = methodcall("GetSchemaData", "ss");

        WvDbusWriter writer = new WvDbusWriter();

        if (where == null)
            where = "";

        writer.Write(tablename);
        writer.Write(where);
        call.Body = writer.ToArray();

        WvDbusMsg reply = bus.send_and_wait(call);
	reply.check("s");
	return reply.iter().pop();
    }
Пример #9
0
    static void CallGetSchemaData(WvDbus conn,
					  WvDbusMsg call, out WvDbusMsg reply)
    {
        if (call.signature != "ss") {
            reply = CreateUnknownMethodReply(call, "GetSchemaData");
            return;
        }

        string clientid = GetClientId(call);
        if (clientid == null)
        {
            reply = call.err_reply("org.freedesktop.DBus.Error.Failed",
				   "Could not identify the client");
            return;
        }

	var it = call.iter();
        string tablename = it.pop();
	string where = it.pop();

        WvDbusWriter writer = new WvDbusWriter();

	// FIXME: No exception catching?
	// FIXME: Should receive the replace/skip parameters via dbus
        using (var dbi = VxSqlPool.create(clientid))
        {
            VxDbSchema backend = new VxDbSchema(dbi);
            string schemadata = backend.GetSchemaData(tablename, 0, where,
						      null, null);
            writer.Write(schemadata);
        }

        reply = call.reply("s").write(writer);
    }
Пример #10
0
	public WvDbusMsg write(WvDbusWriter w)
	{
	    Body = w.ToArray();
	    return this;
	}
Пример #11
0
    static void CallGetSchemaChecksums(WvDbus conn,
					       WvDbusMsg call, out WvDbusMsg reply)
    {
        if (call.signature.ne()) {
            reply = CreateUnknownMethodReply(call, "GetSchemaChecksums");
            return;
        }

        string clientid = GetClientId(call);
        if (clientid == null)
        {
            reply = call.err_reply("org.freedesktop.DBus.Error.Failed",
				   "Could not identify the client");
            return;
        }

        // FIXME: Add vx.db.toomuchdata error
        WvDbusWriter writer = new WvDbusWriter();

	//FIXME:  No exception catching?
        using (var dbi = VxSqlPool.create(clientid))
        {
            VxDbSchema backend = new VxDbSchema(dbi);
            VxSchemaChecksums sums = backend.GetChecksums();
            sums.WriteChecksums(writer);
        }

        reply = call.reply(VxSchemaChecksums.GetDbusSignature()).write(writer);
    }
Пример #12
0
    static void WriteColInfo(WvDbusWriter writer, VxColumnInfo[] colinfo)
    {
	// a(issnny)
	writer.WriteArray(8, colinfo, (w2, i) => {
	    w2.Write(i.size);
	    w2.Write(i.colname);
	    w2.Write(i.coltype.ToString());
	    w2.Write(i.precision);
	    w2.Write(i.scale);
	    w2.Write(i.nullable);
	});
    }
Пример #13
0
    static void CallExecScalar(WvDbus conn,
				       WvDbusMsg call, out WvDbusMsg reply)
    {
        if (call.signature != "s") {
            reply = CreateUnknownMethodReply(call, "ExecScalar");
            return;
        }

        if (call.Body == null) {
            reply = call.err_reply
		("org.freedesktop.DBus.Error.InvalidSignature",
		 "Signature provided but no body received");
            return;
        }

        string clientid = GetClientId(call);
        if (clientid == null)
        {
            reply = call.err_reply("org.freedesktop.DBus.Error.Failed",
				   "Could not identify the client");
            return;
        }

	var it = call.iter();
        string query = it.pop();

        object result;
	VxColumnType coltype;
        VxDb.ExecScalar(clientid, (string)query,
			out coltype, out result);

        WvDbusWriter writer = new WvDbusWriter();
	writer.WriteSig(VxColumnTypeToSignature(coltype));
	WriteV(writer, coltype, result);

        reply = call.reply("v").write(writer);
    }
Пример #14
0
    static void CallQuit(WvDbus conn,
				 WvDbusMsg call, out WvDbusMsg reply)
    {
	// FIXME: Check permissions here
        WvDbusWriter writer = new WvDbusWriter();
	writer.Write("Quit");
        reply = call.reply("s").write(writer);
	Versaplexd.want_to_die = true;
    }
Пример #15
0
    // a(issnny)vaay
    public static WvDbusWriter PrepareRecordsetWriter(VxColumnInfo[] colinfo,
						object[][] data,
						byte[][] nulldata)
    {
	WvDbusWriter writer = new WvDbusWriter();
	
	// a(issnny)
	WriteColInfo(writer, colinfo);
	
	// v
	if (colinfo.Length <= 0)
	{
	    // Some clients can't parse a() (empty struct) properly, so
	    // we'll have an empty array of (i) instead.
	    writer.WriteSig("a(i)");
	}
	else
	    writer.WriteSig(VxColumnInfoToArraySignature(colinfo));

	// a(whatever)
	writer.WriteArray(8, data, (w2, r) => {
	    for (int i = 0; i < colinfo.Length; i++)
		WriteV(w2, colinfo[i].VxColumnType, r[i]);
	});
	
	// aay
	writer.WriteArray(4, nulldata, (w2, r) => {
	    w2.Write(r);
	});

	return writer;
    }
Пример #16
0
    static void WriteV(WvDbusWriter w, VxColumnType t, object v)
    {
	switch (t)
	{
	case VxColumnType.Int64:
	    w.Write((Int64)v);
	    break;
	case VxColumnType.Int32:
	    w.Write((Int32)v);
	    break;
	case VxColumnType.Int16:
	    w.Write((Int16)v);
	    break;
	case VxColumnType.UInt8:
	    w.Write((byte)v);
	    break;
	case VxColumnType.Bool:
	    w.Write((bool)v);
	    break;
	case VxColumnType.Double:
	    w.Write((double)v);
	    break;
	case VxColumnType.Binary:
	    w.Write((byte[])v);
	    break;
	case VxColumnType.String:
	case VxColumnType.Decimal:
	case VxColumnType.Uuid:
	    w.Write((string)v);
	    break;
	case VxColumnType.DateTime:
	    {
		var dt = (VxDbusDateTime)v;
		w.Write(dt.seconds);
		w.Write(dt.microseconds);
		break;
	    }
	default:
	    throw new ArgumentException("Unknown VxColumnType");
	}
    }
Пример #17
0
	void wwsig(WvDbusWriter w, Dbus.Field c, string sig, string val)
	{
	    w.Write((byte)c);
	    w.WriteSig(sig);
	    w.WriteSig(val);
	}
Пример #18
0
	// Header format is: yyyyuua{yv}
	public byte[] GetHeaderData()
	{
	    WvDbusWriter w = new WvDbusWriter();
	    
	    w.Write((byte)endian);
	    w.Write((byte)type);
	    w.Write((byte)flags);
	    w.Write((byte)Dbus.Protocol.Version);
	    w.Write(Body != null ? (uint)Body.Length : 0);
	    w.Write((uint)serial);
	    
	    // This two-step process is a little convoluted because of the
	    // way the WriteArray function needs to work.  That, in turn,
	    // is convoluted because the alignment of an array is complicated:
	    // there's different padding for zero-element arrays than for
	    // nonzero-element arrays, and WriteArray does that for us, 
	    // which means it needs to know in advance how many elements
	    // are in our array.
	    
	    var l = new List<Dbus.Field>();
	    if (sender.ne())
		l.Add(Dbus.Field.Sender);
	    if (dest.ne())
		l.Add(Dbus.Field.Destination);
	    if (rserial.HasValue)
		l.Add(Dbus.Field.ReplySerial);
	    if (signature.ne())
		l.Add(Dbus.Field.Signature);
	    if (path.ne())
		l.Add(Dbus.Field.Path);
	    if (ifc.ne())
		l.Add(Dbus.Field.Interface);
	    if (method.ne())
		l.Add(Dbus.Field.Member);
	    if (err.ne())
		l.Add(Dbus.Field.ErrorName);

	    w.WriteArray(8, l, (w2, i) => {
		switch (i)
		{
		case Dbus.Field.Sender:
		    wws(w2, i, "s", sender);
		    break;
		case Dbus.Field.Destination:
		    wws(w2, i, "s", dest);
		    break;
		case Dbus.Field.ReplySerial:
		    wv.assert(rserial.Value != 0);
		    wwu(w2, i, "u", rserial.Value);
		    break;
		case Dbus.Field.Signature:
		    wwsig(w2, i, "g", signature);
		    break;
		case Dbus.Field.Path:
		    wws(w2, i, "o", path);
		    break;
		case Dbus.Field.Interface:
		    wws(w2, i, "s", ifc);
		    break;
		case Dbus.Field.Member:
		    wws(w2, i, "s", method);
		    break;
		case Dbus.Field.ErrorName:
		    wws(w2, i, "s", err);
		    break;
		default:
		    break; // unknown field code, ignore
		}
	    });
	    
	    w.WritePad(8); // the header is *always* a multiple of 8
	    return w.ToArray();
	}
Пример #19
0
    static void CallDropSchema(WvDbus conn,
				       WvDbusMsg call, out WvDbusMsg reply)
    {
        if (call.signature != "as") {
            reply = CreateUnknownMethodReply(call, "DropSchema");
            return;
        }

        string clientid = GetClientId(call);
        if (clientid == null)
        {
            reply = call.err_reply("org.freedesktop.DBus.Error.Failed",
				   "Could not identify the client");
            return;
        }

	var it = call.iter();
	string[] keys = it.pop().Cast<string>().ToArray();

        VxSchemaErrors errs;
        using (var dbi = VxSqlPool.create(clientid))
        {
            VxDbSchema backend = new VxDbSchema(dbi);
            errs = backend.DropSchema(keys);
        }

        WvDbusWriter writer = new WvDbusWriter();
        VxSchemaErrors.WriteErrors(writer, errs);

        reply = call.reply(VxSchemaErrors.GetDbusSignature()).write(writer);
        if (errs != null && errs.Count > 0)
        {
            reply.type = Wv.Dbus.MType.Error;
            reply.err = "org.freedesktop.DBus.Error.Failed";
        }
    }
Пример #20
0
    private static void HandleCancelQuery(WvDbus conn, WvDbusMsg msg)
    {
	log.print(WvLog.L.Debug4, "Received CancelQuery request\n");
	//FIXME:  Should I be in yet another thread?
	Action perform = null;
	if (msg.signature != "u" && msg.signature != "s")
	{
	    //accept 's' signatures for Perl DBus, which is stupid and can't
	    //send me 'u' parameters, even though the api accepts them.
	    log.print(WvLog.L.Debug4, "CancelQuery:  bad signature {0}\n",
			msg.signature);
	    perform = () => {
		conn.send(msg.err_reply(
			    "org.freedesktop.DBus.Error.UnknownMethod",
			    "No overload of {0} has signature '{1}'",
			    "CancelQuery", msg.signature));
	    };
	}
	else
	{
	    var it = msg.iter();
	    uint tokill;
	    if (msg.signature == "s")
	    {
		log.print(WvLog.L.Debug4,
			    "CancelQuery: converting arg from string\n");
		string temps = it.pop();
		tokill = Convert.ToUInt32(temps);
	    }
	    else
		tokill = it.pop();

	    log.print(WvLog.L.Debug4,
			"CancelQuery: try killing msg id {0}\n", tokill);

	    lock (action_mutex)
	    {
		if (curaction != null && curaction.conn == conn &&
		    curaction.src.serial == tokill)
		{
		    log.print(WvLog.L.Debug4,
				"CancelQuery: killing current action!\n");
			    
		    WvSqlRows_IDataReader.Cancel();
		    curaction = null;
		}
		else
		{
		    log.print(WvLog.L.Debug4,
				"CancelQuery: traversing action queue...\n");
			    
		    //Traverse the action queue, killing stuff
		    foreach (VxActionTriple t in action_queue)
			if (t.conn == conn && t.src.serial == tokill)
			{
			    log.print(WvLog.L.Debug4,
					"CancelQuery: found culprit, killing.\n");
			    //action_queue.Remove(t);
			    //FIXME:  What message should we really put here?
			    t.action = () => {
			    	conn.send(t.src.err_reply("vx.db.sqlerror",
					    "This message got canceled"));
			    };
			    break;
			}
		}
	    }

	    //Pointless return to make Perl happy.
	    perform = () => {
		WvDbusWriter writer = new WvDbusWriter();
		writer.Write("Cancel");
		conn.send(msg.reply("s").write(writer));
	    };
	    log.print(WvLog.L.Debug4, "CancelQuery:  complete\n");
	}

	//FIXME:  It's not clear whether for just add operations, in conjuction
	//with RemoveAt(0) going on in the otherthread, we need a mutex.
	action_queue.Add(new VxActionTriple(conn, msg, perform));
    }
Пример #21
0
    static void CallPutSchema(WvDbus conn,
				      WvDbusMsg call, out WvDbusMsg reply)
    {
        if (call.signature != String.Format("{0}i", 
                VxSchema.GetDbusSignature())) {
            reply = CreateUnknownMethodReply(call, "PutSchema");
            return;
        }

        string clientid = GetClientId(call);
        if (clientid == null)
        {
            reply = call.err_reply("org.freedesktop.DBus.Error.Failed",
				   "Could not identify the client");
            return;
        }

	var it = call.iter();
        VxSchema schema = new VxSchema(it.pop());
        int opts = it.pop();

        VxSchemaErrors errs;
        
        using (var dbi = VxSqlPool.create(clientid))
        {
            VxDbSchema backend = new VxDbSchema(dbi);
            errs = backend.Put(schema, null, (VxPutOpts)opts);
        }

        WvDbusWriter writer = new WvDbusWriter();
        VxSchemaErrors.WriteErrors(writer, errs);

        reply = call.reply(VxSchemaErrors.GetDbusSignature()).write(writer);
        if (errs != null && errs.Count > 0)
        {
            reply.type = Wv.Dbus.MType.Error;
            reply.err = "org.freedesktop.DBus.Error.Failed";
        }
    }
Пример #22
0
    // A method exported over DBus but not exposed in ISchemaBackend
    public VxSchemaErrors DropSchema(params string[] keys)
    {
        WvDbusMsg call = methodcall("DropSchema", "as");

        WvDbusWriter writer = new WvDbusWriter();

	writer.WriteArray(4, keys, (w2, k) => {
	    w2.Write(k);
	});
        call.Body = writer.ToArray();

        WvDbusMsg reply = bus.send_and_wait(call);
	if (reply.signature == VxSchemaErrors.GetDbusSignature())
	    return new VxSchemaErrors(reply.iter().pop());
	else
	    reply.check(VxSchemaErrors.GetDbusSignature());
	return null;
    }
Пример #23
0
    static void CallGetSchema(WvDbus conn,
				      WvDbusMsg call, out WvDbusMsg reply)
    {
        if (call.signature != "as") {
            reply = CreateUnknownMethodReply(call, "GetSchema");
            return;
        }

        string clientid = GetClientId(call);
        if (clientid == null)
        {
            reply = call.err_reply("org.freedesktop.DBus.Error.Failed",
				   "Could not identify the client");
            return;
        }

	var it = call.iter();
        string[] names = it.pop().Cast<string>().ToArray();

        WvDbusWriter writer = new WvDbusWriter();

        using (var dbi = VxSqlPool.create(clientid))
        {
            VxDbSchema backend = new VxDbSchema(dbi);
            VxSchema schema = backend.Get(names);
            schema.WriteSchema(writer);
        }

        reply = call.reply(VxSchema.GetDbusSignature()).write(writer);
    }