mirror of
https://github.com/Fabio286/antares.git
synced 2025-06-05 21:59:22 +02:00
Compare commits
31 Commits
Author | SHA1 | Date | |
---|---|---|---|
0b861d962d | |||
6cc098c6f0 | |||
40828cb3ff | |||
6086ca4a80 | |||
d92facf518 | |||
|
e9643a0d6b | ||
|
cc609a7051 | ||
796f61bf2f | |||
0f9c991f53 | |||
638a88a1fb | |||
026d74c8c8 | |||
77f8cac6cf | |||
d6fadf5db0 | |||
408ddeda56 | |||
88cd097ec0 | |||
f12e6a96dd | |||
a8ca8f2f76 | |||
|
6fcae957e1 | ||
|
1cd2d8abf3 | ||
ed3c5fe559 | |||
|
9601c59392 | ||
|
14d20a30c1 | ||
42376b4bc6 | |||
e9079adb25 | |||
86f011f34f | |||
bb02479b71 | |||
a67071e284 | |||
8f3efabb69 | |||
db628f7722 | |||
e4bd747381 | |||
88eb113e53 |
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"projectName": "antares",
|
"projectName": "antares",
|
||||||
"projectOwner": "Fabio286",
|
"projectOwner": "antares-sql",
|
||||||
"repoType": "github",
|
"repoType": "github",
|
||||||
"repoHost": "https://github.com",
|
"repoHost": "https://github.com",
|
||||||
"files": [
|
"files": [
|
||||||
@@ -147,6 +147,24 @@
|
|||||||
"contributions": [
|
"contributions": [
|
||||||
"code"
|
"code"
|
||||||
]
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "SmileYzn",
|
||||||
|
"name": "Cleverson",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/5851851?v=4",
|
||||||
|
"profile": "https://github.com/SmileYzn",
|
||||||
|
"contributions": [
|
||||||
|
"translation"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "fredatgithub",
|
||||||
|
"name": "fred",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/6720055?v=4",
|
||||||
|
"profile": "https://github.com/fredatgithub",
|
||||||
|
"contributions": [
|
||||||
|
"translation"
|
||||||
|
]
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"contributorsPerLine": 7,
|
"contributorsPerLine": 7,
|
||||||
|
5
.github/ISSUE_TEMPLATE/bug_report.md
vendored
5
.github/ISSUE_TEMPLATE/bug_report.md
vendored
@@ -26,13 +26,14 @@ If applicable, add screenshots to help explain your problem.
|
|||||||
|
|
||||||
**Application (please complete the following information):**
|
**Application (please complete the following information):**
|
||||||
|
|
||||||
|
- Client [e.g. MySQL]
|
||||||
- Version [e.g. 0.14.0]
|
- Version [e.g. 0.14.0]
|
||||||
- Distribution: [e.g. exe, Linux Store, AppImage, dmg]
|
- Distribution: [e.g. exe, Linux Store, AppImage, dmg]
|
||||||
|
|
||||||
**Desktop (please complete the following information):**
|
**Desktop (please complete the following information):**
|
||||||
|
|
||||||
- OS: [e.g. iOS]
|
- OS: [e.g. Windows 11]
|
||||||
- Version [e.g. 22]
|
- Version [e.g. 21H2]
|
||||||
|
|
||||||
**Additional context**
|
**Additional context**
|
||||||
Add any other context about the problem here.
|
Add any other context about the problem here.
|
||||||
|
40
CHANGELOG.md
40
CHANGELOG.md
@@ -2,6 +2,46 @@
|
|||||||
|
|
||||||
All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
|
All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
|
||||||
|
|
||||||
|
### [0.5.2](https://github.com/antares-sql/antares/compare/v0.5.1...v0.5.2) (2022-04-10)
|
||||||
|
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* **core:** option to allow untrusted SSL connections ([6cc098c](https://github.com/antares-sql/antares/commit/6cc098c6f02fb52cc71c0141431ab75f12744a1c))
|
||||||
|
* french translation updated, closes [#222](https://github.com/antares-sql/antares/issues/222) ([796f61b](https://github.com/antares-sql/antares/commit/796f61bf2feab0da515901e2137dc7bf04371d7d))
|
||||||
|
* **PostgreSQL:** export functions and procedures ([a8ca8f2](https://github.com/antares-sql/antares/commit/a8ca8f2f76ab36c4afe84d602709386315f4b7d1))
|
||||||
|
* **PostgreSQL:** export tables ([a67071e](https://github.com/antares-sql/antares/commit/a67071e28470bcbd0ec26780bb86f3c65750ded8))
|
||||||
|
* **PostgreSQL:** export triggers ([42376b4](https://github.com/antares-sql/antares/commit/42376b4bc6dd8b630402d09b026d9fbc0b8646bb))
|
||||||
|
* **PostgreSQL:** export user-defined types before tables ([bb02479](https://github.com/antares-sql/antares/commit/bb02479b71bf75a6e69e28af57c5fe213d3f30bc))
|
||||||
|
* **PostgreSQL:** export views ([86f011f](https://github.com/antares-sql/antares/commit/86f011f34fec9d6829bce324493fea888a863ffc))
|
||||||
|
* **PostgreSQL:** sql dump importer ([6086ca4](https://github.com/antares-sql/antares/commit/6086ca4a80b9ad6a07086446253d781f052d3abc))
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* **PostgreSQL:** wrong values exporting table content ([0f9c991](https://github.com/antares-sql/antares/commit/0f9c991f539560913fa0e9361a16e6448a066a27))
|
||||||
|
* ssh tunnel not properly working, closes [#220](https://github.com/antares-sql/antares/issues/220) ([026d74c](https://github.com/antares-sql/antares/commit/026d74c8c88c605a3c8c963c211078f5b3dcfda1))
|
||||||
|
|
||||||
|
|
||||||
|
### Improvements
|
||||||
|
|
||||||
|
* **PostgreSQL:** improved dump file ([408dded](https://github.com/antares-sql/antares/commit/408ddeda5634ab6bf41eff760271669170b60eb6))
|
||||||
|
* **PostgreSQL:** improved views exportation ([638a88a](https://github.com/antares-sql/antares/commit/638a88a1fb35c048ff4c6d120aaaef831c846f58))
|
||||||
|
|
||||||
|
### [0.5.1](https://github.com/Fabio286/antares/compare/v0.5.0...v0.5.1) (2022-03-25)
|
||||||
|
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* export database as zip sql file ([8f3efab](https://github.com/Fabio286/antares/commit/8f3efabb6962c55c23a43c8da1433185dbc3fb41))
|
||||||
|
* **UI:** option to disable blur effects, closes [#209](https://github.com/Fabio286/antares/issues/209) ([e9079ad](https://github.com/Fabio286/antares/commit/e9079adb25ec28e9546acd54bc2565b8d6e28120))
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* numeric scale displayed on non decimal fields ([db628f7](https://github.com/Fabio286/antares/commit/db628f77226b161c3df31b7450b92a6e58754ab7))
|
||||||
|
* **UI:** connection buttons out of screen on small displays, closes [#213](https://github.com/Fabio286/antares/issues/213) ([f12e6a9](https://github.com/Fabio286/antares/commit/f12e6a96dd66140b06c55eda775af48a666627dd))
|
||||||
|
|
||||||
## [0.5.0](https://github.com/Fabio286/antares/compare/v0.4.4...v0.5.0) (2022-03-12)
|
## [0.5.0](https://github.com/Fabio286/antares/compare/v0.4.4...v0.5.0) (2022-03-12)
|
||||||
|
|
||||||
|
|
||||||
|
20
README.md
20
README.md
@@ -32,13 +32,14 @@ We are actively working on it, hoping to provide new cool features, improvements
|
|||||||
- Query history: search through the last 1000 queries.
|
- Query history: search through the last 1000 queries.
|
||||||
- SSH tunnel support.
|
- SSH tunnel support.
|
||||||
- Manual commit mode.
|
- Manual commit mode.
|
||||||
|
- Import and export database dumps.
|
||||||
- Dark and light theme.
|
- Dark and light theme.
|
||||||
- Editor themes.
|
- Editor themes.
|
||||||
|
|
||||||
## Philosophy
|
## Philosophy
|
||||||
|
|
||||||
Why are we developing an SQL client when there are a lot of them on the market?
|
Why are we developing an SQL client when there are a lot of them on the market?
|
||||||
The main goal is to develop a totally free, full featured, cross platform and open source alternative, empowered by JavaScript's ecosystem.
|
The main goal is to develop a **forever 100% free (without paid premium feature)**, full featured, as possible community driven, cross platform and open source alternative, empowered by JavaScript ecosystem.
|
||||||
A modern application created with minimalism and semplicity in mind, with features in the right places, not hundreds of tiny buttons, nested tabs or submenu; productivity comes first.
|
A modern application created with minimalism and semplicity in mind, with features in the right places, not hundreds of tiny buttons, nested tabs or submenu; productivity comes first.
|
||||||
|
|
||||||
## Installation
|
## Installation
|
||||||
@@ -71,7 +72,6 @@ This is a roadmap with major features will come in near future.
|
|||||||
- Users management (add/edit/delete).
|
- Users management (add/edit/delete).
|
||||||
- More context menu shortcuts.
|
- More context menu shortcuts.
|
||||||
- More keyboard shortcuts.
|
- More keyboard shortcuts.
|
||||||
- Import/export and migration.
|
|
||||||
- Support for other databases.
|
- Support for other databases.
|
||||||
- Apple Silicon distribution
|
- Apple Silicon distribution
|
||||||
|
|
||||||
@@ -104,7 +104,7 @@ This is a roadmap with major features will come in near future.
|
|||||||
|
|
||||||
- 🌍 [Translate Antares](https://github.com/Fabio286/antares/wiki/Translate-Antares)
|
- 🌍 [Translate Antares](https://github.com/Fabio286/antares/wiki/Translate-Antares)
|
||||||
- 📖 [Contributors Guide](https://github.com/Fabio286/antares/wiki/Contributors-Guide)
|
- 📖 [Contributors Guide](https://github.com/Fabio286/antares/wiki/Contributors-Guide)
|
||||||
- 🚧 [Project Board](https://github.com/users/Fabio286/projects/1)
|
- 🚧 [Project Board](https://github.com/antares-sql/antares/projects/1)
|
||||||
|
|
||||||
## Contributors ✨
|
## Contributors ✨
|
||||||
|
|
||||||
@@ -115,9 +115,9 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
|
|||||||
<!-- markdownlint-disable -->
|
<!-- markdownlint-disable -->
|
||||||
<table>
|
<table>
|
||||||
<tr>
|
<tr>
|
||||||
<td align="center"><a href="https://fabiodistasio.it/"><img src="https://avatars.githubusercontent.com/u/31471771?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Fabio Di Stasio</b></sub></a><br /><a href="https://github.com/Fabio286/antares/commits?author=Fabio286" title="Code">💻</a> <a href="#translation-Fabio286" title="Translation">🌍</a> <a href="https://github.com/Fabio286/antares/commits?author=Fabio286" title="Documentation">📖</a></td>
|
<td align="center"><a href="https://fabiodistasio.it/"><img src="https://avatars.githubusercontent.com/u/31471771?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Fabio Di Stasio</b></sub></a><br /><a href="https://github.com/antares-sql/antares/commits?author=Fabio286" title="Code">💻</a> <a href="#translation-Fabio286" title="Translation">🌍</a> <a href="https://github.com/antares-sql/antares/commits?author=Fabio286" title="Documentation">📖</a></td>
|
||||||
<td align="center"><a href="https://www.linkedin.com/in/giulioganci/"><img src="https://avatars.githubusercontent.com/u/4192159?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Giulio Ganci</b></sub></a><br /><a href="https://github.com/Fabio286/antares/commits?author=toriphes" title="Code">💻</a></td>
|
<td align="center"><a href="https://www.linkedin.com/in/giulioganci/"><img src="https://avatars.githubusercontent.com/u/4192159?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Giulio Ganci</b></sub></a><br /><a href="https://github.com/antares-sql/antares/commits?author=toriphes" title="Code">💻</a></td>
|
||||||
<td align="center"><a href="https://christianratz.de/"><img src="https://avatars.githubusercontent.com/u/2630316?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Christian Ratz</b></sub></a><br /><a href="https://github.com/Fabio286/antares/commits?author=digitalgopnik" title="Code">💻</a> <a href="#translation-digitalgopnik" title="Translation">🌍</a></td>
|
<td align="center"><a href="https://christianratz.de/"><img src="https://avatars.githubusercontent.com/u/2630316?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Christian Ratz</b></sub></a><br /><a href="https://github.com/antares-sql/antares/commits?author=digitalgopnik" title="Code">💻</a> <a href="#translation-digitalgopnik" title="Translation">🌍</a></td>
|
||||||
<td align="center"><a href="https://reverb6821.github.io/"><img src="https://avatars.githubusercontent.com/u/55198803?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Giuseppe Gigliotti</b></sub></a><br /><a href="#translation-reverb6821" title="Translation">🌍</a></td>
|
<td align="center"><a href="https://reverb6821.github.io/"><img src="https://avatars.githubusercontent.com/u/55198803?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Giuseppe Gigliotti</b></sub></a><br /><a href="#translation-reverb6821" title="Translation">🌍</a></td>
|
||||||
<td align="center"><a href="https://github.com/Mohd-PH"><img src="https://avatars.githubusercontent.com/u/9362157?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Mohd-PH</b></sub></a><br /><a href="#translation-Mohd-PH" title="Translation">🌍</a></td>
|
<td align="center"><a href="https://github.com/Mohd-PH"><img src="https://avatars.githubusercontent.com/u/9362157?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Mohd-PH</b></sub></a><br /><a href="#translation-Mohd-PH" title="Translation">🌍</a></td>
|
||||||
<td align="center"><a href="https://github.com/hongkfui"><img src="https://avatars.githubusercontent.com/u/37477191?v=4?s=100" width="100px;" alt=""/><br /><sub><b>hongkfui</b></sub></a><br /><a href="#translation-hongkfui" title="Translation">🌍</a></td>
|
<td align="center"><a href="https://github.com/hongkfui"><img src="https://avatars.githubusercontent.com/u/37477191?v=4?s=100" width="100px;" alt=""/><br /><sub><b>hongkfui</b></sub></a><br /><a href="#translation-hongkfui" title="Translation">🌍</a></td>
|
||||||
@@ -128,12 +128,14 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
|
|||||||
<td align="center"><a href="https://ngoquocdat.com/"><img src="https://avatars.githubusercontent.com/u/56961917?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Ngô Quốc Đạt</b></sub></a><br /><a href="#translation-datlechin" title="Translation">🌍</a></td>
|
<td align="center"><a href="https://ngoquocdat.com/"><img src="https://avatars.githubusercontent.com/u/56961917?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Ngô Quốc Đạt</b></sub></a><br /><a href="#translation-datlechin" title="Translation">🌍</a></td>
|
||||||
<td align="center"><a href="https://github.com/IsamuSugi"><img src="https://avatars.githubusercontent.com/u/7746658?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Isamu Sugiura</b></sub></a><br /><a href="#translation-IsamuSugi" title="Translation">🌍</a></td>
|
<td align="center"><a href="https://github.com/IsamuSugi"><img src="https://avatars.githubusercontent.com/u/7746658?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Isamu Sugiura</b></sub></a><br /><a href="#translation-IsamuSugi" title="Translation">🌍</a></td>
|
||||||
<td align="center"><a href="http://rsacchetto.nexxontech.it/"><img src="https://avatars.githubusercontent.com/u/18429412?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Riccardo Sacchetto</b></sub></a><br /><a href="#platform-Occhioverde" title="Packaging/porting to new platform">📦</a></td>
|
<td align="center"><a href="http://rsacchetto.nexxontech.it/"><img src="https://avatars.githubusercontent.com/u/18429412?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Riccardo Sacchetto</b></sub></a><br /><a href="#platform-Occhioverde" title="Packaging/porting to new platform">📦</a></td>
|
||||||
<td align="center"><a href="https://kilianstallinger.com"><img src="https://avatars.githubusercontent.com/u/5290318?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Kilian Stallinger</b></sub></a><br /><a href="https://github.com/Fabio286/antares/commits?author=kilianstallz" title="Code">💻</a></td>
|
<td align="center"><a href="https://kilianstallinger.com"><img src="https://avatars.githubusercontent.com/u/5290318?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Kilian Stallinger</b></sub></a><br /><a href="https://github.com/antares-sql/antares/commits?author=kilianstallz" title="Code">💻</a></td>
|
||||||
<td align="center"><a href="https://github.com/wenj91"><img src="https://avatars.githubusercontent.com/u/12549338?v=4?s=100" width="100px;" alt=""/><br /><sub><b>文杰</b></sub></a><br /><a href="https://github.com/Fabio286/antares/commits?author=wenj91" title="Code">💻</a></td>
|
<td align="center"><a href="https://github.com/wenj91"><img src="https://avatars.githubusercontent.com/u/12549338?v=4?s=100" width="100px;" alt=""/><br /><sub><b>文杰</b></sub></a><br /><a href="https://github.com/antares-sql/antares/commits?author=wenj91" title="Code">💻</a></td>
|
||||||
<td align="center"><a href="https://github.com/goYou"><img src="https://avatars.githubusercontent.com/u/62732795?v=4?s=100" width="100px;" alt=""/><br /><sub><b>goYou</b></sub></a><br /><a href="#translation-goYou" title="Translation">🌍</a></td>
|
<td align="center"><a href="https://github.com/goYou"><img src="https://avatars.githubusercontent.com/u/62732795?v=4?s=100" width="100px;" alt=""/><br /><sub><b>goYou</b></sub></a><br /><a href="#translation-goYou" title="Translation">🌍</a></td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td align="center"><a href="https://github.com/raliqala"><img src="https://avatars.githubusercontent.com/u/30502407?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Topollo</b></sub></a><br /><a href="https://github.com/Fabio286/antares/commits?author=raliqala" title="Code">💻</a></td>
|
<td align="center"><a href="https://github.com/raliqala"><img src="https://avatars.githubusercontent.com/u/30502407?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Topollo</b></sub></a><br /><a href="https://github.com/antares-sql/antares/commits?author=raliqala" title="Code">💻</a></td>
|
||||||
|
<td align="center"><a href="https://github.com/SmileYzn"><img src="https://avatars.githubusercontent.com/u/5851851?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Cleverson</b></sub></a><br /><a href="#translation-SmileYzn" title="Translation">🌍</a></td>
|
||||||
|
<td align="center"><a href="https://github.com/fredatgithub"><img src="https://avatars.githubusercontent.com/u/6720055?v=4?s=100" width="100px;" alt=""/><br /><sub><b>fred</b></sub></a><br /><a href="#translation-fredatgithub" title="Translation">🌍</a></td>
|
||||||
</tr>
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
|
|
||||||
|
@@ -1,10 +1,10 @@
|
|||||||
{
|
{
|
||||||
"name": "antares",
|
"name": "antares",
|
||||||
"productName": "Antares",
|
"productName": "Antares",
|
||||||
"version": "0.5.0",
|
"version": "0.5.2",
|
||||||
"description": "A modern, fast and productivity driven SQL client with a focus in UX.",
|
"description": "A modern, fast and productivity driven SQL client with a focus in UX.",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"repository": "https://github.com/Fabio286/antares.git",
|
"repository": "https://github.com/antares-sql/antares.git",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"debug": "npm run rebuild:electron && npm run debug-runner",
|
"debug": "npm run rebuild:electron && npm run debug-runner",
|
||||||
"debug-runner": "node scripts/devRunner.js --remote-debug",
|
"debug-runner": "node scripts/devRunner.js --remote-debug",
|
||||||
@@ -52,8 +52,7 @@
|
|||||||
"target": {
|
"target": {
|
||||||
"target": "default",
|
"target": "default",
|
||||||
"arch": [
|
"arch": [
|
||||||
"x64",
|
"x64"
|
||||||
"arm64"
|
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -121,6 +120,7 @@
|
|||||||
"moment": "^2.29.1",
|
"moment": "^2.29.1",
|
||||||
"mysql2": "^2.3.2",
|
"mysql2": "^2.3.2",
|
||||||
"pg": "^8.7.1",
|
"pg": "^8.7.1",
|
||||||
|
"pg-query-stream": "^4.2.3",
|
||||||
"pgsql-ast-parser": "^7.2.1",
|
"pgsql-ast-parser": "^7.2.1",
|
||||||
"source-map-support": "^0.5.20",
|
"source-map-support": "^0.5.20",
|
||||||
"spectre.css": "^0.5.9",
|
"spectre.css": "^0.5.9",
|
||||||
|
@@ -39,6 +39,7 @@ module.exports = {
|
|||||||
schemaEdit: false,
|
schemaEdit: false,
|
||||||
schemaDrop: false,
|
schemaDrop: false,
|
||||||
schemaExport: false,
|
schemaExport: false,
|
||||||
|
exportByChunks: false,
|
||||||
schemaImport: false,
|
schemaImport: false,
|
||||||
tableSettings: false,
|
tableSettings: false,
|
||||||
tableOptions: false,
|
tableOptions: false,
|
||||||
|
@@ -35,6 +35,7 @@ module.exports = {
|
|||||||
schemaEdit: true,
|
schemaEdit: true,
|
||||||
schemaDrop: true,
|
schemaDrop: true,
|
||||||
schemaExport: true,
|
schemaExport: true,
|
||||||
|
exportByChunks: true,
|
||||||
schemaImport: true,
|
schemaImport: true,
|
||||||
tableSettings: true,
|
tableSettings: true,
|
||||||
viewSettings: true,
|
viewSettings: true,
|
||||||
|
@@ -31,9 +31,9 @@ module.exports = {
|
|||||||
routineAdd: true,
|
routineAdd: true,
|
||||||
functionAdd: true,
|
functionAdd: true,
|
||||||
schemaDrop: true,
|
schemaDrop: true,
|
||||||
|
schemaExport: true,
|
||||||
|
schemaImport: true,
|
||||||
databaseEdit: false,
|
databaseEdit: false,
|
||||||
schemaExport: false,
|
|
||||||
schemaImport: false,
|
|
||||||
tableSettings: true,
|
tableSettings: true,
|
||||||
viewSettings: true,
|
viewSettings: true,
|
||||||
triggerSettings: true,
|
triggerSettings: true,
|
||||||
|
@@ -24,7 +24,8 @@ export default connections => {
|
|||||||
key: conn.key ? fs.readFileSync(conn.key) : null,
|
key: conn.key ? fs.readFileSync(conn.key) : null,
|
||||||
cert: conn.cert ? fs.readFileSync(conn.cert) : null,
|
cert: conn.cert ? fs.readFileSync(conn.cert) : null,
|
||||||
ca: conn.ca ? fs.readFileSync(conn.ca) : null,
|
ca: conn.ca ? fs.readFileSync(conn.ca) : null,
|
||||||
ciphers: conn.ciphers
|
ciphers: conn.ciphers,
|
||||||
|
rejectUnauthorized: !conn.untrustedConnection
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -84,7 +85,8 @@ export default connections => {
|
|||||||
key: conn.key ? fs.readFileSync(conn.key) : null,
|
key: conn.key ? fs.readFileSync(conn.key) : null,
|
||||||
cert: conn.cert ? fs.readFileSync(conn.cert) : null,
|
cert: conn.cert ? fs.readFileSync(conn.cert) : null,
|
||||||
ca: conn.ca ? fs.readFileSync(conn.ca) : null,
|
ca: conn.ca ? fs.readFileSync(conn.ca) : null,
|
||||||
ciphers: conn.ciphers
|
ciphers: conn.ciphers,
|
||||||
|
rejectUnauthorized: !conn.untrustedConnection
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -151,6 +151,8 @@ export class MySQLClient extends AntaresCore {
|
|||||||
remoteAddr: this._params.host,
|
remoteAddr: this._params.host,
|
||||||
remotePort: this._params.port
|
remotePort: this._params.port
|
||||||
});
|
});
|
||||||
|
|
||||||
|
dbConfig.host = this._ssh.config.host;
|
||||||
dbConfig.port = tunnel.localPort;
|
dbConfig.port = tunnel.localPort;
|
||||||
}
|
}
|
||||||
catch (err) {
|
catch (err) {
|
||||||
@@ -505,7 +507,7 @@ export class MySQLClient extends AntaresCore {
|
|||||||
schema: field.TABLE_SCHEMA,
|
schema: field.TABLE_SCHEMA,
|
||||||
table: field.TABLE_NAME,
|
table: field.TABLE_NAME,
|
||||||
numPrecision: field.NUMERIC_PRECISION,
|
numPrecision: field.NUMERIC_PRECISION,
|
||||||
numScale: field.NUMERIC_SCALE,
|
numScale: Number(field.NUMERIC_SCALE),
|
||||||
numLength,
|
numLength,
|
||||||
enumValues,
|
enumValues,
|
||||||
datePrecision: field.DATETIME_PRECISION,
|
datePrecision: field.DATETIME_PRECISION,
|
||||||
|
@@ -96,6 +96,8 @@ export class PostgreSQLClient extends AntaresCore {
|
|||||||
remoteAddr: this._params.host,
|
remoteAddr: this._params.host,
|
||||||
remotePort: this._params.port
|
remotePort: this._params.port
|
||||||
});
|
});
|
||||||
|
|
||||||
|
dbConfig.host = this._ssh.config.host;
|
||||||
dbConfig.port = tunnel.localPort;
|
dbConfig.port = tunnel.localPort;
|
||||||
}
|
}
|
||||||
catch (err) {
|
catch (err) {
|
||||||
@@ -570,7 +572,7 @@ export class PostgreSQLClient extends AntaresCore {
|
|||||||
* @memberof MySQLClient
|
* @memberof MySQLClient
|
||||||
*/
|
*/
|
||||||
async dropSchema (params) {
|
async dropSchema (params) {
|
||||||
return await this.raw(`DROP SCHEMA "${params.database}"`);
|
return await this.raw(`DROP SCHEMA "${params.database}" CASCADE`);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@@ -1,4 +1,5 @@
|
|||||||
import fs from 'fs';
|
import fs from 'fs';
|
||||||
|
import { createGzip } from 'zlib';
|
||||||
import path from 'path';
|
import path from 'path';
|
||||||
import EventEmitter from 'events';
|
import EventEmitter from 'events';
|
||||||
|
|
||||||
@@ -8,12 +9,19 @@ export class BaseExporter extends EventEmitter {
|
|||||||
this._tables = tables;
|
this._tables = tables;
|
||||||
this._options = options;
|
this._options = options;
|
||||||
this._isCancelled = false;
|
this._isCancelled = false;
|
||||||
this._outputStream = fs.createWriteStream(this._options.outputFile, {
|
this._outputFileStream = fs.createWriteStream(this._options.outputFile, { flags: 'w' });
|
||||||
flags: 'w'
|
this._processedStream = null;
|
||||||
});
|
|
||||||
this._state = {};
|
this._state = {};
|
||||||
|
|
||||||
this._outputStream.once('error', err => {
|
if (this._options.outputFormat === 'sql.zip') {
|
||||||
|
const outputZipStream = createGzip();
|
||||||
|
outputZipStream.pipe(this._outputFileStream);
|
||||||
|
this._processedStream = outputZipStream;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
this._processedStream = this._outputFileStream;
|
||||||
|
|
||||||
|
this._processedStream.once('error', err => {
|
||||||
this._isCancelled = true;
|
this._isCancelled = true;
|
||||||
this.emit('error', err);
|
this.emit('error', err);
|
||||||
});
|
});
|
||||||
@@ -29,7 +37,7 @@ export class BaseExporter extends EventEmitter {
|
|||||||
throw err;
|
throw err;
|
||||||
}
|
}
|
||||||
finally {
|
finally {
|
||||||
this._outputStream.end();
|
this._processedStream.end();
|
||||||
this.emit('end');
|
this.emit('end');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -68,7 +76,7 @@ export class BaseExporter extends EventEmitter {
|
|||||||
const fileName = path.basename(this._options.outputFile);
|
const fileName = path.basename(this._options.outputFile);
|
||||||
this.emit('error', `The file ${fileName} is not accessible`);
|
this.emit('error', `The file ${fileName} is not accessible`);
|
||||||
}
|
}
|
||||||
this._outputStream.write(data);
|
this._processedStream.write(data);
|
||||||
}
|
}
|
||||||
|
|
||||||
dump () {
|
dump () {
|
||||||
|
@@ -6,6 +6,12 @@ import moment from 'moment';
|
|||||||
import { lineString, point, polygon } from '@turf/helpers';
|
import { lineString, point, polygon } from '@turf/helpers';
|
||||||
|
|
||||||
export default class MysqlExporter extends SqlExporter {
|
export default class MysqlExporter extends SqlExporter {
|
||||||
|
constructor (...args) {
|
||||||
|
super(...args);
|
||||||
|
|
||||||
|
this._commentChar = '#';
|
||||||
|
}
|
||||||
|
|
||||||
async getSqlHeader () {
|
async getSqlHeader () {
|
||||||
let dump = await super.getSqlHeader();
|
let dump = await super.getSqlHeader();
|
||||||
dump += `
|
dump += `
|
||||||
|
495
src/main/libs/exporters/sql/PostgreSQLExporter.js
Normal file
495
src/main/libs/exporters/sql/PostgreSQLExporter.js
Normal file
@@ -0,0 +1,495 @@
|
|||||||
|
import { SqlExporter } from './SqlExporter';
|
||||||
|
import { BLOB, BIT, DATE, DATETIME, FLOAT, NUMBER, TEXT_SEARCH } from 'common/fieldTypes';
|
||||||
|
import hexToBinary from 'common/libs/hexToBinary';
|
||||||
|
import { getArrayDepth } from 'common/libs/getArrayDepth';
|
||||||
|
import moment from 'moment';
|
||||||
|
import { lineString, point, polygon } from '@turf/helpers';
|
||||||
|
import QueryStream from 'pg-query-stream';
|
||||||
|
|
||||||
|
export default class PostgreSQLExporter extends SqlExporter {
|
||||||
|
async getSqlHeader () {
|
||||||
|
let dump = await super.getSqlHeader();
|
||||||
|
dump += `
|
||||||
|
|
||||||
|
|
||||||
|
SET statement_timeout = 0;
|
||||||
|
SET lock_timeout = 0;
|
||||||
|
SET idle_in_transaction_session_timeout = 0;
|
||||||
|
SET client_encoding = 'UTF8';
|
||||||
|
SET standard_conforming_strings = on;
|
||||||
|
SELECT pg_catalog.set_config('search_path', '', false);
|
||||||
|
SET check_function_bodies = false;
|
||||||
|
SET xmloption = content;
|
||||||
|
SET client_min_messages = warning;
|
||||||
|
SET row_security = off;\n\n\n`;
|
||||||
|
|
||||||
|
if (this.schemaName !== 'public') dump += `CREATE SCHEMA "${this.schemaName}";\n\n`;
|
||||||
|
|
||||||
|
dump += await this.getCreateTypes();
|
||||||
|
|
||||||
|
return dump;
|
||||||
|
}
|
||||||
|
|
||||||
|
async getCreateTable (tableName) {
|
||||||
|
let createSql = '';
|
||||||
|
const sequences = [];
|
||||||
|
const columnsSql = [];
|
||||||
|
const arrayTypes = {
|
||||||
|
_int2: 'smallint',
|
||||||
|
_int4: 'integer',
|
||||||
|
_int8: 'bigint',
|
||||||
|
_float4: 'real',
|
||||||
|
_float8: 'double precision',
|
||||||
|
_char: '"char"',
|
||||||
|
_varchar: 'character varying'
|
||||||
|
};
|
||||||
|
|
||||||
|
// Table columns
|
||||||
|
const { rows } = await this._client.raw(`
|
||||||
|
SELECT *
|
||||||
|
FROM "information_schema"."columns"
|
||||||
|
WHERE "table_schema" = '${this.schemaName}'
|
||||||
|
AND "table_name" = '${tableName}'
|
||||||
|
ORDER BY "ordinal_position" ASC
|
||||||
|
`, { schema: 'information_schema' });
|
||||||
|
|
||||||
|
if (!rows.length) return '';
|
||||||
|
|
||||||
|
for (const column of rows) {
|
||||||
|
let fieldType = column.data_type;
|
||||||
|
if (fieldType === 'USER-DEFINED') fieldType = `"${this.schemaName}".${column.udt_name}`;
|
||||||
|
else if (fieldType === 'ARRAY') {
|
||||||
|
if (Object.keys(arrayTypes).includes(fieldType))
|
||||||
|
fieldType = arrayTypes[type] + '[]';
|
||||||
|
else
|
||||||
|
fieldType = column.udt_name.replaceAll('_', '') + '[]';
|
||||||
|
}
|
||||||
|
|
||||||
|
const columnArr = [
|
||||||
|
`"${column.column_name}"`,
|
||||||
|
`${fieldType}${column.character_maximum_length ? `(${column.character_maximum_length})` : ''}`
|
||||||
|
];
|
||||||
|
|
||||||
|
if (column.column_default) {
|
||||||
|
columnArr.push(`DEFAULT ${column.column_default}`);
|
||||||
|
if (column.column_default.includes('nextval')) {
|
||||||
|
const sequenceName = column.column_default.split('\'')[1];
|
||||||
|
sequences.push(sequenceName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (column.is_nullable === 'NO') columnArr.push('NOT NULL');
|
||||||
|
|
||||||
|
columnsSql.push(columnArr.join(' '));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Table sequences
|
||||||
|
for (let sequence of sequences) {
|
||||||
|
if (sequence.includes('.')) sequence = sequence.split('.')[1];
|
||||||
|
|
||||||
|
const { rows } = await this._client
|
||||||
|
.select('*')
|
||||||
|
.schema('information_schema')
|
||||||
|
.from('sequences')
|
||||||
|
.where({ sequence_schema: `= '${this.schemaName}'`, sequence_name: `= '${sequence}'` })
|
||||||
|
.run();
|
||||||
|
|
||||||
|
if (rows.length) {
|
||||||
|
createSql += `CREATE SEQUENCE "${this.schemaName}"."${sequence}"
|
||||||
|
START WITH ${rows[0].start_value}
|
||||||
|
INCREMENT BY ${rows[0].increment}
|
||||||
|
MINVALUE ${rows[0].minimum_value}
|
||||||
|
MAXVALUE ${rows[0].maximum_value}
|
||||||
|
CACHE 1;\n`;
|
||||||
|
|
||||||
|
// createSql += `\nALTER TABLE "${sequence}" OWNER TO ${this._client._params.user};\n\n`;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Table create
|
||||||
|
createSql += `\nCREATE TABLE "${this.schemaName}"."${tableName}"(
|
||||||
|
${columnsSql.join(',\n ')}
|
||||||
|
);\n`;
|
||||||
|
|
||||||
|
// createSql += `\nALTER TABLE "${tableName}" OWNER TO ${this._client._params.user};\n\n`;
|
||||||
|
|
||||||
|
// Table indexes
|
||||||
|
createSql += '\n';
|
||||||
|
const { rows: indexes } = await this._client
|
||||||
|
.select('*')
|
||||||
|
.schema('pg_catalog')
|
||||||
|
.from('pg_indexes')
|
||||||
|
.where({ schemaname: `= '${this.schemaName}'`, tablename: `= '${tableName}'` })
|
||||||
|
.run();
|
||||||
|
|
||||||
|
for (const index of indexes)
|
||||||
|
createSql += `${index.indexdef};\n`;
|
||||||
|
|
||||||
|
// Table foreigns
|
||||||
|
const { rows: foreigns } = await this._client.raw(`
|
||||||
|
SELECT
|
||||||
|
tc.table_schema,
|
||||||
|
tc.constraint_name,
|
||||||
|
tc.table_name,
|
||||||
|
kcu.column_name,
|
||||||
|
ccu.table_schema AS foreign_table_schema,
|
||||||
|
ccu.table_name AS foreign_table_name,
|
||||||
|
ccu.column_name AS foreign_column_name,
|
||||||
|
rc.update_rule,
|
||||||
|
rc.delete_rule
|
||||||
|
FROM information_schema.table_constraints AS tc
|
||||||
|
JOIN information_schema.key_column_usage AS kcu
|
||||||
|
ON tc.constraint_name = kcu.constraint_name
|
||||||
|
AND tc.table_schema = kcu.table_schema
|
||||||
|
JOIN information_schema.constraint_column_usage AS ccu
|
||||||
|
ON ccu.constraint_name = tc.constraint_name
|
||||||
|
AND ccu.table_schema = tc.table_schema
|
||||||
|
JOIN information_schema.referential_constraints AS rc
|
||||||
|
ON rc.constraint_name = kcu.constraint_name
|
||||||
|
WHERE tc.constraint_type = 'FOREIGN KEY' AND tc.table_schema = '${this.schemaName}'
|
||||||
|
AND tc.table_name = '${tableName}'
|
||||||
|
`);
|
||||||
|
|
||||||
|
for (const foreign of foreigns) {
|
||||||
|
this._postTablesSql += `\nALTER TABLE ONLY "${this.schemaName}"."${tableName}"
|
||||||
|
ADD CONSTRAINT "${foreign.constraint_name}" FOREIGN KEY ("${foreign.column_name}") REFERENCES "${this.schemaName}"."${foreign.foreign_table_name}" ("${foreign.foreign_column_name}") ON UPDATE ${foreign.update_rule} ON DELETE ${foreign.delete_rule};\n`;
|
||||||
|
}
|
||||||
|
|
||||||
|
return createSql;
|
||||||
|
}
|
||||||
|
|
||||||
|
getDropTable (tableName) {
|
||||||
|
return `DROP TABLE IF EXISTS "${this.schemaName}"."${tableName}";`;
|
||||||
|
}
|
||||||
|
|
||||||
|
async * getTableInsert (tableName) {
|
||||||
|
let rowCount = 0;
|
||||||
|
const sqlStr = '';
|
||||||
|
|
||||||
|
const countResults = await this._client.raw(`SELECT COUNT(1) as count FROM "${this.schemaName}"."${tableName}"`);
|
||||||
|
if (countResults.rows.length === 1) rowCount = countResults.rows[0].count;
|
||||||
|
|
||||||
|
if (rowCount > 0) {
|
||||||
|
const columns = await this._client.getTableColumns({
|
||||||
|
table: tableName,
|
||||||
|
schema: this.schemaName
|
||||||
|
});
|
||||||
|
|
||||||
|
const columnNames = columns.map(col => '"' + col.name + '"').join(', ');
|
||||||
|
|
||||||
|
yield sqlStr;
|
||||||
|
|
||||||
|
const stream = await this._queryStream(
|
||||||
|
`SELECT ${columnNames} FROM "${this.schemaName}"."${tableName}"`
|
||||||
|
);
|
||||||
|
|
||||||
|
for await (const row of stream) {
|
||||||
|
if (this.isCancelled) {
|
||||||
|
stream.destroy();
|
||||||
|
yield null;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
let sqlInsertString = `INSERT INTO "${this.schemaName}"."${tableName}" (${columnNames}) VALUES`;
|
||||||
|
|
||||||
|
sqlInsertString += ' (';
|
||||||
|
|
||||||
|
for (const i in columns) {
|
||||||
|
const column = columns[i];
|
||||||
|
const val = row[column.name];
|
||||||
|
|
||||||
|
if (val === null) sqlInsertString += 'NULL';
|
||||||
|
else if (DATE.includes(column.type)) {
|
||||||
|
sqlInsertString += moment(val).isValid()
|
||||||
|
? this.escapeAndQuote(moment(val).format('YYYY-MM-DD'))
|
||||||
|
: val;
|
||||||
|
}
|
||||||
|
else if (DATETIME.includes(column.type)) {
|
||||||
|
let datePrecision = '';
|
||||||
|
for (let i = 0; i < column.precision; i++)
|
||||||
|
datePrecision += i === 0 ? '.S' : 'S';
|
||||||
|
|
||||||
|
sqlInsertString += moment(val).isValid()
|
||||||
|
? this.escapeAndQuote(moment(val).format(`YYYY-MM-DD HH:mm:ss${datePrecision}`))
|
||||||
|
: this.escapeAndQuote(val);
|
||||||
|
}
|
||||||
|
else if (column.isArray) {
|
||||||
|
let parsedVal;
|
||||||
|
if (Array.isArray(val))
|
||||||
|
parsedVal = JSON.stringify(val).replaceAll('[', '{').replaceAll(']', '}');
|
||||||
|
else
|
||||||
|
parsedVal = typeof val === 'string' ? val.replaceAll('[', '{').replaceAll(']', '}') : '';
|
||||||
|
sqlInsertString += `'${parsedVal}'`;
|
||||||
|
}
|
||||||
|
else if (TEXT_SEARCH.includes(column.type))
|
||||||
|
sqlInsertString += `'${val.replaceAll('\'', '\'\'')}'`;
|
||||||
|
else if (BIT.includes(column.type))
|
||||||
|
sqlInsertString += `b'${hexToBinary(Buffer.from(val).toString('hex'))}'`;
|
||||||
|
else if (BLOB.includes(column.type))
|
||||||
|
sqlInsertString += `decode('${val.toString('hex').toUpperCase()}', 'hex')`;
|
||||||
|
else if (NUMBER.includes(column.type))
|
||||||
|
sqlInsertString += val;
|
||||||
|
else if (FLOAT.includes(column.type))
|
||||||
|
sqlInsertString += parseFloat(val);
|
||||||
|
else if (val === '') sqlInsertString += '\'\'';
|
||||||
|
else {
|
||||||
|
sqlInsertString += typeof val === 'string'
|
||||||
|
? this.escapeAndQuote(val)
|
||||||
|
: typeof val === 'object'
|
||||||
|
? this.escapeAndQuote(JSON.stringify(val))
|
||||||
|
: val;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (parseInt(i) !== columns.length - 1)
|
||||||
|
sqlInsertString += ', ';
|
||||||
|
}
|
||||||
|
|
||||||
|
sqlInsertString += ');\n';
|
||||||
|
|
||||||
|
yield sqlInsertString;
|
||||||
|
}
|
||||||
|
|
||||||
|
yield sqlStr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async getCreateTypes () {
|
||||||
|
let sqlString = '';
|
||||||
|
const { rows: types } = await this._client.raw(`
|
||||||
|
SELECT pg_type.typname, pg_enum.enumlabel
|
||||||
|
FROM pg_type
|
||||||
|
JOIN pg_enum ON pg_enum.enumtypid = pg_type.oid;
|
||||||
|
`);
|
||||||
|
|
||||||
|
if (types.length) { // TODO: refactor
|
||||||
|
sqlString += this.buildComment('Dump of types\n------------------------------------------------------------') + '\n\n';
|
||||||
|
|
||||||
|
const typesArr = types.reduce((arr, type) => {
|
||||||
|
if (arr.every(el => el.name !== type.typname))
|
||||||
|
arr.push({ name: type.typname, enums: [this.escapeAndQuote(type.enumlabel)] });
|
||||||
|
else {
|
||||||
|
const i = arr.findIndex(el => el.name === type.typname);
|
||||||
|
arr[i].enums.push(this.escapeAndQuote(type.enumlabel));
|
||||||
|
}
|
||||||
|
|
||||||
|
return arr;
|
||||||
|
}, []);
|
||||||
|
|
||||||
|
for (const type of typesArr) {
|
||||||
|
sqlString += `CREATE TYPE "${this.schemaName}"."${type.name}" AS ENUM (
|
||||||
|
${type.enums.join(',\n\t')}
|
||||||
|
);`;
|
||||||
|
}
|
||||||
|
|
||||||
|
// sqlString += `\nALTER TYPE "${tableName}" OWNER TO ${this._client._params.user};\n`
|
||||||
|
}
|
||||||
|
|
||||||
|
return sqlString;
|
||||||
|
}
|
||||||
|
|
||||||
|
async getCreateAggregates () {
|
||||||
|
let sqlString = '';
|
||||||
|
|
||||||
|
const { rows: aggregates } = await this._client.raw(`
|
||||||
|
SELECT proname
|
||||||
|
FROM pg_proc
|
||||||
|
WHERE prokind = 'a'
|
||||||
|
AND pronamespace::regnamespace::text = '${this.schemaName}'
|
||||||
|
ORDER BY 1;
|
||||||
|
`);
|
||||||
|
|
||||||
|
if (aggregates.length) {
|
||||||
|
for (const aggregate of aggregates) {
|
||||||
|
const { rows: aggregateDef } = await this._client.raw(
|
||||||
|
`SELECT
|
||||||
|
format(
|
||||||
|
E'CREATE AGGREGATE %s (\n%s\n);'
|
||||||
|
, (pg_identify_object('pg_proc'::regclass, aggfnoid, 0)).identity
|
||||||
|
, array_to_string(
|
||||||
|
ARRAY[
|
||||||
|
format(E'\tSFUNC = %s', aggtransfn::regproc)
|
||||||
|
, format(E'\tSTYPE = %s', format_type(aggtranstype, NULL))
|
||||||
|
, CASE aggfinalfn WHEN '-'::regproc THEN NULL ELSE format(E'\tFINALFUNC = %s',aggfinalfn::text) END
|
||||||
|
, CASE aggsortop WHEN 0 THEN NULL ELSE format(E'\tSORTOP = %s', oprname) END
|
||||||
|
, CASE WHEN agginitval IS NULL THEN NULL ELSE format(E'\tINITCOND = %s', agginitval) END
|
||||||
|
]
|
||||||
|
, E',\n'
|
||||||
|
)
|
||||||
|
)
|
||||||
|
FROM pg_aggregate
|
||||||
|
LEFT JOIN pg_operator ON pg_operator.oid = aggsortop
|
||||||
|
WHERE aggfnoid = '${this.schemaName}.${aggregate.proname}'::regproc;`
|
||||||
|
);
|
||||||
|
|
||||||
|
if (aggregateDef.length)
|
||||||
|
sqlString += '\n\n' + aggregateDef[0].format;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return sqlString + '\n\n\n';
|
||||||
|
}
|
||||||
|
|
||||||
|
async getViews () {
|
||||||
|
const { rows: views } = await this._client.raw(`SELECT * FROM "pg_views" WHERE "schemaname"='${this.schemaName}'`);
|
||||||
|
let sqlString = '';
|
||||||
|
|
||||||
|
for (const view of views) {
|
||||||
|
sqlString += `\nDROP VIEW IF EXISTS "${view.viewname}";\n`;
|
||||||
|
|
||||||
|
// const { rows: columns } = await this._client
|
||||||
|
// .select('*')
|
||||||
|
// .schema('information_schema')
|
||||||
|
// .from('columns')
|
||||||
|
// .where({ table_schema: `= '${this.schemaName}'`, table_name: `= '${view.viewname}'` })
|
||||||
|
// .orderBy({ ordinal_position: 'ASC' })
|
||||||
|
// .run();
|
||||||
|
|
||||||
|
// sqlString += `
|
||||||
|
// CREATE VIEW "${this.schemaName}"."${view.viewname}" AS
|
||||||
|
// SELECT
|
||||||
|
// ${columns.reduce((acc, curr) => {
|
||||||
|
// const fieldType = curr.data_type === 'USER-DEFINED' ? curr.udt_name : curr.data_type;
|
||||||
|
// acc.push(`NULL::${fieldType}${curr.character_maximum_length ? `(${curr.character_maximum_length})` : ''} AS "${curr.column_name}"`);
|
||||||
|
// return acc;
|
||||||
|
// }, []).join(',\n ')};
|
||||||
|
// `;
|
||||||
|
|
||||||
|
sqlString += `\nCREATE OR REPLACE VIEW "${this.schemaName}"."${view.viewname}" AS \n${view.definition}\n`;
|
||||||
|
}
|
||||||
|
|
||||||
|
return sqlString;
|
||||||
|
}
|
||||||
|
|
||||||
|
async getTriggers () {
|
||||||
|
let sqlString = '';
|
||||||
|
|
||||||
|
// Trigger functions
|
||||||
|
const { rows: triggerFunctions } = await this._client.raw(
|
||||||
|
`SELECT DISTINCT routine_name AS name FROM information_schema.routines WHERE routine_type = 'FUNCTION' AND routine_schema = '${this.schemaName}' AND data_type = 'trigger'`
|
||||||
|
);
|
||||||
|
|
||||||
|
for (const func of triggerFunctions) {
|
||||||
|
const { rows: functionDef } = await this._client.raw(
|
||||||
|
`SELECT pg_get_functiondef((SELECT oid FROM pg_proc WHERE proname = '${func.name}')) AS definition`
|
||||||
|
);
|
||||||
|
sqlString += `\n${functionDef[0].definition};\n`;
|
||||||
|
}
|
||||||
|
|
||||||
|
const { rows: triggers } = await this._client.raw(
|
||||||
|
`SELECT * FROM "information_schema"."triggers" WHERE "trigger_schema"='${this.schemaName}'`
|
||||||
|
);
|
||||||
|
|
||||||
|
const remappedTriggers = triggers.reduce((acc, trigger) => {
|
||||||
|
const i = acc.findIndex(t => t.trigger_name === trigger.trigger_name && t.event_object_table === trigger.event_object_table);
|
||||||
|
if (i === -1) {
|
||||||
|
trigger.events = [trigger.event_manipulation];
|
||||||
|
acc.push(trigger);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
acc[i].events.push(trigger.event_manipulation);
|
||||||
|
|
||||||
|
return acc;
|
||||||
|
}, []);
|
||||||
|
|
||||||
|
for (const trigger of remappedTriggers)
|
||||||
|
sqlString += `\nCREATE TRIGGER "${trigger.trigger_name}" ${trigger.action_timing} ${trigger.events.join(' OR ')} ON "${this.schemaName}"."${trigger.event_object_table}" FOR EACH ${trigger.action_orientation} ${trigger.action_statement};\n`;
|
||||||
|
|
||||||
|
return sqlString;
|
||||||
|
}
|
||||||
|
|
||||||
|
async getFunctions () {
|
||||||
|
let sqlString = '';
|
||||||
|
const { rows: functions } = await this._client.raw(
|
||||||
|
`SELECT DISTINCT routine_name AS name FROM information_schema.routines WHERE routine_type = 'FUNCTION' AND routine_schema = '${this.schemaName}' AND data_type != 'trigger'`
|
||||||
|
);
|
||||||
|
|
||||||
|
for (const func of functions) {
|
||||||
|
const { rows: functionDef } = await this._client.raw(
|
||||||
|
`SELECT pg_get_functiondef((SELECT oid FROM pg_proc WHERE proname = '${func.name}')) AS definition`
|
||||||
|
);
|
||||||
|
sqlString += `\n${functionDef[0].definition};\n`;
|
||||||
|
}
|
||||||
|
|
||||||
|
sqlString += await this.getCreateAggregates();
|
||||||
|
|
||||||
|
return sqlString;
|
||||||
|
}
|
||||||
|
|
||||||
|
async getRoutines () {
|
||||||
|
let sqlString = '';
|
||||||
|
const { rows: functions } = await this._client.raw(
|
||||||
|
`SELECT DISTINCT routine_name AS name FROM information_schema.routines WHERE routine_type = 'PROCEDURE' AND routine_schema = '${this.schemaName}'`
|
||||||
|
);
|
||||||
|
|
||||||
|
for (const func of functions) {
|
||||||
|
const { rows: functionDef } = await this._client.raw(
|
||||||
|
`SELECT pg_get_functiondef((SELECT oid FROM pg_proc WHERE proname = '${func.name}')) AS definition`
|
||||||
|
);
|
||||||
|
sqlString += `\n${functionDef[0].definition};\n`;
|
||||||
|
}
|
||||||
|
|
||||||
|
return sqlString;
|
||||||
|
}
|
||||||
|
|
||||||
|
async _queryStream (sql) {
|
||||||
|
if (process.env.NODE_ENV === 'development') console.log('EXPORTER:', sql);
|
||||||
|
const connection = await this._client.getConnection();
|
||||||
|
const query = new QueryStream(sql, null);
|
||||||
|
const stream = connection.query(query);
|
||||||
|
const dispose = () => connection.end();
|
||||||
|
|
||||||
|
stream.on('end', dispose);
|
||||||
|
stream.on('error', dispose);
|
||||||
|
stream.on('close', dispose);
|
||||||
|
return stream;
|
||||||
|
}
|
||||||
|
|
||||||
|
getEscapedDefiner (definer) {
|
||||||
|
return definer
|
||||||
|
.split('@')
|
||||||
|
.map(part => '`' + part + '`')
|
||||||
|
.join('@');
|
||||||
|
}
|
||||||
|
|
||||||
|
escapeAndQuote (val) {
|
||||||
|
// eslint-disable-next-line no-control-regex
|
||||||
|
const CHARS_TO_ESCAPE = /[\0\b\t\n\r\x1a"'\\]/g;
|
||||||
|
const CHARS_ESCAPE_MAP = {
|
||||||
|
'\0': '\\0',
|
||||||
|
'\b': '\\b',
|
||||||
|
'\t': '\\t',
|
||||||
|
'\n': '\\n',
|
||||||
|
'\r': '\\r',
|
||||||
|
'\x1a': '\\Z',
|
||||||
|
'"': '\\"',
|
||||||
|
'\'': '\\\'',
|
||||||
|
'\\': '\\\\'
|
||||||
|
};
|
||||||
|
let chunkIndex = CHARS_TO_ESCAPE.lastIndex = 0;
|
||||||
|
let escapedVal = '';
|
||||||
|
let match;
|
||||||
|
|
||||||
|
while ((match = CHARS_TO_ESCAPE.exec(val))) {
|
||||||
|
escapedVal += val.slice(chunkIndex, match.index) + CHARS_ESCAPE_MAP[match[0]];
|
||||||
|
chunkIndex = CHARS_TO_ESCAPE.lastIndex;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (chunkIndex === 0)
|
||||||
|
return `'${val}'`;
|
||||||
|
|
||||||
|
if (chunkIndex < val.length)
|
||||||
|
return `'${escapedVal + val.slice(chunkIndex)}'`;
|
||||||
|
|
||||||
|
return `'${escapedVal}'`;
|
||||||
|
}
|
||||||
|
|
||||||
|
_getGeoJSON (val) {
|
||||||
|
if (Array.isArray(val)) {
|
||||||
|
if (getArrayDepth(val) === 1)
|
||||||
|
return lineString(val.reduce((acc, curr) => [...acc, [curr.x, curr.y]], []));
|
||||||
|
else
|
||||||
|
return polygon(val.map(arr => arr.reduce((acc, curr) => [...acc, [curr.x, curr.y]], [])));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return point([val.x, val.y]);
|
||||||
|
}
|
||||||
|
}
|
@@ -5,7 +5,8 @@ export class SqlExporter extends BaseExporter {
|
|||||||
constructor (client, tables, options) {
|
constructor (client, tables, options) {
|
||||||
super(tables, options);
|
super(tables, options);
|
||||||
this._client = client;
|
this._client = client;
|
||||||
this._commentChar = '#';
|
this._commentChar = '--';
|
||||||
|
this._postTablesSql = '';
|
||||||
}
|
}
|
||||||
|
|
||||||
get schemaName () {
|
get schemaName () {
|
||||||
@@ -90,6 +91,12 @@ export class SqlExporter extends BaseExporter {
|
|||||||
this.writeString('\n\n');
|
this.writeString('\n\n');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// SQL to execute after tables creation
|
||||||
|
if (this._postTablesSql) {
|
||||||
|
this.writeString(this._postTablesSql);
|
||||||
|
this.writeString('\n\n');
|
||||||
|
}
|
||||||
|
|
||||||
for (const item of extraItems) {
|
for (const item of extraItems) {
|
||||||
const processingMethod = `get${item.charAt(0).toUpperCase() + item.slice(1)}`;
|
const processingMethod = `get${item.charAt(0).toUpperCase() + item.slice(1)}`;
|
||||||
exportState.currentItemIndex++;
|
exportState.currentItemIndex++;
|
||||||
@@ -130,7 +137,7 @@ Antares - SQL Client
|
|||||||
Version ${process.env.PACKAGE_VERSION}
|
Version ${process.env.PACKAGE_VERSION}
|
||||||
|
|
||||||
https://antares-sql.app/
|
https://antares-sql.app/
|
||||||
https://github.com/Fabio286/antares
|
https://github.com/antares-sql/antares
|
||||||
|
|
||||||
Host: ${this.host} (${serverVersion})
|
Host: ${this.host} (${serverVersion})
|
||||||
Database: ${this.schemaName}
|
Database: ${this.schemaName}
|
||||||
|
@@ -1,8 +1,8 @@
|
|||||||
import fs from 'fs/promises';
|
import fs from 'fs/promises';
|
||||||
import SqlParser from '../../../../common/libs/sqlParser';
|
import MySQLParser from '../../parsers/MySQLParser';
|
||||||
import { BaseImporter } from '../BaseImporter';
|
import { BaseImporter } from '../BaseImporter';
|
||||||
|
|
||||||
export default class MysqlImporter extends BaseImporter {
|
export default class MySQLImporter extends BaseImporter {
|
||||||
constructor (client, options) {
|
constructor (client, options) {
|
||||||
super(options);
|
super(options);
|
||||||
this._client = client;
|
this._client = client;
|
||||||
@@ -11,7 +11,7 @@ export default class MysqlImporter extends BaseImporter {
|
|||||||
async import () {
|
async import () {
|
||||||
try {
|
try {
|
||||||
const { size: totalFileSize } = await fs.stat(this._options.file);
|
const { size: totalFileSize } = await fs.stat(this._options.file);
|
||||||
const parser = new SqlParser();
|
const parser = new MySQLParser();
|
||||||
let readPosition = 0;
|
let readPosition = 0;
|
||||||
let queryCount = 0;
|
let queryCount = 0;
|
||||||
|
|
||||||
@@ -22,11 +22,6 @@ export default class MysqlImporter extends BaseImporter {
|
|||||||
queryCount: 0
|
queryCount: 0
|
||||||
});
|
});
|
||||||
|
|
||||||
// 1. detect file encoding
|
|
||||||
// 2. set fh encoding
|
|
||||||
// 3. detect sql mode
|
|
||||||
// 4. restore sql mode in case of exception
|
|
||||||
|
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
this._fileHandler.pipe(parser);
|
this._fileHandler.pipe(parser);
|
||||||
|
|
||||||
|
80
src/main/libs/importers/sql/PostgreSQLImporter.js
Normal file
80
src/main/libs/importers/sql/PostgreSQLImporter.js
Normal file
@@ -0,0 +1,80 @@
|
|||||||
|
import fs from 'fs/promises';
|
||||||
|
import PostgreSQLParser from '../../parsers/PostgreSQLParser';
|
||||||
|
import { BaseImporter } from '../BaseImporter';
|
||||||
|
|
||||||
|
export default class PostgreSQLImporter extends BaseImporter {
|
||||||
|
constructor (client, options) {
|
||||||
|
super(options);
|
||||||
|
this._client = client;
|
||||||
|
}
|
||||||
|
|
||||||
|
async import () {
|
||||||
|
try {
|
||||||
|
const { size: totalFileSize } = await fs.stat(this._options.file);
|
||||||
|
const parser = new PostgreSQLParser();
|
||||||
|
let readPosition = 0;
|
||||||
|
let queryCount = 0;
|
||||||
|
|
||||||
|
this.emitUpdate({
|
||||||
|
fileSize: totalFileSize,
|
||||||
|
readPosition: 0,
|
||||||
|
percentage: 0,
|
||||||
|
queryCount: 0
|
||||||
|
});
|
||||||
|
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
this._fileHandler.pipe(parser);
|
||||||
|
|
||||||
|
parser.on('error', reject);
|
||||||
|
|
||||||
|
parser.on('close', async () => {
|
||||||
|
console.log('TOTAL QUERIES', queryCount);
|
||||||
|
console.log('import end');
|
||||||
|
resolve();
|
||||||
|
});
|
||||||
|
|
||||||
|
parser.on('data', async (query) => {
|
||||||
|
queryCount++;
|
||||||
|
parser.pause();
|
||||||
|
|
||||||
|
try {
|
||||||
|
await this._client.query(query);
|
||||||
|
}
|
||||||
|
catch (error) {
|
||||||
|
this.emit('query-error', {
|
||||||
|
sql: query,
|
||||||
|
message: error.hint || error.toString(),
|
||||||
|
sqlSnippet: error.sql,
|
||||||
|
time: new Date().getTime()
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
this.emitUpdate({
|
||||||
|
queryCount,
|
||||||
|
readPosition,
|
||||||
|
percentage: readPosition / totalFileSize * 100
|
||||||
|
});
|
||||||
|
this._fileHandler.pipe(parser);
|
||||||
|
parser.resume();
|
||||||
|
});
|
||||||
|
|
||||||
|
parser.on('pause', () => {
|
||||||
|
this._fileHandler.unpipe(parser);
|
||||||
|
this._fileHandler.readableFlowing = false;
|
||||||
|
});
|
||||||
|
|
||||||
|
this._fileHandler.on('data', (chunk) => {
|
||||||
|
readPosition += chunk.length;
|
||||||
|
});
|
||||||
|
|
||||||
|
this._fileHandler.on('error', (err) => {
|
||||||
|
console.log(err);
|
||||||
|
reject(err);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
catch (err) {
|
||||||
|
console.log(err);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@@ -1,6 +1,6 @@
|
|||||||
import { Transform } from 'stream';
|
import { Transform } from 'stream';
|
||||||
|
|
||||||
export default class SqlParser extends Transform {
|
export default class MySQLParser extends Transform {
|
||||||
constructor (opts) {
|
constructor (opts) {
|
||||||
opts = {
|
opts = {
|
||||||
delimiter: ';',
|
delimiter: ';',
|
142
src/main/libs/parsers/PostgreSQLParser.js
Normal file
142
src/main/libs/parsers/PostgreSQLParser.js
Normal file
@@ -0,0 +1,142 @@
|
|||||||
|
import { Transform } from 'stream';
|
||||||
|
|
||||||
|
export default class PostgreSQLParser extends Transform {
|
||||||
|
constructor (opts) {
|
||||||
|
opts = {
|
||||||
|
delimiter: ';',
|
||||||
|
encoding: 'utf8',
|
||||||
|
writableObjectMode: true,
|
||||||
|
readableObjectMode: true,
|
||||||
|
...opts
|
||||||
|
};
|
||||||
|
super(opts);
|
||||||
|
this._buffer = '';
|
||||||
|
this._lastChar = '';
|
||||||
|
this._lastChars = '';
|
||||||
|
this.encoding = opts.encoding;
|
||||||
|
this.delimiter = opts.delimiter;// ';'
|
||||||
|
this._bodyWrapper = '';
|
||||||
|
this._bodyWrapperBuffer = '';
|
||||||
|
|
||||||
|
this.isEscape = false;
|
||||||
|
this.currentQuote = null;
|
||||||
|
this._firstDollarFound = false;
|
||||||
|
this._isBody = false;
|
||||||
|
this._isSingleLineComment = false;
|
||||||
|
this._isMultiLineComment = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
get _isComment () {
|
||||||
|
return this._isSingleLineComment || this._isMultiLineComment;
|
||||||
|
}
|
||||||
|
|
||||||
|
_transform (chunk, encoding, next) {
|
||||||
|
for (const char of chunk.toString(this.encoding)) {
|
||||||
|
this.checkEscape();
|
||||||
|
this._buffer += char;
|
||||||
|
this._lastChar = char;
|
||||||
|
this._lastChars += char;
|
||||||
|
|
||||||
|
if (this._lastChars.length > this._bodyWrapper.length)
|
||||||
|
this._lastChars = this._lastChars.slice(-(this._bodyWrapper.length || 2));
|
||||||
|
|
||||||
|
this.checkBodyWrapper(char);
|
||||||
|
this.checkQuote(char);
|
||||||
|
this.checkCommentRow();
|
||||||
|
const query = this.getQuery();
|
||||||
|
|
||||||
|
if (query)
|
||||||
|
this.push(query);
|
||||||
|
}
|
||||||
|
next();
|
||||||
|
}
|
||||||
|
|
||||||
|
checkEscape () {
|
||||||
|
if (this._buffer.length > 0) {
|
||||||
|
this.isEscape = this._lastChar === '\\'
|
||||||
|
? !this.isEscape
|
||||||
|
: false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
checkCommentRow () {
|
||||||
|
if (this._isBody) return;
|
||||||
|
|
||||||
|
if (!this._isComment) {
|
||||||
|
if (this.currentQuote === null && this._lastChars.includes('--'))
|
||||||
|
this._isSingleLineComment = true;
|
||||||
|
|
||||||
|
if (this.currentQuote === null && this._lastChars.includes('/*'))
|
||||||
|
this._isMultiLineComment = true;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (this._isSingleLineComment && (this._lastChar === '\n' || this._lastChar === '\r')) {
|
||||||
|
this._buffer = '';
|
||||||
|
this._isSingleLineComment = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this._isMultiLineComment && this._lastChars.includes('*/')) {
|
||||||
|
this._buffer = '';
|
||||||
|
this._isMultiLineComment = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
checkBodyWrapper (char) {
|
||||||
|
if (this._isBody)
|
||||||
|
this._isBody = this._lastChars !== this._bodyWrapper;
|
||||||
|
|
||||||
|
if (this.currentQuote === null && char === '$' && !this._firstDollarFound && !this._bodyWrapper) {
|
||||||
|
this._firstDollarFound = true;
|
||||||
|
this._bodyWrapperBuffer += char;
|
||||||
|
this._isBody = true;
|
||||||
|
}
|
||||||
|
else if (this._firstDollarFound) {
|
||||||
|
if (char === '\n' || char === ' ') {
|
||||||
|
this._firstDollarFound = false;
|
||||||
|
this._bodyWrapperBuffer = '';
|
||||||
|
this._bodyWrapper = '';
|
||||||
|
this._isBody = false;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
this._bodyWrapperBuffer += char;
|
||||||
|
const isEndDollar = char === '$';
|
||||||
|
|
||||||
|
if (isEndDollar) {
|
||||||
|
this._firstDollarFound = false;
|
||||||
|
this._bodyWrapper = this._bodyWrapperBuffer;
|
||||||
|
this._bodyWrapperBuffer = '';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
checkQuote (char) {
|
||||||
|
const isQuote = !this.isEscape && (char === '\'' || char === '"');
|
||||||
|
if (isQuote && this.currentQuote === char)
|
||||||
|
this.currentQuote = null;
|
||||||
|
|
||||||
|
else if (isQuote && this.currentQuote === null)
|
||||||
|
this.currentQuote = char;
|
||||||
|
}
|
||||||
|
|
||||||
|
getQuery () {
|
||||||
|
if (this._isBody || this._isComment)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
let query = false;
|
||||||
|
let demiliterFound = false;
|
||||||
|
|
||||||
|
if (this.currentQuote === null && this._buffer.length >= this.delimiter.length)
|
||||||
|
demiliterFound = this._lastChars.slice(-this.delimiter.length) === this.delimiter;
|
||||||
|
|
||||||
|
if (demiliterFound) {
|
||||||
|
const parsedStr = this._buffer.trim();
|
||||||
|
query = parsedStr;
|
||||||
|
this._buffer = '';
|
||||||
|
this._bodyWrapper = '';
|
||||||
|
}
|
||||||
|
|
||||||
|
return query;
|
||||||
|
}
|
||||||
|
}
|
@@ -1,6 +1,7 @@
|
|||||||
|
import fs from 'fs';
|
||||||
import { ClientsFactory } from '../libs/ClientsFactory';
|
import { ClientsFactory } from '../libs/ClientsFactory';
|
||||||
import MysqlExporter from '../libs/exporters/sql/MysqlExporter.js';
|
import MysqlExporter from '../libs/exporters/sql/MysqlExporter.js';
|
||||||
import fs from 'fs';
|
import PostgreSQLExporter from '../libs/exporters/sql/PostgreSQLExporter';
|
||||||
let exporter;
|
let exporter;
|
||||||
|
|
||||||
process.on('message', async ({ type, client, tables, options }) => {
|
process.on('message', async ({ type, client, tables, options }) => {
|
||||||
@@ -17,6 +18,9 @@ process.on('message', async ({ type, client, tables, options }) => {
|
|||||||
case 'maria':
|
case 'maria':
|
||||||
exporter = new MysqlExporter(connection, tables, options);
|
exporter = new MysqlExporter(connection, tables, options);
|
||||||
break;
|
break;
|
||||||
|
case 'pg':
|
||||||
|
exporter = new PostgreSQLExporter(connection, tables, options);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
process.send({
|
process.send({
|
||||||
type: 'error',
|
type: 'error',
|
||||||
|
@@ -1,5 +1,6 @@
|
|||||||
import { ClientsFactory } from '../libs/ClientsFactory';
|
import { ClientsFactory } from '../libs/ClientsFactory';
|
||||||
import MysqlImporter from '../libs/importers/sql/MysqlImporter';
|
import MySQLImporter from '../libs/importers/sql/MysqlImporter';
|
||||||
|
import PostgreSQLImporter from '../libs/importers/sql/PostgreSQLImporter';
|
||||||
let importer;
|
let importer;
|
||||||
|
|
||||||
process.on('message', async ({ type, dbConfig, options }) => {
|
process.on('message', async ({ type, dbConfig, options }) => {
|
||||||
@@ -18,7 +19,10 @@ process.on('message', async ({ type, dbConfig, options }) => {
|
|||||||
switch (options.type) {
|
switch (options.type) {
|
||||||
case 'mysql':
|
case 'mysql':
|
||||||
case 'maria':
|
case 'maria':
|
||||||
importer = new MysqlImporter(pool, options);
|
importer = new MySQLImporter(pool, options);
|
||||||
|
break;
|
||||||
|
case 'pg':
|
||||||
|
importer = new PostgreSQLImporter(pool, options);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
process.send({
|
process.send({
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
<template>
|
<template>
|
||||||
<div id="wrapper" :class="`theme-${applicationTheme}`">
|
<div id="wrapper" :class="[`theme-${applicationTheme}`, !disableBlur || 'no-blur']">
|
||||||
<TheTitleBar />
|
<TheTitleBar />
|
||||||
<div id="window-content">
|
<div id="window-content">
|
||||||
<TheSettingBar />
|
<TheSettingBar />
|
||||||
@@ -10,8 +10,10 @@
|
|||||||
:key="connection.uid"
|
:key="connection.uid"
|
||||||
:connection="connection"
|
:connection="connection"
|
||||||
/>
|
/>
|
||||||
|
<div class="connection-panel-wrapper">
|
||||||
<WorkspaceAddConnectionPanel v-if="selectedWorkspace === 'NEW'" />
|
<WorkspaceAddConnectionPanel v-if="selectedWorkspace === 'NEW'" />
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
<TheFooter />
|
<TheFooter />
|
||||||
<TheNotificationsBoard />
|
<TheNotificationsBoard />
|
||||||
<TheScratchpad v-if="isScratchpad" />
|
<TheScratchpad v-if="isScratchpad" />
|
||||||
@@ -51,6 +53,7 @@ export default {
|
|||||||
isScratchpad: 'application/isScratchpad',
|
isScratchpad: 'application/isScratchpad',
|
||||||
connections: 'connections/getConnections',
|
connections: 'connections/getConnections',
|
||||||
applicationTheme: 'settings/getApplicationTheme',
|
applicationTheme: 'settings/getApplicationTheme',
|
||||||
|
disableBlur: 'settings/getDisableBlur',
|
||||||
isUnsavedDiscardModal: 'workspaces/isUnsavedDiscardModal'
|
isUnsavedDiscardModal: 'workspaces/isUnsavedDiscardModal'
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
@@ -130,5 +133,15 @@ export default {
|
|||||||
> .columns {
|
> .columns {
|
||||||
height: calc(100vh - #{$footer-height});
|
height: calc(100vh - #{$footer-height});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.connection-panel-wrapper{
|
||||||
|
height: calc(100vh - #{$excluding-size});
|
||||||
|
width: 100%;
|
||||||
|
padding-top: 15vh;
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
align-items: flex-start;
|
||||||
|
overflow: auto;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
@@ -78,6 +78,7 @@ export default {
|
|||||||
|
|
||||||
.file-uploader-message {
|
.file-uploader-message {
|
||||||
display: flex;
|
display: flex;
|
||||||
|
word-break: keep-all;
|
||||||
border-radius: $border-radius 0 0 $border-radius;
|
border-radius: $border-radius 0 0 $border-radius;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -181,20 +181,19 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="column col-4">
|
<div class="column col-4">
|
||||||
<h4>
|
<h5 class="h5">
|
||||||
{{ $t('word.options') }}
|
{{ $t('word.options') }}
|
||||||
</h4>
|
</h5>
|
||||||
<span>{{ $t('word.includes') }}:</span>
|
<span class="h6">{{ $t('word.includes') }}:</span>
|
||||||
|
|
||||||
<label
|
<label
|
||||||
v-for="(_, key) in options.includes"
|
v-for="(_, key) in options.includes"
|
||||||
:key="key"
|
:key="key"
|
||||||
class="form-checkbox"
|
class="form-checkbox"
|
||||||
>
|
>
|
||||||
<input v-model="options.includes[key]" type="checkbox"><i class="form-icon" /> {{ $t(`word.${key}`) }}
|
<input v-model="options.includes[key]" type="checkbox"><i class="form-icon" /> {{ $tc(`word.${key}`, 2) }}
|
||||||
</label>
|
</label>
|
||||||
|
<div v-if="customizations.exportByChunks">
|
||||||
<div class="mt-4 mb-2">
|
<div class="h6 mt-4 mb-2">
|
||||||
{{ $t('message.newInserStmtEvery') }}:
|
{{ $t('message.newInserStmtEvery') }}:
|
||||||
</div>
|
</div>
|
||||||
<div class="columns">
|
<div class="columns">
|
||||||
@@ -218,6 +217,23 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div class="h6 mb-2 mt-4">
|
||||||
|
{{ $t('message.ourputFormat') }}:
|
||||||
|
</div>
|
||||||
|
<div class="columns">
|
||||||
|
<div class="column h5 mb-4">
|
||||||
|
<select v-model="options.outputFormat" class="form-select">
|
||||||
|
<option value="sql">
|
||||||
|
{{ $t('message.singleFile', {ext: '.sql'}) }}
|
||||||
|
</option>
|
||||||
|
<option value="sql.zip">
|
||||||
|
{{ $t('message.zipCompressedFile', {ext: '.sql'}) }}
|
||||||
|
</option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="modal-footer columns">
|
<div class="modal-footer columns">
|
||||||
@@ -275,6 +291,7 @@ export default {
|
|||||||
tables: [],
|
tables: [],
|
||||||
options: {
|
options: {
|
||||||
includes: {},
|
includes: {},
|
||||||
|
outputFormat: 'sql',
|
||||||
sqlInsertAfter: 250,
|
sqlInsertAfter: 250,
|
||||||
sqlInsertDivider: 'bytes'
|
sqlInsertDivider: 'bytes'
|
||||||
},
|
},
|
||||||
@@ -290,6 +307,9 @@ export default {
|
|||||||
currentWorkspace () {
|
currentWorkspace () {
|
||||||
return this.getWorkspace(this.selectedWorkspace);
|
return this.getWorkspace(this.selectedWorkspace);
|
||||||
},
|
},
|
||||||
|
customizations () {
|
||||||
|
return this.currentWorkspace.customizations;
|
||||||
|
},
|
||||||
schemaItems () {
|
schemaItems () {
|
||||||
const db = this.currentWorkspace.structure.find(db => db.name === this.selectedSchema);
|
const db = this.currentWorkspace.structure.find(db => db.name === this.selectedSchema);
|
||||||
if (db)
|
if (db)
|
||||||
@@ -299,7 +319,7 @@ export default {
|
|||||||
},
|
},
|
||||||
filename () {
|
filename () {
|
||||||
const date = moment().format('YYYY-MM-DD');
|
const date = moment().format('YYYY-MM-DD');
|
||||||
return `${this.selectedSchema}_${date}.sql`;
|
return `${this.selectedSchema}_${date}.${this.options.outputFormat}`;
|
||||||
},
|
},
|
||||||
dumpFilePath () {
|
dumpFilePath () {
|
||||||
return `${this.basePath}/${this.filename}`;
|
return `${this.basePath}/${this.filename}`;
|
||||||
@@ -333,7 +353,7 @@ export default {
|
|||||||
includeDropStatement: true
|
includeDropStatement: true
|
||||||
}));
|
}));
|
||||||
|
|
||||||
const structure = ['views', 'triggers', 'routines', 'functions', 'schedulers', 'triggerFunctions'];
|
const structure = ['functions', 'views', 'triggers', 'routines', 'schedulers'];
|
||||||
|
|
||||||
structure.forEach(feat => {
|
structure.forEach(feat => {
|
||||||
const val = customizations[this.currentWorkspace.client][feat];
|
const val = customizations[this.currentWorkspace.client][feat];
|
||||||
|
@@ -117,6 +117,19 @@
|
|||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="form-group mb-0">
|
||||||
|
<div class="col-7 col-sm-12">
|
||||||
|
<label class="form-label">
|
||||||
|
{{ $t('message.disableBlur') }}
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
<div class="col-5 col-sm-12">
|
||||||
|
<label class="form-switch d-inline-block" @click.prevent="toggleDisableBlur">
|
||||||
|
<input type="checkbox" :checked="disableBlur">
|
||||||
|
<i class="form-icon" />
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<div class="col-7 col-sm-12">
|
<div class="col-7 col-sm-12">
|
||||||
<label class="form-label">
|
<label class="form-label">
|
||||||
@@ -284,7 +297,7 @@
|
|||||||
<h4>{{ appName }}</h4>
|
<h4>{{ appName }}</h4>
|
||||||
<p class="mb-2">
|
<p class="mb-2">
|
||||||
{{ $t('word.version') }} {{ appVersion }}<br>
|
{{ $t('word.version') }} {{ appVersion }}<br>
|
||||||
<a class="c-hand" @click="openOutside('https://github.com/Fabio286/antares')"><i class="mdi mdi-github d-inline" /> GitHub</a> • <a class="c-hand" @click="openOutside('https://twitter.com/AntaresSQL')"><i class="mdi mdi-twitter d-inline" /> Twitter</a> • <a class="c-hand" @click="openOutside('https://antares-sql.app/')"><i class="mdi mdi-web d-inline" /> Website</a><br>
|
<a class="c-hand" @click="openOutside('https://github.com/antares-sql/antares')"><i class="mdi mdi-github d-inline" /> GitHub</a> • <a class="c-hand" @click="openOutside('https://twitter.com/AntaresSQL')"><i class="mdi mdi-twitter d-inline" /> Twitter</a> • <a class="c-hand" @click="openOutside('https://antares-sql.app/')"><i class="mdi mdi-web d-inline" /> Website</a><br>
|
||||||
<small>{{ $t('word.author') }} <a class="c-hand" @click="openOutside('https://github.com/Fabio286')">{{ appAuthor }}</a></small><br>
|
<small>{{ $t('word.author') }} <a class="c-hand" @click="openOutside('https://github.com/Fabio286')">{{ appAuthor }}</a></small><br>
|
||||||
</p>
|
</p>
|
||||||
<div class="mb-2">
|
<div class="mb-2">
|
||||||
@@ -389,6 +402,7 @@ export default {
|
|||||||
selectedLineWrap: 'settings/getLineWrap',
|
selectedLineWrap: 'settings/getLineWrap',
|
||||||
notificationsTimeout: 'settings/getNotificationsTimeout',
|
notificationsTimeout: 'settings/getNotificationsTimeout',
|
||||||
restoreTabs: 'settings/getRestoreTabs',
|
restoreTabs: 'settings/getRestoreTabs',
|
||||||
|
disableBlur: 'settings/getDisableBlur',
|
||||||
applicationTheme: 'settings/getApplicationTheme',
|
applicationTheme: 'settings/getApplicationTheme',
|
||||||
editorTheme: 'settings/getEditorTheme',
|
editorTheme: 'settings/getEditorTheme',
|
||||||
editorFontSize: 'settings/getEditorFontSize',
|
editorFontSize: 'settings/getEditorFontSize',
|
||||||
@@ -450,6 +464,7 @@ ORDER BY
|
|||||||
changeLocale: 'settings/changeLocale',
|
changeLocale: 'settings/changeLocale',
|
||||||
changePageSize: 'settings/changePageSize',
|
changePageSize: 'settings/changePageSize',
|
||||||
changeRestoreTabs: 'settings/changeRestoreTabs',
|
changeRestoreTabs: 'settings/changeRestoreTabs',
|
||||||
|
changeDisableBlur: 'settings/changeDisableBlur',
|
||||||
changeAutoComplete: 'settings/changeAutoComplete',
|
changeAutoComplete: 'settings/changeAutoComplete',
|
||||||
changeLineWrap: 'settings/changeLineWrap',
|
changeLineWrap: 'settings/changeLineWrap',
|
||||||
changeApplicationTheme: 'settings/changeApplicationTheme',
|
changeApplicationTheme: 'settings/changeApplicationTheme',
|
||||||
@@ -477,6 +492,9 @@ ORDER BY
|
|||||||
toggleRestoreSession () {
|
toggleRestoreSession () {
|
||||||
this.changeRestoreTabs(!this.restoreTabs);
|
this.changeRestoreTabs(!this.restoreTabs);
|
||||||
},
|
},
|
||||||
|
toggleDisableBlur () {
|
||||||
|
this.changeDisableBlur(!this.disableBlur);
|
||||||
|
},
|
||||||
toggleAutoComplete () {
|
toggleAutoComplete () {
|
||||||
this.changeAutoComplete(!this.selectedAutoComplete);
|
this.changeAutoComplete(!this.selectedAutoComplete);
|
||||||
},
|
},
|
||||||
|
@@ -15,7 +15,7 @@
|
|||||||
<i class="mdi mdi-18px mdi-coffee mr-1" />
|
<i class="mdi mdi-18px mdi-coffee mr-1" />
|
||||||
<small>{{ $t('word.donate') }}</small>
|
<small>{{ $t('word.donate') }}</small>
|
||||||
</li>
|
</li>
|
||||||
<li class="footer-element footer-link" @click="openOutside('https://github.com/Fabio286/antares/issues')">
|
<li class="footer-element footer-link" @click="openOutside('https://github.com/antares-sql/antares/issues')">
|
||||||
<i class="mdi mdi-18px mdi-bug" />
|
<i class="mdi mdi-18px mdi-bug" />
|
||||||
</li>
|
</li>
|
||||||
<li class="footer-element footer-link" @click="showSettingModal('about')">
|
<li class="footer-element footer-link" @click="showSettingModal('about')">
|
||||||
|
@@ -450,7 +450,9 @@
|
|||||||
/>
|
/>
|
||||||
</template>
|
</template>
|
||||||
</div>
|
</div>
|
||||||
<WorkspaceEditConnectionPanel v-else :connection="connection" />
|
<div v-else class="connection-panel-wrapper">
|
||||||
|
<WorkspaceEditConnectionPanel :connection="connection" />
|
||||||
|
</div>
|
||||||
<ModalProcessesList
|
<ModalProcessesList
|
||||||
v-if="isProcessesModal"
|
v-if="isProcessesModal"
|
||||||
:connection="connection"
|
:connection="connection"
|
||||||
|
@@ -34,7 +34,7 @@
|
|||||||
<fieldset class="m-0" :disabled="isBusy">
|
<fieldset class="m-0" :disabled="isBusy">
|
||||||
<div class="form-group columns">
|
<div class="form-group columns">
|
||||||
<div class="column col-4 col-sm-12">
|
<div class="column col-4 col-sm-12">
|
||||||
<label class="form-label">{{ $t('word.connectionName') }}</label>
|
<label class="form-label cut-text">{{ $t('word.connectionName') }}</label>
|
||||||
</div>
|
</div>
|
||||||
<div class="column col-8 col-sm-12">
|
<div class="column col-8 col-sm-12">
|
||||||
<input
|
<input
|
||||||
@@ -47,7 +47,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="form-group columns">
|
<div class="form-group columns">
|
||||||
<div class="column col-4 col-sm-12">
|
<div class="column col-4 col-sm-12">
|
||||||
<label class="form-label">{{ $t('word.client') }}</label>
|
<label class="form-label cut-text">{{ $t('word.client') }}</label>
|
||||||
</div>
|
</div>
|
||||||
<div class="column col-8 col-sm-12">
|
<div class="column col-8 col-sm-12">
|
||||||
<select v-model="connection.client" class="form-select">
|
<select v-model="connection.client" class="form-select">
|
||||||
@@ -63,7 +63,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div v-if="connection.client === 'pg'" class="form-group columns">
|
<div v-if="connection.client === 'pg'" class="form-group columns">
|
||||||
<div class="column col-4 col-sm-12">
|
<div class="column col-4 col-sm-12">
|
||||||
<label class="form-label">{{ $t('word.connectionString') }}</label>
|
<label class="form-label cut-text">{{ $t('word.connectionString') }}</label>
|
||||||
</div>
|
</div>
|
||||||
<div class="column col-8 col-sm-12">
|
<div class="column col-8 col-sm-12">
|
||||||
<input
|
<input
|
||||||
@@ -76,7 +76,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div v-if="!customizations.fileConnection" class="form-group columns">
|
<div v-if="!customizations.fileConnection" class="form-group columns">
|
||||||
<div class="column col-4 col-sm-12">
|
<div class="column col-4 col-sm-12">
|
||||||
<label class="form-label">{{ $t('word.hostName') }}/IP</label>
|
<label class="form-label cut-text">{{ $t('word.hostName') }}/IP</label>
|
||||||
</div>
|
</div>
|
||||||
<div class="column col-8 col-sm-12">
|
<div class="column col-8 col-sm-12">
|
||||||
<input
|
<input
|
||||||
@@ -88,7 +88,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div v-if="customizations.fileConnection" class="form-group columns">
|
<div v-if="customizations.fileConnection" class="form-group columns">
|
||||||
<div class="column col-4 col-sm-12">
|
<div class="column col-4 col-sm-12">
|
||||||
<label class="form-label">{{ $t('word.database') }}</label>
|
<label class="form-label cut-text">{{ $t('word.database') }}</label>
|
||||||
</div>
|
</div>
|
||||||
<div class="column col-8 col-sm-12">
|
<div class="column col-8 col-sm-12">
|
||||||
<BaseUploadInput
|
<BaseUploadInput
|
||||||
@@ -101,7 +101,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div v-if="!customizations.fileConnection" class="form-group columns">
|
<div v-if="!customizations.fileConnection" class="form-group columns">
|
||||||
<div class="column col-4 col-sm-12">
|
<div class="column col-4 col-sm-12">
|
||||||
<label class="form-label">{{ $t('word.port') }}</label>
|
<label class="form-label cut-text">{{ $t('word.port') }}</label>
|
||||||
</div>
|
</div>
|
||||||
<div class="column col-8 col-sm-12">
|
<div class="column col-8 col-sm-12">
|
||||||
<input
|
<input
|
||||||
@@ -115,7 +115,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div v-if="customizations.database" class="form-group columns">
|
<div v-if="customizations.database" class="form-group columns">
|
||||||
<div class="column col-4 col-sm-12">
|
<div class="column col-4 col-sm-12">
|
||||||
<label class="form-label">{{ $t('word.database') }}</label>
|
<label class="form-label cut-text">{{ $t('word.database') }}</label>
|
||||||
</div>
|
</div>
|
||||||
<div class="column col-8 col-sm-12">
|
<div class="column col-8 col-sm-12">
|
||||||
<input
|
<input
|
||||||
@@ -127,7 +127,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div v-if="!customizations.fileConnection" class="form-group columns">
|
<div v-if="!customizations.fileConnection" class="form-group columns">
|
||||||
<div class="column col-4 col-sm-12">
|
<div class="column col-4 col-sm-12">
|
||||||
<label class="form-label">{{ $t('word.user') }}</label>
|
<label class="form-label cut-text">{{ $t('word.user') }}</label>
|
||||||
</div>
|
</div>
|
||||||
<div class="column col-8 col-sm-12">
|
<div class="column col-8 col-sm-12">
|
||||||
<input
|
<input
|
||||||
@@ -140,7 +140,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div v-if="!customizations.fileConnection" class="form-group columns">
|
<div v-if="!customizations.fileConnection" class="form-group columns">
|
||||||
<div class="column col-4 col-sm-12">
|
<div class="column col-4 col-sm-12">
|
||||||
<label class="form-label">{{ $t('word.password') }}</label>
|
<label class="form-label cut-text">{{ $t('word.password') }}</label>
|
||||||
</div>
|
</div>
|
||||||
<div class="column col-8 col-sm-12">
|
<div class="column col-8 col-sm-12">
|
||||||
<input
|
<input
|
||||||
@@ -153,7 +153,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div v-if="customizations.connectionSchema" class="form-group columns">
|
<div v-if="customizations.connectionSchema" class="form-group columns">
|
||||||
<div class="column col-4 col-sm-12">
|
<div class="column col-4 col-sm-12">
|
||||||
<label class="form-label">{{ $t('word.schema') }}</label>
|
<label class="form-label cut-text">{{ $t('word.schema') }}</label>
|
||||||
</div>
|
</div>
|
||||||
<div class="column col-8 col-sm-12">
|
<div class="column col-8 col-sm-12">
|
||||||
<input
|
<input
|
||||||
@@ -189,7 +189,7 @@
|
|||||||
<form class="form-horizontal">
|
<form class="form-horizontal">
|
||||||
<div class="form-group columns">
|
<div class="form-group columns">
|
||||||
<div class="column col-4 col-sm-12">
|
<div class="column col-4 col-sm-12">
|
||||||
<label class="form-label">
|
<label class="form-label cut-text">
|
||||||
{{ $t('message.enableSsl') }}
|
{{ $t('message.enableSsl') }}
|
||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
@@ -203,7 +203,7 @@
|
|||||||
<fieldset class="m-0" :disabled="isBusy || !connection.ssl">
|
<fieldset class="m-0" :disabled="isBusy || !connection.ssl">
|
||||||
<div class="form-group columns">
|
<div class="form-group columns">
|
||||||
<div class="column col-4 col-sm-12">
|
<div class="column col-4 col-sm-12">
|
||||||
<label class="form-label">{{ $t('word.privateKey') }}</label>
|
<label class="form-label cut-text">{{ $t('word.privateKey') }}</label>
|
||||||
</div>
|
</div>
|
||||||
<div class="column col-8 col-sm-12">
|
<div class="column col-8 col-sm-12">
|
||||||
<BaseUploadInput
|
<BaseUploadInput
|
||||||
@@ -216,7 +216,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="form-group columns">
|
<div class="form-group columns">
|
||||||
<div class="column col-4 col-sm-12">
|
<div class="column col-4 col-sm-12">
|
||||||
<label class="form-label">{{ $t('word.certificate') }}</label>
|
<label class="form-label cut-text">{{ $t('word.certificate') }}</label>
|
||||||
</div>
|
</div>
|
||||||
<div class="column col-8 col-sm-12">
|
<div class="column col-8 col-sm-12">
|
||||||
<BaseUploadInput
|
<BaseUploadInput
|
||||||
@@ -229,7 +229,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="form-group columns">
|
<div class="form-group columns">
|
||||||
<div class="column col-4 col-sm-12">
|
<div class="column col-4 col-sm-12">
|
||||||
<label class="form-label">{{ $t('word.caCertificate') }}</label>
|
<label class="form-label cut-text">{{ $t('word.caCertificate') }}</label>
|
||||||
</div>
|
</div>
|
||||||
<div class="column col-8 col-sm-12">
|
<div class="column col-8 col-sm-12">
|
||||||
<BaseUploadInput
|
<BaseUploadInput
|
||||||
@@ -242,7 +242,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="form-group columns">
|
<div class="form-group columns">
|
||||||
<div class="column col-4 col-sm-12">
|
<div class="column col-4 col-sm-12">
|
||||||
<label class="form-label">{{ $t('word.ciphers') }}</label>
|
<label class="form-label cut-text">{{ $t('word.ciphers') }}</label>
|
||||||
</div>
|
</div>
|
||||||
<div class="column col-8 col-sm-12">
|
<div class="column col-8 col-sm-12">
|
||||||
<input
|
<input
|
||||||
@@ -253,6 +253,14 @@
|
|||||||
>
|
>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="form-group columns">
|
||||||
|
<div class="column col-4 col-sm-12" />
|
||||||
|
<div class="column col-8 col-sm-12">
|
||||||
|
<label class="form-checkbox form-inline">
|
||||||
|
<input v-model="connection.untrustedConnection" type="checkbox"><i class="form-icon" /> {{ $t('message.untrustedConnection') }}
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</fieldset>
|
</fieldset>
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
@@ -262,7 +270,7 @@
|
|||||||
<form class="form-horizontal">
|
<form class="form-horizontal">
|
||||||
<div class="form-group columns">
|
<div class="form-group columns">
|
||||||
<div class="column col-4 col-sm-12">
|
<div class="column col-4 col-sm-12">
|
||||||
<label class="form-label">
|
<label class="form-label cut-text">
|
||||||
{{ $t('message.enableSsh') }}
|
{{ $t('message.enableSsh') }}
|
||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
@@ -276,7 +284,7 @@
|
|||||||
<fieldset class="m-0" :disabled="isBusy || !connection.ssh">
|
<fieldset class="m-0" :disabled="isBusy || !connection.ssh">
|
||||||
<div class="form-group columns">
|
<div class="form-group columns">
|
||||||
<div class="column col-4 col-sm-12">
|
<div class="column col-4 col-sm-12">
|
||||||
<label class="form-label">{{ $t('word.hostName') }}/IP</label>
|
<label class="form-label cut-text">{{ $t('word.hostName') }}/IP</label>
|
||||||
</div>
|
</div>
|
||||||
<div class="column col-8 col-sm-12">
|
<div class="column col-8 col-sm-12">
|
||||||
<input
|
<input
|
||||||
@@ -288,7 +296,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="form-group columns">
|
<div class="form-group columns">
|
||||||
<div class="column col-4 col-sm-12">
|
<div class="column col-4 col-sm-12">
|
||||||
<label class="form-label">{{ $t('word.user') }}</label>
|
<label class="form-label cut-text">{{ $t('word.user') }}</label>
|
||||||
</div>
|
</div>
|
||||||
<div class="column col-8 col-sm-12">
|
<div class="column col-8 col-sm-12">
|
||||||
<input
|
<input
|
||||||
@@ -300,7 +308,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="form-group columns">
|
<div class="form-group columns">
|
||||||
<div class="column col-4 col-sm-12">
|
<div class="column col-4 col-sm-12">
|
||||||
<label class="form-label">{{ $t('word.password') }}</label>
|
<label class="form-label cut-text">{{ $t('word.password') }}</label>
|
||||||
</div>
|
</div>
|
||||||
<div class="column col-8 col-sm-12">
|
<div class="column col-8 col-sm-12">
|
||||||
<input
|
<input
|
||||||
@@ -312,7 +320,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="form-group columns">
|
<div class="form-group columns">
|
||||||
<div class="column col-4 col-sm-12">
|
<div class="column col-4 col-sm-12">
|
||||||
<label class="form-label">{{ $t('word.port') }}</label>
|
<label class="form-label cut-text">{{ $t('word.port') }}</label>
|
||||||
</div>
|
</div>
|
||||||
<div class="column col-8 col-sm-12">
|
<div class="column col-8 col-sm-12">
|
||||||
<input
|
<input
|
||||||
@@ -326,7 +334,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="form-group columns">
|
<div class="form-group columns">
|
||||||
<div class="column col-4 col-sm-12">
|
<div class="column col-4 col-sm-12">
|
||||||
<label class="form-label">{{ $t('word.privateKey') }}</label>
|
<label class="form-label cut-text">{{ $t('word.privateKey') }}</label>
|
||||||
</div>
|
</div>
|
||||||
<div class="column col-8 col-sm-12">
|
<div class="column col-8 col-sm-12">
|
||||||
<BaseUploadInput
|
<BaseUploadInput
|
||||||
@@ -339,7 +347,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="form-group columns">
|
<div class="form-group columns">
|
||||||
<div class="column col-4 col-sm-12">
|
<div class="column col-4 col-sm-12">
|
||||||
<label class="form-label">{{ $t('word.passphrase') }}</label>
|
<label class="form-label cut-text">{{ $t('word.passphrase') }}</label>
|
||||||
</div>
|
</div>
|
||||||
<div class="column col-8 col-sm-12">
|
<div class="column col-8 col-sm-12">
|
||||||
<input
|
<input
|
||||||
@@ -420,6 +428,7 @@ export default {
|
|||||||
key: '',
|
key: '',
|
||||||
ca: '',
|
ca: '',
|
||||||
ciphers: '',
|
ciphers: '',
|
||||||
|
untrustedConnection: false,
|
||||||
ssh: false,
|
ssh: false,
|
||||||
sshHost: '',
|
sshHost: '',
|
||||||
sshUser: '',
|
sshUser: '',
|
||||||
@@ -554,12 +563,12 @@ export default {
|
|||||||
|
|
||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
.connection-panel {
|
.connection-panel {
|
||||||
margin-top: 15vh;
|
|
||||||
margin-left: auto;
|
margin-left: auto;
|
||||||
margin-right: auto;
|
margin-right: auto;
|
||||||
|
margin-bottom: 1rem;
|
||||||
|
|
||||||
.panel {
|
.panel {
|
||||||
width: 450px;
|
min-width: 450px;
|
||||||
border-radius: $border-radius;
|
border-radius: $border-radius;
|
||||||
|
|
||||||
.panel-body {
|
.panel-body {
|
||||||
|
@@ -34,7 +34,7 @@
|
|||||||
<fieldset class="m-0" :disabled="isBusy">
|
<fieldset class="m-0" :disabled="isBusy">
|
||||||
<div class="form-group columns">
|
<div class="form-group columns">
|
||||||
<div class="column col-4 col-sm-12">
|
<div class="column col-4 col-sm-12">
|
||||||
<label class="form-label">{{ $t('word.connectionName') }}</label>
|
<label class="form-label cut-text">{{ $t('word.connectionName') }}</label>
|
||||||
</div>
|
</div>
|
||||||
<div class="column col-8 col-sm-12">
|
<div class="column col-8 col-sm-12">
|
||||||
<input
|
<input
|
||||||
@@ -47,7 +47,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="form-group columns">
|
<div class="form-group columns">
|
||||||
<div class="column col-4 col-sm-12">
|
<div class="column col-4 col-sm-12">
|
||||||
<label class="form-label">{{ $t('word.client') }}</label>
|
<label class="form-label cut-text">{{ $t('word.client') }}</label>
|
||||||
</div>
|
</div>
|
||||||
<div class="column col-8 col-sm-12">
|
<div class="column col-8 col-sm-12">
|
||||||
<select v-model="localConnection.client" class="form-select">
|
<select v-model="localConnection.client" class="form-select">
|
||||||
@@ -63,7 +63,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div v-if="connection.client === 'pg'" class="form-group columns">
|
<div v-if="connection.client === 'pg'" class="form-group columns">
|
||||||
<div class="column col-4 col-sm-12">
|
<div class="column col-4 col-sm-12">
|
||||||
<label class="form-label">{{ $t('word.connectionString') }}</label>
|
<label class="form-label cut-text">{{ $t('word.connectionString') }}</label>
|
||||||
</div>
|
</div>
|
||||||
<div class="column col-8 col-sm-12">
|
<div class="column col-8 col-sm-12">
|
||||||
<input
|
<input
|
||||||
@@ -76,7 +76,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div v-if="!customizations.fileConnection" class="form-group columns">
|
<div v-if="!customizations.fileConnection" class="form-group columns">
|
||||||
<div class="column col-4 col-sm-12">
|
<div class="column col-4 col-sm-12">
|
||||||
<label class="form-label">{{ $t('word.hostName') }}/IP</label>
|
<label class="form-label cut-text">{{ $t('word.hostName') }}/IP</label>
|
||||||
</div>
|
</div>
|
||||||
<div class="column col-8 col-sm-12">
|
<div class="column col-8 col-sm-12">
|
||||||
<input
|
<input
|
||||||
@@ -88,7 +88,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div v-if="customizations.fileConnection" class="form-group columns">
|
<div v-if="customizations.fileConnection" class="form-group columns">
|
||||||
<div class="column col-4 col-sm-12">
|
<div class="column col-4 col-sm-12">
|
||||||
<label class="form-label">{{ $t('word.database') }}</label>
|
<label class="form-label cut-text">{{ $t('word.database') }}</label>
|
||||||
</div>
|
</div>
|
||||||
<div class="column col-8 col-sm-12">
|
<div class="column col-8 col-sm-12">
|
||||||
<BaseUploadInput
|
<BaseUploadInput
|
||||||
@@ -101,7 +101,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div v-if="!customizations.fileConnection" class="form-group columns">
|
<div v-if="!customizations.fileConnection" class="form-group columns">
|
||||||
<div class="column col-4 col-sm-12">
|
<div class="column col-4 col-sm-12">
|
||||||
<label class="form-label">{{ $t('word.port') }}</label>
|
<label class="form-label cut-text">{{ $t('word.port') }}</label>
|
||||||
</div>
|
</div>
|
||||||
<div class="column col-8 col-sm-12">
|
<div class="column col-8 col-sm-12">
|
||||||
<input
|
<input
|
||||||
@@ -115,7 +115,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div v-if="customizations.database" class="form-group columns">
|
<div v-if="customizations.database" class="form-group columns">
|
||||||
<div class="column col-4 col-sm-12">
|
<div class="column col-4 col-sm-12">
|
||||||
<label class="form-label">{{ $t('word.database') }}</label>
|
<label class="form-label cut-text">{{ $t('word.database') }}</label>
|
||||||
</div>
|
</div>
|
||||||
<div class="column col-8 col-sm-12">
|
<div class="column col-8 col-sm-12">
|
||||||
<input
|
<input
|
||||||
@@ -127,7 +127,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div v-if="!customizations.fileConnection" class="form-group columns">
|
<div v-if="!customizations.fileConnection" class="form-group columns">
|
||||||
<div class="column col-4 col-sm-12">
|
<div class="column col-4 col-sm-12">
|
||||||
<label class="form-label">{{ $t('word.user') }}</label>
|
<label class="form-label cut-text">{{ $t('word.user') }}</label>
|
||||||
</div>
|
</div>
|
||||||
<div class="column col-8 col-sm-12">
|
<div class="column col-8 col-sm-12">
|
||||||
<input
|
<input
|
||||||
@@ -140,7 +140,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div v-if="!customizations.fileConnection" class="form-group columns">
|
<div v-if="!customizations.fileConnection" class="form-group columns">
|
||||||
<div class="column col-4 col-sm-12">
|
<div class="column col-4 col-sm-12">
|
||||||
<label class="form-label">{{ $t('word.password') }}</label>
|
<label class="form-label cut-text">{{ $t('word.password') }}</label>
|
||||||
</div>
|
</div>
|
||||||
<div class="column col-8 col-sm-12">
|
<div class="column col-8 col-sm-12">
|
||||||
<input
|
<input
|
||||||
@@ -153,7 +153,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div v-if="customizations.connectionSchema" class="form-group columns">
|
<div v-if="customizations.connectionSchema" class="form-group columns">
|
||||||
<div class="column col-4 col-sm-12">
|
<div class="column col-4 col-sm-12">
|
||||||
<label class="form-label">{{ $t('word.schema') }}</label>
|
<label class="form-label cut-text">{{ $t('word.schema') }}</label>
|
||||||
</div>
|
</div>
|
||||||
<div class="column col-8 col-sm-12">
|
<div class="column col-8 col-sm-12">
|
||||||
<input
|
<input
|
||||||
@@ -189,7 +189,7 @@
|
|||||||
<form class="form-horizontal">
|
<form class="form-horizontal">
|
||||||
<div class="form-group columns">
|
<div class="form-group columns">
|
||||||
<div class="column col-4 col-sm-12">
|
<div class="column col-4 col-sm-12">
|
||||||
<label class="form-label">
|
<label class="form-label cut-text">
|
||||||
{{ $t('message.enableSsl') }}
|
{{ $t('message.enableSsl') }}
|
||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
@@ -203,7 +203,7 @@
|
|||||||
<fieldset class="m-0" :disabled="isBusy || !localConnection.ssl">
|
<fieldset class="m-0" :disabled="isBusy || !localConnection.ssl">
|
||||||
<div class="form-group columns">
|
<div class="form-group columns">
|
||||||
<div class="column col-4 col-sm-12">
|
<div class="column col-4 col-sm-12">
|
||||||
<label class="form-label">{{ $t('word.privateKey') }}</label>
|
<label class="form-label cut-text">{{ $t('word.privateKey') }}</label>
|
||||||
</div>
|
</div>
|
||||||
<div class="column col-8 col-sm-12">
|
<div class="column col-8 col-sm-12">
|
||||||
<BaseUploadInput
|
<BaseUploadInput
|
||||||
@@ -216,7 +216,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="form-group columns">
|
<div class="form-group columns">
|
||||||
<div class="column col-4 col-sm-12">
|
<div class="column col-4 col-sm-12">
|
||||||
<label class="form-label">{{ $t('word.certificate') }}</label>
|
<label class="form-label cut-text">{{ $t('word.certificate') }}</label>
|
||||||
</div>
|
</div>
|
||||||
<div class="column col-8 col-sm-12">
|
<div class="column col-8 col-sm-12">
|
||||||
<BaseUploadInput
|
<BaseUploadInput
|
||||||
@@ -229,7 +229,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="form-group columns">
|
<div class="form-group columns">
|
||||||
<div class="column col-4 col-sm-12">
|
<div class="column col-4 col-sm-12">
|
||||||
<label class="form-label">{{ $t('word.caCertificate') }}</label>
|
<label class="form-label cut-text">{{ $t('word.caCertificate') }}</label>
|
||||||
</div>
|
</div>
|
||||||
<div class="column col-8 col-sm-12">
|
<div class="column col-8 col-sm-12">
|
||||||
<BaseUploadInput
|
<BaseUploadInput
|
||||||
@@ -242,7 +242,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="form-group columns">
|
<div class="form-group columns">
|
||||||
<div class="column col-4 col-sm-12">
|
<div class="column col-4 col-sm-12">
|
||||||
<label class="form-label">{{ $t('word.ciphers') }}</label>
|
<label class="form-label cut-text">{{ $t('word.ciphers') }}</label>
|
||||||
</div>
|
</div>
|
||||||
<div class="column col-8 col-sm-12">
|
<div class="column col-8 col-sm-12">
|
||||||
<input
|
<input
|
||||||
@@ -253,6 +253,14 @@
|
|||||||
>
|
>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="form-group columns">
|
||||||
|
<div class="column col-4 col-sm-12" />
|
||||||
|
<div class="column col-8 col-sm-12">
|
||||||
|
<label class="form-checkbox form-inline">
|
||||||
|
<input v-model="localConnection.untrustedConnection" type="checkbox"><i class="form-icon" /> {{ $t('message.untrustedConnection') }}
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</fieldset>
|
</fieldset>
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
@@ -262,7 +270,7 @@
|
|||||||
<form class="form-horizontal">
|
<form class="form-horizontal">
|
||||||
<div class="form-group columns">
|
<div class="form-group columns">
|
||||||
<div class="column col-4 col-sm-12">
|
<div class="column col-4 col-sm-12">
|
||||||
<label class="form-label">
|
<label class="form-label cut-text">
|
||||||
{{ $t('message.enableSsh') }}
|
{{ $t('message.enableSsh') }}
|
||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
@@ -276,7 +284,7 @@
|
|||||||
<fieldset class="m-0" :disabled="isBusy || !localConnection.ssh">
|
<fieldset class="m-0" :disabled="isBusy || !localConnection.ssh">
|
||||||
<div class="form-group columns">
|
<div class="form-group columns">
|
||||||
<div class="column col-4 col-sm-12">
|
<div class="column col-4 col-sm-12">
|
||||||
<label class="form-label">{{ $t('word.hostName') }}/IP</label>
|
<label class="form-label cut-text">{{ $t('word.hostName') }}/IP</label>
|
||||||
</div>
|
</div>
|
||||||
<div class="column col-8 col-sm-12">
|
<div class="column col-8 col-sm-12">
|
||||||
<input
|
<input
|
||||||
@@ -288,7 +296,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="form-group columns">
|
<div class="form-group columns">
|
||||||
<div class="column col-4 col-sm-12">
|
<div class="column col-4 col-sm-12">
|
||||||
<label class="form-label">{{ $t('word.user') }}</label>
|
<label class="form-label cut-text">{{ $t('word.user') }}</label>
|
||||||
</div>
|
</div>
|
||||||
<div class="column col-8 col-sm-12">
|
<div class="column col-8 col-sm-12">
|
||||||
<input
|
<input
|
||||||
@@ -300,7 +308,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="form-group columns">
|
<div class="form-group columns">
|
||||||
<div class="column col-4 col-sm-12">
|
<div class="column col-4 col-sm-12">
|
||||||
<label class="form-label">{{ $t('word.password') }}</label>
|
<label class="form-label cut-text">{{ $t('word.password') }}</label>
|
||||||
</div>
|
</div>
|
||||||
<div class="column col-8 col-sm-12">
|
<div class="column col-8 col-sm-12">
|
||||||
<input
|
<input
|
||||||
@@ -312,7 +320,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="form-group columns">
|
<div class="form-group columns">
|
||||||
<div class="column col-4 col-sm-12">
|
<div class="column col-4 col-sm-12">
|
||||||
<label class="form-label">{{ $t('word.port') }}</label>
|
<label class="form-label cut-text">{{ $t('word.port') }}</label>
|
||||||
</div>
|
</div>
|
||||||
<div class="column col-8 col-sm-12">
|
<div class="column col-8 col-sm-12">
|
||||||
<input
|
<input
|
||||||
@@ -326,7 +334,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="form-group columns">
|
<div class="form-group columns">
|
||||||
<div class="column col-4 col-sm-12">
|
<div class="column col-4 col-sm-12">
|
||||||
<label class="form-label">{{ $t('word.privateKey') }}</label>
|
<label class="form-label cut-text">{{ $t('word.privateKey') }}</label>
|
||||||
</div>
|
</div>
|
||||||
<div class="column col-8 col-sm-12">
|
<div class="column col-8 col-sm-12">
|
||||||
<BaseUploadInput
|
<BaseUploadInput
|
||||||
@@ -339,7 +347,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="form-group columns">
|
<div class="form-group columns">
|
||||||
<div class="column col-4 col-sm-12">
|
<div class="column col-4 col-sm-12">
|
||||||
<label class="form-label">{{ $t('word.passphrase') }}</label>
|
<label class="form-label cut-text">{{ $t('word.passphrase') }}</label>
|
||||||
</div>
|
</div>
|
||||||
<div class="column col-8 col-sm-12">
|
<div class="column col-8 col-sm-12">
|
||||||
<input
|
<input
|
||||||
@@ -532,12 +540,12 @@ export default {
|
|||||||
|
|
||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
.connection-panel {
|
.connection-panel {
|
||||||
margin-top: 15vh;
|
|
||||||
margin-left: auto;
|
margin-left: auto;
|
||||||
margin-right: auto;
|
margin-right: auto;
|
||||||
|
margin-bottom: 1rem;
|
||||||
|
|
||||||
.panel {
|
.panel {
|
||||||
width: 450px;
|
min-width: 450px;
|
||||||
border-radius: $border-radius;
|
border-radius: $border-radius;
|
||||||
|
|
||||||
.panel-body {
|
.panel-body {
|
||||||
|
@@ -283,7 +283,12 @@ module.exports = {
|
|||||||
manualCommit: 'Manual commit',
|
manualCommit: 'Manual commit',
|
||||||
actionSuccessful: '{action} successful',
|
actionSuccessful: '{action} successful',
|
||||||
importQueryErrors: 'Warning: {n} error has accurrend | Warning: {n} errors occurred',
|
importQueryErrors: 'Warning: {n} error has accurrend | Warning: {n} errors occurred',
|
||||||
executedQueries: '{n} query executed | {n} queries executed'
|
executedQueries: '{n} query executed | {n} queries executed',
|
||||||
|
ourputFormat: 'Output format',
|
||||||
|
singleFile: 'Single {ext} file',
|
||||||
|
zipCompressedFile: 'ZIP compressed {ext} file',
|
||||||
|
disableBlur: 'Disable blur',
|
||||||
|
untrustedConnection: 'Untrusted connection'
|
||||||
},
|
},
|
||||||
faker: {
|
faker: {
|
||||||
address: 'Address',
|
address: 'Address',
|
||||||
|
@@ -1,196 +1,298 @@
|
|||||||
module.exports = {
|
module.exports = {
|
||||||
word: {
|
word: {
|
||||||
edit: 'Éditer',
|
edit: 'Editer',
|
||||||
save: 'Enregistrer',
|
save: 'Sauver',
|
||||||
close: 'Fermer',
|
close: 'Fermer',
|
||||||
delete: 'Supprimer',
|
delete: 'Effacer',
|
||||||
confirm: 'Confirmer',
|
confirm: 'Confirmer',
|
||||||
cancel: 'Annuler',
|
cancel: 'Annuler',
|
||||||
send: 'Envoyer',
|
send: 'Envoyer',
|
||||||
connectionName: 'Nom de connexion',
|
connectionName: 'Nom de la connexion',
|
||||||
client: 'Client',
|
client: 'Client',
|
||||||
hostName: 'Nom d\'hôte',
|
hostName: 'Nom du host',
|
||||||
port: 'Port',
|
port: 'Port',
|
||||||
user: 'Utilisateur',
|
user: 'Utilisateur',
|
||||||
password: 'Mot de passe',
|
password: 'Mot de passe',
|
||||||
credentials: 'Identifiants',
|
credentials: 'Credentials',
|
||||||
connect: 'Se connecter',
|
connect: 'Connexion',
|
||||||
connected: 'Connecté',
|
connected: 'Connecté',
|
||||||
disconnect: 'Se déconnecter',
|
disconnect: 'Déconnection',
|
||||||
disconnected: 'Déconnecté',
|
disconnected: 'Déconnecté',
|
||||||
refresh: 'Rafraichir',
|
refresh: 'Rafrechir',
|
||||||
settings: 'Paramètres',
|
settings: 'Paramètres',
|
||||||
general: 'Général',
|
general: 'Général',
|
||||||
themes: 'Thèmes',
|
themes: 'Thèmes',
|
||||||
update: 'Mise à jour',
|
update: 'Mise à jour',
|
||||||
about: 'À propos',
|
about: 'A propos de',
|
||||||
language: 'Langue',
|
language: 'Langage',
|
||||||
version: 'Version',
|
version: 'Version',
|
||||||
donate: 'Faire un don',
|
donate: 'Faire une donation',
|
||||||
run: 'Exécuter',
|
run: 'Lancer',
|
||||||
schema: 'Schéma',
|
schema: 'Schéma',
|
||||||
results: 'Résutats',
|
results: 'Resultats',
|
||||||
size: 'Taille',
|
size: 'Taille',
|
||||||
seconds: 'Secondes',
|
seconds: 'Secondes',
|
||||||
type: 'Type',
|
type: 'Type',
|
||||||
mimeType: 'Mime-Type',
|
mimeType: 'Mime-Type',
|
||||||
download: 'Télécharger',
|
download: 'Télécharger',
|
||||||
add: 'Ajouter',
|
add: 'Ajouter',
|
||||||
data: 'Données',
|
data: 'Donnée',
|
||||||
properties: 'Propriétés',
|
properties: 'Propriétés',
|
||||||
insert: 'Insérer',
|
insert: 'Insérer',
|
||||||
connecting: 'Connexion',
|
connecting: 'Connexion en cours',
|
||||||
name: 'Nom',
|
name: 'Nom',
|
||||||
collation: 'Collation',
|
collation: 'Langage',
|
||||||
clear: 'Effacer',
|
clear: 'Effacer',
|
||||||
options: 'Options',
|
options: 'Options',
|
||||||
autoRefresh: 'Auto-rafraichissement',
|
autoRefresh: 'Auto-rafraichissemnt',
|
||||||
indexes: 'Index',
|
indexes: 'Indexs',
|
||||||
foreignKeys: 'Clés étrangères',
|
foreignKeys: 'Clefs étrangères',
|
||||||
length: 'Taille',
|
length: 'Longueur',
|
||||||
unsigned: 'Non-signé',
|
unsigned: 'non signé',
|
||||||
default: 'Défaut',
|
default: 'Par défault',
|
||||||
comment: 'Commentaire',
|
comment: 'Commentaire',
|
||||||
key: 'Clé | Clés',
|
key: 'Clef | Clefs',
|
||||||
order: 'Ordre',
|
order: 'Ordre',
|
||||||
expression: 'Expression',
|
expression: 'Expression',
|
||||||
autoIncrement: 'Auto Increment',
|
autoIncrement: 'Auto Incrémentation',
|
||||||
engine: 'Engine',
|
engine: 'Moteur',
|
||||||
field: 'Champ | Champs',
|
field: 'Champ | Champs',
|
||||||
approximately: 'Approximativement',
|
approximately: 'Approximativement',
|
||||||
total: 'Totale',
|
total: 'Total',
|
||||||
table: 'Table',
|
table: 'Table',
|
||||||
discard: 'Abandonner',
|
discard: 'Jeter',
|
||||||
stay: 'Rester',
|
stay: 'Rester',
|
||||||
author: 'Auteur',
|
author: 'Auteur',
|
||||||
light: 'Clair',
|
light: 'Léger',
|
||||||
dark: 'Sombre',
|
dark: 'Sombre',
|
||||||
autoCompletion: 'Completion auto',
|
autoCompletion: 'Auto Completion',
|
||||||
application: 'Application',
|
application: 'Application',
|
||||||
editor: 'Editeur',
|
editor: 'Editor',
|
||||||
view: 'Vue',
|
view: 'Vue',
|
||||||
definer: 'Définisseur',
|
definer: 'Définisseur',
|
||||||
algorithm: 'Algorithme',
|
algorithme: 'Algorithme',
|
||||||
trigger: 'Déclencheur | Déclencheurs',
|
trigger: 'Déclencheur | Déclencheurs',
|
||||||
storedRoutine: 'Procedure stockée | Procedures stockées',
|
storedRoutine: 'Routine stockée | Routines stockées',
|
||||||
scheduler: 'Opération planifiée | Opérations planifiées',
|
scheduler: 'Planificateur | Planificateurs',
|
||||||
event: 'Evenement',
|
event: 'Évènement',
|
||||||
parameters: 'Paramètres',
|
parameters: 'Paramètres',
|
||||||
function: 'Fonction | Fonctions',
|
function: 'Fonction | Fonctions',
|
||||||
deterministic: 'Déterministe',
|
deterministic: 'Déterministe',
|
||||||
context: 'Contextz',
|
context: 'Contexte',
|
||||||
export: 'Exporter',
|
export: 'Export',
|
||||||
returns: 'Retourner',
|
import: 'Import',
|
||||||
timing: 'Horaire',
|
returns: 'Retourne',
|
||||||
state: 'État',
|
timing: 'Temps',
|
||||||
|
state: 'Etat',
|
||||||
execution: 'Exécution',
|
execution: 'Exécution',
|
||||||
starts: 'Débuts',
|
starts: 'Commence',
|
||||||
ends: 'Fins',
|
ends: 'Fini',
|
||||||
ssl: 'SSL',
|
ssl: 'SSL',
|
||||||
privateKey: 'Clé privée',
|
privateKey: 'Clé privée',
|
||||||
certificate: 'Certificat',
|
certificate: 'Certificat',
|
||||||
caCertificate: 'CA certificat',
|
caCertificate: 'Certificat CA',
|
||||||
ciphers: 'Chiffrement',
|
ciphers: 'Codes secrets',
|
||||||
upload: 'Charger',
|
upload: 'Téléverser',
|
||||||
browse: 'Parcourir',
|
browse: 'Naviguer',
|
||||||
faker: 'Faker',
|
faker: 'Imposteur',
|
||||||
sshTunnel: 'SSH tunnel'
|
sshTunnel: 'SSH tunnel',
|
||||||
|
content: 'Contenu',
|
||||||
|
cut: 'Couper',
|
||||||
|
copy: 'Copier',
|
||||||
|
paste: 'Coller',
|
||||||
|
tools: 'Outils',
|
||||||
|
variables: 'Variables',
|
||||||
|
processes: 'Processus',
|
||||||
|
Database: 'Base de données',
|
||||||
|
scratchpad: 'Bloc-notes',
|
||||||
|
array: 'Tableau',
|
||||||
|
changelog: 'Log de changement',
|
||||||
|
Format: 'Format',
|
||||||
|
structure: 'Structure',
|
||||||
|
small: 'Petit',
|
||||||
|
medium: 'Moyen',
|
||||||
|
large: 'Grand',
|
||||||
|
row: 'Ligne | Lignes',
|
||||||
|
cell: 'Cellule | Cellules',
|
||||||
|
triggerFunction: 'Fonction de déclenchement | Fonctions de déclenchement',
|
||||||
|
all: 'Tout',
|
||||||
|
duplicate: 'Double',
|
||||||
|
routine: 'Routine',
|
||||||
|
new: 'Nouveau',
|
||||||
|
history: 'Passé',
|
||||||
|
select: 'Sélectionner',
|
||||||
|
passphrase: 'Phrase',
|
||||||
|
filter: 'Filtre',
|
||||||
|
change: 'Changement',
|
||||||
|
views: 'Vues',
|
||||||
|
triggers: 'Déclencheurs',
|
||||||
|
routines: 'Routines',
|
||||||
|
fonctions: 'Fonctions',
|
||||||
|
schedulers: 'Programmateurs',
|
||||||
|
includes: 'Inclut',
|
||||||
|
drop: 'Effacer',
|
||||||
|
completed: 'Terminé',
|
||||||
|
aborted: 'Annulé',
|
||||||
|
disabled: 'Désactivé',
|
||||||
|
enable: 'activer',
|
||||||
|
disable: 'Désactiver',
|
||||||
|
commit: 'Appliquer',
|
||||||
|
rollback: 'Retour arrière',
|
||||||
|
connectionString: 'Chaîne de connexion',
|
||||||
|
contributors: 'Contributeurs'
|
||||||
},
|
},
|
||||||
message: {
|
message: {
|
||||||
appWelcome: 'Bienvenu sur le client SQL Antares!',
|
appWelcome: 'Bienvenue dans le client SQL Antares!',
|
||||||
appFirstStep: 'Première étape: Créer une nouvelle connexion à une base de données.',
|
appFirstStep: 'Votre première étape : créer une nouvelle connexion à la base de données.',
|
||||||
addConnection: 'Ajouter une connexion',
|
addConnection: 'Ajouter une connexion',
|
||||||
createConnection: 'Créer une connexion',
|
createConnection: 'Créer une connexion',
|
||||||
createNewConnection: 'Créer une nouvelle connexion',
|
createNewConnection: 'Créer une nouvelle connexion',
|
||||||
askCredentials: 'Demander les identifiants',
|
askCredentials: 'Demander des informations d\'identification',
|
||||||
testConnection: 'Tester la connexion',
|
testConnection: 'Tester la connexion',
|
||||||
editConnection: 'Editer la connexion',
|
editConnection: 'Modifier la connexion',
|
||||||
deleteConnection: 'Supprimer la connexion',
|
deleteConnection: 'Supprimer la connexion',
|
||||||
deleteCorfirm: 'Êtes-vous sûr de vouloir annuler',
|
deleteCorfirm: 'Confirmez-vous l\'annulation de',
|
||||||
connectionSuccessfullyMade: 'Connexion établie avec succès !',
|
connectionSuccessfullyMade: 'Connexion établie avec succès !',
|
||||||
madeWithJS: 'Créé avec 💛 et JavaScript!',
|
madeWithJS: 'Fait avec 💛 et JavaScript !',
|
||||||
checkForUpdates: 'Rechercher des mises à jour',
|
checkForUpdates: 'Vérifier les mises à jour',
|
||||||
noUpdatesAvailable: 'Aucune mise à jour disponible',
|
noUpdatesAvailable: 'Aucune mise à jour disponible',
|
||||||
checkingForUpdate: 'Recherche de mise à jour',
|
checkingForUpdate: 'Vérification des mises à jour',
|
||||||
checkFailure: 'Erreur lors de la recherche, essayez plus tard',
|
checkFailure: 'La vérification a échoué, veuillez essayer plus tard',
|
||||||
updateAvailable: 'Une mise à jour est disponible',
|
updateAvailable: 'Mise à jour disponible',
|
||||||
downloadingUpdate: 'Téléchargement de la mise à jour',
|
downloadingUpdate: 'Téléchargement de la mise à jour',
|
||||||
updateDownloaded: 'Mise à jour téléchargée',
|
updateDownloaded: 'Mise à jour téléchargée',
|
||||||
restartToInstall: 'Redémarrer Antares pour l\'installer',
|
restartToInstall: 'Redémarrer Antares pour installer',
|
||||||
unableEditFieldWithoutPrimary: 'Impossible de modifier un champ sans clé primaire dans l\'ensemble de résultats',
|
unableEditFieldWithoutPrimary: 'Impossible de modifier un champ sans clé primaire dans le jeu de résultats',
|
||||||
editCell: 'Modifier une cellule',
|
editCell: 'Editer la cellule',
|
||||||
deleteRows: 'Supprimer une ligne | Supprimer {count} lignes',
|
deleteRows: 'Effacer la ligne | Effacer {count} lignes',
|
||||||
confirmToDeleteRows: 'Êtes-vous sûr de vouloir supprimer une ligne? | Êtes-vous sûr de vouloir supprimer {count} lignes?',
|
confirmToDeleteRows: 'Confirmez-vous la suppression d\'une ligne ? | Confirmez-vous la suppression de {count} lignes ?',
|
||||||
notificationsTimeout: 'Délai d\'expiration des notifications',
|
notificationsTimeout: 'Délai d\'attente pour les notifications',
|
||||||
uploadFile: 'Charger un fichier',
|
uploadFile: 'Télécharger un fichier',
|
||||||
addNewRow: 'Ajouter une ligne',
|
addNewRow: 'Ajouter une nouvelle ligne',
|
||||||
numberOfInserts: 'Nombre d\'insertions',
|
numberOfInserts: 'Nombre d\'insertions',
|
||||||
openNewTab: 'Ouvrir un nouvel onglet',
|
openNewTab: 'Ouvrir un nouvel onglet',
|
||||||
affectedRows: 'Lignes concernées',
|
affectedRows: 'Lignes affectées',
|
||||||
createNewDatabase: 'Créer une nouvelle base de données',
|
createNewDatabase: 'Créer une nouvelle base de données',
|
||||||
databaseName: 'Nom par défaut',
|
databaseName: 'Nom de la base de données',
|
||||||
serverDefault: 'Serveur par défaut',
|
serverDefault: 'Serveur par défaut',
|
||||||
deleteDatabase: 'Supprimer la base de données',
|
deleteDatabase: 'Supprimer la base de données',
|
||||||
editDatabase: 'Modifier la base de données',
|
editDatabase: 'Editer la base de données',
|
||||||
clearChanges: 'Effacer les modifications',
|
clearChanges: 'Effacer les modifications',
|
||||||
addNewField: 'Ajouter un champ',
|
addNewField: 'Ajouter un nouveau champ',
|
||||||
manageIndexes: 'Gérer les index',
|
manageIndexes: 'Gère les index',
|
||||||
manageForeignKeys: 'Gérer les clés étrangères',
|
manageForeignKeys: 'Gère les clés étrangères',
|
||||||
allowNull: 'NULL autorisé',
|
allowNull: 'Autoriser NULL',
|
||||||
zeroFill: 'Remplissage zéro',
|
zeroFill: 'Remplissage avec zéro',
|
||||||
customValue: 'Valeur personnalisée',
|
customValue: 'Valeur personnalisée',
|
||||||
onUpdate: 'Lors d\'une mise à jour',
|
onUpdate: 'lors de la mise à jour',
|
||||||
deleteField: 'Supprimer le champ',
|
deleteField: 'Supprimer le champ',
|
||||||
createNewIndex: 'Créer un index',
|
createNewIndex: 'Créer un nouvel index',
|
||||||
addToIndex: 'Ajouter à l\'index',
|
addToIndex: 'Ajouter à l\'index',
|
||||||
createNewTable: 'Créer une nouvelle table',
|
createNewTable: 'Créer une nouvelle table',
|
||||||
emptyTable: 'Table vide',
|
emptyTable: 'Vider la table',
|
||||||
deleteTable: 'Supprimer la table',
|
deleteTable: 'Supprimer une table',
|
||||||
emptyCorfirm: 'Êtes-vous sûr de vouloir videz',
|
emptyCorfirm: 'Confirmez-vous que vous souhaitez vider la table ?',
|
||||||
unsavedChanges: 'Changements non sauvegardés',
|
unsavedChanges: 'Modifications non sauvegardées',
|
||||||
discardUnsavedChanges: 'Vous avez des modifications non sauvegardées. En quittant cet onglet, ces changements seront supprimés.',
|
discardUnsavedChanges: 'Vous avez des modifications non sauvegardées. En fermant cet onglet, ces modifications seront supprimées',
|
||||||
thereAreNoIndexes: 'Il n\'y a pas d\'indexes',
|
thereAreNoIndexes: 'Il n\'y a pas d\'index',
|
||||||
thereAreNoForeign: 'Il n\'y a pas de clés étrangères',
|
thereAreNoForeign: 'Il n\'y a pas de clés étrangères',
|
||||||
createNewForeign: 'Créer une clés étrangère',
|
createNewForeign: 'Créer une nouvelle clé étrangère',
|
||||||
referenceTable: 'Table de référence',
|
referenceTable: 'Table de référence',
|
||||||
referenceField: 'CHamp de référence',
|
referenceField: 'Champ de référence',
|
||||||
foreignFields: 'Champ étrangé',
|
foreignFields: 'Champs étrangers',
|
||||||
invalidDefault: 'Valeur par défaut invalide',
|
invalidDefault: 'Valeur par défaut invalide',
|
||||||
onDelete: 'Lors de la suppression',
|
onDelete: 'lors de l\'effacement',
|
||||||
applicationTheme: 'Thème de l\'application',
|
applicationTheme: 'Thème de l\'application',
|
||||||
editorTheme: 'Thème de l\'éditeur',
|
editorTheme: 'Thème de l\'éditeur',
|
||||||
wrapLongLines: 'Retour à la ligne automatique',
|
wrapLongLines: 'Retour à la ligne pour les lignes longues',
|
||||||
selectStatement: 'Sélectionnez la déclaration',
|
selectStatement: 'Sélectionner un état',
|
||||||
triggerStatement: 'Déclaration de déclencheur',
|
triggerStatement: 'Déclencher un état',
|
||||||
sqlSecurity: 'Sécurité SQL',
|
sqlSecurity: 'Sécurité SQL',
|
||||||
updateOption: 'Options de mises à jour',
|
updateOption: 'Mide à jour d\'une option',
|
||||||
deleteView: 'Supprimer la vue',
|
deleteView: 'Effacer une vue',
|
||||||
createNewView: 'Créer une nouvelle vue',
|
createNewView: 'Créer une nouvelle vue',
|
||||||
deleteTrigger: 'Supprimer le déclencheur',
|
deleteTrigger: 'Effacer un déclencheur',
|
||||||
createNewTrigger: 'Créer un nouveau déclencheur',
|
createNewTrigger: 'Cr"er un nouveau déclencheur',
|
||||||
currentUser: 'Utilisateur actuel',
|
currentUser: 'utilisateur courant',
|
||||||
routineBody: 'Contenu de la procédure',
|
routineBody: 'Corps de la routine',
|
||||||
dataAccess: 'Accès aux données',
|
dataAccess: 'Accès aux données',
|
||||||
thereAreNoParameters: 'Il n\'y a pas de paramètres',
|
thereAreNoParameters: 'Il n\'y a pas de paramètre',
|
||||||
createNewParameter: 'Créer un nouveau paramètre',
|
createNewParameter: 'Créer un nouveau paramètre',
|
||||||
createNewRoutine: 'Créer une nouvelle procédure stockée',
|
createNewRoutine: 'Créer une nouvelle routine stockée',
|
||||||
deleteRoutine: 'Supprimer une procédure stockée',
|
deleteRoutine: 'Effacer une routine stockée',
|
||||||
functionBody: 'Contenu de la fonction',
|
functionBody: 'Corps d\'une fonction',
|
||||||
createNewFunction: 'Créer une nouvelle fonction',
|
createNewFunction: 'Créer une nouvelle fonction',
|
||||||
deleteFunction: 'Supprimer la fonction',
|
deleteFunction: 'Effacer une fonction',
|
||||||
schedulerBody: 'Contenu du opération planifiée',
|
schedulerBody: 'Corps d\'un programmateur',
|
||||||
createNewScheduler: 'Créere une nouvelle opération planifiée',
|
createNewScheduler: 'Créer un nouveau programmateur',
|
||||||
deleteScheduler: 'Supprimer l\'opération planifiée',
|
deleteScheduler: 'Effacer un programmateur',
|
||||||
preserveOnCompletion: 'Préserver à l\'achèvement',
|
preserveOnCompletion: 'Préserver à la terminaison',
|
||||||
enableSsl: 'Activer le SSL',
|
enableSsl: 'Activer le SSL',
|
||||||
manualValue: 'Valeur manuelle',
|
manualValue: 'Valeur manuelle',
|
||||||
tableFiller: 'Remplisseur de table',
|
tableFiller: 'Remplisseur de table',
|
||||||
enableSsh: 'Activer le SSH'
|
fakeDataLanguage: 'Language de données fausses',
|
||||||
|
searchForElements: 'Rechercher des éléments',
|
||||||
|
selectAll: 'Tout séélectionner',
|
||||||
|
queryDuration: 'Temps de requêtage',
|
||||||
|
includeBetaUpdates: 'Inclure les mises à jour beta',
|
||||||
|
setNull: 'Définir comme NULL',
|
||||||
|
processesList: 'List des processus',
|
||||||
|
processInfo: 'Information sur le processus',
|
||||||
|
manageUsers: 'Organisation des utilisateurs',
|
||||||
|
createNewSchema: 'Créer un nouveau schéma',
|
||||||
|
schemaName: 'Nom du Schéma',
|
||||||
|
editSchema: 'Modifier le schéma',
|
||||||
|
deleteSchema: 'Effacer le schéma',
|
||||||
|
markdownSupported: 'Support du Markdown',
|
||||||
|
plantATree: 'Planter un arbre',
|
||||||
|
dataTabPageSize: 'Taille de la page de l\'onglet données',
|
||||||
|
enableSsh: 'Activer le SSH',
|
||||||
|
pageNumber: 'Numéro de la page',
|
||||||
|
duplicateTable: 'Copier la table',
|
||||||
|
noOpenTabs: 'Il n\'y a pas d\'onglet ouvert, naviguer vers la barre gauche ou :',
|
||||||
|
noSchema: 'Pas de schéma',
|
||||||
|
restorePreviourSession: 'Restorer une session précédente',
|
||||||
|
runQuery: 'Lancer la requête',
|
||||||
|
thereAreNoTableFields: 'Il n\'y a pas de champ table',
|
||||||
|
newTable: 'Nouvelle table',
|
||||||
|
newView: 'Nouvelle vue',
|
||||||
|
newTrigger: 'Nouveau déclencheur',
|
||||||
|
newRoutine: 'Nouvelle routine',
|
||||||
|
newFunction: 'Nouvelle function',
|
||||||
|
newScheduler: 'Nouveau déclencheur',
|
||||||
|
newTriggerFunction: 'Nouvelle fonction de déclencheur',
|
||||||
|
thereIsNoQueriesYet: 'Il n\'y a pas encore de requête',
|
||||||
|
searchForQueries: 'Rechercher des requêtes',
|
||||||
|
killProcess: 'tuer un processus',
|
||||||
|
closeTab: 'Fermer un onglet',
|
||||||
|
exportSchema: 'Exporter un schéma',
|
||||||
|
importSchema: 'Importer un schéma',
|
||||||
|
directoryPath: 'chemin du répertoire',
|
||||||
|
newInserStmtEvery: 'Nouvelle déclaration d\'insertion tous les',
|
||||||
|
processingTableExport: 'Traitement {table}',
|
||||||
|
fechingTableExport: 'Recherche des données de la table {table}',
|
||||||
|
writingTableExport: 'Ecriture des données de la table {table}',
|
||||||
|
checkAllTables: 'Vérification de toutes les tables',
|
||||||
|
uncheckAllTables: 'Désélectionner toutes les tables',
|
||||||
|
goToDownloadPage: 'Aller vers la page de téléchargement',
|
||||||
|
readOnlyMode: 'Mode lecture seule',
|
||||||
|
killQuery: 'Terminer une requête',
|
||||||
|
insertRow: 'Insérer un ligne | Insérer des lignes',
|
||||||
|
commitMode: 'Mode insertion directe',
|
||||||
|
autoCommit: 'Insertion directe automatique',
|
||||||
|
manualCommit: 'Insertion directe manuelle',
|
||||||
|
actionSuccessful: '{action} réussie',
|
||||||
|
importQueryErrors: 'Attention : {n} erreurs se sont produites | Attention: {n} erreurs sont apparues',
|
||||||
|
executedQueries: '{n} requêtes ont été exécutées | {n} requêtes exécutées',
|
||||||
|
ourputFormat: 'Format de sortie',
|
||||||
|
singleFile: 'Seul fichier avec l\'extension {ext}',
|
||||||
|
zipCompressedFile: 'Fichier compréssé avec l\'extension {ext}',
|
||||||
|
disableBlur: 'Désactiver le floue'
|
||||||
},
|
},
|
||||||
faker: {
|
faker: {
|
||||||
address: 'Adresse',
|
address: 'Adresse',
|
||||||
commerce: 'Commerce',
|
commerce: 'Commerce',
|
||||||
company: 'Entreprise',
|
company: 'Companie',
|
||||||
database: 'Base de données',
|
database: 'Base de données',
|
||||||
date: 'Date',
|
date: 'Date',
|
||||||
finance: 'Finance',
|
finance: 'Finance',
|
||||||
@@ -204,105 +306,105 @@ module.exports = {
|
|||||||
random: 'Aléatoire',
|
random: 'Aléatoire',
|
||||||
system: 'Système',
|
system: 'Système',
|
||||||
time: 'Temps',
|
time: 'Temps',
|
||||||
vehicle: 'Véhicle',
|
vehicle: 'Véhicule',
|
||||||
zipCode: 'Code postal',
|
zipCode: 'Code postal',
|
||||||
zipCodeByState: 'Code postal par région',
|
zipCodeByState: 'Code postal par état',
|
||||||
city: 'Ville',
|
city: 'Ville',
|
||||||
cityPrefix: 'Préfixe de la ville',
|
cityPrefix: 'Préfixe de la ville',
|
||||||
citySuffix: 'Suffixe de la ville',
|
citySuffix: 'Suffixe de la ville',
|
||||||
streetName: 'Ne de la rue',
|
streetName: 'Nom de la rue',
|
||||||
streetAddress: 'Adresse',
|
streetAddress: 'Adresse de la rue',
|
||||||
streetSuffix: 'Suffixe de la rue',
|
streetSuffix: 'Suffixe de la rue',
|
||||||
streetPrefix: 'Préfixe de la rue',
|
streetPrefix: 'Préfixe de la rue',
|
||||||
secondaryAddress: 'Adresse secondaire',
|
secondaryAddress: 'Adresse secondaire',
|
||||||
county: 'Comté',
|
county: 'Département',
|
||||||
country: 'Pays',
|
country: 'Pays',
|
||||||
countryCode: 'Code du pays',
|
countryCode: 'Code du pays',
|
||||||
state: 'Région',
|
state: 'Etat',
|
||||||
stateAbbr: 'Abbreviation de la région',
|
stateAbbr: 'Abréviation de l\'état',
|
||||||
latitude: 'Latitude',
|
latitude: 'Latitude',
|
||||||
longitude: 'Longitude',
|
longitude: 'Longitude',
|
||||||
direction: 'Direction',
|
direction: 'Direction',
|
||||||
cardinalDirection: 'Orientation cardinale',
|
cardinalDirection: 'Direction cardinale',
|
||||||
ordinalDirection: 'Orientation originale',
|
ordinalDirection: 'Direction Ordinale',
|
||||||
nearbyGPSCoordinate: 'Coordonnées GPS des environs',
|
nearbyGPSCoordinate: 'Coordonnées GPS proches',
|
||||||
timeZone: 'Fuseau horaire',
|
timeZone: 'fuseau horaire',
|
||||||
color: 'Couleur',
|
color: 'Couleur',
|
||||||
department: 'Département',
|
department: 'Départment',
|
||||||
productName: 'Nom de produit',
|
productName: 'Nom du produit',
|
||||||
price: 'Prix',
|
price: 'Prix',
|
||||||
productAdjective: 'Adjectif du produit',
|
productAdjective: 'Adjectif du produit',
|
||||||
productMaterial: 'Matériau du produit',
|
productMaterial: 'Matériaux du produit',
|
||||||
product: 'Produit',
|
product: 'Produit',
|
||||||
productDescription: 'Description du produit',
|
productDescription: 'Description du produit',
|
||||||
suffixes: 'Suffixes',
|
suffixes: 'Suffixes',
|
||||||
companyName: 'Nom de l\'entreprise',
|
companyName: 'Nom de la société',
|
||||||
companySuffix: 'Suffixe de l\'entreprise',
|
companySuffix: 'Suffixe de la société',
|
||||||
catchPhrase: 'Slogan',
|
catchPhrase: 'Phrase de rappel',
|
||||||
bs: 'BS',
|
bs: 'BS',
|
||||||
catchPhraseAdjective: 'Adjectif du slogan',
|
catchPhraseAdjective: 'Adjectif de la phrase de rappel',
|
||||||
catchPhraseDescriptor: 'Descripteur de slogan',
|
catchPhraseDescriptor: 'Descripteur de la phrase de rappel',
|
||||||
catchPhraseNoun: 'Nom de la phrase d\'accroche',
|
catchPhraseNoun: 'Nom de la phrase de rappel',
|
||||||
bsAdjective: 'Adjectif BS',
|
bsAdjective: 'Adjectif BS',
|
||||||
bsBuzz: 'BS buzz',
|
bsBuzz: 'BS buzz',
|
||||||
bsNoun: 'Nom BS',
|
bsNoun: 'Nom BS',
|
||||||
column: 'Colonne',
|
column: 'Colonne',
|
||||||
type: 'Type',
|
type: 'Type',
|
||||||
collation: 'Collation',
|
collation: 'Langue',
|
||||||
engine: 'Engine',
|
engine: 'Moteur',
|
||||||
past: 'Passé',
|
past: 'Passé',
|
||||||
future: 'Futur',
|
future: 'Future',
|
||||||
between: 'Entre',
|
between: 'Entre',
|
||||||
recent: 'Récent',
|
recent: 'Récent',
|
||||||
soon: 'Bientôt',
|
soon: 'Bientôt',
|
||||||
month: 'Mois',
|
month: 'Mois',
|
||||||
weekday: 'Mercredi',
|
weekday: 'Jour de la semaine',
|
||||||
account: 'Compte',
|
account: 'compte',
|
||||||
accountName: 'Nom de compte',
|
accountName: 'Nom du compte',
|
||||||
routingNumber: 'Numéros de routage',
|
routingNumber: 'Numéro de la routing',
|
||||||
mask: 'Masque',
|
mask: 'Masque',
|
||||||
amount: 'Quantité',
|
amount: 'Montant',
|
||||||
transactionType: 'Type de transaction',
|
transactionType: 'Type de la transaction',
|
||||||
currencyCode: 'Code de la devise',
|
currencyCode: 'Code de la devise',
|
||||||
currencyName: 'Nom de la devise',
|
currencyName: 'Nom de la devise',
|
||||||
currencySymbol: 'Symbole de la devise',
|
currencySymbol: 'Symbole de la devise',
|
||||||
bitcoinAddress: 'Adresse Bitcoin',
|
bitcoinAddress: 'Adresse Bitcoin',
|
||||||
litecoinAddress: 'Adresse Litecoin',
|
litecoinAddress: 'Adresse Litecoin',
|
||||||
creditCardNumber: 'Numero de carte de crédit',
|
creditCardNumber: 'Numéro de la carte de bancaire',
|
||||||
creditCardCVV: 'Cryptogramme',
|
creditCardCVV: 'Numéro de vérification',
|
||||||
ethereumAddress: 'Adresse Ethereum',
|
ethereumAddress: 'Adresse Ethereum',
|
||||||
iban: 'Iban',
|
iban: 'Iban',
|
||||||
bic: 'Bic',
|
bic: 'Bic',
|
||||||
transactionDescription: 'Description de la transaction',
|
transactionDescription: 'Description de la transaction',
|
||||||
branch: 'Branche',
|
branch: 'Branche',
|
||||||
commitEntry: 'Valider l\'entrée',
|
commitEntry: 'Insérer les données',
|
||||||
commitMessage: 'Valider le message',
|
commitMessage: 'Insérer le message',
|
||||||
commitSha: 'Valider le SHA',
|
commitSha: 'Insérer SHA',
|
||||||
shortSha: 'SHA court',
|
shortSha: 'SHA réduit',
|
||||||
abbreviation: 'Abbréviation',
|
abbreviation: 'Abréviation',
|
||||||
adjective: 'Adjectif',
|
adjective: 'Adjectif',
|
||||||
noun: 'Nom',
|
noun: 'Nom',
|
||||||
verb: 'Verbe',
|
verb: 'Verbe',
|
||||||
ingverb: 'Ingverb',
|
ingverb: 'Ingverb',
|
||||||
phrase: 'Phrase',
|
phrase: 'Phrase',
|
||||||
avatar: 'Avatar',
|
avatar: 'Avatar',
|
||||||
email: 'Email',
|
email: 'mail',
|
||||||
exampleEmail: 'Exemple d\'email',
|
exampleEmail: 'Exemple de mail',
|
||||||
userName: 'Nom d\'utilisateur',
|
userName: 'Nom utilisateur',
|
||||||
protocol: 'Protocole',
|
protocol: 'Protocole',
|
||||||
url: 'Url',
|
url: 'Url',
|
||||||
domainName: 'Nom de domaine',
|
domainName: 'Nom du domaine',
|
||||||
domainSuffix: 'Suffixe du nom de domaine',
|
domainSuffix: 'Suffixe du domaine',
|
||||||
domainWord: 'Mot de domaine',
|
domainWord: 'Mot domaine',
|
||||||
ip: 'Ip',
|
ip: 'Ip',
|
||||||
ipv6: 'Ipv6',
|
ipv6: 'Ipv6',
|
||||||
userAgent: 'User agent',
|
userAgent: 'Agent utilisateur',
|
||||||
mac: 'Mac',
|
mac: 'Mac',
|
||||||
password: 'Mot de passe',
|
password: 'Mot de passe',
|
||||||
word: 'Mot',
|
word: 'Mot',
|
||||||
words: 'Mots',
|
words: 'Mots',
|
||||||
sentence: 'Phrase',
|
sentence: 'Phrase',
|
||||||
slug: 'Slug',
|
slug: 'Identifiant',
|
||||||
sentences: 'Phrases',
|
sentences: 'Phrases',
|
||||||
paragraph: 'Paragraphe',
|
paragraph: 'Paragraphe',
|
||||||
paragraphs: 'Paragraphes',
|
paragraphs: 'Paragraphes',
|
||||||
@@ -310,45 +412,45 @@ module.exports = {
|
|||||||
lines: 'Lignes',
|
lines: 'Lignes',
|
||||||
genre: 'Genre',
|
genre: 'Genre',
|
||||||
firstName: 'Prénom',
|
firstName: 'Prénom',
|
||||||
lastName: 'Nom',
|
lastName: 'Nom de famille',
|
||||||
middleName: 'Deuxième prénom',
|
middleName: 'Deuxième prénom',
|
||||||
findName: 'Nom et prénom',
|
findName: 'Nom complet',
|
||||||
jobTitle: 'Intitulé du poste',
|
jobTitle: 'Nom du poste',
|
||||||
gender: 'Genre',
|
gender: 'Sexe',
|
||||||
prefix: 'Préfixe',
|
prefix: 'Préfixe',
|
||||||
suffix: 'Suffixe',
|
suffix: 'Suffixe',
|
||||||
title: 'Titre',
|
title: 'Fonction',
|
||||||
jobDescriptor: 'Descripteur de poste',
|
jobDescriptor: 'Desciption du travail',
|
||||||
jobArea: 'Domaine d\'activité',
|
jobArea: 'Zone du travail',
|
||||||
jobType: 'Type de poste',
|
jobType: 'Type de travail',
|
||||||
phoneNumber: 'Numéro de téléphone',
|
phoneNumber: 'Numéro de téléphone',
|
||||||
phoneNumberFormat: 'Format du numéro de téléphone',
|
phoneNumberFormat: 'Format du Numéro de téléphone',
|
||||||
phoneFormats: 'Formats de téléphone',
|
phoneFormats: 'Formats téléphone',
|
||||||
number: 'Numéro',
|
number: 'Nombre',
|
||||||
float: 'Nombre décimaux',
|
float: 'décimal',
|
||||||
arrayElement: 'Élément de Liste',
|
arrayElement: 'élément du tableau',
|
||||||
arrayElements: 'Éléments de liste',
|
arrayElements: 'éléments du tableau',
|
||||||
objectElement: 'Élément d\'objet',
|
objectElement: 'élément de l\'object',
|
||||||
uuid: 'Uuid',
|
uuid: 'Uuid',
|
||||||
boolean: 'Boolean',
|
boolean: 'Booléen',
|
||||||
image: 'Image',
|
image: 'Image',
|
||||||
locale: 'Locale',
|
locale: 'Locale',
|
||||||
alpha: 'Alpha',
|
alpha: 'Alpha',
|
||||||
alphaNumeric: 'Alphanumerique',
|
alphaNumeric: 'Alphanumerique',
|
||||||
hexaDecimal: 'Hexadecimale',
|
hexaDecimal: 'Hexadécimal',
|
||||||
fileName: 'Nom deu fichier',
|
fileName: 'Nom du fichier',
|
||||||
commonFileName: 'Nom de fichier commun',
|
commonFileName: 'Nom de fichier commun',
|
||||||
mimeType: 'Mime type',
|
mimeType: 'Type Mime',
|
||||||
commonFileType: 'Type de dossier commun',
|
commonFileType: 'Type de fichier commun',
|
||||||
commonFileExt: 'Extension de fichier commun',
|
commonFileExt: 'Extension de fichier commun',
|
||||||
fileType: 'Type de fichier',
|
fileType: 'Type de fichier',
|
||||||
fileExt: 'Extension de fichier',
|
fileExt: 'Extension de fichier',
|
||||||
directoryPath: 'Chemin du répertoire',
|
directoryPath: 'Chemin du répertoire',
|
||||||
filePath: 'Chemin d\'accès au fichier',
|
filePath: 'Chemin du fichier',
|
||||||
semver: 'Semver',
|
semver: 'Semver',
|
||||||
manufacturer: 'Fabricant',
|
manufacturer: 'Constructeur',
|
||||||
model: 'Modèle',
|
model: 'Modèle',
|
||||||
fuel: 'Carburant',
|
fuel: 'Essence',
|
||||||
vin: 'Vin'
|
vin: 'Plaque d\'imatriculation'
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@@ -106,7 +106,39 @@ module.exports = {
|
|||||||
array: 'Array',
|
array: 'Array',
|
||||||
changelog: 'Logs de alteração',
|
changelog: 'Logs de alteração',
|
||||||
format: 'Formato',
|
format: 'Formato',
|
||||||
sshTunnel: 'SSH túnel'
|
sshTunnel: 'SSH túnel',
|
||||||
|
structure: 'Estrutura',
|
||||||
|
small: 'Pequeno',
|
||||||
|
medium: 'Médio',
|
||||||
|
large: 'Grande',
|
||||||
|
row: 'Linha | Linhas',
|
||||||
|
cell: 'Celula | Células',
|
||||||
|
triggerFunction: 'Gatinho de função | Gatilhos de Funções',
|
||||||
|
all: 'Todos',
|
||||||
|
duplicate: 'Duplicado',
|
||||||
|
routine: 'Rotina',
|
||||||
|
new: 'Novo',
|
||||||
|
history: 'Histórico',
|
||||||
|
select: 'Seleciomar',
|
||||||
|
passphrase: 'Palavara-Passe',
|
||||||
|
filter: 'Filtrar',
|
||||||
|
change: 'Alterar',
|
||||||
|
views: 'Visualizações',
|
||||||
|
triggers: 'Gatilhos',
|
||||||
|
routines: 'Rotinas',
|
||||||
|
functions: 'Funções',
|
||||||
|
schedulers: 'Agendadores',
|
||||||
|
includes: 'Includes',
|
||||||
|
drop: 'Drop',
|
||||||
|
completed: 'Completo',
|
||||||
|
aborted: 'Abortado',
|
||||||
|
disabled: 'Inativo',
|
||||||
|
enable: 'Ativo',
|
||||||
|
disable: 'Disable',
|
||||||
|
commit: 'Enviar',
|
||||||
|
rollback: 'Reverter',
|
||||||
|
connectionString: 'String da conexão',
|
||||||
|
contributors: 'Contribuintes'
|
||||||
},
|
},
|
||||||
message: {
|
message: {
|
||||||
appWelcome: 'Bem vindo ao Antares SQL Client!',
|
appWelcome: 'Bem vindo ao Antares SQL Client!',
|
||||||
@@ -212,7 +244,48 @@ module.exports = {
|
|||||||
deleteSchema: 'Apagar schema',
|
deleteSchema: 'Apagar schema',
|
||||||
markdownSupported: 'Markdown suportado',
|
markdownSupported: 'Markdown suportado',
|
||||||
plantATree: 'Plante uma árvore',
|
plantATree: 'Plante uma árvore',
|
||||||
enableSsh: 'Habilitar SSH'
|
enableSsh: 'Habilitar SSH',
|
||||||
|
pageNumber: 'Número de página',
|
||||||
|
duplicateTable: 'Duplicar tabela',
|
||||||
|
noOpenTabs: 'Nenhuma aba aberta, navege na barra lateral ou:',
|
||||||
|
noSchema: 'Nenhum banco de dados',
|
||||||
|
restorePreviourSession: 'Restaurar sessão anterior',
|
||||||
|
runQuery: 'Executar Query',
|
||||||
|
thereAreNoTableFields: 'Nenhum campo na tabela',
|
||||||
|
newTable: 'Nova tabela',
|
||||||
|
newView: 'Nova vista',
|
||||||
|
newTrigger: 'Novo gatilho',
|
||||||
|
newRoutine: 'Nova rotina',
|
||||||
|
newFunction: 'Nova função',
|
||||||
|
newScheduler: 'Novo agendento',
|
||||||
|
newTriggerFunction: 'Novo gatinho de função',
|
||||||
|
thereIsNoQueriesYet: 'Nenhuma consulta ainda',
|
||||||
|
searchForQueries: 'Pesquisar por consultas',
|
||||||
|
killProcess: 'Matar processo',
|
||||||
|
closeTab: 'Fechar aba',
|
||||||
|
exportSchema: 'Exportar banco de dados',
|
||||||
|
importSchema: 'Importar banco de dados',
|
||||||
|
directoryPath: 'Caminho da pasta',
|
||||||
|
newInserStmtEvery: 'Nova query INSERT',
|
||||||
|
processingTableExport: 'Processando {table}',
|
||||||
|
fechingTableExport: 'Carregando dados da tabela {table}',
|
||||||
|
writingTableExport: 'Escrevendo dados na tabela {table}',
|
||||||
|
checkAllTables: 'Marcar todas as tabelas',
|
||||||
|
uncheckAllTables: 'Desmarcar todas as tabelas',
|
||||||
|
goToDownloadPage: 'Ir a página de download',
|
||||||
|
readOnlyMode: 'Modo somente leitura',
|
||||||
|
killQuery: 'Matar consulta',
|
||||||
|
insertRow: 'Inserir linha | Inserir linhas',
|
||||||
|
commitMode: 'Modo de confirmação',
|
||||||
|
autoCommit: 'Auto confirmar',
|
||||||
|
manualCommit: 'Confirmar manualmente',
|
||||||
|
actionSuccessful: '{action} teve sucesso',
|
||||||
|
importQueryErrors: 'Aviso: ocorreu {n} erro | Aviso: ocorreram {n} erros',
|
||||||
|
executedQueries: '{n} consulta executada | {n} consultas executadas',
|
||||||
|
ourputFormat: 'Formato da saída',
|
||||||
|
singleFile: 'Arquivo {ext} único',
|
||||||
|
zipCompressedFile: 'Arquivo compactado {ext} ZIP',
|
||||||
|
disableBlur: 'Desabilitar Blur'
|
||||||
},
|
},
|
||||||
faker: {
|
faker: {
|
||||||
address: 'Endereço',
|
address: 'Endereço',
|
||||||
|
@@ -169,10 +169,13 @@ option:checked {
|
|||||||
.modal-overlay{
|
.modal-overlay{
|
||||||
background: rgba( 255, 255, 255, 0.1);
|
background: rgba( 255, 255, 255, 0.1);
|
||||||
box-shadow: 0 8px 32px 0 rgba( 31, 38, 135, 0.37 );
|
box-shadow: 0 8px 32px 0 rgba( 31, 38, 135, 0.37 );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#wrapper:not(.no-blur){
|
||||||
|
.modal-overlay{
|
||||||
backdrop-filter: blur( 4px );
|
backdrop-filter: blur( 4px );
|
||||||
-webkit-backdrop-filter: blur( 4px );
|
-webkit-backdrop-filter: blur( 4px );
|
||||||
border-radius: 10px;
|
|
||||||
border: 1px solid rgba( 255, 255, 255, 0.18 );
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -6,7 +6,7 @@ export default {
|
|||||||
namespaced: true,
|
namespaced: true,
|
||||||
strict: true,
|
strict: true,
|
||||||
state: {
|
state: {
|
||||||
notes: persistentStore.get('notes', '# HOW TO SUPPORT ANTARES\n\n- [ ] Leave a star to Antares [GitHub repo](https://github.com/Fabio286/antares)\n- [ ] Send feedbacks and advices\n- [ ] Report for bugs\n- [ ] If you enjoy, share Antares with friends\n\n# ABOUT SCRATCHPAD\n\nThis is a scratchpad where you can save your **personal notes**. It supports `markdown` format, but you are free to use plain text.\nThis content is just a placeholder, feel free to clear it to make space for your notes.\n')
|
notes: persistentStore.get('notes', '# HOW TO SUPPORT ANTARES\n\n- [ ] Leave a star to Antares [GitHub repo](https://github.com/antares-sql/antares)\n- [ ] Send feedbacks and advices\n- [ ] Report for bugs\n- [ ] If you enjoy, share Antares with friends\n\n# ABOUT SCRATCHPAD\n\nThis is a scratchpad where you can save your **personal notes**. It supports `markdown` format, but you are free to use plain text.\nThis content is just a placeholder, feel free to clear it to make space for your notes.\n')
|
||||||
},
|
},
|
||||||
getters: {
|
getters: {
|
||||||
getNotes: state => state.notes
|
getNotes: state => state.notes
|
||||||
|
@@ -20,7 +20,8 @@ export default {
|
|||||||
application_theme: persistentStore.get('application_theme', defaultAppTheme),
|
application_theme: persistentStore.get('application_theme', defaultAppTheme),
|
||||||
editor_theme: persistentStore.get('editor_theme', defaultEditorTheme),
|
editor_theme: persistentStore.get('editor_theme', defaultEditorTheme),
|
||||||
editor_font_size: persistentStore.get('editor_font_size', 'medium'),
|
editor_font_size: persistentStore.get('editor_font_size', 'medium'),
|
||||||
restore_tabs: persistentStore.get('restore_tabs', true)
|
restore_tabs: persistentStore.get('restore_tabs', true),
|
||||||
|
disable_blur: persistentStore.get('disable_blur', false)
|
||||||
},
|
},
|
||||||
getters: {
|
getters: {
|
||||||
getLocale: state => state.locale,
|
getLocale: state => state.locale,
|
||||||
@@ -33,7 +34,8 @@ export default {
|
|||||||
getApplicationTheme: state => state.application_theme,
|
getApplicationTheme: state => state.application_theme,
|
||||||
getEditorTheme: state => state.editor_theme,
|
getEditorTheme: state => state.editor_theme,
|
||||||
getEditorFontSize: state => state.editor_font_size,
|
getEditorFontSize: state => state.editor_font_size,
|
||||||
getRestoreTabs: state => state.restore_tabs
|
getRestoreTabs: state => state.restore_tabs,
|
||||||
|
getDisableBlur: state => state.disable_blur
|
||||||
},
|
},
|
||||||
mutations: {
|
mutations: {
|
||||||
SET_LOCALE (state, locale) {
|
SET_LOCALE (state, locale) {
|
||||||
@@ -80,6 +82,10 @@ export default {
|
|||||||
SET_RESTORE_TABS (state, val) {
|
SET_RESTORE_TABS (state, val) {
|
||||||
state.restore_tabs = val;
|
state.restore_tabs = val;
|
||||||
persistentStore.set('restore_tabs', state.restore_tabs);
|
persistentStore.set('restore_tabs', state.restore_tabs);
|
||||||
|
},
|
||||||
|
SET_DISABLE_BLUR (state, val) {
|
||||||
|
state.disable_blur = val;
|
||||||
|
persistentStore.set('disable_blur', state.disable_blur);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
actions: {
|
actions: {
|
||||||
@@ -115,6 +121,9 @@ export default {
|
|||||||
},
|
},
|
||||||
changeRestoreTabs ({ commit }, size) {
|
changeRestoreTabs ({ commit }, size) {
|
||||||
commit('SET_RESTORE_TABS', size);
|
commit('SET_RESTORE_TABS', size);
|
||||||
|
},
|
||||||
|
changeDisableBlur ({ commit }, val) {
|
||||||
|
commit('SET_DISABLE_BLUR', val);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
Reference in New Issue
Block a user