Skip to content

Commit f8b5b2b

Browse files
committed
Improve get_objects API
1 parent d52aafb commit f8b5b2b

File tree

2 files changed

+74
-65
lines changed

2 files changed

+74
-65
lines changed

lib/activerecord_adbc_adapter/adapter.rb

Lines changed: 23 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -46,12 +46,29 @@ def open_statement(&block)
4646
@connection.open_statement(&block)
4747
end
4848

49-
def get_objects(*args)
50-
reader = @connection.get_objects(*args)
51-
begin
52-
yield(reader.read_all)
53-
ensure
54-
reader.unref
49+
if ADBC::Connection.method_defined?(:get_objects_raw)
50+
# red-adbc provides convenient wrapper
51+
def get_objects(...)
52+
@connection.get_objects(...)
53+
end
54+
else
55+
def get_objects(depth: :all,
56+
catalog: nil,
57+
db_schema: nil,
58+
table_name: nil,
59+
table_types: nil,
60+
column_name: nil)
61+
reader = @connection.get_objects(depth,
62+
catalog,
63+
db_schema,
64+
table_name,
65+
table_types,
66+
column_name)
67+
begin
68+
reader.read_all
69+
ensure
70+
reader.unref
71+
end
5572
end
5673
end
5774
end

lib/activerecord_adbc_adapter/schema_statements.rb

Lines changed: 51 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -63,94 +63,86 @@ def adbc_view_type
6363
def tables
6464
type = adbc_table_type
6565
with_raw_connection do |conn|
66-
conn.get_objects(:tables,
67-
adbc_catalog,
68-
adbc_db_schema,
69-
nil,
70-
[type]) do |table|
71-
tables = []
72-
table.raw_records.each do |_catalog_name, db_schemas|
73-
db_schemas.each do |db_schema|
74-
db_schema_tables = db_schema["db_schema_tables"]
75-
next if db_schema_tables.nil?
76-
db_schema_tables.each do |t|
77-
# Some drivers may ignore table_types
78-
next unless t["table_type"] == type
79-
tables << t["table_name"]
80-
end
66+
objects = conn.get_objects(depth: :tables,
67+
catalog: adbc_catalog,
68+
db_schema: adbc_db_schema,
69+
table_types: [type])
70+
tables = []
71+
objects.raw_records.each do |_catalog_name, db_schemas|
72+
db_schemas.each do |db_schema|
73+
db_schema_tables = db_schema["db_schema_tables"]
74+
next if db_schema_tables.nil?
75+
db_schema_tables.each do |t|
76+
# Some drivers may ignore table_types
77+
next unless t["table_type"] == type
78+
tables << t["table_name"]
8179
end
8280
end
83-
tables
8481
end
82+
tables
8583
end
8684
end
8785

8886
def views
8987
type = adbc_view_type
9088
with_raw_connection do |conn|
91-
conn.get_objects(:tables,
92-
adbc_catalog,
93-
adbc_db_schema,
94-
nil,
95-
[type]) do |table|
96-
views = []
97-
table.raw_records.each do |_catalog_name, db_schemas|
98-
db_schemas.each do |db_schema|
99-
db_schema_tables = db_schema["db_schema_tables"]
100-
next if db_schema_tables.nil?
101-
db_schema_tables.each do |t|
102-
# Some drivers may ignore table_types
103-
next unless t["table_type"] == type
104-
views << t["table_name"]
105-
end
89+
objects = conn.get_objects(depth: :tables,
90+
catalog: adbc_catalog,
91+
db_schema: adbc_db_schema,
92+
table_types: [type])
93+
views = []
94+
objects.raw_records.each do |_catalog_name, db_schemas|
95+
db_schemas.each do |db_schema|
96+
db_schema_tables = db_schema["db_schema_tables"]
97+
next if db_schema_tables.nil?
98+
db_schema_tables.each do |t|
99+
# Some drivers may ignore table_types
100+
next unless t["table_type"] == type
101+
views << t["table_name"]
106102
end
107103
end
108-
views
109104
end
105+
views
110106
end
111107
end
112108

113109
def column_definitions(table_name)
114110
with_raw_connection do |conn|
115-
conn.get_objects(:all,
116-
adbc_catalog,
117-
adbc_db_schema,
118-
table_name) do |table|
119-
table.raw_records.each do |_catalog_name, db_schemas|
120-
db_schemas.each do |db_schema|
121-
db_schema_tables = db_schema["db_schema_tables"]
122-
next if db_schema_tables.nil?
123-
db_schema_tables.each do |t|
124-
return t["table_columns"]
125-
end
111+
objects = conn.get_objects(catalog: adbc_catalog,
112+
db_schema: adbc_db_schema,
113+
table_name: table_name)
114+
objects.raw_records.each do |_catalog_name, db_schemas|
115+
db_schemas.each do |db_schema|
116+
db_schema_tables = db_schema["db_schema_tables"]
117+
next if db_schema_tables.nil?
118+
db_schema_tables.each do |table|
119+
return table["table_columns"]
126120
end
127121
end
128-
[] # raise?
129122
end
123+
[] # raise?
130124
end
131125
end
132126

133127
def primary_keys(table_name)
134128
with_raw_connection do |conn|
135-
conn.get_objects(:all,
136-
adbc_catalog,
137-
adbc_db_schema,
138-
table_name) do |table|
139-
table.raw_records.each do |_catalog_name, db_schemas|
140-
db_schemas.each do |db_schema|
141-
db_schema_tables = db_schema["db_schema_tables"]
142-
next if db_schema_tables.nil?
143-
db_schema_tables.each do |t|
144-
constraint = t["table_constraints"].find do |constraint|
145-
constraint["constraint_type"] == "PRIMARY KEY"
146-
end
147-
return [] if constraint.nil?
148-
return constraint["constraint_column_names"] || []
129+
objects = conn.get_objects(catalog: adbc_catalog,
130+
db_schema: adbc_db_schema,
131+
table_name: table_name)
132+
objects.raw_records.each do |_catalog_name, db_schemas|
133+
db_schemas.each do |db_schema|
134+
db_schema_tables = db_schema["db_schema_tables"]
135+
next if db_schema_tables.nil?
136+
db_schema_tables.each do |table|
137+
constraint = table["table_constraints"].find do |constraint|
138+
constraint["constraint_type"] == "PRIMARY KEY"
149139
end
140+
return [] if constraint.nil?
141+
return constraint["constraint_column_names"] || []
150142
end
151143
end
152-
[]
153144
end
145+
[]
154146
end
155147
end
156148

0 commit comments

Comments
 (0)