multiwoven-integrations 0.11.5 → 0.12.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d34ca59fc58e4345d01b70ca385e48317b2f62d419328d5f4a90b6ad353793e5
4
- data.tar.gz: 5e40098b4821ece6cb1042bf5fcbeb3837b79a7b1be6c729181db9b1c4fb33e7
3
+ metadata.gz: 39b0d65bc581946d3576734695b267d4d9b32e8b973489d5d4d2cebfd0848443
4
+ data.tar.gz: 778a1d8f6d056e8769699c36849de4f96992a3e1646687d93fe8428c9e56f06f
5
5
  SHA512:
6
- metadata.gz: 194c25e50ac5bd767c2f8de29e21a84da6df2157f71b61ad13b77b144d637be042471f5163e4760cfd5d2b19d7deedf933f2761b1db110c51c72a882666872ed
7
- data.tar.gz: faebd827dc102194d72465a78f1ff674592b303ef88b2d5ed09c1c171f61a8672977925fdbdf6783a90765b1e22525d871a4c41c7324785743ef5d21a967161e
6
+ metadata.gz: 44c7d134bdf48b7548658f91c4abbac9a7cd79caecdb1f75c628ef06cfc7e3562f6af62abfd2614661da4b90c3adf21b6c01b5514efda46ae88e46673e155386
7
+ data.tar.gz: fa3e918cc7b1aa524946bc59960638004a33b78baae8bc83cdf0abef6a0a90452211253d199637fc6d937c41b109871be6b70eb54b2d551946b65fc6222b4630
@@ -0,0 +1,137 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "tiny_tds"
4
+
5
+ module Multiwoven::Integrations::Destination
6
+ module MicrosoftSql
7
+ include Multiwoven::Integrations::Core
8
+ class Client < DestinationConnector
9
+ def check_connection(connection_config)
10
+ connection_config = connection_config.with_indifferent_access
11
+ db_client = create_connection(connection_config)
12
+
13
+ if db_client.active?
14
+ ConnectionStatus.new(
15
+ status: ConnectionStatusType["succeeded"]
16
+ ).to_multiwoven_message
17
+ else
18
+ ConnectionStatus.new(
19
+ status: ConnectionStatusType["failed"], message: "MS SQL connection not active"
20
+ ).to_multiwoven_message
21
+ end
22
+ rescue TinyTds::Error => e
23
+ ConnectionStatus.new(
24
+ status: ConnectionStatusType["failed"], message: e.message
25
+ ).to_multiwoven_message
26
+ end
27
+
28
+ def discover(connection_config)
29
+ connection_config = connection_config.with_indifferent_access
30
+ query = "SELECT table_name, column_name, data_type, is_nullable
31
+ FROM information_schema.columns
32
+ WHERE table_schema = '#{connection_config[:schema]}' AND table_catalog = '#{connection_config[:database]}'
33
+ ORDER BY table_name, ordinal_position;"
34
+
35
+ db_client = create_connection(connection_config)
36
+ records = db_client.execute(query) do |result|
37
+ result.map do |row|
38
+ row
39
+ end
40
+ end
41
+ catalog = Catalog.new(streams: create_streams(records))
42
+ catalog.to_multiwoven_message
43
+ rescue StandardError => e
44
+ handle_exception(e, {
45
+ context: "MSSQL:DISCOVER:EXCEPTION",
46
+ type: "error"
47
+ })
48
+ ensure
49
+ db_client&.close
50
+ end
51
+
52
+ def write(sync_config, records, action = "destination_insert")
53
+ connection_config = sync_config.destination.connection_specification.with_indifferent_access
54
+ table_name = sync_config.stream.name
55
+ primary_key = sync_config.model.primary_key
56
+ log_message_array = []
57
+ db = create_connection(connection_config)
58
+
59
+ write_success = 0
60
+ write_failure = 0
61
+
62
+ records.each do |record|
63
+ query = Multiwoven::Integrations::Core::QueryBuilder.perform(action, table_name, record, primary_key)
64
+ logger.debug("MSSQL:WRITE:QUERY query = #{query} sync_id = #{sync_config.sync_id} sync_run_id = #{sync_config.sync_run_id}")
65
+ begin
66
+ response = db.execute(query)
67
+ response.do
68
+ write_success += 1
69
+ log_message_array << log_request_response("info", query, response)
70
+ rescue StandardError => e
71
+ handle_exception(e, {
72
+ context: "MSSQL:RECORD:WRITE:EXCEPTION",
73
+ type: "error",
74
+ sync_id: sync_config.sync_id,
75
+ sync_run_id: sync_config.sync_run_id
76
+ })
77
+ write_failure += 1
78
+ log_message_array << log_request_response("error", query, e.message)
79
+ end
80
+ end
81
+ tracking_message(write_success, write_failure, log_message_array)
82
+ rescue StandardError => e
83
+ handle_exception(e, {
84
+ context: "MSSQL:RECORD:WRITE:EXCEPTION",
85
+ type: "error",
86
+ sync_id: sync_config.sync_id,
87
+ sync_run_id: sync_config.sync_run_id
88
+ })
89
+ end
90
+
91
+ private
92
+
93
+ def query(connection, query)
94
+ connection.exec(query) do |result|
95
+ result.map do |row|
96
+ RecordMessage.new(data: row, emitted_at: Time.now.to_i).to_multiwoven_message
97
+ end
98
+ end
99
+ end
100
+
101
+ def create_connection(connection_config)
102
+ raise "Unsupported Auth type" unless connection_config[:credentials][:auth_type] == "username/password"
103
+
104
+ TinyTds::Client.new(
105
+ username: connection_config[:credentials][:username],
106
+ password: connection_config[:credentials][:password],
107
+ host: connection_config[:host],
108
+ port: connection_config[:port],
109
+ database: connection_config[:database],
110
+ azure: true,
111
+ timeout: 3000
112
+ )
113
+ end
114
+
115
+ def create_streams(records)
116
+ group_by_table(records).map do |r|
117
+ Multiwoven::Integrations::Protocol::Stream.new(name: r[:tablename], action: StreamAction["fetch"], json_schema: convert_to_json_schema(r[:columns]))
118
+ end
119
+ end
120
+
121
+ def group_by_table(records)
122
+ records.group_by { |entry| entry["table_name"] }.map do |table_name, columns|
123
+ {
124
+ tablename: table_name,
125
+ columns: columns.map do |column|
126
+ {
127
+ column_name: column["column_name"],
128
+ type: column["data_type"],
129
+ optional: column["is_nullable"] == "YES"
130
+ }
131
+ end
132
+ }
133
+ end
134
+ end
135
+ end
136
+ end
137
+ end
@@ -0,0 +1,15 @@
1
+ {
2
+ "data": {
3
+ "name": "MicrosoftSql",
4
+ "title": "Microsoft SQL",
5
+ "connector_type": "destination",
6
+ "category": "Database",
7
+ "documentation_url": "https://docs.mutliwoven.com",
8
+ "github_issue_label": "destination-mssql",
9
+ "icon": "icon.svg",
10
+ "license": "MIT",
11
+ "release_stage": "alpha",
12
+ "support_level": "community",
13
+ "tags": ["language:ruby", "multiwoven"]
14
+ }
15
+ }
@@ -0,0 +1,68 @@
1
+ {
2
+ "documentation_url": "https://docs.multiwoven.com/integrations/sources/mssql",
3
+ "stream_type": "dynamic",
4
+ "connection_specification": {
5
+ "$schema": "http://json-schema.org/draft-07/schema#",
6
+ "title": "MicrosoftSql",
7
+ "type": "object",
8
+ "required": ["host", "port", "database", "schema"],
9
+ "properties": {
10
+ "credentials": {
11
+ "title": "",
12
+ "type": "object",
13
+ "required": ["auth_type", "username", "password"],
14
+ "properties": {
15
+ "auth_type": {
16
+ "type": "string",
17
+ "default": "username/password",
18
+ "order": 0,
19
+ "readOnly": true
20
+ },
21
+ "username": {
22
+ "description": "Username refers to your individual MS SQL login credentials. At a minimum, the user associated with these credentials must be granted read access to the data intended for synchronization.",
23
+ "examples": ["MSSQL_USER"],
24
+ "type": "string",
25
+ "title": "Username",
26
+ "order": 1
27
+ },
28
+ "password": {
29
+ "description": "This field requires the password associated with the user account specified in the preceding section.",
30
+ "type": "string",
31
+ "multiwoven_secret": true,
32
+ "title": "Password",
33
+ "order": 2
34
+ }
35
+ },
36
+ "order": 0
37
+ },
38
+ "host": {
39
+ "description": "The hostname or IP address of your MS SQL server.",
40
+ "examples": ["127.0.0.1"],
41
+ "type": "string",
42
+ "title": "Host",
43
+ "order": 1
44
+ },
45
+ "port": {
46
+ "description": "The port number for your MS SQL server, which defaults to 1433, may vary based on your configuration. ",
47
+ "examples": ["1433"],
48
+ "type": "string",
49
+ "title": "Port",
50
+ "order": 2
51
+ },
52
+ "database": {
53
+ "description": "The specific MS SQL database to connect to.",
54
+ "examples": ["MSSQL_DB"],
55
+ "type": "string",
56
+ "title": "Database",
57
+ "order": 3
58
+ },
59
+ "schema": {
60
+ "description": "The schema within the MS SQL database.",
61
+ "examples": ["dbo"],
62
+ "type": "string",
63
+ "title": "Schema",
64
+ "order": 4
65
+ }
66
+ }
67
+ }
68
+ }
@@ -0,0 +1,22 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+
3
+ <svg width="800px" height="800px" viewBox="0 -141.54 1478.201 1478.201" xmlns="http://www.w3.org/2000/svg">
4
+
5
+
6
+
7
+
8
+
9
+
10
+
11
+
12
+
13
+
14
+
15
+
16
+
17
+
18
+
19
+
20
+
21
+
22
+
@@ -2,7 +2,7 @@
2
2
 
3
3
  module Multiwoven
4
4
  module Integrations
5
- VERSION = "0.11.5"
5
+ VERSION = "0.12.0"
6
6
 
7
7
  ENABLED_SOURCES = %w[
8
8
  Snowflake
@@ -40,6 +40,7 @@ module Multiwoven
40
40
  DatabricksLakehouse
41
41
  Oracle
42
42
  MicrosoftExcel
43
+ MicrosoftSql
43
44
  ].freeze
44
45
  end
45
46
  end
@@ -71,7 +71,7 @@ module Multiwoven::Integrations::Source
71
71
 
72
72
  def build_url(url, connection_config)
73
73
  format(url, databricks_host: connection_config[:databricks_host],
74
- endpoint_name: connection_config[:endpoint_name])
74
+ endpoint_name: connection_config[:endpoint])
75
75
  end
76
76
 
77
77
  def send_request(url, token, payload)
@@ -89,6 +89,7 @@ require_relative "integrations/destination/maria_db/client"
89
89
  require_relative "integrations/destination/databricks_lakehouse/client"
90
90
  require_relative "integrations/destination/oracle_db/client"
91
91
  require_relative "integrations/destination/microsoft_excel/client"
92
+ require_relative "integrations/destination/microsoft_sql/client"
92
93
 
93
94
  module Multiwoven
94
95
  module Integrations
@@ -63,6 +63,7 @@ Gem::Specification.new do |spec|
63
63
  spec.add_runtime_dependency "sequel"
64
64
  spec.add_runtime_dependency "slack-ruby-client"
65
65
  spec.add_runtime_dependency "stripe"
66
+ spec.add_runtime_dependency "tiny_tds"
66
67
  spec.add_runtime_dependency "zendesk_api"
67
68
 
68
69
  spec.add_development_dependency "byebug"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: multiwoven-integrations
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.11.5
4
+ version: 0.12.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Subin T P
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2024-09-13 00:00:00.000000000 Z
11
+ date: 2024-10-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -430,6 +430,20 @@ dependencies:
430
430
  - - ">="
431
431
  - !ruby/object:Gem::Version
432
432
  version: '0'
433
+ - !ruby/object:Gem::Dependency
434
+ name: tiny_tds
435
+ requirement: !ruby/object:Gem::Requirement
436
+ requirements:
437
+ - - ">="
438
+ - !ruby/object:Gem::Version
439
+ version: '0'
440
+ type: :runtime
441
+ prerelease: false
442
+ version_requirements: !ruby/object:Gem::Requirement
443
+ requirements:
444
+ - - ">="
445
+ - !ruby/object:Gem::Version
446
+ version: '0'
433
447
  - !ruby/object:Gem::Dependency
434
448
  name: zendesk_api
435
449
  requirement: !ruby/object:Gem::Requirement
@@ -605,6 +619,10 @@ files:
605
619
  - lib/multiwoven/integrations/destination/microsoft_excel/config/meta.json
606
620
  - lib/multiwoven/integrations/destination/microsoft_excel/config/spec.json
607
621
  - lib/multiwoven/integrations/destination/microsoft_excel/icon.svg
622
+ - lib/multiwoven/integrations/destination/microsoft_sql/client.rb
623
+ - lib/multiwoven/integrations/destination/microsoft_sql/config/meta.json
624
+ - lib/multiwoven/integrations/destination/microsoft_sql/config/spec.json
625
+ - lib/multiwoven/integrations/destination/microsoft_sql/icon.svg
608
626
  - lib/multiwoven/integrations/destination/oracle_db/client.rb
609
627
  - lib/multiwoven/integrations/destination/oracle_db/config/meta.json
610
628
  - lib/multiwoven/integrations/destination/oracle_db/config/spec.json