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 *, SortByNameMap
 
typedef std::unordered_set< OksFile *, oks::hash_file_ptr, oks::equal_file_ptrSet
 
typedef std::unordered_map< OksFile *, Set, oks::hash_file_ptr, oks::equal_file_ptrIMap
 

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 OksFileget_parent () const
 Return parent including given file.
 
OksFilecheck_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 *)
 
OksFileoperator= (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::Commentget_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 OksFilep_included_by
 
OksKernelp_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 340 of file file.hpp.

Member Typedef Documentation

◆ IMap

Definition at line 370 of file file.hpp.

◆ Map

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

Definition at line 367 of file file.hpp.

◆ Set

Definition at line 369 of file file.hpp.

Member Enumeration Documentation

◆ FileStatus

Enumerator
FileNotModified 
FileModified 
FileWasNotSaved 
FileRemoved 

Definition at line 354 of file file.hpp.

◆ Mode

Enumerator
ReadOnly 
ReadWrite 

Definition at line 349 of file file.hpp.

349 {
350 ReadOnly,
352 };

Constructor & Destructor Documentation

◆ ~OksFile()

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

Definition at line 290 of file file.cpp.

291{
293}
void clear_comments() noexcept
Definition file.cpp:280

◆ 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 252 of file file.cpp.

252 :
253 p_short_name (s),
254 p_full_name (s),
255 p_logical_name (ln),
256 p_type (ft),
257 p_oks_format (ff),
259 p_size (0),
261 p_creation_time (boost::posix_time::second_clock::universal_time()),
264 p_lock (),
265 p_is_updated (false),
266 p_is_read_only (true),
267 p_last_modified (0),
269 p_is_on_disk (false),
270 p_included_by (0),
271 p_kernel (k)
272{
277}
std::shared_ptr< boost::interprocess::file_lock > p_lock
Definition file.hpp:754
std::string p_oks_format
Definition file.hpp:744
time_t p_repository_last_modified
Definition file.hpp:760
std::string p_created_by
Definition file.hpp:747
std::string p_short_name
Definition file.hpp:739
boost::posix_time::ptime p_last_modification_time
Definition file.hpp:751
boost::posix_time::ptime p_creation_time
Definition file.hpp:748
std::string p_logical_name
Definition file.hpp:742
std::string p_last_modified_by
Definition file.hpp:750
OksKernel * p_kernel
Definition file.hpp:764
std::string p_full_name
Definition file.hpp:740
std::string p_type
Definition file.hpp:743
void create_lock_name()
Definition file.cpp:954
void check_repository()
Definition file.cpp:915
const OksFile * p_included_by
Definition file.hpp:763
std::string p_last_modified_on
Definition file.hpp:752
std::string p_created_on
Definition file.hpp:749
static std::string & get_host_name()
Get hostname of given process.
Definition kernel.cpp:429
static std::string & get_user_name()
Get username of given process.
Definition kernel.cpp:468

◆ OksFile() [2/3]

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

Definition at line 788 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 344 of file file.cpp.

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

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 669 of file file.cpp.

670{
671 try {
672 lock();
673 }
674 catch(oks::exception& ex) {
675 throw oks::FailedAddComment(*this, ex);
676 }
677
678 boost::posix_time::ptime now = boost::posix_time::second_clock::universal_time();
679 std::string creation_time = boost::posix_time::to_iso_string(now);
680
681 try {
682 std::unique_ptr<oks::Comment> comment( new oks::Comment(text, author) );
683 comment->validate();
684
685 oks::Comment *& x(p_comments[creation_time]);
686
687 if(x == 0)
688 {
689 x = comment.release();
690 }
691 else
692 {
693 x->p_text += "\n-----\n";
694 x->p_text.append(text);
695 }
696 }
697 catch(std::exception & ex) {
698 throw oks::FailedAddComment(*this, ex.what());
699 }
700
701 p_is_updated = true;
702}
void lock()
Lock OKS file.
Definition file.cpp:1012
static int64_t now()

◆ 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 1194 of file file.cpp.

1195{
1196 // check if the file was already included
1197 if(find_include_file(s) != p_list_of_include_files.end()) { return; }
1198
1199 // lock file
1200 try {
1201 lock();
1202 }
1203 catch(oks::exception& ex) {
1204 throw oks::FailedAddInclude(*this, s, ex);
1205 }
1206
1207 // try to find path to include and load it
1208 try {
1209 std::string path = p_kernel->get_file_path(s, this);
1210 p_kernel->k_load_file(path, true, this, 0);
1211 }
1212 catch(std::exception& ex) {
1213 throw oks::FailedAddInclude(*this, s, ex.what());
1214 }
1215
1216 // add include and mark file as updated
1217 p_list_of_include_files.push_back(s);
1218 p_is_updated = true;
1219}
std::list< std::string >::iterator find_include_file(const std::string &)
Definition file.cpp:1172
OksFile * k_load_file(const std::string &name, bool bind, const OksFile *parent, OksPipeline *pipeline)
Definition kernel.cpp:1798
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:1660

◆ 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 1183 of file file.cpp.

1184{
1185 if(p_included_by == 0 && parent_h != 0) {
1186 p_included_by = parent_h;
1187 }
1188
1189 return this;
1190}

◆ check_repository()

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

Definition at line 915 of file file.cpp.

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

◆ clear_comments()

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

Definition at line 280 of file file.cpp.

281{
282 for(std::map<std::string, oks::Comment *>::iterator i = p_comments.begin(); i != p_comments.end(); ++i) {
283 delete i->second;
284 }
285
286 p_comments.clear();
287}

◆ 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 1514 of file file.cpp.

1515{
1516 std::ifstream f1(file1_name);
1517 std::ifstream f2(file2_name);
1518
1519 if (!f1)
1520 {
1521 throw oks::FileCompareError(file1_name, file2_name, "cannot open file");
1522 }
1523
1524 if (!f2)
1525 {
1526 throw oks::FileCompareError(file2_name, file1_name, "cannot open file");
1527 }
1528
1529 std::string line1;
1530 std::string line2;
1531
1532 while (true)
1533 {
1534 if (f1.eof() && f2.eof())
1535 {
1536 return true;
1537 }
1538
1539 std::getline(f1, line1);
1540 std::getline(f2, line2);
1541
1542 if ((line1 != line2) && (is_not_info(line1) || is_not_info(line2)))
1543 {
1544 return false;
1545 }
1546 }
1547
1548 return true;
1549}
static bool is_not_info(const std::string &line)
Definition file.cpp:1499

◆ 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 708 of file file.hpp.

708{ 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:1514

◆ create_lock_name()

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

Definition at line 954 of file file.cpp.

955{
957
958 std::string::size_type idx = p_lock_file_name.find_last_of('/');
959 if(idx == std::string::npos) p_lock_file_name = "./";
960 else p_lock_file_name.erase(idx+1);
961
962 const char _prefix_str[] = ".oks-lock-";
963 p_lock_file_name.append(_prefix_str, sizeof(_prefix_str)-1);
964
965 idx = p_full_name.find_last_of('/');
966 std::string::size_type len(p_full_name.size());
967 if(idx == std::string::npos) {
968 idx = 0;
969 }
970 else {
971 idx++;
972 len -= idx;
973 }
974
975 p_lock_file_name.append(p_full_name, idx, len);
976 p_lock_file_name.append(".txt");
977}
std::string p_lock_file_name
Definition file.hpp:755

◆ find_include_file()

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

Definition at line 1172 of file file.cpp.

1173{
1174 std::list<std::string>::iterator i = p_list_of_include_files.begin();
1175
1176 for(;i != p_list_of_include_files.end(); ++i) {if(*i == s) break;}
1177
1178 return i;
1179}

◆ 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 1466 of file file.cpp.

1467{
1468 const OksFile::Map & schema_files = kernel->schema_files();
1469 const OksFile::Map & data_files = kernel->data_files();
1470
1471 for(std::list<std::string>::iterator i = p_list_of_include_files.begin(); i != p_list_of_include_files.end(); ++i) {
1472 std::string s = kernel->get_file_path(*i, this);
1473 if(s.size()) {
1474 OksFile::Map::const_iterator j = data_files.find(&s);
1475 if(j != data_files.end()) {
1476 if(out.find(j->second) != out.end()) { continue; }
1477 out.insert(j->second);
1478 }
1479 else {
1480 j = schema_files.find(&s);
1481 if(j != schema_files.end()) {
1482 if(out.find(j->second) != out.end()) { continue; }
1483 out.insert(j->second);
1484 }
1485 else {
1486 continue;
1487 }
1488 }
1489
1490 j->second->get_all_include_files(kernel, out);
1491 }
1492 }
1493}
std::map< const std::string *, OksFile *, SortByName > Map
Definition file.hpp:367
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 705 of file file.cpp.

706{
707 std::map<std::string, oks::Comment *>::const_iterator i = p_comments.find(creation_time);
708 return (i == p_comments.end()) ? 0: i->second;
709}

◆ get_comments()

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

Get all comments of file.

Definition at line 489 of file file.hpp.

489{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 583 of file file.hpp.

583{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 588 of file file.hpp.

588{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 523 of file file.hpp.

523{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 640 of file file.hpp.

◆ 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 603 of file file.hpp.

◆ 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 598 of file file.hpp.

598{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 608 of file file.hpp.

608{return p_last_modified_on;}

◆ get_lock_file()

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

Definition at line 565 of file file.hpp.

565{ init_lock_name(); return p_lock_file_name; }
void init_lock_name() const
Definition file.hpp:798

◆ 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 984 of file file.cpp.

985{
987
988 lock_file_contents.clear();
989
990 const char * lock_name = p_lock_file_name.c_str();
991 struct stat buf;
992
993 if(stat(lock_name, &buf) == 0) {
994 std::ifstream f(lock_name);
995
996 if(f.good()) {
997 std::getline(f, lock_file_contents);
998 return true;
999 }
1000 else {
1001 lock_file_contents = "unknown [cannot read lock file \'";
1002 lock_file_contents += p_lock_file_name;
1003 lock_file_contents += "\']";
1004 return true;
1005 }
1006 }
1007
1008 return false;
1009}

◆ get_logical_name()

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

Definition at line 566 of file file.hpp.

566{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 573 of file file.hpp.

573{return p_number_of_items;}

◆ get_oks_format()

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

Definition at line 568 of file file.hpp.

568{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 717 of file file.hpp.

717{ 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 550 of file file.hpp.

550{return p_repository_name;}

◆ get_short_file_name()

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

Definition at line 518 of file file.hpp.

518{return p_short_name;}

◆ get_size()

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

Return length of file in bytes.

Definition at line 578 of file file.hpp.

578{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 1413 of file file.cpp.

1414{
1415 if(p_is_on_disk == false) {
1416 return FileWasNotSaved;
1417 }
1418 else {
1419 struct stat buf;
1420
1421 if(stat(p_full_name.c_str(), &buf) != 0) {
1422 return FileRemoved;
1423 }
1424
1425 if(buf.st_mtime != p_last_modified) {
1426 return FileModified;
1427 }
1428
1429// if(get_repository() == UserRepository) {
1430// std::string full_repository_name = make_repository_name();
1431//
1432// if(!full_repository_name.empty()) {
1433// if(stat(full_repository_name.c_str(), &buf) != 0) {
1434// return FileRepositoryRemoved;
1435// }
1436//
1437// if(buf.st_mtime != p_repository_last_modified) {
1438// return FileRepositoryModified;
1439// }
1440// }
1441// }
1442 }
1443
1444 return FileNotModified;
1445}

◆ get_type()

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

Definition at line 567 of file file.hpp.

567{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 560 of file file.hpp.

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

◆ init_lock_name()

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

Definition at line 798 of file file.hpp.

798{ if(p_lock_file_name.empty()) const_cast<OksFile*>(this)->create_lock_name(); }
OksFile(const std::string &, const std::string &, const std::string &, const std::string &, OksKernel *)
Definition file.cpp:252

◆ 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 616 of file file.hpp.

616{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 632 of file file.hpp.

632{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 909 of file file.cpp.

910{
911 return (!p_kernel->get_user_repository_root().empty());
912}

◆ 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 624 of file file.hpp.

624{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 1012 of file file.cpp.

1013{
1014 if (p_nolock_mode) {
1015 // Nasty hack to allow code generation on the fly without locking
1016 // file. Just return without locking!
1017 return;
1018 }
1019
1021
1022 if (p_lock != nullptr)
1023 {
1024 return;
1025 }
1026
1027
1028 // check that the file is not read-only
1029
1030 {
1031 struct stat buf;
1032
1033 if (stat(p_full_name.c_str(), &buf) == 0)
1034 {
1035 if (OksKernel::check_read_only(this) == true)
1036 {
1037 throw oks::FileLockError(*this, true, "file is read-only");
1038 }
1039 }
1040 }
1041
1042
1043 // check lock and report problem if it exists and cannot be reset
1044
1045 {
1046 std::string lock_file_contents;
1047
1048 if (get_lock_string(lock_file_contents))
1049 {
1050 try
1051 {
1052 boost::interprocess::file_lock lock(p_lock_file_name.c_str());
1053
1054 if (lock.try_lock() == false)
1055 {
1056 std::ostringstream text;
1057 text << "file is already locked by \"" << lock_file_contents << '\"';
1058 throw oks::FileLockError(*this, true, text.str());
1059 }
1060 else
1061 {
1062 try
1063 {
1064 lock.unlock();
1065 }
1066 catch (const boost::interprocess::interprocess_exception& ex)
1067 {
1068 std::ostringstream text;
1069 text << "boost::interprocess::unlock() failed: \"" << ex.what() << '\"';
1070 throw oks::FileLockError(*this, false, text.str());
1071 }
1072
1073 if (!p_kernel->get_silence_mode())
1074 {
1075 Oks::warning_msg("OksFile::lock()") << "Remove obsolete lock of file \'" << p_full_name << "\' created by \n\"" << lock_file_contents << "\"\n";
1076 }
1077
1078 if (unlink(p_lock_file_name.c_str()) != 0)
1079 {
1080 std::ostringstream text;
1081 text << "failed to remove lock file \'" << p_lock_file_name << "\':\n" << oks::strerror(errno);
1082 throw oks::FileLockError(*this, false, text.str());
1083 }
1084 }
1085 }
1086 catch (const boost::interprocess::interprocess_exception& ex)
1087 {
1088 std::ostringstream text;
1089 text << "boost::interprocess::try_lock() failed: \"" << ex.what() << '\"';
1090 throw oks::FileLockError(*this, false, text.str());
1091 }
1092 }
1093 }
1094
1095
1096 // write lock file
1097
1098 {
1099 std::ofstream f(p_lock_file_name.c_str());
1100
1101 if (!f.good())
1102 {
1103 std::ostringstream text;
1104 text << "failed to create lock file \'" << p_lock_file_name << '\'';
1105 throw oks::FileLockError(*this, true, text.str());
1106 }
1107
1108 try
1109 {
1110 boost::posix_time::ptime now(boost::posix_time::second_clock::universal_time());
1111 f << "process " << getpid() << " on " << OksKernel::get_host_name() << " started by " << OksKernel::get_user_name() << " at " << boost::posix_time::to_simple_string(now) << " (UTC)" << std::endl;
1112 f.flush();
1113 f.close();
1114 }
1115 catch (std::exception& ex)
1116 {
1117 std::ostringstream text;
1118 text << "failed to write lock file \'" << p_lock_file_name << "\': " << ex.what();
1119 throw oks::FileLockError(*this, true, text.str());
1120 }
1121 }
1122
1123
1124 try
1125 {
1126 p_lock.reset(new boost::interprocess::file_lock(p_lock_file_name.c_str()));
1127
1128 if (p_lock->try_lock() == false)
1129 {
1130 throw std::runtime_error("file is locked by another process");
1131 }
1132 }
1133 catch (const std::exception& ex)
1134 {
1135 std::ostringstream text;
1136 text << "boost::interprocess::try_lock() failed: \"" << ex.what() << '\"';
1137 p_lock.reset();
1138 throw oks::FileLockError(*this, false, text.str());
1139 }
1140}
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:984
static bool p_nolock_mode
Definition file.hpp:737
static bool check_read_only(OksFile *f)
Check if the OKS file is read-only.
Definition kernel.cpp:1532
const std::string strerror(int error)
Convert C error number to string.
Definition kernel.cpp:114

◆ make_repository_name()

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

Definition at line 1378 of file file.cpp.

1379{
1380 std::string name;
1381
1382 if(!OksKernel::get_repository_root().empty()) {
1384 }
1385
1386 return name;
1387}
const std::string & get_repository_name() const
Get name of file inside repository.
Definition file.hpp:550
static const std::string & get_repository_root()
Get OKS repository root.
Definition kernel.cpp:304

◆ 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 712 of file file.cpp.

713{
714 if(oks::Comment * comment = get_comment(creation_time)) {
715 try {
716 lock();
717 }
718 catch(oks::exception& ex) {
719 throw oks::FailedChangeComment(*this, creation_time, ex);
720 }
721
722 std::string saved_author(comment->p_author);
723 std::string saved_text(comment->p_text);
724
725 comment->p_author = author;
726 comment->p_text = text;
727
728 try {
729 comment->validate();
730 }
731 catch(std::exception& ex) {
732 comment->p_author = saved_author;
733 comment->p_text = saved_text;
734 throw oks::FailedChangeComment(*this, creation_time, ex.what());
735 }
736
737 p_is_updated = true;
738 }
739 else {
740 throw oks::FailedChangeComment(*this, creation_time, "cannot find comment");
741 }
742}
oks::Comment * get_comment(const std::string &creation_time) noexcept
Definition file.cpp:705

◆ operator=()

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

Definition at line 296 of file file.cpp.

297{
298 if (&f != this)
299 {
302
303 p_short_name = f.p_short_name;
304 p_full_name = f.p_full_name;
305// p_repository = f.p_repository;
306 p_repository_name = f.p_repository_name;
307 p_logical_name = f.p_logical_name;
308 p_type = f.p_type;
309 p_oks_format = f.p_oks_format;
310 p_number_of_items = f.p_number_of_items;
311 p_size = f.p_size;
312 p_created_by = f.p_created_by;
313 p_creation_time = f.p_creation_time;
314 p_created_on = f.p_created_on;
315 p_last_modified_by = f.p_last_modified_by;
316 p_last_modification_time = f.p_last_modification_time;
317 p_last_modified_on = f.p_last_modified_on;
318 p_open_mode = f.p_open_mode;
319 p_is_updated = f.p_is_updated;
320 p_lock = f.p_lock;
321 p_is_read_only = f.p_is_read_only;
322 p_lock_file_name = f.p_lock_file_name;
323 p_list_of_include_files = f.p_list_of_include_files;
324 p_last_modified = f.p_last_modified;
325 p_repository_last_modified = f.p_repository_last_modified;
326 p_is_on_disk = f.p_is_on_disk;
327 p_included_by = f.p_included_by;
328 p_kernel = f.p_kernel;
329
330 for (const auto& i : f.p_comments)
331 {
332 p_comments[i.first] = new oks::Comment(*i.second);
333 }
334 }
335
336 return *this;
337}

◆ 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 746 of file file.cpp.

747{
748 if(oks::Comment * comment = get_comment(creation_time)) {
749 try {
750 lock();
751 }
752 catch(oks::exception& ex) {
753 throw oks::FailedRemoveComment(*this, creation_time, ex);
754 }
755
756 delete comment;
757 p_comments.erase(creation_time);
758 p_is_updated = true;
759 }
760 else {
761 throw oks::FailedRemoveComment(*this, creation_time, "cannot find comment");
762 }
763}

◆ 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 1223 of file file.cpp.

1224{
1225 // search included file
1226 std::list<std::string>::iterator i = find_include_file(s);
1227
1228 // check if the file was included
1229 if(i == p_list_of_include_files.end()) {
1230 throw oks::FailedRemoveInclude(*this, s, "there is no such include file");
1231 }
1232
1233 // lock file
1234 try {
1235 lock();
1236 }
1237 catch(oks::exception& ex) {
1238 throw oks::FailedRemoveInclude(*this, s, ex);
1239 }
1240
1241 // remove include and mark file as updated
1242 p_list_of_include_files.erase(i);
1243 p_is_updated = true;
1244
1245 // close file, if it is not referenced by others
1247}
void k_close_dangling_includes()
Close files which lost their parent.
Definition kernel.cpp:1961

◆ rename() [1/2]

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

Definition at line 1458 of file file.cpp.

1459{
1460 p_full_name = full_name;
1463}
void update_status_of_file(bool update_local=true, bool update_repository=true)
Update status of file.
Definition file.cpp:1391

◆ rename() [2/2]

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

Definition at line 1449 of file file.cpp.

1450{
1451 p_short_name = short_name;
1452 p_full_name = full_name;
1455}

◆ 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 1251 of file file.cpp.

1252{
1253 if(old_s == new_s) return;
1254
1255 std::list<std::string>::iterator i1 = find_include_file(old_s);
1256 std::list<std::string>::iterator i2 = find_include_file(new_s);
1257
1258 if(i1 == p_list_of_include_files.end()) {
1259 throw oks::FailedRenameInclude(*this, old_s, new_s, "there is no such include file");
1260 }
1261
1262 if(i2 != p_list_of_include_files.end()) {
1263 throw oks::FailedRenameInclude(*this, old_s, new_s, "file with new name is already included");
1264 }
1265
1266 try {
1267 lock();
1268 }
1269 catch(oks::exception& ex) {
1270 throw oks::FailedRenameInclude(*this, old_s, new_s, ex);
1271 }
1272
1273 (*i1) = new_s;
1274 p_is_updated = true;
1275}

◆ 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 1279 of file file.cpp.

1280{
1281 if(s == p_logical_name) return;
1282
1283 try {
1284 lock();
1285 }
1286 catch(oks::exception& ex) {
1287 throw oks::FileChangeError(*this, "set logical name", ex);
1288 }
1289
1290 p_logical_name = s;
1291 p_is_updated = true;
1292}

◆ set_nolock_mode()

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

Definition at line 385 of file file.hpp.

385{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 1296 of file file.cpp.

1297{
1298 if(s == p_type) return;
1299
1300 try {
1301 lock();
1302 }
1303 catch(oks::exception& ex) {
1304 throw oks::FileChangeError(*this, "set type", ex);
1305 }
1306
1307 p_type = s;
1308 p_is_updated = true;
1309}

◆ set_updated()

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

Definition at line 793 of file file.hpp.

793{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 1143 of file file.cpp.

1144{
1145 if (p_lock == nullptr)
1146 return;
1147
1148 try
1149 {
1150 p_lock->unlock();
1151 }
1152 catch (const boost::interprocess::interprocess_exception& ex)
1153 {
1154 std::ostringstream text;
1155 text << "boost::interprocess::unlock() failed: \"" << ex.what() << '\"';
1156 p_lock.reset();
1157 throw oks::FileLockError(*this, false, text.str());
1158 }
1159
1160 p_lock.reset();
1161
1162 if (unlink(p_lock_file_name.c_str()) != 0 && errno != ENOENT)
1163 {
1164 std::ostringstream text;
1165 text << "failed to remove lock file \'" << p_lock_file_name << "\':\n" << oks::strerror(errno);
1166 throw oks::FileLockError(*this, false, text.str());
1167 }
1168}

◆ 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 1391 of file file.cpp.

1392{
1393 struct stat buf;
1394
1395 if(update_local == true && p_is_on_disk == true) {
1396
1397 if(stat(p_full_name.c_str(), &buf) == 0) {
1398 p_last_modified = buf.st_mtime;
1399 }
1400 }
1401
1402 if(update_repository == true /*&& get_repository() == UserRepository*/) {
1403 std::string full_repository_name = make_repository_name();
1404
1405 if(!full_repository_name.empty() && stat(full_repository_name.c_str(), &buf) == 0) {
1406 p_repository_last_modified = buf.st_mtime;
1407 }
1408 }
1409}
std::string make_repository_name() const
Definition file.cpp:1378

◆ write()

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

Definition at line 767 of file file.cpp.

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

Friends And Related Symbol Documentation

◆ OksClass

friend class OksClass
friend

Definition at line 343 of file file.hpp.

◆ OksKernel

friend class OksKernel
friend

Definition at line 342 of file file.hpp.

◆ OksLoadObjectsJob

friend struct OksLoadObjectsJob
friend

Definition at line 345 of file file.hpp.

◆ OksObject

friend class OksObject
friend

Definition at line 344 of file file.hpp.

Member Data Documentation

◆ p_comments

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

Definition at line 761 of file file.hpp.

◆ p_created_by

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

Definition at line 747 of file file.hpp.

◆ p_created_on

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

Definition at line 749 of file file.hpp.

◆ p_creation_time

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

Definition at line 748 of file file.hpp.

◆ p_full_name

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

Definition at line 740 of file file.hpp.

◆ p_included_by

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

Definition at line 763 of file file.hpp.

◆ p_is_on_disk

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

Definition at line 762 of file file.hpp.

◆ p_is_read_only

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

Definition at line 757 of file file.hpp.

◆ p_is_updated

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

Definition at line 756 of file file.hpp.

◆ p_kernel

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

Definition at line 764 of file file.hpp.

◆ p_last_modification_time

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

Definition at line 751 of file file.hpp.

◆ p_last_modified

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

Definition at line 759 of file file.hpp.

◆ p_last_modified_by

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

Definition at line 750 of file file.hpp.

◆ p_last_modified_on

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

Definition at line 752 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 758 of file file.hpp.

◆ p_lock

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

Definition at line 754 of file file.hpp.

◆ p_lock_file_name

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

Definition at line 755 of file file.hpp.

◆ p_logical_name

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

Definition at line 742 of file file.hpp.

◆ p_nolock_mode

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

Definition at line 737 of file file.hpp.

◆ p_number_of_items

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

Definition at line 745 of file file.hpp.

◆ p_oks_format

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

Definition at line 744 of file file.hpp.

◆ p_open_mode

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

Definition at line 753 of file file.hpp.

◆ p_repository_last_modified

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

Definition at line 760 of file file.hpp.

◆ p_repository_name

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

Definition at line 741 of file file.hpp.

◆ p_short_name

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

Definition at line 739 of file file.hpp.

◆ p_size

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

Definition at line 746 of file file.hpp.

◆ p_type

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

Definition at line 743 of file file.hpp.

◆ xml_comment_tag

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

Definition at line 773 of file file.hpp.

◆ xml_comments_tag

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

Definition at line 772 of file file.hpp.

◆ xml_data_file_dtd

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

Definition at line 768 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 766 of file file.hpp.

◆ xml_file_tag

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

Definition at line 771 of file file.hpp.

◆ xml_include_tag

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

Definition at line 770 of file file.hpp.

◆ xml_info_tag

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

Definition at line 769 of file file.hpp.

◆ xml_schema_file_dtd

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

Definition at line 767 of file file.hpp.


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