10 #include "csv_read_assign_helper.h"
11 #include "ypc/corecommon/package.h"
12 #include <boost/property_tree/json_parser.hpp>
13 #include <boost/property_tree/ptree.hpp>
14 #include <ff/util/ntobject.h>
24 void *create_item_reader(
const char *extra_param,
int len);
26 int reset_for_read(
void *handle);
27 int read_item_data(
void *handle,
char *buf,
int *len);
28 int close_item_reader(
void *handle);
29 uint64_t get_item_number(
void *handle);
39 virtual int reset_for_read() = 0;
40 virtual int read_item_data(
char *buf,
int *len) = 0;
41 virtual int close_item_reader() = 0;
42 virtual int get_item_number() = 0;
46 template <
typename NT>
struct ntobject_size {
const static size_t size = 0; };
48 const static size_t size = 1;
50 template <
typename T1,
typename... ARGS>
52 const static size_t size =
65 : m_extra_param(extra_param), m_file_path(extra_param) {
73 m_stream.reset(
new std::ifstream(m_file_path));
74 if (!m_stream->is_open()) {
75 throw std::runtime_error(
"file not exist");
80 virtual int reset_for_read() {
81 m_stream.reset(
new std::ifstream(m_file_path));
82 if (!m_stream->is_open()) {
86 new io::CSVReader<ntobject_size<item_t>::size>(m_file_path, *m_stream));
89 item_t read_typed_item() {
90 typedef typename cast_obj_to_package<item_t>::type package_t;
92 internal::assign_helper<item_t>::read_row(m_reader.get(), v);
97 virtual int read_item_data(
char *buf,
int *len) {
98 typedef typename cast_obj_to_package<item_t>::type package_t;
100 bool rv = internal::assign_helper<item_t>::read_row(m_reader.get(), v);
105 ff::net::marshaler lm(ff::net::marshaler::length_retriver);
107 *len =
static_cast<int>(lm.get_length());
110 ff::net::marshaler sm(buf, *len, ff::net::marshaler::serializer);
115 virtual int close_item_reader() {
120 virtual int get_item_number() {
121 std::ifstream s(m_file_path);
124 while (r.next_line()) {
126 auto l = r.get_file_line();
131 const std::string m_extra_param;
132 std::string m_file_path;
133 std::unique_ptr<std::ifstream> m_stream;
134 std::unique_ptr<io::CSVReader<ntobject_size<item_t>::size>> m_reader;
139 #define impl_csv_reader(type) \
140 void *create_item_reader(const char *extra_param, int len) { \
142 ypc::plugins::csv_reader *reader = \
143 new type(std::string(extra_param, len)); \
145 } catch (const std::exception &e) { \
146 std::cout << "create_item_reader got exception: " << e.what() \
151 int reset_for_read(void *handle) { \
152 ypc::plugins::csv_reader *reader = (ypc::plugins::csv_reader *)handle; \
153 return reader->reset_for_read(); \
155 int read_item_data(void *handle, char *buf, int *len) { \
156 ypc::plugins::csv_reader *reader = (ypc::plugins::csv_reader *)handle; \
157 return reader->read_item_data(buf, len); \
159 int close_item_reader(void *handle) { \
160 ypc::plugins::csv_reader *reader = (ypc::plugins::csv_reader *)handle; \
161 reader->close_item_reader(); \
166 uint64_t get_item_number(void *handle) { \
167 ypc::plugins::csv_reader *reader = (ypc::plugins::csv_reader *)handle; \
168 return reader->get_item_number(); \