DUNE-DAQ
DUNE Trigger and Data Acquisition software
Loading...
Searching...
No Matches
dunedaq::oks::OksFile Class Reference

Provides interface to the OKS XML schema and data files. More...

#include <file.hpp>

Collaboration diagram for dunedaq::oks::OksFile:
[legend]

Classes

struct  SortByName

Public Types

enum  Mode { ReadOnly , ReadWrite }
enum  FileStatus { FileNotModified , FileModified , FileWasNotSaved , FileRemoved }
typedef std::map< const std::string *, OksFile *, SortByName > Map
typedef std::unordered_set< OksFile *, oks::hash_file_ptr, oks::equal_file_ptr > Set
typedef std::unordered_map< OksFile *, Set, oks::hash_file_ptr, oks::equal_file_ptr > IMap

Public Member Functions

void lock ()
 Lock OKS file.
void unlock ()
 Unlock OKS file.
void add_include_file (const std::string &name)
 Add include file.
void remove_include_file (const std::string &name)
 Remove include file.
void rename_include_file (const std::string &from, const std::string &to)
 Rename include file.
void add_comment (const std::string &text, const std::string &author)
 Add new comment to file.
void modify_comment (const std::string &creation_time, const std::string &text, const std::string &author)
void remove_comment (const std::string &creation_time)
 Modify existing comment.
const std::map< std::string, oks::Comment * > & get_comments () const
void set_logical_name (const std::string &name)
 Set logical name of file.
void set_type (const std::string &type)
 Set file type.
const std::string & get_short_file_name () const
const std::string & get_full_file_name () const
bool is_repository_file () const
 Get information about repository, the file belongs to.
const std::string & get_repository_name () const
 Get name of file inside repository.
const std::string & get_well_formed_name () const
 Get well-formed file name.
const std::string & get_lock_file () const
const std::string & get_logical_name () const
const std::string & get_type () const
const std::string & get_oks_format () const
long get_number_of_items () const
long get_size () const
const std::string & get_created_by () const
const boost::posix_time::ptime get_creation_time () const
const std::string & get_created_on () const
const std::string & get_last_modified_by () const
const boost::posix_time::ptime get_last_modification_time () const
const std::string & get_last_modified_on () const
bool is_locked () const
 Return lock status of OKS file.
bool is_updated () const
 Return update status of OKS file.
bool is_read_only () const
 Return read-only status of OKS file.
const std::list< std::string > & get_include_files () const
 Get directly include files.
void get_all_include_files (const OksKernel *kernel, std::set< OksFile * > &out)
 Get all include files.
FileStatus get_status_of_file () const
 Return update status of file.
void update_status_of_file (bool update_local=true, bool update_repository=true)
 Update status of file.
bool get_lock_string (std::string &info) const
 Return lock status of OKS file and if the file is locked, get information string about process which locked the file.
bool compare (const char *name) const
 Compare with another file.
const OksFile * get_parent () const
 Return parent including given file.
OksFile * check_parent (const OksFile *parent_h)
 Set given parent, if this file is not yet included.
 ~OksFile () noexcept

Static Public Member Functions

static void set_nolock_mode (bool nl)
static bool compare (const char *file1_name, const char *file2_name)
 Compare two files.

Private Member Functions

 OksFile (const std::string &, const std::string &, const std::string &, const std::string &, OksKernel *)
OksFile & operator= (const OksFile &)
 OksFile (const OksFile &f)
 OksFile (std::shared_ptr< OksXmlInputStream >, const std::string &, const std::string &, OksKernel *)
void write (OksXmlOutputStream &)
void set_updated ()
void rename (const std::string &short_name, const std::string &full_name)
void rename (const std::string &full_name)
void create_lock_name ()
void init_lock_name () const
void check_repository ()
std::string make_repository_name () const
oks::Comment * get_comment (const std::string &creation_time) noexcept
void clear_comments () noexcept
std::list< std::string >::iterator find_include_file (const std::string &)

Private Attributes

std::string p_short_name
std::string p_full_name
std::string p_repository_name
std::string p_logical_name
std::string p_type
std::string p_oks_format
long p_number_of_items
long p_size
std::string p_created_by
boost::posix_time::ptime p_creation_time
std::string p_created_on
std::string p_last_modified_by
boost::posix_time::ptime p_last_modification_time
std::string p_last_modified_on
Mode p_open_mode
std::shared_ptr< boost::interprocess::file_lock > p_lock
std::string p_lock_file_name
bool p_is_updated
bool p_is_read_only
std::list< std::string > p_list_of_include_files
time_t p_last_modified
time_t p_repository_last_modified
std::map< std::string, oks::Comment * > p_comments
bool p_is_on_disk
const OksFile * p_included_by
OksKernel * p_kernel

Static Private Attributes

static bool p_nolock_mode = false
static const char xml_file_header [] = "<?xml version=\"1.0\" encoding=\"ASCII\"?>"
static const char xml_schema_file_dtd []
static const char xml_data_file_dtd []
static const char xml_info_tag [] = "info"
static const char xml_include_tag [] = "include"
static const char xml_file_tag [] = "file"
static const char xml_comments_tag [] = "comments"
static const char xml_comment_tag [] = "comment"

Friends

class OksKernel
class OksClass
class OksObject
struct OksLoadObjectsJob

Detailed Description

Provides interface to the OKS XML schema and data files.

An object of this class is used to read/write header part of OKS XML file, includes and comments. It allows to set update lock on file creating .oks-lock-$filename file: see lock() and unlock() methods. Also, the class provides methods to get many other properties of the file, e.g. status, access mode, repository information, number of stored items, size, etc.

Definition at line 354 of file file.hpp.

Member Typedef Documentation

◆ IMap

Definition at line 385 of file file.hpp.

◆ Map

typedef std::map<const std::string*, OksFile*, SortByName> dunedaq::oks::OksFile::Map

Definition at line 382 of file file.hpp.

◆ Set

Definition at line 384 of file file.hpp.

Member Enumeration Documentation

◆ FileStatus

Enumerator
FileNotModified 
FileModified 
FileWasNotSaved 
FileRemoved 

Definition at line 369 of file file.hpp.

◆ Mode

Enumerator
ReadOnly 
ReadWrite 

Definition at line 363 of file file.hpp.

364 {
365 ReadOnly,
367 };

Constructor & Destructor Documentation

◆ ~OksFile()

dunedaq::oks::OksFile::~OksFile ( )
noexcept

Definition at line 305 of file file.cpp.

306{
308}
void clear_comments() noexcept
Definition file.cpp:296

◆ OksFile() [1/3]

dunedaq::oks::OksFile::OksFile ( const std::string & s,
const std::string & ln,
const std::string & ft,
const std::string & ff,
OksKernel * k )
private

Definition at line 264 of file file.cpp.

269 : p_short_name(s)
270 , p_full_name(s)
271 , p_logical_name(ln)
272 , p_type(ft)
273 , p_oks_format(ff)
275 , p_size(0)
277 , p_creation_time(boost::posix_time::second_clock::universal_time())
280 , p_lock()
281 , p_is_updated(false)
282 , p_is_read_only(true)
283 , p_last_modified(0)
285 , p_is_on_disk(false)
286 , p_included_by(0)
287 , p_kernel(k)
288{
293}
std::shared_ptr< boost::interprocess::file_lock > p_lock
Definition file.hpp:737
std::string p_oks_format
Definition file.hpp:727
time_t p_repository_last_modified
Definition file.hpp:743
std::string p_created_by
Definition file.hpp:730
std::string p_short_name
Definition file.hpp:722
boost::posix_time::ptime p_last_modification_time
Definition file.hpp:734
boost::posix_time::ptime p_creation_time
Definition file.hpp:731
std::string p_logical_name
Definition file.hpp:725
std::string p_last_modified_by
Definition file.hpp:733
OksKernel * p_kernel
Definition file.hpp:747
std::string p_full_name
Definition file.hpp:723
std::string p_type
Definition file.hpp:726
void create_lock_name()
Definition file.cpp:947
void check_repository()
Definition file.cpp:907
const OksFile * p_included_by
Definition file.hpp:746
std::string p_last_modified_on
Definition file.hpp:735
std::string p_created_on
Definition file.hpp:732
static std::string & get_host_name()
Get hostname of given process.
Definition kernel.cpp:392
static std::string & get_user_name()
Get username of given process.
Definition kernel.cpp:427

◆ OksFile() [2/3]

dunedaq::oks::OksFile::OksFile ( const OksFile & f)
inlineprivate

Definition at line 768 of file file.hpp.

◆ OksFile() [3/3]

dunedaq::oks::OksFile::OksFile ( std::shared_ptr< OksXmlInputStream > xmls,
const std::string & sp,
const std::string & fp,
OksKernel * k )
private

Definition at line 356 of file file.cpp.

357 : p_short_name(sp)
358 , p_full_name(fp)
359 , p_oks_format(_empty_str, sizeof(_empty_str) - 1)
360 , p_creation_time(boost::posix_time::not_a_date_time)
361 , p_last_modification_time(boost::posix_time::not_a_date_time)
362 , p_lock()
363 , p_is_updated(false)
364 , p_is_read_only(true)
365 , p_last_modified(0)
367 , p_is_on_disk(true)
368 , p_included_by(0)
369 , p_kernel(k)
370{
371 const char* fname = "OksFile::OksFile()";
372
373 // create_lock_name();
375
376 // check file header
377
378 try {
379
380 // skip an xml file header
381
382 {
383 const char* tag_start = xmls->get_tag_start();
384
385 if (!oks::cmp_str4(tag_start, "?xml")) {
386 xmls->throw_unexpected_tag(tag_start, "?xml");
387 }
388 }
389
390 // skip possible tag attributes
391
392 while (true) {
393 OksXmlAttribute attr(*xmls);
394
395 // check for close of tag
396
397 if (oks::cmp_str1(attr.name(), ">") || oks::cmp_str1(attr.name(), "/") || oks::cmp_str1(attr.name(), "?")) {
398 break;
399 }
400
401 // check for start of info tag
402
403 if (!oks::cmp_str7(attr.name(), "version") && !oks::cmp_str8(attr.name(), "encoding")) {
404 if (!p_kernel->get_silence_mode()) {
405 Oks::warning_msg(fname) << " Unexpected attribute \'" << attr.name()
406 << "\' in the xml file header. Either \'version\' or \'encoding\' is expected.\n";
407 }
408 }
409 }
410
411 } catch (oks::exception& e) {
412 throw oks::FailedRead("an xml file header", e);
413 } catch (std::exception& e) {
414 throw oks::FailedRead("an xml file header", e.what());
415 }
416
417 // skip document type declaration and comments
418
419 {
420 while (true) {
421 try {
422 const char* dtd = xmls->get_tag();
423 const char dtd_start[] = "<!DOCTYPE ";
424 if (!strncmp(dtd_start, dtd, sizeof(dtd_start) - 1)) {
425 break;
426 }
427 } catch (oks::exception& e) {
428 throw oks::FailedRead("DTD section", e);
429 } catch (std::exception& e) {
430 throw oks::FailedRead("DTD section", e.what());
431 }
432 }
433 }
434
435 // skip
436
437 try {
438 xmls->store_position();
439
440 const char* a_tag = xmls->get_tag();
441
442 const char xml_stylesheet_start[] = "<?xml-stylesheet";
443 if (strncmp(xml_stylesheet_start, a_tag, sizeof(xml_stylesheet_start) - 1)) {
444 xmls->restore_position();
445 }
446 } catch (oks::exception& e) {
447 throw oks::FailedRead("an xml-stylesheet tag or an oks tag", e);
448 } catch (std::exception& e) {
449 throw oks::FailedRead("an xml-stylesheet tag or an oks tag", e.what());
450 }
451
452 // read start-of-tag
453
454 try {
455 xmls->get_tag_start();
456 } catch (oks::exception& e) {
457 throw oks::FailedRead("tag", e);
458 } catch (std::exception& e) {
459 throw oks::FailedRead("tag", e.what());
460 }
461
462 // read info tag
463
464 try {
465 const char* tag_start = xmls->get_tag_start();
466
467 if (!oks::cmp_str4(tag_start, xml_info_tag)) {
468 xmls->throw_unexpected_tag(tag_start, xml_info_tag);
469 }
470 } catch (oks::exception& e) {
471 throw oks::FailedRead("<info> tag", e);
472 } catch (std::exception& e) {
473 throw oks::FailedRead("<info> tag", e.what());
474 }
475
476 std::string oks_version;
477
478 // read class attributes
479
480 try {
481 while (true) {
482 OksXmlAttribute attr(*xmls);
483
484 // check for close of tag
485
486 if (oks::cmp_str1(attr.name(), ">") || oks::cmp_str1(attr.name(), "/")) {
487 break;
488 }
489
490 // check for known info' attributes
491
492 else if (oks::cmp_str4(attr.name(), "name"))
493 p_logical_name.assign(attr.value(), attr.value_len());
494 else if (oks::cmp_str4(attr.name(), "type"))
495 p_type.assign(attr.value(), attr.value_len());
496 else if (oks::cmp_str10(attr.name(), "oks-format"))
497 p_oks_format.assign(attr.value(), attr.value_len());
498 else if (oks::cmp_str10(attr.name(), "created-by"))
499 p_created_by.assign(attr.value(), attr.value_len());
500 else if (oks::cmp_str10(attr.name(), "created-on"))
501 p_created_on.assign(attr.value(), attr.value_len());
502 else if (oks::cmp_str11(attr.name(), "oks-version"))
503 oks_version.assign(attr.value(), attr.value_len());
504 else if (oks::cmp_str12(attr.name(), "num-of-items"))
505 p_number_of_items = atol(attr.value());
506 else if (oks::cmp_str13(attr.name(), "creation-time"))
507 p_creation_time = oks::str2time(attr.value(), attr.value_len(), p_full_name.c_str());
508 else if (oks::cmp_str15(attr.name(), "num-of-includes"))
509 continue; // ignore this value
510 else if (oks::cmp_str16(attr.name(), "last-modified-by"))
511 p_last_modified_by.assign(attr.value(), attr.value_len());
512 else if (oks::cmp_str16(attr.name(), "last-modified-on"))
513 p_last_modified_on.assign(attr.value(), attr.value_len());
514 else if (!strcmp(attr.name(), "last-modification-time"))
515 p_last_modification_time = oks::str2time(attr.value(), attr.value_len(), p_full_name.c_str());
516 else {
517 p_oks_format.clear();
518 xmls->throw_unexpected_tag(attr.name(), "info\'s tags");
519 }
520 }
521 } catch (oks::exception& e) {
522 throw oks::FailedRead("<info> tag attribute", e);
523 } catch (std::exception& e) {
524 throw oks::FailedRead("<info> tag attribute", e.what());
525 }
526
527 // read include and comments sections
528 while (true) {
529 xmls->store_position();
530
531 bool read_include = false;
532
533 try {
534 const char* tag_start = xmls->get_tag_start();
535 if (oks::cmp_str7(tag_start, xml_include_tag)) {
536 read_include = true;
537 } else if (oks::cmp_str8(tag_start, xml_comments_tag)) {
538 read_include = false;
539 } else {
540 xmls->restore_position();
541 return;
542 }
543 } catch (oks::exception& e) {
544 throw oks::FailedRead("a tag", e);
545 } catch (std::exception& e) {
546 throw oks::FailedRead("a tag", e.what());
547 }
548
549 if (read_include) {
550 while (true) {
551 try {
552
553 {
554 const char* tag_start = xmls->get_tag_start();
555 if (!oks::cmp_str4(tag_start, xml_file_tag)) {
556 if (!oks::cmp_str8(tag_start, "/include")) {
557 xmls->throw_unexpected_tag(tag_start + 1, xml_file_tag);
558 }
559 break;
560 }
561 }
562
563 while (true) {
564 OksXmlAttribute attr(*xmls);
565
566 // check for close of tag
567 if (oks::cmp_str1(attr.name(), ">") || oks::cmp_str1(attr.name(), "/")) {
568 break;
569 }
570
571 // check for known info' attributes
572 else if (oks::cmp_str4(attr.name(), "path"))
573 p_list_of_include_files.push_back(std::string(attr.value(), attr.value_len()));
574 else {
575 p_oks_format.clear();
576 xmls->throw_unexpected_tag(attr.name(), "path");
577 }
578 }
579
580 } catch (oks::exception& e) {
581 throw oks::FailedRead("<file> tag", e);
582 } catch (std::exception& e) {
583 throw oks::FailedRead("<file> tag", e.what());
584 }
585 }
586 } else {
587 while (true) {
588 try {
589
590 {
591 const char* tag_start = xmls->get_tag_start();
592 if (!oks::cmp_str7(tag_start, xml_comment_tag)) {
593 if (!oks::cmp_str9(tag_start, "/comments")) {
594 xmls->throw_unexpected_tag(tag_start, xml_comment_tag);
595 }
596 return;
597 }
598 }
599
600 std::unique_ptr<oks::Comment> comment(new oks::Comment());
601 std::string creation_time;
602
603 while (true) {
604 OksXmlAttribute attr(*xmls);
605
606 // check for close of tag
607 if (oks::cmp_str1(attr.name(), ">") || oks::cmp_str1(attr.name(), "/")) {
608 break;
609 }
610
611 // check for known info' attributes
612 else if (oks::cmp_str4(attr.name(), "text"))
613 comment->p_text.assign(attr.value(), attr.value_len());
614 else if (oks::cmp_str6(attr.name(), "author"))
615 comment->p_author.assign(attr.value(), attr.value_len());
616 else if (oks::cmp_str10(attr.name(), "created-by"))
617 comment->p_created_by.assign(attr.value(), attr.value_len());
618 else if (oks::cmp_str10(attr.name(), "created-on"))
619 comment->p_created_on.assign(attr.value(), attr.value_len());
620 else if (oks::cmp_str13(attr.name(), "creation-time"))
621 creation_time.assign(attr.value(), attr.value_len());
622 else {
623 p_oks_format.clear();
624 xmls->throw_unexpected_tag(attr.name(), "comment\'s tags");
625 }
626 }
627
628 comment->validate(creation_time);
629
630 if (p_comments.find(creation_time) != p_comments.end()) {
631 std::ostringstream text;
632 text << "The comment created at \'" << creation_time << "\' was already defined in this file";
633 throw std::runtime_error(text.str().c_str());
634 }
635
636 p_comments[creation_time] = comment.release();
637
638 } catch (oks::exception& e) {
639 throw oks::FailedRead("<comment>", e);
640 } catch (std::exception& e) {
641 throw oks::FailedRead("<comment>", e.what());
642 }
643 }
644 }
645 }
646}
static const char xml_comments_tag[]
Definition file.hpp:755
std::map< std::string, oks::Comment * > p_comments
Definition file.hpp:744
std::list< std::string > p_list_of_include_files
Definition file.hpp:741
static const char xml_file_tag[]
Definition file.hpp:754
static const char xml_comment_tag[]
Definition file.hpp:756
static const char xml_include_tag[]
Definition file.hpp:753
static const char xml_info_tag[]
Definition file.hpp:752
bool get_silence_mode() const
Get status of silence mode. The method returns true, if the silence mode is switched 'On'....
Definition kernel.hpp:719
static std::ostream & warning_msg(const char *)
Definition kernel.cpp:518
bool cmp_str8(const char *s1, const char s2[9])
Definition cstring.hpp:93
bool cmp_str1(const char *s1, const char s2[2])
Definition cstring.hpp:15
bool cmp_str4(const char *s1, const char s2[5])
Definition cstring.hpp:45
bool cmp_str6(const char *s1, const char s2[7])
Definition cstring.hpp:69
bool cmp_str10(const char *s1, const char s2[11])
Definition cstring.hpp:111
bool cmp_str9(const char *s1, const char s2[10])
Definition cstring.hpp:105
boost::posix_time::ptime str2time(const char *value, size_t len, const char *file_name=nullptr)
const char _empty_str[]
Definition file.cpp:354
bool cmp_str13(const char *s1, const char s2[14])
Definition cstring.hpp:129
bool cmp_str16(const char *s1, const char s2[17])
Definition cstring.hpp:147
bool cmp_str15(const char *s1, const char s2[16])
Definition cstring.hpp:141
bool cmp_str11(const char *s1, const char s2[12])
Definition cstring.hpp:117
bool cmp_str12(const char *s1, const char s2[13])
Definition cstring.hpp:123
bool cmp_str7(const char *s1, const char s2[8])
Definition cstring.hpp:81

Member Function Documentation

◆ add_comment()

void dunedaq::oks::OksFile::add_comment ( const std::string & text,
const std::string & author )

Add new comment to file.

The method allows to add text description to the file.

Parameters
textthe description; must not be empty
authorthe author's description, e.g. first and last names, the e-mail address, etc.
Exceptions
Incase of problems (e.g. empty text) the method throws oks::exception.

Definition at line 687 of file file.cpp.

688{
689 try {
690 lock();
691 } catch (oks::exception& ex) {
692 throw oks::FailedAddComment(*this, ex);
693 }
694
695 boost::posix_time::ptime now = boost::posix_time::second_clock::universal_time();
696 std::string creation_time = boost::posix_time::to_iso_string(now);
697
698 try {
699 std::unique_ptr<oks::Comment> comment(new oks::Comment(text, author));
700 comment->validate();
701
702 oks::Comment*& x(p_comments[creation_time]);
703
704 if (x == 0) {
705 x = comment.release();
706 } else {
707 x->p_text += "\n-----\n";
708 x->p_text.append(text);
709 }
710 } catch (std::exception& ex) {
711 throw oks::FailedAddComment(*this, ex.what());
712 }
713
714 p_is_updated = true;
715}
void lock()
Lock OKS file.
Definition file.cpp:1004

◆ add_include_file()

void dunedaq::oks::OksFile::add_include_file ( const std::string & name)

Add include file.

The method adds include file to given one. To load included file it is necessary to save the file and load it again.

Parameters
namename of include file to be added
Exceptions
Incase of problems (e.g. cannot lock file) the method throws oks::exception.

Definition at line 1157 of file file.cpp.

1158{
1159 // check if the file was already included
1161 return;
1162 }
1163
1164 // lock file
1165 try {
1166 lock();
1167 } catch (oks::exception& ex) {
1168 throw oks::FailedAddInclude(*this, s, ex);
1169 }
1170
1171 // try to find path to include and load it
1172 try {
1173 std::string path = p_kernel->get_file_path(s, this);
1174 p_kernel->k_load_file(path, true, this, 0);
1175 } catch (std::exception& ex) {
1176 throw oks::FailedAddInclude(*this, s, ex.what());
1177 }
1178
1179 // add include and mark file as updated
1180 p_list_of_include_files.push_back(s);
1181 p_is_updated = true;
1182}
std::list< std::string >::iterator find_include_file(const std::string &)
Definition file.cpp:1134
OksFile * k_load_file(const std::string &name, bool bind, const OksFile *parent, OksPipeline *pipeline)
Definition kernel.cpp:1634
std::string get_file_path(const std::string &path, const OksFile *parent_file=0, bool strict_paths=true) const
Calculates full path to file.
Definition kernel.cpp:1516

◆ check_parent()

OksFile * dunedaq::oks::OksFile::check_parent ( const OksFile * parent_h)

Set given parent, if this file is not yet included.

Parameters
parent_hparent file
Returns
this file.

Definition at line 1147 of file file.cpp.

1148{
1149 if (p_included_by == 0 && parent_h != 0) {
1150 p_included_by = parent_h;
1151 }
1152
1153 return this;
1154}

◆ check_repository()

void dunedaq::oks::OksFile::check_repository ( )
private

Definition at line 907 of file file.cpp.

908{
909 // if(size_t len = OksKernel::get_repository_root().size()) {
910 // if(p_full_name.size() > len && p_full_name.substr(0, len) == OksKernel::get_repository_root()) {
911 // p_repository = GlobalRepository;
912 // p_repository_name = p_full_name.substr(len + 1);
913 // TLOG_DEBUG( 3 ) << "file \'" << p_full_name << "\' comes from user repository [\'" << p_repository_name <<
914 // "\']"; return;
915 // }
916 // }
917
918 const std::string& s(p_kernel->get_user_repository_root());
919 if (size_t len = s.size()) {
920 if (p_full_name.size() > len && p_full_name.substr(0, len) == s) {
921 // p_repository = UserRepository;
922 p_repository_name = p_full_name.substr(len + 1);
923
924 TLOG_DEBUG(3) << "file \'" << p_full_name << "\' comes from user repository [\'" << p_repository_name << "\']";
925 return;
926
927 // std::string repository_file = OksKernel::get_repository_root() + '/' + p_repository_name;
928 //
929 // struct stat buf;
930 // if(stat(repository_file.c_str(), &buf) == 0) {
931 // TLOG_DEBUG( 3 ) << "file \'" << p_full_name << "\' comes from user repository [\'" << p_repository_name
932 // << "\']" ; return;
933 // }
934 // else {
935 // TLOG_DEBUG( 3 ) << "file \'" << p_full_name << "\' is found in user repository [\'" << p_repository_name
936 // << "\'] but does not exist in global one [\'" << OksKernel::get_repository_root() << "\']" ;
937 // }
938 }
939 }
940
941 TLOG_DEBUG(3) << "file \'" << p_full_name << "\' is not in a repository";
942 // p_repository = NoneRepository;
943 p_repository_name.clear();
944}
std::string p_repository_name
Definition file.hpp:724
const std::string & get_user_repository_root() const
Get user OKS repository root.
Definition kernel.cpp:335
#define TLOG_DEBUG(lvl,...)
Definition Logging.hpp:116

◆ clear_comments()

void dunedaq::oks::OksFile::clear_comments ( )
privatenoexcept

Definition at line 296 of file file.cpp.

297{
298 for (std::map<std::string, oks::Comment*>::iterator i = p_comments.begin(); i != p_comments.end(); ++i) {
299 delete i->second;
300 }
301
302 p_comments.clear();
303}

◆ compare() [1/2]

bool dunedaq::oks::OksFile::compare ( const char * file1_name,
const char * file2_name )
static

Compare two files.

Parameters
file1_namename of first file
file2_namename of second file
Returns
false => files are different; true => files are equal
Exceptions
Incase of problems the method throws oks::exception.

Definition at line 1494 of file file.cpp.

1495{
1496 std::ifstream f1(file1_name);
1497 std::ifstream f2(file2_name);
1498
1499 if (!f1) {
1500 throw oks::FileCompareError(file1_name, file2_name, "cannot open file");
1501 }
1502
1503 if (!f2) {
1504 throw oks::FileCompareError(file2_name, file1_name, "cannot open file");
1505 }
1506
1507 std::string line1;
1508 std::string line2;
1509
1510 while (true) {
1511 if (f1.eof() && f2.eof()) {
1512 return true;
1513 }
1514
1515 std::getline(f1, line1);
1516 std::getline(f2, line2);
1517
1518 if ((line1 != line2) && (is_not_info(line1) || is_not_info(line2))) {
1519 return false;
1520 }
1521 }
1522
1523 return true;
1524}
static bool is_not_info(const std::string &line)
Definition file.cpp:1480

◆ compare() [2/2]

bool dunedaq::oks::OksFile::compare ( const char * name) const
inline

Compare with another file.

Parameters
namename of file to compare with
Returns
false => files are different; true => files are equal
Exceptions
Incase of problems the method throws oks::exception.

Definition at line 697 of file file.hpp.

697{ return compare(p_full_name.c_str(), name); }
static bool compare(const char *file1_name, const char *file2_name)
Compare two files.
Definition file.cpp:1494

◆ create_lock_name()

void dunedaq::oks::OksFile::create_lock_name ( )
private

Definition at line 947 of file file.cpp.

948{
950
951 std::string::size_type idx = p_lock_file_name.find_last_of('/');
952 if (idx == std::string::npos)
953 p_lock_file_name = "./";
954 else
955 p_lock_file_name.erase(idx + 1);
956
957 const char _prefix_str[] = ".oks-lock-";
958 p_lock_file_name.append(_prefix_str, sizeof(_prefix_str) - 1);
959
960 idx = p_full_name.find_last_of('/');
961 std::string::size_type len(p_full_name.size());
962 if (idx == std::string::npos) {
963 idx = 0;
964 } else {
965 idx++;
966 len -= idx;
967 }
968
969 p_lock_file_name.append(p_full_name, idx, len);
970 p_lock_file_name.append(".txt");
971}
std::string p_lock_file_name
Definition file.hpp:738

◆ find_include_file()

std::list< std::string >::iterator dunedaq::oks::OksFile::find_include_file ( const std::string & s)
private

Definition at line 1134 of file file.cpp.

1135{
1136 std::list<std::string>::iterator i = p_list_of_include_files.begin();
1137
1138 for (; i != p_list_of_include_files.end(); ++i) {
1139 if (*i == s)
1140 break;
1141 }
1142
1143 return i;
1144}

◆ get_all_include_files()

void dunedaq::oks::OksFile::get_all_include_files ( const OksKernel * kernel,
std::set< OksFile * > & out )

Get all include files.

Parameters
kernelOKS kernel
outset of all files included explicitly and implicitly by given file

Definition at line 1445 of file file.cpp.

1446{
1447 const OksFile::Map& schema_files = kernel->schema_files();
1448 const OksFile::Map& data_files = kernel->data_files();
1449
1450 for (std::list<std::string>::iterator i = p_list_of_include_files.begin(); i != p_list_of_include_files.end(); ++i) {
1451 std::string s = kernel->get_file_path(*i, this);
1452 if (s.size()) {
1453 OksFile::Map::const_iterator j = data_files.find(&s);
1454 if (j != data_files.end()) {
1455 if (out.find(j->second) != out.end()) {
1456 continue;
1457 }
1458 out.insert(j->second);
1459 } else {
1460 j = schema_files.find(&s);
1461 if (j != schema_files.end()) {
1462 if (out.find(j->second) != out.end()) {
1463 continue;
1464 }
1465 out.insert(j->second);
1466 } else {
1467 continue;
1468 }
1469 }
1470
1471 j->second->get_all_include_files(kernel, out);
1472 }
1473 }
1474}
std::map< const std::string *, OksFile *, SortByName > Map
Definition file.hpp:382
FELIX Initialization std::string initerror FELIX queue timed out

◆ get_comment()

oks::Comment * dunedaq::oks::OksFile::get_comment ( const std::string & creation_time)
privatenoexcept

Definition at line 718 of file file.cpp.

719{
720 std::map<std::string, oks::Comment*>::const_iterator i = p_comments.find(creation_time);
721 return (i == p_comments.end()) ? 0 : i->second;
722}

◆ get_comments()

const std::map< std::string, oks::Comment * > & dunedaq::oks::OksFile::get_comments ( ) const
inline

Get all comments of file.

Definition at line 498 of file file.hpp.

498{ return p_comments; }

◆ get_created_by()

const std::string & dunedaq::oks::OksFile::get_created_by ( ) const
inline

Return name of user who created this file.

Definition at line 585 of file file.hpp.

585{ return p_created_by; }

◆ get_created_on()

const std::string & dunedaq::oks::OksFile::get_created_on ( ) const
inline

Return name of host where the file was created.

Definition at line 593 of file file.hpp.

593{ return p_created_on; }

◆ get_creation_time()

const boost::posix_time::ptime dunedaq::oks::OksFile::get_creation_time ( ) const
inline

Return timestamp when file was created.

Definition at line 589 of file file.hpp.

589{ return p_creation_time; }

◆ get_full_file_name()

const std::string & dunedaq::oks::OksFile::get_full_file_name ( ) const
inline

Return real file name (replacing all software links)

Definition at line 528 of file file.hpp.

528{ return p_full_name; }

◆ get_include_files()

const std::list< std::string > & dunedaq::oks::OksFile::get_include_files ( ) const
inline

Get directly include files.

Returns
list of file names included by given file

Definition at line 633 of file file.hpp.

633{ return p_list_of_include_files; }

◆ get_last_modification_time()

const boost::posix_time::ptime dunedaq::oks::OksFile::get_last_modification_time ( ) const
inline

Return timestamp when file was modified last time using OKS tools.

Definition at line 601 of file file.hpp.

601{ return p_last_modification_time; }

◆ get_last_modified_by()

const std::string & dunedaq::oks::OksFile::get_last_modified_by ( ) const
inline

Return name of user who modified the file last time using OKS tools.

Definition at line 597 of file file.hpp.

597{ return p_last_modified_by; }

◆ get_last_modified_on()

const std::string & dunedaq::oks::OksFile::get_last_modified_on ( ) const
inline

Return name of host where the file was modified last time using OKS tools.

Definition at line 605 of file file.hpp.

605{ return p_last_modified_on; }

◆ get_lock_file()

const std::string & dunedaq::oks::OksFile::get_lock_file ( ) const
inline

Definition at line 566 of file file.hpp.

567 {
569 return p_lock_file_name;
570 }
void init_lock_name() const
Definition file.hpp:778

◆ get_lock_string()

bool dunedaq::oks::OksFile::get_lock_string ( std::string & info) const

Return lock status of OKS file and if the file is locked, get information string about process which locked the file.

The method method also works for files locked by external process contrary to the is_locked() method.

Parameters
infoout parameter containing info about process locked this file
Returns
true, if the file is locked and false otherwise

Definition at line 977 of file file.cpp.

978{
980
981 lock_file_contents.clear();
982
983 const char* lock_name = p_lock_file_name.c_str();
984 struct stat buf;
985
986 if (stat(lock_name, &buf) == 0) {
987 std::ifstream f(lock_name);
988
989 if (f.good()) {
990 std::getline(f, lock_file_contents);
991 return true;
992 } else {
993 lock_file_contents = "unknown [cannot read lock file \'";
994 lock_file_contents += p_lock_file_name;
995 lock_file_contents += "\']";
996 return true;
997 }
998 }
999
1000 return false;
1001}

◆ get_logical_name()

const std::string & dunedaq::oks::OksFile::get_logical_name ( ) const
inline

Definition at line 571 of file file.hpp.

571{ return p_logical_name; }

◆ get_number_of_items()

long dunedaq::oks::OksFile::get_number_of_items ( ) const
inline

Return number of classes in schema file, or number of objects in data file.

Definition at line 577 of file file.hpp.

577{ return p_number_of_items; }

◆ get_oks_format()

const std::string & dunedaq::oks::OksFile::get_oks_format ( ) const
inline

Definition at line 573 of file file.hpp.

573{ return p_oks_format; }

◆ get_parent()

const OksFile * dunedaq::oks::OksFile::get_parent ( ) const
inline

Return parent including given file.

Returns
parent file; can be NULL.

Definition at line 705 of file file.hpp.

705{ return p_included_by; }

◆ get_repository_name()

const std::string & dunedaq::oks::OksFile::get_repository_name ( ) const
inline

Get name of file inside repository.

For example, if TDAQ_DB_REPOSITORY="/db/v15", and the file name is "/db/v15/common/params.data.xml", the file's repository name will be "common/params.data.xml".

Definition at line 553 of file file.hpp.

553{ return p_repository_name; }

◆ get_short_file_name()

const std::string & dunedaq::oks::OksFile::get_short_file_name ( ) const
inline

Definition at line 524 of file file.hpp.

524{ return p_short_name; }

◆ get_size()

long dunedaq::oks::OksFile::get_size ( ) const
inline

Return length of file in bytes.

Definition at line 581 of file file.hpp.

581{ return p_size; }

◆ get_status_of_file()

OksFile::FileStatus dunedaq::oks::OksFile::get_status_of_file ( ) const

Return update status of file.

The file can be in one of the following states:

  • NotModified - file is not modified
  • FileModified - file is modified in memory
  • FileWasNotSaved - file was created, but not saved yet (only exists in memory)
  • FileRemoved - file was removed by external process after load in memory
  • FileRepositoryModified - repository file was modified (given file comes from user repository)
  • FileRepositoryRemoved - repository file was removed (given file comes from user repository)

Definition at line 1394 of file file.cpp.

1395{
1396 if (p_is_on_disk == false) {
1397 return FileWasNotSaved;
1398 } else {
1399 struct stat buf;
1400
1401 if (stat(p_full_name.c_str(), &buf) != 0) {
1402 return FileRemoved;
1403 }
1404
1405 if (buf.st_mtime != p_last_modified) {
1406 return FileModified;
1407 }
1408
1409 // if(get_repository() == UserRepository) {
1410 // std::string full_repository_name = make_repository_name();
1411 //
1412 // if(!full_repository_name.empty()) {
1413 // if(stat(full_repository_name.c_str(), &buf) != 0) {
1414 // return FileRepositoryRemoved;
1415 // }
1416 //
1417 // if(buf.st_mtime != p_repository_last_modified) {
1418 // return FileRepositoryModified;
1419 // }
1420 // }
1421 // }
1422 }
1423
1424 return FileNotModified;
1425}

◆ get_type()

const std::string & dunedaq::oks::OksFile::get_type ( ) const
inline

Definition at line 572 of file file.hpp.

572{ return p_type; }

◆ get_well_formed_name()

const std::string & dunedaq::oks::OksFile::get_well_formed_name ( ) const
inline

Get well-formed file name.

In particular, strip repository root prefix.

Definition at line 561 of file file.hpp.

562 {
563 return (!p_repository_name.empty() ? p_repository_name : p_full_name);
564 }

◆ init_lock_name()

void dunedaq::oks::OksFile::init_lock_name ( ) const
inlineprivate

Definition at line 778 of file file.hpp.

779 {
780 if (p_lock_file_name.empty())
781 const_cast<OksFile*>(this)->create_lock_name();
782 }
OksFile(const std::string &, const std::string &, const std::string &, const std::string &, OksKernel *)
Definition file.cpp:264

◆ is_locked()

bool dunedaq::oks::OksFile::is_locked ( ) const
inline

Return lock status of OKS file.

Returns
true, if the file is locked by given process and false otherwise

Definition at line 612 of file file.hpp.

612{ return (p_lock != nullptr); }

◆ is_read_only()

bool dunedaq::oks::OksFile::is_read_only ( ) const
inline

Return read-only status of OKS file.

Returns
true, if the file is read-only for given process and false otherwise

Definition at line 626 of file file.hpp.

626{ return p_is_read_only; }

◆ is_repository_file()

bool dunedaq::oks::OksFile::is_repository_file ( ) const

Get information about repository, the file belongs to.

If the global database repository is set (e.g. TDAQ_DB_REPOSITORY is defined) and the file is stored on it, the method returns GlobalRepository. If the user database repository is set (e.g. TDAQ_DB_USER_REPOSITORY is defined) and the file is stored on it, the method returns UserRepository. Otherwise file does not belong to any repository and the method returns NoneRepository.

The file's repository can be changed using OksKernel::checkout() and OksKernel::release() methods: they move file between global and user repositories. If file is removed in global repository, while it is stored on the user one, its repository should be changed using unset_repository() method.

Definition at line 901 of file file.cpp.

902{
903 return (!p_kernel->get_user_repository_root().empty());
904}

◆ is_updated()

bool dunedaq::oks::OksFile::is_updated ( ) const
inline

Return update status of OKS file.

Returns
true, if the file is updated by given process and false otherwise

Definition at line 619 of file file.hpp.

619{ return p_is_updated; }

◆ lock()

void dunedaq::oks::OksFile::lock ( )

Lock OKS file.

The method locks OKS file: for file .../file.xml the lock file .../.oks-file.xml is created. The lock file contains information about process locking it and remains exclusive while process created it is alive.

Exceptions
Incase of problems (e.g. file was already locked) the method throws oks::exception.

Definition at line 1004 of file file.cpp.

1005{
1006 if (p_nolock_mode) {
1007 // Nasty hack to allow code generation on the fly without locking
1008 // file. Just return without locking!
1009 return;
1010 }
1011
1013
1014 if (p_lock != nullptr) {
1015 return;
1016 }
1017
1018 // check that the file is not read-only
1019
1020 {
1021 struct stat buf;
1022
1023 if (stat(p_full_name.c_str(), &buf) == 0) {
1024 if (OksKernel::check_read_only(this) == true) {
1025 throw oks::FileLockError(*this, true, "file is read-only");
1026 }
1027 }
1028 }
1029
1030 // check lock and report problem if it exists and cannot be reset
1031
1032 {
1033 std::string lock_file_contents;
1034
1035 if (get_lock_string(lock_file_contents)) {
1036 try {
1037 boost::interprocess::file_lock lock(p_lock_file_name.c_str());
1038
1039 if (lock.try_lock() == false) {
1040 std::ostringstream text;
1041 text << "file is already locked by \"" << lock_file_contents << '\"';
1042 throw oks::FileLockError(*this, true, text.str());
1043 } else {
1044 try {
1045 lock.unlock();
1046 } catch (const boost::interprocess::interprocess_exception& ex) {
1047 std::ostringstream text;
1048 text << "boost::interprocess::unlock() failed: \"" << ex.what() << '\"';
1049 throw oks::FileLockError(*this, false, text.str());
1050 }
1051
1052 if (!p_kernel->get_silence_mode()) {
1053 Oks::warning_msg("OksFile::lock()") << "Remove obsolete lock of file \'" << p_full_name
1054 << "\' created by \n\"" << lock_file_contents << "\"\n";
1055 }
1056
1057 if (unlink(p_lock_file_name.c_str()) != 0) {
1058 std::ostringstream text;
1059 text << "failed to remove lock file \'" << p_lock_file_name << "\':\n" << oks::strerror(errno);
1060 throw oks::FileLockError(*this, false, text.str());
1061 }
1062 }
1063 } catch (const boost::interprocess::interprocess_exception& ex) {
1064 std::ostringstream text;
1065 text << "boost::interprocess::try_lock() failed: \"" << ex.what() << '\"';
1066 throw oks::FileLockError(*this, false, text.str());
1067 }
1068 }
1069 }
1070
1071 // write lock file
1072
1073 {
1074 std::ofstream f(p_lock_file_name.c_str());
1075
1076 if (!f.good()) {
1077 std::ostringstream text;
1078 text << "failed to create lock file \'" << p_lock_file_name << '\'';
1079 throw oks::FileLockError(*this, true, text.str());
1080 }
1081
1082 try {
1083 boost::posix_time::ptime now(boost::posix_time::second_clock::universal_time());
1084 f << "process " << getpid() << " on " << OksKernel::get_host_name() << " started by "
1085 << OksKernel::get_user_name() << " at " << boost::posix_time::to_simple_string(now) << " (UTC)" << std::endl;
1086 f.flush();
1087 f.close();
1088 } catch (std::exception& ex) {
1089 std::ostringstream text;
1090 text << "failed to write lock file \'" << p_lock_file_name << "\': " << ex.what();
1091 throw oks::FileLockError(*this, true, text.str());
1092 }
1093 }
1094
1095 try {
1096 p_lock.reset(new boost::interprocess::file_lock(p_lock_file_name.c_str()));
1097
1098 if (p_lock->try_lock() == false) {
1099 throw std::runtime_error("file is locked by another process");
1100 }
1101 } catch (const std::exception& ex) {
1102 std::ostringstream text;
1103 text << "boost::interprocess::try_lock() failed: \"" << ex.what() << '\"';
1104 p_lock.reset();
1105 throw oks::FileLockError(*this, false, text.str());
1106 }
1107}
bool get_lock_string(std::string &info) const
Return lock status of OKS file and if the file is locked, get information string about process which ...
Definition file.cpp:977
static bool p_nolock_mode
Definition file.hpp:720
static bool check_read_only(OksFile *f)
Check if the OKS file is read-only.
Definition kernel.cpp:1394
const std::string strerror(int error)
Convert C error number to string.
Definition kernel.cpp:111

◆ make_repository_name()

std::string dunedaq::oks::OksFile::make_repository_name ( ) const
private

Definition at line 1361 of file file.cpp.

1362{
1363 std::string name;
1364
1365 if (!OksKernel::get_repository_root().empty()) {
1367 }
1368
1369 return name;
1370}
const std::string & get_repository_name() const
Get name of file inside repository.
Definition file.hpp:553
static const std::string & get_repository_root()
Get OKS repository root.
Definition kernel.cpp:280

◆ modify_comment()

void dunedaq::oks::OksFile::modify_comment ( const std::string & creation_time,
const std::string & text,
const std::string & author )

/brief Modify existing comment.

The method allows to modify already existing comment.

/param creation_time the time-stamp when comment was created ( returned by get_comments() ) /param text the description; must not be empty /param author the author's description, e.g. first and last names, the e-mail address, etc.

Exceptions
Incase of problems (e.g. empty text, cannot find comment created at given time) the method throws oks::exception.

Definition at line 725 of file file.cpp.

726{
727 if (oks::Comment* comment = get_comment(creation_time)) {
728 try {
729 lock();
730 } catch (oks::exception& ex) {
731 throw oks::FailedChangeComment(*this, creation_time, ex);
732 }
733
734 std::string saved_author(comment->p_author);
735 std::string saved_text(comment->p_text);
736
737 comment->p_author = author;
738 comment->p_text = text;
739
740 try {
741 comment->validate();
742 } catch (std::exception& ex) {
743 comment->p_author = saved_author;
744 comment->p_text = saved_text;
745 throw oks::FailedChangeComment(*this, creation_time, ex.what());
746 }
747
748 p_is_updated = true;
749 } else {
750 throw oks::FailedChangeComment(*this, creation_time, "cannot find comment");
751 }
752}
oks::Comment * get_comment(const std::string &creation_time) noexcept
Definition file.cpp:718

◆ operator=()

OksFile & dunedaq::oks::OksFile::operator= ( const OksFile & f)
private

Definition at line 311 of file file.cpp.

312{
313 if (&f != this) {
316
317 p_short_name = f.p_short_name;
318 p_full_name = f.p_full_name;
319 // p_repository = f.p_repository;
320 p_repository_name = f.p_repository_name;
321 p_logical_name = f.p_logical_name;
322 p_type = f.p_type;
323 p_oks_format = f.p_oks_format;
324 p_number_of_items = f.p_number_of_items;
325 p_size = f.p_size;
326 p_created_by = f.p_created_by;
327 p_creation_time = f.p_creation_time;
328 p_created_on = f.p_created_on;
329 p_last_modified_by = f.p_last_modified_by;
330 p_last_modification_time = f.p_last_modification_time;
331 p_last_modified_on = f.p_last_modified_on;
332 p_open_mode = f.p_open_mode;
333 p_is_updated = f.p_is_updated;
334 p_lock = f.p_lock;
335 p_is_read_only = f.p_is_read_only;
336 p_lock_file_name = f.p_lock_file_name;
337 p_list_of_include_files = f.p_list_of_include_files;
338 p_last_modified = f.p_last_modified;
339 p_repository_last_modified = f.p_repository_last_modified;
340 p_is_on_disk = f.p_is_on_disk;
341 p_included_by = f.p_included_by;
342 p_kernel = f.p_kernel;
343
344 for (const auto& i : f.p_comments) {
345 p_comments[i.first] = new oks::Comment(*i.second);
346 }
347 }
348
349 return *this;
350}

◆ remove_comment()

void dunedaq::oks::OksFile::remove_comment ( const std::string & creation_time)

Modify existing comment.

The method allows to erase already existing comment.

Parameters
creation_timethe timestamp when comment was created ( returned by get_comments() )
Exceptions
Incase of problems (e.g. cannot find comment created at given time, cannot lock file) the method throws oks::exception.

Definition at line 755 of file file.cpp.

756{
757 if (oks::Comment* comment = get_comment(creation_time)) {
758 try {
759 lock();
760 } catch (oks::exception& ex) {
761 throw oks::FailedRemoveComment(*this, creation_time, ex);
762 }
763
764 delete comment;
765 p_comments.erase(creation_time);
766 p_is_updated = true;
767 } else {
768 throw oks::FailedRemoveComment(*this, creation_time, "cannot find comment");
769 }
770}

◆ remove_include_file()

void dunedaq::oks::OksFile::remove_include_file ( const std::string & name)

Remove include file.

The method removes include file from given one. The name of the file to be removed has to be exactly the same as passed to the add_include_file() or as it appears in the include section of OKS xml file. To unload included file it is necessary to save the file and load it again.

Parameters
namename of include file to be removed
Exceptions
Incase of problems (e.g. cannot lock file, include does not exist) the method throws oks::exception.

Definition at line 1185 of file file.cpp.

1186{
1187 // search included file
1188 std::list<std::string>::iterator i = find_include_file(s);
1189
1190 // check if the file was included
1191 if (i == p_list_of_include_files.end()) {
1192 throw oks::FailedRemoveInclude(*this, s, "there is no such include file");
1193 }
1194
1195 // lock file
1196 try {
1197 lock();
1198 } catch (oks::exception& ex) {
1199 throw oks::FailedRemoveInclude(*this, s, ex);
1200 }
1201
1202 // remove include and mark file as updated
1203 p_list_of_include_files.erase(i);
1204 p_is_updated = true;
1205
1206 // close file, if it is not referenced by others
1208}
void k_close_dangling_includes()
Close files which lost their parent.
Definition kernel.cpp:1800

◆ rename() [1/2]

void dunedaq::oks::OksFile::rename ( const std::string & full_name)
private

Definition at line 1437 of file file.cpp.

1438{
1439 p_full_name = full_name;
1442}
void update_status_of_file(bool update_local=true, bool update_repository=true)
Update status of file.
Definition file.cpp:1373

◆ rename() [2/2]

void dunedaq::oks::OksFile::rename ( const std::string & short_name,
const std::string & full_name )
private

Definition at line 1428 of file file.cpp.

1429{
1430 p_short_name = short_name;
1431 p_full_name = full_name;
1434}

◆ rename_include_file()

void dunedaq::oks::OksFile::rename_include_file ( const std::string & from,
const std::string & to )

Rename include file.

The method renames already included file. To re-load new file it is necessary to save the file and load it again.

Parameters
fromexact name of already included file
tonew name of include
Exceptions
Incase of problems (e.g. cannot lock file, no such include file) the method throws oks::exception.

Definition at line 1211 of file file.cpp.

1212{
1213 if (old_s == new_s)
1214 return;
1215
1216 std::list<std::string>::iterator i1 = find_include_file(old_s);
1217 std::list<std::string>::iterator i2 = find_include_file(new_s);
1218
1219 if (i1 == p_list_of_include_files.end()) {
1220 throw oks::FailedRenameInclude(*this, old_s, new_s, "there is no such include file");
1221 }
1222
1223 if (i2 != p_list_of_include_files.end()) {
1224 throw oks::FailedRenameInclude(*this, old_s, new_s, "file with new name is already included");
1225 }
1226
1227 try {
1228 lock();
1229 } catch (oks::exception& ex) {
1230 throw oks::FailedRenameInclude(*this, old_s, new_s, ex);
1231 }
1232
1233 (*i1) = new_s;
1234 p_is_updated = true;
1235}

◆ set_logical_name()

void dunedaq::oks::OksFile::set_logical_name ( const std::string & name)

Set logical name of file.

The logical name can be associated by user with the file, e.g. to describe its purpose.

Parameters
namethe logical name
Exceptions
Incase of problems (e.g. cannot lock file) the method throws oks::exception.

Definition at line 1238 of file file.cpp.

1239{
1240 if (s == p_logical_name)
1241 return;
1242
1243 try {
1244 lock();
1245 } catch (oks::exception& ex) {
1246 throw oks::FileChangeError(*this, "set logical name", ex);
1247 }
1248
1249 p_logical_name = s;
1250 p_is_updated = true;
1251}

◆ set_nolock_mode()

void dunedaq::oks::OksFile::set_nolock_mode ( bool nl)
inlinestatic

Definition at line 401 of file file.hpp.

401{ p_nolock_mode = nl; }

◆ set_type()

void dunedaq::oks::OksFile::set_type ( const std::string & type)

Set file type.

The type can be associated by user with the file, e.g. to describe its contents.

Parameters
namethe type
Exceptions
Incase of problems (e.g. cannot lock file) the method throws oks::exception.

Definition at line 1254 of file file.cpp.

1255{
1256 if (s == p_type)
1257 return;
1258
1259 try {
1260 lock();
1261 } catch (oks::exception& ex) {
1262 throw oks::FileChangeError(*this, "set type", ex);
1263 }
1264
1265 p_type = s;
1266 p_is_updated = true;
1267}

◆ set_updated()

void dunedaq::oks::OksFile::set_updated ( )
inlineprivate

Definition at line 773 of file file.hpp.

773{ p_is_updated = true; } // in-memory

◆ unlock()

void dunedaq::oks::OksFile::unlock ( )

Unlock OKS file.

The method removes lock created by lock() method. check_repository

Exceptions
Incase of problems (e.g. cannot unlink lock file) the method throws oks::exception.

Definition at line 1110 of file file.cpp.

1111{
1112 if (p_lock == nullptr)
1113 return;
1114
1115 try {
1116 p_lock->unlock();
1117 } catch (const boost::interprocess::interprocess_exception& ex) {
1118 std::ostringstream text;
1119 text << "boost::interprocess::unlock() failed: \"" << ex.what() << '\"';
1120 p_lock.reset();
1121 throw oks::FileLockError(*this, false, text.str());
1122 }
1123
1124 p_lock.reset();
1125
1126 if (unlink(p_lock_file_name.c_str()) != 0 && errno != ENOENT) {
1127 std::ostringstream text;
1128 text << "failed to remove lock file \'" << p_lock_file_name << "\':\n" << oks::strerror(errno);
1129 throw oks::FileLockError(*this, false, text.str());
1130 }
1131}

◆ update_status_of_file()

void dunedaq::oks::OksFile::update_status_of_file ( bool update_local = true,
bool update_repository = true )

Update status of file.

Parameters
update_localif true, update last-modified timestamp of local file
update_repositoryif true, update last-modified timestamp of repository file

Definition at line 1373 of file file.cpp.

1374{
1375 struct stat buf;
1376
1377 if (update_local == true && p_is_on_disk == true) {
1378
1379 if (stat(p_full_name.c_str(), &buf) == 0) {
1380 p_last_modified = buf.st_mtime;
1381 }
1382 }
1383
1384 if (update_repository == true /*&& get_repository() == UserRepository*/) {
1385 std::string full_repository_name = make_repository_name();
1386
1387 if (!full_repository_name.empty() && stat(full_repository_name.c_str(), &buf) == 0) {
1388 p_repository_last_modified = buf.st_mtime;
1389 }
1390 }
1391}
std::string make_repository_name() const
Definition file.cpp:1361

◆ write()

void dunedaq::oks::OksFile::write ( OksXmlOutputStream & xmls)
private

Definition at line 773 of file file.cpp.

774{
775 const static std::string __data("data");
776 const static std::string __schema("schema");
777
778 try {
779 const char __oks_data[] = "oks-data";
780 const char __oks_schema[] = "oks-schema";
781
782 const char* id(__oks_data);
783 long id_len(sizeof(__oks_data) - 1);
784 const char* dtd(xml_data_file_dtd);
785 long dtd_len(sizeof(xml_data_file_dtd) - 1);
786
787 if (p_oks_format != __data) {
788 if (p_oks_format == __schema) {
789 id = __oks_schema;
790 id_len = sizeof(__oks_schema) - 1;
792 dtd_len = sizeof(xml_schema_file_dtd) - 1;
793 } else {
794 throw std::runtime_error("bad oks format");
795 }
796 }
797
798 {
799 const char __hdr_start[] = "\n\n<!-- ";
800 const char __hdr_end[] = " version 2.2 -->\n\n\n";
801
802 std::string header(xml_file_header, sizeof(xml_file_header) - 1);
803 header.append(__hdr_start, sizeof(__hdr_start) - 1);
804 header.append(id, id_len);
805 header.append(__hdr_end, sizeof(__hdr_end) - 1);
806 header.append(dtd, dtd_len);
807
808 xmls.put_raw(header.c_str(), header.size());
809 xmls.put_raw('\n');
810 xmls.put_raw('\n');
811 }
812
813 xmls.put_start_tag(id, id_len);
814
815 xmls.put_raw('>');
816 xmls.put_raw('\n');
817 xmls.put_raw('\n');
818
819 // "creation-time" may not be filled
820
821 std::string created_c_str;
822 if (!p_creation_time.is_not_a_date_time()) {
823 created_c_str = boost::posix_time::to_iso_string(p_creation_time);
824 }
825
826 // get last-modified information
827
828 if (p_repository_name.empty()) {
829 p_last_modification_time = boost::posix_time::second_clock::universal_time();
832 }
833
834 std::string last_modified_c_str = boost::posix_time::to_iso_string(p_last_modification_time);
835
836 xmls.put_start_tag(xml_info_tag, sizeof(xml_info_tag) - 1);
837 xmls.put_attribute("name", sizeof("name") - 1, p_logical_name.c_str());
838 xmls.put_attribute("type", sizeof("type") - 1, p_type.c_str());
839 xmls.put_attribute("num-of-items", sizeof("num-of-items") - 1, p_number_of_items);
840 xmls.put_attribute("oks-format", sizeof("oks-format") - 1, p_oks_format.c_str());
841 xmls.put_attribute("oks-version", sizeof("oks-version") - 1, OksKernel::GetVersion());
842 xmls.put_attribute("created-by", sizeof("created-by") - 1, p_created_by.c_str());
843 xmls.put_attribute("created-on", sizeof("created-on") - 1, p_created_on.c_str());
844 if (!created_c_str.empty())
845 xmls.put_attribute("creation-time", sizeof("creation-time") - 1, created_c_str.c_str());
846 if (p_repository_name.empty()) {
847 xmls.put_attribute("last-modified-by", sizeof("last-modified-by") - 1, p_last_modified_by.c_str());
848 xmls.put_attribute("last-modified-on", sizeof("last-modified-on") - 1, p_last_modified_on.c_str());
849 xmls.put_attribute("last-modification-time", sizeof("last-modification-time") - 1, last_modified_c_str.c_str());
850 }
851 xmls.put_end_tag();
852
853 if (!p_list_of_include_files.empty()) {
854 xmls.put_raw('\n');
855 xmls.put_start_tag(xml_include_tag, sizeof(xml_include_tag) - 1);
856
857 xmls.put_raw('>');
858 xmls.put_raw('\n');
859
860 for (const auto& i : p_list_of_include_files) {
861 xmls.put_raw(' ');
862 xmls.put_start_tag(xml_file_tag, sizeof(xml_file_tag) - 1);
863 xmls.put_attribute("path", sizeof("path") - 1, i.c_str());
864 xmls.put_end_tag();
865 }
866
867 xmls.put_last_tag(xml_include_tag, sizeof(xml_include_tag) - 1);
868 xmls.put_raw('\n');
869 }
870
871 if (!p_comments.empty()) {
872 xmls.put_start_tag(xml_comments_tag, sizeof(xml_comments_tag) - 1);
873
874 xmls.put_raw('>');
875 xmls.put_raw('\n');
876
877 for (const auto& i : p_comments) {
878 xmls.put_raw(' ');
879 xmls.put_start_tag(xml_comment_tag, sizeof(xml_comment_tag) - 1);
880 xmls.put_attribute("creation-time", sizeof("creation-time") - 1, i.first.c_str());
881 xmls.put_attribute("created-by", sizeof("created-by") - 1, i.second->p_created_by.c_str());
882 xmls.put_attribute("created-on", sizeof("created-on") - 1, i.second->p_created_on.c_str());
883 xmls.put_attribute("author", sizeof("author") - 1, i.second->p_author.c_str());
884 xmls.put_attribute("text", sizeof("text") - 1, i.second->p_text.c_str());
885 xmls.put_end_tag();
886 }
887
888 xmls.put_last_tag(xml_comments_tag, sizeof(xml_comments_tag) - 1);
889 xmls.put_raw('\n');
890 }
891
892 xmls.put_raw('\n');
893 } catch (std::exception& ex) {
894 throw oks::FailedSave("oks-file", p_full_name, ex.what());
895 }
896
897 p_is_on_disk = true;
898}
static const char xml_schema_file_dtd[]
Definition file.hpp:750
static const char xml_data_file_dtd[]
Definition file.hpp:751
static const char xml_file_header[]
Definition file.hpp:749
static const char * GetVersion()
Get OKS version. The method returns string containing CVS tag and date of OKS build.
Definition kernel.cpp:274

◆ OksClass

friend class OksClass
friend

Definition at line 358 of file file.hpp.

◆ OksKernel

friend class OksKernel
friend

Definition at line 357 of file file.hpp.

◆ OksLoadObjectsJob

friend struct OksLoadObjectsJob
friend

Definition at line 360 of file file.hpp.

◆ OksObject

friend class OksObject
friend

Definition at line 359 of file file.hpp.

Member Data Documentation

◆ p_comments

std::map<std::string, oks::Comment*> dunedaq::oks::OksFile::p_comments
private

Definition at line 744 of file file.hpp.

◆ p_created_by

std::string dunedaq::oks::OksFile::p_created_by
private

Definition at line 730 of file file.hpp.

◆ p_created_on

std::string dunedaq::oks::OksFile::p_created_on
private

Definition at line 732 of file file.hpp.

◆ p_creation_time

boost::posix_time::ptime dunedaq::oks::OksFile::p_creation_time
private

Definition at line 731 of file file.hpp.

◆ p_full_name

std::string dunedaq::oks::OksFile::p_full_name
private

Definition at line 723 of file file.hpp.

◆ p_included_by

const OksFile* dunedaq::oks::OksFile::p_included_by
private

Definition at line 746 of file file.hpp.

◆ p_is_on_disk

bool dunedaq::oks::OksFile::p_is_on_disk
private

Definition at line 745 of file file.hpp.

◆ p_is_read_only

bool dunedaq::oks::OksFile::p_is_read_only
private

Definition at line 740 of file file.hpp.

◆ p_is_updated

bool dunedaq::oks::OksFile::p_is_updated
private

Definition at line 739 of file file.hpp.

◆ p_kernel

OksKernel* dunedaq::oks::OksFile::p_kernel
private

Definition at line 747 of file file.hpp.

◆ p_last_modification_time

boost::posix_time::ptime dunedaq::oks::OksFile::p_last_modification_time
private

Definition at line 734 of file file.hpp.

◆ p_last_modified

time_t dunedaq::oks::OksFile::p_last_modified
private

Definition at line 742 of file file.hpp.

◆ p_last_modified_by

std::string dunedaq::oks::OksFile::p_last_modified_by
private

Definition at line 733 of file file.hpp.

◆ p_last_modified_on

std::string dunedaq::oks::OksFile::p_last_modified_on
private

Definition at line 735 of file file.hpp.

◆ p_list_of_include_files

std::list<std::string> dunedaq::oks::OksFile::p_list_of_include_files
private

Definition at line 741 of file file.hpp.

◆ p_lock

std::shared_ptr<boost::interprocess::file_lock> dunedaq::oks::OksFile::p_lock
private

Definition at line 737 of file file.hpp.

◆ p_lock_file_name

std::string dunedaq::oks::OksFile::p_lock_file_name
private

Definition at line 738 of file file.hpp.

◆ p_logical_name

std::string dunedaq::oks::OksFile::p_logical_name
private

Definition at line 725 of file file.hpp.

◆ p_nolock_mode

bool dunedaq::oks::OksFile::p_nolock_mode = false
staticprivate

Definition at line 720 of file file.hpp.

◆ p_number_of_items

long dunedaq::oks::OksFile::p_number_of_items
private

Definition at line 728 of file file.hpp.

◆ p_oks_format

std::string dunedaq::oks::OksFile::p_oks_format
private

Definition at line 727 of file file.hpp.

◆ p_open_mode

Mode dunedaq::oks::OksFile::p_open_mode
private

Definition at line 736 of file file.hpp.

◆ p_repository_last_modified

time_t dunedaq::oks::OksFile::p_repository_last_modified
private

Definition at line 743 of file file.hpp.

◆ p_repository_name

std::string dunedaq::oks::OksFile::p_repository_name
private

Definition at line 724 of file file.hpp.

◆ p_short_name

std::string dunedaq::oks::OksFile::p_short_name
private

Definition at line 722 of file file.hpp.

◆ p_size

long dunedaq::oks::OksFile::p_size
private

Definition at line 729 of file file.hpp.

◆ p_type

std::string dunedaq::oks::OksFile::p_type
private

Definition at line 726 of file file.hpp.

◆ xml_comment_tag

const char dunedaq::oks::OksFile::xml_comment_tag = "comment"
staticprivate

Definition at line 756 of file file.hpp.

◆ xml_comments_tag

const char dunedaq::oks::OksFile::xml_comments_tag = "comments"
staticprivate

Definition at line 755 of file file.hpp.

◆ xml_data_file_dtd

const char dunedaq::oks::OksFile::xml_data_file_dtd
staticprivate

Definition at line 751 of file file.hpp.

◆ xml_file_header

const char dunedaq::oks::OksFile::xml_file_header = "<?xml version=\"1.0\" encoding=\"ASCII\"?>"
staticprivate

Definition at line 749 of file file.hpp.

◆ xml_file_tag

const char dunedaq::oks::OksFile::xml_file_tag = "file"
staticprivate

Definition at line 754 of file file.hpp.

◆ xml_include_tag

const char dunedaq::oks::OksFile::xml_include_tag = "include"
staticprivate

Definition at line 753 of file file.hpp.

◆ xml_info_tag

const char dunedaq::oks::OksFile::xml_info_tag = "info"
staticprivate

Definition at line 752 of file file.hpp.

◆ xml_schema_file_dtd

const char dunedaq::oks::OksFile::xml_schema_file_dtd
staticprivate

Definition at line 750 of file file.hpp.


The documentation for this class was generated from the following files: