csvzall 0.4.0
CSV command-line tool and emerging C++ library
Loading...
Searching...
No Matches
commands.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <csv.hpp>
4#include <istream>
5#include <memory>
6#include <ostream>
7#include <sstream>
8#include <string>
9#include <vector>
10
11#include "../../charts/chart_spec.hpp"
12#include "../../pipeline_types.hpp"
13#include "view.hpp"
14
15// Forward declarations for PostgreSQL types
17struct ConnectionConfig;
18}
19
21
22// ---------------------------------------------------------------------------
23// CsvInputCommand
24// Base for any command that consumes a CSV input stream.
25// Owns the CSVReader, header list, options, logger, and stats.
26// Does NOT own an output stream — that is the concern of subclasses.
27// ---------------------------------------------------------------------------
29public:
30 virtual ~CsvInputCommand() = default;
31
32 int execute();
33
34protected:
35 CsvInputCommand(std::istream& input,
38
39 virtual int run() = 0;
40
41 virtual csv::CSVFormat make_format() const;
42
43 csv::CSVReader& reader() { return *reader_; }
44 const std::vector<std::string>& headers() const { return headers_; }
45 const RunOptions& options() const { return options_; }
46 const LoggerCallbacks& logger() const { return logger_; }
47 RunStats& stats() { return stats_; }
48 int reset_reader();
49
50private:
51 int init_reader();
52
53 std::istream& input_;
54 const RunOptions& options_;
55 const LoggerCallbacks& logger_;
56 RunStats& stats_;
57
58 std::unique_ptr<std::istringstream> buffered_input_;
59 std::unique_ptr<csv::CSVReader> reader_;
60 std::vector<std::string> headers_;
61};
62
63// ---------------------------------------------------------------------------
64// CsvTransformCommand
65// Extends CsvInputCommand for commands that write CSV to an output stream.
66// ---------------------------------------------------------------------------
68protected:
69 CsvTransformCommand(std::istream& input, std::ostream& output,
72
73 std::ostream& output() { return output_; }
74
75private:
76 std::ostream& output_;
77};
78
79
80int RunDerive(const std::string& assignment, std::istream& input, std::ostream& output,
81 const RunOptions& options, const LoggerCallbacks& logger, RunStats& stats);
82
83int RunFilter(const std::string& expression, std::istream& input, std::ostream& output,
84 const RunOptions& options, const LoggerCallbacks& logger, RunStats& stats);
85
86int RunSummarize(const std::string& group_by_column, const std::string& max_column,
87 const std::vector<std::string>& show_columns,
88 std::istream& input, std::ostream& output,
89 const RunOptions& options, const LoggerCallbacks& logger, RunStats& stats);
90
91int RunTimeseries(const std::string& x_column, const std::string& y_column,
92 const std::string& series_column, const std::string& reduce,
93 const std::string& format,
94 std::istream& input, std::ostream& output,
95 const RunOptions& options, const LoggerCallbacks& logger, RunStats& stats);
96
97int RunJsonExtract(const std::string& input_path,
98 const std::string& mapping_path,
99 std::ostream& output,
100 const LoggerCallbacks& logger,
101 RunStats& stats);
102
103int RunMax(const std::string& column,
104 std::istream& input,
105 std::ostream& output,
106 const RunOptions& options,
107 const LoggerCallbacks& logger,
108 RunStats& stats);
109
110int RunMin(const std::string& column,
111 std::istream& input,
112 std::ostream& output,
113 const RunOptions& options,
114 const LoggerCallbacks& logger,
115 RunStats& stats);
116
117int RunAppend(const std::string& existing_path,
118 const std::string& incoming_path,
119 bool in_place,
120 std::ostream& output,
121 const LoggerCallbacks& logger,
122 RunStats& stats);
123
124int RunMerge(const std::string& existing_path,
125 const std::string& incoming_path,
126 const std::string& key_column,
127 bool in_place,
128 std::ostream& output,
129 const LoggerCallbacks& logger,
130 RunStats& stats);
131
132int RunView(const std::string& input_path,
133 std::ostream& output,
134 const RunOptions& options,
135 const LoggerCallbacks& logger,
136 RunStats& stats,
137 int requested_port,
138 bool open_browser,
139 bool serve_once,
140 bool startup_json);
141
142#ifdef CSVZALL_HAVE_SVGPLOT
143int RunHeatmap(const std::string& date_column,
144 const std::string& value_column,
145 const std::string& label_column,
146 const std::string& start_date,
147 const std::string& end_date,
148 const std::string& title,
149 std::istream& input,
150 std::ostream& output,
151 const RunOptions& options,
152 const LoggerCallbacks& logger,
153 RunStats& stats);
154int RunHeatmap(const common::HeatmapSpec& spec,
155 std::istream& input,
156 std::ostream& output,
157 const RunOptions& options,
158 const LoggerCallbacks& logger,
159 RunStats& stats);
160int RunBar(const ::csvzall::charts::BarSpec& spec,
161 std::istream& input,
162 std::ostream& output,
163 const RunOptions& options,
164 const LoggerCallbacks& logger,
165 RunStats& stats);
166int RunLine(const ::csvzall::charts::LineSpec& spec,
167 std::istream& input,
168 std::ostream& output,
169 const RunOptions& options,
170 const LoggerCallbacks& logger,
171 RunStats& stats);
172int RunChart(const common::ChartSpec& spec,
173 const RunOptions& options,
174 const LoggerCallbacks& logger,
175 RunStats& stats);
176int ValidateChart(const common::ChartSpec& spec,
177 const RunOptions& options,
178 const LoggerCallbacks& logger,
179 RunStats& stats);
180int RunCharts(const std::string& config_path,
181 const std::string& chart_id,
182 bool validate_only,
183 const RunOptions& options,
184 const LoggerCallbacks& logger,
185 RunStats& stats);
186#endif
187
188// Export a CSV to a SQLite database file.
189// input_path — original file path (used to derive dest_path when dest_path is empty).
190// dest_path — explicit destination; if empty, derived from input_path (.csv -> .db).
191// table_name — name of the table to create inside the database.
192int RunSqlExport(const std::string& input_path,
193 const std::string& dest_path,
194 const std::string& table_name,
195 std::istream& input,
196 const RunOptions& options,
197 const LoggerCallbacks& logger,
198 RunStats& stats);
199
200// Run an arbitrary SQL query against a CSV loaded into a SQLite table.
201// The result set is streamed as CSV to output.
202int RunSqlQueryCsv(const std::string& sql_query,
203 const std::string& table_name,
204 const std::string& format,
205 std::istream& input,
206 std::ostream& output,
207 const RunOptions& options,
208 const LoggerCallbacks& logger,
209 RunStats& stats);
210
212 kCsv,
213 kSqlite,
214 kUnknown,
215};
216
217// Detect SQL query input type from path extension.
218// CSV extensions: .csv, .txt, .gz, .zip
219// SQLite extensions: .db, .sqlite, .sqlite3
220// Returns kUnknown for stdin ("-") or unrecognized extensions.
222
223// Run an arbitrary SQL query against an existing SQLite database file.
224// The result set is streamed as CSV to output.
225int RunSqlQueryDb(const std::string& sql_query,
226 const std::string& db_path,
227 const std::string& format,
228 std::ostream& output,
229 const LoggerCallbacks& logger,
230 RunStats& stats);
231
232// Heuristic detector for likely integer division in SQL expressions.
233// Ignores quoted strings and SQL comments.
234bool ShouldWarnIntegerDivision(const std::string& sql_query);
235
236#ifdef CSVZALL_HAVE_POSTGRESQL
237// Export a CSV file to a PostgreSQL database with automatic schema inference.
238// Scans first 1000 rows to infer column types (INTEGER, BIGINT, NUMERIC, TIMESTAMP, TEXT).
239// if_exists_mode: "error" (default), "drop", or "append"
240// Skips rows that fail type validation (warning logged).
241int RunPostgresExport(std::istream& input,
242 const RunOptions& options,
243 const LoggerCallbacks& logger,
244 RunStats& stats,
245 const ::csvzall::postgres::ConnectionConfig& pg_config,
246 const std::string& table_name,
247 const std::string& if_exists_mode);
248
249// Infer a CSV file's PostgreSQL schema without creating a table or loading rows.
250int RunPostgresInfer(std::istream& input,
251 const RunOptions& options,
252 const LoggerCallbacks& logger,
253 RunStats& stats,
254 const std::string& table_name);
255#endif
256
257} // namespace csvzall::pipeline::commands
RunStats & stats()
Definition commands.hpp:47
const RunOptions & options() const
Definition commands.hpp:45
const std::vector< std::string > & headers() const
Definition commands.hpp:44
const LoggerCallbacks & logger() const
Definition commands.hpp:46
csv::CSVReader & reader()
Definition commands.hpp:43
int reset_reader()
Definition CsvInputCommand.cpp:63
virtual csv::CSVFormat make_format() const
Definition CsvInputCommand.cpp:14
int execute()
Definition CsvInputCommand.cpp:111
std::ostream & output()
Definition commands.hpp:73
common::JsonPath path
Definition json_extract.cpp:348
Definition append.cpp:19
int RunMax(const std::string &column, std::istream &input, std::ostream &output, const RunOptions &options, const LoggerCallbacks &logger, RunStats &stats)
Definition max.cpp:103
int RunView(const std::string &input_path, std::ostream &output, const RunOptions &options, const LoggerCallbacks &logger, RunStats &stats, int requested_port, bool open_browser, bool serve_once, bool startup_json)
Definition view.cpp:44
int RunSqlExport(const std::string &input_path, const std::string &dest_path, const std::string &table_name, std::istream &input, const RunOptions &options, const LoggerCallbacks &logger, RunStats &stats)
Definition sql_export.cpp:115
int RunChart(const charts::ChartSpec &spec, const RunOptions &options, const LoggerCallbacks &logger, RunStats &stats)
Definition chart.cpp:75
int RunMin(const std::string &column, std::istream &input, std::ostream &output, const RunOptions &options, const LoggerCallbacks &logger, RunStats &stats)
Definition max.cpp:113
int RunDerive(const std::string &assignment, std::istream &input, std::ostream &output, const RunOptions &options, const LoggerCallbacks &logger, RunStats &stats)
Definition derive.cpp:80
int RunTimeseries(const std::string &x_column, const std::string &y_column, const std::string &series_column, const std::string &reduce, const std::string &format, std::istream &input, std::ostream &output, const RunOptions &options, const LoggerCallbacks &logger, RunStats &stats)
Definition timeseries.cpp:169
int RunMerge(const std::string &existing_path, const std::string &incoming_path, const std::string &key_column, bool in_place, std::ostream &output, const LoggerCallbacks &logger, RunStats &stats)
Definition append.cpp:219
int RunPostgresInfer(std::istream &input, const RunOptions &options, const LoggerCallbacks &logger, RunStats &stats, const std::string &table_name)
Definition postgres_export.cpp:123
int RunHeatmap(const std::string &date_column, const std::string &value_column, const std::string &label_column, const std::string &start_date, const std::string &end_date, const std::string &title, std::istream &input, std::ostream &output, const RunOptions &options, const LoggerCallbacks &logger, RunStats &stats)
Definition heatmap.cpp:59
SqlQueryInputKind
Definition commands.hpp:211
int RunSummarize(const std::string &group_by_column, const std::string &max_column, const std::vector< std::string > &show_columns, std::istream &input, std::ostream &output, const RunOptions &options, const LoggerCallbacks &logger, RunStats &stats)
Definition summarize.cpp:123
int RunJsonExtract(const std::string &input_path, const std::string &mapping_path, std::ostream &output, const LoggerCallbacks &logger, RunStats &stats)
Definition json_extract.cpp:506
SqlQueryInputKind DetectSqlQueryInputKind(const std::string &path)
Definition sql_query.cpp:314
int RunLine(const ::csvzall::charts::LineSpec &spec, std::istream &input, std::ostream &output, const RunOptions &options, const LoggerCallbacks &logger, RunStats &stats)
int ValidateChart(const charts::ChartSpec &spec, const RunOptions &options, const LoggerCallbacks &logger, RunStats &stats)
Definition chart.cpp:129
int RunCharts(const std::string &config_path, const std::string &chart_id, bool validate_only, const RunOptions &options, const LoggerCallbacks &logger, RunStats &stats)
Definition charts.cpp:10
int RunAppend(const std::string &existing_path, const std::string &incoming_path, bool in_place, std::ostream &output, const LoggerCallbacks &logger, RunStats &stats)
Definition append.cpp:167
int RunFilter(const std::string &expression, std::istream &input, std::ostream &output, const RunOptions &options, const LoggerCallbacks &logger, RunStats &stats)
Definition filter.cpp:59
int RunPostgresExport(std::istream &input, const RunOptions &options, const LoggerCallbacks &logger, RunStats &stats, const ::csvzall::postgres::ConnectionConfig &pg_config, const std::string &table_name, const std::string &if_exists_mode)
int RunSqlQueryCsv(const std::string &sql_query, const std::string &table_name, const std::string &format, std::istream &input, std::ostream &output, const RunOptions &options, const LoggerCallbacks &logger, RunStats &stats)
Definition sql_query.cpp:302
bool ShouldWarnIntegerDivision(const std::string &sql_query)
Definition sql_query.cpp:367
int RunSqlQueryDb(const std::string &sql_query, const std::string &db_path, const std::string &format, std::ostream &output, const LoggerCallbacks &logger, RunStats &stats)
Definition sql_query.cpp:332
int RunBar(const charts::BarSpec &spec, std::istream &input, std::ostream &output, const RunOptions &options, const LoggerCallbacks &logger, RunStats &stats)
Definition bar.cpp:59
SqlQueryInputKind
Definition transform_pipeline.hpp:122
Definition commands.hpp:16
Definition pipeline_types.hpp:66
Definition pipeline_types.hpp:16
Definition pipeline_types.hpp:61
Definition postgres_connection.hpp:12