/// <summary> /// Upload files to "a_attaches" table. Before files been saved, all files attached to /// the recid will been deleted. (This is supported by the semantic-DA samantics configuration) /// <p><b>FIXME:</b></p> /// this method used 2 round of memory copy, should implemented in stream style /// </summary> /// <param name="files"></param> /// <param name="busiTbl">business table to which file is attached, e.g. "a_users"</param> /// <param name="recid">business record Id to which file is owned, e.g. "admin"</param> public void AttachFiles(List <string> files, string busiTbl, string recid, Action <MsgCode, AnsonResp> onOk = null, Action <MsgCode, AnsonResp> onErr = null) { AnsonMsg jmsg = Delete(null, "a_attaches"); AnUpdateReq del = (AnUpdateReq)jmsg.Body(0); del.WhereEq("busiTbl", busiTbl) .WhereEq("busiId", recid); foreach (string file in files) { byte[] f = File.ReadAllBytes(file); string fn = Path.GetFileName(file); string b64 = AESHelper.Encode64(f); del.Post(AnInsertReq .formatInsertReq(null, null, "a_attaches") .Cols("attName", "busiId", "busiTbl", "uri") .Nv("attName", fn) .Nv("busiId", recid) .Nv("busiTbl", busiTbl) .Nv("uri", b64)); } jmsg.Header(Header()); Console(jmsg); Commit(jmsg, (code, data) => { if (MsgCode.ok == code.code) { if (onOk != null) { onOk(code, (AnsonResp)data.Body(0)); } else { Utils.Logi(code.ToString()); } } else if (onErr != null) { onErr(code, (AnsonResp)data.Body(0)); } else { Utils.Warn(data.ToString()); } }, onErr: (c, err) => { if (onErr != null) { onErr(c, err); } else { Utils.Warn(string.Format(@"code: {0}, error: {1}", c, err.Msg())); } }); }
public AnsonMsg Delete(string uri, string tbl, string[] act = null) { AnUpdateReq itm = AnUpdateReq.formatDelReq(uri, null, tbl); AnsonMsg jmsg = UserReq(uri, new Port(Port.update), act, itm); AnsonHeader header = new AnsonHeader(ssInf.ssid, ssInf.uid); if (act != null && act.Length > 0) { header.act(act); } return(jmsg.Header(header)); }
public AnsonMsg Insert(string uri, string tbl, string[] act = null) { AnInsertReq itm = AnInsertReq.formatInsertReq(null, tbl, uri); AnsonMsg jmsg = UserReq(uri, new Port(Port.insert), act, itm); AnsonHeader header = new AnsonHeader(ssInf.ssid, ssInf.uid); if (act != null && act.Length > 0) { header.act(act); } return(jmsg.Header(header) .Body(itm, uri)); }
public AnsonMsg Update(string conn, string tbl, string[] act = null) { AnUpdateReq itm = AnUpdateReq.FormatUpdateReq(conn, null, tbl); AnsonMsg jmsg = UserReq(new Port(Port.update), act, itm); AnsonHeader header = new AnsonHeader(ssInf.ssid, ssInf.uid); if (act != null && act.Length > 0) { header.act(act); } return(jmsg.Header(header) ); //.Body(itm); }
public AnsonMsg UserReq(string uri, IPort port, string[] act, AnsonBody req) { if (ssInf == null) { throw new SemanticException("SessionClient can not visit jserv without session information."); } AnsonMsg jmsg = new AnsonMsg(port, null); if (act != null) { Header().act(act); } jmsg.Header(header); jmsg.Body(req, uri); return(jmsg); }
static void UploadTransaction(CancellationTokenSource waker, AnsonClient client, string p) { // string p = Path.get(filename); byte[] f = File.ReadAllBytes(p); string b64 = AESHelper.Encode64(f); AnsonMsg jmsg = client.Update(null, "a_users"); AnUpdateReq upd = (AnUpdateReq)jmsg.Body(0); upd.Nv("nationId", "CN") .WhereEq("userId", "admin") // .post(((UpdateReq) new UpdateReq(null, "a_attach") .Post(AnUpdateReq.formatDelReq(null, null, "a_attaches") .WhereEq("busiTbl", "a_users") .WhereEq("busiId", "admin") .Post((AnInsertReq.formatInsertReq(null, null, "a_attaches") .Cols("attName", "busiId", "busiTbl", "uri") .Nv("attName", "-Anclient.cs Test") // The parent pk can't be resulved, we must provide the value. // See https://odys-z.github.io/notes/semantics/best-practices.html#fk-ins-cate .Nv("busiId", "admin") .Nv("busiTbl", "a_users") .Nv("uri", b64)))); jmsg.Header(client.Header()); client.Console(jmsg); client.Commit(jmsg, (code, data) => { if (MsgCode.ok == code.code) { Utils.Logi(code.ToString()); } else { Utils.Warn(data.ToString()); } }, onErr: (c, err) => { Assert.Fail(string.Format(@"code: {0}, error: {1}", c, err.Msg())); }, waker); }
public void TestMenu(string s, string roleId) { AnDatasetReq req = new AnDatasetReq(null, "sys-sqlite"); string t = "menu"; AnsonHeader header = client.Header() .UsrAct("SemanticClientTest", "init", t, "test jclient.java loading menu from menu.sample"); AnsonMsg jmsg = client.UserReq(new Port(Port.echo), null, req); jmsg.Header(header); client.Console(jmsg); client.Commit(jmsg, (code, data) => { IList rses = (IList)((AnDatasetResp)data.Body()?[0]).Forest(); Utils.Logi(rses);; }); }
/// <summary>Format a query request object, including all information for /// construct a "select" statement.</summary> /// <param name="uri"></param> /// <param name="tbl"></param> /// <param name="alias">main table alias</param> /// <param name="page">page, -1 for no paging at server side.</param> /// <param name="size"></param> /// <param name="funcId">current function ID</param> /// <returns>formatted query object</returns> public AnsonMsg query(string uri, string tbl, string alias, int page, int size, string funcId = null) { AnsonMsg msg = new AnsonMsg((IPort) new Port(Port.query), null); AnsonHeader header = new AnsonHeader(ssInf.ssid, ssInf.uid); if (funcId != null && funcId.Length > 0) { header.UsrAct(funcId, "query", "R", "test"); } msg.Header(header); AnQueryReq itm = AnQueryReq.formatReq(uri, msg, tbl, alias); msg.Body(itm, uri); itm.Page(page, size); return(msg); }