120 return tv.tv_sec*1.0 +
tv.tv_usec/1000000.0;
125 MJsonNode*
errnode = MJsonNode::MakeObject();
126 errnode->AddToObject(
"code", MJsonNode::MakeInt(code));
128 errnode->AddToObject(
"data", MJsonNode::MakeString(
data));
130 MJsonNode* result = MJsonNode::MakeObject();
131 result->AddToObject(
"error",
errnode);
137 MJsonNode* result = MJsonNode::MakeObject();
138 result->AddToObject(
"result",
node);
144 MJsonNode*
node = MJsonNode::MakeObject();
153 MJsonNode* result = MJsonNode::MakeObject();
154 result->AddToObject(
"result",
node);
160 MJsonNode*
node = MJsonNode::MakeObject();
171 MJsonNode* result = MJsonNode::MakeObject();
172 result->AddToObject(
"result",
node);
185 *error = MJsonNode::MakeObject();
189 const MJsonNode*
obj = params->FindObjectNode(
name);
206 *error = MJsonNode::MakeObject();
213 if (error && *error) {
234 p->AddToObject(
"description", MJsonNode::MakeString(
description));
235 p->AddToObject(
"type", MJsonNode::MakeString(
"object"));
237 p->
required = MJsonNode::MakeArray();
239 p->AddToObject(
"required", p->
required);
246 p->AddToObject(
"description", MJsonNode::MakeString(
description));
247 p->AddToObject(
"type", MJsonNode::MakeString(
"array"));
248 p->
items = MJsonNode::MakeArray();
249 p->AddToObject(
"items", p->
items);
253static std::string
remove(
const std::string s,
char c)
255 std::string::size_type pos = s.find(
c);
256 if (pos == std::string::npos)
259 return s.substr(0, pos);
277 s->AddToObject(
"optional", MJsonNode::MakeBool(
true));
281 s->DeleteObjectNode(
"description");
282 ss->AddToSchema(s,
"");
287 items->AddToArray(s);
293 required->AddToArray(MJsonNode::MakeString(
name.c_str()));
358 MJsonNode* p = MJsonNode::MakeObject();
359 p->AddToObject(
"description", MJsonNode::MakeString(
description));
361 p->AddToObject(
"type", MJsonNode::MakeString(
"array"));
363 p->AddToObject(
"type", MJsonNode::MakeString(
"object"));
365 p->AddToObject(
"type", MJsonNode::MakeString(
"string"));
367 p->AddToObject(
"type", MJsonNode::MakeString(
"integer"));
369 p->AddToObject(
"type", MJsonNode::MakeString(
"number"));
371 p->AddToObject(
"type", MJsonNode::MakeString(
"bool"));
373 p->AddToObject(
"type", MJsonNode::MakeString(
"null"));
375 p->AddToObject(
"type", MJsonNode::MakeString(
"arraybuffer"));
377 p->AddToObject(
"type", MJsonNode::MakeString(
"json"));
381 assert(!
"invalid value of mjson_type");
388 s->AddToObject(
"description", MJsonNode::MakeString(
description));
389 s->AddToObject(
"type", MJsonNode::MakeString(
"object"));
397 s->AddToObject(
"description", MJsonNode::MakeString(
description));
398 s->AddToObject(
"type", MJsonNode::MakeString(
"array"));
413static MJsonNode*
xnull(
const MJsonNode* params)
417 doc->D(
"RPC method always returns null");
418 doc->P(
NULL, 0,
"method parameters are ignored");
436 doc->D(
"calls MIDAS cm_exist() to check if given MIDAS program is running");
437 doc->P(
"name",
MJSON_STRING,
"name of the program, corresponding to ODB /Programs/name");
438 doc->P(
"unique?",
MJSON_BOOL,
"bUnique argument to cm_exist()");
439 doc->R(
"status",
MJSON_INT,
"return status of cm_exist()");
443 MJsonNode* error =
NULL;
463 doc->D(
"calls MIDAS cm_shutdown() to stop given MIDAS program");
464 doc->P(
"name",
MJSON_STRING,
"name of the program, corresponding to ODB /Programs/name");
465 doc->P(
"unique?",
MJSON_BOOL,
"bUnique argument to cm_shutdown()");
466 doc->R(
"status",
MJSON_INT,
"return status of cm_shutdown()");
470 MJsonNode* error =
NULL;
490 doc->D(
"start MIDAS program defined in ODB /Programs/name");
491 doc->P(
"name",
MJSON_STRING,
"name of the program, corresponding to ODB /Programs/name");
492 doc->R(
"status",
MJSON_INT,
"return status of ss_system()");
496 MJsonNode* error =
NULL;
500 std::string path =
"";
501 path +=
"/Programs/";
503 path +=
"/Start command";
509 int size =
sizeof(command);
523 doc->D(
"execute custom script defined in ODB /Script (scripts show in the menu) or /CustomScript (scripts from custom pages)");
525 doc->P(
"customscript?",
MJSON_STRING,
"Execute ODB /CustomScript/xxx");
526 doc->R(
"status",
MJSON_INT,
"return status of cm_exec_script()");
535 if (
script.length() > 0) {
540 path +=
"/CustomScript";
547 if (path.length() > 0) {
568 const char*s =
strchr(path,
'[');
571 cm_msg(
MERROR, method,
"expected an array index character \'[\' in \"%s\"", path);
577 while (s && (*s != 0)) {
581 cm_msg(
MERROR, method,
"expected a number in array index in \"%s\" at \"%s\"", path, s);
592 cm_msg(
MERROR, method,
"expected a number in array index in \"%s\" at \"%s\"", path, s);
626 cm_msg(
MERROR, method,
"invalid char in array index in \"%s\" at \"%s\"", path, s);
631 printf(
"parsed array indices for \"%s\" size is %d: ", path, (
int)
list->size());
632 for (
unsigned i=0;
i<
list->size();
i++)
644 doc->D(
"get values of ODB data from given subtrees");
645 doc->P(
"paths[]",
MJSON_STRING,
"array of ODB subtree paths, see note on array indices");
647 doc->P(
"omit_last_written?",
MJSON_BOOL,
"omit the /last_written entries and the last_written[] result");
649 doc->P(
"omit_old_timestamp?",
MJSON_NUMBER,
"omit data older than given ODB timestamp");
650 doc->P(
"preserve_case?",
MJSON_BOOL,
"preserve the capitalization of ODB key names (WARNING: ODB is not case sensitive); note that this will also have side effect of setting the omit_names option");
651 doc->R(
"data[]", 0,
"values of ODB data for each path, all key names are in lower case, all symlinks are followed");
652 doc->R(
"status[]",
MJSON_INT,
"return status of db_copy_json_values() or db_copy_json_index() for each path");
653 doc->R(
"tid?[]",
MJSON_INT,
"odb type id for each path, absent if omit_tid is true");
654 doc->R(
"last_written?[]",
MJSON_NUMBER,
"last_written value of the ODB subtree for each path, absent if omit_last_written is true");
658 MJsonNode* error =
NULL;
669 MJsonNode*
dresult = MJsonNode::MakeArray();
670 MJsonNode*
sresult = MJsonNode::MakeArray();
671 MJsonNode*
tresult = MJsonNode::MakeArray();
672 MJsonNode*
lwresult = MJsonNode::MakeArray();
677 for (
unsigned i=0;
i<
paths->size();
i++) {
681 std::string path = (*paths)[
i]->GetString();
685 dresult->AddToArray(MJsonNode::MakeNull());
687 tresult->AddToArray(MJsonNode::MakeNull());
688 lwresult->AddToArray(MJsonNode::MakeNull());
694 dresult->AddToArray(MJsonNode::MakeNull());
696 tresult->AddToArray(MJsonNode::MakeNull());
697 lwresult->AddToArray(MJsonNode::MakeNull());
701 if (path.find(
"[") != std::string::npos) {
702 std::vector<unsigned>
list;
706 dresult->AddToArray(MJsonNode::MakeNull());
713 if (
list.size() > 1) {
714 MJsonNode *
ddresult = MJsonNode::MakeArray();
715 MJsonNode *
ssresult = MJsonNode::MakeArray();
717 for (
unsigned i=0;
i<
list.size();
i++) {
725 ddresult->AddToArray(MJsonNode::MakeJSON(buf));
728 ddresult->AddToArray(MJsonNode::MakeNull());
749 dresult->AddToArray(MJsonNode::MakeJSON(buf));
754 dresult->AddToArray(MJsonNode::MakeNull());
773 dresult->AddToArray(MJsonNode::MakeJSON(buf));
778 dresult->AddToArray(MJsonNode::MakeNull());
789 MJsonNode* result = MJsonNode::MakeObject();
791 result->AddToObject(
"data",
dresult);
792 result->AddToObject(
"status",
sresult);
794 result->AddToObject(
"tid",
tresult);
798 result->AddToObject(
"last_written",
lwresult);
809 doc->D(
"get contents of given ODB subdirectory in the \"ls\" json encoding - similar to odbedit command \"ls -l\"");
811 doc->R(
"data[]",
MJSON_OBJECT,
"keys and values of ODB data for each path");
812 doc->R(
"status[]",
MJSON_INT,
"return status of db_copy_json_ls() for each path");
816 MJsonNode* error =
NULL;
820 MJsonNode*
dresult = MJsonNode::MakeArray();
821 MJsonNode*
sresult = MJsonNode::MakeArray();
826 for (
unsigned i=0;
i<
paths->size();
i++) {
829 std::string path = (*paths)[
i]->GetString();
833 dresult->AddToArray(MJsonNode::MakeNull());
846 dresult->AddToArray(MJsonNode::MakeJSON(buf));
849 dresult->AddToArray(MJsonNode::MakeNull());
864 doc->D(
"get complete ODB data in the \"save\" json encoding, suitable for reloading with odbedit command \"load\"");
866 doc->R(
"data[]",
MJSON_OBJECT,
"keys and values of ODB data for each path");
867 doc->R(
"status[]",
MJSON_INT,
"return status of db_copy_json_save() for each path");
871 MJsonNode* error =
NULL;
875 MJsonNode*
dresult = MJsonNode::MakeArray();
876 MJsonNode*
sresult = MJsonNode::MakeArray();
881 for (
unsigned i=0;
i<
paths->size();
i++) {
884 std::string path = (*paths)[
i]->GetString();
888 dresult->AddToArray(MJsonNode::MakeNull());
901 dresult->AddToArray(MJsonNode::MakeJSON(buf));
904 dresult->AddToArray(MJsonNode::MakeNull());
919 doc->D(
"write data into ODB");
920 doc->P(
"paths[]",
MJSON_STRING,
"array of ODB subtree paths, see note on array indices");
921 doc->P(
"values[]", 0,
"array of data values written to ODB via db_paste_json() for each path");
922 doc->R(
"status[]",
MJSON_INT,
"array of return status of db_paste_json() for each path");
926 MJsonNode* error =
NULL;
932 return mjsonrpc_make_error(-32602,
"Invalid params",
"paths and values should have the same length");
935 MJsonNode*
sresult = MJsonNode::MakeArray();
940 for (
unsigned i=0;
i<
paths->size();
i++) {
943 std::string path = (*paths)[
i]->GetString();
951 const MJsonNode* v = (*values)[
i];
954 if (path.find(
"[*]") != std::string::npos) {
961 }
else if (path.find(
"[") != std::string::npos) {
962 std::vector<unsigned>
list;
975 if (
list.size() < 1) {
976 cm_msg(
MERROR,
"js_db_paste",
"invalid array indices for array path \"%s\"", path.c_str());
979 }
else if (
list.size() == 1) {
981 cm_msg(
MERROR,
"js_db_paste",
"unexpected array of values for array path \"%s\"", path.c_str());
992 cm_msg(
MERROR,
"js_db_paste",
"length of values array %d should be same as number of indices %d for array path \"%s\"", (
int)
vvalues->size(), (
int)
list.size(), path.c_str());
997 MJsonNode *
ssresult = MJsonNode::MakeArray();
999 for (
unsigned j =0;
j <
list.size();
j++) {
1000 const MJsonNode*
vv = (*vvalues)[
j];
1003 cm_msg(
MERROR,
"js_db_paste",
"internal error: NULL array value at index %d for array path \"%s\"",
j, path.c_str());
1014 MJsonNode *
ssresult = MJsonNode::MakeArray();
1015 for (
unsigned j =0;
j <
list.size();
j++) {
1034 doc->D(
"Create new ODB entries");
1035 MJSO*
o =
doc->
PA(
"array of ODB paths to be created")->
AddObject(
"",
"arguments to db_create_key() and db_set_num_values()");
1037 o->Add(
"type",
MJSON_INT,
"MIDAS TID_xxx type");
1038 o->Add(
"array_length?",
MJSON_INT,
"optional array length, default is 1");
1039 o->Add(
"string_length?",
MJSON_INT,
"for TID_STRING, optional string length, default is NAME_LENGTH");
1040 doc->R(
"status[]",
MJSON_INT,
"return status of db_create_key(), db_set_num_values() and db_set_data() (for TID_STRING) for each path");
1044 MJsonNode*
sresult = MJsonNode::MakeArray();
1049 return mjsonrpc_make_error(-32602,
"Invalid params",
"parameters must be an array of objects");
1055 for (
unsigned i=0;
i<
pp->size();
i++) {
1056 const MJsonNode* p = (*pp)[
i];
1074 assert(buf !=
NULL);
1098 doc->D(
"delete ODB keys");
1100 doc->R(
"status[]",
MJSON_INT,
"return status of db_delete_key() for each path");
1104 MJsonNode* error =
NULL;
1108 MJsonNode*
sresult = MJsonNode::MakeArray();
1113 for (
unsigned i=0;
i<
paths->size();
i++) {
1116 std::string path = (*paths)[
i]->GetString();
1135 doc->D(
"Change size of ODB arrays");
1137 doc->P(
"new_lengths[]",
MJSON_INT,
"array of new lengths for each ODB path");
1138 doc->R(
"status[]",
MJSON_INT,
"return status of db_set_num_values() for each path");
1142 MJsonNode* error =
NULL;
1148 return mjsonrpc_make_error(-32602,
"Invalid params",
"arrays \"paths\" and \"new_lengths\" should have the same length");
1151 MJsonNode*
sresult = MJsonNode::MakeArray();
1156 for (
unsigned i=0;
i<
paths->size();
i++) {
1159 std::string path = (*paths)[
i]->GetString();
1167 int length = (*lengths)[
i]->GetInt();
1184 doc->D(
"Change size of ODB string arrays");
1186 doc->P(
"new_lengths[]",
MJSON_INT,
"array of new lengths for each ODB path");
1187 doc->P(
"new_string_lengths[]",
MJSON_INT,
"array of new string lengths for each ODB path");
1188 doc->R(
"status[]",
MJSON_INT,
"return status of db_resize_string() for each path");
1192 MJsonNode* error =
NULL;
1199 return mjsonrpc_make_error(-32602,
"Invalid params",
"arrays \"paths\" and \"new_lengths\" should have the same length");
1203 return mjsonrpc_make_error(-32602,
"Invalid params",
"arrays \"paths\" and \"new_string_lengths\" should have the same length");
1206 MJsonNode*
sresult = MJsonNode::MakeArray();
1211 for (
unsigned i=0;
i<
paths->size();
i++) {
1212 std::string path = (*paths)[
i]->GetString();
1214 int length = (*lengths)[
i]->GetInt();
1237 doc->D(
"get ODB keys");
1239 doc->R(
"status[]",
MJSON_INT,
"return status of db_key() for each path");
1242 doc->R(
"keys[].num_values",
MJSON_INT,
"array length, 1 for normal entries");
1244 doc->R(
"keys[].total_size",
MJSON_INT,
"data total size in bytes");
1245 doc->R(
"keys[].item_size",
MJSON_INT,
"array element size, string length for TID_STRING");
1246 doc->R(
"keys[].access_mode",
MJSON_INT,
"access mode bitmap of MODE_xxx");
1247 doc->R(
"keys[].notify_count",
MJSON_INT,
"number of hotlinks attached to this key");
1248 doc->R(
"keys[].last_written",
MJSON_INT,
"timestamp when data was last updated");
1252 MJsonNode* error =
NULL;
1256 MJsonNode*
kresult = MJsonNode::MakeArray();
1257 MJsonNode*
sresult = MJsonNode::MakeArray();
1262 for (
unsigned i=0;
i<
paths->size();
i++) {
1266 std::string path = (*paths)[
i]->GetString();
1270 kresult->AddToArray(MJsonNode::MakeNull());
1277 kresult->AddToArray(MJsonNode::MakeNull());
1282 MJsonNode*
jkey = MJsonNode::MakeObject();
1284 jkey->AddToObject(
"type", MJsonNode::MakeInt(
key.
type));
1287 jkey->AddToObject(
"name", MJsonNode::MakeString(
key.
name));
1305 doc->D(
"Change size of ODB arrays");
1307 doc->P(
"new_names[]",
MJSON_STRING,
"array of new names for each ODB path");
1308 doc->R(
"status[]",
MJSON_INT,
"return status of db_rename_key() for each path");
1312 MJsonNode* error =
NULL;
1318 return mjsonrpc_make_error(-32602,
"Invalid params",
"arrays \"paths\" and \"new_names\" should have the same length");
1321 MJsonNode*
sresult = MJsonNode::MakeArray();
1326 for (
unsigned i=0;
i<
paths->size();
i++) {
1329 std::string path = (*paths)[
i]->GetString();
1337 std::string
new_name = (*names)[
i]->GetString();
1355 doc->D(
"Create ODB symlinks");
1356 doc->P(
"new_links[]",
MJSON_STRING,
"array of new symlinks to be created");
1357 doc->P(
"target_paths[]",
MJSON_STRING,
"array of existing ODB paths for each link");
1358 doc->R(
"status[]",
MJSON_INT,
"return status of db_create_link() for each path");
1362 MJsonNode* error =
NULL;
1368 return mjsonrpc_make_error(-32602,
"Invalid params",
"arrays \"target_paths\" and \"new_links\" should have the same length");
1371 MJsonNode*
sresult = MJsonNode::MakeArray();
1378 std::string
target_path = (*target_paths)[
i]->GetString();
1379 std::string
new_link = (*new_links)[
i]->GetString();
1397 doc->D(
"Change order of ODB keys in a subdirectory");
1398 doc->P(
"paths[]",
MJSON_STRING,
"array of new symlinks to be created");
1399 doc->P(
"indices[]",
MJSON_INT,
"array of existing ODB paths for each link");
1400 doc->R(
"status[]",
MJSON_INT,
"return status of db_reorder_key() for each path");
1404 MJsonNode* error =
NULL;
1410 return mjsonrpc_make_error(-32602,
"Invalid params",
"arrays \"paths\" and \"indices\" should have the same length");
1413 MJsonNode*
sresult = MJsonNode::MakeArray();
1418 for (
unsigned i=0;
i<
paths->size();
i++) {
1421 std::string path = (*paths)[
i]->GetString();
1422 int index = (*indices)[
i]->GetInt();
1442 doc->D(
"Show ODB open records starting from given ODB path");
1448 MJsonNode* error =
NULL;
1464 doc->D(
"Show ODB clients");
1487 doc->D(
"get message facilities using cm_msg_facilities()");
1488 doc->R(
"status",
MJSON_INT,
"return status of cm_msg_facilities()");
1497 MJsonNode*
facilities = MJsonNode::MakeArray();
1499 for (
unsigned i=0;
i<
list.size();
i++) {
1512 doc->D(
"Generate a midas message using cm_msg1()");
1513 doc->P(
"facility?",
MJSON_STRING,
"message facility, default is \"midas\"");
1514 doc->P(
"user?",
MJSON_STRING,
"message user, default is \"javascript_commands\"");
1515 doc->P(
"type?",
MJSON_INT,
"message type, MT_xxx from midas.h, default is MT_INFO");
1517 doc->R(
"status",
MJSON_INT,
"return status of cm_msg1()");
1521 MJsonNode* error =
NULL;
1531 user =
"javascript_commands";
1544 doc->D(
"Retrieve midas messages using cm_msg_retrieve2()");
1545 doc->P(
"facility?",
MJSON_STRING,
"message facility, default is \"midas\"");
1546 doc->P(
"min_messages?",
MJSON_INT,
"get at least this many messages, default is 1");
1547 doc->P(
"time?",
MJSON_NUMBER,
"start from given timestamp, value 0 means give me newest messages, default is 0");
1548 doc->R(
"num_messages",
MJSON_INT,
"number of messages returned");
1550 doc->R(
"status",
MJSON_INT,
"return status of cm_msg_retrieve2()");
1566 MJsonNode* result = MJsonNode::MakeObject();
1568 result->AddToObject(
"status", MJsonNode::MakeInt(
status));
1569 result->AddToObject(
"num_messages", MJsonNode::MakeInt(
num_messages));
1573 result->AddToObject(
"messages", MJsonNode::MakeString(
messages));
1591 doc->D(
"reset alarms");
1593 doc->R(
"status[]",
MJSON_INT,
"return status of al_reset_alarm() for each alarm");
1597 MJsonNode* error =
NULL;
1601 MJsonNode*
sresult = MJsonNode::MakeArray();
1603 for (
unsigned i=0;
i<
alarms->size();
i++) {
1615 doc->D(
"trigger an alarm");
1621 doc->R(
"status",
MJSON_INT,
"return status of al_trigger_alarm()");
1625 MJsonNode* error =
NULL;
1630 std::string condition =
mjsonrpc_get_param(params,
"condition", &error)->GetString();
if (error)
return error;
1642 doc->D(
"trigger an alarm");
1645 doc->P(
"first?",
MJSON_BOOL,
"see al_trigger_class() in midas.c");
1646 doc->R(
"status",
MJSON_INT,
"return status of al_trigger_class()");
1650 MJsonNode* error =
NULL;
1673 doc->D(
"get list of active history events using hs_read_event_list()");
1674 doc->R(
"status",
MJSON_INT,
"return status of hs_read_event_list()");
1683 MJsonNode*
events = MJsonNode::MakeArray();
1685 for (
unsigned i=0;
i<
list.size();
i++) {
1693typedef std::map<std::string,MidasHistoryInterface*>
MhiMap;
1734 cm_msg(
MERROR,
"GetHistory",
"Cannot configure history, hs_get_history() status %d",
status);
1760 doc->D(
"get list of history channels in /Logger/History");
1761 doc->R(
"status",
MJSON_INT,
"return success or failure status");
1762 doc->R(
"default_channel",
MJSON_STRING,
"name of the default logger history channel");
1763 doc->R(
"channels[]",
MJSON_STRING,
"all logger history channel names");
1764 doc->R(
"active_channels[]",
MJSON_STRING,
"active logger history channel names");
1768 MJsonNode* channels = MJsonNode::MakeArray();
1800 channels->AddToArray(MJsonNode::MakeString(
key.
name));
1803 INT size =
sizeof(active);
1830 "channels", channels);
1837 doc->D(
"get list of history events that existed at give time using hs_get_events()");
1838 doc->P(
"channel?",
MJSON_STRING,
"midas history channel, default is the default reader channel");
1839 doc->P(
"time?",
MJSON_NUMBER,
"timestamp, value 0 means current time, default is 0");
1840 doc->R(
"status",
MJSON_INT,
"return status of hs_get_events()");
1851 MJsonNode*
events = MJsonNode::MakeArray();
1859 time = ::time(
NULL);
1866 for (
unsigned i=0;
i<
list.size();
i++) {
1878 doc->D(
"reopen the history channel to make sure we see the latest list of events using hs_clear_cache()");
1879 doc->P(
"channel?",
MJSON_STRING,
"midas history channel, default is the default reader channel");
1880 doc->R(
"status",
MJSON_INT,
"return status of hs_get_events()");
1903 doc->D(
"get list of history tags for given history events that existed at give time using hs_get_tags()");
1904 doc->P(
"channel?",
MJSON_STRING,
"midas history channel, default is the default reader channel");
1905 doc->P(
"time?",
MJSON_NUMBER,
"timestamp, value 0 means current time, default is 0");
1906 doc->P(
"events[]?",
MJSON_STRING,
"array of history event names, default is get all events using hs_get_events()");
1909 doc->R(
"events[].name",
MJSON_STRING,
"array of history event names for each history event");
1910 doc->R(
"events[].status",
MJSON_INT,
"array of status ohistory tags for each history event");
1911 doc->R(
"events[].tags[]",
MJSON_STRING,
"array of history tags for each history event");
1913 doc->R(
"events[].tags[].type",
MJSON_INT,
"history tag midas data type");
1914 doc->R(
"events[].tags[].n_data?",
MJSON_INT,
"history tag number of array elements, omitted if 1");
1923 time = ::time(
NULL);
1928 MJsonNode*
events = MJsonNode::MakeArray();
1935 std::vector<std::string> event_names;
1943 if (event_names.size() < 1) {
1950 for (
unsigned i=0;
i<event_names.size();
i++) {
1951 MJsonNode*
o = MJsonNode::MakeObject();
1952 const char* event_name = event_names[
i].c_str();
1953 std::vector<TAG> tags;
1956 o->AddToObject(
"name", MJsonNode::MakeString(event_name));
1957 o->AddToObject(
"status", MJsonNode::MakeInt(
status));
1958 MJsonNode *
ta = MJsonNode::MakeArray();
1959 for (
unsigned j=0;
j<tags.size();
j++) {
1960 MJsonNode*
to = MJsonNode::MakeObject();
1962 to->AddToObject(
"name", MJsonNode::MakeString(tags[
j].
name));
1963 to->AddToObject(
"type", MJsonNode::MakeInt(tags[
j].
type));
1964 if (tags[
j].n_data != 1) {
1965 to->AddToObject(
"n_data", MJsonNode::MakeInt(tags[
j].n_data));
1969 o->AddToObject(
"tags",
ta);
1981 doc->D(
"get list of history tags for given history events that existed at give time using hs_get_last_written()");
1982 doc->P(
"channel?",
MJSON_STRING,
"midas history channel, default is the default reader channel");
1983 doc->P(
"time?",
MJSON_NUMBER,
"timestamp, value 0 means current time, default is 0");
1986 doc->P(
"index[]",
MJSON_STRING,
"array of history event tag array indices");
1989 doc->R(
"last_written[]",
MJSON_NUMBER,
"array of last-written times for each history event");
2002 MJsonNode*
lw = MJsonNode::MakeArray();
2012 return mjsonrpc_make_error(-32602,
"Invalid params",
"Arrays events and tags should have the same length");
2016 return mjsonrpc_make_error(-32602,
"Invalid params",
"Arrays events and index should have the same length");
2019 std::vector<std::string> event_names(
num_var);
2023 int* var_index =
new int[
num_var];
2029 event_names[
i] = (*events_array)[
i]->GetString();
2031 var_index[
i] = (*index_array)[
i]->GetInt();
2042 time = ::time(
NULL);
2046 const char** event_name =
new const char*[
num_var];
2047 const char** tag_name =
new const char*[
num_var];
2049 event_name[
i] = event_names[
i].c_str();
2056 printf(
"%d: last_written %d\n",
i, (
int)last_written[
i]);
2058 lw->AddToArray(MJsonNode::MakeNumber(last_written[
i]));
2061 delete[] event_name;
2064 delete[] last_written;
2095 fTimeJson += MJsonNode::EncodeDouble(t);
2110 doc->D(
"get history data for given history events that existed at give time using hs_read_buffer()");
2111 doc->P(
"channel?",
MJSON_STRING,
"midas history channel, default is the default reader channel");
2116 doc->P(
"index[]",
MJSON_STRING,
"array of history event tag array indices");
2120 doc->R(
"data[].status",
MJSON_INT,
"status for each event");
2121 doc->R(
"data[].count",
MJSON_INT,
"number of data for each event");
2127 MJsonNode* error =
NULL;
2130 double start_time =
mjsonrpc_get_param(params,
"start_time", &error)->GetDouble();
if (error)
return error;
2131 double end_time =
mjsonrpc_get_param(params,
"end_time", &error)->GetDouble();
if (error)
return error;
2139 MJsonNode*
data = MJsonNode::MakeArray();
2149 return mjsonrpc_make_error(-32602,
"Invalid params",
"Arrays events and tags should have the same length");
2153 return mjsonrpc_make_error(-32602,
"Invalid params",
"Arrays events and index should have the same length");
2156 std::vector<std::string> event_names(
num_var);
2158 int* var_index =
new int[
num_var];
2166 event_names[
i] = (*events_array)[
i]->GetString();
2168 var_index[
i] = (*index_array)[
i]->GetInt();
2175 printf(
"time %f %f, num_vars %d:\n", start_time, end_time,
num_var);
2181 const char** event_name =
new const char*[
num_var];
2182 const char** tag_name =
new const char*[
num_var];
2184 event_name[
i] = event_names[
i].c_str();
2193 MJsonNode*
obj = MJsonNode::MakeObject();
2194 obj->AddToObject(
"status", MJsonNode::MakeInt(
hs_status[
i]));
2195 obj->AddToObject(
"count", MJsonNode::MakeInt(
jbuf[
i]->fCount));
2196 obj->AddToObject(
"time", MJsonNode::MakeJSON(
jbuf[
i]->fTimeJson.c_str()));
2197 obj->AddToObject(
"value", MJsonNode::MakeJSON(
jbuf[
i]->fValueJson.c_str()));
2205 delete[] event_name;
2219 doc->D(
"get history data for given history events that existed at give time using hs_read_buffer()");
2220 doc->P(
"channel?",
MJSON_STRING,
"midas history channel, default is the default reader channel");
2226 doc->P(
"index[]",
MJSON_STRING,
"array of history event tag array indices");
2230 doc->R(
"data[].status",
MJSON_INT,
"status for each event");
2231 doc->R(
"data[].num_entries",
MJSON_INT,
"number of data points for each event");
2232 doc->R(
"data[].count[]",
MJSON_INT,
"number of data points for each bin");
2237 doc->R(
"data[].bins_first_time[]",
MJSON_NUMBER,
"first data point in each bin");
2238 doc->R(
"data[].bins_first_value[]",
MJSON_NUMBER,
"first data point in each bin");
2239 doc->R(
"data[].bins_last_time[]",
MJSON_NUMBER,
"last data point in each bin");
2240 doc->R(
"data[].bins_last_value[]",
MJSON_NUMBER,
"last data point in each bin");
2242 doc->R(
"data[].last_value",
MJSON_NUMBER,
"value of last data entry");
2246 MJsonNode* error =
NULL;
2249 double start_time =
mjsonrpc_get_param(params,
"start_time", &error)->GetDouble();
if (error)
return error;
2250 double end_time =
mjsonrpc_get_param(params,
"end_time", &error)->GetDouble();
if (error)
return error;
2254 return mjsonrpc_make_error(-32602,
"Invalid params",
"Value of num_bins should be 1 or more");
2263 MJsonNode*
data = MJsonNode::MakeArray();
2273 return mjsonrpc_make_error(-32602,
"Invalid params",
"Array of events should have 1 or more elements");
2277 return mjsonrpc_make_error(-32602,
"Invalid params",
"Arrays events and tags should have the same length");
2281 return mjsonrpc_make_error(-32602,
"Invalid params",
"Arrays events and index should have the same length");
2284 std::vector<std::string> event_names(
num_var);
2288 int* var_index =
new int[
num_var];
2290 int* num_entries =
new int[
num_var];
2310 event_names[
i] = (*events_array)[
i]->GetString();
2312 var_index[
i] = (*index_array)[
i]->GetInt();
2331 printf(
"time %f %f, num_vars %d:\n", start_time, end_time,
num_var);
2337 const char** event_name =
new const char*[
num_var];
2338 const char** tag_name =
new const char*[
num_var];
2340 event_name[
i] = event_names[
i].c_str();
2344 int status =
mh->
hs_read_binned(start_time, end_time,
num_bins,
num_var, event_name, tag_name, var_index, num_entries,
count_bins,
mean_bins,
rms_bins,
min_bins,
max_bins,
bins_first_time,
bins_first_value,
bins_last_time,
bins_last_value,
last_time,
last_value,
hs_status);
2347 MJsonNode*
obj = MJsonNode::MakeObject();
2348 obj->AddToObject(
"status", MJsonNode::MakeInt(
hs_status[
i]));
2349 obj->AddToObject(
"num_entries", MJsonNode::MakeInt(num_entries[
i]));
2351 MJsonNode*
a1 = MJsonNode::MakeArray();
2352 MJsonNode*
a2 = MJsonNode::MakeArray();
2353 MJsonNode*
a3 = MJsonNode::MakeArray();
2354 MJsonNode*
a4 = MJsonNode::MakeArray();
2355 MJsonNode*
a5 = MJsonNode::MakeArray();
2357 MJsonNode*
b1 = MJsonNode::MakeArray();
2358 MJsonNode*
b2 = MJsonNode::MakeArray();
2359 MJsonNode*
b3 = MJsonNode::MakeArray();
2360 MJsonNode*
b4 = MJsonNode::MakeArray();
2375 obj->AddToObject(
"count",
a1);
2376 obj->AddToObject(
"mean",
a2);
2377 obj->AddToObject(
"rms",
a3);
2378 obj->AddToObject(
"min",
a4);
2379 obj->AddToObject(
"max",
a5);
2380 obj->AddToObject(
"bins_first_time",
b1);
2381 obj->AddToObject(
"bins_first_value",
b2);
2382 obj->AddToObject(
"bins_last_time",
b3);
2383 obj->AddToObject(
"bins_last_value",
b4);
2384 obj->AddToObject(
"last_time", MJsonNode::MakeNumber(
last_time[
i]));
2385 obj->AddToObject(
"last_value", MJsonNode::MakeNumber(
last_value[
i]));
2411 delete[] event_name;
2415 delete[] num_entries;
2453 doc->D(
"get history data for given history events that existed at give time using hs_read_buffer()");
2454 doc->P(
"channel?",
MJSON_STRING,
"midas history channel, default is the default reader channel");
2459 doc->P(
"index[]",
MJSON_STRING,
"array of history event tag array indices");
2464 MJsonNode* error =
NULL;
2467 double start_time =
mjsonrpc_get_param(params,
"start_time", &error)->GetDouble();
if (error)
return error;
2468 double end_time =
mjsonrpc_get_param(params,
"end_time", &error)->GetDouble();
if (error)
return error;
2484 return mjsonrpc_make_error(-32602,
"Invalid params",
"Arrays events and tags should have the same length");
2488 return mjsonrpc_make_error(-32602,
"Invalid params",
"Arrays events and index should have the same length");
2491 std::vector<std::string> event_names(
num_var);
2493 int* var_index =
new int[
num_var];
2501 event_names[
i] = (*events_array)[
i]->GetString();
2503 var_index[
i] = (*index_array)[
i]->GetInt();
2510 printf(
"time %f %f, num_vars %d:\n", start_time, end_time,
int(
num_var));
2516 const char** event_name =
new const char*[
num_var];
2517 const char** tag_name =
new const char*[
num_var];
2519 event_name[
i] = event_names[
i].c_str();
2525 size_t num_values = 0;
2529 num_values +=
jbuf[
i]->fValues.size();
2546 delete[] event_name;
2559 cm_msg(
MERROR,
"js_hs_read_binned_arraybuffer",
"Cannot allocate return buffer %d bytes\n",
int(
p0_size));
2567 delete[] event_name;
2574 return mjsonrpc_make_error(-32603,
"Internal error",
"Cannot allocate buffer, too much data");
2607 size_t nv =
jbuf[
i]->fValues.size();
2608 for (
size_t j=0;
j<
nv;
j++) {
2622 delete[] event_name;
2629 MJsonNode* result = MJsonNode::MakeArrayBuffer((
char*)
p0,
p0_size);
2638 doc->D(
"get history data for given history events that existed at give time using hs_read_buffer()");
2639 doc->P(
"channel?",
MJSON_STRING,
"midas history channel, default is the default reader channel");
2645 doc->P(
"index[]",
MJSON_STRING,
"array of history event tag array indices");
2650 MJsonNode* error =
NULL;
2653 double start_time =
mjsonrpc_get_param(params,
"start_time", &error)->GetDouble();
if (error)
return error;
2654 double end_time =
mjsonrpc_get_param(params,
"end_time", &error)->GetDouble();
if (error)
return error;
2658 return mjsonrpc_make_error(-32602,
"Invalid params",
"Value of num_bins should be 1 or more");
2677 return mjsonrpc_make_error(-32602,
"Invalid params",
"Array of events should have 1 or more elements");
2681 return mjsonrpc_make_error(-32602,
"Invalid params",
"Arrays events and tags should have the same length");
2685 return mjsonrpc_make_error(-32602,
"Invalid params",
"Arrays events and index should have the same length");
2688 std::vector<std::string> event_names(
num_var);
2692 int* var_index =
new int[
num_var];
2694 int* num_entries =
new int[
num_var];
2714 event_names[
i] = (*events_array)[
i]->GetString();
2716 var_index[
i] = (*index_array)[
i]->GetInt();
2733 printf(
"time %f %f, num_vars %d:\n", start_time, end_time,
int(
num_var));
2739 const char** event_name =
new const char*[
num_var];
2740 const char** tag_name =
new const char*[
num_var];
2742 event_name[
i] = event_names[
i].c_str();
2746 int status =
mh->
hs_read_binned(start_time, end_time,
num_bins,
num_var, event_name, tag_name, var_index, num_entries,
count_bins,
mean_bins,
rms_bins,
min_bins,
max_bins,
bins_first_time,
bins_first_value,
bins_last_time,
bins_last_value,
last_time,
last_value,
hs_status);
2779 delete[] event_name;
2783 delete[] num_entries;
2794 cm_msg(
MERROR,
"js_hs_read_binned_arraybuffer",
"Cannot allocate return buffer %d bytes\n",
int(
p0_size));
2819 delete[] event_name;
2823 delete[] num_entries;
2828 return mjsonrpc_make_error(-32603,
"Internal error",
"Cannot allocate buffer, too much data");
2867 *
pptr++ = start_time;
2877 *
pptr++ = num_entries[
i];
2927 delete[] event_name;
2931 delete[] num_entries;
2936 MJsonNode* result = MJsonNode::MakeArrayBuffer((
char*)
p0,
p0_size);
2950 doc->D(
"Get a list of history image files");
2951 doc->P(
"image?",
MJSON_STRING,
"image name as defined under /History/Images/<image>");
2959 MJsonNode* error =
NULL;
2962 double start_time =
mjsonrpc_get_param(params,
"start_time", &error)->GetDouble();
if (error)
return error;
2963 double end_time =
mjsonrpc_get_param(params,
"end_time", &error)->GetDouble();
if (error)
return error;
2965 std::vector<time_t>
vtime{};
2970 MJsonNode *
tj = MJsonNode::MakeArray();
2971 MJsonNode *
fj = MJsonNode::MakeArray();
2974 tj->AddToArray(MJsonNode::MakeInt(
vtime[
i]));
2978 MJsonNode*
data = MJsonNode::MakeObject();
2979 data->AddToObject(
"count", MJsonNode::MakeInt(
count));
2980 data->AddToObject(
"time",
tj);
2981 data->AddToObject(
"filename",
fj);
2996 doc->D(
"Get an elog message");
2998 doc->R(
"status",
MJSON_INT,
"return status of el_retrieve");
3003 MJsonNode* error =
NULL;
3005 std::string tag =
mjsonrpc_get_param(params,
"tag", &error)->GetString();
if (error)
return error;
3014 int size =
sizeof(text);
3023 MJsonNode* msg = MJsonNode::MakeObject();
3027 msg->AddToObject(
"tag", MJsonNode::MakeString(
xtag));
3029 msg->AddToObject(
"date", MJsonNode::MakeString(
date));
3030 msg->AddToObject(
"run", MJsonNode::MakeInt(
run));
3032 msg->AddToObject(
"author", MJsonNode::MakeString(author));
3034 msg->AddToObject(
"type", MJsonNode::MakeString(
type));
3036 msg->AddToObject(
"system", MJsonNode::MakeString(
system));
3038 msg->AddToObject(
"subject", MJsonNode::MakeString(
subject));
3040 msg->AddToObject(
"text", MJsonNode::MakeString(text));
3042 msg->AddToObject(
"orig_tag", MJsonNode::MakeString(
orig_tag));
3044 msg->AddToObject(
"reply_tag", MJsonNode::MakeString(
reply_tag));
3046 msg->AddToObject(
"attachment0", MJsonNode::MakeString(
attachment[0]));
3048 msg->AddToObject(
"attachment1", MJsonNode::MakeString(
attachment[1]));
3050 msg->AddToObject(
"attachment2", MJsonNode::MakeString(
attachment[2]));
3052 msg->AddToObject(
"encoding", MJsonNode::MakeString(
encoding));
3062 doc->D(
"Query elog messages");
3063 doc->P(
"last_n_hours?",
MJSON_INT,
"return messages from the last N hours");
3064 doc->R(
"status",
MJSON_INT,
"return status of el_retrieve");
3091 MJsonNode*
msg_array = MJsonNode::MakeArray();
3096 char str[256],
str2[10000], tag[256];
3100 extern const char *
mname[];
3127 if (
py1.length() > 0)
3130 if (
pd1.length() > 0)
3134 for (
m1 = 0;
m1 < 12;
m1++)
3140 if (
pd2.length() > 0) {
3144 if (
py2.length() > 0) {
3148 for (
m2 = 0;
m2 < 12;
m2++)
3156 if (
py2.length() > 0) {
3160 if (
y2>=0 &&
m2>=0 &&
d2>=0) {
3162 tms.tm_year =
y2 % 100;
3167 if (
tms.tm_year < 90)
3183 sprintf(tag,
"%02d%02d%02d.0",
tms.tm_year % 100,
tms.tm_mon + 1,
tms.tm_mday);
3184 }
else if (
r1 > 0) {
3187 }
else if (
y1>=0 &&
m1>=0 &&
d1>=0) {
3193 printf(
"js_el_query: y1 %d, m1 %d, d1 %d, y2 %d, m2 %d, d2 %d, r1 %d, r2 %d, last_n_hours %d, start time %lu, end time %lu, tag [%s]\n",
3204 size =
sizeof(text);
3222 tms.tm_year = (tag[0] -
'0') * 10 + (tag[1] -
'0');
3223 tms.tm_mon = (tag[2] -
'0') * 10 + (tag[3] -
'0') - 1;
3224 tms.tm_mday = (tag[4] -
'0') * 10 + (tag[5] -
'0');
3225 tms.tm_hour = (
date[11] -
'0') * 10 + (
date[12] -
'0');
3226 tms.tm_min = (
date[14] -
'0') * 10 + (
date[15] -
'0');
3227 tms.tm_sec = (
date[17] -
'0') * 10 + (
date[18] -
'0');
3229 if (
tms.tm_year < 90)
3259 for (
i = 0;
i < (
int)
strlen(author) && author[
i] !=
'@';
i++)
3295 MJsonNode* msg = MJsonNode::MakeObject();
3298 msg->AddToObject(
"tag", MJsonNode::MakeString(
this_tag.c_str()));
3300 msg->AddToObject(
"date", MJsonNode::MakeString(
date));
3301 msg->AddToObject(
"run", MJsonNode::MakeInt(
run));
3303 msg->AddToObject(
"author", MJsonNode::MakeString(author));
3305 msg->AddToObject(
"type", MJsonNode::MakeString(
type));
3307 msg->AddToObject(
"system", MJsonNode::MakeString(
system));
3309 msg->AddToObject(
"subject", MJsonNode::MakeString(
subject));
3311 msg->AddToObject(
"text", MJsonNode::MakeString(text));
3313 msg->AddToObject(
"orig_tag", MJsonNode::MakeString(
orig_tag));
3315 msg->AddToObject(
"reply_tag", MJsonNode::MakeString(
reply_tag));
3317 msg->AddToObject(
"attachment0", MJsonNode::MakeString(
attachment[0]));
3319 msg->AddToObject(
"attachment1", MJsonNode::MakeString(
attachment[1]));
3321 msg->AddToObject(
"attachment2", MJsonNode::MakeString(
attachment[2]));
3323 msg->AddToObject(
"encoding", MJsonNode::MakeString(
encoding));
3337 doc->D(
"Delete elog message");
3339 doc->R(
"status",
MJSON_INT,
"return status of el_delete");
3343 MJsonNode* error =
NULL;
3344 std::string tag =
mjsonrpc_get_param(params,
"tag", &error)->GetString();
if (error)
return error;
3356static MJsonNode*
jrpc(
const MJsonNode* params)
3360 doc->D(
"make RPC call into frontend program via RPC_JRPC");
3361 doc->P(
"client_name",
MJSON_STRING,
"Connect to this MIDAS client, see cm_connect_client()");
3363 doc->P(
"args",
MJSON_STRING,
"Parameters passed to client as a string, could be JSON encoded");
3364 doc->P(
"max_reply_length?",
MJSON_INT,
"Optional maximum length of client reply. MIDAS RPC does not support returning strings of arbitrary length, maximum length has to be known ahead of time.");
3365 doc->R(
"reply",
MJSON_STRING,
"Reply from client as a string, could be JSON encoded");
3366 doc->R(
"status",
MJSON_INT,
"return status of cm_connect_client() and rpc_client_call()");
3370 MJsonNode* error =
NULL;
3372 std::string
name =
mjsonrpc_get_param(params,
"client_name", &error)->GetString();
if (error)
return error;
3373 std::string cmd =
mjsonrpc_get_param(params,
"cmd", &error)->GetString();
if (error)
return error;
3409 MJsonNode*
reply = MJsonNode::MakeString(buf);
3421static MJsonNode*
brpc(
const MJsonNode* params)
3425 doc->D(
"make RPC call into frontend program via RPC_BRPC");
3426 doc->P(
"client_name",
MJSON_STRING,
"Connect to this MIDAS client, see cm_connect_client()");
3428 doc->P(
"args",
MJSON_STRING,
"Parameters passed to client as a string, could be JSON encoded");
3429 doc->P(
"max_reply_length?",
MJSON_INT,
"Optional maximum length of client reply. MIDAS RPC does not support returning data of arbitrary length, maximum length has to be known ahead of time.");
3430 doc->R(
"reply",
MJSON_STRING,
"Reply from client as a string, could be JSON encoded");
3431 doc->R(
"status",
MJSON_INT,
"return status of cm_connect_client() and rpc_client_call()");
3435 MJsonNode* error =
NULL;
3437 std::string
name =
mjsonrpc_get_param(params,
"client_name", &error)->GetString();
if (error)
return error;
3438 std::string cmd =
mjsonrpc_get_param(params,
"cmd", &error)->GetString();
if (error)
return error;
3473 return MJsonNode::MakeArrayBuffer(buf,
buf_length);
3486 doc->D(
"start and stop runs");
3487 doc->P(
"transition",
MJSON_STRING,
"requested transition: TR_START, TR_STOP, TR_PAUSE, TR_RESUME");
3488 doc->P(
"run_number?",
MJSON_INT,
"New run number, value 0 means /runinfo/run_number + 1, default is 0");
3489 doc->P(
"async_flag?",
MJSON_INT,
"Transition type. Default is multithreaded transition TR_MTHREAD");
3490 doc->P(
"debug_flag?",
MJSON_INT,
"See cm_transition(), value 1: trace to stdout, value 2: trace to midas.log");
3491 doc->R(
"status",
MJSON_INT,
"return status of cm_transition()");
3492 doc->R(
"error_string?",
MJSON_STRING,
"return error string from cm_transition()");
3496 MJsonNode* error =
NULL;
3519 if (async_flag == 0)
3526 MJsonNode* result = MJsonNode::MakeObject();
3528 result->AddToObject(
"status", MJsonNode::MakeInt(
status));
3531 result->AddToObject(
"error_string", MJsonNode::MakeString(
error_str));
3583 printf(
", size %d, serial %d, time %d, event_id %d, trigger_mask %x",
pevent->
data_size,
pevent->
serial_number,
pevent->
time_stamp,
pevent->
event_id,
pevent->
trigger_mask);
3599 s->ReplaceEvent(pevent);
3601 }
else if (
bm_match_event(s->event_id, s->trigger_mask, pevent)) {
3602 s->ReplaceEvent(pevent);
3624 s->ReplaceEvent(pevent);
3667 doc->D(
"read event buffers");
3669 doc->P(
"event_id?",
MJSON_INT,
"requested event id, -1 means any event id");
3670 doc->P(
"trigger_mask?",
MJSON_INT,
"requested trigger mask, -1 means any trigger mask");
3671 doc->P(
"get_recent?",
MJSON_BOOL,
"get last available event that matches this event request");
3672 doc->P(
"last_event_header[]?",
MJSON_INT,
"do not resend an event we already received: event header of last received event [event_id,trigger_mask,serial_number,time_stamp]");
3673 doc->P(
"timeout_millisec?",
MJSON_NUMBER,
"how long to wait for an event");
3675 doc->R(
"status",
MJSON_INT,
"return status of bm_open_buffer(), bm_request_event(), bm_set_cache_size(), bm_receive_alloc()");
3679 MJsonNode* error =
NULL;
3695 return mjsonrpc_make_error(-32602,
"Invalid params",
"last_event_header should be an array with 4 elements");
3716 HNDLE buffer_handle = 0;
3724 static std::mutex
gMutex;
3725 std::lock_guard<std::mutex> lock_guard(
gMutex);
3734 MJsonNode* result = MJsonNode::MakeObject();
3735 result->AddToObject(
"status", MJsonNode::MakeInt(
status));
3740 MJsonNode* result = MJsonNode::MakeObject();
3741 result->AddToObject(
"status", MJsonNode::MakeInt(
status));
3747 MJsonNode* result = MJsonNode::MakeObject();
3748 result->AddToObject(
"status", MJsonNode::MakeInt(
status));
3786 return MJsonNode::MakeArrayBuffer((
char*)pevent,
event_size);
3801 MJsonNode* result = MJsonNode::MakeObject();
3802 result->AddToObject(
"status", MJsonNode::MakeInt(
status));
3816 return MJsonNode::MakeArrayBuffer((
char*)pevent,
event_size);
3819 MJsonNode* result = MJsonNode::MakeObject();
3834 doc->D(
"get current MIDAS time using ss_millitime()");
3835 doc->P(
NULL, 0,
"there are no input parameters");
3853 doc->D(
"get alarm data");
3854 doc->P(
"get_all?",
MJSON_BOOL,
"get all alarms, even in alarm system not active and alarms not triggered");
3855 doc->R(
"status",
MJSON_INT,
"return status of midas library calls");
3856 doc->R(
"alarm_system_active",
MJSON_BOOL,
"value of ODB \"/Alarms/alarm system active\"");
3858 doc->R(
"alarms[].triggered",
MJSON_BOOL,
"alarm is triggered");
3861 doc->R(
"alarms[].type",
MJSON_INT,
"alarm type AT_xxx");
3865 doc->R(
"alarms[].condition",
MJSON_STRING,
"alarm ODB condition field");
3866 doc->R(
"alarms[].evaluated_value?",
MJSON_STRING,
"evaluated alarm condition (AT_EVALUATED alarms only)");
3867 doc->R(
"alarms[].periodic_next_time?",
MJSON_STRING,
"next time the periodic alarm will fire (AT_PERIODIC alarms only)");
3868 doc->R(
"alarms[].time_triggered_first",
MJSON_STRING,
"time when alarm was triggered");
3869 doc->R(
"alarms[].show_to_user",
MJSON_STRING,
"final alarm text shown to user by mhttpd");
3892 size =
sizeof(
flag);
3905 "alarms", MJsonNode::MakeObject());
3916 MJsonNode*
alarms = MJsonNode::MakeObject();
3918 for (
int i = 0;;
i++) {
3932 size =
sizeof(
flag);
3940 MJsonNode* a = MJsonNode::MakeObject();
3942 a->AddToObject(
"triggered", MJsonNode::MakeBool(
flag!=0));
3945 size =
sizeof(
BOOL);
3948 a->AddToObject(
"active", MJsonNode::MakeBool(
flag!=0));
3951 strcpy(alarm_class,
"Alarm");
3952 size =
sizeof(alarm_class);
3956 a->AddToObject(
"class", MJsonNode::MakeString(alarm_class));
3959 size =
sizeof(
atype);
3962 a->AddToObject(
"type", MJsonNode::MakeInt(
atype));
3967 strcpy(
bgcol,
"red");
3969 if (
strlen(alarm_class) > 0) {
3970 sprintf(
str,
"/Alarms/Classes/%s/Display BGColor", alarm_class);
3971 size =
sizeof(
bgcol);
3976 a->AddToObject(
"bgcolor", MJsonNode::MakeString(
bgcol));
3979 strcpy(
fgcol,
"black");
3981 if (
strlen(alarm_class) > 0) {
3982 sprintf(
str,
"/Alarms/Classes/%s/Display FGColor", alarm_class);
3983 size =
sizeof(
fgcol);
3988 a->AddToObject(
"fgcolor", MJsonNode::MakeString(
fgcol));
3991 if (
strlen(alarm_class) > 0) {
3992 size =
sizeof(
BOOL);
3993 sprintf(
str,
"/Alarms/Classes/%s/Alarm sound", alarm_class);
3996 a->AddToObject(
"alarm_sound", MJsonNode::MakeBool(
flag!=0));
4004 a->AddToObject(
"message", MJsonNode::MakeString(msg));
4008 size =
sizeof(cond);
4012 a->AddToObject(
"condition", MJsonNode::MakeString(cond));
4022 a->AddToObject(
"evaluated_value", MJsonNode::MakeString(
value.c_str()));
4027 a->AddToObject(
"show_to_user", MJsonNode::MakeString(
show_to_user.c_str()));
4034 a->AddToObject(
"time_triggered_first", MJsonNode::MakeString(
str));
4038 size =
sizeof(
last);
4056 a->AddToObject(
"periodic_next_time", MJsonNode::MakeString(
ctimebuf));
4077 doc->D(
"js_make_subdir");
4078 doc->P(
"subdir",
MJSON_STRING,
"Create folder experiment_directory/userfiles/subdir");
4079 doc->R(
"status",
MJSON_INT,
"return status of midas library calls");
4084 MJsonNode* error =
NULL;
4086 std::string subdir =
mjsonrpc_get_param(params,
"subdir", &error)->GetString();
if (error)
return error;
4089 if (subdir.find(
"..") != std::string::npos) {
4106 path +=
"userfiles";
4111 if (
mkdir(path.c_str(), 0777) != 0) {
4117 if (subdir.length() > 0) {
4126 if (
mkdir(path.c_str(), 0777) != 0) {
4132 MJsonNode* r = MJsonNode::MakeObject();
4133 r->AddToObject(
"status", MJsonNode::MakeInt(
SUCCESS));
4135 r->AddToObject(
"path", MJsonNode::MakeString(path.c_str()));
4143 doc->D(
"js_ext_list_files");
4144 doc->P(
"subdir",
MJSON_STRING,
"List files in experiment_directory/userfiles/subdir");
4146 doc->R(
"status",
MJSON_INT,
"return status of midas library calls");
4154 MJsonNode* error =
NULL;
4155 std::string subdir =
mjsonrpc_get_param(params,
"subdir", &error)->GetString();
if (error)
return error;
4159 if (subdir.find(
"..") != std::string::npos) {
4164 if (
fileext.find(
"..") != std::string::npos) {
4192 path +=
"userfiles";
4197 if (
mkdir(path.c_str(), 0777) != 0) {
4202 if (subdir.length() > 0) {
4210 MJsonNode* s = MJsonNode::MakeArray();
4215 for (
int i=0 ;
i<
n ;
i++) {
4223 MJsonNode* f = MJsonNode::MakeArray();
4234 for (
int i=0 ;
i<
n ;
i++) {
4236 MJsonNode*
o = MJsonNode::MakeObject();
4245 o->AddToObject(
"description", MJsonNode::MakeString(
"description"));
4247 o->AddToObject(
"modtime", MJsonNode::MakeInt(
modtime));
4249 o->AddToObject(
"size", MJsonNode::MakeInt(
fsize));
4256 MJsonNode* r = MJsonNode::MakeObject();
4257 r->AddToObject(
"status", MJsonNode::MakeInt(
SUCCESS));
4259 r->AddToObject(
"path", MJsonNode::MakeString(path.c_str()));
4260 r->AddToObject(
"subdirs", s);
4261 r->AddToObject(
"files", f);
4271 doc->D(
"js_ext_save_file");
4272 doc->P(
"filename",
MJSON_STRING,
"File name, save in experiment_directory/userfiles/filename");
4274 doc->R(
"status",
MJSON_INT,
"return status of midas library calls");
4281 MJsonNode* error =
NULL;
4282 std::string filename =
mjsonrpc_get_param(params,
"filename", &error)->GetString();
if (error)
return error;
4286 if (filename.find(
"..") != std::string::npos ) {
4305 return mjsonrpc_make_result(
"status", MJsonNode::MakeInt(
status),
"error", MJsonNode::MakeString(
"cm_get_experiment_database() error"));
4309 path +=
"userfiles";
4314 if (
mkdir(path.c_str(), 0777) != 0) {
4337 std::string errstr =
"no error";
4347 doc->D(
"js_ext_read_script");
4348 doc->P(
"filename",
MJSON_STRING,
"File name, read from experiment_directory/userfiles/filename");
4350 doc->R(
"status",
MJSON_INT,
"return status of midas library calls");
4355 MJsonNode* error =
NULL;
4356 std::string filename =
mjsonrpc_get_param(params,
"filename", &error)->GetString();
if (error)
return error;
4359 if (filename.find(
"..") != std::string::npos ||
4360 filename.find(
"*") != std::string::npos) {
4370 return mjsonrpc_make_result(
"status", MJsonNode::MakeInt(
status),
"error", MJsonNode::MakeString(
"cm_get_experiment_database() error"));
4377 path +=
"userfiles";
4382 if (
mkdir(path.c_str(), 0777) != 0) {
4403 char* buffer =
new char[file_size+1];
4404 fread(buffer, file_size, 1,
fp);
4406 buffer[file_size] =
'\0';
4414 std::string errstr =
"no error";
4416 return mjsonrpc_make_result(
"content", MJsonNode::MakeString(
content.c_str()),
"status", MJsonNode::MakeInt(
status),
"error", MJsonNode::MakeString(errstr.c_str()));
4428 doc->D(
"js_read_binary_file");
4429 doc->P(
"filename",
MJSON_STRING,
"File name, read from experiment_directory/userfiles/filename");
4431 doc->R(
"status",
MJSON_INT,
"Return status of midas library calls");
4436 MJsonNode* error =
NULL;
4438 if (error)
return error;
4441 if (filename.find(
"..") != std::string::npos ||
4442 filename.find(
"*") != std::string::npos) {
4452 return mjsonrpc_make_result(
"status", MJsonNode::MakeInt(
status),
"error", MJsonNode::MakeString(
"cm_get_experiment_database() error"));
4459 path +=
"userfiles";
4464 if (
mkdir(path.c_str(), 0777) != 0) {
4485 char* buffer =
new char[file_size];
4486 fread(buffer, file_size, 1,
fp);
4492 std::string errstr =
"no error";
4494 MJsonNode* result = MJsonNode::MakeArrayBuffer(buffer, file_size);
4509 doc->D(
"get current value of mjsonrpc_debug");
4510 doc->P(
NULL, 0,
"there are no input parameters");
4522 doc->D(
"set new value of mjsonrpc_debug");
4536 doc->D(
"get current value of mjsonrpc_sleep");
4537 doc->P(
NULL, 0,
"there are no input parameters");
4549 doc->D(
"set new value of mjsonrpc_sleep");
4563 doc->D(
"get current value of mjsonrpc_time");
4564 doc->P(
NULL, 0,
"there are no input parameters");
4576 doc->D(
"set new value of mjsonrpc_time");
4590 doc->D(
"Get the MIDAS JSON-RPC schema JSON object");
4591 doc->P(
NULL, 0,
"there are no input parameters");
4603 doc->D(
"get current server timezone offset in seconds");
4604 doc->P(
NULL, 0,
"there are no input parameters");
4650 gMutex = (std::mutex*)mutex;
4656 printf(
"mjsonrpc_init!\n");
4740 printf(
"mjsonrpc_exit!\n");
4749 MJsonNode* s = MJsonNode::MakeObject();
4751 s->AddToObject(
"$schema", MJsonNode::MakeString(
"http://json-schema.org/schema#"));
4752 s->AddToObject(
"id", MJsonNode::MakeString(
"MIDAS JSON-RPC autogenerated schema"));
4753 s->AddToObject(
"title", MJsonNode::MakeString(
"MIDAS JSON-RPC schema"));
4754 s->AddToObject(
"description", MJsonNode::MakeString(
"Autogenerated schema for all MIDAS JSON-RPC methods"));
4755 s->AddToObject(
"type", MJsonNode::MakeString(
"object"));
4757 MJsonNode* m = MJsonNode::MakeObject();
4763 MJsonNode*
doc = iterator->second.fHandler(
NULL);
4765 doc = MJsonNode::MakeObject();
4766 m->AddToObject(iterator->first.c_str(),
doc);
4769 s->AddToObject(
"properties", m);
4770 s->AddToObject(
"required", MJsonNode::MakeArray());
4785 std::string
str = s->Stringify(1);
4786 printf(
"MJSON-RPC schema:\n");
4792static std::string
indent(
int x,
const char* p =
" ")
4797 for (
int i=0;
i<x;
i++)
4818 void Output(
int nest,
bool span, std::string text)
4820 if (text.length() < 1)
4833 std::vector<std::string>
tab;
4834 std::vector<std::string>
tabx;
4840 std::string
xtab =
"";
4842 for (
int n=0; ;
n++) {
4844 for (
unsigned i=0;
i<
fLines.size();
i++) {
4851 int l =
fLines[
i].text.length();
4859 tab.push_back(
indent(len,
" ") +
" | ");
4868 for (
unsigned i=0;
i<
fLines.size();
i++) {
4882 s += std::string(
" | ") +
fLines[
i].text +
pad;
4883 else if (
n == nest) {
4885 if (
n == 0 ||
n == 1)
4890 if (
n == 0 ||
n == 1)
4906 const MJsonNode*
d =
schema->FindObjectNode(
"description");
4911 std::string
xshort =
"object";
4915 const MJsonNode* properties =
schema->FindObjectNode(
"properties");
4918 const MJsonNode* r =
schema->FindObjectNode(
"required");
4941 s += nest +
"<table border=1>\n";
4944 s += nest +
"<tr>\n";
4945 s += nest +
" <td colspan=3>" +
description +
"</td>\n";
4946 s += nest +
"</tr>\n";
4951 for (
unsigned i=0;
i<
names->size();
i++) {
4952 std::string
name = (*names)[
i];
4953 const MJsonNode*
node = (*nodes)[
i];
4955 bool required =
false;
4965 const MJsonNode*
type =
node->FindObjectNode(
"type");
4966 if (
type &&
type->GetString() ==
"array")
4977 s += nest +
"<tr>\n";
4978 s += nest +
" <td>" +
name +
"</td>\n";
4979 s += nest +
" <td>";
4982 s += nest +
"</tr>\n";
4985 s += nest +
"</table>\n";
4992 const MJsonNode*
d =
schema->FindObjectNode(
"description");
4997 std::string
xshort =
"array";
5001 const MJsonNode* items =
schema->FindObjectNode(
"items");
5023 s += nest +
"<table border=1>\n";
5026 s += nest +
"<tr>\n";
5028 s += nest +
"</tr>\n";
5033 for (
unsigned i=0;
i<
nodes->size();
i++) {
5036 s += nest +
"<tr>\n";
5038 s += nest +
"</tr>\n";
5041 s += nest +
"</table>\n";
5052 const MJsonNode* t =
schema->FindObjectNode(
"type");
5054 type = t->GetString();
5058 const MJsonNode*
d =
schema->FindObjectNode(
"description");
5066 if (
type ==
"object") {
5068 }
else if (
type ==
"array") {
5098static void add(std::string* s,
const char* text)
5101 if (s->length() > 0)
5109 const MJsonNode* version =
request->FindObjectNode(
"jsonrpc");
5110 const MJsonNode* method =
request->FindObjectNode(
"method");
5111 const MJsonNode* params =
request->FindObjectNode(
"params");
5112 const MJsonNode*
id =
request->FindObjectNode(
"id");
5114 std::string
bad =
"";
5117 add(&
bad,
"jsonrpc version is missing");
5119 add(&
bad,
"method is missing");
5121 add(&
bad,
"params is missing");
5123 add(&
bad,
"id is missing");
5126 add(&
bad,
"jsonrpc version is not a string");
5127 if (version&&version->GetString() !=
"2.0")
5128 add(&
bad,
"jsonrpc version is not 2.0");
5131 add(&
bad,
"method is not a string");
5133 if (
bad.length() > 0) {
5135 response->AddToObject(
"jsonrpc", MJsonNode::MakeString(
"2.0"));
5137 response->AddToObject(
"id", id->Copy());
5139 response->AddToObject(
"id", MJsonNode::MakeNull());
5143 printf(
"mjsonrpc: invalid request: reply:\n");
5151 double start_time = 0;
5157 const std::string
ms = method->GetString();
5158 const char* m =
ms.c_str();
5160 MJsonNode* result =
NULL;
5164 if (
strcmp(m,
"echo") == 0) {
5166 }
else if (
strcmp(m,
"error") == 0) {
5168 }
else if (
strcmp(m,
"invalid_json") == 0) {
5170 printf(
"mjsonrpc: reply with invalid json\n");
5172 return MJsonNode::MakeJSON(
"this is invalid json data");
5173 }
else if (
strcmp(m,
"test_nan_inf") == 0) {
5176 double nan = zero/zero;
5179 MJsonNode*
n = MJsonNode::MakeArray();
5180 n->AddToArray(MJsonNode::MakeNumber(
nan));
5181 n->AddToArray(MJsonNode::MakeNumber(
plusinf));
5182 n->AddToArray(MJsonNode::MakeNumber(
minusinf));
5184 }
else if (
strcmp(m,
"test_arraybuffer") == 0) {
5186 printf(
"mjsonrpc: reply with test arraybuffer data\n");
5189 char* ptr = (
char*)
malloc(size);
5190 for (
size_t i=0;
i<size;
i++) {
5193 *((
short*)(ptr+4*2*1)) = 111;
5194 *((
int*)(ptr+4*2*2)) = 1234;
5195 *((
double*)(ptr+4*2*3)) = 3.14;
5196 return MJsonNode::MakeArrayBuffer(ptr, size);
5200 bool lock = s->second.fNeedsLocking;
5203 result = s->second.fHandler(params);
5212 printf(
"mjsonrpc: handler reply:\n");
5217 double end_time = 0;
5231 const MJsonNode *
nerror = result->FindObjectNode(
"error");
5232 const MJsonNode *
nresult = result->FindObjectNode(
"result");
5235 result->DeleteObjectNode(
"result");
5237 result->DeleteObjectNode(
"error");
5240 result =
mjsonrpc_make_error(-32603,
"Internal error",
"bad dispatcher reply: no result and no error");
5243 result->AddToObject(
"jsonrpc", MJsonNode::MakeString(
"2.0"));
5246 result->AddToObject(
"id", id->Copy());
5248 result->AddToObject(
"id", MJsonNode::MakeNull());
5252 result->AddToObject(
"elapsed_time", MJsonNode::MakeNumber(
elapsed_time));
5255 assert(result !=
NULL);
5268 printf(
"mjsonrpc: request:\n");
5284 reply->AddToObject(
"jsonrpc", MJsonNode::MakeString(
"2.0"));
5285 reply->AddToObject(
"id", MJsonNode::MakeNull());
5288 printf(
"mjsonrpc: invalid json: reply:\n");
5302 if (a->size() < 1) {
5304 reply->AddToObject(
"jsonrpc", MJsonNode::MakeString(
"2.0"));
5305 reply->AddToObject(
"id", MJsonNode::MakeNull());
5308 printf(
"mjsonrpc: invalid json: reply:\n");
5317 MJsonNode*
reply = MJsonNode::MakeArray();
5319 for (
unsigned i=0;
i<a->size();
i++) {
5321 reply->AddToArray(r);
5325 reply =
mjsonrpc_make_error(-32600,
"Invalid request",
"MJSON_ARRAYBUFFER return is not permitted for batch requests");
5326 reply->AddToObject(
"jsonrpc", MJsonNode::MakeString(
"2.0"));
5327 reply->AddToObject(
"id", MJsonNode::MakeNull());
5336 reply->AddToObject(
"jsonrpc", MJsonNode::MakeString(
"2.0"));
5337 reply->AddToObject(
"id", MJsonNode::MakeNull());
5340 printf(
"mjsonrpc: invalid json: reply:\n");
void Add(time_t t, double v)
std::vector< double > fValues
std::vector< double > fTimes
void Add(time_t t, double v)
virtual int hs_get_events(time_t time_from, std::vector< std::string > *pevents)=0
get list of events that exist(ed) at given time and later (value 0 means "return all events from begi...
virtual int hs_get_tags(const char *event_name, time_t time_from, std::vector< TAG > *ptags)=0
get list of history variables for given event (use event names returned by hs_get_events()) that exis...
virtual int hs_read_buffer(time_t start_time, time_t end_time, int num_var, const char *const event_name[], const char *const tag_name[], const int var_index[], MidasHistoryBufferInterface *buffer[], int status[])=0
returns HS_SUCCESS
virtual int hs_get_last_written(time_t start_time, int num_var, const char *const event_name[], const char *const tag_name[], const int var_index[], time_t last_written[])=0
virtual int hs_clear_cache()=0
clear internal cache, returns HS_SUCCESS
virtual int hs_read_binned(time_t start_time, time_t end_time, int num_bins, int num_var, const char *const event_name[], const char *const tag_name[], const int var_index[], int num_entries[], int *count_bins[], double *mean_bins[], double *rms_bins[], double *min_bins[], double *max_bins[], time_t *bins_first_time[], double *bins_first_value[], time_t *bins_last_time[], double *bins_last_value[], time_t last_time[], double last_value[], int status[])=0
returns HS_SUCCESS
void Output(int nest, bool span, std::string text)
std::vector< NestedLine > fLines
INT transition(INT run_number, char *error)
INT al_trigger_class(const char *alarm_class, const char *alarm_message, BOOL first)
BOOL al_evaluate_condition(const char *alarm_name, const char *condition, std::string *pvalue)
INT al_reset_alarm(const char *alarm_name)
INT al_trigger_alarm(const char *alarm_name, const char *alarm_message, const char *default_class, const char *cond_str, INT type)
INT bm_open_buffer(const char *buffer_name, INT buffer_size, INT *buffer_handle)
INT bm_request_event(HNDLE buffer_handle, short int event_id, short int trigger_mask, INT sampling_type, HNDLE *request_id, EVENT_HANDLER *func)
INT bm_set_cache_size(INT buffer_handle, size_t read_size, size_t write_size)
INT bm_match_event(short int event_id, short int trigger_mask, const EVENT_HEADER *pevent)
INT bm_get_buffer_handle(const char *buffer_name, INT *buffer_handle)
INT bm_receive_event_alloc(INT buffer_handle, EVENT_HEADER **ppevent, int timeout_msec)
INT cm_shutdown(const char *name, BOOL bUnique)
INT cm_get_experiment_database(HNDLE *hDB, HNDLE *hKeyClient)
INT cm_connect_client(const char *client_name, HNDLE *hConn)
INT cm_transition(INT transition, INT run_number, char *errstr, INT errstr_size, INT async_flag, INT debug_flag)
std::string cm_expand_env(const char *str)
int cm_exec_script(const char *odb_path_to_script)
std::string cm_get_path()
INT cm_exist(const char *name, BOOL bUnique)
INT el_search_run(int run, char *return_tag)
INT el_retrieve(char *tag, char *date, int *run, char *author, char *type, char *syst, char *subject, char *text, int *textsize, char *orig_tag, char *reply_tag, char *attachment1, char *attachment2, char *attachment3, char *encoding)
INT el_delete_message(const char *tag)
#define DB_NO_MORE_SUBKEYS
MJSO * AddArray(const char *name, const char *description)
void D(const char *description)
MJsonNode * mjsonrpc_decode_post_data(const char *post_data)
void P(const char *name, int mjson_type, const char *description)
MJsonNode * mjsonrpc_make_result(MJsonNode *node)
MJSO * AddObject(const char *name, const char *description)
static MJSO * MakeArraySchema(const char *description)
MJSO * RA(const char *description)
MJsonNode *() mjsonrpc_handler_t(const MJsonNode *params)
void Add(const char *name, int mjson_type, const char *description)
void mjsonrpc_user_init()
void AddToSchema(MJsonNode *s, const char *name)
MJsonNode * mjsonrpc_make_error(int code, const char *message, const char *data)
MJsonNode * mjsonrpc_get_schema()
static MJSO * MakeObjectSchema(const char *description)
void mjsonrpc_set_std_mutex(void *mutex)
const MJsonNode * mjsonrpc_get_param(const MJsonNode *params, const char *name, MJsonNode **error)
std::string mjsonrpc_schema_to_text(const MJsonNode *schema)
void mjsonrpc_add_handler(const char *method, mjsonrpc_handler_t *handler, bool needs_locking)
void R(const char *name, int mjson_type, const char *description)
MJSO * PA(const char *description)
#define MAX_STRING_LENGTH
time_t ss_mktime(struct tm *tms)
INT ss_dirlink_find(const char *path, const char *pattern, char **plist)
time_t ss_file_time(const char *path)
double ss_file_size(const char *path)
INT ss_sleep(INT millisec)
bool ss_repair_utf8(char *string)
INT ss_system(const char *command)
INT ss_file_find(const char *path, const char *pattern, char **plist)
INT cm_msg1(INT message_type, const char *filename, INT line, const char *facility, const char *routine, const char *format,...)
INT EXPRT cm_msg_facilities(STRING_LIST *list)
INT cm_msg(INT message_type, const char *filename, INT line, const char *routine, const char *format,...)
INT cm_msg_retrieve2(const char *facility, time_t t, INT n_message, char **messages, int *num_messages)
BOOL equal_ustring(const char *str1, const char *str2)
INT db_delete_key(HNDLE hDB, HNDLE hKey, BOOL follow_links)
INT db_find_link(HNDLE hDB, HNDLE hKey, const char *key_name, HNDLE *subhKey)
INT db_get_value(HNDLE hDB, HNDLE hKeyRoot, const char *key_name, void *data, INT *buf_size, DWORD type, BOOL create)
INT db_reorder_key(HNDLE hDB, HNDLE hKey, INT idx)
INT db_create_key(HNDLE hDB, HNDLE hKey, const char *key_name, DWORD type)
INT db_copy_json_save(HNDLE hDB, HNDLE hKey, char **buffer, int *buffer_size, int *buffer_end)
MJsonNode * db_scl(HNDLE hDB)
INT db_get_key(HNDLE hDB, HNDLE hKey, KEY *key)
INT db_copy_json_index(HNDLE hDB, HNDLE hKey, int index, char **buffer, int *buffer_size, int *buffer_end)
INT db_set_data(HNDLE hDB, HNDLE hKey, const void *data, INT buf_size, INT num_values, DWORD type)
INT db_enum_link(HNDLE hDB, HNDLE hKey, INT idx, HNDLE *subkey_handle)
INT db_copy_json_ls(HNDLE hDB, HNDLE hKey, char **buffer, int *buffer_size, int *buffer_end)
INT db_copy_json_values(HNDLE hDB, HNDLE hKey, char **buffer, int *buffer_size, int *buffer_end, int omit_names, int omit_last_written, time_t omit_old_timestamp, int preserve_case)
INT db_set_value(HNDLE hDB, HNDLE hKeyRoot, const char *key_name, const void *data, INT data_size, INT num_values, DWORD type)
INT db_find_key(HNDLE hDB, HNDLE hKey, const char *key_name, HNDLE *subhKey)
MJsonNode * db_sor(HNDLE hDB, const char *root_path)
INT db_rename_key(HNDLE hDB, HNDLE hKey, const char *name)
INT db_enum_key(HNDLE hDB, HNDLE hKey, INT idx, HNDLE *subkey_handle)
INT EXPRT db_resize_string(HNDLE hdb, HNDLE hKeyRoot, const char *key_name, int num_values, int max_string_length)
INT db_set_num_values(HNDLE hDB, HNDLE hKey, INT num_values)
INT db_create_link(HNDLE hDB, HNDLE hKey, const char *link_name, const char *destination)
INT EXPRT db_paste_json_node(HNDLE hDB, HNDLE hKeyRoot, int index, const MJsonNode *node)
INT rpc_client_call(HNDLE hConn, DWORD routine_id,...)
int hs_read_event_list(std::vector< std::string > *pevents)
int hs_find_reader_channel(HNDLE hDB, HNDLE *hKeyOut, int debug_flag)
int hs_get_history(HNDLE hDB, HNDLE hKey, int flags, int debug_flag, MidasHistoryInterface **mh)
int hs_image_retrieve(std::string image_name, time_t start_time, time_t stop_time, std::vector< time_t > &vtime, std::vector< std::string > &vfilename)
char buffer_name[NAME_LENGTH]
std::string msprintf(const char *format,...)
#define DIR_SEPARATOR_STR
std::vector< std::string > STRING_LIST
MidasHistoryInterface * mh
#define message(type, str)
static MJsonNode * brpc(const MJsonNode *params)
static MJsonNode * js_cm_transition(const MJsonNode *params)
static MJsonNode * set_sleep(const MJsonNode *params)
const MJsonNodeVector * mjsonrpc_get_param_array(const MJsonNode *params, const char *name, MJsonNode **error)
static MJsonNode * js_cm_msg1(const MJsonNode *params)
static MJsonNode * get_sleep(const MJsonNode *params)
static MJsonNode * js_al_trigger_class(const MJsonNode *params)
std::map< std::string, MethodsTableEntry > MethodsTable
static MJsonNode * js_el_delete(const MJsonNode *params)
static MJsonNode * js_hs_read_arraybuffer(const MJsonNode *params)
static MJsonNode * jrpc(const MJsonNode *params)
static MJsonNode * js_db_paste(const MJsonNode *params)
static MhiMap gHistoryChannels
static MJsonNode * js_ext_save_file(const MJsonNode *params)
static std::string mjsonrpc_schema_to_html_array(const MJsonNode *schema, int nest_level, NestedOutput *o)
static MJsonNode * js_get_timezone(const MJsonNode *params)
static MJsonNode * js_ext_list_files(const MJsonNode *params)
static void StashEvent(const std::string buffer_name, int event_id, int trigger_mask, const EVENT_HEADER *pevent)
static int parse_array_index_list(const char *method, const char *path, std::vector< unsigned > *list)
static MJsonNode * js_hs_read_binned(const MJsonNode *params)
static MJsonNode * js_ext_read_file(const MJsonNode *params)
static MJsonNode * start_program(const MJsonNode *params)
static MJsonNode * js_hs_get_last_written(const MJsonNode *params)
static MJsonNode * js_bm_receive_event(const MJsonNode *params)
static MJsonNode * js_hs_get_active_events(const MJsonNode *params)
static std::string mjsonrpc_schema_to_html_anything(const MJsonNode *schema, int nest_level, NestedOutput *o)
static MJsonNode * js_db_ls(const MJsonNode *params)
static MJsonNode * js_db_sor(const MJsonNode *params)
static std::string remove(const std::string s, char c)
static MJsonNode * js_db_copy(const MJsonNode *params)
static MJsonNode * js_db_scl(const MJsonNode *params)
static MJsonNode * js_cm_msg_retrieve(const MJsonNode *params)
static void DeleteEventStash()
static MJsonNode * xnull(const MJsonNode *params)
static MJsonNode * js_ss_millitime(const MJsonNode *params)
static MJsonNode * js_db_delete(const MJsonNode *params)
static const EVENT_HEADER * CopyEvent(const EVENT_HEADER *pevent)
MethodsTable::iterator MethodsTableIterator
static MJsonNode * js_read_binary_file(const MJsonNode *params)
static MJsonNode * js_db_rename(const MJsonNode *params)
static MJsonNode * js_cm_msg_facilities(const MJsonNode *params)
static int mjsonrpc_sleep
static MJsonNode * js_db_key(const MJsonNode *params)
static MJsonNode * js_cm_exist(const MJsonNode *params)
static MJsonNode * js_db_reorder(const MJsonNode *params)
static MidasHistoryInterface * GetHistory(const char *name)
std::map< std::string, MidasHistoryInterface * > MhiMap
static MJsonNode * js_db_resize_string(const MJsonNode *params)
static MJsonNode * mjsonrpc_handle_request(const MJsonNode *request)
static MJsonNode * js_hs_get_tags(const MJsonNode *params)
static std::string mjsonrpc_schema_to_html_object(const MJsonNode *schema, int nest_level, NestedOutput *o)
static std::mutex * gMutex
static MJsonNode * js_el_retrieve(const MJsonNode *params)
static MJsonNode * get_alarms(const MJsonNode *params)
static MJsonNode * js_el_query(const MJsonNode *params)
static MJsonNode * js_db_link(const MJsonNode *params)
static MJsonNode * exec_script(const MJsonNode *params)
static MJsonNode * get_schema(const MJsonNode *params)
static std::vector< EventStashEntry * > gEventStash
static std::string indent(int x, const char *p=" ")
static MJsonNode * js_al_reset_alarm(const MJsonNode *params)
static double GetTimeSec()
static MJsonNode * set_time(const MJsonNode *params)
static MJsonNode * set_debug(const MJsonNode *params)
static MJsonNode * js_db_resize(const MJsonNode *params)
static MJsonNode * js_hs_get_events(const MJsonNode *params)
static MJsonNode * gNullNode
static MJsonNode * js_hs_read(const MJsonNode *params)
static MJsonNode * js_make_subdir(const MJsonNode *params)
static std::mutex gEventStashMutex
static MJsonNode * js_hs_image_retrieve(const MJsonNode *params)
static const EVENT_HEADER * FindEvent(const std::string buffer_name, int event_id, int trigger_mask, int last_event_id, int last_trigger_mask, DWORD last_serial_number, DWORD last_time_stamp)
static MJsonNode * get_debug(const MJsonNode *params)
static MJsonNode * js_cm_shutdown(const MJsonNode *params)
static MethodsTable gMethodsTable
static MJsonNode * js_db_get_values(const MJsonNode *params)
static MJsonNode * js_al_trigger_alarm(const MJsonNode *params)
static MJsonNode * js_db_create(const MJsonNode *params)
static MJsonNode * mjsonrpc_make_schema(MethodsTable *h)
static MJsonNode * js_hs_read_binned_arraybuffer(const MJsonNode *params)
static MJsonNode * js_hs_get_channels(const MJsonNode *params)
static void MatchEvent(const std::string buffer_name, const EVENT_HEADER *pevent)
static MJsonNode * js_hs_reopen(const MJsonNode *params)
int gettimeofday(struct timeval *tp, void *tzp)
TH1X EXPRT * h1_book(const char *name, const char *title, int bins, double min, double max)
const EVENT_HEADER * pevent
void ReplaceEvent(const EVENT_HEADER *xpevent)
mjsonrpc_handler_t * fHandler
static te_expr * list(state *s)