Joedb 10.3.0
The Journal-Only Embedded Database
Loading...
Searching...
No Matches
File_Parser.cpp
Go to the documentation of this file.
6
7#ifdef JOEDB_HAS_SSH
9#endif
10
11#ifdef JOEDB_HAS_CURL
13#endif
14
15#ifdef JOEDB_HAS_BROTLI
18#endif
19
20#include <cstring>
21#include <iostream>
22
23namespace joedb
24{
25 static constexpr size_t open_modes = open_mode_strings.size() -
26 (File::lockable ? 0 : 2);
27
28 ////////////////////////////////////////////////////////////////////////////
29 void File_Parser::print_help(std::ostream &out) const
30 ////////////////////////////////////////////////////////////////////////////
31 {
32 out << "<file> is one of:\n";
33
34 if (default_only)
35 {
36 out << " [file] <file_name>\n";
37 }
38 else
39 {
40 out << " [interpreted] [file] [--<open_mode>] <file_name>\n";
41 out << " <open_mode> is one of:\n";
42
43 for (size_t i = 0; i < open_modes; i++)
44 {
45 const Open_Mode mode = Open_Mode(i);
46 if (!include_shared && mode == Open_Mode::shared_write)
47 continue;
48 out << " " << open_mode_strings[i];
49 if (mode == default_open_mode)
50 out << '*';
51 out << '\n';
52 }
53
54 out << " memory\n";
55 }
56
57#ifdef JOEDB_HAS_SSH
58 out << " sftp [--port p] [--verbosity v] <user> <host> <path>\n";
59#endif
60
61#ifdef JOEDB_HAS_CURL
62 out << " curl [--verbose] <URL>\n";
63#endif
64
65#ifdef JOEDB_HAS_BROTLI
66 out << " brotli ";
67 if (!default_only)
68 out << "[--read] ";
69 out << "<file_name>\n";
70#endif
71
72#if defined(JOEDB_HAS_ASIO) || defined(JOEDB_HAS_SSH) || defined(JOEDB_HAS_WEBSOCKETS)
73 if (include_server)
74 out << " server (client must use a connection to a server)\n";
75#endif
76 }
77
78 ////////////////////////////////////////////////////////////////////////////
80 ////////////////////////////////////////////////////////////////////////////
81 {
82 if (arguments.peek("memory"))
83 file.reset(new Memory_File());
84 else if (arguments.peek("server"))
85 file.reset();
86#ifdef JOEDB_HAS_SSH
87 else if (arguments.peek("sftp"))
88 {
89 const auto port = arguments.next_option<unsigned>("port", "p", 22);
90 const auto verbosity = arguments.next_option<int>("verbosity", "v", 0);
91 const std::string_view user = arguments.get_next();
92 const std::string_view host = arguments.get_next();
93 const std::string_view path = arguments.get_next();
94
95 if (arguments.missing())
96 return nullptr;
97
98 logger.log("creating ssh session");
99 ssh_session.emplace(user.data(), host.data(), port, verbosity);
100
101 logger.log("initializing sftp");
102 sftp.emplace(*ssh_session);
103
104 logger.log("opening file");
105 file.reset(new SFTP_File(*sftp, path.data()));
106 }
107#endif
108#ifdef JOEDB_HAS_CURL
109 else if (arguments.peek("curl"))
110 {
111 const bool verbose = arguments.peek("--verbose");
112 const std::string_view url = arguments.get_next();
113
114 if (arguments.missing())
115 return nullptr;
116
117 file.reset(new CURL_File(url.data(), verbose));
118 }
119#endif
120#ifdef JOEDB_HAS_BROTLI
121 else if (arguments.peek("brotli"))
122 {
123 bool readonly = false;
124
125 if (default_only)
126 readonly = default_open_mode == Open_Mode::read_existing;
127 else if (arguments.peek("--read"))
128 readonly = true;
129
130 const std::string_view file_name = arguments.get_next();
131
132 if (arguments.missing())
133 return nullptr;
134
135 logger.log("opening brotli file");
136
137 if (readonly)
138 file.reset(new Readonly_Brotli_File(file_name.data()));
139 else
140 file.reset(new Brotli_File(file_name.data()));
141 }
142#endif
143 else
144 {
145 const bool interpreted = arguments.peek("interpreted");
146 arguments.peek("file");
147
148 Open_Mode open_mode = default_open_mode;
149
150 if (!default_only)
151 {
152 for (size_t i = 0; i < open_modes; i++)
153 {
154 const Open_Mode mode = Open_Mode(i);
155 if (!include_shared && mode == Open_Mode::shared_write)
156 continue;
157 const std::string option = std::string("--") + open_mode_strings[i];
158 if (arguments.peek(option.data()))
159 open_mode = mode;
160 }
161 }
162
163 const std::string_view file_name = arguments.get_next();
164
165 if (arguments.missing())
166 return nullptr;
167
168 logger.log
169 (
170 "opening local file, open_mode = " +
171 std::string(open_mode_strings[size_t(open_mode)])
172 );
173
174 if (interpreted)
175 file.reset(new Interpreted_File(file_name.data(), open_mode));
176 else
177 file.reset(new File(file_name.data(), open_mode));
178 }
179
180 logger.log("file is opened");
181 return file.get();
182 }
183}
Class for conveniently parsing command-line arguments.
Definition Arguments.h:19
bool peek(const char *s)
bool missing() const
Definition Arguments.h:147
std::string_view get_next()
T next_option(const char *name, const char *description, T default_value)
Definition Arguments.h:117
Abstract_File * parse(joedb::Logger &log, Arguments &arguments)
void print_help(std::ostream &out) const
virtual void log(const std::string &message) noexcept
Definition Logger.h:12
Open_Mode
Definition Open_Mode.h:8
@ shared_write
like write_existing_or_create_new, but does not lock the file, and does not fail if locked
@ read_existing
fails if does not exist
const std::array< const char *, size_t(Open_Mode::mode_count)> open_mode_strings
JOEDB_FILE File
Definition File.h:23