3902{
3904 int ieq;
3905 INT n_var, n_tags, n_names = 0;
3906 HNDLE hKeyRoot, hKeyVar, hLinkKey, hVarKey, hKeyEq, hHistKey,
hKey;
3909 KEY key, varkey, linkkey, histkey;
3912 int global_per_variable_history = 0;
3913
3914 time_t now = time(NULL);
3915
3917
3918
3919
3920 for (
unsigned i=0;
i<
mh.size();
i++)
3923
3925
3926
3927
3929
3931 int active;
3934
3935
3936
3940
3941 active = 1;
3942 size = sizeof(active);
3945
3947 size =
sizeof(
debug);
3950
3951 int per_variable = 1;
3952 size = sizeof(per_variable);
3955
3956
3957
3961
3962 active = 0;
3963 size = sizeof(active);
3966
3968 size =
sizeof(
debug);
3971
3972
3973
3977
3978 active = 0;
3979 size = sizeof(active);
3982
3984 size =
sizeof(
debug);
3987
3988
3989
3993
3994 active = 0;
3995 size = sizeof(active);
3998
4000 size =
sizeof(
debug);
4003
4004
4005
4009
4010 active = 0;
4011 size = sizeof(active);
4014
4016 size =
sizeof(
debug);
4019
4020
4021
4025
4026 active = 0;
4027 size = sizeof(active);
4030
4032 size =
sizeof(
debug);
4035
4036
4037
4039 }
4040
4042 cm_msg(
MERROR,
"open_history",
"Something is wrong with /Logger/History, db_find_key() status %d",
status);
4044 }
4045
4046
4047
4048 for (int ichan = 0; ; ichan++) {
4051 break;
4052
4054
4056
4058 if (strcasecmp(hi->
type,
"MIDAS")==0) {
4063
4065 global_per_variable_history = 1;
4066 }
else if (strcasecmp(hi->
type,
"FILE")==0) {
4071
4073 global_per_variable_history = 1;
4074 }
else if (strcasecmp(hi->
type,
"ODBC")==0) {
4075 global_per_variable_history = 1;
4076 }
else if (strcasecmp(hi->
type,
"SQLITE")==0) {
4077 global_per_variable_history = 1;
4078 }
else if (strcasecmp(hi->
type,
"MYSQL")==0) {
4079 global_per_variable_history = 1;
4080 }
else if (strcasecmp(hi->
type,
"PGSQL")==0) {
4081 global_per_variable_history = 1;
4082 }
4083
4085 cm_msg(
MINFO,
"open_history",
"Writing history to channel \'%s\' type \'%s\'", hi->
name, hi->
type);
4086
4088 }
4089 }
4090
4091
4092
4093 for (
unsigned i=0;
i<
mh.size();
i++) {
4096 }
4097
4098
4099
4104 cm_msg(
MERROR,
"open_history",
"mlogger ODB setting /History/PerVariableHistory is obsolete, please delete it. Use /Logger/History/MIDAS/PerVariableHistory instead");
4106 global_per_variable_history =
i;
4107 }
4108
4109 if (global_per_variable_history) {
4110 static int previous = -1;
4111 if (global_per_variable_history != previous) {
4112 if (global_per_variable_history)
4113 cm_msg(
MINFO,
"open_history",
"Per-variable history is enabled");
4114 else
4115 ;
4116 }
4117 previous = global_per_variable_history;
4118 }
4119
4120
4121
4124
4126
4129 "/Equipment/Trigger/Statistics/Events per sec.");
4130
4133 "/Equipment/Trigger/Statistics/kBytes per sec.");
4134 }
4135
4136
4137
4138 max_event_id = 0;
4139
4142 cm_msg(
MINFO,
"open_history",
"Cannot find /Equipment entry in database, history system is inactive");
4144 }
4145
4147 cm_msg(
MERROR,
"open_history",
"Cannot find /Equipment entry in database, db_find_key() status %d",
status);
4149 }
4150
4151
4153 for (ieq = 0; ; ieq++) {
4156 break;
4157
4158 int32_t min_period = 0;
4159
4160
4161 size = sizeof(min_period);
4163
4164
4165 if (min_period > 0) {
4166 BOOL per_variable_history = global_per_variable_history;
4167
4168
4171
4172 if (strchr(eq_name, ':'))
4173 cm_msg(
MERROR,
"open_history",
"Equipment name \'%s\' contains characters \':\', this may break the history system", eq_name);
4174
4177 cm_msg(
MERROR,
"open_history",
"Cannot find /Equipment/%s/Variables entry in database", eq_name);
4178 return 0;
4179 }
4180
4181 size = sizeof(eq_id);
4184
4185 size = sizeof(int);
4188
4190 printf
4191 ("\n==================== Equipment \"%s\", ID %d =======================\n",
4192 eq_name, eq_id);
4193
4194
4195 for (n_var = 0, n_tags = 0;; n_var++) {
4198 break;
4202 }
4203 else {
4204 int ii;
4205 for (ii=0;; ii++) {
4208
4211 break;
4212
4213
4215
4217 }
4218 }
4219 }
4220
4221 if (n_var == 0)
4222 cm_msg(
MINFO,
"open_history",
"Equipment \"%s\" history is enabled, but there are no Variables in ODB", eq_name);
4223
4224
4225 tag = (
TAG *) calloc(
sizeof(
TAG), n_tags);
4226
4227 i_tag = 0;
4231 break;
4232
4233
4235
4236
4237 HNDLE hKeyNames = 0;
4238 BOOL single_names =
false;
4239
4240
4241
4242 if (!hKeyNames) {
4243 sprintf(
str,
"Settings/Names %s", varkey.
name);
4245 if (hKeyNames) {
4247 printf(
"Using \"/Equipment/%s/Settings/Names %s\" for variable \"%s\"\n", eq_name, varkey.
name, varkey.
name);
4248
4249
4252 }
4253 }
4254
4255 if (!hKeyNames) {
4257 single_names = (hKeyNames > 0);
4258
4259 if (hKeyNames) {
4261 printf(
"Using \"/Equipment/%s/Settings/Names\" for variable \"%s\"\n", eq_name, varkey.
name);
4262
4263
4266 }
4267 }
4268
4269 if (hKeyNames && n_names < varkey.
num_values) {
4271 "Array size mismatch: \"/Equipment/%s/Settings/%s\" has %d entries while \"/Equipment/%s/Variables/%s\" has %d entries",
4274 free(tag);
4275 return 0;
4276 }
4277
4278 if (hKeyNames) {
4279
4281 char xname[256];
4282
4283 tag[i_tag].
name[0] = 0;
4284
4285
4286 size = sizeof(xname);
4289 mstrlcpy(tag[i_tag].
name, xname,
sizeof(tag[i_tag].
name));
4290
4291 if (strlen(tag[i_tag].
name) < 1) {
4292 char buf[256];
4293 sprintf(buf,
"%d",
j);
4297 }
4298
4299
4300 if (single_names) {
4303 "Name for history entry \"%s %s\" too long", tag[i_tag].
name, varkey.
name);
4304 free(tag);
4305 return 0;
4306 }
4309 }
4310
4313
4315 printf("Defined tag %d, name \"%s\", type %d, num_values %d\n",
4316 i_tag, tag[i_tag].
name, tag[i_tag].
type, tag[i_tag].n_data);
4317
4318 i_tag++;
4319 }
4321 int ii;
4322 for (ii=0;; ii++) {
4325
4328 break;
4329
4330
4332
4338
4340 printf(
"Defined tag %d, name \"%s\", type %d, num_values %d\n", i_tag, tag[i_tag].
name,
4341 tag[i_tag].
type, tag[i_tag].n_data);
4342
4343 i_tag++;
4344 }
4345 } else {
4349
4351 printf(
"Defined tag %d, name \"%s\", type %d, num_values %d\n", i_tag, tag[i_tag].
name,
4352 tag[i_tag].
type, tag[i_tag].n_data);
4353
4354 i_tag++;
4355 }
4356
4357 if (per_variable_history && i_tag>0) {
4360
4364
4365 assert(i_tag <= n_tags);
4366
4370
4371 i_tag = 0;
4372 }
4373
4374 }
4375
4376 if (!per_variable_history && i_tag>0) {
4377 assert(i_tag <= n_tags);
4378
4382
4383 }
4384
4385 if (tag) {
4386 free(tag);
4387 tag = NULL;
4388 }
4389
4390
4391 if (eq_id > max_event_id)
4392 max_event_id = eq_id;
4393 }
4394 }
4395
4396
4397
4398
4399 max_event_id = ((int) ((max_event_id + 1) / 10) + 1) * 10;
4400
4403 for (li = 0;; li++) {
4406 break;
4407
4409 strcpy(hist_name, histkey.
name);
4411
4414 cm_msg(
MERROR,
"open_history",
"Only subkeys allows in /History/Links, key \"%s\"",
key.
name);
4415 continue;
4416 }
4417
4419 printf("\n==================== History link \"%s\", ID %d =======================\n",
4420 hist_name, max_event_id);
4421
4422
4423 for (
i = n_var = 0;;
i++) {
4426 break;
4427
4430 n_var++;
4431 } else {
4435 "History link /History/Links/%s/%s is invalid", hist_name,
key.
name);
4436 return 0;
4437 }
4438 }
4439
4440 if (n_var == 0)
4441 cm_msg(
MERROR,
"open_history",
"History event %s has no variables in ODB", hist_name);
4442 else {
4443
4444 tag = (
TAG *) calloc(
sizeof(
TAG), n_var);
4445
4446 assert(tag != NULL);
4447
4448 for (
i = 0, size = 0, n_var = 0;;
i++) {
4451 break;
4452
4453
4455
4457 continue;
4458
4459
4462
4467 }
4468
4469 strcpy(tag[n_var].
name, linkkey.
name);
4472
4474 printf("Defined tag \"%s\", type %d, num_values %d\n",
4475 tag[n_var].
name, tag[n_var].
type, tag[n_var].n_data);
4476
4478 n_var++;
4479 }
4480 }
4481
4482
4486 }
4487
4491
4492 free(tag);
4493 tag = NULL;
4494
4495 max_event_id++;
4496 }
4497 }
4498 }
4499
4500
4501
4502 tag = (
TAG *) calloc(
sizeof(
TAG), 2);
4503
4504 assert(tag != NULL);
4505
4506 strcpy(tag[0].
name,
"State");
4509
4510 strcpy(tag[1].
name,
"Run number");
4513
4514 const char* event_name = "Run transitions";
4515
4516 for (
unsigned i=0;
i<
mh.size();
i++) {
4517 status =
mh[
i]->hs_define_event(event_name, now, 2, tag);
4519 cm_msg(
MERROR,
"add_event",
"Cannot define event \"%s\", hs_define_event() status %d", event_name,
status);
4520 return 0;
4521 }
4522 }
4523
4525
4526 free(tag);
4527 tag = NULL;
4528
4529
4530
4531
4532
4536
4538 double telapsed = tend - tstart;
4539 if (telapsed > 10.0) {
4540 cm_msg(
MERROR,
"open_history",
"open_history() took %.3f seconds", telapsed);
4541 }
4542
4544}
char type[NAME_LENGTH]
history channel name
INT db_get_data_index(HNDLE hDB, HNDLE hKey, void *data, INT *buf_size, INT idx, DWORD type)
INT db_enum_link(HNDLE hDB, HNDLE hKey, INT idx, HNDLE *subkey_handle)
int hs_save_event_list(const std::vector< std::string > *pevents)
int hs_get_history(HNDLE hDB, HNDLE hKey, int flags, int debug_flag, MidasHistoryInterface **mh)
void log_system_history(HNDLE hDB, HNDLE hKey, void *info)
static int add_event(int *indexp, time_t timestamp, int event_id, const char *event_name, HNDLE hKey, int ntags, const TAG *tags, time_t min_period, int hotlink)