Line data Source code
1 : /** \file logMap.cpp
2 : * \brief Declares and defines the logMap class and related classes.
3 : * \author Jared R. Males (jaredmales@gmail.com)
4 : *
5 : * \ingroup logger_files
6 : *
7 : */
8 :
9 : #include "logMap.hpp"
10 :
11 : #include <sys/stat.h>
12 : #include <fcntl.h>
13 : #include <unistd.h>
14 :
15 : #include <filesystem>
16 :
17 : #include <mx/mxException.hpp>
18 :
19 : #include "../common/exceptions.hpp"
20 :
21 : using namespace flatlogs;
22 :
23 : namespace MagAOX
24 : {
25 : namespace logger
26 : {
27 :
28 0 : int logInMemory::loadFile( file::stdFileName<verboseT> const &lfn )
29 : {
30 0 : int fd = open( lfn.fullName().c_str(), O_RDONLY );
31 :
32 0 : off_t fsz = mx::ioutils::fileSize( fd );
33 :
34 0 : std::vector<char> memory( fsz );
35 :
36 0 : ssize_t nrd = read( fd, memory.data(), memory.size() );
37 :
38 0 : close( fd );
39 :
40 0 : if( nrd != fsz )
41 : {
42 0 : std::cerr << __FILE__ << " " << __LINE__ << " logInMemory::loadFile(" << lfn.fullName()
43 0 : << ") did not read all bytes\n";
44 0 : return -1;
45 : }
46 :
47 0 : flatlogs::timespecX startTime = logHeader::timespec( memory.data() );
48 :
49 0 : size_t st = 0;
50 0 : size_t ed = logHeader::totalSize( memory.data() );
51 0 : st = ed;
52 :
53 0 : while( st < memory.size() )
54 : {
55 0 : ed = logHeader::totalSize( memory.data() + st );
56 0 : st = st + ed;
57 : }
58 :
59 0 : if( st != memory.size() )
60 : {
61 0 : std::cerr << __FILE__ << " " << __LINE__ << " Possibly corrupt logfile.\n";
62 0 : return -1;
63 : }
64 :
65 0 : st -= ed;
66 :
67 0 : flatlogs::timespecX endTime = logHeader::timespec( memory.data() + st );
68 :
69 0 : if( m_memory.size() == 0 )
70 : {
71 0 : m_memory.swap( memory );
72 0 : m_startTime = startTime;
73 0 : m_endTime = endTime;
74 :
75 0 : std::string timestamp;
76 0 : timespec ts{ endTime.time_s, endTime.time_ns };
77 0 : mx::sys::timeStamp( timestamp, ts );
78 :
79 : #ifdef DEBUG
80 : std::cerr << __FILE__ << " " << __LINE__ << " loading: " << lfn.fullName() << " " << timestamp << "\n";
81 : #endif
82 :
83 0 : return 0;
84 0 : }
85 :
86 0 : if( startTime < m_startTime )
87 : {
88 :
89 0 : if( endTime >= m_startTime )
90 : {
91 0 : std::cerr << __FILE__ << " " << __LINE__ << " overlapping log files!\n";
92 0 : return -1;
93 : }
94 :
95 0 : m_memory.insert( m_memory.begin(), memory.begin(), memory.end() );
96 0 : m_startTime = startTime;
97 0 : std::cerr << __FILE__ << " " << __LINE__ << " added before!\n";
98 0 : return 0;
99 : }
100 :
101 0 : if( startTime > m_endTime )
102 : {
103 : #ifdef DEBUG
104 : std::cerr << __FILE__ << " " << __LINE__ << " gonna append\n";
105 : #endif
106 :
107 : // m_memory.insert( m_memory.end(), memory.begin(), memory.end() );
108 0 : m_endTime = endTime;
109 :
110 : #ifdef DEBUG
111 : std::cerr << __FILE__ << " " << __LINE__ << " added after!\n";
112 : #endif
113 :
114 0 : return 0;
115 : }
116 :
117 0 : std::cerr << __FILE__ << " " << __LINE__ << " Need to implement insert in the middle!\n";
118 0 : std::cerr << m_startTime.time_s << " " << m_startTime.time_ns << "\n";
119 0 : std::cerr << startTime.time_s << " " << startTime.time_ns << "\n";
120 :
121 0 : return -1;
122 0 : }
123 :
124 :
125 : template class logMap<XWC_DEFAULT_VERBOSITY>;
126 :
127 : } // namespace logger
128 : } // namespace MagAOX
|