equal
deleted
inserted
replaced
85 } |
85 } |
86 |
86 |
87 // TODO: sqlite3_column_type |
87 // TODO: sqlite3_column_type |
88 |
88 |
89 std::string getString(int columnIndex) { |
89 std::string getString(int columnIndex) { |
90 return (char *) sqlite3_column_text(stmt, columnIndex); |
90 const char* value = (const char*) sqlite3_column_text(stmt, columnIndex); |
|
91 return value ? value : ""; // TODO: support NULL values (when supported in relpipe format) |
91 } |
92 } |
92 |
93 |
93 }; |
94 }; |
94 |
95 |
95 class Connection { |
96 class Connection { |
130 |
131 |
131 for (int i = 0; i < parameterCount; i++) { |
132 for (int i = 0; i < parameterCount; i++) { |
132 prepared.setString(i + 1, convertor.to_bytes(statement.parameters[i].value)); |
133 prepared.setString(i + 1, convertor.to_bytes(statement.parameters[i].value)); |
133 } |
134 } |
134 |
135 |
135 for (int i = 0; i < columnCount; i++) { |
136 std::vector<relpipe::writer::AttributeMetadata> metadata; |
136 printf("column %d ~ %s\n", i, prepared.getColumName(i).c_str()); |
137 for (int i = 0; i < columnCount; i++) metadata.push_back({convertor.from_bytes(prepared.getColumName(i).c_str()), relpipe::writer::TypeId::STRING}); |
137 } |
138 relationalWriter->startRelation(statement.relation, metadata, true); |
138 |
139 |
139 while (prepared.next()) { |
140 while (prepared.next()) { |
140 for (int i = 0; i < columnCount; i++) { |
141 for (int i = 0; i < columnCount; i++) { |
141 printf("column %d ~ %s = %s\n", i, prepared.getColumName(i).c_str(), prepared.getString(i).c_str()); |
142 relationalWriter->writeAttribute(convertor.from_bytes(prepared.getString(i))); |
142 } |
143 } |
143 } |
144 } |
144 } |
145 } |
145 |
146 |
146 public: |
147 public: |