42class Connection :
public ObjectBase {
44 using Base = Connection<Derived>;
53 ~Connection() =
default;
57 if (
auto status = impl().InitImpl(parent); !status.ok()) {
58 return status.ToAdbc(error);
68 switch (autocommit_) {
69 case AutocommitState::kAutocommit:
70 return status::InvalidState(Derived::kErrorPrefix,
71 " No active transaction, cannot commit")
73 case AutocommitState::kTransaction:
74 return impl().CommitImpl().ToAdbc(error);
81 AdbcStatusCode GetInfo(
const uint32_t* info_codes,
size_t info_codes_length,
82 ArrowArrayStream* out, AdbcError* error) {
84 RAISE_STATUS(error, status::InvalidArgument(
"out must be non-null"));
87 std::vector<uint32_t> codes(info_codes, info_codes + info_codes_length);
88 std::vector<InfoValue> infos;
95 AdbcStatusCode GetObjects(
int c_depth,
const char* catalog,
const char* db_schema,
96 const char* table_name,
const char** table_type,
97 const char* column_name, ArrowArrayStream* out,
99 const auto catalog_filter =
100 catalog ? std::make_optional(std::string_view(catalog)) : std::nullopt;
101 const auto schema_filter =
102 db_schema ? std::make_optional(std::string_view(db_schema)) : std::nullopt;
103 const auto table_filter =
104 table_name ? std::make_optional(std::string_view(table_name)) : std::nullopt;
105 const auto column_filter =
106 column_name ? std::make_optional(std::string_view(column_name)) : std::nullopt;
107 std::vector<std::string_view> table_type_filter;
108 while (table_type && *table_type) {
110 table_type_filter.push_back(std::string_view(*table_type));
118 depth = GetObjectsDepth::kCatalogs;
121 depth = GetObjectsDepth::kColumns;
124 depth = GetObjectsDepth::kSchemas;
127 depth = GetObjectsDepth::kTables;
130 return status::InvalidArgument(Derived::kErrorPrefix,
131 " GetObjects: invalid depth ", c_depth)
135 std::unique_ptr<GetObjectsHelper> helper;
137 auto status =
BuildGetObjects(helper.get(), depth, catalog_filter, schema_filter,
138 table_filter, column_filter, table_type_filter, out);
147 switch (autocommit_) {
148 case AutocommitState::kAutocommit:
150 case AutocommitState::kTransaction:
154 std::optional<std::string> catalog;
161 std::optional<std::string> schema;
168 return status::NotImplemented(Derived::kErrorPrefix,
" Unknown connection option ",
173 AdbcStatusCode GetStatistics(
const char* catalog,
const char* db_schema,
174 const char* table_name,
char approximate,
175 ArrowArrayStream* out,
AdbcError* error) {
185 AdbcStatusCode GetTableSchema(
const char* catalog,
const char* db_schema,
186 const char* table_name, ArrowSchema* schema,
189 return status::InvalidArgument(Derived::kErrorPrefix,
190 " GetTableSchema: must provide table_name")
193 std::memset(schema, 0,
sizeof(*schema));
194 std::optional<std::string_view> catalog_param =
195 catalog ? std::make_optional(std::string_view(catalog)) : std::nullopt;
196 std::optional<std::string_view> db_schema_param =
197 db_schema ? std::make_optional(std::string_view(db_schema)) : std::nullopt;
198 std::string_view table_name_param = table_name;
201 .GetTableSchemaImpl(catalog_param, db_schema_param, table_name_param, schema)
206 AdbcStatusCode GetTableTypes(ArrowArrayStream* out, AdbcError* error) {
208 RAISE_STATUS(error, status::InvalidArgument(
"out must be non-null"));
211 std::vector<std::string> table_types;
212 RAISE_RESULT(error, table_types, impl().GetTableTypesImpl());
219 size_t serialized_length, ArrowArrayStream* out,
226 return impl().ReleaseImpl().ToAdbc(error);
231 switch (autocommit_) {
232 case AutocommitState::kAutocommit:
233 return status::InvalidState(Derived::kErrorPrefix,
234 " No active transaction, cannot rollback")
236 case AutocommitState::kTransaction:
237 return impl().RollbackImpl().ToAdbc(error);
246 return impl().SetOptionImpl(key, value).ToAdbc(error);
256 Result<std::optional<std::string>> GetCurrentSchemaImpl() {
return std::nullopt; }
265 return std::make_unique<GetObjectsHelper>();
268 Status GetTableSchemaImpl(std::optional<std::string_view> catalog,
269 std::optional<std::string_view> db_schema,
270 std::string_view table_name, ArrowSchema* schema) {
271 return status::NotImplemented(
"GetTableSchema");
274 Result<std::vector<std::string>> GetTableTypesImpl() {
275 return std::vector<std::string>();
278 Result<std::vector<InfoValue>> InfoImpl(
const std::vector<uint32_t>& codes) {
279 return std::vector<InfoValue>{};
282 Status InitImpl(
void* parent) {
return status::Ok(); }
284 Status ReleaseImpl() {
return status::Ok(); }
286 Status RollbackImpl() {
return status::NotImplemented(
"Rollback"); }
288 Status SetOptionImpl(std::string_view key, Option value) {
292 switch (autocommit_) {
293 case AutocommitState::kAutocommit: {
296 autocommit_ = AutocommitState::kTransaction;
300 case AutocommitState::kTransaction: {
303 autocommit_ = AutocommitState::kAutocommit;
310 return status::NotImplemented(Derived::kErrorPrefix,
" Unknown connection option ",
311 key,
"=", value.Format());
314 Status ToggleAutocommitImpl(
bool enable_autocommit) {
315 return status::NotImplemented(Derived::kErrorPrefix,
" Cannot change autocommit");
322 Derived& impl() {
return static_cast<Derived&
>(*this); }
Status BuildGetObjects(GetObjectsHelper *helper, GetObjectsDepth depth, std::optional< std::string_view > catalog_filter, std::optional< std::string_view > schema_filter, std::optional< std::string_view > table_filter, std::optional< std::string_view > column_filter, const std::vector< std::string_view > &table_types, ArrowArrayStream *out)
A helper that implements GetObjects. The out/helper lifetime are caller-managed.