forked from Multiwoven/multiwoven
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
feat(CE): Add mariaDB source connector (Multiwoven#208)
- Loading branch information
1 parent
d9bcc51
commit 24457f1
Showing
9 changed files
with
355 additions
and
2 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
92 changes: 92 additions & 0 deletions
92
integrations/lib/multiwoven/integrations/source/maria_db/client.rb
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,92 @@ | ||
# frozen_string_literal: true | ||
|
||
module Multiwoven::Integrations::Source | ||
module MariaDB | ||
include Multiwoven::Integrations::Core | ||
class Client < SourceConnector | ||
def check_connection(connection_config) | ||
connection_config = connection_config.with_indifferent_access | ||
create_connection(connection_config) | ||
ConnectionStatus.new(status: ConnectionStatusType["succeeded"]).to_multiwoven_message | ||
rescue StandardError => e | ||
ConnectionStatus.new(status: ConnectionStatusType["failed"], message: e.message).to_multiwoven_message | ||
end | ||
|
||
def discover(connection_config) | ||
connection_config = connection_config.with_indifferent_access | ||
query = "SELECT table_name, column_name, data_type, is_nullable FROM information_schema.columns WHERE table_schema = '#{connection_config[:database]}' ORDER BY table_name, ordinal_position;" | ||
db = create_connection(connection_config) | ||
results = query_execution(db, query) | ||
catalog = Catalog.new(streams: create_streams(results)) | ||
catalog.to_multiwoven_message | ||
rescue StandardError => e | ||
handle_exception(e, { | ||
context: "MARIA:DB:DISCOVER:EXCEPTION", | ||
type: "error" | ||
}) | ||
end | ||
|
||
def read(sync_config) | ||
connection_config = sync_config.source.connection_specification.with_indifferent_access | ||
query = sync_config.model.query | ||
query = batched_query(query, sync_config.limit, sync_config.offset) unless sync_config.limit.nil? && sync_config.offset.nil? | ||
db = create_connection(connection_config) | ||
query(db, query) | ||
rescue StandardError => e | ||
handle_exception(e, { | ||
context: "MARIA:DB:READ:EXCEPTION", | ||
type: "error", | ||
sync_id: sync_config.sync_id, | ||
sync_run_id: sync_config.sync_run_id | ||
}) | ||
end | ||
|
||
private | ||
|
||
def create_connection(connection_config) | ||
Sequel.connect( | ||
adapter: "mysql2", | ||
host: connection_config[:host], | ||
port: connection_config[:port], | ||
user: connection_config[:username], | ||
password: connection_config[:password], | ||
database: connection_config[:database] | ||
) | ||
end | ||
|
||
def query_execution(db, query) | ||
db.fetch(query).all | ||
end | ||
|
||
def create_streams(records) | ||
group_by_table(records).map do |_, r| | ||
Multiwoven::Integrations::Protocol::Stream.new(name: r[:tablename], action: StreamAction["fetch"], json_schema: convert_to_json_schema(r[:columns])) | ||
end | ||
end | ||
|
||
def query(db, query) | ||
records = [] | ||
query_execution(db, query).map do |row| | ||
records << RecordMessage.new(data: row, emitted_at: Time.now.to_i).to_multiwoven_message | ||
end | ||
records | ||
end | ||
|
||
def group_by_table(records) | ||
result = {} | ||
records.each_with_index do |entry, index| | ||
table_name = entry[:table_name] | ||
column_data = { | ||
column_name: entry[:column_name], | ||
data_type: entry[:data_type], | ||
is_nullable: entry[:is_nullable] == "YES" | ||
} | ||
result[index] ||= {} | ||
result[index][:tablename] = table_name | ||
result[index][:columns] = [column_data] | ||
end | ||
result | ||
end | ||
end | ||
end | ||
end |
15 changes: 15 additions & 0 deletions
15
integrations/lib/multiwoven/integrations/source/maria_db/config/meta.json
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,15 @@ | ||
{ | ||
"data": { | ||
"name": "MariaDB", | ||
"title": "Maria DB", | ||
"connector_type": "source", | ||
"category": "Data Warehouse", | ||
"documentation_url": "https://docs.squared.ai/guides/data-integration/sources/mariadb", | ||
"github_issue_label": "source-maria-db", | ||
"icon": "icon.svg", | ||
"license": "MIT", | ||
"release_stage": "alpha", | ||
"support_level": "community", | ||
"tags": ["language:ruby", "multiwoven"] | ||
} | ||
} |
48 changes: 48 additions & 0 deletions
48
integrations/lib/multiwoven/integrations/source/maria_db/config/spec.json
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,48 @@ | ||
{ | ||
"documentation_url": "https://docs.squared.ai/guides/data-integration/sources/mariadb", | ||
"stream_type": "dynamic", | ||
"connector_query_type": "raw_sql", | ||
"connection_specification": { | ||
"$schema": "http://json-schema.org/draft-07/schema#", | ||
"title": "Maria DB", | ||
"type": "object", | ||
"required": ["host", "port", "username", "password", "database"], | ||
"properties": { | ||
"host": { | ||
"description": "The hostname or IP address of the server where the MariaDB database is hosted.", | ||
"examples": ["localhost"], | ||
"type": "string", | ||
"title": "Host", | ||
"order": 0 | ||
}, | ||
"port": { | ||
"description": "The port number on which the MariaDB server is listening for connections.", | ||
"examples": ["3306"], | ||
"type": "string", | ||
"title": "Port", | ||
"order": 1 | ||
}, | ||
"username": { | ||
"description": "The username used to authenticate and connect to the MariaDB database.", | ||
"examples": ["root"], | ||
"type": "string", | ||
"title": "Username", | ||
"order": 2 | ||
}, | ||
"password": { | ||
"description": "The password corresponding to the username used for authentication.", | ||
"type": "string", | ||
"multiwoven_secret": true, | ||
"title": "Password", | ||
"order": 3 | ||
}, | ||
"database": { | ||
"description": "The name of the specific database within the MariaDB server to connect to.", | ||
"examples": ["mydatabase"], | ||
"type": "string", | ||
"title": "Database", | ||
"order": 4 | ||
} | ||
} | ||
} | ||
} |
15 changes: 15 additions & 0 deletions
15
integrations/lib/multiwoven/integrations/source/maria_db/icon.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Oops, something went wrong.