-
Notifications
You must be signed in to change notification settings - Fork 3
/
DSVWriter.cc
158 lines (138 loc) · 2.82 KB
/
DSVWriter.cc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
//
// Copyright 2009-2016 M. Shulhan (ms@kilabit.info). All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//
#include "DSVWriter.hh"
namespace vos {
const char* DSVWriter::__cname = "DSVWriter";
/**
* @method : DSVWriter::DSVWriter
* @desc : DSVWriter object constructor.
*/
DSVWriter::DSVWriter() :
_line()
{}
/**
* @method : DSVWriter::~DSVWriter
* @desc : DSVWriter object destructor.
*/
DSVWriter::~DSVWriter()
{}
/**
* @method : DSVWriter::write
* @param :
* > row : record buffer, list of column data that will be written.
* > list_md: record meta-data.
* @return :
* < 0 : success.
* < -1 : fail.
* @desc : write one row using 'list_md' as meta-data to file.
*/
int DSVWriter::write(DSVRecord *row, List *list_md)
{
ssize_t len = 0;
size_t blob_size = 0;
int x = 0;
DSVRecordMD* rmd = NULL;
Error err;
for (; x < list_md->size(); x++) {
rmd = (DSVRecordMD*) list_md->at(x);
if (rmd->_start_p) {
err = _line.resize(rmd->_start_p);
if (err != NULL) {
return -1;
}
}
if (rmd->_left_q) {
err = _line.appendc((char) rmd->_left_q);
if (err != NULL) {
return -1;
}
}
switch (rmd->_type) {
case RMD_T_STRING:
case RMD_T_NUMBER:
case RMD_T_DATE:
err = _line.append_raw(row->v(), row->len());
if (err != NULL) {
return -1;
}
break;
case RMD_T_BLOB:
blob_size = row->len();
err = _line.append_bin(&blob_size, DSVRecordMD::BLOB_SIZE);
if (err != NULL) {
return -1;
}
err = _line.append_raw(row->v(), row->len());
if (err != NULL) {
return -1;
}
break;
}
if (rmd->_end_p) {
if (rmd->_end_p < _line.len()) {
len = ssize_t(rmd->_end_p);
if (rmd->_right_q) {
--len;
}
if (rmd->_sep) {
--len;
}
_line.truncate(size_t(len));
} else {
_line.set_len(rmd->_end_p);
/* it will resize by itself it the next
* call of append */
}
}
if (rmd->_right_q) {
err = _line.appendc((char) rmd->_right_q);
if (err != NULL) {
return -1;
}
}
if (rmd->_sep) {
err = _line.appendc((char) rmd->_sep);
if (err != NULL) {
return -1;
}
}
row = row->_next_col;
}
_line.append_raw(_eol);
len = ssize_t(_i + _line.len());
if (size_t(len) > _l) {
flush();
}
err = append_raw(_line.v(), _line.len());
if (err != NULL) {
return -1;
}
_line.reset();
return 0;
}
/**
* @method : DSVWriter::writes
* @param :
* > rows : list of row of DSVRecord objects.
* > list_md: list of record meta-data.
* @return :
* < 0 : success.
* < -1 : fail.
* @desc : write all 'rows' to file.
*/
int DSVWriter::writes(DSVRecord *rows, List *list_md)
{
while (rows) {
int s = write(rows, list_md);
if (s < 0) {
return -1;
}
rows = rows->_next_row;
}
return 0;
}
} /* namespace::vos */
// vi: ts=8 sw=8 tw=78: