comparison data/fileio/CSVFileWriter.cpp @ 1436:d61d6c33f14d streaming-csv-writer

Remove some duplication and make use of utility function for writing in chunks to avoid memory growth.
author Lucas Thompson <dev@lucas.im>
date Tue, 17 Apr 2018 10:03:49 +0100
parents 815f82508f96
children 09c2ba31a711
comparison
equal deleted inserted replaced
1435:365876627fb0 1436:d61d6c33f14d
12 License, or (at your option) any later version. See the file 12 License, or (at your option) any later version. See the file
13 COPYING included with this distribution for more information. 13 COPYING included with this distribution for more information.
14 */ 14 */
15 15
16 #include "CSVFileWriter.h" 16 #include "CSVFileWriter.h"
17 #include "CSVStreamWriter.h"
17 18
18 #include "model/Model.h" 19 #include "model/Model.h"
19 #include "model/SparseOneDimensionalModel.h" 20 #include "model/SparseOneDimensionalModel.h"
20 #include "model/SparseTimeValueModel.h" 21 #include "model/SparseTimeValueModel.h"
21 #include "model/NoteModel.h" 22 #include "model/NoteModel.h"
25 #include "base/Exceptions.h" 26 #include "base/Exceptions.h"
26 #include "base/Selection.h" 27 #include "base/Selection.h"
27 28
28 #include <QFile> 29 #include <QFile>
29 #include <QTextStream> 30 #include <QTextStream>
31 #include <exception>
30 32
31 CSVFileWriter::CSVFileWriter(QString path, 33 CSVFileWriter::CSVFileWriter(QString path,
32 Model *model, 34 Model *model,
33 QString delimiter, 35 QString delimiter,
34 DataExportOptions options) : 36 DataExportOptions options) :
57 } 59 }
58 60
59 void 61 void
60 CSVFileWriter::write() 62 CSVFileWriter::write()
61 { 63 {
62 try { 64 Selection all {
63 TempWriteFile temp(m_path); 65 m_model->getStartFrame(),
64 66 m_model->getEndFrame()
65 QFile file(temp.getTemporaryFilename()); 67 };
66 if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) { 68 MultiSelection selections;
67 m_error = tr("Failed to open file %1 for writing") 69 selections.addSelection(all);
68 .arg(temp.getTemporaryFilename()); 70 writeSelection(&selections);
69 return;
70 }
71
72 QTextStream out(&file);
73 out << m_model->toDelimitedDataStringWithOptions
74 (m_delimiter, m_options);
75
76 file.close();
77 temp.moveToTarget();
78
79 } catch (FileOperationFailed &f) {
80 m_error = f.what();
81 }
82 } 71 }
83 72
84 void 73 void
85 CSVFileWriter::writeSelection(MultiSelection *selection) 74 CSVFileWriter::writeSelection(MultiSelection *selection)
86 { 75 {
94 return; 83 return;
95 } 84 }
96 85
97 QTextStream out(&file); 86 QTextStream out(&file);
98 87
99 for (MultiSelection::SelectionList::iterator i = 88 bool completed = false;
100 selection->getSelections().begin(); 89
101 i != selection->getSelections().end(); ++i) { 90 for (const auto& bounds : selection->getSelections()) {
102 91 completed = CSV::writeToStreamInChunks(
103 sv_frame_t f0(i->getStartFrame()), f1(i->getEndFrame()); 92 out,
104 out << m_model->toDelimitedDataStringSubsetWithOptions 93 *m_model,
105 (m_delimiter, m_options, f0, f1); 94 bounds,
95 m_reporter,
96 m_delimiter,
97 m_options
98 );
99 if (!completed) {
100 break;
101 }
106 } 102 }
107 103
108 file.close(); 104 file.close();
109 temp.moveToTarget(); 105 if (completed) {
106 temp.moveToTarget();
107 }
110 108
111 } catch (FileOperationFailed &f) { 109 } catch (FileOperationFailed &f) {
112 m_error = f.what(); 110 m_error = f.what();
111 } catch (const std::exception &e) { // ProgressReporter could throw
112 m_error = e.what();
113 } 113 }
114 } 114 }
115
116
117