diff --git a/api/package.json b/api/package.json index 50fc4c62a..aefe18dd4 100644 --- a/api/package.json +++ b/api/package.json @@ -9,7 +9,8 @@ "cross-env": "^6.0.3", "eslint": "^6.8.0", "express": "^4.17.1", - "mssql": "^6.0.1" + "mssql": "^6.0.1", + "mysql": "^2.17.1" }, "scripts": { "start": "nodemon src/index.js" diff --git a/api/src/connectProcess.js b/api/src/connectProcess.js index 256470e7f..5a1b716d9 100644 --- a/api/src/connectProcess.js +++ b/api/src/connectProcess.js @@ -1,12 +1,8 @@ -const mssql = require('mssql'); - process.on('message', async connection => { - const { server, port, user, password } = connection; try { - const pool = await mssql.connect({ server, port, user, password }); - const resp = await pool.request().query('SELECT @@VERSION AS version'); - const { version } = resp.recordset[0]; - process.send({ version }); + const connectFunc = require(`./engines/${connection.engine}/connect`); + const res = await connectFunc(connection); + process.send(res); } catch (e) { process.send({ error: e.message }); } diff --git a/api/src/engines/mssql/connect.js b/api/src/engines/mssql/connect.js new file mode 100644 index 000000000..81992a6e4 --- /dev/null +++ b/api/src/engines/mssql/connect.js @@ -0,0 +1,8 @@ +const mssql = require('mssql'); + +module.exports = async function connect({ server, port, user, password }) { + const pool = await mssql.connect({ server, port, user, password }); + const resp = await pool.request().query('SELECT @@VERSION AS version'); + const { version } = resp.recordset[0]; + return { version }; +}; diff --git a/api/src/engines/mysql/connect.js b/api/src/engines/mysql/connect.js new file mode 100644 index 000000000..2ccf592fa --- /dev/null +++ b/api/src/engines/mysql/connect.js @@ -0,0 +1,12 @@ +const mysql = require('mysql'); + +module.exports = function connect({ server, port, user, password }) { + return new Promise((resolve, reject) => { + const connection = mysql.createConnection({ host: server, port, user, password }); + connection.query("show variables like 'version'", function(error, results, fields) { + if (error) reject(error); + const version = results[0].Value; + resolve({ version }); + }); + }); +}; diff --git a/api/yarn.lock b/api/yarn.lock index f2a77cf33..80a5713c7 100644 --- a/api/yarn.lock +++ b/api/yarn.lock @@ -237,6 +237,11 @@ bcrypt-pbkdf@^1.0.0: dependencies: tweetnacl "^0.14.3" +bignumber.js@7.2.1: + version "7.2.1" + resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-7.2.1.tgz#80c048759d826800807c4bfd521e50edbba57a5f" + integrity sha512-S4XzBk5sMB+Rcb/LNcpzXr57VRTxgAvaAEDAl1AwRx27j00hT84O6OkteE7u8UB3NuaaygCRrEpqox4uDOrbdQ== + binary-extensions@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.0.0.tgz#23c0df14f6a88077f5f986c0d167ec03c3d5537c" @@ -432,7 +437,7 @@ cookie@0.4.0: resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.0.tgz#beb437e7022b3b6d49019d088665303ebe9c14ba" integrity sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg== -core-util-is@1.0.2: +core-util-is@1.0.2, core-util-is@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= @@ -1090,7 +1095,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@2.0.4, inherits@^2.0.3: +inherits@2, inherits@2.0.4, inherits@^2.0.3, inherits@~2.0.3: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -1225,6 +1230,11 @@ is-typedarray@~1.0.0: resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= +isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= + isexe@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" @@ -1435,6 +1445,16 @@ mute-stream@0.0.8: resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== +mysql@^2.17.1: + version "2.17.1" + resolved "https://registry.yarnpkg.com/mysql/-/mysql-2.17.1.tgz#62bba4a039a9b2f73638cd1652ce50fc6f682899" + integrity sha512-7vMqHQ673SAk5C8fOzTG2LpPcf3bNt0oL3sFpxPEEFp1mdlDcrLK0On7z8ZYKaaHrHwNcQ/MTUz7/oobZ2OyyA== + dependencies: + bignumber.js "7.2.1" + readable-stream "2.3.6" + safe-buffer "5.1.2" + sqlstring "2.3.1" + native-duplexpair@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/native-duplexpair/-/native-duplexpair-1.0.0.tgz#7899078e64bf3c8a3d732601b3d40ff05db58fa0" @@ -1615,6 +1635,11 @@ prepend-http@^1.0.1: resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" integrity sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw= +process-nextick-args@~2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== + progress@^2.0.0: version "2.0.3" resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" @@ -1688,6 +1713,19 @@ rc@^1.0.1, rc@^1.1.6: minimist "^1.2.0" strip-json-comments "~2.0.1" +readable-stream@2.3.6: + version "2.3.6" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" + integrity sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + readable-stream@^3.0.1, readable-stream@^3.4.0: version "3.4.0" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.4.0.tgz#a51c26754658e0a3c21dbf59163bd45ba6f447fc" @@ -1789,7 +1827,7 @@ safe-buffer@*, safe-buffer@^5.0.1, safe-buffer@^5.1.2, safe-buffer@~5.2.0: resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.0.tgz#b74daec49b1148f88c64b68d49b1e815c1f2f519" integrity sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg== -safe-buffer@5.1.2: +safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== @@ -1903,6 +1941,11 @@ sprintf-js@~1.0.2: resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= +sqlstring@2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/sqlstring/-/sqlstring-2.3.1.tgz#475393ff9e91479aea62dcaf0ca3d14983a7fb40" + integrity sha1-R1OT/56RR5rqYtyvDKPRSYOn+0A= + sshpk@^1.7.0: version "1.16.1" resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877" @@ -1956,6 +1999,13 @@ string_decoder@^1.1.1: dependencies: safe-buffer "~5.2.0" +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + strip-ansi@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" @@ -2196,7 +2246,7 @@ url-parse-lax@^1.0.0: dependencies: prepend-http "^1.0.1" -util-deprecate@^1.0.1: +util-deprecate@^1.0.1, util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= diff --git a/web/src/modals/ConnectionModal.js b/web/src/modals/ConnectionModal.js index 7c8b3d646..b5f81d065 100644 --- a/web/src/modals/ConnectionModal.js +++ b/web/src/modals/ConnectionModal.js @@ -1,7 +1,7 @@ import React from 'react'; import axios from 'axios'; import ModalBase from './ModalBase'; -import { FormRow, FormLabel, FormValue, FormTextField, FormSubmit } from '../utility/forms'; +import { FormRow, FormLabel, FormValue, FormTextField, FormSelectField, FormSubmit } from '../utility/forms'; import { TextField } from '../utility/inputs'; import { Formik, Form } from 'formik'; // import FormikForm from '../utility/FormikForm'; @@ -21,8 +21,13 @@ export default function ConnectionModal({ modalState }) { return (

Add connection

- +
+ + + + + diff --git a/web/src/utility/forms.js b/web/src/utility/forms.js index d7712ef76..b27b95771 100644 --- a/web/src/utility/forms.js +++ b/web/src/utility/forms.js @@ -1,6 +1,6 @@ import React from 'react'; import styled from 'styled-components'; -import { TextField } from './inputs'; +import { TextField, SelectField } from './inputs'; import { Field } from 'formik'; export const FormRow = styled.div` @@ -26,10 +26,23 @@ export function FormTextField({ label, ...other }) { ); } -export function FormSubmit({text}) { +export function FormSelectField({ label, children, ...other }) { return ( - + {label} + + + {children} + + + + ); +} + +export function FormSubmit({ text }) { + return ( + + ); } diff --git a/web/src/utility/inputs.js b/web/src/utility/inputs.js index 2d9426509..ba3deee87 100644 --- a/web/src/utility/inputs.js +++ b/web/src/utility/inputs.js @@ -3,3 +3,11 @@ import React from 'react'; export function TextField({ ...other }) { return ; } + +export function SelectField({ children, ...other }) { + return ( + + ); +}