GnuCash c935c2f+
Loading...
Searching...
No Matches
Public Member Functions | Data Fields
GncPriceImport Class Reference

The actual PriceImport class It's intended to use in the following sequence of actions: More...

#include <gnc-import-price.hpp>

Public Member Functions

 GncPriceImport (GncImpFileFormat format=GncImpFileFormat::UNKNOWN)
 Constructor for GncPriceImport.
 
 ~GncPriceImport ()
 Destructor for GncPriceImport.
 
void file_format (GncImpFileFormat format)
 Sets the file format for the file to import, which may cause the file to be reloaded as well if the previously set file format was different and a filename was already set.
 
GncImpFileFormat file_format ()
 
void over_write (bool over)
 
bool over_write ()
 
void from_commodity (gnc_commodity *from_commodity)
 Sets a from commodity.
 
gnc_commodity * from_commodity ()
 
void to_currency (gnc_commodity *to_currency)
 Sets a to currency.
 
gnc_commodity * to_currency ()
 
void currency_format (int currency_format)
 
int currency_format ()
 
void date_format (int date_format)
 
int date_format ()
 
void encoding (const std::string &encoding)
 Converts raw file data using a new encoding.
 
std::string encoding ()
 
void update_skipped_lines (std::optional< uint32_t > start, std::optional< uint32_t > end, std::optional< bool > alt, std::optional< bool > errors)
 
uint32_t skip_start_lines ()
 
uint32_t skip_end_lines ()
 
bool skip_alt_lines ()
 
bool skip_err_lines ()
 
void separators (std::string separators)
 
std::string separators ()
 
void enable_escape (bool enable)
 
bool enable_escape ()
 
void settings (const CsvPriceImpSettings &settings)
 
bool save_settings ()
 
void settings_name (std::string name)
 
std::string settings_name ()
 
void load_file (const std::string &filename)
 Loads a file into a GncPriceImport.
 
void tokenize (bool guessColTypes)
 Splits a file into cells.
 
std::string verify ()
 
void create_prices ()
 This function will attempt to convert all tokenized lines into prices using the column types the user has set.
 
bool check_for_column_type (GncPricePropType type)
 
void set_column_type_price (uint32_t position, GncPricePropType type, bool force=false)
 
std::vector< GncPricePropType > column_types_price ()
 

Data Fields

std::unique_ptr< GncTokenizerm_tokenizer
 Will handle file loading/encoding conversion/splitting into fields.
 
std::vector< parse_line_tm_parsed_lines
 source file parsed into a two-dimensional array of strings.
 
int m_prices_added
 
int m_prices_duplicated
 
int m_prices_replaced
 

Detailed Description

The actual PriceImport class It's intended to use in the following sequence of actions:

Definition at line 82 of file gnc-import-price.hpp.

Constructor & Destructor Documentation

◆ GncPriceImport()

GncPriceImport::GncPriceImport ( GncImpFileFormat  format = GncImpFileFormat::UNKNOWN)

Constructor for GncPriceImport.

Definition at line 65 of file gnc-import-price.cpp.

66{
67 /* All of the data pointers are initially NULL. This is so that, if
68 * gnc_csv_parse_data_free is called before all of the data is
69 * initialized, only the data that needs to be freed is freed. */
70 m_skip_errors = false;
71 file_format(m_settings.m_file_format = format);
72}
void file_format(GncImpFileFormat format)
Sets the file format for the file to import, which may cause the file to be reloaded as well if the p...

◆ ~GncPriceImport()

GncPriceImport::~GncPriceImport ( )

Destructor for GncPriceImport.

Definition at line 76 of file gnc-import-price.cpp.

77{
78}

Member Function Documentation

◆ check_for_column_type()

bool GncPriceImport::check_for_column_type ( GncPricePropType  type)

Definition at line 674 of file gnc-import-price.cpp.

675{
676 return (std::find (m_settings.m_column_types_price.begin(),
677 m_settings.m_column_types_price.end(), type)
678 != m_settings.m_column_types_price.end());
679}

◆ column_types_price()

std::vector< GncPricePropType > GncPriceImport::column_types_price ( )

Definition at line 794 of file gnc-import-price.cpp.

795{
796 return m_settings.m_column_types_price;
797}

◆ create_prices()

void GncPriceImport::create_prices ( )

This function will attempt to convert all tokenized lines into prices using the column types the user has set.

Creates a list of prices from parsed data.

The parsed data will first be validated. If any errors are found in lines that are marked for processing (ie not marked to skip) this function will throw an error.

Parameters
skip_errorstrue skip over lines with errors
Exceptions
throwsstd::invalid_argument if data validation or processing fails.

Definition at line 646 of file gnc-import-price.cpp.

647{
648 /* Start with verifying the current data. */
649 auto verify_result = verify();
650 if (!verify_result.empty())
651 throw std::invalid_argument (verify_result);
652
653 m_prices_added = 0;
654 m_prices_duplicated = 0;
655 m_prices_replaced = 0;
656
657 /* Iterate over all parsed lines */
658 for (auto parsed_lines_it = m_parsed_lines.begin();
659 parsed_lines_it != m_parsed_lines.end();
660 ++parsed_lines_it)
661 {
662 /* Skip current line if the user specified so */
663 if ((std::get<PL_SKIP>(*parsed_lines_it)))
664 continue;
665
666 /* Should not throw anymore, otherwise verify needs revision */
667 create_price (parsed_lines_it);
668 }
669 PINFO("Number of lines is %d, added %d, duplicated %d, replaced %d",
670 (int)m_parsed_lines.size(), m_prices_added, m_prices_duplicated, m_prices_replaced);
671}
std::vector< parse_line_t > m_parsed_lines
source file parsed into a two-dimensional array of strings.
#define PINFO(format, args...)
Print an informational note.
Definition qoflog.h:256

◆ currency_format() [1/2]

int GncPriceImport::currency_format ( )

Definition at line 217 of file gnc-import-price.cpp.

217{ return m_settings.m_currency_format; }

◆ currency_format() [2/2]

void GncPriceImport::currency_format ( int  currency_format)

Definition at line 209 of file gnc-import-price.cpp.

210{
211 m_settings.m_currency_format = currency_format;
212
213 /* Reparse all currency related columns */
214 std::vector<GncPricePropType> commodities = { GncPricePropType::AMOUNT };
215 reset_formatted_column (commodities);
216}

◆ date_format() [1/2]

int GncPriceImport::date_format ( )

Definition at line 227 of file gnc-import-price.cpp.

227{ return m_settings.m_date_format; }

◆ date_format() [2/2]

void GncPriceImport::date_format ( int  date_format)

Definition at line 219 of file gnc-import-price.cpp.

220{
221 m_settings.m_date_format = date_format;
222
223 /* Reparse all date related columns */
224 std::vector<GncPricePropType> dates = { GncPricePropType::DATE };
225 reset_formatted_column (dates);
226}

◆ enable_escape() [1/2]

bool GncPriceImport::enable_escape ( )

Definition at line 301 of file gnc-import-price.cpp.

301{ return m_settings.m_enable_escape; }

◆ enable_escape() [2/2]

void GncPriceImport::enable_escape ( bool  enable)

Definition at line 293 of file gnc-import-price.cpp.

294{
295 if (file_format() != GncImpFileFormat::CSV)
296 return;
297 m_settings.m_enable_escape = enable;
298 auto csvtok = dynamic_cast<GncCsvTokenizer*>(m_tokenizer.get());
299 csvtok->set_enable_escape (enable);
300}
std::unique_ptr< GncTokenizer > m_tokenizer
Will handle file loading/encoding conversion/splitting into fields.

◆ encoding() [1/2]

std::string GncPriceImport::encoding ( )

Definition at line 251 of file gnc-import-price.cpp.

251{ return m_settings.m_encoding; }

◆ encoding() [2/2]

void GncPriceImport::encoding ( const std::string &  encoding)

Converts raw file data using a new encoding.

This function must be called after load_file only if load_file guessed the wrong encoding.

Parameters
encodingEncoding that data should be translated using

Definition at line 234 of file gnc-import-price.cpp.

235{
236 // TODO investigate if we can catch conversion errors and report them
237 if (m_tokenizer)
238 {
239 m_tokenizer->encoding(encoding); // May throw
240 try
241 {
242 tokenize(false);
243 }
244 catch (...)
245 { };
246 }
247
248 m_settings.m_encoding = encoding;
249}
void tokenize(bool guessColTypes)
Splits a file into cells.
void encoding(const std::string &encoding)
Converts raw file data using a new encoding.

◆ file_format() [1/2]

GncImpFileFormat GncPriceImport::file_format ( )

Definition at line 131 of file gnc-import-price.cpp.

132{
133 return m_settings.m_file_format;
134}

◆ file_format() [2/2]

void GncPriceImport::file_format ( GncImpFileFormat  format)

Sets the file format for the file to import, which may cause the file to be reloaded as well if the previously set file format was different and a filename was already set.

Parameters
formatthe new format to set
Exceptions
std::ifstream::failureif file reloading fails

Definition at line 87 of file gnc-import-price.cpp.

88{
89 if (m_tokenizer && m_settings.m_file_format == format)
90 return;
91
92 auto new_encoding = std::string("UTF-8");
93 auto new_imp_file = std::string();
94
95 // Recover common settings from old tokenizer
96 if (m_tokenizer)
97 {
98 new_encoding = m_tokenizer->encoding();
99 new_imp_file = m_tokenizer->current_file();
100 if (file_format() == GncImpFileFormat::FIXED_WIDTH)
101 {
102 auto fwtok = dynamic_cast<GncFwTokenizer*>(m_tokenizer.get());
103 if (!fwtok->get_columns().empty())
104 m_settings.m_column_widths = fwtok->get_columns();
105 }
106 }
107
108 m_settings.m_file_format = format;
109 m_tokenizer = gnc_tokenizer_factory(m_settings.m_file_format);
110
111 // Set up new tokenizer with common settings
112 // recovered from old tokenizer
113 m_tokenizer->encoding(new_encoding);
114 load_file(new_imp_file);
115
116 // Restore potentially previously set separators or column_widths
117 if (file_format() == GncImpFileFormat::CSV)
118 {
119 if (!m_settings.m_separators.empty())
120 separators (m_settings.m_separators);
121 enable_escape (m_settings.m_enable_escape);
122 }
123 else if ((file_format() == GncImpFileFormat::FIXED_WIDTH)
124 && !m_settings.m_column_widths.empty())
125 {
126 auto fwtok = dynamic_cast<GncFwTokenizer*>(m_tokenizer.get());
127 fwtok->columns (m_settings.m_column_widths);
128 }
129}
void load_file(const std::string &filename)
Loads a file into a GncPriceImport.

◆ from_commodity() [1/2]

gnc_commodity * GncPriceImport::from_commodity ( )

Definition at line 171 of file gnc-import-price.cpp.

171{ return m_settings.m_from_commodity; }

◆ from_commodity() [2/2]

void GncPriceImport::from_commodity ( gnc_commodity *  from_commodity)

Sets a from commodity.

This is the commodity all import data relates to. When a from commodity is set, there can't be any from columns selected in the import data.

Parameters
from_commoditypointer to a commodity or NULL.

Definition at line 147 of file gnc-import-price.cpp.

148{
149 m_settings.m_from_commodity = from_commodity;
150 if (m_settings.m_from_commodity)
151 {
152 auto col_type_sym = std::find (m_settings.m_column_types_price.begin(),
153 m_settings.m_column_types_price.end(), GncPricePropType::FROM_SYMBOL);
154
155 if (col_type_sym != m_settings.m_column_types_price.end())
156 set_column_type_price (col_type_sym -m_settings.m_column_types_price.begin(),
157 GncPricePropType::NONE);
158
159 auto col_type_name = std::find (m_settings.m_column_types_price.begin(),
160 m_settings.m_column_types_price.end(), GncPricePropType::FROM_NAMESPACE);
161
162 if (col_type_name != m_settings.m_column_types_price.end())
163 set_column_type_price (col_type_name -m_settings.m_column_types_price.begin(),
164 GncPricePropType::NONE);
165
166 // force a refresh of the to_currency if the from_commodity is changed
167 std::vector<GncPricePropType> commodities = { GncPricePropType::TO_CURRENCY };
168 reset_formatted_column (commodities);
169 }
170}
void from_commodity(gnc_commodity *from_commodity)
Sets a from commodity.

◆ load_file()

void GncPriceImport::load_file ( const std::string &  filename)

Loads a file into a GncPriceImport.

This is the first function that must be called after creating a new GncPriceImport. As long as this function didn't run successfully, the importer can't proceed.

Parameters
filenameName of the file that should be opened
Exceptions
maythrow std::ifstream::failure on any io error

Definition at line 361 of file gnc-import-price.cpp.

362{
363 /* Get the raw data first and handle an error if one occurs. */
364 try
365 {
366 m_tokenizer->load_file (filename);
367 return;
368 }
369 catch (std::ifstream::failure& ios_err)
370 {
371 // Just log the error and pass it on the call stack for proper handling
372 PWARN ("Error: %s", ios_err.what());
373 throw;
374 }
375}
#define PWARN(format, args...)
Log a warning.
Definition qoflog.h:250

◆ over_write() [1/2]

bool GncPriceImport::over_write ( )

Definition at line 140 of file gnc-import-price.cpp.

140{ return m_over_write; }

◆ over_write() [2/2]

void GncPriceImport::over_write ( bool  over)

Definition at line 136 of file gnc-import-price.cpp.

137{
138 m_over_write = over;
139}

◆ save_settings()

bool GncPriceImport::save_settings ( )

Definition at line 335 of file gnc-import-price.cpp.

336{
337 if (preset_is_reserved_name (m_settings.m_name))
338 return true;
339
340 /* separators are already copied to m_settings in the separators
341 * function above. However this is not the case for the column
342 * widths in fw mode, so do this now.
343 */
344 if (file_format() == GncImpFileFormat::FIXED_WIDTH)
345 {
346 auto fwtok = dynamic_cast<GncFwTokenizer*>(m_tokenizer.get());
347 m_settings.m_column_widths = fwtok->get_columns();
348 }
349 return m_settings.save();
350}
bool preset_is_reserved_name(const std::string &name)
Check whether name can be used as a preset name.
bool save(void)
Save the gathered widget properties to a key File.

◆ separators() [1/2]

std::string GncPriceImport::separators ( )

Definition at line 291 of file gnc-import-price.cpp.

291{ return m_settings.m_separators; }

◆ separators() [2/2]

void GncPriceImport::separators ( std::string  separators)

Definition at line 281 of file gnc-import-price.cpp.

282{
283 if (file_format() != GncImpFileFormat::CSV)
284 return;
285
286 m_settings.m_separators = separators;
287 auto csvtok = dynamic_cast<GncCsvTokenizer*>(m_tokenizer.get());
288 csvtok->set_separators (separators);
289
290}

◆ set_column_type_price()

void GncPriceImport::set_column_type_price ( uint32_t  position,
GncPricePropType  type,
bool  force = false 
)

Definition at line 731 of file gnc-import-price.cpp.

732{
733 if (position >= m_settings.m_column_types_price.size())
734 return;
735
736 auto old_type = m_settings.m_column_types_price[position];
737 if ((type == old_type) && !force)
738 return; /* Nothing to do */
739
740 // Column types should be unique, so remove any previous occurrence of the new type
741 std::replace(m_settings.m_column_types_price.begin(), m_settings.m_column_types_price.end(),
742 type, GncPricePropType::NONE);
743
744 m_settings.m_column_types_price.at (position) = type;
745
746 // If the user has set a 'from namespace' column, we can't have a 'commodity from' selected
747 if (type == GncPricePropType::FROM_NAMESPACE)
748 from_commodity (nullptr);
749
750 // If the user has set a 'from symbol' column, we can't have a 'commodity from' selected
751 if (type == GncPricePropType::FROM_SYMBOL)
752 from_commodity (nullptr);
753
754 // If the user has set a 'currency to' column, we can't have a 'currency to' selected
755 if (type == GncPricePropType::TO_CURRENCY)
756 to_currency (nullptr);
757
758 /* Update the preparsed data */
759 for (auto parsed_lines_it = m_parsed_lines.begin();
760 parsed_lines_it != m_parsed_lines.end();
761 ++parsed_lines_it)
762 {
763 /* Reset date and currency formats for each price props object
764 * to ensure column updates use the most recent one
765 */
766 std::get<PL_PREPRICE>(*parsed_lines_it)->set_date_format (m_settings.m_date_format);
767 std::get<PL_PREPRICE>(*parsed_lines_it)->set_currency_format (m_settings.m_currency_format);
768
769 uint32_t row = parsed_lines_it - m_parsed_lines.begin();
770
771 /* If the column type actually changed, first reset the property
772 * represented by the old column type
773 */
774 if (old_type != type)
775 {
776 auto old_col = std::get<PL_INPUT>(*parsed_lines_it).size(); // Deliberately out of bounds to trigger a reset!
777 if ((old_type > GncPricePropType::NONE)
778 && (old_type <= GncPricePropType::PRICE_PROPS))
779 update_price_props (row, old_col, old_type);
780 }
781 /* Then set the property represented by the new column type */
782 if ((type > GncPricePropType::NONE)
783 && (type <= GncPricePropType::PRICE_PROPS))
784 update_price_props (row, position, type);
785
786 /* Report errors if there are any */
787 auto price_errors = std::get<PL_PREPRICE>(*parsed_lines_it)->errors();
788 std::get<PL_ERROR>(*parsed_lines_it) =
789 price_errors +
790 (price_errors.empty() ? std::string() : "\n");
791 }
792}
void to_currency(gnc_commodity *to_currency)
Sets a to currency.

◆ settings()

void GncPriceImport::settings ( const CsvPriceImpSettings settings)

Definition at line 303 of file gnc-import-price.cpp.

304{
305 /* First apply file format as this may recreate the tokenizer */
306 file_format (settings.m_file_format);
307 /* Only then apply the other settings */
308 m_settings = settings;
309 from_commodity (m_settings.m_from_commodity);
310 to_currency (m_settings.m_to_currency);
311 encoding (m_settings.m_encoding);
312
313 if (file_format() == GncImpFileFormat::CSV)
314 separators (m_settings.m_separators);
315 else if (file_format() == GncImpFileFormat::FIXED_WIDTH)
316 {
317 auto fwtok = dynamic_cast<GncFwTokenizer*>(m_tokenizer.get());
318 fwtok->columns (m_settings.m_column_widths);
319 }
320 try
321 {
322 tokenize(false);
323 }
324 catch (...)
325 { };
326
327 /* Tokenizing will clear column types, reset them here
328 * based on the loaded settings.
329 */
330 std::copy_n (settings.m_column_types_price.begin(),
331 std::min (m_settings.m_column_types_price.size(), settings.m_column_types_price.size()),
332 m_settings.m_column_types_price.begin());
333}

◆ settings_name() [1/2]

std::string GncPriceImport::settings_name ( )

Definition at line 353 of file gnc-import-price.cpp.

353{ return m_settings.m_name; }

◆ settings_name() [2/2]

void GncPriceImport::settings_name ( std::string  name)

Definition at line 352 of file gnc-import-price.cpp.

352{ m_settings.m_name = name; }

◆ skip_alt_lines()

bool GncPriceImport::skip_alt_lines ( )

Definition at line 278 of file gnc-import-price.cpp.

278{ return m_settings.m_skip_alt_lines; }

◆ skip_end_lines()

uint32_t GncPriceImport::skip_end_lines ( )

Definition at line 277 of file gnc-import-price.cpp.

277{ return m_settings.m_skip_end_lines; }

◆ skip_err_lines()

bool GncPriceImport::skip_err_lines ( )

Definition at line 279 of file gnc-import-price.cpp.

279{ return m_skip_errors; }

◆ skip_start_lines()

uint32_t GncPriceImport::skip_start_lines ( )

Definition at line 276 of file gnc-import-price.cpp.

276{ return m_settings.m_skip_start_lines; }

◆ to_currency() [1/2]

gnc_commodity * GncPriceImport::to_currency ( )

Definition at line 196 of file gnc-import-price.cpp.

196{ return m_settings.m_to_currency; }

◆ to_currency() [2/2]

void GncPriceImport::to_currency ( gnc_commodity *  to_currency)

Sets a to currency.

This is the to currency all import data relates to. When a to currency is set, there can't be any to currency columns selected in the import data.

Parameters
to_currencypointer to a commodity or NULL.

Definition at line 178 of file gnc-import-price.cpp.

179{
180 m_settings.m_to_currency = to_currency;
181 if (m_settings.m_to_currency)
182 {
183 auto col_type_currency = std::find (m_settings.m_column_types_price.begin(),
184 m_settings.m_column_types_price.end(), GncPricePropType::TO_CURRENCY);
185
186 if (col_type_currency != m_settings.m_column_types_price.end())
187 set_column_type_price (col_type_currency -m_settings.m_column_types_price.begin(),
188 GncPricePropType::NONE);
189
190 // force a refresh of the from_commodity if the to_currency is changed
191 // either namespace or symbol will be sufice
192 std::vector<GncPricePropType> commodities = { GncPricePropType::FROM_SYMBOL };
193 reset_formatted_column (commodities);
194 }
195}

◆ tokenize()

void GncPriceImport::tokenize ( bool  guessColTypes)

Splits a file into cells.

This requires having an encoding that works (see GncPriceImport::convert_encoding). Tokenizing related options should be set to the user's selections before calling this function. Notes: - this function must be called with guessColTypes set to true once before calling it with guessColTypes set to false.

  • if guessColTypes is true, all the column types will be set GncPricePropType::NONE right now as real guessing isn't implemented yet
    Parameters
    guessColTypestrue to guess what the types of columns are based on the cell contents
    Exceptions
    std::range_errorif tokenizing failed

Definition at line 388 of file gnc-import-price.cpp.

389{
390 if (!m_tokenizer)
391 return;
392
393 uint32_t max_cols = 0;
394 m_tokenizer->tokenize();
395 m_parsed_lines.clear();
396 for (auto tokenized_line : m_tokenizer->get_tokens())
397 {
398 auto length = tokenized_line.size();
399 if (length > 0)
400 m_parsed_lines.push_back (std::make_tuple (tokenized_line, std::string(),
401 std::make_shared<GncImportPrice>(date_format(), currency_format()),
402 false));
403 if (length > max_cols)
404 max_cols = length;
405 }
406
407 /* If it failed, generate an error. */
408 if (m_parsed_lines.size() == 0)
409 {
410 throw (std::range_error ("Tokenizing failed."));
411 return;
412 }
413
414 m_settings.m_column_types_price.resize(max_cols, GncPricePropType::NONE);
415
416 /* Force reinterpretation of already set columns and/or base_account */
417 for (uint32_t i = 0; i < m_settings.m_column_types_price.size(); i++)
418 set_column_type_price (i, m_settings.m_column_types_price[i], true);
419
420 if (guessColTypes)
421 {
422 /* Guess column_types based
423 * on the contents of each column. */
424 /* TODO Make it actually guess. */
425 }
426}

◆ update_skipped_lines()

void GncPriceImport::update_skipped_lines ( std::optional< uint32_t >  start,
std::optional< uint32_t >  end,
std::optional< bool >  alt,
std::optional< bool >  errors 
)

Definition at line 253 of file gnc-import-price.cpp.

255{
256 if (start)
257 m_settings.m_skip_start_lines = *start;
258 if (end)
259 m_settings.m_skip_end_lines = *end;
260 if (alt)
261 m_settings.m_skip_alt_lines = *alt;
262 if (errors)
263 m_skip_errors = *errors;
264
265 for (uint32_t i = 0; i < m_parsed_lines.size(); i++)
266 {
267 std::get<PL_SKIP>(m_parsed_lines[i]) =
268 ((i < skip_start_lines()) || // start rows to skip
269 (i >= m_parsed_lines.size() - skip_end_lines()) || // end rows to skip
270 (((i - skip_start_lines()) % 2 == 1) && // skip every second row...
271 skip_alt_lines()) || // ...if requested
272 (m_skip_errors && !std::get<PL_ERROR>(m_parsed_lines[i]).empty())); // skip lines with errors
273 }
274}

◆ verify()

std::string GncPriceImport::verify ( )

Definition at line 505 of file gnc-import-price.cpp.

506{
507 auto newline = std::string();
508 auto error_msg = ErrorListPrice();
509
510 /* Check if the import file did actually contain any information */
511 if (m_parsed_lines.size() == 0)
512 {
513 error_msg.add_error(_("No valid data found in the selected file. It may be empty or the selected encoding is wrong."));
514 return error_msg.str();
515 }
516
517 /* Check if at least one line is selected for importing */
518 auto skip_alt_offset = m_settings.m_skip_alt_lines ? 1 : 0;
519 if (m_settings.m_skip_start_lines + m_settings.m_skip_end_lines + skip_alt_offset >= m_parsed_lines.size())
520 {
521 error_msg.add_error(_("No lines are selected for importing. Please reduce the number of lines to skip."));
522 return error_msg.str();
523 }
524
525 verify_column_selections (error_msg);
526
527 update_skipped_lines (std::nullopt, std::nullopt, std::nullopt, std::nullopt);
528
529 auto have_line_errors = false;
530 for (auto line : m_parsed_lines)
531 {
532 if (!std::get<PL_SKIP>(line) && !std::get<PL_ERROR>(line).empty())
533 {
534 have_line_errors = true;
535 break;
536 }
537 }
538
539 if (have_line_errors)
540 error_msg.add_error( _("Not all fields could be parsed. Please correct the issues reported for each line or adjust the lines to skip."));
541
542 return error_msg.str();
543}

Field Documentation

◆ m_parsed_lines

std::vector<parse_line_t> GncPriceImport::m_parsed_lines

source file parsed into a two-dimensional array of strings.

Per line also holds possible error messages and objects with extracted price properties.

Definition at line 145 of file gnc-import-price.hpp.

◆ m_prices_added

int GncPriceImport::m_prices_added

Definition at line 148 of file gnc-import-price.hpp.

◆ m_prices_duplicated

int GncPriceImport::m_prices_duplicated

Definition at line 149 of file gnc-import-price.hpp.

◆ m_prices_replaced

int GncPriceImport::m_prices_replaced

Definition at line 150 of file gnc-import-price.hpp.

◆ m_tokenizer

std::unique_ptr<GncTokenizer> GncPriceImport::m_tokenizer

Will handle file loading/encoding conversion/splitting into fields.

Definition at line 144 of file gnc-import-price.hpp.


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