@@ -111,137 +111,64 @@ func (s *Scraper) Shutdown(_ context.Context) error {
111
111
}
112
112
113
113
func BuildDataSourceString (driver string , dataSource DataSourceConfig ) (string , error ) {
114
- switch driver {
115
- case "postgres" :
116
- return buildPostgreSQLString (dataSource )
117
- case "mysql" :
118
- return buildMySQLString (dataSource )
119
- case "snowflake" :
120
- return buildSnowflakeString (dataSource )
121
- case "sqlserver" :
122
- return buildSQLServerString (dataSource )
123
- case "oracle" :
124
- return buildOracleString (dataSource )
125
- default :
126
- return "" , fmt .Errorf ("unsupported driver: %s" , driver )
127
- }
128
- }
129
-
130
- func buildPostgreSQLString (conn DataSourceConfig ) (string , error ) {
131
- // PostgreSQL connection string format: postgresql://user:pass@host:port/db?param1=value1¶m2=value2
132
- var auth string
133
- if conn .Username != "" {
134
- auth = fmt .Sprintf ("%s:%s@" , url .QueryEscape (conn .Username ), url .QueryEscape (string (conn .Password )))
135
- }
136
-
137
- query := url.Values {}
138
- for k , v := range conn .AdditionalParams {
139
- query .Set (k , fmt .Sprintf ("%v" , v ))
140
- }
141
-
142
- connStr := fmt .Sprintf ("postgresql://%s%s:%d/%s" , auth , conn .Host , conn .Port , conn .Database )
143
- if len (query ) > 0 {
144
- connStr += "?" + query .Encode ()
145
- }
146
-
147
- return connStr , nil
148
- }
149
-
150
- func buildMySQLString (conn DataSourceConfig ) (string , error ) {
151
- // MySQL connection string format: user:pass@tcp(host:port)/db?param1=value1¶m2=value2
152
- var auth string
153
-
154
- // MySQL requires no escaping of username and password
155
- if conn .Username != "" {
156
- username := conn .Username
157
- password := string (conn .Password )
158
- auth = fmt .Sprintf ("%s:%s@" , username , password )
159
- }
160
-
161
- query := url.Values {}
162
- for k , v := range conn .AdditionalParams {
163
- query .Set (k , fmt .Sprintf ("%v" , v ))
164
- }
165
-
166
- connStr := fmt .Sprintf ("%stcp(%s:%d)/%s" , auth , conn .Host , conn .Port , conn .Database )
167
- if len (query ) > 0 {
168
- connStr += "?" + query .Encode ()
169
- }
170
-
171
- return connStr , nil
172
- }
173
-
174
- func buildSnowflakeString (conn DataSourceConfig ) (string , error ) {
175
- // Snowflake connection string format: user:pass@host:port/database?param1=value1¶m2=value2
176
- var auth string
177
- if conn .Username != "" {
178
- auth = fmt .Sprintf ("%s:%s@" , url .QueryEscape (conn .Username ), url .QueryEscape (string (conn .Password )))
179
- }
180
-
181
- query := url.Values {}
182
- for k , v := range conn .AdditionalParams {
183
- query .Set (k , fmt .Sprintf ("%v" , v ))
184
- }
185
-
186
- connStr := fmt .Sprintf ("%s%s:%d/%s" , auth , conn .Host , conn .Port , conn .Database )
187
- if len (query ) > 0 {
188
- connStr += "?" + query .Encode ()
189
- }
190
-
191
- return connStr , nil
192
- }
193
-
194
- func buildSQLServerString (conn DataSourceConfig ) (string , error ) {
195
- // SQL Server connection string format: sqlserver://username:password@host:port/instance
196
114
var auth string
197
-
198
- if conn .Username != "" {
199
- auth = fmt .Sprintf ("%s:%s@" , url .QueryEscape (conn .Username ), url .QueryEscape (string (conn .Password )))
200
- }
201
-
202
- // replace all backslashes with forward slashes
203
- host := strings .ReplaceAll (conn .Host , "\\ " , "/" )
204
-
205
- // if host contains a "/", split it into hostname and instance
206
- parts := strings .SplitN (host , "/" , 2 )
207
- hostname := parts [0 ]
208
- var instance string
209
- if len (parts ) > 1 {
210
- instance = parts [1 ]
115
+ if dataSource .Username != "" {
116
+ // MySQL doesn't need URL escaping
117
+ if driver == DriverMySQL {
118
+ auth = fmt .Sprintf ("%s:%s@" , dataSource .Username , string (dataSource .Password ))
119
+ } else {
120
+ auth = fmt .Sprintf ("%s:%s@" , url .QueryEscape (dataSource .Username ), url .QueryEscape (string (dataSource .Password )))
121
+ }
211
122
}
212
123
213
124
query := url.Values {}
214
- query .Set ("database" , conn .Database )
215
- for k , v := range conn .AdditionalParams {
125
+ for k , v := range dataSource .AdditionalParams {
216
126
query .Set (k , fmt .Sprintf ("%v" , v ))
217
127
}
218
128
219
129
var connStr string
220
- if instance != "" {
221
- connStr = fmt .Sprintf ("sqlserver://%s%s:%d/%s" , auth , hostname , conn .Port , instance )
222
- } else {
223
- connStr = fmt .Sprintf ("sqlserver://%s%s:%d" , auth , hostname , conn .Port )
224
- }
225
- if len (query ) > 0 {
226
- connStr += "?" + query .Encode ()
227
- }
228
-
229
- return connStr , nil
230
- }
231
-
232
- func buildOracleString (conn DataSourceConfig ) (string , error ) {
233
- // Oracle connection string format: oracle://user:pass@host:port/service_name?param1=value1¶m2=value2
234
- var auth string
235
- if conn .Username != "" {
236
- auth = fmt .Sprintf ("%s:%s@" , url .QueryEscape (conn .Username ), url .QueryEscape (string (conn .Password )))
237
- }
238
-
239
- query := url.Values {}
240
- for k , v := range conn .AdditionalParams {
241
- query .Set (k , fmt .Sprintf ("%v" , v ))
130
+ switch driver {
131
+ case DriverHDB :
132
+ // HDB connection string format: hdb://user:pass@host:port?param1=value1
133
+ connStr = fmt .Sprintf ("hdb://%s%s:%d" , auth , dataSource .Host , dataSource .Port )
134
+ case DriverMySQL :
135
+ // MySQL connection string format: user:pass@tcp(host:port)/db?param1=value1¶m2=value2
136
+ connStr = fmt .Sprintf ("%stcp(%s:%d)/%s" , auth , dataSource .Host , dataSource .Port , dataSource .Database )
137
+ case DriverOracle :
138
+ // Oracle connection string format: oracle://user:pass@host:port/service_name?param1=value1¶m2=value2
139
+ connStr = fmt .Sprintf ("oracle://%s%s:%d/%s" , auth , dataSource .Host , dataSource .Port , dataSource .Database )
140
+ case DriverPostgres :
141
+ // PostgreSQL connection string format: postgresql://user:pass@host:port/db?param1=value1¶m2=value2
142
+ connStr = fmt .Sprintf ("postgresql://%s%s:%d/%s" , auth , dataSource .Host , dataSource .Port , dataSource .Database )
143
+ case DriverSnowflake :
144
+ // Snowflake connection string format: user:pass@host:port/database?param1=value1¶m2=value2
145
+ connStr = fmt .Sprintf ("%s%s:%d/%s" , auth , dataSource .Host , dataSource .Port , dataSource .Database )
146
+ case DriverSQLServer :
147
+ // SQL Server connection string format: sqlserver://username:password@host:port/instance
148
+
149
+ // replace all backslashes with forward slashes
150
+ host := strings .ReplaceAll (dataSource .Host , "\\ " , "/" )
151
+ // if host contains a "/", split it into hostname and instance
152
+ parts := strings .SplitN (host , "/" , 2 )
153
+ hostname := parts [0 ]
154
+ var instance string
155
+ if len (parts ) > 1 {
156
+ instance = parts [1 ]
157
+ }
158
+ query .Set ("database" , dataSource .Database )
159
+ if instance != "" {
160
+ connStr = fmt .Sprintf ("sqlserver://%s%s:%d/%s" , auth , hostname , dataSource .Port , instance )
161
+ } else {
162
+ connStr = fmt .Sprintf ("sqlserver://%s%s:%d" , auth , hostname , dataSource .Port )
163
+ }
164
+ case DriverTDS :
165
+ // TDS connection string format: tds://user:pass@host:port/database
166
+ connStr = fmt .Sprintf ("tds://%s%s:%d/%s" , auth , dataSource .Host , dataSource .Port , dataSource .Database )
167
+ default :
168
+ return "" , fmt .Errorf ("unsupported driver: %s" , driver )
242
169
}
243
170
244
- connStr := fmt . Sprintf ( "oracle://%s%s:%d/%s" , auth , conn . Host , conn . Port , conn . Database )
171
+ // Append query parameters if any exist
245
172
if len (query ) > 0 {
246
173
connStr += "?" + query .Encode ()
247
174
}
0 commit comments