From f22bc875d257429e72fbb1ee65d7d4c46b845ad3 Mon Sep 17 00:00:00 2001 From: Gabriele Manduchi Date: Tue, 16 Apr 2024 12:03:31 +0200 Subject: [PATCH 1/4] Added ADP support in C++ thin client --- include/mdsobjects.h | 3 +- mdsobjects/cpp/mdsipobjects.cpp | 94 ++++++++++++++++++++++++----- tdi/treeshr/TreePutDeserialized.fun | 25 ++++++++ 3 files changed, 107 insertions(+), 15 deletions(-) create mode 100644 tdi/treeshr/TreePutDeserialized.fun diff --git a/include/mdsobjects.h b/include/mdsobjects.h index f44af2f12f..d86aba4fc3 100644 --- a/include/mdsobjects.h +++ b/include/mdsobjects.h @@ -4504,9 +4504,10 @@ namespace MDSplus closeAllTrees(); } void setDefault(char *path); - Data *get(const char *expr, Data **args, int nArgs); + Data *get(const char *expr, Data **args, int nArgs, bool serialized = true); Data *get(const char *expr) { return get(expr, 0, 0); } void put(const char *path, char *expr, Data **args, int nArgs); + void put(const char *path, Data *data); PutMany *putMany() { return new PutMany(this); } GetMany *getMany() { return new GetMany(this); } // Get TreeNode instance for (a subset of) TreeNode functionality in thin diff --git a/mdsobjects/cpp/mdsipobjects.cpp b/mdsobjects/cpp/mdsipobjects.cpp index f8d21c899d..2498c7048e 100644 --- a/mdsobjects/cpp/mdsipobjects.cpp +++ b/mdsobjects/cpp/mdsipobjects.cpp @@ -372,7 +372,7 @@ void Connection::closeAllTrees() throw MdsException(status); } -Data *Connection::get(const char *expr, Data **args, int nArgs) +Data *Connection::get(const char *expr, Data **args, int nArgs, bool serialized) { char clazz, dtype, nDims; short length; @@ -395,8 +395,22 @@ Data *Connection::get(const char *expr, Data **args, int nArgs) } lockLocal(); - status = SendArg(sockId, 0, DTYPE_CSTRING_IP, nArgs + 1, - std::string(expr).size(), 0, 0, (char *)expr); + + if(serialized) + { + std::string expExpr("serializeout(`(data("); + expExpr +=expr; + expExpr += ")))"; + status = SendArg(sockId, 0, DTYPE_CSTRING_IP, nArgs + 1, + expExpr.size(), 0, 0, (char *)expExpr.c_str()); + } + else + { + status = SendArg(sockId, 0, DTYPE_CSTRING_IP, nArgs + 1, + strlen((char *)expr), 0, 0, (char *)expr); + } +// std::string(expr).size(), 0, 0, (char *)expr); + if (STATUS_NOT_OK) { unlockLocal(); @@ -519,10 +533,23 @@ Data *Connection::get(const char *expr, Data **args, int nArgs) if (mem) FreeMessage(mem); - return resData; + + + if(!serialized || nDims == 0) //Error code returned + return resData; + + + Data *deserData = deserialize(resData); //Otherwise deserialze it + deleteData(resData); + + return deserData; +} +void Connection::put(const char *inPath, Data *data) +{ + put(inPath, (char *)"$", &data, 1); } -void Connection::put(const char *inPath, char *expr, Data **args, int nArgs) +void Connection::put(const char *inPath, char *expr, Data **inArgs, int nArgs) { char clazz, dtype, nDims; short length; @@ -532,15 +559,33 @@ void Connection::put(const char *inPath, char *expr, Data **args, int nArgs) int sockId = getSockId(); - // Check whether arguments are compatible (Scalars or Arrays) - for (std::size_t argIdx = 0; argIdx < (std::size_t)nArgs; ++argIdx) + + Data **args; + + //Check id any passed argument is APD. Serialize arguments only in this case + bool serialized = false; + + for(int i = 0; i < nArgs; i++) { - args[argIdx]->getInfo(&clazz, &dtype, &length, &nDims, &dims, &ptr); - if (!ptr) - throw MdsException("Invalid argument passed to Connection::put(). Can " - "only be Scalar or Array"); - if (nDims > 0) - delete[] dims; + if (inArgs[i]->clazz == CLASS_APD) + serialized = true; + } + +//Serialize Arguments + if(serialized) + { + args = new Data*[nArgs]; + for (std::size_t argIdx = 0; argIdx < (std::size_t)nArgs; ++argIdx) + { + int currSerSize; + char *currSer = inArgs[argIdx]->serialize(&currSerSize); + args[argIdx] = new Uint8Array((unsigned char *)currSer, currSerSize); + delete []currSer; + } + } + else + { + args = inArgs; } // Double backslashes!! @@ -548,7 +593,16 @@ void Connection::put(const char *inPath, char *expr, Data **args, int nArgs) if (path.at(0) == '\\') path.insert(path.begin(), '\\'); - std::string putExpr("TreePut(\'"); + std::string putExpr; + if(serialized) + { + putExpr += "TreePutDeserialized(\'"; + } + else + { + putExpr += "TreePut(\'"; + } + putExpr += path + "\',\'" + expr + "\'"; for (int varIdx = 0; varIdx < nArgs; ++varIdx) putExpr += ",$"; @@ -588,6 +642,18 @@ void Connection::put(const char *inPath, char *expr, Data **args, int nArgs) status = *(reinterpret_cast(ptr)); if (mem) FreeMessage(mem); + +//Delete serialize args + if (serialized) + { + for (std::size_t argIdx = 0; argIdx < (std::size_t)nArgs; ++argIdx) + { + deleteData(args[argIdx]); + } + delete [] args; + } + + if (STATUS_NOT_OK) throw MdsException(status); } diff --git a/tdi/treeshr/TreePutDeserialized.fun b/tdi/treeshr/TreePutDeserialized.fun new file mode 100644 index 0000000000..e3f83e9bc1 --- /dev/null +++ b/tdi/treeshr/TreePutDeserialized.fun @@ -0,0 +1,25 @@ +public fun TreePutDeserialized(in _nodename, in _expression, optional in _a, optional in _b, + optional in _c, optional in _d, optional in _e, optional in _f, optional in _g, optional in _h, + optional in _i, optional in _j, optional in _k, optional in _l, optional in _m, optional in _n, + optional in _o, optional in _p, optional in _q, optional in _r, optional in _s, optional in _t, + optional in _u, optional in _v, optional in _w, optional in _x, optional in _y, optional in _z) +{ + _list = List(*,_expression); + for (_narg=1;_narg <= 26; _narg++) + { + _argnam = "_"//char(96+_narg); /* char(97 is 'a') */ + _argcheck = "present("//_argnam//")"; + if (execute(_argcheck)) + _list = List(_list,SerializeIn(execute(_argnam))); + else + break; + } + _treeput_ans = *; + write(*, _list); + _status = TdiShr->TdiIntrinsic(val(BUILTIN_OPCODE("COMPILE")),val(_narg),ref(_list),xd(_treeput_ans)); + + write(*, 'STATUS ', _status); + if (_status & 1) + _status = TreeShr->TreePutRecord(val(getnci(_nodename,"nid_number")),xd(_treeput_ans),val(0)); + return(_status); +} From 4eb569479349dc9031cde370bb43e78cac9d93a5 Mon Sep 17 00:00:00 2001 From: Gabriele Manduchi Date: Tue, 16 Apr 2024 12:23:31 +0200 Subject: [PATCH 2/4] Added tdi fun --- deploy/packaging/debian/kernel.noarch | 1 + deploy/packaging/redhat/kernel.noarch | 1 + 2 files changed, 2 insertions(+) diff --git a/deploy/packaging/debian/kernel.noarch b/deploy/packaging/debian/kernel.noarch index 7238981dce..2a377ec5bd 100644 --- a/deploy/packaging/debian/kernel.noarch +++ b/deploy/packaging/debian/kernel.noarch @@ -231,6 +231,7 @@ ./usr/local/mdsplus/tdi/treeshr/TreeOpenEdit.fun ./usr/local/mdsplus/tdi/treeshr/TreeOpenNew.fun ./usr/local/mdsplus/tdi/treeshr/TreePut.fun +./usr/local/mdsplus/tdi/treeshr/TreePutDeserialized.fun ./usr/local/mdsplus/tdi/treeshr/TreePutRecord.fun ./usr/local/mdsplus/tdi/treeshr/TreeQuit.fun ./usr/local/mdsplus/tdi/treeshr/TreeSetCurrentShot.fun diff --git a/deploy/packaging/redhat/kernel.noarch b/deploy/packaging/redhat/kernel.noarch index f601a3b3c6..066cf33ec0 100644 --- a/deploy/packaging/redhat/kernel.noarch +++ b/deploy/packaging/redhat/kernel.noarch @@ -263,6 +263,7 @@ ./usr/local/mdsplus/tdi/treeshr/TreeOpenEdit.fun ./usr/local/mdsplus/tdi/treeshr/TreeOpenNew.fun ./usr/local/mdsplus/tdi/treeshr/TreePut.fun +./usr/local/mdsplus/tdi/treeshr/TreePutDeserialized.fun ./usr/local/mdsplus/tdi/treeshr/TreePutRecord.fun ./usr/local/mdsplus/tdi/treeshr/TreeQuit.fun ./usr/local/mdsplus/tdi/treeshr/TreeSetCurrentShot.fun From 02310d9ceabc3afa1d461198a92faf114faf4172 Mon Sep 17 00:00:00 2001 From: Gabriele Manduchi Date: Tue, 16 Apr 2024 16:52:35 +0200 Subject: [PATCH 3/4] Added TDI FUn --- tditest/testing/test-tab.ans | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/tditest/testing/test-tab.ans b/tditest/testing/test-tab.ans index a6cff6123d..a9e1ec5dd1 100644 --- a/tditest/testing/test-tab.ans +++ b/tditest/testing/test-tab.ans @@ -8,18 +8,20 @@ TR ^ %TDI Error in EXECUTE("TR") -tree -tree_from_tag( treefindnodewild( treeput( -treeabspath( treefindtagend( treeputrecord( -treeaddnode( treefindtagwild( treequit( -treeaddtag( treeflushoff( treesetcurrentshot( -treeclose( treeflushreset( treesetdbiitm( -treecreatepulsefile( treegetcurrentshot( treesetdefault( -treedeletepulsefile( treegetrecord( treesetnciitm( -treedirname( treegetsource( treesetsource( -treefilename( treeopen( treeturnoff( -treefindnodetags( treeopenedit( treeturnon( -treefindnodetagsjeff( treeopennew( treewrite( + +tree +tree_from_tag( treefindtagend( treeputrecord( +treeabspath( treefindtagwild( treeputstraight( +treeaddnode( treeflushoff( treequit( +treeaddtag( treeflushreset( treesetcurrentshot( +treeclose( treegetcurrentshot( treesetdbiitm( +treecreatepulsefile( treegetrecord( treesetdefault( +treedeletepulsefile( treegetsource( treesetnciitm( +treedirname( treeopen( treesetsource( +treefilename( treeopenedit( treeturnoff( +treefindnodetags( treeopennew( treeturnon( +treefindnodetagsjeff( treeput( treewrite( +treefindnodewild( treeputdeserialized( tree %TREE-W-NOT_OPEN, Tree not currently open %TDI Error compiling region marked by ^ From 748cda86c37e9ae18cf278df7825c1b32185aba7 Mon Sep 17 00:00:00 2001 From: Gabriele Manduchi Date: Wed, 17 Apr 2024 10:43:30 +0200 Subject: [PATCH 4/4] Fix commands --- tditest/testing/test-tab.ans | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/tditest/testing/test-tab.ans b/tditest/testing/test-tab.ans index a9e1ec5dd1..65d649c0f7 100644 --- a/tditest/testing/test-tab.ans +++ b/tditest/testing/test-tab.ans @@ -8,19 +8,18 @@ TR ^ %TDI Error in EXECUTE("TR") - -tree +tree tree_from_tag( treefindtagend( treeputrecord( -treeabspath( treefindtagwild( treeputstraight( -treeaddnode( treeflushoff( treequit( -treeaddtag( treeflushreset( treesetcurrentshot( -treeclose( treegetcurrentshot( treesetdbiitm( -treecreatepulsefile( treegetrecord( treesetdefault( -treedeletepulsefile( treegetsource( treesetnciitm( -treedirname( treeopen( treesetsource( -treefilename( treeopenedit( treeturnoff( -treefindnodetags( treeopennew( treeturnon( -treefindnodetagsjeff( treeput( treewrite( +treeabspath( treefindtagwild( treequit( +treeaddnode( treeflushoff( treesetcurrentshot( +treeaddtag( treeflushreset( treesetdbiitm( +treeclose( treegetcurrentshot( treesetdefault( +treecreatepulsefile( treegetrecord( treesetnciitm( +treedeletepulsefile( treegetsource( treesetsource( +treedirname( treeopen( treeturnoff( +treefilename( treeopenedit( treeturnon( +treefindnodetags( treeopennew( treewrite( +treefindnodetagsjeff( treeput( treefindnodewild( treeputdeserialized( tree %TREE-W-NOT_OPEN, Tree not currently open @@ -29,3 +28,5 @@ tree ^ %TDI Error in EXECUTE("tree") + +