From a5b034d4a9c44f9bc1e83b01de82530f8fc63013 Mon Sep 17 00:00:00 2001 From: Unit 193 Date: Sat, 4 Apr 2015 14:41:04 -0400 Subject: Imported Upstream version 3.0.4 --- Plugins/ConfigMigration/ConfigMigration_de.ts | 2 +- Plugins/ConfigMigration/ConfigMigration_es.ts | 2 +- Plugins/ConfigMigration/ConfigMigration_fr.ts | 2 +- Plugins/ConfigMigration/ConfigMigration_pl.ts | 2 +- Plugins/ConfigMigration/ConfigMigration_pt_BR.ts | 2 +- Plugins/ConfigMigration/ConfigMigration_ru.ts | 2 +- Plugins/ConfigMigration/ConfigMigration_sk.ts | 2 +- Plugins/ConfigMigration/ConfigMigration_zh_CN.ts | 2 +- Plugins/ConfigMigration/configmigration.json | 2 +- Plugins/ConfigMigration/configmigration.qrc | 2 + Plugins/CsvExport/CsvExport_de.ts | 2 +- Plugins/CsvExport/CsvExport_es.ts | 2 +- Plugins/CsvExport/CsvExport_fr.ts | 2 +- Plugins/CsvExport/CsvExport_pl.ts | 2 +- Plugins/CsvExport/CsvExport_pt_BR.ts | 2 +- Plugins/CsvExport/CsvExport_ru.ts | 2 +- Plugins/CsvExport/CsvExport_sk.qm | Bin 27 -> 919 bytes Plugins/CsvExport/CsvExport_sk.ts | 20 +- Plugins/CsvExport/CsvExport_zh_CN.ts | 2 +- Plugins/CsvExport/csvexport.json | 2 +- Plugins/CsvExport/csvexport.qrc | 2 + Plugins/CsvImport/CsvImport_de.ts | 2 +- Plugins/CsvImport/CsvImport_es.ts | 2 +- Plugins/CsvImport/CsvImport_fr.ts | 2 +- Plugins/CsvImport/CsvImport_pl.ts | 2 +- Plugins/CsvImport/CsvImport_pt_BR.ts | 2 +- Plugins/CsvImport/CsvImport_ru.qm | Bin 2246 -> 2389 bytes Plugins/CsvImport/CsvImport_ru.ts | 4 +- Plugins/CsvImport/CsvImport_sk.qm | Bin 27 -> 2228 bytes Plugins/CsvImport/CsvImport_sk.ts | 30 +- Plugins/CsvImport/CsvImport_zh_CN.ts | 2 +- Plugins/CsvImport/csvimport.json | 2 +- Plugins/CsvImport/csvimport.qrc | 2 + Plugins/DbSqlite2/dbsqlite2.json | 2 +- Plugins/HtmlExport/HtmlExport_de.ts | 2 +- Plugins/HtmlExport/HtmlExport_es.ts | 2 +- Plugins/HtmlExport/HtmlExport_fr.ts | 2 +- Plugins/HtmlExport/HtmlExport_pl.ts | 2 +- Plugins/HtmlExport/HtmlExport_pt_BR.ts | 2 +- Plugins/HtmlExport/HtmlExport_ru.ts | 2 +- Plugins/HtmlExport/HtmlExport_sk.qm | Bin 27 -> 1039 bytes Plugins/HtmlExport/HtmlExport_sk.ts | 14 +- Plugins/HtmlExport/HtmlExport_zh_CN.ts | 2 +- Plugins/HtmlExport/htmlexport.json | 2 +- Plugins/HtmlExport/htmlexport.qrc | 2 + Plugins/JsonExport/JsonExport_de.ts | 2 +- Plugins/JsonExport/JsonExport_es.ts | 2 +- Plugins/JsonExport/JsonExport_fr.ts | 2 +- Plugins/JsonExport/JsonExport_pl.ts | 2 +- Plugins/JsonExport/JsonExport_pt_BR.ts | 2 +- Plugins/JsonExport/JsonExport_ru.ts | 2 +- Plugins/JsonExport/JsonExport_sk.qm | Bin 27 -> 444 bytes Plugins/JsonExport/JsonExport_sk.ts | 6 +- Plugins/JsonExport/JsonExport_zh_CN.ts | 2 +- Plugins/JsonExport/jsonexport.json | 2 +- Plugins/JsonExport/jsonexport.qrc | 2 + Plugins/PdfExport/PdfExport_de.ts | 2 +- Plugins/PdfExport/PdfExport_es.ts | 2 +- Plugins/PdfExport/PdfExport_fr.ts | 2 +- Plugins/PdfExport/PdfExport_pl.ts | 2 +- Plugins/PdfExport/PdfExport_pt_BR.ts | 2 +- Plugins/PdfExport/PdfExport_ru.ts | 2 +- Plugins/PdfExport/PdfExport_sk.qm | Bin 27 -> 3903 bytes Plugins/PdfExport/PdfExport_sk.ts | 94 +- Plugins/PdfExport/PdfExport_zh_CN.ts | 2 +- Plugins/PdfExport/pdfexport.json | 2 +- Plugins/PdfExport/pdfexport.qrc | 2 + Plugins/Printing/Printing_de.ts | 2 +- Plugins/Printing/Printing_es.ts | 2 +- Plugins/Printing/Printing_fr.ts | 2 +- Plugins/Printing/Printing_pl.ts | 2 +- Plugins/Printing/Printing_pt_BR.ts | 2 +- Plugins/Printing/Printing_ru.ts | 2 +- Plugins/Printing/Printing_sk.ts | 2 +- Plugins/Printing/Printing_zh_CN.ts | 2 +- Plugins/Printing/printing.json | 2 +- Plugins/Printing/printing.qrc | 2 + Plugins/RegExpImport/RegExpImport_de.ts | 2 +- Plugins/RegExpImport/RegExpImport_es.ts | 2 +- Plugins/RegExpImport/RegExpImport_fr.ts | 2 +- Plugins/RegExpImport/RegExpImport_pl.ts | 2 +- Plugins/RegExpImport/RegExpImport_pt_BR.ts | 2 +- Plugins/RegExpImport/RegExpImport_ru.ts | 2 +- Plugins/RegExpImport/RegExpImport_sk.ts | 2 +- Plugins/RegExpImport/RegExpImport_zh_CN.ts | 2 +- Plugins/RegExpImport/regexpimport.json | 2 +- Plugins/RegExpImport/regexpimport.qrc | 2 + Plugins/ScriptingTcl/ScriptingTcl_de.ts | 2 +- Plugins/ScriptingTcl/ScriptingTcl_es.ts | 2 +- Plugins/ScriptingTcl/ScriptingTcl_fr.ts | 2 +- Plugins/ScriptingTcl/ScriptingTcl_pl.ts | 2 +- Plugins/ScriptingTcl/ScriptingTcl_pt_BR.ts | 2 +- Plugins/ScriptingTcl/ScriptingTcl_ru.ts | 2 +- Plugins/ScriptingTcl/ScriptingTcl_sk.ts | 2 +- Plugins/ScriptingTcl/ScriptingTcl_zh_CN.ts | 2 +- Plugins/ScriptingTcl/scriptingtcl.json | 2 +- Plugins/ScriptingTcl/scriptingtcl.qrc | 2 + .../SqlEnterpriseFormatter_de.ts | 2 +- .../SqlEnterpriseFormatter_es.ts | 2 +- .../SqlEnterpriseFormatter_fr.ts | 2 +- .../SqlEnterpriseFormatter_pl.ts | 2 +- .../SqlEnterpriseFormatter_pt_BR.ts | 2 +- .../SqlEnterpriseFormatter_ru.ts | 2 +- .../SqlEnterpriseFormatter_sk.ts | 2 +- .../SqlEnterpriseFormatter_zh_CN.ts | 2 +- .../SqlEnterpriseFormatter/formataltertable.cpp | 1 + Plugins/SqlEnterpriseFormatter/formatanalyze.cpp | 1 + Plugins/SqlEnterpriseFormatter/formatattach.cpp | 1 + .../SqlEnterpriseFormatter/formatbegintrans.cpp | 1 + .../SqlEnterpriseFormatter/formatcommittrans.cpp | 1 + Plugins/SqlEnterpriseFormatter/formatcopy.cpp | 1 + .../SqlEnterpriseFormatter/formatcreateindex.cpp | 1 + .../SqlEnterpriseFormatter/formatcreatetable.cpp | 1 + .../SqlEnterpriseFormatter/formatcreatetrigger.cpp | 1 + .../SqlEnterpriseFormatter/formatcreateview.cpp | 1 + .../formatcreatevirtualtable.cpp | 1 + Plugins/SqlEnterpriseFormatter/formatdelete.cpp | 1 + Plugins/SqlEnterpriseFormatter/formatdetach.cpp | 1 + Plugins/SqlEnterpriseFormatter/formatdropindex.cpp | 1 + Plugins/SqlEnterpriseFormatter/formatdroptable.cpp | 1 + .../SqlEnterpriseFormatter/formatdroptrigger.cpp | 1 + Plugins/SqlEnterpriseFormatter/formatdropview.cpp | 1 + Plugins/SqlEnterpriseFormatter/formatinsert.cpp | 1 + Plugins/SqlEnterpriseFormatter/formatpragma.cpp | 1 + Plugins/SqlEnterpriseFormatter/formatreindex.cpp | 1 + Plugins/SqlEnterpriseFormatter/formatrelease.cpp | 1 + Plugins/SqlEnterpriseFormatter/formatrollback.cpp | 1 + Plugins/SqlEnterpriseFormatter/formatsavepoint.cpp | 1 + Plugins/SqlEnterpriseFormatter/formatselect.cpp | 1 + Plugins/SqlEnterpriseFormatter/formatstatement.cpp | 10 + Plugins/SqlEnterpriseFormatter/formatstatement.h | 2 + Plugins/SqlEnterpriseFormatter/formatupdate.cpp | 1 + Plugins/SqlEnterpriseFormatter/formatvacuum.cpp | 2 + .../sqlenterpriseformatter.json | 2 +- .../sqlenterpriseformatter.qrc | 2 + Plugins/SqlExport/SqlExport_de.ts | 14 +- Plugins/SqlExport/SqlExport_es.ts | 14 +- Plugins/SqlExport/SqlExport_fr.ts | 14 +- Plugins/SqlExport/SqlExport_pl.ts | 14 +- Plugins/SqlExport/SqlExport_pt_BR.ts | 14 +- Plugins/SqlExport/SqlExport_ru.ts | 14 +- Plugins/SqlExport/SqlExport_sk.ts | 14 +- Plugins/SqlExport/SqlExport_zh_CN.ts | 14 +- Plugins/SqlExport/sqlexport.cpp | 11 +- Plugins/SqlExport/sqlexport.h | 1 + Plugins/SqlExport/sqlexport.json | 2 +- Plugins/SqlExport/sqlexport.qrc | 2 + .../SqlFormatterSimple/SqlFormatterSimple_de.ts | 2 +- .../SqlFormatterSimple/SqlFormatterSimple_es.ts | 2 +- .../SqlFormatterSimple/SqlFormatterSimple_fr.ts | 2 +- .../SqlFormatterSimple/SqlFormatterSimple_pl.ts | 2 +- .../SqlFormatterSimple/SqlFormatterSimple_pt_BR.ts | 2 +- .../SqlFormatterSimple/SqlFormatterSimple_ru.ts | 2 +- .../SqlFormatterSimple/SqlFormatterSimple_sk.ts | 2 +- .../SqlFormatterSimple/SqlFormatterSimple_zh_CN.ts | 2 +- Plugins/SqlFormatterSimple/sqlformattersimple.json | 2 +- Plugins/SqlFormatterSimple/sqlformattersimple.qrc | 2 + Plugins/XmlExport/XmlExport_de.ts | 2 +- Plugins/XmlExport/XmlExport_es.ts | 2 +- Plugins/XmlExport/XmlExport_fr.ts | 2 +- Plugins/XmlExport/XmlExport_pl.ts | 2 +- Plugins/XmlExport/XmlExport_pt_BR.ts | 2 +- Plugins/XmlExport/XmlExport_ru.ts | 2 +- Plugins/XmlExport/XmlExport_sk.ts | 2 +- Plugins/XmlExport/XmlExport_zh_CN.ts | 2 +- Plugins/XmlExport/xmlexport.cpp | 4 +- Plugins/XmlExport/xmlexport.json | 2 +- Plugins/XmlExport/xmlexport.qrc | 2 + SQLiteStudio3/SQLiteStudio3.pro | 6 +- .../DsvFormatsTest/tst_dsvformatstesttest.cpp | 28 + SQLiteStudio3/Tests/TestUtils/configmock.cpp | 5 + SQLiteStudio3/Tests/TestUtils/configmock.h | 1 + SQLiteStudio3/coreSQLiteStudio/ChangeLog.txt | 36 + SQLiteStudio3/coreSQLiteStudio/TODO.txt | 1 + SQLiteStudio3/coreSQLiteStudio/common/global.h | 7 + .../coreSQLiteStudio/common/signalwait.cpp | 29 + SQLiteStudio3/coreSQLiteStudio/common/signalwait.h | 23 + SQLiteStudio3/coreSQLiteStudio/common/table.cpp | 40 + SQLiteStudio3/coreSQLiteStudio/common/table.h | 17 + .../coreSQLiteStudio/coreSQLiteStudio.pro | 7 +- .../coreSQLiteStudio/coresqlitestudio.qrc | 2 + SQLiteStudio3/coreSQLiteStudio/db/abstractdb.cpp | 8 +- SQLiteStudio3/coreSQLiteStudio/db/abstractdb.h | 8 +- SQLiteStudio3/coreSQLiteStudio/db/abstractdb3.h | 18 +- SQLiteStudio3/coreSQLiteStudio/db/db.cpp | 8 + SQLiteStudio3/coreSQLiteStudio/db/db.h | 10 +- SQLiteStudio3/coreSQLiteStudio/db/dbpluginoption.h | 13 +- SQLiteStudio3/coreSQLiteStudio/db/invaliddb.cpp | 8 +- SQLiteStudio3/coreSQLiteStudio/db/invaliddb.h | 8 +- .../db/queryexecutorsteps/queryexecutorcolumns.cpp | 90 +- .../db/queryexecutorsteps/queryexecutorcolumns.h | 6 +- .../db/queryexecutorsteps/queryexecutorexecute.cpp | 9 +- .../coreSQLiteStudio/db/stdsqlite3driver.h | 1 + SQLiteStudio3/coreSQLiteStudio/exportworker.cpp | 145 +- SQLiteStudio3/coreSQLiteStudio/exportworker.h | 1 + SQLiteStudio3/coreSQLiteStudio/importworker.cpp | 15 +- .../parser/ast/sqlitealtertable.cpp | 2 +- .../coreSQLiteStudio/parser/ast/sqliteanalyze.cpp | 2 +- .../coreSQLiteStudio/parser/ast/sqliteattach.cpp | 2 +- .../parser/ast/sqlitebegintrans.cpp | 2 +- .../parser/ast/sqlitecommittrans.cpp | 2 +- .../coreSQLiteStudio/parser/ast/sqlitecopy.cpp | 2 +- .../parser/ast/sqlitecreateindex.cpp | 1 + .../parser/ast/sqlitecreatetable.cpp | 3 +- .../parser/ast/sqlitecreatetrigger.cpp | 2 +- .../parser/ast/sqlitecreateview.cpp | 2 +- .../parser/ast/sqlitecreatevirtualtable.cpp | 2 +- .../coreSQLiteStudio/parser/ast/sqlitedelete.cpp | 2 +- .../coreSQLiteStudio/parser/ast/sqlitedetach.cpp | 2 +- .../parser/ast/sqlitedropindex.cpp | 2 +- .../parser/ast/sqlitedroptable.cpp | 2 +- .../parser/ast/sqlitedroptrigger.cpp | 2 +- .../coreSQLiteStudio/parser/ast/sqlitedropview.cpp | 2 +- .../coreSQLiteStudio/parser/ast/sqliteinsert.cpp | 2 +- .../coreSQLiteStudio/parser/ast/sqlitepragma.cpp | 2 +- .../coreSQLiteStudio/parser/ast/sqlitequery.cpp | 13 + .../coreSQLiteStudio/parser/ast/sqlitequery.h | 3 + .../coreSQLiteStudio/parser/ast/sqlitereindex.cpp | 2 +- .../coreSQLiteStudio/parser/ast/sqliterelease.cpp | 2 +- .../coreSQLiteStudio/parser/ast/sqliterollback.cpp | 2 +- .../parser/ast/sqlitesavepoint.cpp | 1 + .../coreSQLiteStudio/parser/ast/sqliteselect.cpp | 1 + .../coreSQLiteStudio/parser/ast/sqliteupdate.cpp | 2 +- .../coreSQLiteStudio/parser/ast/sqlitevacuum.cpp | 1 + .../coreSQLiteStudio/parser/parsercontext.cpp | 30 + .../coreSQLiteStudio/parser/parsercontext.h | 15 + .../coreSQLiteStudio/parser/sqlite2_parse.cpp | 2 +- .../coreSQLiteStudio/parser/sqlite2_parse.y | 2 +- .../coreSQLiteStudio/parser/sqlite3_parse.cpp | 376 ++-- .../coreSQLiteStudio/parser/sqlite3_parse.y | 40 +- .../services/impl/dbmanagerimpl.cpp | 17 +- .../coreSQLiteStudio/services/impl/dbmanagerimpl.h | 2 +- .../coreSQLiteStudio/services/importmanager.h | 2 + .../coreSQLiteStudio/services/notifymanager.cpp | 3 + SQLiteStudio3/coreSQLiteStudio/sqlitestudio.cpp | 2 +- SQLiteStudio3/coreSQLiteStudio/tablemodifier.cpp | 120 +- SQLiteStudio3/coreSQLiteStudio/tablemodifier.h | 17 +- .../translations/coreSQLiteStudio_de.ts | 75 +- .../translations/coreSQLiteStudio_es.ts | 75 +- .../translations/coreSQLiteStudio_fr.qm | Bin 41796 -> 41104 bytes .../translations/coreSQLiteStudio_fr.ts | 73 +- .../translations/coreSQLiteStudio_pl.qm | Bin 41932 -> 42248 bytes .../translations/coreSQLiteStudio_pl.ts | 73 +- .../translations/coreSQLiteStudio_pt_BR.ts | 75 +- .../translations/coreSQLiteStudio_ru.qm | Bin 40771 -> 41441 bytes .../translations/coreSQLiteStudio_ru.ts | 73 +- .../translations/coreSQLiteStudio_sk.qm | Bin 27 -> 3538 bytes .../translations/coreSQLiteStudio_sk.ts | 132 +- .../translations/coreSQLiteStudio_zh_CN.ts | 75 +- SQLiteStudio3/coreSQLiteStudio/tsvserializer.cpp | 70 +- SQLiteStudio3/coreSQLiteStudio/tsvserializer.h | 2 + SQLiteStudio3/create_linux_portable.sh | 26 +- SQLiteStudio3/create_macosx_bundle.sh | 14 +- .../guiSQLiteStudio/common/ipvalidator.cpp | 95 + SQLiteStudio3/guiSQLiteStudio/common/ipvalidator.h | 35 + .../completer/completeritemdelegate.cpp | 29 +- .../guiSQLiteStudio/completer/completerwindow.cpp | 2 +- .../guiSQLiteStudio/datagrid/sqlqueryitem.cpp | 2 +- .../guiSQLiteStudio/datagrid/sqlquerymodel.cpp | 77 +- .../guiSQLiteStudio/datagrid/sqlquerymodel.h | 15 +- .../datagrid/sqlquerymodelcolumn.cpp | 6 +- .../guiSQLiteStudio/datagrid/sqlquerymodelcolumn.h | 1 + .../guiSQLiteStudio/datagrid/sqlqueryview.cpp | 145 +- .../guiSQLiteStudio/datagrid/sqlqueryview.h | 3 + SQLiteStudio3/guiSQLiteStudio/dblistmodel.cpp | 17 +- SQLiteStudio3/guiSQLiteStudio/dblistmodel.h | 6 + SQLiteStudio3/guiSQLiteStudio/dbobjlistmodel.cpp | 21 +- SQLiteStudio3/guiSQLiteStudio/dbobjlistmodel.h | 3 +- SQLiteStudio3/guiSQLiteStudio/dbtree/dbtree.ui | 2 +- .../guiSQLiteStudio/dbtree/dbtreemodel.cpp | 16 +- .../guiSQLiteStudio/dialogs/columndialog.ui | 6 + .../guiSQLiteStudio/dialogs/configdialog.cpp | 2 +- SQLiteStudio3/guiSQLiteStudio/dialogs/dbdialog.cpp | 173 +- SQLiteStudio3/guiSQLiteStudio/dialogs/dbdialog.h | 9 +- SQLiteStudio3/guiSQLiteStudio/dialogs/dbdialog.ui | 255 ++- .../guiSQLiteStudio/dialogs/exportdialog.cpp | 17 +- .../guiSQLiteStudio/dialogs/exportdialog.h | 1 + .../guiSQLiteStudio/dialogs/importdialog.cpp | 13 +- .../guiSQLiteStudio/dialogs/importdialog.ui | 28 +- .../guiSQLiteStudio/dialogs/triggerdialog.cpp | 31 +- .../guiSQLiteStudio/dialogs/triggerdialog.h | 5 + SQLiteStudio3/guiSQLiteStudio/guiSQLiteStudio.pro | 6 +- SQLiteStudio3/guiSQLiteStudio/guiSQLiteStudio.qrc | 2 + SQLiteStudio3/guiSQLiteStudio/iconmanager.h | 3 +- SQLiteStudio3/guiSQLiteStudio/icons.qrc | 2 +- .../guiSQLiteStudio/img/database_invalid.png | Bin 692 -> 0 bytes SQLiteStudio3/guiSQLiteStudio/img/plus.png | Bin 0 -> 711 bytes SQLiteStudio3/guiSQLiteStudio/img/sort_ind_asc.png | Bin 376 -> 356 bytes .../guiSQLiteStudio/img/sort_ind_desc.png | Bin 383 -> 348 bytes SQLiteStudio3/guiSQLiteStudio/mainwindow.cpp | 12 +- SQLiteStudio3/guiSQLiteStudio/mdiarea.cpp | 18 + SQLiteStudio3/guiSQLiteStudio/mdiwindow.cpp | 9 + SQLiteStudio3/guiSQLiteStudio/taskbar.cpp | 67 + SQLiteStudio3/guiSQLiteStudio/taskbar.h | 6 + .../translations/guiSQLiteStudio_de.ts | 362 ++-- .../translations/guiSQLiteStudio_es.ts | 362 ++-- .../translations/guiSQLiteStudio_fr.qm | Bin 144642 -> 144539 bytes .../translations/guiSQLiteStudio_fr.ts | 384 ++-- .../translations/guiSQLiteStudio_pl.qm | Bin 139079 -> 140919 bytes .../translations/guiSQLiteStudio_pl.ts | 386 ++-- .../translations/guiSQLiteStudio_pt_BR.ts | 362 ++-- .../translations/guiSQLiteStudio_ru.qm | Bin 140399 -> 143567 bytes .../translations/guiSQLiteStudio_ru.ts | 388 ++-- .../translations/guiSQLiteStudio_sk.qm | Bin 27 -> 80073 bytes .../translations/guiSQLiteStudio_sk.ts | 1867 ++++++++++---------- .../translations/guiSQLiteStudio_zh_CN.qm | Bin 16 -> 33741 bytes .../translations/guiSQLiteStudio_zh_CN.ts | 1246 ++++++------- SQLiteStudio3/guiSQLiteStudio/uiconfig.h | 1 + SQLiteStudio3/guiSQLiteStudio/uidebug.cpp | 57 +- SQLiteStudio3/guiSQLiteStudio/uidebug.h | 15 +- SQLiteStudio3/guiSQLiteStudio/uiutils.cpp | 8 +- SQLiteStudio3/guiSQLiteStudio/uiutils.h | 2 +- .../guiSQLiteStudio/windows/editorwindow.cpp | 4 +- .../guiSQLiteStudio/windows/editorwindow.h | 2 +- .../guiSQLiteStudio/windows/tablewindow.cpp | 2 + SQLiteStudio3/lang.tcl | 52 +- SQLiteStudio3/sqlitestudio/main.cpp | 7 +- SQLiteStudio3/sqlitestudio/sqlitestudio.qrc | 2 + .../sqlitestudio/translations/sqlitestudio_de.ts | 36 +- .../sqlitestudio/translations/sqlitestudio_es.ts | 36 +- .../sqlitestudio/translations/sqlitestudio_fr.ts | 36 +- .../sqlitestudio/translations/sqlitestudio_pl.qm | Bin 1942 -> 2259 bytes .../sqlitestudio/translations/sqlitestudio_pl.ts | 10 +- .../translations/sqlitestudio_pt_BR.ts | 36 +- .../sqlitestudio/translations/sqlitestudio_ru.qm | Bin 2041 -> 2380 bytes .../sqlitestudio/translations/sqlitestudio_ru.ts | 34 +- .../sqlitestudio/translations/sqlitestudio_sk.qm | Bin 27 -> 834 bytes .../sqlitestudio/translations/sqlitestudio_sk.ts | 46 +- .../translations/sqlitestudio_zh_CN.ts | 36 +- SQLiteStudio3/sqlitestudiocli/sqlitestudiocli.qrc | 2 + .../translations/sqlitestudiocli_de.ts | 2 +- .../translations/sqlitestudiocli_es.ts | 2 +- .../translations/sqlitestudiocli_fr.ts | 2 +- .../translations/sqlitestudiocli_pl.qm | Bin 39063 -> 39355 bytes .../translations/sqlitestudiocli_pl.ts | 4 +- .../translations/sqlitestudiocli_pt_BR.ts | 2 +- .../translations/sqlitestudiocli_ru.qm | Bin 39880 -> 40196 bytes .../translations/sqlitestudiocli_ru.ts | 4 +- .../translations/sqlitestudiocli_sk.ts | 2 +- .../translations/sqlitestudiocli_zh_CN.ts | 2 +- 340 files changed, 5658 insertions(+), 3858 deletions(-) create mode 100644 SQLiteStudio3/coreSQLiteStudio/common/signalwait.cpp create mode 100644 SQLiteStudio3/coreSQLiteStudio/common/signalwait.h create mode 100644 SQLiteStudio3/guiSQLiteStudio/common/ipvalidator.cpp create mode 100644 SQLiteStudio3/guiSQLiteStudio/common/ipvalidator.h delete mode 100644 SQLiteStudio3/guiSQLiteStudio/img/database_invalid.png create mode 100644 SQLiteStudio3/guiSQLiteStudio/img/plus.png diff --git a/Plugins/ConfigMigration/ConfigMigration_de.ts b/Plugins/ConfigMigration/ConfigMigration_de.ts index 7179052..ebaf7af 100644 --- a/Plugins/ConfigMigration/ConfigMigration_de.ts +++ b/Plugins/ConfigMigration/ConfigMigration_de.ts @@ -1,6 +1,6 @@ - + ConfigMigration diff --git a/Plugins/ConfigMigration/ConfigMigration_es.ts b/Plugins/ConfigMigration/ConfigMigration_es.ts index f412dc9..3854dd1 100644 --- a/Plugins/ConfigMigration/ConfigMigration_es.ts +++ b/Plugins/ConfigMigration/ConfigMigration_es.ts @@ -1,6 +1,6 @@ - + ConfigMigration diff --git a/Plugins/ConfigMigration/ConfigMigration_fr.ts b/Plugins/ConfigMigration/ConfigMigration_fr.ts index ff23dbb..c0ad4a6 100644 --- a/Plugins/ConfigMigration/ConfigMigration_fr.ts +++ b/Plugins/ConfigMigration/ConfigMigration_fr.ts @@ -1,6 +1,6 @@ - + ConfigMigration diff --git a/Plugins/ConfigMigration/ConfigMigration_pl.ts b/Plugins/ConfigMigration/ConfigMigration_pl.ts index 08919fd..f2ef5d8 100644 --- a/Plugins/ConfigMigration/ConfigMigration_pl.ts +++ b/Plugins/ConfigMigration/ConfigMigration_pl.ts @@ -1,6 +1,6 @@ - + ConfigMigration diff --git a/Plugins/ConfigMigration/ConfigMigration_pt_BR.ts b/Plugins/ConfigMigration/ConfigMigration_pt_BR.ts index d6cf37b..fb23daf 100644 --- a/Plugins/ConfigMigration/ConfigMigration_pt_BR.ts +++ b/Plugins/ConfigMigration/ConfigMigration_pt_BR.ts @@ -1,6 +1,6 @@ - + ConfigMigration diff --git a/Plugins/ConfigMigration/ConfigMigration_ru.ts b/Plugins/ConfigMigration/ConfigMigration_ru.ts index f487465..0337f58 100644 --- a/Plugins/ConfigMigration/ConfigMigration_ru.ts +++ b/Plugins/ConfigMigration/ConfigMigration_ru.ts @@ -1,6 +1,6 @@ - + ConfigMigration diff --git a/Plugins/ConfigMigration/ConfigMigration_sk.ts b/Plugins/ConfigMigration/ConfigMigration_sk.ts index 84d3076..ffe6eef 100644 --- a/Plugins/ConfigMigration/ConfigMigration_sk.ts +++ b/Plugins/ConfigMigration/ConfigMigration_sk.ts @@ -1,6 +1,6 @@ - + ConfigMigration diff --git a/Plugins/ConfigMigration/ConfigMigration_zh_CN.ts b/Plugins/ConfigMigration/ConfigMigration_zh_CN.ts index dedba47..249e493 100644 --- a/Plugins/ConfigMigration/ConfigMigration_zh_CN.ts +++ b/Plugins/ConfigMigration/ConfigMigration_zh_CN.ts @@ -1,6 +1,6 @@ - + ConfigMigration diff --git a/Plugins/ConfigMigration/configmigration.json b/Plugins/ConfigMigration/configmigration.json index a8c62d3..a0629c0 100644 --- a/Plugins/ConfigMigration/configmigration.json +++ b/Plugins/ConfigMigration/configmigration.json @@ -2,7 +2,7 @@ "type": "GeneralPurposePlugin", "title": "Configuration migration", "description": "Performs migration from SQLiteStudio 2.1.x configuration to version 3.0.0.", - "version": 10002, + "version": 10003, "author": "SalSoft", "gui": true } diff --git a/Plugins/ConfigMigration/configmigration.qrc b/Plugins/ConfigMigration/configmigration.qrc index af137f0..d8c40cd 100644 --- a/Plugins/ConfigMigration/configmigration.qrc +++ b/Plugins/ConfigMigration/configmigration.qrc @@ -6,5 +6,7 @@ ConfigMigration_pl.qm ConfigMigration_ru.qm ConfigMigration_fr.qm + ConfigMigration_sk.qm + ConfigMigration_zh_CN.qm diff --git a/Plugins/CsvExport/CsvExport_de.ts b/Plugins/CsvExport/CsvExport_de.ts index f87bc99..1d07517 100644 --- a/Plugins/CsvExport/CsvExport_de.ts +++ b/Plugins/CsvExport/CsvExport_de.ts @@ -1,6 +1,6 @@ - + CsvExport diff --git a/Plugins/CsvExport/CsvExport_es.ts b/Plugins/CsvExport/CsvExport_es.ts index de3f0cb..09fd76a 100644 --- a/Plugins/CsvExport/CsvExport_es.ts +++ b/Plugins/CsvExport/CsvExport_es.ts @@ -1,6 +1,6 @@ - + CsvExport diff --git a/Plugins/CsvExport/CsvExport_fr.ts b/Plugins/CsvExport/CsvExport_fr.ts index b36745a..4917c87 100644 --- a/Plugins/CsvExport/CsvExport_fr.ts +++ b/Plugins/CsvExport/CsvExport_fr.ts @@ -1,6 +1,6 @@ - + CsvExport diff --git a/Plugins/CsvExport/CsvExport_pl.ts b/Plugins/CsvExport/CsvExport_pl.ts index a925db2..a608049 100644 --- a/Plugins/CsvExport/CsvExport_pl.ts +++ b/Plugins/CsvExport/CsvExport_pl.ts @@ -1,6 +1,6 @@ - + CsvExport diff --git a/Plugins/CsvExport/CsvExport_pt_BR.ts b/Plugins/CsvExport/CsvExport_pt_BR.ts index 8f3f678..0c8b1d9 100644 --- a/Plugins/CsvExport/CsvExport_pt_BR.ts +++ b/Plugins/CsvExport/CsvExport_pt_BR.ts @@ -1,6 +1,6 @@ - + CsvExport diff --git a/Plugins/CsvExport/CsvExport_ru.ts b/Plugins/CsvExport/CsvExport_ru.ts index 230a06f..5cf441b 100644 --- a/Plugins/CsvExport/CsvExport_ru.ts +++ b/Plugins/CsvExport/CsvExport_ru.ts @@ -1,6 +1,6 @@ - + CsvExport diff --git a/Plugins/CsvExport/CsvExport_sk.qm b/Plugins/CsvExport/CsvExport_sk.qm index 1776294..ea246cd 100644 Binary files a/Plugins/CsvExport/CsvExport_sk.qm and b/Plugins/CsvExport/CsvExport_sk.qm differ diff --git a/Plugins/CsvExport/CsvExport_sk.ts b/Plugins/CsvExport/CsvExport_sk.ts index 4a85fbd..54ab016 100644 --- a/Plugins/CsvExport/CsvExport_sk.ts +++ b/Plugins/CsvExport/CsvExport_sk.ts @@ -6,52 +6,52 @@ Column names in first row - + Názvy stĺpcov v prvom riadku Column separator: - + Oddeľovač stĺpcov: , (comma) - + , (čiarka) ; (semicolon) - + ; (bodkočiarka) \t (tab) - + \t (tabulátor) (whitespace) - + (medzera) Custom: - + Iný: Export NULL values as: - + Exportovať NULL hodnoty ako: Empty string - + Prázdny reťazec Enter the custom separator character. - + Zadajte vlasntý oddeľovač. diff --git a/Plugins/CsvExport/CsvExport_zh_CN.ts b/Plugins/CsvExport/CsvExport_zh_CN.ts index c0c8045..e73fe4e 100644 --- a/Plugins/CsvExport/CsvExport_zh_CN.ts +++ b/Plugins/CsvExport/CsvExport_zh_CN.ts @@ -1,6 +1,6 @@ - + CsvExport diff --git a/Plugins/CsvExport/csvexport.json b/Plugins/CsvExport/csvexport.json index d19e750..face150 100644 --- a/Plugins/CsvExport/csvexport.json +++ b/Plugins/CsvExport/csvexport.json @@ -2,6 +2,6 @@ "type": "ExportPlugin", "title": "CSV export", "description": "Provides CSV format for exporting", - "version": 10001, + "version": 10002, "author": "SalSoft" } diff --git a/Plugins/CsvExport/csvexport.qrc b/Plugins/CsvExport/csvexport.qrc index 2467458..e6660ec 100644 --- a/Plugins/CsvExport/csvexport.qrc +++ b/Plugins/CsvExport/csvexport.qrc @@ -6,5 +6,7 @@ CsvExport_pl.qm CsvExport_ru.qm CsvExport_fr.qm + CsvExport_sk.qm + CsvExport_zh_CN.qm diff --git a/Plugins/CsvImport/CsvImport_de.ts b/Plugins/CsvImport/CsvImport_de.ts index 04dc2c3..4ebea97 100644 --- a/Plugins/CsvImport/CsvImport_de.ts +++ b/Plugins/CsvImport/CsvImport_de.ts @@ -1,6 +1,6 @@ - + CsvImport diff --git a/Plugins/CsvImport/CsvImport_es.ts b/Plugins/CsvImport/CsvImport_es.ts index 6be4b48..14ff9c3 100644 --- a/Plugins/CsvImport/CsvImport_es.ts +++ b/Plugins/CsvImport/CsvImport_es.ts @@ -1,6 +1,6 @@ - + CsvImport diff --git a/Plugins/CsvImport/CsvImport_fr.ts b/Plugins/CsvImport/CsvImport_fr.ts index 66d7de9..f8854e0 100644 --- a/Plugins/CsvImport/CsvImport_fr.ts +++ b/Plugins/CsvImport/CsvImport_fr.ts @@ -1,6 +1,6 @@ - + CsvImport diff --git a/Plugins/CsvImport/CsvImport_pl.ts b/Plugins/CsvImport/CsvImport_pl.ts index 7b9494f..227b16c 100644 --- a/Plugins/CsvImport/CsvImport_pl.ts +++ b/Plugins/CsvImport/CsvImport_pl.ts @@ -1,6 +1,6 @@ - + CsvImport diff --git a/Plugins/CsvImport/CsvImport_pt_BR.ts b/Plugins/CsvImport/CsvImport_pt_BR.ts index b01222f..063fc09 100644 --- a/Plugins/CsvImport/CsvImport_pt_BR.ts +++ b/Plugins/CsvImport/CsvImport_pt_BR.ts @@ -1,6 +1,6 @@ - + CsvImport diff --git a/Plugins/CsvImport/CsvImport_ru.qm b/Plugins/CsvImport/CsvImport_ru.qm index 0202276..e72533e 100644 Binary files a/Plugins/CsvImport/CsvImport_ru.qm and b/Plugins/CsvImport/CsvImport_ru.qm differ diff --git a/Plugins/CsvImport/CsvImport_ru.ts b/Plugins/CsvImport/CsvImport_ru.ts index a38f2d1..93ecdba 100644 --- a/Plugins/CsvImport/CsvImport_ru.ts +++ b/Plugins/CsvImport/CsvImport_ru.ts @@ -1,6 +1,6 @@ - + CsvImport @@ -64,7 +64,7 @@ First line represents CSV column names - + Имена столбцов в первой строке Skip first row of data diff --git a/Plugins/CsvImport/CsvImport_sk.qm b/Plugins/CsvImport/CsvImport_sk.qm index 1776294..281fc9a 100644 Binary files a/Plugins/CsvImport/CsvImport_sk.qm and b/Plugins/CsvImport/CsvImport_sk.qm differ diff --git a/Plugins/CsvImport/CsvImport_sk.ts b/Plugins/CsvImport/CsvImport_sk.ts index c402357..5d915ac 100644 --- a/Plugins/CsvImport/CsvImport_sk.ts +++ b/Plugins/CsvImport/CsvImport_sk.ts @@ -6,27 +6,27 @@ Cannot read file %1 - + Nemôžem čítať súbor %1 Could not find any data in the file %1. - + Nemôžem nájsť dáta v súbore %1. Enter the custom separator character. - + Zadajte vlastný oddeľovač. Enter the value that will be interpreted as a NULL. - + Zadajte hodnotu, ktorá bude interpretovaná ako NULL. CSV files (*.csv);;Text files (*.txt);;All files (*) - + CSV súbory (*.csv);;Textové súbory (*.txt);;Všetky súbory (*) @@ -34,52 +34,52 @@ , (comma) - + , (čiarka) ; (semicolon) - + ; (bodkočiarka) \t (tab) - + \t (tabulátor) (whitespace) - + (medzera) Custom: - + Iný: <p>Enable this if the first data line in your CSV file represents column names. You don't want column names to be imported into the table as a regular data.</p> - + <p>Zaškrtnite túto voľbu ak prvý riadok v CSV súbore obsahuje názvy stĺpcov a nechcete aby boli naimportované do tabuľky</p> First line represents CSV column names - + Názvy stĺpcov v prvom riadku Field separator: - + Oddeľovač: NULL values: - + NULL hodnoty: If your CSV data contains null values, define how are they represented in the CSV. - + Ak váš CSV súbor obsahuje null hodnoty, zadajte ako sú reprezentované v CSV. diff --git a/Plugins/CsvImport/CsvImport_zh_CN.ts b/Plugins/CsvImport/CsvImport_zh_CN.ts index 8248169..c1958e3 100644 --- a/Plugins/CsvImport/CsvImport_zh_CN.ts +++ b/Plugins/CsvImport/CsvImport_zh_CN.ts @@ -1,6 +1,6 @@ - + CsvImport diff --git a/Plugins/CsvImport/csvimport.json b/Plugins/CsvImport/csvimport.json index f6280fe..64f8e18 100644 --- a/Plugins/CsvImport/csvimport.json +++ b/Plugins/CsvImport/csvimport.json @@ -2,6 +2,6 @@ "type": "ImportPlugin", "title": "CSV import", "description": "CSV format support for importing data", - "version": 10002, + "version": 10003, "author": "SalSoft" } diff --git a/Plugins/CsvImport/csvimport.qrc b/Plugins/CsvImport/csvimport.qrc index b65feb0..e63d26f 100644 --- a/Plugins/CsvImport/csvimport.qrc +++ b/Plugins/CsvImport/csvimport.qrc @@ -6,5 +6,7 @@ CsvImport_pl.qm CsvImport_ru.qm CsvImport_fr.qm + CsvImport_sk.qm + CsvImport_zh_CN.qm diff --git a/Plugins/DbSqlite2/dbsqlite2.json b/Plugins/DbSqlite2/dbsqlite2.json index 275a794..6761faf 100644 --- a/Plugins/DbSqlite2/dbsqlite2.json +++ b/Plugins/DbSqlite2/dbsqlite2.json @@ -2,6 +2,6 @@ "type": "DbPlugin", "title": "SQLite 2", "description": "Provides support for SQLite 2.* databases", - "version": 10001, + "version": 10002, "author": "SalSoft" } diff --git a/Plugins/HtmlExport/HtmlExport_de.ts b/Plugins/HtmlExport/HtmlExport_de.ts index 2f2ed17..f5463cd 100644 --- a/Plugins/HtmlExport/HtmlExport_de.ts +++ b/Plugins/HtmlExport/HtmlExport_de.ts @@ -1,6 +1,6 @@ - + HtmlExport diff --git a/Plugins/HtmlExport/HtmlExport_es.ts b/Plugins/HtmlExport/HtmlExport_es.ts index 970ee6c..5f3a331 100644 --- a/Plugins/HtmlExport/HtmlExport_es.ts +++ b/Plugins/HtmlExport/HtmlExport_es.ts @@ -1,6 +1,6 @@ - + HtmlExport diff --git a/Plugins/HtmlExport/HtmlExport_fr.ts b/Plugins/HtmlExport/HtmlExport_fr.ts index 6fe39b9..594670e 100644 --- a/Plugins/HtmlExport/HtmlExport_fr.ts +++ b/Plugins/HtmlExport/HtmlExport_fr.ts @@ -1,6 +1,6 @@ - + HtmlExport diff --git a/Plugins/HtmlExport/HtmlExport_pl.ts b/Plugins/HtmlExport/HtmlExport_pl.ts index ebe1925..3796e73 100644 --- a/Plugins/HtmlExport/HtmlExport_pl.ts +++ b/Plugins/HtmlExport/HtmlExport_pl.ts @@ -1,6 +1,6 @@ - + HtmlExport diff --git a/Plugins/HtmlExport/HtmlExport_pt_BR.ts b/Plugins/HtmlExport/HtmlExport_pt_BR.ts index 86b0993..66a2993 100644 --- a/Plugins/HtmlExport/HtmlExport_pt_BR.ts +++ b/Plugins/HtmlExport/HtmlExport_pt_BR.ts @@ -1,6 +1,6 @@ - + HtmlExport diff --git a/Plugins/HtmlExport/HtmlExport_ru.ts b/Plugins/HtmlExport/HtmlExport_ru.ts index a62e54b..9165c02 100644 --- a/Plugins/HtmlExport/HtmlExport_ru.ts +++ b/Plugins/HtmlExport/HtmlExport_ru.ts @@ -1,6 +1,6 @@ - + HtmlExport diff --git a/Plugins/HtmlExport/HtmlExport_sk.qm b/Plugins/HtmlExport/HtmlExport_sk.qm index 1776294..29c8745 100644 Binary files a/Plugins/HtmlExport/HtmlExport_sk.qm and b/Plugins/HtmlExport/HtmlExport_sk.qm differ diff --git a/Plugins/HtmlExport/HtmlExport_sk.ts b/Plugins/HtmlExport/HtmlExport_sk.ts index 66e64d7..55dedbe 100644 --- a/Plugins/HtmlExport/HtmlExport_sk.ts +++ b/Plugins/HtmlExport/HtmlExport_sk.ts @@ -127,37 +127,37 @@ Maximum number of characters per cell: - + Maximálny počet znakov na bunku: Include data types in first row - + Dátové typy pridať do prvého riadka k názvom stĺpcov Column names as first row - + Názvy stĺpcov ako prvý riadok Row numbers as first column - + Číslovanie riadkov ako prvý stĺpec Output format - + Výstupný formát Format document (new lines, indentation) - + Formátovať dokument (nové riadky, odsadenie) Compress (everything in one line) - + Zhustiť (všetko do jedného riadka) diff --git a/Plugins/HtmlExport/HtmlExport_zh_CN.ts b/Plugins/HtmlExport/HtmlExport_zh_CN.ts index fbcebf0..72750a1 100644 --- a/Plugins/HtmlExport/HtmlExport_zh_CN.ts +++ b/Plugins/HtmlExport/HtmlExport_zh_CN.ts @@ -1,6 +1,6 @@ - + HtmlExport diff --git a/Plugins/HtmlExport/htmlexport.json b/Plugins/HtmlExport/htmlexport.json index 530a21d..2ca4b6d 100644 --- a/Plugins/HtmlExport/htmlexport.json +++ b/Plugins/HtmlExport/htmlexport.json @@ -2,6 +2,6 @@ "type": "ExportPlugin", "title": "HTML export", "description": "Provides HTML format for exporting.", - "version": 10000, + "version": 10001, "author": "SalSoft" } diff --git a/Plugins/HtmlExport/htmlexport.qrc b/Plugins/HtmlExport/htmlexport.qrc index d7b8c64..5c41bc9 100644 --- a/Plugins/HtmlExport/htmlexport.qrc +++ b/Plugins/HtmlExport/htmlexport.qrc @@ -9,5 +9,7 @@ HtmlExport_pl.qm HtmlExport_ru.qm HtmlExport_fr.qm + HtmlExport_sk.qm + HtmlExport_zh_CN.qm diff --git a/Plugins/JsonExport/JsonExport_de.ts b/Plugins/JsonExport/JsonExport_de.ts index e345feb..15fece3 100644 --- a/Plugins/JsonExport/JsonExport_de.ts +++ b/Plugins/JsonExport/JsonExport_de.ts @@ -1,6 +1,6 @@ - + JsonExportConfig diff --git a/Plugins/JsonExport/JsonExport_es.ts b/Plugins/JsonExport/JsonExport_es.ts index e93d0ff..38209b9 100644 --- a/Plugins/JsonExport/JsonExport_es.ts +++ b/Plugins/JsonExport/JsonExport_es.ts @@ -1,6 +1,6 @@ - + JsonExportConfig diff --git a/Plugins/JsonExport/JsonExport_fr.ts b/Plugins/JsonExport/JsonExport_fr.ts index cb53aff..48af099 100644 --- a/Plugins/JsonExport/JsonExport_fr.ts +++ b/Plugins/JsonExport/JsonExport_fr.ts @@ -1,6 +1,6 @@ - + JsonExportConfig diff --git a/Plugins/JsonExport/JsonExport_pl.ts b/Plugins/JsonExport/JsonExport_pl.ts index bdfdf8a..4a28cc2 100644 --- a/Plugins/JsonExport/JsonExport_pl.ts +++ b/Plugins/JsonExport/JsonExport_pl.ts @@ -1,6 +1,6 @@ - + JsonExportConfig diff --git a/Plugins/JsonExport/JsonExport_pt_BR.ts b/Plugins/JsonExport/JsonExport_pt_BR.ts index 53480f6..ba1735d 100644 --- a/Plugins/JsonExport/JsonExport_pt_BR.ts +++ b/Plugins/JsonExport/JsonExport_pt_BR.ts @@ -1,6 +1,6 @@ - + JsonExportConfig diff --git a/Plugins/JsonExport/JsonExport_ru.ts b/Plugins/JsonExport/JsonExport_ru.ts index 5419206..61b24eb 100644 --- a/Plugins/JsonExport/JsonExport_ru.ts +++ b/Plugins/JsonExport/JsonExport_ru.ts @@ -1,6 +1,6 @@ - + JsonExportConfig diff --git a/Plugins/JsonExport/JsonExport_sk.qm b/Plugins/JsonExport/JsonExport_sk.qm index 1776294..c854235 100644 Binary files a/Plugins/JsonExport/JsonExport_sk.qm and b/Plugins/JsonExport/JsonExport_sk.qm differ diff --git a/Plugins/JsonExport/JsonExport_sk.ts b/Plugins/JsonExport/JsonExport_sk.ts index 6fd3228..caade25 100644 --- a/Plugins/JsonExport/JsonExport_sk.ts +++ b/Plugins/JsonExport/JsonExport_sk.ts @@ -6,17 +6,17 @@ Output format - + Výstupný formát Format document (new lines, indentation) - + Formátovať dokument (nové riadky, odsadenie) Compress (everything in one line) - + Zhustiť (všetko do jedného riadka) diff --git a/Plugins/JsonExport/JsonExport_zh_CN.ts b/Plugins/JsonExport/JsonExport_zh_CN.ts index 2102dc6..be101c4 100644 --- a/Plugins/JsonExport/JsonExport_zh_CN.ts +++ b/Plugins/JsonExport/JsonExport_zh_CN.ts @@ -1,6 +1,6 @@ - + JsonExportConfig diff --git a/Plugins/JsonExport/jsonexport.json b/Plugins/JsonExport/jsonexport.json index c56270c..bdc6396 100644 --- a/Plugins/JsonExport/jsonexport.json +++ b/Plugins/JsonExport/jsonexport.json @@ -2,6 +2,6 @@ "type": "ExportPlugin", "title": "JSON export", "description": "Provides JSON format for exporting.", - "version": 10000, + "version": 10001, "author": "SalSoft" } diff --git a/Plugins/JsonExport/jsonexport.qrc b/Plugins/JsonExport/jsonexport.qrc index 7899199..72cd201 100644 --- a/Plugins/JsonExport/jsonexport.qrc +++ b/Plugins/JsonExport/jsonexport.qrc @@ -6,5 +6,7 @@ JsonExport_pl.qm JsonExport_ru.qm JsonExport_fr.qm + JsonExport_sk.qm + JsonExport_zh_CN.qm diff --git a/Plugins/PdfExport/PdfExport_de.ts b/Plugins/PdfExport/PdfExport_de.ts index 6b9f49f..7e5d8e6 100644 --- a/Plugins/PdfExport/PdfExport_de.ts +++ b/Plugins/PdfExport/PdfExport_de.ts @@ -1,6 +1,6 @@ - + PdfExport diff --git a/Plugins/PdfExport/PdfExport_es.ts b/Plugins/PdfExport/PdfExport_es.ts index 924d991..745a227 100644 --- a/Plugins/PdfExport/PdfExport_es.ts +++ b/Plugins/PdfExport/PdfExport_es.ts @@ -1,6 +1,6 @@ - + PdfExport diff --git a/Plugins/PdfExport/PdfExport_fr.ts b/Plugins/PdfExport/PdfExport_fr.ts index 576d257..95de2a9 100644 --- a/Plugins/PdfExport/PdfExport_fr.ts +++ b/Plugins/PdfExport/PdfExport_fr.ts @@ -1,6 +1,6 @@ - + PdfExport diff --git a/Plugins/PdfExport/PdfExport_pl.ts b/Plugins/PdfExport/PdfExport_pl.ts index 5ac637d..e806995 100644 --- a/Plugins/PdfExport/PdfExport_pl.ts +++ b/Plugins/PdfExport/PdfExport_pl.ts @@ -1,6 +1,6 @@ - + PdfExport diff --git a/Plugins/PdfExport/PdfExport_pt_BR.ts b/Plugins/PdfExport/PdfExport_pt_BR.ts index 76e9fff..59df275 100644 --- a/Plugins/PdfExport/PdfExport_pt_BR.ts +++ b/Plugins/PdfExport/PdfExport_pt_BR.ts @@ -1,6 +1,6 @@ - + PdfExport diff --git a/Plugins/PdfExport/PdfExport_ru.ts b/Plugins/PdfExport/PdfExport_ru.ts index 9f14f09..715a6ff 100644 --- a/Plugins/PdfExport/PdfExport_ru.ts +++ b/Plugins/PdfExport/PdfExport_ru.ts @@ -1,6 +1,6 @@ - + PdfExport diff --git a/Plugins/PdfExport/PdfExport_sk.qm b/Plugins/PdfExport/PdfExport_sk.qm index 1776294..63e21f9 100644 Binary files a/Plugins/PdfExport/PdfExport_sk.qm and b/Plugins/PdfExport/PdfExport_sk.qm differ diff --git a/Plugins/PdfExport/PdfExport_sk.ts b/Plugins/PdfExport/PdfExport_sk.ts index 5b14661..9a8f3e2 100644 --- a/Plugins/PdfExport/PdfExport_sk.ts +++ b/Plugins/PdfExport/PdfExport_sk.ts @@ -6,164 +6,164 @@ SQLiteStudio v%1 - + SQLiteStudio v%1 SQL query results - + Výsledky SQL dotazu Exported table: %1 - + Vyexportovaná tabuľka: %1 Table: %1 - + Tabuľka: %1 Column - + Stĺpec Data type - + Dátový typ Constraints - + Obmedzenia Global table constraints - + Globálne tabuľkové obmedzenia Exported database: %1 - + Vyexportovaná databáza: %1 Index: %1 - + Index: %1 Property index header - + Typ Value index header - + Hodnota Indexed table - + Indexovaná tabuľka Unique index - + Jedinečný index Yes - + Áno No - + Nie Collation - + Porovnávanie Sort order - + Zoradenie Partial index condition - + Podmienka parciálneho indexu Trigger: %1 - + Spúšťač: %1 Property trigger header - + Typ Value trigger header - + Hodnota Activation time - + Aktivačný čas For action - + Pre akciu On view - + Na pohľade On table - + Na tabuľke Activation condition - + Aktivačná podmienka Code executed - + Vykonaný kód View: %1 - + Pohľad: %1 Query: - + Dotaz: Document generated with SQLiteStudio v%1 - + Dokument vygenerovaný programom SQLiteStudio v%1 @@ -171,32 +171,32 @@ Size and layout - + Veľkosť a rozvrhnutie Page size: - + Veľkosť strany: Right margin: - + Pravý okraj: Left margin: - + Ľavý okraj: Cell padding: - + Odsadenie od okrajov bunky: Limit characters in single cell: - + Maximálny počet znakov v jednej bunke: @@ -205,52 +205,52 @@ mm - + mm Bottom margin: - + Spodný okraj: Top margin: - + Horný okraj: Font - + Písmo Colors - + Farby Headers background: - + Farba pozadia štruktúr: NULL value color: - + Farba NULL hodnoty: Other settings - + Iné nastavenia Print row numbers for data - + Číslovanie dátových riadkov Print page numbers - + Číslovanie strán diff --git a/Plugins/PdfExport/PdfExport_zh_CN.ts b/Plugins/PdfExport/PdfExport_zh_CN.ts index ec250b9..b570ede 100644 --- a/Plugins/PdfExport/PdfExport_zh_CN.ts +++ b/Plugins/PdfExport/PdfExport_zh_CN.ts @@ -1,6 +1,6 @@ - + PdfExport diff --git a/Plugins/PdfExport/pdfexport.json b/Plugins/PdfExport/pdfexport.json index 5f1e2e4..9f64d2f 100644 --- a/Plugins/PdfExport/pdfexport.json +++ b/Plugins/PdfExport/pdfexport.json @@ -2,7 +2,7 @@ "type": "ExportPlugin", "title": "PDF export", "description": "Provides PDF format for exporting.", - "version": 10000, + "version": 10001, "author": "SalSoft", "gui": true } diff --git a/Plugins/PdfExport/pdfexport.qrc b/Plugins/PdfExport/pdfexport.qrc index 857a310..1e079fd 100644 --- a/Plugins/PdfExport/pdfexport.qrc +++ b/Plugins/PdfExport/pdfexport.qrc @@ -6,5 +6,7 @@ PdfExport_pl.qm PdfExport_ru.qm PdfExport_fr.qm + PdfExport_sk.qm + PdfExport_zh_CN.qm diff --git a/Plugins/Printing/Printing_de.ts b/Plugins/Printing/Printing_de.ts index 9ce2cb4..6a165a2 100644 --- a/Plugins/Printing/Printing_de.ts +++ b/Plugins/Printing/Printing_de.ts @@ -1,6 +1,6 @@ - + Printing diff --git a/Plugins/Printing/Printing_es.ts b/Plugins/Printing/Printing_es.ts index d76730d..cad9a2f 100644 --- a/Plugins/Printing/Printing_es.ts +++ b/Plugins/Printing/Printing_es.ts @@ -1,6 +1,6 @@ - + Printing diff --git a/Plugins/Printing/Printing_fr.ts b/Plugins/Printing/Printing_fr.ts index 9d86ad5..c851a95 100644 --- a/Plugins/Printing/Printing_fr.ts +++ b/Plugins/Printing/Printing_fr.ts @@ -1,6 +1,6 @@ - + Printing diff --git a/Plugins/Printing/Printing_pl.ts b/Plugins/Printing/Printing_pl.ts index b372ef9..b56a3ce 100644 --- a/Plugins/Printing/Printing_pl.ts +++ b/Plugins/Printing/Printing_pl.ts @@ -1,6 +1,6 @@ - + Printing diff --git a/Plugins/Printing/Printing_pt_BR.ts b/Plugins/Printing/Printing_pt_BR.ts index c003b38..61016f0 100644 --- a/Plugins/Printing/Printing_pt_BR.ts +++ b/Plugins/Printing/Printing_pt_BR.ts @@ -1,6 +1,6 @@ - + Printing diff --git a/Plugins/Printing/Printing_ru.ts b/Plugins/Printing/Printing_ru.ts index 6a63c83..642f912 100644 --- a/Plugins/Printing/Printing_ru.ts +++ b/Plugins/Printing/Printing_ru.ts @@ -1,6 +1,6 @@ - + Printing diff --git a/Plugins/Printing/Printing_sk.ts b/Plugins/Printing/Printing_sk.ts index 4e35c9d..8dce4a8 100644 --- a/Plugins/Printing/Printing_sk.ts +++ b/Plugins/Printing/Printing_sk.ts @@ -1,6 +1,6 @@ - + Printing diff --git a/Plugins/Printing/Printing_zh_CN.ts b/Plugins/Printing/Printing_zh_CN.ts index 7c6dcfe..0b1b255 100644 --- a/Plugins/Printing/Printing_zh_CN.ts +++ b/Plugins/Printing/Printing_zh_CN.ts @@ -1,6 +1,6 @@ - + Printing diff --git a/Plugins/Printing/printing.json b/Plugins/Printing/printing.json index 101f07b..5313186 100644 --- a/Plugins/Printing/printing.json +++ b/Plugins/Printing/printing.json @@ -2,7 +2,7 @@ "type": "GeneralPurposePlugin", "title": "Printing", "description": "Provides printing support.", - "version": 10001, + "version": 10002, "author": "SalSoft", "gui": true, "dependencies": "PdfExport" diff --git a/Plugins/Printing/printing.qrc b/Plugins/Printing/printing.qrc index dc7f27c..c4be754 100644 --- a/Plugins/Printing/printing.qrc +++ b/Plugins/Printing/printing.qrc @@ -6,5 +6,7 @@ Printing_pl.qm Printing_ru.qm Printing_fr.qm + Printing_sk.qm + Printing_zh_CN.qm diff --git a/Plugins/RegExpImport/RegExpImport_de.ts b/Plugins/RegExpImport/RegExpImport_de.ts index e73d909..2a30835 100644 --- a/Plugins/RegExpImport/RegExpImport_de.ts +++ b/Plugins/RegExpImport/RegExpImport_de.ts @@ -1,6 +1,6 @@ - + RegExpImport diff --git a/Plugins/RegExpImport/RegExpImport_es.ts b/Plugins/RegExpImport/RegExpImport_es.ts index fd5ae74..c58d204 100644 --- a/Plugins/RegExpImport/RegExpImport_es.ts +++ b/Plugins/RegExpImport/RegExpImport_es.ts @@ -1,6 +1,6 @@ - + RegExpImport diff --git a/Plugins/RegExpImport/RegExpImport_fr.ts b/Plugins/RegExpImport/RegExpImport_fr.ts index 6ab0b2e..5a6e957 100644 --- a/Plugins/RegExpImport/RegExpImport_fr.ts +++ b/Plugins/RegExpImport/RegExpImport_fr.ts @@ -1,6 +1,6 @@ - + RegExpImport diff --git a/Plugins/RegExpImport/RegExpImport_pl.ts b/Plugins/RegExpImport/RegExpImport_pl.ts index a5d567c..d55ed25 100644 --- a/Plugins/RegExpImport/RegExpImport_pl.ts +++ b/Plugins/RegExpImport/RegExpImport_pl.ts @@ -1,6 +1,6 @@ - + RegExpImport diff --git a/Plugins/RegExpImport/RegExpImport_pt_BR.ts b/Plugins/RegExpImport/RegExpImport_pt_BR.ts index b861545..0af41e7 100644 --- a/Plugins/RegExpImport/RegExpImport_pt_BR.ts +++ b/Plugins/RegExpImport/RegExpImport_pt_BR.ts @@ -1,6 +1,6 @@ - + RegExpImport diff --git a/Plugins/RegExpImport/RegExpImport_ru.ts b/Plugins/RegExpImport/RegExpImport_ru.ts index 09ad9a9..edcd7f4 100644 --- a/Plugins/RegExpImport/RegExpImport_ru.ts +++ b/Plugins/RegExpImport/RegExpImport_ru.ts @@ -1,6 +1,6 @@ - + RegExpImport diff --git a/Plugins/RegExpImport/RegExpImport_sk.ts b/Plugins/RegExpImport/RegExpImport_sk.ts index 9b34ed7..25068a5 100644 --- a/Plugins/RegExpImport/RegExpImport_sk.ts +++ b/Plugins/RegExpImport/RegExpImport_sk.ts @@ -1,6 +1,6 @@ - + RegExpImport diff --git a/Plugins/RegExpImport/RegExpImport_zh_CN.ts b/Plugins/RegExpImport/RegExpImport_zh_CN.ts index 97a39d5..c361148 100644 --- a/Plugins/RegExpImport/RegExpImport_zh_CN.ts +++ b/Plugins/RegExpImport/RegExpImport_zh_CN.ts @@ -1,6 +1,6 @@ - + RegExpImport diff --git a/Plugins/RegExpImport/regexpimport.json b/Plugins/RegExpImport/regexpimport.json index 8a0f746..3e9323e 100644 --- a/Plugins/RegExpImport/regexpimport.json +++ b/Plugins/RegExpImport/regexpimport.json @@ -2,6 +2,6 @@ "type": "ImportPlugin", "title": "RegExp import", "description": "Importing data from text files using regular expression.", - "version": 10000, + "version": 10001, "author": "SalSoft" } diff --git a/Plugins/RegExpImport/regexpimport.qrc b/Plugins/RegExpImport/regexpimport.qrc index e1cb912..2fb1a4f 100644 --- a/Plugins/RegExpImport/regexpimport.qrc +++ b/Plugins/RegExpImport/regexpimport.qrc @@ -6,5 +6,7 @@ RegExpImport_pl.qm RegExpImport_ru.qm RegExpImport_fr.qm + RegExpImport_sk.qm + RegExpImport_zh_CN.qm diff --git a/Plugins/ScriptingTcl/ScriptingTcl_de.ts b/Plugins/ScriptingTcl/ScriptingTcl_de.ts index adb7f21..cbd7c60 100644 --- a/Plugins/ScriptingTcl/ScriptingTcl_de.ts +++ b/Plugins/ScriptingTcl/ScriptingTcl_de.ts @@ -1,6 +1,6 @@ - + ScriptingTcl diff --git a/Plugins/ScriptingTcl/ScriptingTcl_es.ts b/Plugins/ScriptingTcl/ScriptingTcl_es.ts index 502c856..f2eaa40 100644 --- a/Plugins/ScriptingTcl/ScriptingTcl_es.ts +++ b/Plugins/ScriptingTcl/ScriptingTcl_es.ts @@ -1,6 +1,6 @@ - + ScriptingTcl diff --git a/Plugins/ScriptingTcl/ScriptingTcl_fr.ts b/Plugins/ScriptingTcl/ScriptingTcl_fr.ts index b308973..aab5121 100644 --- a/Plugins/ScriptingTcl/ScriptingTcl_fr.ts +++ b/Plugins/ScriptingTcl/ScriptingTcl_fr.ts @@ -1,6 +1,6 @@ - + ScriptingTcl diff --git a/Plugins/ScriptingTcl/ScriptingTcl_pl.ts b/Plugins/ScriptingTcl/ScriptingTcl_pl.ts index be6a580..acbf1c9 100644 --- a/Plugins/ScriptingTcl/ScriptingTcl_pl.ts +++ b/Plugins/ScriptingTcl/ScriptingTcl_pl.ts @@ -1,6 +1,6 @@ - + ScriptingTcl diff --git a/Plugins/ScriptingTcl/ScriptingTcl_pt_BR.ts b/Plugins/ScriptingTcl/ScriptingTcl_pt_BR.ts index a0ffcb8..8eea04b 100644 --- a/Plugins/ScriptingTcl/ScriptingTcl_pt_BR.ts +++ b/Plugins/ScriptingTcl/ScriptingTcl_pt_BR.ts @@ -1,6 +1,6 @@ - + ScriptingTcl diff --git a/Plugins/ScriptingTcl/ScriptingTcl_ru.ts b/Plugins/ScriptingTcl/ScriptingTcl_ru.ts index 4fd66de..9514a37 100644 --- a/Plugins/ScriptingTcl/ScriptingTcl_ru.ts +++ b/Plugins/ScriptingTcl/ScriptingTcl_ru.ts @@ -1,6 +1,6 @@ - + ScriptingTcl diff --git a/Plugins/ScriptingTcl/ScriptingTcl_sk.ts b/Plugins/ScriptingTcl/ScriptingTcl_sk.ts index ec050a9..fa64a4a 100644 --- a/Plugins/ScriptingTcl/ScriptingTcl_sk.ts +++ b/Plugins/ScriptingTcl/ScriptingTcl_sk.ts @@ -1,6 +1,6 @@ - + ScriptingTcl diff --git a/Plugins/ScriptingTcl/ScriptingTcl_zh_CN.ts b/Plugins/ScriptingTcl/ScriptingTcl_zh_CN.ts index 0355116..d213109 100644 --- a/Plugins/ScriptingTcl/ScriptingTcl_zh_CN.ts +++ b/Plugins/ScriptingTcl/ScriptingTcl_zh_CN.ts @@ -1,6 +1,6 @@ - + ScriptingTcl diff --git a/Plugins/ScriptingTcl/scriptingtcl.json b/Plugins/ScriptingTcl/scriptingtcl.json index 108d7c0..1496b50 100644 --- a/Plugins/ScriptingTcl/scriptingtcl.json +++ b/Plugins/ScriptingTcl/scriptingtcl.json @@ -2,6 +2,6 @@ "type": "ScriptingPlugin", "title": "Tcl scripting", "description": "Provides Tcl scripting language support for SQLiteStudio.", - "version": 10001, + "version": 10002, "author": "SalSoft" } diff --git a/Plugins/ScriptingTcl/scriptingtcl.qrc b/Plugins/ScriptingTcl/scriptingtcl.qrc index 5d81a7b..8f29a12 100644 --- a/Plugins/ScriptingTcl/scriptingtcl.qrc +++ b/Plugins/ScriptingTcl/scriptingtcl.qrc @@ -6,5 +6,7 @@ ScriptingTcl_pl.qm ScriptingTcl_ru.qm ScriptingTcl_fr.qm + ScriptingTcl_sk.qm + ScriptingTcl_zh_CN.qm diff --git a/Plugins/SqlEnterpriseFormatter/SqlEnterpriseFormatter_de.ts b/Plugins/SqlEnterpriseFormatter/SqlEnterpriseFormatter_de.ts index bd56eba..a83f5df 100644 --- a/Plugins/SqlEnterpriseFormatter/SqlEnterpriseFormatter_de.ts +++ b/Plugins/SqlEnterpriseFormatter/SqlEnterpriseFormatter_de.ts @@ -1,6 +1,6 @@ - + QObject diff --git a/Plugins/SqlEnterpriseFormatter/SqlEnterpriseFormatter_es.ts b/Plugins/SqlEnterpriseFormatter/SqlEnterpriseFormatter_es.ts index 15b85f4..4d873e5 100644 --- a/Plugins/SqlEnterpriseFormatter/SqlEnterpriseFormatter_es.ts +++ b/Plugins/SqlEnterpriseFormatter/SqlEnterpriseFormatter_es.ts @@ -1,6 +1,6 @@ - + QObject diff --git a/Plugins/SqlEnterpriseFormatter/SqlEnterpriseFormatter_fr.ts b/Plugins/SqlEnterpriseFormatter/SqlEnterpriseFormatter_fr.ts index 519235f..8a9178b 100644 --- a/Plugins/SqlEnterpriseFormatter/SqlEnterpriseFormatter_fr.ts +++ b/Plugins/SqlEnterpriseFormatter/SqlEnterpriseFormatter_fr.ts @@ -1,6 +1,6 @@ - + QObject diff --git a/Plugins/SqlEnterpriseFormatter/SqlEnterpriseFormatter_pl.ts b/Plugins/SqlEnterpriseFormatter/SqlEnterpriseFormatter_pl.ts index b73d4ad..5cfbf32 100644 --- a/Plugins/SqlEnterpriseFormatter/SqlEnterpriseFormatter_pl.ts +++ b/Plugins/SqlEnterpriseFormatter/SqlEnterpriseFormatter_pl.ts @@ -1,6 +1,6 @@ - + QObject diff --git a/Plugins/SqlEnterpriseFormatter/SqlEnterpriseFormatter_pt_BR.ts b/Plugins/SqlEnterpriseFormatter/SqlEnterpriseFormatter_pt_BR.ts index 8921d18..b89804a 100644 --- a/Plugins/SqlEnterpriseFormatter/SqlEnterpriseFormatter_pt_BR.ts +++ b/Plugins/SqlEnterpriseFormatter/SqlEnterpriseFormatter_pt_BR.ts @@ -1,6 +1,6 @@ - + QObject diff --git a/Plugins/SqlEnterpriseFormatter/SqlEnterpriseFormatter_ru.ts b/Plugins/SqlEnterpriseFormatter/SqlEnterpriseFormatter_ru.ts index 0212e14..a5656d8 100644 --- a/Plugins/SqlEnterpriseFormatter/SqlEnterpriseFormatter_ru.ts +++ b/Plugins/SqlEnterpriseFormatter/SqlEnterpriseFormatter_ru.ts @@ -1,6 +1,6 @@ - + QObject diff --git a/Plugins/SqlEnterpriseFormatter/SqlEnterpriseFormatter_sk.ts b/Plugins/SqlEnterpriseFormatter/SqlEnterpriseFormatter_sk.ts index 24086e8..407cc6e 100644 --- a/Plugins/SqlEnterpriseFormatter/SqlEnterpriseFormatter_sk.ts +++ b/Plugins/SqlEnterpriseFormatter/SqlEnterpriseFormatter_sk.ts @@ -1,6 +1,6 @@ - + QObject diff --git a/Plugins/SqlEnterpriseFormatter/SqlEnterpriseFormatter_zh_CN.ts b/Plugins/SqlEnterpriseFormatter/SqlEnterpriseFormatter_zh_CN.ts index a3296eb..3c80603 100644 --- a/Plugins/SqlEnterpriseFormatter/SqlEnterpriseFormatter_zh_CN.ts +++ b/Plugins/SqlEnterpriseFormatter/SqlEnterpriseFormatter_zh_CN.ts @@ -1,6 +1,6 @@ - + QObject diff --git a/Plugins/SqlEnterpriseFormatter/formataltertable.cpp b/Plugins/SqlEnterpriseFormatter/formataltertable.cpp index d562e1b..0f9a8ac 100644 --- a/Plugins/SqlEnterpriseFormatter/formataltertable.cpp +++ b/Plugins/SqlEnterpriseFormatter/formataltertable.cpp @@ -8,6 +8,7 @@ FormatAlterTable::FormatAlterTable(SqliteAlterTable* alterTable) : void FormatAlterTable::formatInternal() { + handleExplainQuery(alterTable); withKeyword("ALTER").withKeyword("TABLE"); if (!alterTable->database.isNull()) diff --git a/Plugins/SqlEnterpriseFormatter/formatanalyze.cpp b/Plugins/SqlEnterpriseFormatter/formatanalyze.cpp index 1b7a939..887fc52 100644 --- a/Plugins/SqlEnterpriseFormatter/formatanalyze.cpp +++ b/Plugins/SqlEnterpriseFormatter/formatanalyze.cpp @@ -8,6 +8,7 @@ FormatAnalyze::FormatAnalyze(SqliteAnalyze* analyze) : void FormatAnalyze::formatInternal() { + handleExplainQuery(analyze); withKeyword("ANALYZE"); if (!analyze->database.isNull()) diff --git a/Plugins/SqlEnterpriseFormatter/formatattach.cpp b/Plugins/SqlEnterpriseFormatter/formatattach.cpp index e969495..8ba3f3e 100644 --- a/Plugins/SqlEnterpriseFormatter/formatattach.cpp +++ b/Plugins/SqlEnterpriseFormatter/formatattach.cpp @@ -9,6 +9,7 @@ FormatAttach::FormatAttach(SqliteAttach* att) : void FormatAttach::formatInternal() { + handleExplainQuery(att); withKeyword("ATTACH"); if (att->databaseKw) diff --git a/Plugins/SqlEnterpriseFormatter/formatbegintrans.cpp b/Plugins/SqlEnterpriseFormatter/formatbegintrans.cpp index 5a70d61..55144dc 100644 --- a/Plugins/SqlEnterpriseFormatter/formatbegintrans.cpp +++ b/Plugins/SqlEnterpriseFormatter/formatbegintrans.cpp @@ -8,6 +8,7 @@ FormatBeginTrans::FormatBeginTrans(SqliteBeginTrans* bt) : void FormatBeginTrans::formatInternal() { + handleExplainQuery(bt); withKeyword("BEGIN"); if (bt->type != SqliteBeginTrans::Type::null) diff --git a/Plugins/SqlEnterpriseFormatter/formatcommittrans.cpp b/Plugins/SqlEnterpriseFormatter/formatcommittrans.cpp index 7fdafa3..5e69f09 100644 --- a/Plugins/SqlEnterpriseFormatter/formatcommittrans.cpp +++ b/Plugins/SqlEnterpriseFormatter/formatcommittrans.cpp @@ -8,6 +8,7 @@ FormatCommitTrans::FormatCommitTrans(SqliteCommitTrans* ct) : void FormatCommitTrans::formatInternal() { + handleExplainQuery(ct); if (ct->endKw) withKeyword("END"); else diff --git a/Plugins/SqlEnterpriseFormatter/formatcopy.cpp b/Plugins/SqlEnterpriseFormatter/formatcopy.cpp index fa07d48..18ce28c 100644 --- a/Plugins/SqlEnterpriseFormatter/formatcopy.cpp +++ b/Plugins/SqlEnterpriseFormatter/formatcopy.cpp @@ -8,6 +8,7 @@ FormatCopy::FormatCopy(SqliteCopy* copy) : void FormatCopy::formatInternal() { + handleExplainQuery(copy); withKeyword("COPY"); if (copy->onConflict != SqliteConflictAlgo::null) withKeyword("OR").withKeyword(sqliteConflictAlgo(copy->onConflict)); diff --git a/Plugins/SqlEnterpriseFormatter/formatcreateindex.cpp b/Plugins/SqlEnterpriseFormatter/formatcreateindex.cpp index cc8f3f6..ac5fd7c 100644 --- a/Plugins/SqlEnterpriseFormatter/formatcreateindex.cpp +++ b/Plugins/SqlEnterpriseFormatter/formatcreateindex.cpp @@ -9,6 +9,7 @@ FormatCreateIndex::FormatCreateIndex(SqliteCreateIndex* createIndex) : void FormatCreateIndex::formatInternal() { + handleExplainQuery(createIndex); withKeyword("CREATE"); if (createIndex->uniqueKw) withKeyword("UNIQUE"); diff --git a/Plugins/SqlEnterpriseFormatter/formatcreatetable.cpp b/Plugins/SqlEnterpriseFormatter/formatcreatetable.cpp index d37239a..d1f0996 100644 --- a/Plugins/SqlEnterpriseFormatter/formatcreatetable.cpp +++ b/Plugins/SqlEnterpriseFormatter/formatcreatetable.cpp @@ -9,6 +9,7 @@ FormatCreateTable::FormatCreateTable(SqliteCreateTable* createTable) : void FormatCreateTable::formatInternal() { + handleExplainQuery(createTable); withKeyword("CREATE"); if (createTable->tempKw) withKeyword("TEMP"); diff --git a/Plugins/SqlEnterpriseFormatter/formatcreatetrigger.cpp b/Plugins/SqlEnterpriseFormatter/formatcreatetrigger.cpp index d05d8cf..01351e6 100644 --- a/Plugins/SqlEnterpriseFormatter/formatcreatetrigger.cpp +++ b/Plugins/SqlEnterpriseFormatter/formatcreatetrigger.cpp @@ -8,6 +8,7 @@ FormatCreateTrigger::FormatCreateTrigger(SqliteCreateTrigger* createTrig) : void FormatCreateTrigger::formatInternal() { + handleExplainQuery(createTrig); withKeyword("CREATE"); if (createTrig->tempKw) withKeyword("TEMP"); diff --git a/Plugins/SqlEnterpriseFormatter/formatcreateview.cpp b/Plugins/SqlEnterpriseFormatter/formatcreateview.cpp index 4fe1c27..e8d0351 100644 --- a/Plugins/SqlEnterpriseFormatter/formatcreateview.cpp +++ b/Plugins/SqlEnterpriseFormatter/formatcreateview.cpp @@ -9,6 +9,7 @@ FormatCreateView::FormatCreateView(SqliteCreateView* createView) : void FormatCreateView::formatInternal() { + handleExplainQuery(createView); withKeyword("CREATE"); if (createView->tempKw) withKeyword("TEMP"); diff --git a/Plugins/SqlEnterpriseFormatter/formatcreatevirtualtable.cpp b/Plugins/SqlEnterpriseFormatter/formatcreatevirtualtable.cpp index c702846..7525667 100644 --- a/Plugins/SqlEnterpriseFormatter/formatcreatevirtualtable.cpp +++ b/Plugins/SqlEnterpriseFormatter/formatcreatevirtualtable.cpp @@ -9,6 +9,7 @@ FormatCreateVirtualTable::FormatCreateVirtualTable(SqliteCreateVirtualTable* cvt void FormatCreateVirtualTable::formatInternal() { + handleExplainQuery(cvt); withKeyword("CREATE").withKeyword("VIRTUAL").withKeyword("TABLE"); if (cvt->ifNotExistsKw) withKeyword("IF").withKeyword("NOT").withKeyword("EXISTS"); diff --git a/Plugins/SqlEnterpriseFormatter/formatdelete.cpp b/Plugins/SqlEnterpriseFormatter/formatdelete.cpp index ca6ac5b..fc154e2 100644 --- a/Plugins/SqlEnterpriseFormatter/formatdelete.cpp +++ b/Plugins/SqlEnterpriseFormatter/formatdelete.cpp @@ -10,6 +10,7 @@ FormatDelete::FormatDelete(SqliteDelete* del) : void FormatDelete::formatInternal() { + handleExplainQuery(del); if (del->with) withStatement(del->with); diff --git a/Plugins/SqlEnterpriseFormatter/formatdetach.cpp b/Plugins/SqlEnterpriseFormatter/formatdetach.cpp index e788da7..412ecb5 100644 --- a/Plugins/SqlEnterpriseFormatter/formatdetach.cpp +++ b/Plugins/SqlEnterpriseFormatter/formatdetach.cpp @@ -9,6 +9,7 @@ FormatDetach::FormatDetach(SqliteDetach* detach) : void FormatDetach::formatInternal() { + handleExplainQuery(detach); withKeyword("DETACH"); if (detach->databaseKw) diff --git a/Plugins/SqlEnterpriseFormatter/formatdropindex.cpp b/Plugins/SqlEnterpriseFormatter/formatdropindex.cpp index 1e85bb8..9ff6324 100644 --- a/Plugins/SqlEnterpriseFormatter/formatdropindex.cpp +++ b/Plugins/SqlEnterpriseFormatter/formatdropindex.cpp @@ -8,6 +8,7 @@ FormatDropIndex::FormatDropIndex(SqliteDropIndex* dropIndex) : void FormatDropIndex::formatInternal() { + handleExplainQuery(dropIndex); withKeyword("DROP").withKeyword("INDEX"); if (dropIndex->ifExistsKw) diff --git a/Plugins/SqlEnterpriseFormatter/formatdroptable.cpp b/Plugins/SqlEnterpriseFormatter/formatdroptable.cpp index 775adfe..986bee5 100644 --- a/Plugins/SqlEnterpriseFormatter/formatdroptable.cpp +++ b/Plugins/SqlEnterpriseFormatter/formatdroptable.cpp @@ -8,6 +8,7 @@ FormatDropTable::FormatDropTable(SqliteDropTable* dropTable) : void FormatDropTable::formatInternal() { + handleExplainQuery(dropTable); withKeyword("DROP").withKeyword("TABLE"); if (dropTable->ifExistsKw) diff --git a/Plugins/SqlEnterpriseFormatter/formatdroptrigger.cpp b/Plugins/SqlEnterpriseFormatter/formatdroptrigger.cpp index ca8caa8..da75c66 100644 --- a/Plugins/SqlEnterpriseFormatter/formatdroptrigger.cpp +++ b/Plugins/SqlEnterpriseFormatter/formatdroptrigger.cpp @@ -8,6 +8,7 @@ FormatDropTrigger::FormatDropTrigger(SqliteDropTrigger* dropTrig) : void FormatDropTrigger::formatInternal() { + handleExplainQuery(dropTrig); withKeyword("DROP").withKeyword("TRIGGER"); if (dropTrig->ifExistsKw) diff --git a/Plugins/SqlEnterpriseFormatter/formatdropview.cpp b/Plugins/SqlEnterpriseFormatter/formatdropview.cpp index 965d607..a8160e9 100644 --- a/Plugins/SqlEnterpriseFormatter/formatdropview.cpp +++ b/Plugins/SqlEnterpriseFormatter/formatdropview.cpp @@ -8,6 +8,7 @@ FormatDropView::FormatDropView(SqliteDropView* dropView) : void FormatDropView::formatInternal() { + handleExplainQuery(dropView); withKeyword("DROP").withKeyword("VIEW"); if (dropView->ifExistsKw) diff --git a/Plugins/SqlEnterpriseFormatter/formatinsert.cpp b/Plugins/SqlEnterpriseFormatter/formatinsert.cpp index 1ff0535..6c1e763 100644 --- a/Plugins/SqlEnterpriseFormatter/formatinsert.cpp +++ b/Plugins/SqlEnterpriseFormatter/formatinsert.cpp @@ -10,6 +10,7 @@ FormatInsert::FormatInsert(SqliteInsert* insert) : void FormatInsert::formatInternal() { + handleExplainQuery(insert); if (insert->replaceKw) { withStatement(insert->with); diff --git a/Plugins/SqlEnterpriseFormatter/formatpragma.cpp b/Plugins/SqlEnterpriseFormatter/formatpragma.cpp index 0b6491a..ee30aa9 100644 --- a/Plugins/SqlEnterpriseFormatter/formatpragma.cpp +++ b/Plugins/SqlEnterpriseFormatter/formatpragma.cpp @@ -8,6 +8,7 @@ FormatPragma::FormatPragma(SqlitePragma* pragma) : void FormatPragma::formatInternal() { + handleExplainQuery(pragma); withKeyword("PRAGMA"); if (!pragma->database.isNull()) diff --git a/Plugins/SqlEnterpriseFormatter/formatreindex.cpp b/Plugins/SqlEnterpriseFormatter/formatreindex.cpp index 441032e..1361396 100644 --- a/Plugins/SqlEnterpriseFormatter/formatreindex.cpp +++ b/Plugins/SqlEnterpriseFormatter/formatreindex.cpp @@ -8,6 +8,7 @@ FormatReindex::FormatReindex(SqliteReindex* reindex) : void FormatReindex::formatInternal() { + handleExplainQuery(reindex); withKeyword("REINDEX"); if (!reindex->database.isNull()) withId(reindex->database).withIdDot(); diff --git a/Plugins/SqlEnterpriseFormatter/formatrelease.cpp b/Plugins/SqlEnterpriseFormatter/formatrelease.cpp index 52c0b24..da86662 100644 --- a/Plugins/SqlEnterpriseFormatter/formatrelease.cpp +++ b/Plugins/SqlEnterpriseFormatter/formatrelease.cpp @@ -8,6 +8,7 @@ FormatRelease::FormatRelease(SqliteRelease* release) : void FormatRelease::formatInternal() { + handleExplainQuery(release); withKeyword("RELEASE"); if (release->savepointKw) withKeyword("SAVEPOINT"); diff --git a/Plugins/SqlEnterpriseFormatter/formatrollback.cpp b/Plugins/SqlEnterpriseFormatter/formatrollback.cpp index c55f5cc..a7c9aed 100644 --- a/Plugins/SqlEnterpriseFormatter/formatrollback.cpp +++ b/Plugins/SqlEnterpriseFormatter/formatrollback.cpp @@ -8,6 +8,7 @@ FormatRollback::FormatRollback(SqliteRollback* rollback) : void FormatRollback::formatInternal() { + handleExplainQuery(rollback); withKeyword("ROLLBACK"); if (rollback->transactionKw) withKeyword("TRANSACTION"); diff --git a/Plugins/SqlEnterpriseFormatter/formatsavepoint.cpp b/Plugins/SqlEnterpriseFormatter/formatsavepoint.cpp index 3f34679..5ce474f 100644 --- a/Plugins/SqlEnterpriseFormatter/formatsavepoint.cpp +++ b/Plugins/SqlEnterpriseFormatter/formatsavepoint.cpp @@ -8,5 +8,6 @@ FormatSavepoint::FormatSavepoint(SqliteSavepoint* savepoint) : void FormatSavepoint::formatInternal() { + handleExplainQuery(savepoint); withKeyword("SAVEPOINT").withId(savepoint->name).withSemicolon(); } diff --git a/Plugins/SqlEnterpriseFormatter/formatselect.cpp b/Plugins/SqlEnterpriseFormatter/formatselect.cpp index 50aa8c2..4d2a229 100644 --- a/Plugins/SqlEnterpriseFormatter/formatselect.cpp +++ b/Plugins/SqlEnterpriseFormatter/formatselect.cpp @@ -9,6 +9,7 @@ FormatSelect::FormatSelect(SqliteSelect* select) : void FormatSelect::formatInternal() { + handleExplainQuery(select); markKeywordLineUp("SELECT"); if (select->with) diff --git a/Plugins/SqlEnterpriseFormatter/formatstatement.cpp b/Plugins/SqlEnterpriseFormatter/formatstatement.cpp index be5bc49..dfdbb14 100644 --- a/Plugins/SqlEnterpriseFormatter/formatstatement.cpp +++ b/Plugins/SqlEnterpriseFormatter/formatstatement.cpp @@ -453,6 +453,16 @@ FormatStatement&FormatStatement::withSeparator(FormatStatement::ListSeparator se return *this; } +void FormatStatement::handleExplainQuery(SqliteQuery* query) +{ + if (query->explain) + { + withKeyword("EXPLAIN"); + if (query->queryPlan) + withKeyword("QUERY").withKeyword("PLAN"); + } +} + FormatStatement& FormatStatement::withIdList(const QStringList& names, const QString& indentName, ListSeparator sep) { if (!indentName.isNull()) diff --git a/Plugins/SqlEnterpriseFormatter/formatstatement.h b/Plugins/SqlEnterpriseFormatter/formatstatement.h index 1702a3d..6bd0fea 100644 --- a/Plugins/SqlEnterpriseFormatter/formatstatement.h +++ b/Plugins/SqlEnterpriseFormatter/formatstatement.h @@ -103,6 +103,8 @@ class FormatStatement } protected: + void handleExplainQuery(SqliteQuery* query); + virtual void formatInternal() = 0; virtual void resetInternal(); diff --git a/Plugins/SqlEnterpriseFormatter/formatupdate.cpp b/Plugins/SqlEnterpriseFormatter/formatupdate.cpp index ffc3911..54ce927 100644 --- a/Plugins/SqlEnterpriseFormatter/formatupdate.cpp +++ b/Plugins/SqlEnterpriseFormatter/formatupdate.cpp @@ -10,6 +10,7 @@ FormatUpdate::FormatUpdate(SqliteUpdate* upd) : void FormatUpdate::formatInternal() { + handleExplainQuery(upd); if (upd->with) withStatement(upd->with); diff --git a/Plugins/SqlEnterpriseFormatter/formatvacuum.cpp b/Plugins/SqlEnterpriseFormatter/formatvacuum.cpp index 29b95e4..8cbff57 100644 --- a/Plugins/SqlEnterpriseFormatter/formatvacuum.cpp +++ b/Plugins/SqlEnterpriseFormatter/formatvacuum.cpp @@ -1,4 +1,5 @@ #include "formatvacuum.h" +#include "parser/ast/sqlitevacuum.h" FormatVacuum::FormatVacuum(SqliteVacuum* vacuum) : vacuum(vacuum) @@ -7,5 +8,6 @@ FormatVacuum::FormatVacuum(SqliteVacuum* vacuum) : void FormatVacuum::formatInternal() { + handleExplainQuery(vacuum); withKeyword("VACUUM").withSemicolon(); } diff --git a/Plugins/SqlEnterpriseFormatter/sqlenterpriseformatter.json b/Plugins/SqlEnterpriseFormatter/sqlenterpriseformatter.json index 43095c2..85d6414 100644 --- a/Plugins/SqlEnterpriseFormatter/sqlenterpriseformatter.json +++ b/Plugins/SqlEnterpriseFormatter/sqlenterpriseformatter.json @@ -2,6 +2,6 @@ "type": "CodeFormatterPlugin", "title": "SQL Enterprise", "description": "Advanced SQL formatter.", - "version": 10004, + "version": 10005, "author": "SalSoft" } diff --git a/Plugins/SqlEnterpriseFormatter/sqlenterpriseformatter.qrc b/Plugins/SqlEnterpriseFormatter/sqlenterpriseformatter.qrc index 4a62ae6..00b290f 100644 --- a/Plugins/SqlEnterpriseFormatter/sqlenterpriseformatter.qrc +++ b/Plugins/SqlEnterpriseFormatter/sqlenterpriseformatter.qrc @@ -6,5 +6,7 @@ SqlEnterpriseFormatter_pl.qm SqlEnterpriseFormatter_ru.qm SqlEnterpriseFormatter_fr.qm + SqlEnterpriseFormatter_sk.qm + SqlEnterpriseFormatter_zh_CN.qm diff --git a/Plugins/SqlExport/SqlExport_de.ts b/Plugins/SqlExport/SqlExport_de.ts index 9346fcd..5313de2 100644 --- a/Plugins/SqlExport/SqlExport_de.ts +++ b/Plugins/SqlExport/SqlExport_de.ts @@ -1,6 +1,6 @@ - + SqlExport @@ -14,32 +14,32 @@ - + -- Index: %1 - + -- Trigger: %1 - + -- View: %1 - + -- File generated with SQLiteStudio v%1 on %2 - + -- Text encoding used: %1 - + Table name for INSERT statements is mandatory. diff --git a/Plugins/SqlExport/SqlExport_es.ts b/Plugins/SqlExport/SqlExport_es.ts index 87c95b0..2ff1ffa 100644 --- a/Plugins/SqlExport/SqlExport_es.ts +++ b/Plugins/SqlExport/SqlExport_es.ts @@ -1,6 +1,6 @@ - + SqlExport @@ -14,32 +14,32 @@ - + -- Index: %1 - + -- Trigger: %1 - + -- View: %1 - + -- File generated with SQLiteStudio v%1 on %2 - + -- Text encoding used: %1 - + Table name for INSERT statements is mandatory. diff --git a/Plugins/SqlExport/SqlExport_fr.ts b/Plugins/SqlExport/SqlExport_fr.ts index 7ffe713..02c2cbc 100644 --- a/Plugins/SqlExport/SqlExport_fr.ts +++ b/Plugins/SqlExport/SqlExport_fr.ts @@ -1,6 +1,6 @@ - + SqlExport @@ -14,32 +14,32 @@ -- Table: %1 - + -- Index: %1 -- Indéxe: %1 - + -- Trigger: %1 -- Déclencheur: %1 - + -- View: %1 -- Vue: %1 - + -- File generated with SQLiteStudio v%1 on %2 -- Fichier généré par SQLiteStudio v%1sur %2 - + -- Text encoding used: %1 -- Encodage texte utilisé: %1 - + Table name for INSERT statements is mandatory. Nom de table pour la déclaration INSERT est obligatoire. diff --git a/Plugins/SqlExport/SqlExport_pl.ts b/Plugins/SqlExport/SqlExport_pl.ts index 5fc187b..7c8a3f5 100644 --- a/Plugins/SqlExport/SqlExport_pl.ts +++ b/Plugins/SqlExport/SqlExport_pl.ts @@ -1,6 +1,6 @@ - + SqlExport @@ -14,32 +14,32 @@ -- Tabela: %1 - + -- Index: %1 -- Indeks: %1 - + -- Trigger: %1 -- Wyzwalacz: %1 - + -- View: %1 -- Widok: %1 - + -- File generated with SQLiteStudio v%1 on %2 -- Plik wygenerowany przez SQLiteStudio v%1 dnia %2 - + -- Text encoding used: %1 -- Użyte kodowanie tekstu: %1 - + Table name for INSERT statements is mandatory. Nazwa tabeli dla zapytania INSERT jest obowiązkowa. diff --git a/Plugins/SqlExport/SqlExport_pt_BR.ts b/Plugins/SqlExport/SqlExport_pt_BR.ts index 803c9dc..a781f3a 100644 --- a/Plugins/SqlExport/SqlExport_pt_BR.ts +++ b/Plugins/SqlExport/SqlExport_pt_BR.ts @@ -1,6 +1,6 @@ - + SqlExport @@ -14,32 +14,32 @@ - + -- Index: %1 - + -- Trigger: %1 - + -- View: %1 - + -- File generated with SQLiteStudio v%1 on %2 - + -- Text encoding used: %1 - + Table name for INSERT statements is mandatory. diff --git a/Plugins/SqlExport/SqlExport_ru.ts b/Plugins/SqlExport/SqlExport_ru.ts index 9b03eaf..b6b1cd8 100644 --- a/Plugins/SqlExport/SqlExport_ru.ts +++ b/Plugins/SqlExport/SqlExport_ru.ts @@ -1,6 +1,6 @@ - + SqlExport @@ -14,32 +14,32 @@ -- Таблица: %1 - + -- Index: %1 -- Индекс: %1 - + -- Trigger: %1 -- Триггер: %1 - + -- View: %1 -- Представление: %1 - + -- File generated with SQLiteStudio v%1 on %2 -- Файл сгенерирован с помощью SQLiteStudio v%1 в %2 - + -- Text encoding used: %1 -- Использованная кодировка текста: %1 - + Table name for INSERT statements is mandatory. Имя таблицы для конструкций INSERT обязательно. diff --git a/Plugins/SqlExport/SqlExport_sk.ts b/Plugins/SqlExport/SqlExport_sk.ts index 6494355..ef6a4bc 100644 --- a/Plugins/SqlExport/SqlExport_sk.ts +++ b/Plugins/SqlExport/SqlExport_sk.ts @@ -1,6 +1,6 @@ - + SqlExport @@ -14,32 +14,32 @@ - + -- Index: %1 - + -- Trigger: %1 - + -- View: %1 - + -- File generated with SQLiteStudio v%1 on %2 - + -- Text encoding used: %1 - + Table name for INSERT statements is mandatory. diff --git a/Plugins/SqlExport/SqlExport_zh_CN.ts b/Plugins/SqlExport/SqlExport_zh_CN.ts index 1d81d3f..d29cae8 100644 --- a/Plugins/SqlExport/SqlExport_zh_CN.ts +++ b/Plugins/SqlExport/SqlExport_zh_CN.ts @@ -1,6 +1,6 @@ - + SqlExport @@ -14,32 +14,32 @@ - + -- Index: %1 - + -- Trigger: %1 - + -- View: %1 - + -- File generated with SQLiteStudio v%1 on %2 - + -- Text encoding used: %1 - + Table name for INSERT statements is mandatory. diff --git a/Plugins/SqlExport/sqlexport.cpp b/Plugins/SqlExport/sqlexport.cpp index 0a379b1..15e47ed 100644 --- a/Plugins/SqlExport/sqlexport.cpp +++ b/Plugins/SqlExport/sqlexport.cpp @@ -145,6 +145,7 @@ bool SqlExport::exportTableRow(SqlResultsRowPtr data) bool SqlExport::afterExport() { writeCommit(); + writeFkEnable(); return true; } @@ -237,12 +238,20 @@ void SqlExport::writeFkDisable() writeln("PRAGMA foreign_keys = off;"); } +void SqlExport::writeFkEnable() +{ + writeln("PRAGMA foreign_keys = on;"); +} + QString SqlExport::formatQuery(const QString& sql) { if (cfg.SqlExport.UseFormatter.get()) return FORMATTER->format("sql", sql, db); - return sql; + if (sql.trimmed().endsWith(";")) + return sql; + + return sql.trimmed() + ";"; } QString SqlExport::getNameForObject(const QString& database, const QString& name, bool wrapped, Dialect dialect) diff --git a/Plugins/SqlExport/sqlexport.h b/Plugins/SqlExport/sqlexport.h index 9e23418..56eb42d 100644 --- a/Plugins/SqlExport/sqlexport.h +++ b/Plugins/SqlExport/sqlexport.h @@ -53,6 +53,7 @@ class SQLEXPORTSHARED_EXPORT SqlExport : public GenericExportPlugin void writeBegin(); void writeCommit(); void writeFkDisable(); + void writeFkEnable(); QString formatQuery(const QString& sql); QString getNameForObject(const QString& database, const QString& name, bool wrapped, Dialect dialect = Dialect::Sqlite3); QStringList rowToArgList(SqlResultsRowPtr row); diff --git a/Plugins/SqlExport/sqlexport.json b/Plugins/SqlExport/sqlexport.json index bd06adf..82ad923 100644 --- a/Plugins/SqlExport/sqlexport.json +++ b/Plugins/SqlExport/sqlexport.json @@ -2,6 +2,6 @@ "type": "ExportPlugin", "title": "SQL export", "description": "Provides SQL format for exporting", - "version": 10100, + "version": 10101, "author": "SalSoft" } diff --git a/Plugins/SqlExport/sqlexport.qrc b/Plugins/SqlExport/sqlexport.qrc index ca38e9c..ed5da11 100644 --- a/Plugins/SqlExport/sqlexport.qrc +++ b/Plugins/SqlExport/sqlexport.qrc @@ -7,5 +7,7 @@ SqlExport_pl.qm SqlExport_ru.qm SqlExport_fr.qm + SqlExport_sk.qm + SqlExport_zh_CN.qm diff --git a/Plugins/SqlFormatterSimple/SqlFormatterSimple_de.ts b/Plugins/SqlFormatterSimple/SqlFormatterSimple_de.ts index 93812a9..97a671f 100644 --- a/Plugins/SqlFormatterSimple/SqlFormatterSimple_de.ts +++ b/Plugins/SqlFormatterSimple/SqlFormatterSimple_de.ts @@ -1,6 +1,6 @@ - + SqlFormatterSimplePlugin diff --git a/Plugins/SqlFormatterSimple/SqlFormatterSimple_es.ts b/Plugins/SqlFormatterSimple/SqlFormatterSimple_es.ts index 65e7822..e6d4b25 100644 --- a/Plugins/SqlFormatterSimple/SqlFormatterSimple_es.ts +++ b/Plugins/SqlFormatterSimple/SqlFormatterSimple_es.ts @@ -1,6 +1,6 @@ - + SqlFormatterSimplePlugin diff --git a/Plugins/SqlFormatterSimple/SqlFormatterSimple_fr.ts b/Plugins/SqlFormatterSimple/SqlFormatterSimple_fr.ts index af09a0c..ecf68f3 100644 --- a/Plugins/SqlFormatterSimple/SqlFormatterSimple_fr.ts +++ b/Plugins/SqlFormatterSimple/SqlFormatterSimple_fr.ts @@ -1,6 +1,6 @@ - + SqlFormatterSimplePlugin diff --git a/Plugins/SqlFormatterSimple/SqlFormatterSimple_pl.ts b/Plugins/SqlFormatterSimple/SqlFormatterSimple_pl.ts index 048a876..a456bdd 100644 --- a/Plugins/SqlFormatterSimple/SqlFormatterSimple_pl.ts +++ b/Plugins/SqlFormatterSimple/SqlFormatterSimple_pl.ts @@ -1,6 +1,6 @@ - + SqlFormatterSimplePlugin diff --git a/Plugins/SqlFormatterSimple/SqlFormatterSimple_pt_BR.ts b/Plugins/SqlFormatterSimple/SqlFormatterSimple_pt_BR.ts index 0dca148..246c044 100644 --- a/Plugins/SqlFormatterSimple/SqlFormatterSimple_pt_BR.ts +++ b/Plugins/SqlFormatterSimple/SqlFormatterSimple_pt_BR.ts @@ -1,6 +1,6 @@ - + SqlFormatterSimplePlugin diff --git a/Plugins/SqlFormatterSimple/SqlFormatterSimple_ru.ts b/Plugins/SqlFormatterSimple/SqlFormatterSimple_ru.ts index 53a4f8c..cea4179 100644 --- a/Plugins/SqlFormatterSimple/SqlFormatterSimple_ru.ts +++ b/Plugins/SqlFormatterSimple/SqlFormatterSimple_ru.ts @@ -1,6 +1,6 @@ - + SqlFormatterSimplePlugin diff --git a/Plugins/SqlFormatterSimple/SqlFormatterSimple_sk.ts b/Plugins/SqlFormatterSimple/SqlFormatterSimple_sk.ts index d55d03c..c07fd9f 100644 --- a/Plugins/SqlFormatterSimple/SqlFormatterSimple_sk.ts +++ b/Plugins/SqlFormatterSimple/SqlFormatterSimple_sk.ts @@ -1,6 +1,6 @@ - + SqlFormatterSimplePlugin diff --git a/Plugins/SqlFormatterSimple/SqlFormatterSimple_zh_CN.ts b/Plugins/SqlFormatterSimple/SqlFormatterSimple_zh_CN.ts index 796a96d..aaa7f79 100644 --- a/Plugins/SqlFormatterSimple/SqlFormatterSimple_zh_CN.ts +++ b/Plugins/SqlFormatterSimple/SqlFormatterSimple_zh_CN.ts @@ -1,6 +1,6 @@ - + SqlFormatterSimplePlugin diff --git a/Plugins/SqlFormatterSimple/sqlformattersimple.json b/Plugins/SqlFormatterSimple/sqlformattersimple.json index ff51f13..7db4db6 100644 --- a/Plugins/SqlFormatterSimple/sqlformattersimple.json +++ b/Plugins/SqlFormatterSimple/sqlformattersimple.json @@ -2,6 +2,6 @@ "type": "CodeFormatterPlugin", "title": "SQL Simple", "description": "Basic formatter with very little options.", - "version": 10000, + "version": 10001, "author": "SalSoft" } diff --git a/Plugins/SqlFormatterSimple/sqlformattersimple.qrc b/Plugins/SqlFormatterSimple/sqlformattersimple.qrc index 4cc4a3b..1729b98 100644 --- a/Plugins/SqlFormatterSimple/sqlformattersimple.qrc +++ b/Plugins/SqlFormatterSimple/sqlformattersimple.qrc @@ -6,5 +6,7 @@ SqlFormatterSimple_pl.qm SqlFormatterSimple_ru.qm SqlFormatterSimple_fr.qm + SqlFormatterSimple_sk.qm + SqlFormatterSimple_zh_CN.qm diff --git a/Plugins/XmlExport/XmlExport_de.ts b/Plugins/XmlExport/XmlExport_de.ts index aa8eb2f..587f54c 100644 --- a/Plugins/XmlExport/XmlExport_de.ts +++ b/Plugins/XmlExport/XmlExport_de.ts @@ -1,6 +1,6 @@ - + XmlExport diff --git a/Plugins/XmlExport/XmlExport_es.ts b/Plugins/XmlExport/XmlExport_es.ts index 532228c..c7c3fdf 100644 --- a/Plugins/XmlExport/XmlExport_es.ts +++ b/Plugins/XmlExport/XmlExport_es.ts @@ -1,6 +1,6 @@ - + XmlExport diff --git a/Plugins/XmlExport/XmlExport_fr.ts b/Plugins/XmlExport/XmlExport_fr.ts index 80c2564..94e10d0 100644 --- a/Plugins/XmlExport/XmlExport_fr.ts +++ b/Plugins/XmlExport/XmlExport_fr.ts @@ -1,6 +1,6 @@ - + XmlExport diff --git a/Plugins/XmlExport/XmlExport_pl.ts b/Plugins/XmlExport/XmlExport_pl.ts index fc0cfaa..8f2104e 100644 --- a/Plugins/XmlExport/XmlExport_pl.ts +++ b/Plugins/XmlExport/XmlExport_pl.ts @@ -1,6 +1,6 @@ - + XmlExport diff --git a/Plugins/XmlExport/XmlExport_pt_BR.ts b/Plugins/XmlExport/XmlExport_pt_BR.ts index 31a9cf7..f4faf44 100644 --- a/Plugins/XmlExport/XmlExport_pt_BR.ts +++ b/Plugins/XmlExport/XmlExport_pt_BR.ts @@ -1,6 +1,6 @@ - + XmlExport diff --git a/Plugins/XmlExport/XmlExport_ru.ts b/Plugins/XmlExport/XmlExport_ru.ts index b7c76e6..28480fe 100644 --- a/Plugins/XmlExport/XmlExport_ru.ts +++ b/Plugins/XmlExport/XmlExport_ru.ts @@ -1,6 +1,6 @@ - + XmlExport diff --git a/Plugins/XmlExport/XmlExport_sk.ts b/Plugins/XmlExport/XmlExport_sk.ts index 5c674aa..07d694d 100644 --- a/Plugins/XmlExport/XmlExport_sk.ts +++ b/Plugins/XmlExport/XmlExport_sk.ts @@ -1,6 +1,6 @@ - + XmlExport diff --git a/Plugins/XmlExport/XmlExport_zh_CN.ts b/Plugins/XmlExport/XmlExport_zh_CN.ts index 162841d..34023fb 100644 --- a/Plugins/XmlExport/XmlExport_zh_CN.ts +++ b/Plugins/XmlExport/XmlExport_zh_CN.ts @@ -1,6 +1,6 @@ - + XmlExport diff --git a/Plugins/XmlExport/xmlexport.cpp b/Plugins/XmlExport/xmlexport.cpp index e76fe7d..0cea7df 100644 --- a/Plugins/XmlExport/xmlexport.cpp +++ b/Plugins/XmlExport/xmlexport.cpp @@ -103,6 +103,8 @@ bool XmlExport::exportQueryResultsRow(SqlResultsRowPtr row) writeln(nullTpl.arg(i)); else writeln(rowTpl.arg(i).arg(escape(value.toString()))); + + i++; } decrIndent(); @@ -408,7 +410,7 @@ void XmlExport::writeln(const QString& str) QStringList lines = str.split("\n"); QMutableStringListIterator it(lines); while (it.hasNext()) - it.value().prepend(indentStr); + it.next().prepend(indentStr); newStr = lines.join("\n") + newLineStr; } diff --git a/Plugins/XmlExport/xmlexport.json b/Plugins/XmlExport/xmlexport.json index 2432cdd..5780e3e 100644 --- a/Plugins/XmlExport/xmlexport.json +++ b/Plugins/XmlExport/xmlexport.json @@ -2,6 +2,6 @@ "type": "ExportPlugin", "title": "XML export", "description": "Provides XML format for exporting.", - "version": 10000, + "version": 10001, "author": "SalSoft" } diff --git a/Plugins/XmlExport/xmlexport.qrc b/Plugins/XmlExport/xmlexport.qrc index d951458..554f642 100644 --- a/Plugins/XmlExport/xmlexport.qrc +++ b/Plugins/XmlExport/xmlexport.qrc @@ -6,5 +6,7 @@ XmlExport_pl.qm XmlExport_ru.qm XmlExport_fr.qm + XmlExport_sk.qm + XmlExport_zh_CN.qm diff --git a/SQLiteStudio3/SQLiteStudio3.pro b/SQLiteStudio3/SQLiteStudio3.pro index ee210a1..a535b81 100644 --- a/SQLiteStudio3/SQLiteStudio3.pro +++ b/SQLiteStudio3/SQLiteStudio3.pro @@ -38,7 +38,8 @@ linux: { tgz.commands = sh $$PWD/create_linux_portable.sh $$PWD/../$$OUTPUT_DIR_NAME $$QMAKE_QMAKE tgz pkg.commands = sh $$PWD/create_linux_portable.sh $$PWD/../$$OUTPUT_DIR_NAME $$QMAKE_QMAKE dist pkg_plugins.commands = sh $$PWD/create_linux_portable.sh $$PWD/../$$OUTPUT_DIR_NAME $$QMAKE_QMAKE dist_plugins - QMAKE_EXTRA_TARGETS += portable tgz pkg pkg_plugins + pkg_full.commands = sh $$PWD/create_linux_portable.sh $$PWD/../$$OUTPUT_DIR_NAME $$QMAKE_QMAKE dist_full + QMAKE_EXTRA_TARGETS += portable tgz pkg pkg_plugins pkg_full } macx: { @@ -46,5 +47,6 @@ macx: { dmg.commands = sh $$PWD/create_macosx_bundle.sh $$PWD/../$$OUTPUT_DIR_NAME $$QMAKE_QMAKE dmg pkg.commands = sh $$PWD/create_macosx_bundle.sh $$PWD/../$$OUTPUT_DIR_NAME $$QMAKE_QMAKE dist pkg_plugins.commands = sh $$PWD/create_macosx_bundle.sh $$PWD/../$$OUTPUT_DIR_NAME $$QMAKE_QMAKE dist_plugins - QMAKE_EXTRA_TARGETS += bundle dmg pkg pkg_plugins + pkg_full.commands = sh $$PWD/create_macosx_bundle.sh $$PWD/../$$OUTPUT_DIR_NAME $$QMAKE_QMAKE dist_full + QMAKE_EXTRA_TARGETS += bundle dmg pkg pkg_plugins pkg_full } diff --git a/SQLiteStudio3/Tests/DsvFormatsTest/tst_dsvformatstesttest.cpp b/SQLiteStudio3/Tests/DsvFormatsTest/tst_dsvformatstesttest.cpp index 48e7280..be0204c 100644 --- a/SQLiteStudio3/Tests/DsvFormatsTest/tst_dsvformatstesttest.cpp +++ b/SQLiteStudio3/Tests/DsvFormatsTest/tst_dsvformatstesttest.cpp @@ -15,24 +15,38 @@ class DsvFormatsTestTest : public QObject DsvFormatsTestTest(); private: + QString toString(const QList& input); + QList sampleData; + QList sampleDeserializedData; QString sampleTsv; private Q_SLOTS: void initTestCase(); void cleanupTestCase(); void testTsv1(); + void testTsv2(); }; DsvFormatsTestTest::DsvFormatsTestTest() { } +QString DsvFormatsTestTest::toString(const QList& input) +{ + QStringList outputLines; + for (const QStringList& list : input) + outputLines << "QStringList("+list.join(", ")+")"; + + return "QList(\n "+outputLines.join(",\n ")+"\n)"; +} + void DsvFormatsTestTest::initTestCase() { sampleData << QStringList{"a", "b c", "\"d\""}; sampleData << QStringList{"a\"a\"", "\"b\"c\"", "d\"\"e"}; sampleData << QStringList{"a\na", "b\tc", "d\t\"e"}; + sampleData << QStringList{"a", "", "b", ""}; #ifdef Q_OS_MACX QString lineSep = "\r"; @@ -46,6 +60,13 @@ void DsvFormatsTestTest::initTestCase() sampleTsv += "a\"a\"\t\"b\"c\"\td\"\"e"; sampleTsv += lineSep; sampleTsv += "\"a\na\"\t\"b\tc\"\t\"d\t\"\"e\""; + sampleTsv += lineSep; + sampleTsv += "a\t\tb\t"; + + sampleDeserializedData << QStringList{"a", "b c", "\"d\""}; + sampleDeserializedData << QStringList{"a\"a\"", "\"b\"c\"", "d\"\"e"}; + sampleDeserializedData << QStringList{"a\na", "\"b", "c\"", "\"d", "\"\"e\""}; + sampleDeserializedData << QStringList{"a", "", "b", ""}; } void DsvFormatsTestTest::cleanupTestCase() @@ -68,6 +89,13 @@ void DsvFormatsTestTest::testTsv1() QVERIFY2(result == sampleTsv, QString("Mismatch after %1: %2\nSample: %3\nGot : %4").arg(i).arg(common, sampleTsv, result).toLocal8Bit().data()); } +void DsvFormatsTestTest::testTsv2() +{ + QList result = TsvSerializer::deserialize(sampleTsv); + + QVERIFY2(result == sampleDeserializedData, QString("Sample: %1\nGot: %2").arg(toString(sampleDeserializedData), toString(result)).toLocal8Bit().data()); +} + QTEST_APPLESS_MAIN(DsvFormatsTestTest) #include "tst_dsvformatstesttest.moc" diff --git a/SQLiteStudio3/Tests/TestUtils/configmock.cpp b/SQLiteStudio3/Tests/TestUtils/configmock.cpp index 8b62dc2..9bf3863 100644 --- a/SQLiteStudio3/Tests/TestUtils/configmock.cpp +++ b/SQLiteStudio3/Tests/TestUtils/configmock.cpp @@ -204,3 +204,8 @@ void ConfigMock::refreshSqlHistory() void ConfigMock::refreshDdlHistory() { } + +QString ConfigMock::getSqlite3Version() const +{ + return "3.8.8"; +} diff --git a/SQLiteStudio3/Tests/TestUtils/configmock.h b/SQLiteStudio3/Tests/TestUtils/configmock.h index 2115ccf..89c870e 100644 --- a/SQLiteStudio3/Tests/TestUtils/configmock.h +++ b/SQLiteStudio3/Tests/TestUtils/configmock.h @@ -51,6 +51,7 @@ class ConfigMock : public Config QList getReportHistory(); void deleteReport(int); void clearReportHistory(); + QString getSqlite3Version() const; public slots: void refreshSqlHistory(); diff --git a/SQLiteStudio3/coreSQLiteStudio/ChangeLog.txt b/SQLiteStudio3/coreSQLiteStudio/ChangeLog.txt index fe7a977..f795356 100644 --- a/SQLiteStudio3/coreSQLiteStudio/ChangeLog.txt +++ b/SQLiteStudio3/coreSQLiteStudio/ChangeLog.txt @@ -1,3 +1,38 @@ +[3.0.4] + * [ADDED]: Import dialog has now "Ignore errors" option, to skip rows that causes problems (constraint violation, wrong column count, etc). + * [CHANGE]: Enhanced Copy&Paste capabilities of data grid, so copying and pasting internally in SQLiteStudio will not be limited by TSV format (NULL values will be distinguished, tab characters will be allowed in values), only pasting from outside will be affected by TSV limitations. + * [CHANGE]: "Invalid database" icon changed, so it's no longer confusing with "Connected" database. + * [CHANGE]: "Databases" panel cannot be closed/hidden anymore. + * [CHANGE]: Database dialog reorganized to look a bit nicer, db type moved to top, URL browse button for file is now separated to 2 buttons. + * [BUGFIX]: #2795 XmlExport plugin: Fixed crash that happend in most exports. + * [BUGFIX]: XmlExport plugin: Fixed column number attribute incrementing for data rows. + * [BUGFIX]: #2793 SqlEnterpriseFormatter plugin: Fixed formatting queries starting with EXPLAIN and EXPLAIN QUERY PLAN. + * [BUGFIX]: #2786 Fixed double plugin names in config dialog for built-in plugins. + * [BUGFIX]: Fixed dead-lock when fixing path for a database that pointed to inexisting file. + * [BUGFIX]: Fixed data editing for SQL queries joining the same table several times. + * [BUGFIX]: Fixed "Ctrl+W"/"Cmd+W" shortcut to work every time, not only every second time. + * [BUGFIX]: Fixed order of window focusing when closing with "Ctrl+W"/"Cmd+W" shortcut. + * [BUGFIX]: #2797 Database type is no longer disabled when adding existing database file. + * [BUGFIX]: SqlExport appends Foreign Key (re)enabling pragma at the end. + * [BUGFIX]: "Maximized" MDI window state is no longer lost after closing last MDI window. + * [BUGFIX]: #2812 TableModifier is now much smarter about when to recreate triggers and how to do it. + * [BUGFIX]: TriggerDialog no longer loses "When" field when editing existing trigger. + * [BUGFIX]: Columns of Indexes and Triggers tabs in Table Window don't shring after refresh anymore. + * [BUGFIX]: NumPad Enter key also accepts the Code Assistant choice. + * [BUGFIX]: Fixed drawing items in SQL code assistant, so they no longer are "black on dark blue" when using classic Windows theme. + * [BUGFIX]: #2790 Fixed hexadecimal literals evaluation in SQL queries. + * [BUGFIX]: #2804 Fixed querying SQLite 2 database. + * [BUGFIX]: Fixed executing query like: SELECT * FROM (SELECT * FROM table); - it used to crash. + * [BUGFIX]: #2798 Fixed crash when restoring DbList group for inexisting database. + * [BUGFIX]: #2808 Sorting indicators in data grid fixed to point the right direction and got a little bit larger. + * [BUGFIX]: #2807 Fixed SQL export plugin when exporting whole database without formatting SQL, so the missing semicolons are appended to each DDL. + * [BUGFIX]: #2806 Fixed table sorting in Export Dialog. + * [BUGFIX]: #2809 Fixed crash when trying to paste data into data grid with no rows in it. + * [BUGFIX]: Fixed rolling back of row marked to deletion, if it was previously already marked as edited. + * [BUGFIX]: #2814 Fixed executing custom SQL function with same bind parameter used multiple times. + * [BUGFIX]: #2815 Fixed refreshing data pages after adding/deleting rows in grid view. + * [BUGFIX]: #2820 Fixed parsing 'IN table.column' expression (used to incorrectly assume a 'NOT' keyword to be present, even it wasn't). + [3.0.3] * [ADDED]: Added visual validation indicators to DbDialog, so user is informed why the "Ok" button is disabled at the moment. * [ADDED]: Russian translation. @@ -22,6 +57,7 @@ * [BUGFIX]: Optimized loading huge data sets into data grid. It's faster and the progress bar acts more smoothly. * [BUGFIX]: Shortcut for closing current window is now displayed in the context menu for taskbar. * [BUGFIX]: "Skip first line" option in CSV import renamed to "First line represents CSV columns". Maybe this time it won't confused anyone. + * [BUGFIX]: #2790 Fixed hexadecimal literals evaluation in SQL queries. [3.0.2] * [ADDED]: Full support for the interface translations. diff --git a/SQLiteStudio3/coreSQLiteStudio/TODO.txt b/SQLiteStudio3/coreSQLiteStudio/TODO.txt index 055898c..de84b10 100644 --- a/SQLiteStudio3/coreSQLiteStudio/TODO.txt +++ b/SQLiteStudio3/coreSQLiteStudio/TODO.txt @@ -1,4 +1,5 @@ * Next versions: +- object names (columns, tables, etc) in dialogs should be validated against suffix/prefix whitespaces and if they appear, user should be asked for confirmation - small useful features: generating template queries from context menu for table/view, from data view. - commiting DataView should be async - syntax checkers as services - per language diff --git a/SQLiteStudio3/coreSQLiteStudio/common/global.h b/SQLiteStudio3/coreSQLiteStudio/common/global.h index bc228ca..b1f4b01 100644 --- a/SQLiteStudio3/coreSQLiteStudio/common/global.h +++ b/SQLiteStudio3/coreSQLiteStudio/common/global.h @@ -32,6 +32,13 @@ var = nullptr; \ } +#define qobject_safe_delete(var) \ + if (var) \ + { \ + var->deleteLater(); \ + var = nullptr; \ + } + #define static_char static constexpr const char #define static_qstring(N,V) const static QString N = QStringLiteral(V) diff --git a/SQLiteStudio3/coreSQLiteStudio/common/signalwait.cpp b/SQLiteStudio3/coreSQLiteStudio/common/signalwait.cpp new file mode 100644 index 0000000..90f9075 --- /dev/null +++ b/SQLiteStudio3/coreSQLiteStudio/common/signalwait.cpp @@ -0,0 +1,29 @@ +#include "signalwait.h" +#include +#include + +SignalWait::SignalWait(QObject* object, const char* signal) : + QObject() +{ + connect(object, signal, this, SLOT(handleSignal())); +} + +bool SignalWait::wait(int msTimeout) +{ + QTime timer(0, 0, 0, msTimeout); + timer.start(); + while (!called && timer.elapsed() < msTimeout) + qApp->processEvents(QEventLoop::ExcludeUserInputEvents); + + return called; +} + +void SignalWait::reset() +{ + called = false; +} + +void SignalWait::handleSignal() +{ + called = true; +} diff --git a/SQLiteStudio3/coreSQLiteStudio/common/signalwait.h b/SQLiteStudio3/coreSQLiteStudio/common/signalwait.h new file mode 100644 index 0000000..7b7b903 --- /dev/null +++ b/SQLiteStudio3/coreSQLiteStudio/common/signalwait.h @@ -0,0 +1,23 @@ +#ifndef SIGNALWAIT_H +#define SIGNALWAIT_H + +#include + +class SignalWait : public QObject +{ + Q_OBJECT + + public: + SignalWait(QObject *object, const char *signal); + + bool wait(int msTimeout); + void reset(); + + private: + bool called = false; + + private slots: + void handleSignal(); +}; + +#endif // SIGNALWAIT_H diff --git a/SQLiteStudio3/coreSQLiteStudio/common/table.cpp b/SQLiteStudio3/coreSQLiteStudio/common/table.cpp index c590995..a9b0f16 100644 --- a/SQLiteStudio3/coreSQLiteStudio/common/table.cpp +++ b/SQLiteStudio3/coreSQLiteStudio/common/table.cpp @@ -50,3 +50,43 @@ int qHash(Table table) { return qHash(table.getDatabase() + "." + table.getTable()); } + +AliasedTable::AliasedTable() +{ +} + +AliasedTable::AliasedTable(const QString& database, const QString& table, const QString& alias) : + Table(database, table) +{ + setTableAlias(alias); +} + +AliasedTable::AliasedTable(const AliasedTable& other) : + Table(other.database, other.table) +{ + tableAlias = other.tableAlias; +} + +AliasedTable::~AliasedTable() +{ +} + +int AliasedTable::operator ==(const AliasedTable& other) const +{ + return other.database == this->database && other.table == this->table && other.tableAlias == this->tableAlias; +} + +QString AliasedTable::getTableAlias() const +{ + return tableAlias; +} + +void AliasedTable::setTableAlias(const QString& value) +{ + tableAlias = value; +} + +int qHash(AliasedTable table) +{ + return qHash(table.getDatabase() + "." + table.getTable() + " " + table.getTableAlias()); +} diff --git a/SQLiteStudio3/coreSQLiteStudio/common/table.h b/SQLiteStudio3/coreSQLiteStudio/common/table.h index d17a729..5cc4570 100644 --- a/SQLiteStudio3/coreSQLiteStudio/common/table.h +++ b/SQLiteStudio3/coreSQLiteStudio/common/table.h @@ -23,10 +23,27 @@ class API_EXPORT Table protected: QString database; QString table; +}; + +class API_EXPORT AliasedTable : public Table +{ + public: + AliasedTable(); + AliasedTable(const QString& database, const QString& table, const QString& alias); + AliasedTable(const AliasedTable& other); + virtual ~AliasedTable(); + int operator ==(const AliasedTable& other) const; + + QString getTableAlias() const; + void setTableAlias(const QString& value); + + protected: + QString tableAlias; }; int API_EXPORT qHash(Table table); +int API_EXPORT qHash(AliasedTable table); #endif // TABLE_H diff --git a/SQLiteStudio3/coreSQLiteStudio/coreSQLiteStudio.pro b/SQLiteStudio3/coreSQLiteStudio/coreSQLiteStudio.pro index 84cd818..0a7eb60 100644 --- a/SQLiteStudio3/coreSQLiteStudio/coreSQLiteStudio.pro +++ b/SQLiteStudio3/coreSQLiteStudio/coreSQLiteStudio.pro @@ -19,6 +19,7 @@ TEMPLATE = lib win32 { LIBS += -lpsapi $$PWD/../../../lib/libquazip.a + LIBS += -limagehlp THE_FILE = $$PWD/qt.conf THE_DEST = $${DESTDIR} @@ -215,7 +216,8 @@ SOURCES += sqlitestudio.cpp \ rsa/KeyPair.cpp \ rsa/PrimeGenerator.cpp \ rsa/RSA.cpp \ - translations.cpp + translations.cpp \ + common/signalwait.cpp HEADERS += sqlitestudio.h\ coreSQLiteStudio_global.h \ @@ -402,7 +404,8 @@ HEADERS += sqlitestudio.h\ rsa/KeyPair.h \ rsa/PrimeGenerator.h \ rsa/RSA.h \ - translations.h + translations.h \ + common/signalwait.h unix: { target.path = $$LIBDIR diff --git a/SQLiteStudio3/coreSQLiteStudio/coresqlitestudio.qrc b/SQLiteStudio3/coreSQLiteStudio/coresqlitestudio.qrc index 3ad28a9..7b814ec 100644 --- a/SQLiteStudio3/coreSQLiteStudio/coresqlitestudio.qrc +++ b/SQLiteStudio3/coreSQLiteStudio/coresqlitestudio.qrc @@ -22,5 +22,7 @@ translations/coreSQLiteStudio_pl.qm translations/coreSQLiteStudio_ru.qm translations/coreSQLiteStudio_fr.qm + translations/coreSQLiteStudio_sk.qm + translations/coreSQLiteStudio_zh_CN.qm diff --git a/SQLiteStudio3/coreSQLiteStudio/db/abstractdb.cpp b/SQLiteStudio3/coreSQLiteStudio/db/abstractdb.cpp index 4b3165b..68c6ad7 100644 --- a/SQLiteStudio3/coreSQLiteStudio/db/abstractdb.cpp +++ b/SQLiteStudio3/coreSQLiteStudio/db/abstractdb.cpp @@ -177,22 +177,22 @@ ReadWriteLocker::Mode AbstractDb::getLockingMode(const QString &query, Flags fla return ReadWriteLocker::getMode(query, getDialect(), flags.testFlag(Flag::NO_LOCK)); } -QString AbstractDb::getName() +QString AbstractDb::getName() const { return name; } -QString AbstractDb::getPath() +QString AbstractDb::getPath() const { return path; } -quint8 AbstractDb::getVersion() +quint8 AbstractDb::getVersion() const { return version; } -Dialect AbstractDb::getDialect() +Dialect AbstractDb::getDialect() const { if (version == 2) return Dialect::Sqlite2; diff --git a/SQLiteStudio3/coreSQLiteStudio/db/abstractdb.h b/SQLiteStudio3/coreSQLiteStudio/db/abstractdb.h index 89edf03..3f2b4c0 100644 --- a/SQLiteStudio3/coreSQLiteStudio/db/abstractdb.h +++ b/SQLiteStudio3/coreSQLiteStudio/db/abstractdb.h @@ -45,10 +45,10 @@ class API_EXPORT AbstractDb : public Db virtual ~AbstractDb(); bool isOpen(); - QString getName(); - QString getPath(); - quint8 getVersion(); - Dialect getDialect(); + QString getName() const; + QString getPath() const; + quint8 getVersion() const; + Dialect getDialect() const; QString getEncoding(); QHash& getConnectionOptions(); void setName(const QString& value); diff --git a/SQLiteStudio3/coreSQLiteStudio/db/abstractdb3.h b/SQLiteStudio3/coreSQLiteStudio/db/abstractdb3.h index 7a84ec2..9cb58aa 100644 --- a/SQLiteStudio3/coreSQLiteStudio/db/abstractdb3.h +++ b/SQLiteStudio3/coreSQLiteStudio/db/abstractdb3.h @@ -868,7 +868,8 @@ bool AbstractDb3::Query::execInternal(const QList& args) if (res != T::OK) return false; - for (int paramIdx = 1; paramIdx <= queryWithParams.second; paramIdx++) + + for (int paramIdx = 1, argCount = args.size(); paramIdx <= queryWithParams.second && paramIdx <= argCount; paramIdx++) { res = bindParam(paramIdx, args[paramIdx-1]); if (res != T::OK) @@ -906,16 +907,25 @@ bool AbstractDb3::Query::execInternal(const QHash& args) if (res != T::OK) return false; - int paramIdx = 1; - foreach (const QString& paramName, queryWithParams.second) + int paramIdx = -1; + for (const QString& paramName : queryWithParams.second) { if (!args.contains(paramName)) { + qWarning() << "Could not bind parameter" << paramName << "because it was not found in passed arguments."; + setError(SqlErrorCode::OTHER_EXECUTION_ERROR, "Error while preparing statement: could not bind parameter " + paramName); + return false; + } + + paramIdx = T::bind_parameter_index(stmt, paramName.toUtf8().constData()); + if (paramIdx <= 0) + { + qWarning() << "Could not bind parameter" << paramName << "because it was not found in prepared statement."; setError(SqlErrorCode::OTHER_EXECUTION_ERROR, "Error while preparing statement: could not bind parameter " + paramName); return false; } - res = bindParam(paramIdx++, args[paramName]); + res = bindParam(paramIdx, args[paramName]); if (res != T::OK) { db->extractLastError(); diff --git a/SQLiteStudio3/coreSQLiteStudio/db/db.cpp b/SQLiteStudio3/coreSQLiteStudio/db/db.cpp index c89349c..7676f30 100644 --- a/SQLiteStudio3/coreSQLiteStudio/db/db.cpp +++ b/SQLiteStudio3/coreSQLiteStudio/db/db.cpp @@ -1,5 +1,6 @@ #include "db.h" #include +#include Db::Db() { @@ -55,3 +56,10 @@ void Sqlite2ColumnDataTypeHelper::clearBinaryTypes() { binaryColumns.clear(); } + + +QDebug operator<<(QDebug dbg, const Db* db) +{ + dbg.nospace() << "getName() << ">"; + return dbg.space(); +} diff --git a/SQLiteStudio3/coreSQLiteStudio/db/db.h b/SQLiteStudio3/coreSQLiteStudio/db/db.h index e11a844..efadd41 100644 --- a/SQLiteStudio3/coreSQLiteStudio/db/db.h +++ b/SQLiteStudio3/coreSQLiteStudio/db/db.h @@ -195,13 +195,13 @@ class API_EXPORT Db : public QObject, public Interruptable * @brief Gets database symbolic name. * @return Database symbolic name (as it was defined in call to DbManager#addDb() or DbManager#updateDb()). */ - virtual QString getName() = 0; + virtual QString getName() const = 0; /** * @brief Gets database file path. * @return Database file path (as it was defined in call to DbManager#addDb() or DbManager#updateDb()). */ - virtual QString getPath() = 0; + virtual QString getPath() const = 0; /** * @brief Gets SQLite version major number for this database. @@ -209,7 +209,7 @@ class API_EXPORT Db : public QObject, public Interruptable * * You don't have to open the database. This information is always available. */ - virtual quint8 getVersion() = 0; + virtual quint8 getVersion() const = 0; /** * @brief Gets database dialect. @@ -217,7 +217,7 @@ class API_EXPORT Db : public QObject, public Interruptable * * You don't have to open the database. This information is always available. */ - virtual Dialect getDialect() = 0; + virtual Dialect getDialect() const = 0; /** * @brief Gets database encoding. @@ -816,6 +816,8 @@ class API_EXPORT Db : public QObject, public Interruptable QDataStream &operator<<(QDataStream &out, const Db* myObj); QDataStream &operator>>(QDataStream &in, Db*& myObj); +QDebug operator<<(QDebug dbg, const Db* db); + Q_DECLARE_METATYPE(Db*) Q_DECLARE_OPERATORS_FOR_FLAGS(Db::Flags) diff --git a/SQLiteStudio3/coreSQLiteStudio/db/dbpluginoption.h b/SQLiteStudio3/coreSQLiteStudio/db/dbpluginoption.h index 7b594ef..e2ed66f 100644 --- a/SQLiteStudio3/coreSQLiteStudio/db/dbpluginoption.h +++ b/SQLiteStudio3/coreSQLiteStudio/db/dbpluginoption.h @@ -26,6 +26,11 @@ */ struct DbPluginOption { + /** + * @brief Handler for custom path browser implemented by the plugin. + */ + typedef std::function CustomBrowseHandler; + /** * @brief Option data type * @@ -39,7 +44,8 @@ struct DbPluginOption DOUBLE = 3, /**< QDoubleSpinBox will be added */ FILE = 4, /**< QLineEdit will be added */ PASSWORD = 5, /**< QLineEdit with value masking will be added */ - CHOICE = 6 /**< QComboBox will be added */ + CHOICE = 6, /**< QComboBox will be added */ + CUSTOM_PATH_BROWSE = 7 /**< File path browse button will be handled by the plugin. No additional editor will be added. */ }; /** @@ -92,6 +98,11 @@ struct DbPluginOption * @brief Expected data type for the option. */ Type type; + + /** + * @brief Handler for custom path browser implemented by the plugin. + */ + CustomBrowseHandler customBrowseHandler = nullptr; }; #endif // DBPLUGINOPTION_H diff --git a/SQLiteStudio3/coreSQLiteStudio/db/invaliddb.cpp b/SQLiteStudio3/coreSQLiteStudio/db/invaliddb.cpp index e4810a1..bdf3ef6 100644 --- a/SQLiteStudio3/coreSQLiteStudio/db/invaliddb.cpp +++ b/SQLiteStudio3/coreSQLiteStudio/db/invaliddb.cpp @@ -12,22 +12,22 @@ bool InvalidDb::isOpen() return false; } -QString InvalidDb::getName() +QString InvalidDb::getName() const { return name; } -QString InvalidDb::getPath() +QString InvalidDb::getPath() const { return path; } -quint8 InvalidDb::getVersion() +quint8 InvalidDb::getVersion() const { return 0; } -Dialect InvalidDb::getDialect() +Dialect InvalidDb::getDialect() const { return Dialect::Sqlite3; } diff --git a/SQLiteStudio3/coreSQLiteStudio/db/invaliddb.h b/SQLiteStudio3/coreSQLiteStudio/db/invaliddb.h index 759aa4c..a9d58e0 100644 --- a/SQLiteStudio3/coreSQLiteStudio/db/invaliddb.h +++ b/SQLiteStudio3/coreSQLiteStudio/db/invaliddb.h @@ -9,10 +9,10 @@ class API_EXPORT InvalidDb : public Db InvalidDb(const QString& name, const QString& path, const QHash& connOptions); bool isOpen(); - QString getName(); - QString getPath(); - quint8 getVersion(); - Dialect getDialect(); + QString getName() const; + QString getPath() const; + quint8 getVersion() const; + Dialect getDialect() const; QString getEncoding(); QHash& getConnectionOptions(); void setName(const QString& value); diff --git a/SQLiteStudio3/coreSQLiteStudio/db/queryexecutorsteps/queryexecutorcolumns.cpp b/SQLiteStudio3/coreSQLiteStudio/db/queryexecutorsteps/queryexecutorcolumns.cpp index 6acfb6f..287a8ce 100644 --- a/SQLiteStudio3/coreSQLiteStudio/db/queryexecutorsteps/queryexecutorcolumns.cpp +++ b/SQLiteStudio3/coreSQLiteStudio/db/queryexecutorsteps/queryexecutorcolumns.cpp @@ -40,14 +40,13 @@ bool QueryExecutorColumns::exec() core->resultColumns.clear(); // Count total rowId columns - int rowIdColCount = 0; for (const QueryExecutor::ResultRowIdColumnPtr& rowIdCol : context->rowIdColumns) - rowIdColCount += rowIdCol->queryExecutorAliasToColumn.size(); + rowIdColNames += rowIdCol->queryExecutorAliasToColumn.keys(); // Defining result columns QueryExecutor::ResultColumnPtr resultColumn; SqliteSelect::Core::ResultColumn* resultColumnForSelect = nullptr; - bool isRowIdColumn = false; + bool rowIdColumn = false; int i = 0; for (const SelectResolver::Column& col : columns) { @@ -55,15 +54,18 @@ bool QueryExecutorColumns::exec() resultColumn = getResultColumn(col); // Adding new result column to the query - isRowIdColumn = (i < rowIdColCount); - resultColumnForSelect = getResultColumnForSelect(resultColumn, col, isRowIdColumn); + rowIdColumn = isRowIdColumn(col.alias); + if (rowIdColumn && col.alias.contains(":")) + continue; // duplicate ROWID column provided by SelectResolver. See isRowIdColumn() for details. + + resultColumnForSelect = getResultColumnForSelect(resultColumn, col); if (!resultColumnForSelect) return false; resultColumnForSelect->setParent(core); core->resultColumns << resultColumnForSelect; - if (!isRowIdColumn) + if (!rowIdColumn) context->resultColumns << resultColumn; // store it in context for later usage by any step i++; @@ -89,7 +91,6 @@ QueryExecutor::ResultColumnPtr QueryExecutorColumns::getResultColumn(const Selec resultColumn->column = resolvedColumn.column; resultColumn->alias = resolvedColumn.alias; resultColumn->expression = true; - resultColumn->queryExecutorAlias = getNextColName(); } else { @@ -111,20 +112,20 @@ QueryExecutor::ResultColumnPtr QueryExecutorColumns::getResultColumn(const Selec resultColumn->tableAlias = resolvedColumn.tableAlias; resultColumn->alias = resolvedColumn.alias; resultColumn->displayName = resolvedColumn.displayName; + } - if (isRowIdColumnAlias(resultColumn->alias)) - { - resultColumn->queryExecutorAlias = resultColumn->alias; - } - else - { - resultColumn->queryExecutorAlias = getNextColName(); - } + if (isRowIdColumnAlias(resultColumn->alias)) + { + resultColumn->queryExecutorAlias = resultColumn->alias; + } + else + { + resultColumn->queryExecutorAlias = getNextColName(); } return resultColumn; } -SqliteSelect::Core::ResultColumn* QueryExecutorColumns::getResultColumnForSelect(const QueryExecutor::ResultColumnPtr& resultColumn, const SelectResolver::Column& col, bool rowIdColumn) +SqliteSelect::Core::ResultColumn* QueryExecutorColumns::getResultColumnForSelect(const QueryExecutor::ResultColumnPtr& resultColumn, const SelectResolver::Column& col) { SqliteSelect::Core::ResultColumn* selectResultColumn = new SqliteSelect::Core::ResultColumn(); @@ -164,28 +165,6 @@ SqliteSelect::Core::ResultColumn* QueryExecutorColumns::getResultColumnForSelect selectResultColumn->expr->table = resultColumn->table; } - -// // SQLite2 requires special treatment here. It won't allow selecting db.table.col from a subquery - it needs escaped ID that reflects db.table.col. -// if (dialect == Dialect::Sqlite2) -// { -// selectResultColumn->expr->rebuildTokens(); -// colString = wrapObjIfNeeded(selectResultColumn->expr->detokenize(), dialect); -// delete selectResultColumn->expr; -// selectResultColumn->expr = nullptr; - -// expr = parser.parseExpr(colString); -// if (!expr) -// { -// qWarning() << "Could not parse result column expr in SQLite2's second parsing phase:" << colString; -// if (parser.getErrors().size() > 0) -// qWarning() << "The error was:" << parser.getErrors().first()->getFrom() << ":" << parser.getErrors().first()->getMessage(); - -// return nullptr; -// } - -// expr->setParent(selectResultColumn); -// selectResultColumn->expr = expr; -// } } if (!col.alias.isNull()) @@ -193,7 +172,7 @@ SqliteSelect::Core::ResultColumn* QueryExecutorColumns::getResultColumnForSelect selectResultColumn->asKw = true; selectResultColumn->alias = col.alias; } - else if (rowIdColumn || resultColumn->expression) + else { selectResultColumn->asKw = true; selectResultColumn->alias = resultColumn->queryExecutorAlias; @@ -252,12 +231,10 @@ void QueryExecutorColumns::wrapWithAliasedColumns(SqliteSelect* select) // If alias was given, we use it. If it was anything but expression, we also use its display name, // because it's explicit column (no matter if from table, or table alias). baseColName = QString(); - if (!resCol->alias.isNull()) + if (!resCol->queryExecutorAlias.isNull()) baseColName = resCol->alias; - else if (dialect == Dialect::Sqlite3 && !resCol->expression) + else if (!resCol->expression) baseColName = resCol->column; - else if (dialect == Dialect::Sqlite2 && !resCol->expression) - baseColName = getAliasedColumnNameForSqlite2(resCol); if (!baseColName.isNull()) { @@ -279,20 +256,17 @@ void QueryExecutorColumns::wrapWithAliasedColumns(SqliteSelect* select) select->tokens = wrapSelect(select->tokens, outerColumns); } -QString QueryExecutorColumns::getAliasedColumnNameForSqlite2(const QueryExecutor::ResultColumnPtr& resCol) +bool QueryExecutorColumns::isRowIdColumn(const QString& columnAlias) { - QStringList colNameParts; - if (!resCol->table.isNull()) - { - if (!resCol->database.isNull()) - { - if (context->dbNameToAttach.containsLeft(resCol->database, Qt::CaseInsensitive)) - colNameParts << context->dbNameToAttach.valueByLeft(resCol->database, Qt::CaseInsensitive); - else - colNameParts << wrapObjIfNeeded(resCol->database, dialect); - } - colNameParts << wrapObjIfNeeded(resCol->table, dialect); - } - colNameParts << wrapObjIfNeeded(resCol->column, dialect); - return colNameParts.join("."); + // In case of "SELECT * FROM (SELECT * FROM test);" the SelectResolver will return ROWID columns twice for each table listed, + // because ROWID columns are recurrently handled by QueryExecutorAddRowIds step. We need to identify such columns and make them unique + // in the final query. + // Currently all columns have QueryExecutor aliased names, so we can assume they have unified alias name in form ResCol_N. + // If SelectResolver returns any column like ResCol_N:X, then it means that the column is result of the query like above. + // Note, that this assumption is correct for RowId columns. There can be columns aliased by user and those aliases won't be unified. + QString aliasOnly = columnAlias; + if (aliasOnly.contains(":")) + aliasOnly = aliasOnly.left(aliasOnly.indexOf(":")); + + return rowIdColNames.contains(aliasOnly); } diff --git a/SQLiteStudio3/coreSQLiteStudio/db/queryexecutorsteps/queryexecutorcolumns.h b/SQLiteStudio3/coreSQLiteStudio/db/queryexecutorsteps/queryexecutorcolumns.h index fd85651..e23b9f6 100644 --- a/SQLiteStudio3/coreSQLiteStudio/db/queryexecutorsteps/queryexecutorcolumns.h +++ b/SQLiteStudio3/coreSQLiteStudio/db/queryexecutorsteps/queryexecutorcolumns.h @@ -50,7 +50,7 @@ class QueryExecutorColumns : public QueryExecutorStep * @param rowIdColumn Indicates if this is a call for ROWID column added by QueryExecutorRowId step. * @return Result column object ready for rebuilding tokens and detokenizing. */ - SqliteSelect::Core::ResultColumn* getResultColumnForSelect(const QueryExecutor::ResultColumnPtr& resultColumn, const SelectResolver::Column& col, bool rowIdColumn); + SqliteSelect::Core::ResultColumn* getResultColumnForSelect(const QueryExecutor::ResultColumnPtr& resultColumn, const SelectResolver::Column& col); /** * @brief Translates attach name into database name. @@ -67,8 +67,8 @@ class QueryExecutorColumns : public QueryExecutorStep bool isRowIdColumnAlias(const QString& alias); void wrapWithAliasedColumns(SqliteSelect* select); - - QString getAliasedColumnNameForSqlite2(const QueryExecutor::ResultColumnPtr& resCol); + bool isRowIdColumn(const QString& columnAlias); + QStringList rowIdColNames; }; #endif // QUERYEXECUTORCOLUMNS_H diff --git a/SQLiteStudio3/coreSQLiteStudio/db/queryexecutorsteps/queryexecutorexecute.cpp b/SQLiteStudio3/coreSQLiteStudio/db/queryexecutorsteps/queryexecutorexecute.cpp index f42f647..df2ed68 100644 --- a/SQLiteStudio3/coreSQLiteStudio/db/queryexecutorsteps/queryexecutorexecute.cpp +++ b/SQLiteStudio3/coreSQLiteStudio/db/queryexecutorsteps/queryexecutorexecute.cpp @@ -8,6 +8,7 @@ #include #include #include +#include bool QueryExecutorExecute::exec() { @@ -120,17 +121,17 @@ void QueryExecutorExecute::setupSqlite2ColumnDataTypes(SqlQueryPtr results) if (!sqlite2Helper) return; - QPair key; + Table key; SqliteCreateTablePtr createTable; SchemaResolver resolver(db); - QHash,SqliteCreateTablePtr> tables; + QHash tables; for (QueryExecutor::SourceTablePtr tab : context->sourceTables) { if (tab->table.isNull()) continue; - key = QPair(tab->database, tab->table); + key = Table(tab->database, tab->table); createTable = resolver.getParsedObject(tab->database, tab->table, SchemaResolver::TABLE).dynamicCast(); tables[key] = createTable; } @@ -142,7 +143,7 @@ void QueryExecutorExecute::setupSqlite2ColumnDataTypes(SqlQueryPtr results) for (QueryExecutor::ResultColumnPtr resCol : context->resultColumns) { idx++; - key = QPair(resCol->database, resCol->table); + key = Table(resCol->database, resCol->table); if (!tables.contains(key)) continue; diff --git a/SQLiteStudio3/coreSQLiteStudio/db/stdsqlite3driver.h b/SQLiteStudio3/coreSQLiteStudio/db/stdsqlite3driver.h index eff3621..2f26aaf 100644 --- a/SQLiteStudio3/coreSQLiteStudio/db/stdsqlite3driver.h +++ b/SQLiteStudio3/coreSQLiteStudio/db/stdsqlite3driver.h @@ -41,6 +41,7 @@ static int bind_int(stmt* a1, int a2, int a3) {return Prefix##sqlite3_bind_int(a1, a2, a3);} \ static int bind_int64(stmt* a1, int a2, int64 a3) {return Prefix##sqlite3_bind_int64(a1, a2, a3);} \ static int bind_null(stmt* a1, int a2) {return Prefix##sqlite3_bind_null(a1, a2);} \ + static int bind_parameter_index(stmt* a1, const char* a2) {return Prefix##sqlite3_bind_parameter_index(a1, a2);} \ static int bind_text16(stmt* a1, int a2, const void* a3, int a4, void(*a5)(void*)) {return Prefix##sqlite3_bind_text16(a1, a2, a3, a4, a5);} \ static void result_blob(context* a1, const void* a2, int a3, void(*a4)(void*)) {Prefix##sqlite3_result_blob(a1, a2, a3, a4);} \ static void result_double(context* a1, double a2) {Prefix##sqlite3_result_double(a1, a2);} \ diff --git a/SQLiteStudio3/coreSQLiteStudio/exportworker.cpp b/SQLiteStudio3/coreSQLiteStudio/exportworker.cpp index b14bbf1..ffecd4d 100644 --- a/SQLiteStudio3/coreSQLiteStudio/exportworker.cpp +++ b/SQLiteStudio3/coreSQLiteStudio/exportworker.cpp @@ -23,6 +23,7 @@ ExportWorker::~ExportWorker() void ExportWorker::run() { + qDebug() << "ExportWorker thread started. Export mode: " << static_cast(exportMode); bool res = false; switch (exportMode) { @@ -109,39 +110,64 @@ bool ExportWorker::exportQueryResults() QHash providerData = getProviderDataForQueryResults(); if (results->isInterrupted()) + { + logExportFail("exportQueryResults() -> interrupted(1)"); return false; + } if (results->isError()) { + logExportFail("exportQueryResults() -> error"); notifyError(tr("Error while exporting query results: %1").arg(results->getErrorText())); return false; } if (!plugin->initBeforeExport(db, output, *config)) + { + logExportFail("initBeforeExport()"); return false; + } if (!plugin->beforeExportQueryResults(query, resultColumns, providerData)) + { + logExportFail("beforeExportQueryResults()"); return false; + } if (isInterrupted()) + { + logExportFail("exportQueryResults() -> interrupted(2)"); return false; + } SqlResultsRowPtr row; while (results->hasNext()) { row = results->next(); if (!plugin->exportQueryResultsRow(row)) + { + logExportFail("exportQueryResultsRow()"); return false; + } if (isInterrupted()) + { + logExportFail("exportQueryResults() -> interrupted(3)"); return false; + } } if (!plugin->afterExportQueryResults()) + { + logExportFail("afterExportQueryResults()"); return false; + } if (!plugin->afterExport()) + { + logExportFail("afterExport()"); return false; + } return true; } @@ -192,18 +218,28 @@ bool ExportWorker::exportDatabase() QList dbObjects = collectDbObjects(&err); if (!err.isNull()) { + logExportFail("exportDatabase() -> dbObjects"); notifyError(err); return false; } if (!plugin->initBeforeExport(db, output, *config)) + { + logExportFail("initBeforeExport()"); return false; + } if (!plugin->beforeExportDatabase(db->getName())) + { + logExportFail("beforeExportDatabase()"); return false; + } if (isInterrupted()) + { + logExportFail("exportDatabase() -> interrupted(1)"); return false; + } QList order = { ExportManager::ExportObject::TABLE, ExportManager::ExportObject::INDEX, ExportManager::ExportObject::TRIGGER, ExportManager::ExportObject::VIEW @@ -215,46 +251,88 @@ bool ExportWorker::exportDatabase() }); if (!plugin->beforeExportTables()) + { + logExportFail("beforeExportTables()"); return false; + } if (!exportDatabaseObjects(dbObjects, ExportManager::ExportObject::TABLE)) + { + logExportFail("exportDatabaseObjects()"); return false; + } if (!plugin->afterExportTables()) + { + logExportFail("afterExportTables()"); return false; + } if (!plugin->beforeExportIndexes()) + { + logExportFail("beforeExportIndexes()"); return false; + } if (!exportDatabaseObjects(dbObjects, ExportManager::ExportObject::INDEX)) + { + logExportFail("exportDatabaseObjects()"); return false; + } if (!plugin->afterExportIndexes()) + { + logExportFail("afterExportIndexes()"); return false; + } if (!plugin->beforeExportTriggers()) + { + logExportFail("beforeExportTriggers()"); return false; + } if (!exportDatabaseObjects(dbObjects, ExportManager::ExportObject::TRIGGER)) + { + logExportFail("exportDatabaseObjects()"); return false; + } if (!plugin->afterExportTriggers()) + { + logExportFail("afterExportTriggers()"); return false; + } if (!plugin->beforeExportViews()) + { + logExportFail("beforeExportViews()"); return false; + } if (!exportDatabaseObjects(dbObjects, ExportManager::ExportObject::VIEW)) + { + logExportFail("exportDatabaseObjects()"); return false; + } if (!plugin->afterExportViews()) + { + logExportFail("afterExportViews()"); return false; + } if (!plugin->afterExportDatabase()) + { + logExportFail("afterExportDatabase()"); return false; + } if (!plugin->afterExport()) + { + logExportFail("afterExport()"); return false; + } return true; } @@ -297,10 +375,16 @@ bool ExportWorker::exportDatabaseObjects(const QListname); return false; + } if (isInterrupted()) + { + logExportFail("database objects export (interrupted)"); return false; + } } return true; } @@ -313,6 +397,7 @@ bool ExportWorker::exportTable() queryTableDataToExport(db, table, results, providerData, &errorMessage); if (!errorMessage.isNull()) { + logExportFail("fetching table data"); notifyError(errorMessage); return false; } @@ -329,45 +414,72 @@ bool ExportWorker::exportTable() SqliteQueryPtr createTable = parser->getQueries().first(); if (!plugin->initBeforeExport(db, output, *config)) + { + logExportFail("initBeforeExport()"); return false; + } if (!exportTableInternal(database, table, ddl, createTable, results, providerData)) + { + logExportFail("exportTableInternal()"); return false; + } if (config->exportTableIndexes) { if (!plugin->beforeExportIndexes()) + { + logExportFail("beforeExportIndexes()"); return false; + } QList parsedIndexesForTable = resolver.getParsedIndexesForTable(database, table); for (const SqliteCreateIndexPtr& idx : parsedIndexesForTable) { if (!plugin->exportIndex(database, idx->index, idx->detokenize(), idx)) + { + logExportFail("exportIndex()"); return false; + } } if (!plugin->afterExportIndexes()) + { + logExportFail("afterExportIndexes()"); return false; + } } if (config->exportTableTriggers) { if (!plugin->beforeExportTriggers()) + { + logExportFail("beforeExportTriggers()"); return false; + } QList parsedTriggersForTable = resolver.getParsedTriggersForTable(database, table); for (const SqliteCreateTriggerPtr& trig : parsedTriggersForTable) { if (!plugin->exportTrigger(database, trig->trigger, trig->detokenize(), trig)) + { + logExportFail("exportTrigger()"); return false; + } } if (!plugin->afterExportTriggers()) + { + logExportFail("afterExportTriggers()"); return false; + } } if (!plugin->afterExport()) + { + logExportFail("afterExport()"); return false; + } return true; } @@ -388,16 +500,25 @@ bool ExportWorker::exportTableInternal(const QString& database, const QString& t colNames = createTable->getColumnNames(); if (!plugin->exportTable(database, table, colNames, ddl, createTable, providerData)) + { + logExportFail("exportTable()"); return false; + } } else { if (!plugin->exportVirtualTable(database, table, colNames, ddl, createVirtualTable, providerData)) + { + logExportFail("exportVirtualTable()"); return false; + } } if (isInterrupted()) + { + logExportFail("internal table export interruption"); return false; + } SqlResultsRowPtr row; if (results) @@ -406,15 +527,24 @@ bool ExportWorker::exportTableInternal(const QString& database, const QString& t { row = results->next(); if (!plugin->exportTableRow(row)) + { + logExportFail("exportTableRow()"); return false; + } if (isInterrupted()) + { + logExportFail("internal table export interruption (2)"); return false; + } } } if (!plugin->afterExportTable()) + { + logExportFail("afterExportTable()"); return false; + } return true; } @@ -478,7 +608,7 @@ void ExportWorker::queryTableDataToExport(Db* db, const QString& table, SqlQuery { QString wrappedTable = wrapObjIfNeeded(table, db->getDialect()); dataPtr = db->exec(sql.arg(wrappedTable)); - if (dataPtr->isError()) + if (dataPtr->isError() && !errorMessage->isNull()) *errorMessage = tr("Error while reading data to export from table %1: %2").arg(table, dataPtr->getErrorText()); if (plugin->getProviderFlags().testFlag(ExportManager::ROW_COUNT)) @@ -486,8 +616,8 @@ void ExportWorker::queryTableDataToExport(Db* db, const QString& table, SqlQuery SqlQueryPtr countQuery = db->exec(countSql.arg(wrappedTable)); if (countQuery->isError()) { - if (errorMessage->isNull()) - *errorMessage = tr("Error while counting data to export from table %1: %2").arg(table, dataPtr->getErrorText()); + if (!errorMessage->isNull()) + *errorMessage = tr("Error while counting data to export from table %1: %2").arg(table, countQuery->getErrorText()); } else providerData[ExportManager::ROW_COUNT] = countQuery->getSingleCell().toInt(); @@ -502,8 +632,8 @@ void ExportWorker::queryTableDataToExport(Db* db, const QString& table, SqlQuery SqlQueryPtr colLengthQuery = db->exec(colLengthSql.arg(wrappedCols.join(", "), wrappedTable)); if (colLengthQuery->isError()) { - if (errorMessage->isNull()) - *errorMessage = tr("Error while counting data column width to export from table %1: %2").arg(table, dataPtr->getErrorText()); + if (!errorMessage->isNull()) + *errorMessage = tr("Error while counting data column width to export from table %1: %2").arg(table, colLengthQuery->getErrorText()); } else { @@ -523,3 +653,8 @@ bool ExportWorker::isInterrupted() return interrupted; } +void ExportWorker::logExportFail(const QString &stageName) +{ + qWarning() << "Export has faild at" << stageName << "stage."; +} + diff --git a/SQLiteStudio3/coreSQLiteStudio/exportworker.h b/SQLiteStudio3/coreSQLiteStudio/exportworker.h index 27620a4..5e8bef3 100644 --- a/SQLiteStudio3/coreSQLiteStudio/exportworker.h +++ b/SQLiteStudio3/coreSQLiteStudio/exportworker.h @@ -35,6 +35,7 @@ class API_EXPORT ExportWorker : public QObject, public QRunnable void queryTableDataToExport(Db* db, const QString& table, SqlQueryPtr& dataPtr, QHash& providerData, QString* errorMessage) const; bool isInterrupted(); + void logExportFail(const QString& stageName); ExportPlugin* plugin = nullptr; ExportManager::StandardExportConfig* config = nullptr; diff --git a/SQLiteStudio3/coreSQLiteStudio/importworker.cpp b/SQLiteStudio3/coreSQLiteStudio/importworker.cpp index af4a66d..2cdeeb0 100644 --- a/SQLiteStudio3/coreSQLiteStudio/importworker.cpp +++ b/SQLiteStudio3/coreSQLiteStudio/importworker.cpp @@ -149,8 +149,19 @@ bool ImportWorker::importData() query->setArgs(row.mid(0, colCount)); if (!query->execute()) { - error(tr("Error while importing data: %1").arg(query->getErrorText())); - return false; + if (config->ignoreErrors) + { + qDebug() << "Could not import data row number" << (rowCnt+1) << ". The row was ignored. Problem details:" + << query->getErrorText(); + + notifyWarn(tr("Could not import data row number %1. The row was ignored. Problem details: %2") + .arg(QString::number(rowCnt + 1), query->getErrorText())); + } + else + { + error(tr("Error while importing data: %1").arg(query->getErrorText())); + return false; + } } if ((rowCnt % 100) == 0 && isInterrupted()) diff --git a/SQLiteStudio3/coreSQLiteStudio/parser/ast/sqlitealtertable.cpp b/SQLiteStudio3/coreSQLiteStudio/parser/ast/sqlitealtertable.cpp index 6c840e7..49763a5 100644 --- a/SQLiteStudio3/coreSQLiteStudio/parser/ast/sqlitealtertable.cpp +++ b/SQLiteStudio3/coreSQLiteStudio/parser/ast/sqlitealtertable.cpp @@ -102,7 +102,7 @@ void SqliteAlterTable::initName(const QString &name1, const QString &name2) TokenList SqliteAlterTable::rebuildTokensFromContents() { StatementTokenBuilder builder; - + builder.withTokens(SqliteQuery::rebuildTokensFromContents()); builder.withKeyword("ALTER").withSpace().withKeyword("TABLE").withSpace(); if (!database.isNull()) diff --git a/SQLiteStudio3/coreSQLiteStudio/parser/ast/sqliteanalyze.cpp b/SQLiteStudio3/coreSQLiteStudio/parser/ast/sqliteanalyze.cpp index d4e5778..30396c1 100644 --- a/SQLiteStudio3/coreSQLiteStudio/parser/ast/sqliteanalyze.cpp +++ b/SQLiteStudio3/coreSQLiteStudio/parser/ast/sqliteanalyze.cpp @@ -69,7 +69,7 @@ QList SqliteAnalyze::getFullObjectsInStatement() TokenList SqliteAnalyze::rebuildTokensFromContents() { StatementTokenBuilder builder; - + builder.withTokens(SqliteQuery::rebuildTokensFromContents()); builder.withKeyword("ANALYZE").withSpace(); if (!database.isNull()) diff --git a/SQLiteStudio3/coreSQLiteStudio/parser/ast/sqliteattach.cpp b/SQLiteStudio3/coreSQLiteStudio/parser/ast/sqliteattach.cpp index 7d0b8a5..359396b 100644 --- a/SQLiteStudio3/coreSQLiteStudio/parser/ast/sqliteattach.cpp +++ b/SQLiteStudio3/coreSQLiteStudio/parser/ast/sqliteattach.cpp @@ -47,7 +47,7 @@ SqliteStatement* SqliteAttach::clone() TokenList SqliteAttach::rebuildTokensFromContents() { StatementTokenBuilder builder; - + builder.withTokens(SqliteQuery::rebuildTokensFromContents()); builder.withKeyword("ATTACH").withSpace(); if (databaseKw) diff --git a/SQLiteStudio3/coreSQLiteStudio/parser/ast/sqlitebegintrans.cpp b/SQLiteStudio3/coreSQLiteStudio/parser/ast/sqlitebegintrans.cpp index dcd9740..00ec9ac 100644 --- a/SQLiteStudio3/coreSQLiteStudio/parser/ast/sqlitebegintrans.cpp +++ b/SQLiteStudio3/coreSQLiteStudio/parser/ast/sqlitebegintrans.cpp @@ -52,7 +52,7 @@ QString SqliteBeginTrans::typeToString(SqliteBeginTrans::Type type) TokenList SqliteBeginTrans::rebuildTokensFromContents() { StatementTokenBuilder builder; - + builder.withTokens(SqliteQuery::rebuildTokensFromContents()); builder.withKeyword("BEGIN"); if (type != Type::null) diff --git a/SQLiteStudio3/coreSQLiteStudio/parser/ast/sqlitecommittrans.cpp b/SQLiteStudio3/coreSQLiteStudio/parser/ast/sqlitecommittrans.cpp index 97be8a9..2b1b707 100644 --- a/SQLiteStudio3/coreSQLiteStudio/parser/ast/sqlitecommittrans.cpp +++ b/SQLiteStudio3/coreSQLiteStudio/parser/ast/sqlitecommittrans.cpp @@ -29,7 +29,7 @@ SqliteStatement* SqliteCommitTrans::clone() TokenList SqliteCommitTrans::rebuildTokensFromContents() { StatementTokenBuilder builder; - + builder.withTokens(SqliteQuery::rebuildTokensFromContents()); if (endKw) builder.withKeyword("END"); else diff --git a/SQLiteStudio3/coreSQLiteStudio/parser/ast/sqlitecopy.cpp b/SQLiteStudio3/coreSQLiteStudio/parser/ast/sqlitecopy.cpp index 009f836..0d9ed9f 100644 --- a/SQLiteStudio3/coreSQLiteStudio/parser/ast/sqlitecopy.cpp +++ b/SQLiteStudio3/coreSQLiteStudio/parser/ast/sqlitecopy.cpp @@ -73,7 +73,7 @@ QList SqliteCopy::getFullObjectsInStatement() TokenList SqliteCopy::rebuildTokensFromContents() { StatementTokenBuilder builder; - + builder.withTokens(SqliteQuery::rebuildTokensFromContents()); builder.withKeyword("COPY").withSpace(); if (onConflict != SqliteConflictAlgo::null) builder.withKeyword("OR").withSpace().withKeyword(sqliteConflictAlgo(onConflict)).withSpace(); diff --git a/SQLiteStudio3/coreSQLiteStudio/parser/ast/sqlitecreateindex.cpp b/SQLiteStudio3/coreSQLiteStudio/parser/ast/sqlitecreateindex.cpp index 36f7aa9..16cec8f 100644 --- a/SQLiteStudio3/coreSQLiteStudio/parser/ast/sqlitecreateindex.cpp +++ b/SQLiteStudio3/coreSQLiteStudio/parser/ast/sqlitecreateindex.cpp @@ -149,6 +149,7 @@ QList SqliteCreateIndex::getFullObjectsInStatement( TokenList SqliteCreateIndex::rebuildTokensFromContents() { StatementTokenBuilder builder; + builder.withTokens(SqliteQuery::rebuildTokensFromContents()); builder.withKeyword("CREATE").withSpace(); if (uniqueKw) builder.withKeyword("UNIQUE").withSpace(); diff --git a/SQLiteStudio3/coreSQLiteStudio/parser/ast/sqlitecreatetable.cpp b/SQLiteStudio3/coreSQLiteStudio/parser/ast/sqlitecreatetable.cpp index e31e512..454c0e3 100644 --- a/SQLiteStudio3/coreSQLiteStudio/parser/ast/sqlitecreatetable.cpp +++ b/SQLiteStudio3/coreSQLiteStudio/parser/ast/sqlitecreatetable.cpp @@ -208,7 +208,7 @@ QList SqliteCreateTable::getFullObjectsInStatement( TokenList SqliteCreateTable::rebuildTokensFromContents() { StatementTokenBuilder builder; - + builder.withTokens(SqliteQuery::rebuildTokensFromContents()); builder.withKeyword("CREATE"); if (tempKw) builder.withSpace().withKeyword("TEMP"); @@ -706,7 +706,6 @@ TokenList SqliteCreateTable::Column::rebuildTokensFromContents() TokenList SqliteCreateTable::Column::Constraint::rebuildTokensFromContents() { StatementTokenBuilder builder; - if (!name.isNull()) builder.withKeyword("CONSTRAINT").withSpace().withOther(name, dialect).withSpace(); diff --git a/SQLiteStudio3/coreSQLiteStudio/parser/ast/sqlitecreatetrigger.cpp b/SQLiteStudio3/coreSQLiteStudio/parser/ast/sqlitecreatetrigger.cpp index 3b7b0ea..8f67aea 100644 --- a/SQLiteStudio3/coreSQLiteStudio/parser/ast/sqlitecreatetrigger.cpp +++ b/SQLiteStudio3/coreSQLiteStudio/parser/ast/sqlitecreatetrigger.cpp @@ -322,7 +322,7 @@ SqliteCreateTrigger::Event::Type SqliteCreateTrigger::Event::stringToType(const TokenList SqliteCreateTrigger::rebuildTokensFromContents() { StatementTokenBuilder builder; - + builder.withTokens(SqliteQuery::rebuildTokensFromContents()); builder.withKeyword("CREATE").withSpace(); if (tempKw) builder.withKeyword("TEMP").withSpace(); diff --git a/SQLiteStudio3/coreSQLiteStudio/parser/ast/sqlitecreateview.cpp b/SQLiteStudio3/coreSQLiteStudio/parser/ast/sqlitecreateview.cpp index 6b11c3c..d1a8961 100644 --- a/SQLiteStudio3/coreSQLiteStudio/parser/ast/sqlitecreateview.cpp +++ b/SQLiteStudio3/coreSQLiteStudio/parser/ast/sqlitecreateview.cpp @@ -98,7 +98,7 @@ QList SqliteCreateView::getFullObjectsInStatement() TokenList SqliteCreateView::rebuildTokensFromContents() { StatementTokenBuilder builder; - + builder.withTokens(SqliteQuery::rebuildTokensFromContents()); builder.withKeyword("CREATE").withSpace(); if (tempKw) builder.withKeyword("TEMP").withSpace(); diff --git a/SQLiteStudio3/coreSQLiteStudio/parser/ast/sqlitecreatevirtualtable.cpp b/SQLiteStudio3/coreSQLiteStudio/parser/ast/sqlitecreatevirtualtable.cpp index bc38dc9..1d98c8d 100644 --- a/SQLiteStudio3/coreSQLiteStudio/parser/ast/sqlitecreatevirtualtable.cpp +++ b/SQLiteStudio3/coreSQLiteStudio/parser/ast/sqlitecreatevirtualtable.cpp @@ -91,7 +91,7 @@ void SqliteCreateVirtualTable::initName(const QString &name1, const QString &nam TokenList SqliteCreateVirtualTable::rebuildTokensFromContents() { StatementTokenBuilder builder; - + builder.withTokens(SqliteQuery::rebuildTokensFromContents()); builder.withKeyword("CREATE").withSpace().withKeyword("VIRTUAL").withSpace().withKeyword("TABLE"); if (ifNotExistsKw) builder.withKeyword("IF").withSpace().withKeyword("NOT").withSpace().withKeyword("EXISTS").withSpace(); diff --git a/SQLiteStudio3/coreSQLiteStudio/parser/ast/sqlitedelete.cpp b/SQLiteStudio3/coreSQLiteStudio/parser/ast/sqlitedelete.cpp index 60e5878..6026de3 100644 --- a/SQLiteStudio3/coreSQLiteStudio/parser/ast/sqlitedelete.cpp +++ b/SQLiteStudio3/coreSQLiteStudio/parser/ast/sqlitedelete.cpp @@ -113,7 +113,7 @@ void SqliteDelete::init(const QString &name1, const QString &name2, SqliteExpr * TokenList SqliteDelete::rebuildTokensFromContents() { StatementTokenBuilder builder; - + builder.withTokens(SqliteQuery::rebuildTokensFromContents()); if (with) builder.withStatement(with); diff --git a/SQLiteStudio3/coreSQLiteStudio/parser/ast/sqlitedetach.cpp b/SQLiteStudio3/coreSQLiteStudio/parser/ast/sqlitedetach.cpp index 1f874d3..e5b59e3 100644 --- a/SQLiteStudio3/coreSQLiteStudio/parser/ast/sqlitedetach.cpp +++ b/SQLiteStudio3/coreSQLiteStudio/parser/ast/sqlitedetach.cpp @@ -36,7 +36,7 @@ SqliteStatement*SqliteDetach::clone() TokenList SqliteDetach::rebuildTokensFromContents() { StatementTokenBuilder builder; - + builder.withTokens(SqliteQuery::rebuildTokensFromContents()); builder.withKeyword("DETACH").withSpace(); if (databaseKw) diff --git a/SQLiteStudio3/coreSQLiteStudio/parser/ast/sqlitedropindex.cpp b/SQLiteStudio3/coreSQLiteStudio/parser/ast/sqlitedropindex.cpp index df924fe..2e39312 100644 --- a/SQLiteStudio3/coreSQLiteStudio/parser/ast/sqlitedropindex.cpp +++ b/SQLiteStudio3/coreSQLiteStudio/parser/ast/sqlitedropindex.cpp @@ -63,7 +63,7 @@ QList SqliteDropIndex::getFullObjectsInStatement() TokenList SqliteDropIndex::rebuildTokensFromContents() { StatementTokenBuilder builder; - + builder.withTokens(SqliteQuery::rebuildTokensFromContents()); builder.withKeyword("DROP").withSpace().withKeyword("INDEX").withSpace(); if (ifExistsKw) diff --git a/SQLiteStudio3/coreSQLiteStudio/parser/ast/sqlitedroptable.cpp b/SQLiteStudio3/coreSQLiteStudio/parser/ast/sqlitedroptable.cpp index 9c4aa37..c4fc02d 100644 --- a/SQLiteStudio3/coreSQLiteStudio/parser/ast/sqlitedroptable.cpp +++ b/SQLiteStudio3/coreSQLiteStudio/parser/ast/sqlitedroptable.cpp @@ -71,7 +71,7 @@ QList SqliteDropTable::getFullObjectsInStatement() TokenList SqliteDropTable::rebuildTokensFromContents() { StatementTokenBuilder builder; - + builder.withTokens(SqliteQuery::rebuildTokensFromContents()); builder.withKeyword("DROP").withSpace().withKeyword("TABLE").withSpace(); if (ifExistsKw) diff --git a/SQLiteStudio3/coreSQLiteStudio/parser/ast/sqlitedroptrigger.cpp b/SQLiteStudio3/coreSQLiteStudio/parser/ast/sqlitedroptrigger.cpp index 471d558..8921af3 100644 --- a/SQLiteStudio3/coreSQLiteStudio/parser/ast/sqlitedroptrigger.cpp +++ b/SQLiteStudio3/coreSQLiteStudio/parser/ast/sqlitedroptrigger.cpp @@ -64,7 +64,7 @@ QList SqliteDropTrigger::getFullObjectsInStatement( TokenList SqliteDropTrigger::rebuildTokensFromContents() { StatementTokenBuilder builder; - + builder.withTokens(SqliteQuery::rebuildTokensFromContents()); builder.withKeyword("DROP").withSpace().withKeyword("TRIGGER").withSpace(); if (ifExistsKw) diff --git a/SQLiteStudio3/coreSQLiteStudio/parser/ast/sqlitedropview.cpp b/SQLiteStudio3/coreSQLiteStudio/parser/ast/sqlitedropview.cpp index 06d70db..b992e98 100644 --- a/SQLiteStudio3/coreSQLiteStudio/parser/ast/sqlitedropview.cpp +++ b/SQLiteStudio3/coreSQLiteStudio/parser/ast/sqlitedropview.cpp @@ -70,7 +70,7 @@ QList SqliteDropView::getFullObjectsInStatement() TokenList SqliteDropView::rebuildTokensFromContents() { StatementTokenBuilder builder; - + builder.withTokens(SqliteQuery::rebuildTokensFromContents()); builder.withKeyword("DROP").withSpace().withKeyword("VIEW").withSpace(); if (ifExistsKw) diff --git a/SQLiteStudio3/coreSQLiteStudio/parser/ast/sqliteinsert.cpp b/SQLiteStudio3/coreSQLiteStudio/parser/ast/sqliteinsert.cpp index 6c26e8d..cb85377 100644 --- a/SQLiteStudio3/coreSQLiteStudio/parser/ast/sqliteinsert.cpp +++ b/SQLiteStudio3/coreSQLiteStudio/parser/ast/sqliteinsert.cpp @@ -167,7 +167,7 @@ void SqliteInsert::initMode(bool replace, SqliteConflictAlgo onConflict) TokenList SqliteInsert::rebuildTokensFromContents() { StatementTokenBuilder builder; - + builder.withTokens(SqliteQuery::rebuildTokensFromContents()); if (with) builder.withStatement(with); diff --git a/SQLiteStudio3/coreSQLiteStudio/parser/ast/sqlitepragma.cpp b/SQLiteStudio3/coreSQLiteStudio/parser/ast/sqlitepragma.cpp index 0e4f056..4660e4f 100644 --- a/SQLiteStudio3/coreSQLiteStudio/parser/ast/sqlitepragma.cpp +++ b/SQLiteStudio3/coreSQLiteStudio/parser/ast/sqlitepragma.cpp @@ -90,7 +90,7 @@ void SqlitePragma::initName(const QString &name1, const QString &name2) TokenList SqlitePragma::rebuildTokensFromContents() { StatementTokenBuilder builder; - + builder.withTokens(SqliteQuery::rebuildTokensFromContents()); builder.withKeyword("PRAGMA").withSpace(); if (!database.isNull()) diff --git a/SQLiteStudio3/coreSQLiteStudio/parser/ast/sqlitequery.cpp b/SQLiteStudio3/coreSQLiteStudio/parser/ast/sqlitequery.cpp index 19c3c40..02eff1d 100644 --- a/SQLiteStudio3/coreSQLiteStudio/parser/ast/sqlitequery.cpp +++ b/SQLiteStudio3/coreSQLiteStudio/parser/ast/sqlitequery.cpp @@ -1,4 +1,5 @@ #include "sqlitequery.h" +#include "parser/statementtokenbuilder.h" SqliteQuery::SqliteQuery() { @@ -49,3 +50,15 @@ bool SqliteQuery::isReadOnly() } return readOnly; } + +TokenList SqliteQuery::rebuildTokensFromContents() +{ + StatementTokenBuilder builder; + if (explain) + { + builder.withKeyword("EXPLAIN").withSpace(); + if (queryPlan) + builder.withKeyword("QUERY").withSpace().withKeyword("PLAN").withSpace(); + } + return builder.build(); +} diff --git a/SQLiteStudio3/coreSQLiteStudio/parser/ast/sqlitequery.h b/SQLiteStudio3/coreSQLiteStudio/parser/ast/sqlitequery.h index 1667dc9..787ccb9 100644 --- a/SQLiteStudio3/coreSQLiteStudio/parser/ast/sqlitequery.h +++ b/SQLiteStudio3/coreSQLiteStudio/parser/ast/sqlitequery.h @@ -20,6 +20,9 @@ class API_EXPORT SqliteQuery : public SqliteStatement bool explain = false; bool queryPlan = false; + + protected: + TokenList rebuildTokensFromContents(); }; /** diff --git a/SQLiteStudio3/coreSQLiteStudio/parser/ast/sqlitereindex.cpp b/SQLiteStudio3/coreSQLiteStudio/parser/ast/sqlitereindex.cpp index 7584a37..6f863f9 100644 --- a/SQLiteStudio3/coreSQLiteStudio/parser/ast/sqlitereindex.cpp +++ b/SQLiteStudio3/coreSQLiteStudio/parser/ast/sqlitereindex.cpp @@ -71,7 +71,7 @@ QList SqliteReindex::getFullObjectsInStatement() TokenList SqliteReindex::rebuildTokensFromContents() { StatementTokenBuilder builder; - + builder.withTokens(SqliteQuery::rebuildTokensFromContents()); builder.withKeyword("REINDEX"); if (!database.isNull()) builder.withOther(database, dialect).withOperator("."); diff --git a/SQLiteStudio3/coreSQLiteStudio/parser/ast/sqliterelease.cpp b/SQLiteStudio3/coreSQLiteStudio/parser/ast/sqliterelease.cpp index 8510524..f71d61c 100644 --- a/SQLiteStudio3/coreSQLiteStudio/parser/ast/sqliterelease.cpp +++ b/SQLiteStudio3/coreSQLiteStudio/parser/ast/sqliterelease.cpp @@ -28,7 +28,7 @@ SqliteStatement*SqliteRelease::clone() TokenList SqliteRelease::rebuildTokensFromContents() { StatementTokenBuilder builder; - + builder.withTokens(SqliteQuery::rebuildTokensFromContents()); builder.withKeyword("RELEASE").withSpace(); if (savepointKw) builder.withKeyword("SAVEPOINT").withSpace(); diff --git a/SQLiteStudio3/coreSQLiteStudio/parser/ast/sqliterollback.cpp b/SQLiteStudio3/coreSQLiteStudio/parser/ast/sqliterollback.cpp index a13fd4c..01284b4 100644 --- a/SQLiteStudio3/coreSQLiteStudio/parser/ast/sqliterollback.cpp +++ b/SQLiteStudio3/coreSQLiteStudio/parser/ast/sqliterollback.cpp @@ -38,7 +38,7 @@ SqliteStatement*SqliteRollback::clone() TokenList SqliteRollback::rebuildTokensFromContents() { StatementTokenBuilder builder; - + builder.withTokens(SqliteQuery::rebuildTokensFromContents()); builder.withKeyword("ROLLBACK").withSpace(); if (transactionKw) builder.withKeyword("TRANSACTION").withSpace(); diff --git a/SQLiteStudio3/coreSQLiteStudio/parser/ast/sqlitesavepoint.cpp b/SQLiteStudio3/coreSQLiteStudio/parser/ast/sqlitesavepoint.cpp index 9003086..1ac50cd 100644 --- a/SQLiteStudio3/coreSQLiteStudio/parser/ast/sqlitesavepoint.cpp +++ b/SQLiteStudio3/coreSQLiteStudio/parser/ast/sqlitesavepoint.cpp @@ -27,6 +27,7 @@ SqliteStatement*SqliteSavepoint::clone() TokenList SqliteSavepoint::rebuildTokensFromContents() { StatementTokenBuilder builder; + builder.withTokens(SqliteQuery::rebuildTokensFromContents()); builder.withKeyword("SAVEPOINT").withSpace().withOther(name, dialect).withOperator(";"); return builder.build(); } diff --git a/SQLiteStudio3/coreSQLiteStudio/parser/ast/sqliteselect.cpp b/SQLiteStudio3/coreSQLiteStudio/parser/ast/sqliteselect.cpp index 5452795..f1b1929 100644 --- a/SQLiteStudio3/coreSQLiteStudio/parser/ast/sqliteselect.cpp +++ b/SQLiteStudio3/coreSQLiteStudio/parser/ast/sqliteselect.cpp @@ -759,6 +759,7 @@ TokenList SqliteSelect::Core::rebuildTokensFromContents() TokenList SqliteSelect::rebuildTokensFromContents() { StatementTokenBuilder builder; + builder.withTokens(SqliteQuery::rebuildTokensFromContents()); if (with) builder.withStatement(with); diff --git a/SQLiteStudio3/coreSQLiteStudio/parser/ast/sqliteupdate.cpp b/SQLiteStudio3/coreSQLiteStudio/parser/ast/sqliteupdate.cpp index 88ac28b..df892fb 100644 --- a/SQLiteStudio3/coreSQLiteStudio/parser/ast/sqliteupdate.cpp +++ b/SQLiteStudio3/coreSQLiteStudio/parser/ast/sqliteupdate.cpp @@ -168,7 +168,7 @@ QList SqliteUpdate::getFullObjectsInStatement() TokenList SqliteUpdate::rebuildTokensFromContents() { StatementTokenBuilder builder; - + builder.withTokens(SqliteQuery::rebuildTokensFromContents()); if (with) builder.withStatement(with); diff --git a/SQLiteStudio3/coreSQLiteStudio/parser/ast/sqlitevacuum.cpp b/SQLiteStudio3/coreSQLiteStudio/parser/ast/sqlitevacuum.cpp index ab7d00e..96ff7a4 100644 --- a/SQLiteStudio3/coreSQLiteStudio/parser/ast/sqlitevacuum.cpp +++ b/SQLiteStudio3/coreSQLiteStudio/parser/ast/sqlitevacuum.cpp @@ -51,6 +51,7 @@ QList SqliteVacuum::getFullObjectsInStatement() TokenList SqliteVacuum::rebuildTokensFromContents() { StatementTokenBuilder builder; + builder.withTokens(SqliteQuery::rebuildTokensFromContents()); builder.withKeyword("VACUUM").withOperator(";"); return builder.build(); } diff --git a/SQLiteStudio3/coreSQLiteStudio/parser/parsercontext.cpp b/SQLiteStudio3/coreSQLiteStudio/parser/parsercontext.cpp index e9444e5..7f8ad7a 100644 --- a/SQLiteStudio3/coreSQLiteStudio/parser/parsercontext.cpp +++ b/SQLiteStudio3/coreSQLiteStudio/parser/parsercontext.cpp @@ -164,6 +164,36 @@ const QList &ParserContext::getErrors() return errors; } +QVariant *ParserContext::handleNumberToken(const QString &tokenValue) +{ + recentNumberIsCandidateForMaxNegative = false; + if (tokenValue.startsWith("0x", Qt::CaseInsensitive)) + { + bool ok; + qint64 i64 = tokenValue.toLongLong(&ok, 16); + if (!ok) + { + quint64 ui64 = tokenValue.toULongLong(&ok, 16); + i64 = static_cast(ui64); + } + return new QVariant(i64); + } + else if (tokenValue == "9223372036854775808") // max negative longlong value, but without a sign + { + recentNumberIsCandidateForMaxNegative = true; + return new QVariant(static_cast(0L)); + } + else + { + return new QVariant(QVariant(tokenValue).toLongLong()); + } +} + +bool ParserContext::isCandidateForMaxNegativeNumber() const +{ + return recentNumberIsCandidateForMaxNegative; +} + void ParserContext::cleanUp() { foreach (ParserError* err, errors) diff --git a/SQLiteStudio3/coreSQLiteStudio/parser/parsercontext.h b/SQLiteStudio3/coreSQLiteStudio/parser/parsercontext.h index d52c021..64ce3a3 100644 --- a/SQLiteStudio3/coreSQLiteStudio/parser/parsercontext.h +++ b/SQLiteStudio3/coreSQLiteStudio/parser/parsercontext.h @@ -187,6 +187,9 @@ class ParserContext */ const QList& getErrors(); + QVariant* handleNumberToken(const QString& tokenValue); + bool isCandidateForMaxNegativeNumber() const; + /** * @brief Flag indicating if the Lemon parser should setup token collections. * @@ -284,6 +287,18 @@ class ParserContext * Defined by errorBeforeNextToken() and minorErrorBeforeNextToken(). */ QString nextTokenError; + + /** + * @brief Indicates that the number value is 1 over the max longlong value. + * + * Then the positive number is over max longlong by 1, then this is a candidate + * for max negative longlong value, but this is to be identified in the next parser reduce level. + * + * Because of that this flag is set to false by default each time the number is parsed and is set afterwards + * to true each timethe value is 1 over max longlong. This way if the 'term' rule includes 'minus' token, + * then it will be properly converted to max negative longlong. + */ + bool recentNumberIsCandidateForMaxNegative = false; }; #endif // PARSERCONTEXT_H diff --git a/SQLiteStudio3/coreSQLiteStudio/parser/sqlite2_parse.cpp b/SQLiteStudio3/coreSQLiteStudio/parser/sqlite2_parse.cpp index 5b65904..ffc1fab 100644 --- a/SQLiteStudio3/coreSQLiteStudio/parser/sqlite2_parse.cpp +++ b/SQLiteStudio3/coreSQLiteStudio/parser/sqlite2_parse.cpp @@ -3832,7 +3832,7 @@ static void yy_reduce( case 250: /* exprx ::= expr not_opt IN nm dbnm */ { yygotominor.yy192 = new SqliteExpr(); - yygotominor.yy192->initIn(yymsp[-4].minor.yy192, yymsp[-3].minor.yy291, *(yymsp[-1].minor.yy319), *(yymsp[0].minor.yy319)); + yygotominor.yy192->initIn(yymsp[-4].minor.yy192, *(yymsp[-3].minor.yy291), *(yymsp[-1].minor.yy319), *(yymsp[0].minor.yy319)); delete yymsp[-3].minor.yy291; delete yymsp[-1].minor.yy319; objectForTokens = yygotominor.yy192; diff --git a/SQLiteStudio3/coreSQLiteStudio/parser/sqlite2_parse.y b/SQLiteStudio3/coreSQLiteStudio/parser/sqlite2_parse.y index d6ee4f7..472725e 100644 --- a/SQLiteStudio3/coreSQLiteStudio/parser/sqlite2_parse.y +++ b/SQLiteStudio3/coreSQLiteStudio/parser/sqlite2_parse.y @@ -1513,7 +1513,7 @@ exprx(X) ::= expr(E) not_opt(N) IN LP exprx(X) ::= expr(E) not_opt(N) IN nm(N1) dbnm(N2). [IN] { X = new SqliteExpr(); - X->initIn(E, N, *(N1), *(N2)); + X->initIn(E, *(N), *(N1), *(N2)); delete N; delete N1; objectForTokens = X; diff --git a/SQLiteStudio3/coreSQLiteStudio/parser/sqlite3_parse.cpp b/SQLiteStudio3/coreSQLiteStudio/parser/sqlite3_parse.cpp index 646c533..fa8a9d1 100644 --- a/SQLiteStudio3/coreSQLiteStudio/parser/sqlite3_parse.cpp +++ b/SQLiteStudio3/coreSQLiteStudio/parser/sqlite3_parse.cpp @@ -51,6 +51,7 @@ #include "parser/ast/sqlitewith.h" #include #include +#include #define assert(X) Q_ASSERT(X) #define UNUSED_PARAMETER(X) (void)(X) @@ -242,7 +243,7 @@ static const YYMINORTYPE yyzerominor = { 0 }; ** shifting non-terminals after a reduce. ** yy_default[] Default action for each state. */ -#define YY_ACTTAB_COUNT (2282) +#define YY_ACTTAB_COUNT (2263) static const YYACTIONTYPE yy_action[] = { /* 0 */ 431, 48, 48, 47, 47, 47, 46, 216, 716, 339, /* 10 */ 643, 425, 51, 51, 51, 51, 44, 49, 49, 49, @@ -413,66 +414,64 @@ static const YYACTIONTYPE yy_action[] = { /* 1660 */ 499, 478, 699, 428, 715, 714, 713, 4, 1037, 425, /* 1670 */ 714, 713, 642, 416, 422, 715, 430, 687, 429, 641, /* 1680 */ 428, 350, 690, 619, 686, 172, 641, 494, 454, 642, - /* 1690 */ 689, 688, 687, 430, 111, 428, 411, 286, 337, 714, - /* 1700 */ 713, 686, 190, 714, 713, 621, 287, 72, 430, 428, - /* 1710 */ 715, 428, 436, 685, 209, 558, 686, 188, 41, 715, - /* 1720 */ 567, 287, 430, 642, 430, 676, 9, 642, 716, 96, - /* 1730 */ 686, 196, 686, 195, 715, 38, 39, 641, 716, 283, - /* 1740 */ 431, 327, 40, 716, 207, 428, 203, 319, 150, 428, - /* 1750 */ 4, 425, 715, 318, 641, 642, 325, 422, 430, 716, - /* 1760 */ 687, 429, 430, 719, 716, 690, 686, 197, 709, 641, - /* 1770 */ 686, 201, 642, 689, 688, 687, 428, 224, 411, 716, - /* 1780 */ 261, 716, 86, 641, 221, 641, 708, 651, 258, 430, - /* 1790 */ 428, 695, 220, 715, 428, 685, 420, 686, 232, 227, - /* 1800 */ 41, 715, 651, 430, 715, 433, 642, 430, 676, 9, - /* 1810 */ 642, 686, 290, 428, 707, 686, 191, 38, 39, 641, - /* 1820 */ 149, 147, 431, 641, 40, 257, 430, 82, 432, 256, - /* 1830 */ 714, 713, 4, 425, 686, 194, 679, 642, 715, 422, - /* 1840 */ 714, 713, 714, 429, 716, 714, 713, 690, 716, 715, - /* 1850 */ 641, 367, 428, 15, 642, 689, 688, 687, 428, 684, - /* 1860 */ 411, 714, 713, 700, 641, 430, 714, 713, 641, 145, - /* 1870 */ 17, 430, 476, 686, 193, 234, 521, 685, 294, 686, - /* 1880 */ 185, 714, 713, 714, 713, 293, 400, 641, 642, 428, - /* 1890 */ 676, 9, 642, 541, 428, 502, 292, 28, 529, 38, - /* 1900 */ 39, 474, 430, 291, 248, 408, 40, 430, 481, 428, - /* 1910 */ 686, 189, 55, 683, 4, 686, 314, 715, 715, 642, - /* 1920 */ 428, 422, 430, 463, 687, 429, 641, 428, 716, 690, - /* 1930 */ 686, 313, 641, 430, 402, 216, 642, 689, 688, 687, - /* 1940 */ 430, 686, 312, 428, 536, 428, 714, 713, 686, 184, - /* 1950 */ 714, 713, 43, 640, 419, 66, 430, 229, 430, 214, - /* 1960 */ 415, 228, 34, 641, 686, 171, 686, 170, 641, 637, - /* 1970 */ 642, 635, 676, 9, 642, 428, 141, 626, 428, 622, - /* 1980 */ 246, 139, 715, 641, 477, 428, 108, 389, 430, 428, - /* 1990 */ 715, 430, 715, 715, 641, 386, 686, 183, 430, 686, - /* 2000 */ 169, 641, 430, 380, 577, 471, 686, 186, 617, 244, - /* 2010 */ 686, 168, 428, 473, 133, 428, 242, 641, 330, 641, - /* 2020 */ 470, 715, 715, 583, 578, 430, 277, 715, 430, 715, - /* 2030 */ 714, 713, 428, 686, 167, 428, 686, 93, 574, 716, - /* 2040 */ 535, 573, 443, 572, 716, 430, 547, 128, 430, 641, - /* 2050 */ 310, 428, 641, 686, 166, 428, 686, 164, 428, 641, - /* 2060 */ 716, 236, 716, 641, 430, 322, 546, 716, 430, 428, - /* 2070 */ 393, 430, 686, 174, 715, 554, 686, 173, 309, 686, - /* 2080 */ 175, 716, 430, 715, 716, 275, 641, 716, 545, 641, - /* 2090 */ 686, 178, 428, 80, 428, 568, 716, 428, 715, 428, - /* 2100 */ 544, 716, 127, 106, 716, 430, 641, 430, 715, 641, - /* 2110 */ 430, 549, 430, 686, 94, 686, 177, 428, 686, 176, - /* 2120 */ 686, 180, 269, 428, 715, 641, 212, 392, 126, 641, - /* 2130 */ 430, 354, 641, 262, 24, 715, 430, 526, 686, 179, - /* 2140 */ 430, 714, 713, 641, 686, 165, 714, 713, 686, 70, - /* 2150 */ 124, 363, 78, 527, 123, 105, 121, 155, 523, 513, - /* 2160 */ 84, 104, 714, 713, 714, 713, 641, 348, 641, 714, - /* 2170 */ 713, 641, 263, 641, 518, 360, 492, 489, 120, 493, - /* 2180 */ 441, 480, 103, 714, 713, 715, 714, 713, 715, 714, - /* 2190 */ 713, 641, 648, 118, 345, 347, 76, 641, 714, 713, - /* 2200 */ 442, 641, 343, 714, 713, 427, 714, 713, 715, 284, - /* 2210 */ 264, 253, 117, 715, 250, 241, 75, 116, 715, 115, - /* 2220 */ 237, 74, 715, 715, 715, 73, 238, 715, 715, 114, - /* 2230 */ 323, 113, 23, 715, 451, 652, 20, 449, 101, 715, - /* 2240 */ 100, 445, 112, 61, 439, 162, 295, 669, 655, 623, - /* 2250 */ 412, 665, 520, 628, 618, 278, 569, 260, 198, 361, - /* 2260 */ 305, 374, 681, 522, 664, 6, 654, 556, 211, 45, - /* 2270 */ 364, 487, 566, 560, 296, 559, 409, 81, 71, 587, - /* 2280 */ 586, 550, + /* 1690 */ 689, 688, 687, 430, 111, 428, 411, 716, 72, 714, + /* 1700 */ 713, 686, 190, 714, 713, 621, 287, 337, 430, 428, + /* 1710 */ 436, 428, 96, 685, 209, 558, 686, 188, 41, 715, + /* 1720 */ 567, 287, 430, 642, 430, 676, 9, 642, 716, 207, + /* 1730 */ 686, 196, 686, 195, 715, 38, 39, 641, 716, 286, + /* 1740 */ 431, 327, 40, 224, 86, 428, 695, 319, 203, 428, + /* 1750 */ 4, 425, 715, 318, 641, 642, 325, 422, 430, 715, + /* 1760 */ 687, 429, 430, 150, 261, 690, 686, 197, 221, 641, + /* 1770 */ 686, 201, 642, 689, 688, 687, 428, 715, 411, 716, + /* 1780 */ 719, 709, 708, 641, 433, 641, 707, 651, 258, 430, + /* 1790 */ 428, 283, 220, 536, 428, 685, 149, 686, 232, 714, + /* 1800 */ 713, 715, 651, 430, 715, 147, 642, 430, 676, 9, + /* 1810 */ 642, 686, 290, 428, 82, 686, 191, 38, 39, 641, + /* 1820 */ 679, 367, 432, 641, 40, 15, 430, 145, 700, 234, + /* 1830 */ 714, 713, 4, 715, 686, 194, 408, 642, 420, 422, + /* 1840 */ 714, 713, 687, 429, 716, 428, 684, 690, 637, 715, + /* 1850 */ 641, 227, 428, 294, 642, 689, 688, 687, 430, 716, + /* 1860 */ 293, 715, 428, 17, 641, 430, 686, 193, 641, 292, + /* 1870 */ 400, 291, 402, 686, 185, 430, 521, 28, 683, 55, + /* 1880 */ 428, 714, 713, 686, 189, 43, 428, 641, 642, 640, + /* 1890 */ 676, 9, 642, 430, 216, 419, 428, 66, 529, 430, + /* 1900 */ 428, 686, 314, 428, 229, 214, 228, 686, 313, 430, + /* 1910 */ 428, 415, 34, 430, 141, 626, 430, 686, 312, 641, + /* 1920 */ 428, 686, 184, 430, 686, 171, 641, 428, 715, 635, + /* 1930 */ 139, 686, 170, 430, 108, 386, 641, 716, 463, 622, + /* 1940 */ 430, 686, 183, 428, 617, 428, 714, 713, 686, 169, + /* 1950 */ 428, 716, 715, 389, 641, 583, 430, 715, 430, 380, + /* 1960 */ 641, 714, 713, 430, 686, 186, 686, 168, 428, 716, + /* 1970 */ 641, 686, 167, 541, 641, 428, 578, 641, 716, 257, + /* 1980 */ 133, 430, 577, 256, 641, 428, 474, 428, 430, 686, + /* 1990 */ 93, 428, 715, 715, 641, 716, 686, 166, 430, 716, + /* 2000 */ 430, 641, 330, 716, 430, 716, 686, 164, 686, 174, + /* 2010 */ 428, 277, 686, 173, 393, 428, 275, 641, 716, 641, + /* 2020 */ 716, 568, 574, 430, 641, 428, 573, 715, 430, 715, + /* 2030 */ 428, 686, 175, 489, 715, 428, 686, 178, 430, 714, + /* 2040 */ 713, 572, 641, 430, 716, 428, 686, 94, 430, 641, + /* 2050 */ 310, 686, 177, 714, 713, 128, 686, 176, 430, 641, + /* 2060 */ 554, 641, 549, 716, 428, 641, 686, 180, 716, 428, + /* 2070 */ 716, 714, 713, 716, 392, 715, 547, 430, 546, 545, + /* 2080 */ 714, 713, 430, 502, 641, 686, 179, 430, 544, 641, + /* 2090 */ 686, 165, 527, 309, 80, 686, 70, 714, 713, 641, + /* 2100 */ 535, 714, 713, 269, 641, 714, 713, 714, 713, 641, + /* 2110 */ 127, 106, 471, 523, 248, 263, 715, 518, 481, 641, + /* 2120 */ 714, 713, 714, 713, 476, 212, 246, 715, 715, 244, + /* 2130 */ 477, 126, 492, 473, 480, 262, 242, 354, 641, 715, + /* 2140 */ 470, 236, 715, 641, 360, 322, 714, 713, 641, 715, + /* 2150 */ 347, 363, 24, 652, 715, 442, 427, 715, 443, 441, + /* 2160 */ 124, 284, 526, 715, 648, 714, 713, 264, 715, 715, + /* 2170 */ 714, 713, 714, 713, 715, 714, 713, 253, 78, 250, + /* 2180 */ 715, 241, 237, 238, 105, 123, 121, 84, 104, 155, + /* 2190 */ 715, 513, 715, 120, 715, 715, 715, 493, 348, 103, + /* 2200 */ 118, 345, 76, 343, 117, 75, 116, 115, 114, 74, + /* 2210 */ 73, 113, 23, 323, 451, 101, 20, 100, 623, 112, + /* 2220 */ 61, 520, 449, 445, 439, 655, 628, 162, 278, 669, + /* 2230 */ 665, 412, 569, 295, 681, 198, 374, 522, 618, 260, + /* 2240 */ 361, 6, 305, 664, 654, 556, 364, 409, 566, 211, + /* 2250 */ 296, 71, 560, 559, 487, 587, 586, 81, 550, 1150, + /* 2260 */ 1150, 1150, 45, }; static const YYCODETYPE yy_lookahead[] = { /* 0 */ 4, 81, 82, 83, 84, 85, 86, 87, 4, 58, @@ -644,107 +643,105 @@ static const YYCODETYPE yy_lookahead[] = { /* 1660 */ 11, 103, 177, 177, 190, 106, 107, 96, 97, 15, /* 1670 */ 106, 107, 101, 276, 103, 190, 190, 106, 107, 251, /* 1680 */ 177, 32, 111, 141, 198, 199, 251, 162, 97, 118, - /* 1690 */ 119, 120, 121, 190, 93, 177, 42, 177, 37, 106, - /* 1700 */ 107, 198, 199, 106, 107, 141, 177, 95, 190, 177, - /* 1710 */ 190, 177, 36, 59, 252, 118, 198, 199, 64, 190, - /* 1720 */ 127, 177, 190, 152, 190, 154, 155, 156, 4, 189, + /* 1690 */ 119, 120, 121, 190, 93, 177, 42, 4, 95, 106, + /* 1700 */ 107, 198, 199, 106, 107, 141, 177, 37, 190, 177, + /* 1710 */ 36, 177, 189, 59, 252, 118, 198, 199, 64, 190, + /* 1720 */ 127, 177, 190, 152, 190, 154, 155, 156, 4, 238, /* 1730 */ 198, 199, 198, 199, 190, 81, 82, 251, 4, 177, - /* 1740 */ 4, 212, 88, 4, 238, 177, 273, 275, 90, 177, - /* 1750 */ 96, 15, 190, 275, 251, 101, 212, 103, 190, 4, - /* 1760 */ 106, 107, 190, 176, 4, 111, 198, 199, 176, 251, - /* 1770 */ 198, 199, 118, 119, 120, 121, 177, 204, 42, 4, - /* 1780 */ 177, 4, 204, 251, 181, 251, 176, 258, 177, 190, - /* 1790 */ 177, 177, 181, 190, 177, 59, 276, 198, 199, 237, - /* 1800 */ 64, 190, 258, 190, 190, 176, 152, 190, 154, 155, - /* 1810 */ 156, 198, 199, 177, 49, 198, 199, 81, 82, 251, - /* 1820 */ 178, 178, 4, 251, 88, 177, 190, 180, 183, 181, - /* 1830 */ 106, 107, 96, 15, 198, 199, 177, 101, 190, 103, - /* 1840 */ 106, 107, 106, 107, 4, 106, 107, 111, 4, 190, - /* 1850 */ 251, 60, 177, 104, 118, 119, 120, 121, 177, 221, - /* 1860 */ 42, 106, 107, 184, 251, 190, 106, 107, 251, 56, - /* 1870 */ 151, 190, 133, 198, 199, 138, 152, 59, 227, 198, - /* 1880 */ 199, 106, 107, 106, 107, 228, 148, 251, 152, 177, - /* 1890 */ 154, 155, 156, 118, 177, 118, 229, 149, 164, 81, - /* 1900 */ 82, 146, 190, 230, 177, 177, 88, 190, 181, 177, - /* 1910 */ 198, 199, 150, 231, 96, 198, 199, 190, 190, 101, - /* 1920 */ 177, 103, 190, 163, 106, 107, 251, 177, 4, 111, - /* 1930 */ 198, 199, 251, 190, 147, 87, 118, 119, 120, 121, - /* 1940 */ 190, 198, 199, 177, 100, 177, 106, 107, 198, 199, - /* 1950 */ 106, 107, 252, 64, 203, 96, 190, 259, 190, 87, - /* 1960 */ 203, 255, 158, 251, 198, 199, 198, 199, 251, 177, - /* 1970 */ 152, 241, 154, 155, 156, 177, 99, 177, 177, 177, - /* 1980 */ 177, 241, 190, 251, 181, 177, 99, 223, 190, 177, - /* 1990 */ 190, 190, 190, 190, 251, 139, 198, 199, 190, 198, - /* 2000 */ 199, 251, 190, 123, 208, 165, 198, 199, 177, 177, - /* 2010 */ 198, 199, 177, 181, 177, 177, 177, 251, 31, 251, - /* 2020 */ 181, 190, 190, 200, 200, 190, 200, 190, 190, 190, - /* 2030 */ 106, 107, 177, 198, 199, 177, 198, 199, 202, 4, - /* 2040 */ 241, 122, 118, 200, 4, 190, 200, 99, 190, 251, - /* 2050 */ 203, 177, 251, 198, 199, 177, 198, 199, 177, 251, - /* 2060 */ 4, 177, 4, 251, 190, 181, 200, 4, 190, 177, - /* 2070 */ 177, 190, 198, 199, 190, 208, 198, 199, 203, 198, - /* 2080 */ 199, 4, 190, 190, 4, 177, 251, 4, 200, 251, - /* 2090 */ 198, 199, 177, 180, 177, 177, 4, 177, 190, 177, - /* 2100 */ 200, 4, 99, 180, 4, 190, 251, 190, 190, 251, - /* 2110 */ 190, 177, 190, 198, 199, 198, 199, 177, 198, 199, - /* 2120 */ 198, 199, 177, 177, 190, 251, 241, 177, 99, 251, - /* 2130 */ 190, 27, 251, 264, 158, 190, 190, 227, 198, 199, - /* 2140 */ 190, 106, 107, 251, 198, 199, 106, 107, 198, 199, - /* 2150 */ 99, 265, 215, 118, 99, 62, 99, 250, 118, 215, - /* 2160 */ 96, 180, 106, 107, 106, 107, 251, 241, 251, 106, - /* 2170 */ 107, 251, 177, 251, 118, 177, 118, 100, 99, 227, - /* 2180 */ 100, 118, 180, 106, 107, 190, 106, 107, 190, 106, - /* 2190 */ 107, 251, 100, 99, 241, 177, 217, 251, 106, 107, - /* 2200 */ 177, 251, 60, 106, 107, 177, 106, 107, 190, 177, - /* 2210 */ 177, 177, 99, 190, 177, 177, 217, 99, 190, 99, - /* 2220 */ 177, 217, 190, 190, 190, 217, 177, 190, 190, 99, - /* 2230 */ 241, 99, 268, 190, 18, 152, 268, 241, 99, 190, - /* 2240 */ 99, 241, 99, 270, 16, 224, 226, 261, 201, 152, - /* 2250 */ 256, 261, 152, 240, 242, 201, 206, 242, 210, 242, - /* 2260 */ 175, 202, 191, 227, 191, 224, 191, 191, 262, 253, - /* 2270 */ 263, 274, 207, 207, 222, 207, 216, 55, 239, 198, - /* 2280 */ 198, 211, + /* 1740 */ 4, 212, 88, 204, 204, 177, 177, 275, 273, 177, + /* 1750 */ 96, 15, 190, 275, 251, 101, 212, 103, 190, 190, + /* 1760 */ 106, 107, 190, 90, 177, 111, 198, 199, 181, 251, + /* 1770 */ 198, 199, 118, 119, 120, 121, 177, 190, 42, 4, + /* 1780 */ 176, 176, 176, 251, 176, 251, 49, 258, 177, 190, + /* 1790 */ 177, 177, 181, 100, 177, 59, 178, 198, 199, 106, + /* 1800 */ 107, 190, 258, 190, 190, 178, 152, 190, 154, 155, + /* 1810 */ 156, 198, 199, 177, 180, 198, 199, 81, 82, 251, + /* 1820 */ 177, 60, 183, 251, 88, 104, 190, 56, 184, 138, + /* 1830 */ 106, 107, 96, 190, 198, 199, 177, 101, 276, 103, + /* 1840 */ 106, 107, 106, 107, 4, 177, 221, 111, 177, 190, + /* 1850 */ 251, 237, 177, 227, 118, 119, 120, 121, 190, 4, + /* 1860 */ 228, 190, 177, 151, 251, 190, 198, 199, 251, 229, + /* 1870 */ 148, 230, 147, 198, 199, 190, 152, 149, 231, 150, + /* 1880 */ 177, 106, 107, 198, 199, 252, 177, 251, 152, 64, + /* 1890 */ 154, 155, 156, 190, 87, 203, 177, 96, 164, 190, + /* 1900 */ 177, 198, 199, 177, 259, 87, 255, 198, 199, 190, + /* 1910 */ 177, 203, 158, 190, 99, 177, 190, 198, 199, 251, + /* 1920 */ 177, 198, 199, 190, 198, 199, 251, 177, 190, 241, + /* 1930 */ 241, 198, 199, 190, 99, 139, 251, 4, 163, 177, + /* 1940 */ 190, 198, 199, 177, 177, 177, 106, 107, 198, 199, + /* 1950 */ 177, 4, 190, 223, 251, 200, 190, 190, 190, 123, + /* 1960 */ 251, 106, 107, 190, 198, 199, 198, 199, 177, 4, + /* 1970 */ 251, 198, 199, 118, 251, 177, 200, 251, 4, 177, + /* 1980 */ 177, 190, 208, 181, 251, 177, 146, 177, 190, 198, + /* 1990 */ 199, 177, 190, 190, 251, 4, 198, 199, 190, 4, + /* 2000 */ 190, 251, 31, 4, 190, 4, 198, 199, 198, 199, + /* 2010 */ 177, 200, 198, 199, 177, 177, 177, 251, 4, 251, + /* 2020 */ 4, 177, 202, 190, 251, 177, 122, 190, 190, 190, + /* 2030 */ 177, 198, 199, 100, 190, 177, 198, 199, 190, 106, + /* 2040 */ 107, 200, 251, 190, 4, 177, 198, 199, 190, 251, + /* 2050 */ 203, 198, 199, 106, 107, 99, 198, 199, 190, 251, + /* 2060 */ 208, 251, 177, 4, 177, 251, 198, 199, 4, 177, + /* 2070 */ 4, 106, 107, 4, 177, 190, 200, 190, 200, 200, + /* 2080 */ 106, 107, 190, 118, 251, 198, 199, 190, 200, 251, + /* 2090 */ 198, 199, 118, 203, 180, 198, 199, 106, 107, 251, + /* 2100 */ 241, 106, 107, 177, 251, 106, 107, 106, 107, 251, + /* 2110 */ 99, 180, 165, 118, 177, 177, 190, 118, 181, 251, + /* 2120 */ 106, 107, 106, 107, 133, 241, 177, 190, 190, 177, + /* 2130 */ 181, 99, 118, 181, 118, 264, 177, 27, 251, 190, + /* 2140 */ 181, 177, 190, 251, 177, 181, 106, 107, 251, 190, + /* 2150 */ 177, 265, 158, 152, 190, 177, 177, 190, 118, 100, + /* 2160 */ 99, 177, 227, 190, 100, 106, 107, 177, 190, 190, + /* 2170 */ 106, 107, 106, 107, 190, 106, 107, 177, 215, 177, + /* 2180 */ 190, 177, 177, 177, 62, 99, 99, 96, 180, 250, + /* 2190 */ 190, 215, 190, 99, 190, 190, 190, 227, 241, 180, + /* 2200 */ 99, 241, 217, 60, 99, 217, 99, 99, 99, 217, + /* 2210 */ 217, 99, 268, 241, 18, 99, 268, 99, 152, 99, + /* 2220 */ 270, 152, 241, 241, 16, 201, 240, 224, 201, 261, + /* 2230 */ 261, 256, 206, 226, 191, 210, 202, 227, 242, 242, + /* 2240 */ 242, 224, 175, 191, 191, 191, 263, 216, 207, 262, + /* 2250 */ 222, 239, 207, 207, 274, 198, 198, 55, 211, 277, + /* 2260 */ 277, 277, 253, }; #define YY_SHIFT_USE_DFLT (-81) #define YY_SHIFT_COUNT (434) #define YY_SHIFT_MIN (-80) -#define YY_SHIFT_MAX (2228) +#define YY_SHIFT_MAX (2208) static const short yy_shift_ofst[] = { /* 0 */ 1158, -4, 201, 1182, 819, 1571, 1571, 689, 361, 1489, /* 10 */ 1654, 1654, 770, 364, 364, 157, 81, 179, 1406, 1323, /* 20 */ 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, /* 30 */ 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, /* 40 */ 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, - /* 50 */ 1654, 1654, 1654, 1654, 1654, 1736, 1654, 1818, 370, 798, - /* 60 */ 181, 370, 2083, 2083, 2083, 2083, 2083, 887, 887, 565, + /* 50 */ 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1736, 370, 798, + /* 60 */ 181, 370, 2001, 2001, 2001, 2001, 2001, 887, 887, 565, /* 70 */ 277, 4, 1510, 1492, 1458, 1375, 1449, 1434, 1431, 1427, - /* 80 */ 1379, 448, 1399, 2097, 2097, 2100, 439, 2097, 2092, 2083, + /* 80 */ 1379, 448, 1399, 2066, 2066, 2069, 439, 2066, 2064, 2001, /* 90 */ 565, 1039, 538, 538, 735, 84, 44, 171, 859, 775, /* 100 */ 906, 773, 910, 636, 1172, 5, 450, 5, 443, 413, - /* 110 */ 185, 2080, 1924, 1760, 1840, 1755, 1739, 2063, 2077, 2058, - /* 120 */ 1525, 2056, 1724, 2040, 2035, 1777, 1734, 1517, 1844, 1775, + /* 110 */ 185, 2059, 2040, 1775, 1947, 1840, 1991, 2016, 1933, 2014, + /* 120 */ 1525, 1999, 1724, 1995, 1974, 1965, 1734, 1517, 1693, 1855, /* 130 */ 1047, 1593, 1597, 902, 140, 1542, 1542, 1436, 1564, 1542, /* 140 */ 1236, 780, 1409, 349, 562, 216, 620, 1559, 1515, 1348, - /* 150 */ 90, 829, 829, 829, 872, 544, 2222, 2222, 2222, 2222, - /* 160 */ 2222, -81, -81, 459, 619, 619, 619, 619, 619, 619, + /* 150 */ 90, 829, 829, 829, 872, 544, 2202, 2202, 2202, 2202, + /* 160 */ 2202, -81, -81, 459, 619, 619, 619, 619, 619, 619, /* 170 */ 619, 619, 619, 645, 327, 683, 1180, 1149, 1117, 1087, /* 180 */ 1051, 1021, 985, 958, 916, 767, 1239, 1212, 1276, 509, /* 190 */ 509, -60, -38, -38, -38, -38, 578, -80, 314, 87, /* 200 */ 87, 41, 155, 75, 58, 58, 58, -6, 186, 862, /* 210 */ -47, 808, 1649, 1463, 1284, 206, 908, 424, 400, 25, /* 220 */ 729, 729, 679, 1364, -2, 855, 729, 442, 346, 855, - /* 230 */ 750, 750, 187, -9, 169, 2228, 2143, 2141, 2139, 2216, - /* 240 */ 2216, 2132, 2130, 2142, 2120, 2142, 2118, 2142, 2113, 2142, - /* 250 */ 2094, 1791, 1719, 2079, 1791, 2093, 2064, 2057, 2055, 2093, - /* 260 */ 1719, 2051, 1976, 2104, 2029, 1791, 2003, 1791, 1948, 1859, - /* 270 */ 1880, 1880, 1880, 1880, 1987, 1859, 1880, 1919, 1880, 1987, - /* 280 */ 1880, 1880, 1856, 1887, 1877, 1804, 1859, 1872, 1859, 1889, - /* 290 */ 1848, 1762, 1787, 1748, 1738, 1719, 1737, 1813, 1749, 1791, - /* 300 */ 1765, 1765, 1658, 1658, 1658, 1658, -81, -81, -81, -81, + /* 230 */ 750, 750, 187, -9, 169, 2208, 2120, 2118, 2116, 2196, + /* 240 */ 2196, 2112, 2109, 2143, 2108, 2143, 2107, 2143, 2105, 2143, + /* 250 */ 2101, 1761, 1712, 2094, 1761, 2122, 2091, 2087, 2086, 2122, + /* 260 */ 1712, 2061, 1994, 2110, 2032, 1761, 2011, 1761, 1956, 1801, + /* 270 */ 1836, 1836, 1836, 1836, 1971, 1801, 1836, 1904, 1836, 1971, + /* 280 */ 1836, 1836, 1796, 1835, 1815, 1754, 1801, 1818, 1801, 1825, + /* 290 */ 1807, 1729, 1725, 1728, 1722, 1712, 1691, 1771, 1721, 1761, + /* 300 */ 1737, 1737, 1673, 1673, 1673, 1673, -81, -81, -81, -81, /* 310 */ -81, -81, -81, -81, -81, -81, 564, 79, 158, 45, /* 320 */ 702, 243, -49, 398, 1362, 1321, 1042, 984, 788, 2, - /* 330 */ 471, -20, 758, 678, 344, 144, -44, 1676, 1661, 1601, - /* 340 */ 1612, 1591, 1549, 1558, 1543, 1511, 1541, 1519, 1496, 1459, + /* 330 */ 471, -20, 758, 678, 344, 144, -44, 1674, 1670, 1601, + /* 340 */ 1603, 1591, 1549, 1558, 1543, 1511, 1541, 1519, 1496, 1459, /* 350 */ 1575, 1484, 1545, 1536, 1550, 1490, 1487, 1418, 1420, 1483, /* 360 */ 1480, 1419, 1402, 1527, 1407, 1424, 1417, 1433, 1389, 1380, /* 370 */ 1405, 1454, 1394, 1393, 1377, 1368, 1425, 1444, 1327, 1369, @@ -758,40 +755,40 @@ static const short yy_shift_ofst[] = { #define YY_REDUCE_USE_DFLT (-100) #define YY_REDUCE_COUNT (315) #define YY_REDUCE_MIN (-99) -#define YY_REDUCE_MAX (2085) +#define YY_REDUCE_MAX (2067) static const short yy_reduce_ofst[] = { /* 0 */ 615, 1195, 699, -99, 764, 1138, 189, 705, 1259, 1218, - /* 10 */ 1201, 261, 196, 884, 599, 1187, 1950, 1946, 1940, 1922, - /* 20 */ 1920, 1917, 1915, 1892, 1881, 1878, 1874, 1858, 1855, 1838, - /* 30 */ 1835, 1812, 1808, 1801, 1798, 1768, 1766, 1750, 1743, 1732, - /* 40 */ 1717, 1712, 1681, 1675, 1636, 1617, 1613, 1599, 1572, 1568, + /* 10 */ 1201, 261, 196, 884, 599, 1187, 1897, 1892, 1887, 1868, + /* 20 */ 1858, 1853, 1848, 1838, 1833, 1814, 1810, 1808, 1798, 1791, + /* 30 */ 1773, 1768, 1766, 1750, 1743, 1733, 1726, 1723, 1719, 1709, + /* 40 */ 1703, 1685, 1675, 1668, 1636, 1617, 1613, 1599, 1572, 1568, /* 50 */ 1534, 1532, 1518, 1503, 1486, 1435, 1428, 1404, 490, 1401, /* 60 */ 214, 769, 1544, 1529, 1225, 124, 67, 596, 175, 547, - /* 70 */ 1221, 1562, 1884, 1839, 1832, 1803, 1727, 1648, 1611, 1603, - /* 80 */ 1270, 1520, 203, 1346, 1255, 131, 347, 950, 1397, 195, - /* 90 */ 885, 265, 1134, 1132, 125, 377, 1011, 2049, 2043, 2028, - /* 100 */ 1792, 1792, 2038, 2037, 2034, 697, 2033, 11, 1792, 2032, - /* 110 */ 2028, 2023, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 2018, - /* 120 */ 1792, 1792, 1998, 1792, 1792, 1995, 1792, 1792, 1792, 1945, - /* 130 */ 1934, 1918, 1908, 1893, 1837, 1141, 1140, 1831, 1802, 1065, - /* 140 */ 1800, 1792, 1728, 1659, 1614, 1485, 632, 1474, 1452, 1294, + /* 70 */ 1221, 1614, 1964, 1959, 1952, 1949, 1937, 1802, 1611, 1587, + /* 80 */ 1270, 1562, 203, 1346, 1255, 131, 347, 950, 1397, 195, + /* 90 */ 885, 265, 1134, 1132, 125, 377, 1011, 2006, 2005, 1979, + /* 100 */ 1671, 1671, 2004, 2002, 2000, 697, 1990, 11, 1671, 1984, + /* 110 */ 1979, 1978, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1973, + /* 120 */ 1671, 1671, 1967, 1671, 1671, 1938, 1671, 1671, 1671, 1926, + /* 130 */ 1885, 1844, 1839, 1837, 1803, 1141, 1140, 1767, 1762, 1065, + /* 140 */ 1738, 1671, 1659, 1643, 1569, 1485, 632, 1474, 1452, 1294, /* 150 */ 1232, 1191, 666, 489, 938, 1022, 1020, 956, 924, 791, /* 160 */ 763, 746, 205, 1462, 1462, 1462, 1462, 1462, 1462, 1462, /* 170 */ 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, /* 180 */ 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, - /* 190 */ 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 2070, 2082, - /* 200 */ 2081, 1462, 1997, 1997, 2068, 2066, 2065, 2039, 2060, 2016, - /* 210 */ 2052, 2007, 2006, 2076, 2075, 2073, 2071, 2041, 2085, 2036, - /* 220 */ 2017, 2015, 2059, 2048, 2050, 2054, 2012, 2013, 1994, 2047, - /* 230 */ 1990, 1986, 1462, 2020, 2021, 1973, 1799, 2000, 1996, 1968, - /* 240 */ 1964, 1989, 1799, 2008, 1799, 2004, 1799, 1999, 1799, 1979, - /* 250 */ 1953, 2002, 1952, 1926, 1981, 1944, 1907, 1799, 1799, 1937, - /* 260 */ 1910, 1799, 1886, 1869, 1885, 1923, 1799, 1913, 1799, 1875, - /* 270 */ 1900, 1888, 1866, 1846, 1867, 1847, 1843, 1836, 1826, 1796, - /* 280 */ 1824, 1823, 1764, 1740, 1730, 1706, 1757, 1698, 1751, 1700, - /* 290 */ 1462, 1682, 1673, 1667, 1657, 1651, 1638, 1679, 1645, 1647, - /* 300 */ 1643, 1642, 1629, 1610, 1592, 1587, 1478, 1472, 1473, 1578, - /* 310 */ 1573, 1506, 1462, 1462, 1462, 1540, + /* 190 */ 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 2047, 2058, + /* 200 */ 2057, 1462, 1980, 1980, 2046, 2045, 2041, 2012, 2031, 2009, + /* 210 */ 2028, 1983, 1987, 2054, 2053, 2052, 2043, 2017, 2067, 2010, + /* 220 */ 1998, 1997, 2034, 2025, 2026, 2027, 1996, 1986, 1975, 2024, + /* 230 */ 1969, 1968, 1462, 2007, 2003, 1950, 1859, 1982, 1981, 1948, + /* 240 */ 1944, 1972, 1859, 1993, 1859, 1992, 1859, 1988, 1859, 1985, + /* 250 */ 1960, 2019, 1970, 1957, 2008, 1976, 1939, 1859, 1859, 1963, + /* 260 */ 1935, 1859, 1886, 1871, 1884, 1931, 1859, 1914, 1859, 1890, + /* 270 */ 1888, 1879, 1878, 1876, 1852, 1847, 1841, 1820, 1811, 1774, + /* 280 */ 1776, 1755, 1730, 1689, 1688, 1651, 1708, 1645, 1692, 1633, + /* 290 */ 1462, 1647, 1641, 1640, 1632, 1626, 1625, 1644, 1639, 1634, + /* 300 */ 1627, 1618, 1608, 1606, 1605, 1604, 1478, 1472, 1475, 1540, + /* 310 */ 1539, 1491, 1462, 1462, 1462, 1523, }; static const YYACTIONTYPE yy_default[] = { /* 0 */ 729, 1037, 1142, 1142, 1026, 1026, 1026, 1142, 1026, 1026, @@ -3183,23 +3180,15 @@ static void yy_reduce( } break; case 81: /* term ::= NULL */ -{ - yygotominor.yy21 = new QVariant(); - } +{yygotominor.yy21 = new QVariant();} break; case 82: /* term ::= INTEGER */ -{ - int base = 10; - if (yymsp[0].minor.yy0->value.startsWith("0x", Qt::CaseInsensitive)) - base = 16; - - yygotominor.yy21 = new QVariant(yymsp[0].minor.yy0->value.toLongLong(nullptr, base)); - } + case 351: /* number ::= INTEGER */ yytestcase(yyruleno==351); +{yygotominor.yy21 = parserContext->handleNumberToken(yymsp[0].minor.yy0->value);} break; case 83: /* term ::= FLOAT */ -{ - yygotominor.yy21 = new QVariant(QVariant(yymsp[0].minor.yy0->value).toDouble()); - } + case 352: /* number ::= FLOAT */ yytestcase(yyruleno==352); +{yygotominor.yy21 = new QVariant(QVariant(yymsp[0].minor.yy0->value).toDouble());} break; case 84: /* term ::= STRING|BLOB */ case 345: /* nmnum ::= ON */ yytestcase(yyruleno==345); @@ -4273,7 +4262,6 @@ static void yy_reduce( } break; case 277: /* exprx ::= BITNOT expr */ - case 278: /* exprx ::= MINUS expr */ yytestcase(yyruleno==278); case 279: /* exprx ::= PLUS expr */ yytestcase(yyruleno==279); { yygotominor.yy490 = new SqliteExpr(); @@ -4281,6 +4269,23 @@ static void yy_reduce( objectForTokens = yygotominor.yy490; } break; + case 278: /* exprx ::= MINUS expr */ +{ + yygotominor.yy490 = new SqliteExpr(); + if (yymsp[0].minor.yy490->mode == SqliteExpr::Mode::LITERAL_VALUE && + parserContext->isCandidateForMaxNegativeNumber() && + yymsp[0].minor.yy490->literalValue == static_cast(0L)) + { + yygotominor.yy490->initLiteral(std::numeric_limits::min()); + delete yymsp[0].minor.yy490; + } + else + { + yygotominor.yy490->initUnaryOp(yymsp[0].minor.yy490, yymsp[-1].minor.yy0->value); + } + objectForTokens = yygotominor.yy490; + } + break; case 280: /* exprx ::= expr not_opt BETWEEN expr AND expr */ { yygotominor.yy490 = new SqliteExpr(); @@ -4316,7 +4321,7 @@ static void yy_reduce( case 284: /* exprx ::= expr not_opt IN nm dbnm */ { yygotominor.yy490 = new SqliteExpr(); - yygotominor.yy490->initIn(yymsp[-4].minor.yy490, yymsp[-3].minor.yy237, *(yymsp[-1].minor.yy211), *(yymsp[0].minor.yy211)); + yygotominor.yy490->initIn(yymsp[-4].minor.yy490, *(yymsp[-3].minor.yy237), *(yymsp[-1].minor.yy211), *(yymsp[0].minor.yy211)); delete yymsp[-3].minor.yy237; delete yymsp[-1].minor.yy211; objectForTokens = yygotominor.yy490; @@ -4577,19 +4582,18 @@ static void yy_reduce( if (yymsp[0].minor.yy21->type() == QVariant::Double) *(yymsp[0].minor.yy21) = -(yymsp[0].minor.yy21->toDouble()); else if (yymsp[0].minor.yy21->type() == QVariant::LongLong) - *(yymsp[0].minor.yy21) = -(yymsp[0].minor.yy21->toLongLong()); + { + if (parserContext->isCandidateForMaxNegativeNumber()) + *(yymsp[0].minor.yy21) = std::numeric_limits::min(); + else + *(yymsp[0].minor.yy21) = -(yymsp[0].minor.yy21->toLongLong()); + } else Q_ASSERT_X(true, "producing minus number", "QVariant is neither of Double or LongLong."); yygotominor.yy21 = yymsp[0].minor.yy21; } break; - case 351: /* number ::= INTEGER */ -{yygotominor.yy21 = new QVariant(QVariant(yymsp[0].minor.yy0->value).toLongLong());} - break; - case 352: /* number ::= FLOAT */ -{yygotominor.yy21 = new QVariant(QVariant(yymsp[0].minor.yy0->value).toDouble());} - break; case 353: /* cmd ::= CREATE temp TRIGGER ifnotexists nm dbnm trigger_time trigger_event ON nm foreach_clause when_clause BEGIN trigger_cmd_list END */ { yygotominor.yy399 = new SqliteCreateTrigger( diff --git a/SQLiteStudio3/coreSQLiteStudio/parser/sqlite3_parse.y b/SQLiteStudio3/coreSQLiteStudio/parser/sqlite3_parse.y index 0353e2c..0bab877 100644 --- a/SQLiteStudio3/coreSQLiteStudio/parser/sqlite3_parse.y +++ b/SQLiteStudio3/coreSQLiteStudio/parser/sqlite3_parse.y @@ -57,6 +57,7 @@ #include "parser/ast/sqlitewith.h" #include #include +#include #define assert(X) Q_ASSERT(X) #define UNUSED_PARAMETER(X) (void)(X) @@ -539,19 +540,9 @@ ccons(X) ::= CHECK LP RP. { %type term {QVariant*} %destructor term {delete $$;} -term(X) ::= NULL. { - X = new QVariant(); - } -term(X) ::= INTEGER(N). { - int base = 10; - if (N->value.startsWith("0x", Qt::CaseInsensitive)) - base = 16; - - X = new QVariant(N->value.toLongLong(nullptr, base)); - } -term(X) ::= FLOAT(N). { - X = new QVariant(QVariant(N->value).toDouble()); - } +term(X) ::= NULL. {X = new QVariant();} +term(X) ::= INTEGER(N). {X = parserContext->handleNumberToken(N->value);} +term(X) ::= FLOAT(N). {X = new QVariant(QVariant(N->value).toDouble());} term(X) ::= STRING|BLOB(S). {X = new QVariant(S->value);} // The optional AUTOINCREMENT keyword @@ -1625,7 +1616,17 @@ exprx(X) ::= BITNOT(O) expr(E). { } exprx(X) ::= MINUS(O) expr(E). [BITNOT] { X = new SqliteExpr(); - X->initUnaryOp(E, O->value); + if (E->mode == SqliteExpr::Mode::LITERAL_VALUE && + parserContext->isCandidateForMaxNegativeNumber() && + E->literalValue == static_cast(0L)) + { + X->initLiteral(std::numeric_limits::min()); + delete E; + } + else + { + X->initUnaryOp(E, O->value); + } objectForTokens = X; } exprx(X) ::= PLUS(O) expr(E). [BITNOT] { @@ -1664,7 +1665,7 @@ exprx(X) ::= expr(E) not_opt(N) IN LP exprx(X) ::= expr(E) not_opt(N) IN nm(N1) dbnm(N2). [IN] { X = new SqliteExpr(); - X->initIn(E, N, *(N1), *(N2)); + X->initIn(E, *(N), *(N1), *(N2)); delete N; delete N1; objectForTokens = X; @@ -1991,7 +1992,12 @@ minus_num(X) ::= MINUS number(N). { if (N->type() == QVariant::Double) *(N) = -(N->toDouble()); else if (N->type() == QVariant::LongLong) - *(N) = -(N->toLongLong()); + { + if (parserContext->isCandidateForMaxNegativeNumber()) + *(N) = std::numeric_limits::min(); + else + *(N) = -(N->toLongLong()); + } else Q_ASSERT_X(true, "producing minus number", "QVariant is neither of Double or LongLong."); @@ -2000,7 +2006,7 @@ minus_num(X) ::= MINUS number(N). { %type number {QVariant*} %destructor number {delete $$;} -number(X) ::= INTEGER(N). {X = new QVariant(QVariant(N->value).toLongLong());} +number(X) ::= INTEGER(N). {X = parserContext->handleNumberToken(N->value);} number(X) ::= FLOAT(N). {X = new QVariant(QVariant(N->value).toDouble());} //////////////////////////// The CREATE TRIGGER command ///////////////////// diff --git a/SQLiteStudio3/coreSQLiteStudio/services/impl/dbmanagerimpl.cpp b/SQLiteStudio3/coreSQLiteStudio/services/impl/dbmanagerimpl.cpp index 70aa568..e96e181 100644 --- a/SQLiteStudio3/coreSQLiteStudio/services/impl/dbmanagerimpl.cpp +++ b/SQLiteStudio3/coreSQLiteStudio/services/impl/dbmanagerimpl.cpp @@ -107,9 +107,14 @@ bool DbManagerImpl::updateDb(Db* db, const QString &name, const QString &path, c result = CFG->removeDb(name); InvalidDb* invalidDb = dynamic_cast(db); + bool wasReloaded = false; Db* reloadedDb = db; if (pathDifferent && invalidDb) - reloadedDb = tryToLoadDb(invalidDb); + { + reloadedDb = tryToLoadDb(invalidDb, false); + if (reloadedDb) // we need to know that, so we can emit dbLoaded() signal later, out of the listLock + wasReloaded = true; + } if (reloadedDb) // reloading was not necessary (was not invalid) or it was successful db = reloadedDb; @@ -119,6 +124,10 @@ bool DbManagerImpl::updateDb(Db* db, const QString &name, const QString &path, c listLock.unlock(); + // If we did reload the db, we need to emit proper signal, because it was suppressed in tryToLoadDb(), because of the listLock + if (wasReloaded) + emit dbLoaded(db); + if (result && reloadedDb) emit dbUpdated(oldName, db); else if (reloadedDb) // database reloaded correctly, but update failed @@ -355,7 +364,7 @@ QList DbManagerImpl::getInvalidDatabases() const }); } -Db* DbManagerImpl::tryToLoadDb(InvalidDb* invalidDb) +Db* DbManagerImpl::tryToLoadDb(InvalidDb* invalidDb, bool emitNotifySignal) { QUrl url = QUrl::fromUserInput(invalidDb->getPath()); if (url.isLocalFile() && !QFile::exists(invalidDb->getPath())) @@ -373,7 +382,9 @@ Db* DbManagerImpl::tryToLoadDb(InvalidDb* invalidDb) if (CFG->getDbGroup(db->getName())->open) db->open(); - emit dbLoaded(db); + if (emitNotifySignal) + emit dbLoaded(db); + return db; } diff --git a/SQLiteStudio3/coreSQLiteStudio/services/impl/dbmanagerimpl.h b/SQLiteStudio3/coreSQLiteStudio/services/impl/dbmanagerimpl.h index 8e28080..5797ac6 100644 --- a/SQLiteStudio3/coreSQLiteStudio/services/impl/dbmanagerimpl.h +++ b/SQLiteStudio3/coreSQLiteStudio/services/impl/dbmanagerimpl.h @@ -94,7 +94,7 @@ class API_EXPORT DbManagerImpl : public DbManager */ QList getInvalidDatabases() const; - Db* tryToLoadDb(InvalidDb* invalidDb); + Db* tryToLoadDb(InvalidDb* invalidDb, bool emitNotifySignal = true); /** * @brief Creates database object. diff --git a/SQLiteStudio3/coreSQLiteStudio/services/importmanager.h b/SQLiteStudio3/coreSQLiteStudio/services/importmanager.h index 6f13826..2401e78 100644 --- a/SQLiteStudio3/coreSQLiteStudio/services/importmanager.h +++ b/SQLiteStudio3/coreSQLiteStudio/services/importmanager.h @@ -36,6 +36,8 @@ class API_EXPORT ImportManager : public PluginServiceBase * (for example from a clipboard). */ QString inputFileName; + + bool ignoreErrors = false; }; enum StandardConfigFlag diff --git a/SQLiteStudio3/coreSQLiteStudio/services/notifymanager.cpp b/SQLiteStudio3/coreSQLiteStudio/services/notifymanager.cpp index 0980399..f8b7f25 100644 --- a/SQLiteStudio3/coreSQLiteStudio/services/notifymanager.cpp +++ b/SQLiteStudio3/coreSQLiteStudio/services/notifymanager.cpp @@ -1,4 +1,5 @@ #include "services/notifymanager.h" +#include DEFINE_SINGLETON(NotifyManager) @@ -71,11 +72,13 @@ QList NotifyManager::getRecentErrors() const void notifyError(const QString &msg) { + qDebug() << "Error from notify manager:" << msg; NotifyManager::getInstance()->error(msg); } void notifyWarn(const QString &msg) { + qDebug() << "Warning from notify manager:" << msg; NotifyManager::getInstance()->warn(msg); } diff --git a/SQLiteStudio3/coreSQLiteStudio/sqlitestudio.cpp b/SQLiteStudio3/coreSQLiteStudio/sqlitestudio.cpp index 2d2bbd3..361b2e4 100644 --- a/SQLiteStudio3/coreSQLiteStudio/sqlitestudio.cpp +++ b/SQLiteStudio3/coreSQLiteStudio/sqlitestudio.cpp @@ -39,7 +39,7 @@ DEFINE_SINGLETON(SQLiteStudio) -static const int sqlitestudioVersion = 30003; +static const int sqlitestudioVersion = 30004; SQLiteStudio::SQLiteStudio() { diff --git a/SQLiteStudio3/coreSQLiteStudio/tablemodifier.cpp b/SQLiteStudio3/coreSQLiteStudio/tablemodifier.cpp index 8dc36ee..973402a 100644 --- a/SQLiteStudio3/coreSQLiteStudio/tablemodifier.cpp +++ b/SQLiteStudio3/coreSQLiteStudio/tablemodifier.cpp @@ -10,6 +10,7 @@ #include "parser/ast/sqliteupdate.h" #include "parser/ast/sqliteinsert.h" #include "parser/ast/sqlitedelete.h" +#include "common/unused.h" #include // TODO no attach/temp db name support in this entire class @@ -458,7 +459,7 @@ void TableModifier::handleTriggerQueries(SqliteCreateTriggerPtr trigger) foreach (SqliteQuery* query, trigger->queries) { // The handleTriggerQuery() may delete the input query object. Don't refer to it later. - newQuery = handleTriggerQuery(query, trigger->trigger); + newQuery = handleTriggerQuery(query, trigger->trigger, trigger->table); if (newQuery) newQueries << newQuery; else @@ -497,28 +498,28 @@ void TableModifier::handleView(SqliteCreateViewPtr view) modifiedViews << view->view; } -SqliteQuery* TableModifier::handleTriggerQuery(SqliteQuery* query, const QString& trigName) +SqliteQuery* TableModifier::handleTriggerQuery(SqliteQuery* query, const QString& trigName, const QString& trigTable) { SqliteSelect* select = dynamic_cast(query); if (select) - return handleSelect(select); + return handleSelect(select, trigTable); SqliteUpdate* update = dynamic_cast(query); if (update) - return handleTriggerUpdate(update, trigName); + return handleTriggerUpdate(update, trigName, trigTable); SqliteInsert* insert = dynamic_cast(query); if (insert) - return handleTriggerInsert(insert, trigName); + return handleTriggerInsert(insert, trigName, trigTable); SqliteDelete* del = dynamic_cast(query); if (del) - return handleTriggerDelete(del, trigName); + return handleTriggerDelete(del, trigName, trigTable); return nullptr; } -SqliteSelect* TableModifier::handleSelect(SqliteSelect* select) +SqliteSelect* TableModifier::handleSelect(SqliteSelect* select, const QString& trigTable) { // Table name TokenList tableTokens = select->getContextTableTokens(false); @@ -561,76 +562,92 @@ SqliteSelect* TableModifier::handleSelect(SqliteSelect* select) return nullptr; } + if (!trigTable.isNull() && !handleAllExprWithTrigTable(selectPtr.data(), trigTable)) + return nullptr; + return new SqliteSelect(*selectPtr.data()); } -SqliteUpdate* TableModifier::handleTriggerUpdate(SqliteUpdate* update, const QString& trigName) +SqliteUpdate* TableModifier::handleTriggerUpdate(SqliteUpdate* update, const QString& trigName, const QString& trigTable) { - // Table name if (update->table.compare(originalTable, Qt::CaseInsensitive) == 0) + { + // Table name update->table = newName; - // Column names - handleUpdateColumns(update); + // Column names + handleUpdateColumns(update); + } // Any embedded selects - bool embedSelectsOk = handleSubSelects(update); - if (!embedSelectsOk) + bool embedSelectsOk = handleSubSelects(update, trigTable); + bool embedExprOk = handleAllExprWithTrigTable(update, trigTable); + if (!embedSelectsOk || !embedExprOk) { warnings << QObject::tr("There is a problem with updating an %1 statement within %2 trigger. " - "One of the SELECT substatements which might be referring to table %3 cannot be properly modified. " - "Manual update of the trigger may be necessary.").arg("UPDATE").arg(trigName).arg(originalTable); + "One of the %1 substatements which might be referring to table %3 cannot be properly modified. " + "Manual update of the trigger may be necessary.").arg("UPDATE", trigName, originalTable); } return update; } -SqliteInsert* TableModifier::handleTriggerInsert(SqliteInsert* insert, const QString& trigName) +SqliteInsert* TableModifier::handleTriggerInsert(SqliteInsert* insert, const QString& trigName, const QString& trigTable) { - // Table name if (insert->table.compare(originalTable, Qt::CaseInsensitive) == 0) + { + // Table name insert->table = newName; - // Column names - handleColumnNames(insert->columnNames); + // Column names + handleColumnNames(insert->columnNames); + } // Any embedded selects - bool embedSelectsOk = handleSubSelects(insert); - if (!embedSelectsOk) + bool embedSelectsOk = handleSubSelects(insert, trigTable); + bool embedExprOk = handleAllExprWithTrigTable(insert, trigTable); + if (!embedSelectsOk || !embedExprOk) { warnings << QObject::tr("There is a problem with updating an %1 statement within %2 trigger. " - "One of the SELECT substatements which might be referring to table %3 cannot be properly modified. " + "One of the %1 substatements which might be referring to table %3 cannot be properly modified. " "Manual update of the trigger may be necessary.").arg("INSERT", trigName, originalTable); } return insert; } -SqliteDelete* TableModifier::handleTriggerDelete(SqliteDelete* del, const QString& trigName) +SqliteDelete* TableModifier::handleTriggerDelete(SqliteDelete* del, const QString& trigName, const QString& trigTable) { // Table name if (del->table.compare(originalTable, Qt::CaseInsensitive) == 0) del->table = newName; // Any embedded selects - bool embedSelectsOk = handleSubSelects(del); - if (!embedSelectsOk) + bool embedSelectsOk = handleSubSelects(del, trigTable); + bool embedExprOk = handleAllExprWithTrigTable(del, trigTable); + if (!embedSelectsOk || !embedExprOk) { warnings << QObject::tr("There is a problem with updating an %1 statement within %2 trigger. " - "One of the SELECT substatements which might be referring to table %3 cannot be properly modified. " + "One of the %1 substatements which might be referring to table %3 cannot be properly modified. " "Manual update of the trigger may be necessary.").arg("DELETE", trigName, originalTable); } return del; } -bool TableModifier::handleSubSelects(SqliteStatement* stmt) +bool TableModifier::handleSubSelects(SqliteStatement* stmt, const QString& trigTable) { bool embedSelectsOk = true; QList selects = stmt->getAllTypedStatements(); SqliteExpr* expr = nullptr; foreach (SqliteSelect* select, selects) { + if (select->coreSelects.size() >= 1 && select->coreSelects.first()->valuesMode) + { + // INSERT with VALUES() as subselect + continue; + } + expr = dynamic_cast(select->parentStatement()); if (!expr) { @@ -638,13 +655,13 @@ bool TableModifier::handleSubSelects(SqliteStatement* stmt) continue; } - if (!handleExprWithSelect(expr)) + if (!handleExprWithSelect(expr, trigTable)) embedSelectsOk = false; } return embedSelectsOk; } -bool TableModifier::handleExprWithSelect(SqliteExpr* expr) +bool TableModifier::handleExprWithSelect(SqliteExpr* expr, const QString& trigTable) { if (!expr->select) { @@ -652,7 +669,7 @@ bool TableModifier::handleExprWithSelect(SqliteExpr* expr) return false; } - SqliteSelect* newSelect = handleSelect(expr->select); + SqliteSelect* newSelect = handleSelect(expr->select, trigTable); if (!newSelect) { qCritical() << "Could not generate new SELECT in TableModifier::handleExprWithSelect()"; @@ -665,6 +682,49 @@ bool TableModifier::handleExprWithSelect(SqliteExpr* expr) return true; } +bool TableModifier::handleAllExprWithTrigTable(SqliteStatement* stmt, const QString& contextTable) +{ + if (contextTable != originalTable) + return true; + + return handleExprListWithTrigTable(stmt->getAllTypedStatements()); +} + +bool TableModifier::handleExprListWithTrigTable(const QList& exprList) +{ + for (SqliteExpr* expr : exprList) + { + if (!handleExprWithTrigTable(expr)) + return false; + } + return true; +} + +bool TableModifier::handleExprWithTrigTable(SqliteExpr* expr) +{ + if (expr->mode != SqliteExpr::Mode::ID) + return true; + + if (!expr->database.isNull()) + return true; + + if (expr->table.compare("old", Qt::CaseInsensitive) != 0 && expr->table.compare("new", Qt::CaseInsensitive) != 0) + return true; + + QStringList columns = QStringList({expr->column}); + if (!handleColumnNames(columns)) + return true; + + if (columns.isEmpty()) + { + qDebug() << "Column in the expression is no longer present in the table. Cannot update the expression automatically."; + return false; + } + + expr->column = columns.first(); + return true; +} + void TableModifier::simpleHandleIndexes() { SchemaResolver resolver(db); diff --git a/SQLiteStudio3/coreSQLiteStudio/tablemodifier.h b/SQLiteStudio3/coreSQLiteStudio/tablemodifier.h index d3977ee..f063693 100644 --- a/SQLiteStudio3/coreSQLiteStudio/tablemodifier.h +++ b/SQLiteStudio3/coreSQLiteStudio/tablemodifier.h @@ -45,13 +45,16 @@ class API_EXPORT TableModifier void handleTriggerQueries(SqliteCreateTriggerPtr trigger); void handleViews(); void handleView(SqliteCreateViewPtr view); - SqliteQuery* handleTriggerQuery(SqliteQuery* query, const QString& trigName); - SqliteSelect* handleSelect(SqliteSelect* select); - SqliteUpdate* handleTriggerUpdate(SqliteUpdate* update, const QString& trigName); - SqliteInsert* handleTriggerInsert(SqliteInsert* insert, const QString& trigName); - SqliteDelete* handleTriggerDelete(SqliteDelete* del, const QString& trigName); - bool handleSubSelects(SqliteStatement* stmt); - bool handleExprWithSelect(SqliteExpr* expr); + SqliteQuery* handleTriggerQuery(SqliteQuery* query, const QString& trigName, const QString& trigTable); + SqliteSelect* handleSelect(SqliteSelect* select, const QString& trigTable = QString()); + SqliteUpdate* handleTriggerUpdate(SqliteUpdate* update, const QString& trigName, const QString& trigTable); + SqliteInsert* handleTriggerInsert(SqliteInsert* insert, const QString& trigName, const QString& trigTable); + SqliteDelete* handleTriggerDelete(SqliteDelete* del, const QString& trigName, const QString& trigTable); + bool handleSubSelects(SqliteStatement* stmt, const QString& trigTable); + bool handleExprWithSelect(SqliteExpr* expr, const QString& trigTable); + bool handleAllExprWithTrigTable(SqliteStatement* stmt, const QString& contextTable); + bool handleExprListWithTrigTable(const QList& exprList); + bool handleExprWithTrigTable(SqliteExpr* expr); void simpleHandleIndexes(); void simpleHandleTriggers(const QString& view = QString::null); SqliteQueryPtr parseQuery(const QString& ddl); diff --git a/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_de.ts b/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_de.ts index 7656d3b..46425fc 100644 --- a/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_de.ts +++ b/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_de.ts @@ -1,6 +1,6 @@ - + AbstractDb @@ -147,30 +147,30 @@ - + Database %1 could not be updated, because of an error: %2 - - + + Database file doesn't exist. - - - + + + No supporting plugin loaded. - + Database could not be initialized. - + No suitable database driver plugin found. @@ -318,33 +318,33 @@ Tables, indexes, triggers and views copied to database %3 will remain. ExportWorker - + Error while exporting query results: %1 - + Error while counting data column width to export from query results: %1 - - + + Could not parse %1 in order to export it. It will be excluded from the export output. - + Error while reading data to export from table %1: %2 - + Error while counting data to export from table %1: %2 - + Error while counting data column width to export from table %1: %2 @@ -443,18 +443,23 @@ Tables, indexes, triggers and views copied to database %3 will remain. - - + + Error while importing data: %1 - + Interrupted. import process status update + + + Could not import data row number %1. The row was ignored. Problem details: %2 + + PluginManagerImpl @@ -765,7 +770,7 @@ Tables, indexes, triggers and views copied to database %3 will remain. - + Result set expired or no row available. @@ -834,13 +839,13 @@ Error details: %2 - + Parser stack overflow - + Syntax error @@ -947,41 +952,41 @@ Error details: %2 - + Table %1 is referencing table %2, but the foreign key definition will not be updated for new table definition due to problems while parsing DDL of the table %3. - + All columns indexed by the index %1 are gone. The index will not be recreated after table modification. - + There is problem with proper processing trigger %1. It may be not fully updated afterwards and will need your attention. - + Cannot not update trigger %1 according to table %2 modification. - - All columns covered by the trigger %1 are gone. The trigger will not be recreated after table modification. + + + + There is a problem with updating an %1 statement within %2 trigger. One of the %1 substatements which might be referring to table %3 cannot be properly modified. Manual update of the trigger may be necessary. - - Cannot not update view %1 according to table %2 modifications. -The view will remain as it is. + + All columns covered by the trigger %1 are gone. The trigger will not be recreated after table modification. - - - - There is a problem with updating an %1 statement within %2 trigger. One of the SELECT substatements which might be referring to table %3 cannot be properly modified. Manual update of the trigger may be necessary. + + Cannot not update view %1 according to table %2 modifications. +The view will remain as it is. diff --git a/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_es.ts b/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_es.ts index 420d0bb..9545030 100644 --- a/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_es.ts +++ b/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_es.ts @@ -1,6 +1,6 @@ - + AbstractDb @@ -147,30 +147,30 @@ - + Database %1 could not be updated, because of an error: %2 - - + + Database file doesn't exist. - - - + + + No supporting plugin loaded. - + Database could not be initialized. - + No suitable database driver plugin found. @@ -318,33 +318,33 @@ Tables, indexes, triggers and views copied to database %3 will remain. ExportWorker - + Error while exporting query results: %1 - + Error while counting data column width to export from query results: %1 - - + + Could not parse %1 in order to export it. It will be excluded from the export output. - + Error while reading data to export from table %1: %2 - + Error while counting data to export from table %1: %2 - + Error while counting data column width to export from table %1: %2 @@ -443,18 +443,23 @@ Tables, indexes, triggers and views copied to database %3 will remain. - - + + Error while importing data: %1 - + Interrupted. import process status update + + + Could not import data row number %1. The row was ignored. Problem details: %2 + + PluginManagerImpl @@ -765,7 +770,7 @@ Tables, indexes, triggers and views copied to database %3 will remain. - + Result set expired or no row available. @@ -834,13 +839,13 @@ Error details: %2 - + Parser stack overflow - + Syntax error @@ -947,41 +952,41 @@ Error details: %2 - + Table %1 is referencing table %2, but the foreign key definition will not be updated for new table definition due to problems while parsing DDL of the table %3. - + All columns indexed by the index %1 are gone. The index will not be recreated after table modification. - + There is problem with proper processing trigger %1. It may be not fully updated afterwards and will need your attention. - + Cannot not update trigger %1 according to table %2 modification. - - All columns covered by the trigger %1 are gone. The trigger will not be recreated after table modification. + + + + There is a problem with updating an %1 statement within %2 trigger. One of the %1 substatements which might be referring to table %3 cannot be properly modified. Manual update of the trigger may be necessary. - - Cannot not update view %1 according to table %2 modifications. -The view will remain as it is. + + All columns covered by the trigger %1 are gone. The trigger will not be recreated after table modification. - - - - There is a problem with updating an %1 statement within %2 trigger. One of the SELECT substatements which might be referring to table %3 cannot be properly modified. Manual update of the trigger may be necessary. + + Cannot not update view %1 according to table %2 modifications. +The view will remain as it is. diff --git a/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_fr.qm b/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_fr.qm index a0b0a53..668a42a 100644 Binary files a/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_fr.qm and b/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_fr.qm differ diff --git a/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_fr.ts b/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_fr.ts index 46e3abc..6e53771 100644 --- a/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_fr.ts +++ b/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_fr.ts @@ -1,6 +1,6 @@ - + AbstractDb @@ -147,30 +147,30 @@ Impossible d'ajouter une base de données %1: %2 - + Database %1 could not be updated, because of an error: %2 La base de données %1 ne peut ëtre mise à jour à cause de l'erreur: %2 - - + + Database file doesn't exist. Le fichier de la base de données n'existe pas. - - - + + + No supporting plugin loaded. Aucun plugin supporté chargé. - + Database could not be initialized. La base de données ne peut être initialisée. - + No suitable database driver plugin found. Aucun pilote de base de données approprié trouvé. @@ -319,33 +319,33 @@ Tables, index, déclencheurs et vues copiés de la base de données %3 seront ma ExportWorker - + Error while exporting query results: %1 Erreur lors de l'exportation des résultats de la requête:%1 - + Error while counting data column width to export from query results: %1 Erreur lors de la totalisation des données de colonne issu de la requête: %1 - - + + Could not parse %1 in order to export it. It will be excluded from the export output. Impossible d'analyser %1 afin de l'exporter. Celle-ci sera excluse de l'exportation. - + Error while reading data to export from table %1: %2 Erreur lors de la lecture des données à exporter de la table %1: %2 - + Error while counting data to export from table %1: %2 Erreur lors du comptage des données à exporter de la table %1: %2 - + Error while counting data column width to export from table %1: %2 Erreur lors de la totalisation des données à exporter de la table %1: %2 @@ -444,18 +444,23 @@ Tables, index, déclencheurs et vues copiés de la base de données %3 seront ma - - + + Error while importing data: %1 Erreur lors de l'import des données: %1 - + Interrupted. import process status update Transaction interrompue. + + + Could not import data row number %1. The row was ignored. Problem details: %2 + + PluginManagerImpl @@ -766,7 +771,7 @@ Tables, index, déclencheurs et vues copiés de la base de données %3 seront ma - + Result set expired or no row available. Terminé ou aucune ligne valide. @@ -836,13 +841,13 @@ Détails erreur: %2 - + Parser stack overflow Analyse dépassement pile - + Syntax error Erreur de syntaxe @@ -949,43 +954,47 @@ Détails erreur: %2 Peuplement de la table - + Table %1 is referencing table %2, but the foreign key definition will not be updated for new table definition due to problems while parsing DDL of the table %3. La table %1 référence la table %2, mais la clé étrangère ne pourra être mise à jour pour la nouvelle table à cause de problèmes lors de l'analyse DDL de la table %3. - + All columns indexed by the index %1 are gone. The index will not be recreated after table modification. Toutes les colonnes indéxées par l'indexe %1 sont faites. L'indexe ne sera pas recréé après la modification de la table. - + There is problem with proper processing trigger %1. It may be not fully updated afterwards and will need your attention. - + Cannot not update trigger %1 according to table %2 modification. Impossible de mettre à jour le déclencheur%1 selon la modification de la table %2. - + + + + There is a problem with updating an %1 statement within %2 trigger. One of the %1 substatements which might be referring to table %3 cannot be properly modified. Manual update of the trigger may be necessary. + + + + All columns covered by the trigger %1 are gone. The trigger will not be recreated after table modification. Toutes les colonnes couvertes par le déclencheur %1 sont faites. Le déclencheur ne sera pas recréé après la modification de la table. - + Cannot not update view %1 according to table %2 modifications. The view will remain as it is. Impossible de mettre à jour les modifications de la vue %1 issue de la table %2 La vue restera telque. - - - There is a problem with updating an %1 statement within %2 trigger. One of the SELECT substatements which might be referring to table %3 cannot be properly modified. Manual update of the trigger may be necessary. - Il y a un problème à la mise à jour l'instruction %1 avec le déclencheur %2. Une partie de l'instruction SELECT référençant la table %3 ne ppermet pas sa modification. La mise à jour manuelle du déclencheur est nécessaire. + Il y a un problème à la mise à jour l'instruction %1 avec le déclencheur %2. Une partie de l'instruction SELECT référençant la table %3 ne ppermet pas sa modification. La mise à jour manuelle du déclencheur est nécessaire. diff --git a/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_pl.qm b/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_pl.qm index 8d09cfa..6859097 100644 Binary files a/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_pl.qm and b/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_pl.qm differ diff --git a/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_pl.ts b/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_pl.ts index 9ca5ff5..7c061e5 100644 --- a/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_pl.ts +++ b/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_pl.ts @@ -1,6 +1,6 @@ - + AbstractDb @@ -147,30 +147,30 @@ Nie udało się dodać bazę danych %1: %2 - + Database %1 could not be updated, because of an error: %2 Nie udało się zaktualizować baza danych %1 z powodu błędu: %2 - - + + Database file doesn't exist. Plik bazy danych nie istnieje. - - - + + + No supporting plugin loaded. Nie załadowano obsługującej wtyczki. - + Database could not be initialized. Nie udało się zainicjalizować bazy danych. - + No suitable database driver plugin found. Nie znaleziono odpowiedniej wtyczki sterownika. @@ -323,7 +323,7 @@ Tabele, indeksy, wyzwalacze i widoki skopiowane do bazy danych %3 pozostaną na ExportWorker - + Error while exporting query results: %1 Błąd podczas eksportowania wyników zapytania: %1 @@ -332,28 +332,28 @@ Tabele, indeksy, wyzwalacze i widoki skopiowane do bazy danych %3 pozostaną na Błąd podczas liczenia szerokości kolumn danych do eksportu wyników zapytania: %2 - + Error while counting data column width to export from query results: %1 Błąd podczas liczenia szerokości kolumn danych do eksportu wyników zapytania: %1 - - + + Could not parse %1 in order to export it. It will be excluded from the export output. Nie udało się przeanalizować %1 w celu wyeksportowania. Element ten zostanie pominięty w wynikach eksportu. - + Error while reading data to export from table %1: %2 Błąd podczas odczytu danych do eksportu z tabeli %1: %2 - + Error while counting data to export from table %1: %2 Błąd podczas liczenia danych do eksportu z tabeli %1: %2 - + Error while counting data column width to export from table %1: %2 Błąd podczas obliczania szerokości kolumn danych do eksportu z tabeli %1: %2 @@ -452,18 +452,23 @@ Tabele, indeksy, wyzwalacze i widoki skopiowane do bazy danych %3 pozostaną na - - + + Error while importing data: %1 Błąd podczas importowania danych: %1 - + Interrupted. import process status update Przerwano. + + + Could not import data row number %1. The row was ignored. Problem details: %2 + Nie udało się zaimportować wiersza danych numer %1. Wiersz ten został zignorowany. Szczegóły problemu: %2 + PluginManagerImpl @@ -831,13 +836,13 @@ Szczegóły błędu: %2 - + Parser stack overflow Przeciążenie stosu analizatora. - + Syntax error Błąd składni @@ -944,43 +949,47 @@ Szczegóły błędu: %2 Zaludnianie tabel - + Table %1 is referencing table %2, but the foreign key definition will not be updated for new table definition due to problems while parsing DDL of the table %3. Tabela %1 odwołuje się do tabeli %2, ale definicja klucza obcego nie zostanie zaktualizowane dla definicji nowej tabeli w związku z problemami przy analizowaniu DDL tabeli %3. - + All columns indexed by the index %1 are gone. The index will not be recreated after table modification. Wszystkie kolumny indeksowane przez indeks %1 już nie istnieją. Indeks ten nie będzie odtworzony po modyfikacji tabeli. - + There is problem with proper processing trigger %1. It may be not fully updated afterwards and will need your attention. Wystąpił problem z poprawnym przetworzeniem wyzwalacza %1. Może on zostać zaktualizowany tylko częściowo i będzie wymagał twojej uwagi. - + Cannot not update trigger %1 according to table %2 modification. Nie można zaktualizować wyzwalacza %1 zgodnie z modyfikacjami tabeli %2. - + + + + There is a problem with updating an %1 statement within %2 trigger. One of the %1 substatements which might be referring to table %3 cannot be properly modified. Manual update of the trigger may be necessary. + Jest problem ze zaktualizowaniem zapytania %1 w wyzwalaczu %2. Jedeno z podzapytań %1, które może odwoływać się do tabeli %3 nie może być poprawnie zmodyfikowane. Ręczna aktualizacja tego wyzwalacza może być niezbędna. + + + All columns covered by the trigger %1 are gone. The trigger will not be recreated after table modification. Wszystkie kolumny obsługiwane przez wyzwalacz %1 już nie istnieją. Wyzwalacz ten nie będzie odtworzony po modyfikacji tabeli. - + Cannot not update view %1 according to table %2 modifications. The view will remain as it is. Nie można zaktualizować widoku %1 w związku z modyfikacjami tabeli %2. Widok pozostanie nienaruszony. - - - There is a problem with updating an %1 statement within %2 trigger. One of the SELECT substatements which might be referring to table %3 cannot be properly modified. Manual update of the trigger may be necessary. - Jest problem ze zaktualizowaniem zapytania %1 w wyzwalaczu %2. Jedeno z podzapytań SELECT, które może odwoływać się do tabeli %2 nie może być poprawnie zmodyfikowane. Ręczna aktualizacja tego wyzwalacza może być niezbędna. + Jest problem ze zaktualizowaniem zapytania %1 w wyzwalaczu %2. Jedeno z podzapytań SELECT, które może odwoływać się do tabeli %3 nie może być poprawnie zmodyfikowane. Ręczna aktualizacja tego wyzwalacza może być niezbędna. @@ -1010,7 +1019,7 @@ Widok pozostanie nienaruszony. - + Result set expired or no row available. Wyniki zapytania są nieaktualne, lub nie ma dostępnych wierszy. diff --git a/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_pt_BR.ts b/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_pt_BR.ts index 5c08361..d22af44 100644 --- a/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_pt_BR.ts +++ b/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_pt_BR.ts @@ -1,6 +1,6 @@ - + AbstractDb @@ -147,30 +147,30 @@ - + Database %1 could not be updated, because of an error: %2 - - + + Database file doesn't exist. - - - + + + No supporting plugin loaded. - + Database could not be initialized. - + No suitable database driver plugin found. @@ -318,33 +318,33 @@ Tables, indexes, triggers and views copied to database %3 will remain. ExportWorker - + Error while exporting query results: %1 - + Error while counting data column width to export from query results: %1 - - + + Could not parse %1 in order to export it. It will be excluded from the export output. - + Error while reading data to export from table %1: %2 - + Error while counting data to export from table %1: %2 - + Error while counting data column width to export from table %1: %2 @@ -443,18 +443,23 @@ Tables, indexes, triggers and views copied to database %3 will remain. - - + + Error while importing data: %1 - + Interrupted. import process status update + + + Could not import data row number %1. The row was ignored. Problem details: %2 + + PluginManagerImpl @@ -765,7 +770,7 @@ Tables, indexes, triggers and views copied to database %3 will remain. - + Result set expired or no row available. @@ -834,13 +839,13 @@ Error details: %2 - + Parser stack overflow - + Syntax error @@ -947,41 +952,41 @@ Error details: %2 - + Table %1 is referencing table %2, but the foreign key definition will not be updated for new table definition due to problems while parsing DDL of the table %3. - + All columns indexed by the index %1 are gone. The index will not be recreated after table modification. - + There is problem with proper processing trigger %1. It may be not fully updated afterwards and will need your attention. - + Cannot not update trigger %1 according to table %2 modification. - - All columns covered by the trigger %1 are gone. The trigger will not be recreated after table modification. + + + + There is a problem with updating an %1 statement within %2 trigger. One of the %1 substatements which might be referring to table %3 cannot be properly modified. Manual update of the trigger may be necessary. - - Cannot not update view %1 according to table %2 modifications. -The view will remain as it is. + + All columns covered by the trigger %1 are gone. The trigger will not be recreated after table modification. - - - - There is a problem with updating an %1 statement within %2 trigger. One of the SELECT substatements which might be referring to table %3 cannot be properly modified. Manual update of the trigger may be necessary. + + Cannot not update view %1 according to table %2 modifications. +The view will remain as it is. diff --git a/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_ru.qm b/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_ru.qm index 0b3d737..24f5549 100644 Binary files a/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_ru.qm and b/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_ru.qm differ diff --git a/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_ru.ts b/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_ru.ts index 6890ba9..ca7fc68 100644 --- a/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_ru.ts +++ b/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_ru.ts @@ -147,31 +147,31 @@ Не удалось добавить базу данных %1: %2 - + Database %1 could not be updated, because of an error: %2 Невозможно обновить базу данных %1 из-за ошибки: %2 - - + + Database file doesn't exist. Файл базы данных не существует. - - - + + + No supporting plugin loaded. Unclear error string. Checking the source didn't help. Модуль поддержки не загружен. - + Database could not be initialized. Невозможно инициализировать базу данных. - + No suitable database driver plugin found. Не найден подходящий драйвер базы данных. @@ -320,33 +320,33 @@ Tables, indexes, triggers and views copied to database %3 will remain. ExportWorker - + Error while exporting query results: %1 Ошибка при экспорте результатов запроса: %1 - + Error while counting data column width to export from query results: %1 Ошибка при подсчёте ширины столбца данных для экспорта результатов запроса: %1 - - + + Could not parse %1 in order to export it. It will be excluded from the export output. Невозможно проанализировать структуру %1. Данный объект будет исключён при выполнении экспорта. - + Error while reading data to export from table %1: %2 Ошибка при считывании данных для экспорта из таблицы %1: %2 - + Error while counting data to export from table %1: %2 Ошибка при подсчёте количества данных для экспорта из таблицы %1: %2 - + Error while counting data column width to export from table %1: %2 Ошибка при подсчёте ширины столбца данных для экспорта из таблицы %1: %2 @@ -445,18 +445,23 @@ Tables, indexes, triggers and views copied to database %3 will remain. - - + + Error while importing data: %1 Ошибка при импорте данных: %1 - + Interrupted. import process status update Прервано. + + + Could not import data row number %1. The row was ignored. Problem details: %2 + Невозможно импортировать строку данных № %1. Строка пропущена. Подробности проблемы: %2 + PluginManagerImpl @@ -767,7 +772,7 @@ Tables, indexes, triggers and views copied to database %3 will remain. - + Result set expired or no row available. Результирующая выборка устарела или ни одна строка не доступна. @@ -836,13 +841,13 @@ Error details: %2 - + Parser stack overflow Переполнение стека анализатора - + Syntax error Синтаксическая ошибка @@ -949,43 +954,47 @@ Error details: %2 Заполнение таблиц - + Table %1 is referencing table %2, but the foreign key definition will not be updated for new table definition due to problems while parsing DDL of the table %3. Таблица %1 ссылается на таблицу %2, но описание внешнего ключа не будет обновлено для описания новой таблицы из-за проблем с анализом DDL таблицы %3. - + All columns indexed by the index %1 are gone. The index will not be recreated after table modification. Все столбцы, проиндексированные индексом %1, удалены. Индекс не будет воссоздан после модификации таблицы. - + There is problem with proper processing trigger %1. It may be not fully updated afterwards and will need your attention. - + Возникла проблема при обработке триггера %1. Впоследствии он не будет полностью обновлён и потребует вашего внимания. - + Cannot not update trigger %1 according to table %2 modification. Невозможно обновить триггер %1 в соответствии с модификацией таблицы %2. - + + + + There is a problem with updating an %1 statement within %2 trigger. One of the %1 substatements which might be referring to table %3 cannot be properly modified. Manual update of the trigger may be necessary. + Возникла проблема при обновлении конструкции %1 внутри триггера %2. Одна из вложенных конструкций %1, которая возможно ссылается на таблицу %3, не может быть корректно модифицирована. Возможно необходима ручная правка триггера. + + + All columns covered by the trigger %1 are gone. The trigger will not be recreated after table modification. Все столбцы, затронутые в триггере %1, удалены. Триггер не будет воссоздан после модификации таблицы. - + Cannot not update view %1 according to table %2 modifications. The view will remain as it is. Невозможно обновить представление %1 в соответствии с модификациями таблицы %2. Представление останется как есть. - - - There is a problem with updating an %1 statement within %2 trigger. One of the SELECT substatements which might be referring to table %3 cannot be properly modified. Manual update of the trigger may be necessary. - Возникла проблема при обновлении конструкции %1 внутри триггера %2. Одна из вложенных конструкций SELECT, которая возможно ссылается на таблицу %3, не может быть корректно модифицирована. Возможно необходима ручная правка триггера. + Возникла проблема при обновлении конструкции %1 внутри триггера %2. Одна из вложенных конструкций SELECT, которая возможно ссылается на таблицу %3, не может быть корректно модифицирована. Возможно необходима ручная правка триггера. diff --git a/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_sk.qm b/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_sk.qm index 1776294..e857185 100644 Binary files a/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_sk.qm and b/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_sk.qm differ diff --git a/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_sk.ts b/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_sk.ts index 497b7fe..24da18a 100644 --- a/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_sk.ts +++ b/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_sk.ts @@ -12,7 +12,7 @@ Error attaching database %1: %2 - + Chyba pri pripájaní databázy %1: %2 @@ -20,7 +20,7 @@ Invalid login or password - + Neplatné meno alebo heslo @@ -144,33 +144,33 @@ Could not add database %1: %2 - + Nemôžem pridať databázu %1: %2 - + Database %1 could not be updated, because of an error: %2 - - + + Database file doesn't exist. - + Databázový súbor neexistuje. - - - + + + No supporting plugin loaded. - + Database could not be initialized. - + No suitable database driver plugin found. @@ -181,7 +181,7 @@ Error while creating table in target database: %1 - + Vyskytla sa chyba počas vytvárania tabuľky v cieľovej databáze: %1 @@ -232,17 +232,17 @@ Tables, indexes, triggers and views copied to database %3 will remain. Target file exists, but could not be overwritten. - + Cieľový súbor existuje ale nemôže byť prepísaný. Could not find proper database plugin to create target database. - + Nieje možné nájsť správny databázový plugin pre vytvorenie cieľovej databázy. Error while converting database: %1 - + Vyskytla sa chyba počas konvertovania databázy: %1 @@ -297,54 +297,54 @@ Tables, indexes, triggers and views copied to database %3 will remain. Export to the clipboard was successful. - + Export do schránky bol úspešný. Export to the file '%1' was successful. - + Export do súboru '%1' bol úspešný. Export was successful. - + Export bol úspešný. Could not export to file %1. File cannot be open for writting. - + Nemôžem exportovať do súboru %1.Súbor nieje možné otvoriť pre zápis. ExportWorker - + Error while exporting query results: %1 - + Error while counting data column width to export from query results: %1 - - + + Could not parse %1 in order to export it. It will be excluded from the export output. - + Error while reading data to export from table %1: %2 - + Error while counting data to export from table %1: %2 - + Error while counting data column width to export from table %1: %2 @@ -443,18 +443,23 @@ Tables, indexes, triggers and views copied to database %3 will remain. - - + + Error while importing data: %1 - + Interrupted. import process status update + + + Could not import data row number %1. The row was ignored. Problem details: %2 + + PluginManagerImpl @@ -497,7 +502,7 @@ Tables, indexes, triggers and views copied to database %3 will remain. Constant populate constant plugin name - + Konštanta @@ -505,7 +510,7 @@ Tables, indexes, triggers and views copied to database %3 will remain. Constant value: - + Hodnota konštanty: @@ -514,7 +519,7 @@ Tables, indexes, triggers and views copied to database %3 will remain. Dictionary dictionary populating plugin name - + Slovník @@ -565,7 +570,7 @@ Tables, indexes, triggers and views copied to database %3 will remain. Table '%1' populated successfully. - + Tabuľka %1 úspešne naplnená. @@ -573,7 +578,7 @@ Tables, indexes, triggers and views copied to database %3 will remain. Random number - + Náhodné číslo @@ -614,7 +619,7 @@ Tables, indexes, triggers and views copied to database %3 will remain. Random text - + Náhodný text @@ -690,7 +695,7 @@ Tables, indexes, triggers and views copied to database %3 will remain. Script - + Skript @@ -721,7 +726,7 @@ Tables, indexes, triggers and views copied to database %3 will remain. Sequence - + Sekvencia @@ -765,7 +770,7 @@ Tables, indexes, triggers and views copied to database %3 will remain. - + Result set expired or no row available. @@ -834,15 +839,15 @@ Error details: %2 - + Parser stack overflow - + Syntax error - + Chyba syntaxe @@ -926,7 +931,7 @@ Error details: %2 Scripting languages plugin category name - + Skriptovacie jazyky @@ -947,41 +952,41 @@ Error details: %2 - + Table %1 is referencing table %2, but the foreign key definition will not be updated for new table definition due to problems while parsing DDL of the table %3. - + All columns indexed by the index %1 are gone. The index will not be recreated after table modification. - + There is problem with proper processing trigger %1. It may be not fully updated afterwards and will need your attention. - + Cannot not update trigger %1 according to table %2 modification. - - All columns covered by the trigger %1 are gone. The trigger will not be recreated after table modification. + + + + There is a problem with updating an %1 statement within %2 trigger. One of the %1 substatements which might be referring to table %3 cannot be properly modified. Manual update of the trigger may be necessary. - - Cannot not update view %1 according to table %2 modifications. -The view will remain as it is. + + All columns covered by the trigger %1 are gone. The trigger will not be recreated after table modification. - - - - There is a problem with updating an %1 statement within %2 trigger. One of the SELECT substatements which might be referring to table %3 cannot be properly modified. Manual update of the trigger may be necessary. + + Cannot not update view %1 according to table %2 modifications. +The view will remain as it is. @@ -1048,31 +1053,32 @@ The view will remain as it is. Database sql history header - + Dátum spustenia + Databáza Execution date sql history header - + Dátum spustenia Time spent sql history header - + Trvanie dotazu Rows affected sql history header - + Počet riadkov SQL sql history header - + SQL @@ -1256,12 +1262,12 @@ Details: %3 Could not rename directory %1 to %2. - + Nemôžem premenovať adresár %1na %2. Could not delete directory %1. - + Nemôžem vymazať adresár %1. diff --git a/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_zh_CN.ts b/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_zh_CN.ts index 0cfd10d..1c95d67 100644 --- a/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_zh_CN.ts +++ b/SQLiteStudio3/coreSQLiteStudio/translations/coreSQLiteStudio_zh_CN.ts @@ -1,6 +1,6 @@ - + AbstractDb @@ -147,30 +147,30 @@ - + Database %1 could not be updated, because of an error: %2 - - + + Database file doesn't exist. - - - + + + No supporting plugin loaded. - + Database could not be initialized. - + No suitable database driver plugin found. @@ -318,33 +318,33 @@ Tables, indexes, triggers and views copied to database %3 will remain. ExportWorker - + Error while exporting query results: %1 - + Error while counting data column width to export from query results: %1 - - + + Could not parse %1 in order to export it. It will be excluded from the export output. - + Error while reading data to export from table %1: %2 - + Error while counting data to export from table %1: %2 - + Error while counting data column width to export from table %1: %2 @@ -443,18 +443,23 @@ Tables, indexes, triggers and views copied to database %3 will remain. - - + + Error while importing data: %1 - + Interrupted. import process status update + + + Could not import data row number %1. The row was ignored. Problem details: %2 + + PluginManagerImpl @@ -765,7 +770,7 @@ Tables, indexes, triggers and views copied to database %3 will remain. - + Result set expired or no row available. @@ -834,13 +839,13 @@ Error details: %2 - + Parser stack overflow - + Syntax error @@ -947,41 +952,41 @@ Error details: %2 - + Table %1 is referencing table %2, but the foreign key definition will not be updated for new table definition due to problems while parsing DDL of the table %3. - + All columns indexed by the index %1 are gone. The index will not be recreated after table modification. - + There is problem with proper processing trigger %1. It may be not fully updated afterwards and will need your attention. - + Cannot not update trigger %1 according to table %2 modification. - - All columns covered by the trigger %1 are gone. The trigger will not be recreated after table modification. + + + + There is a problem with updating an %1 statement within %2 trigger. One of the %1 substatements which might be referring to table %3 cannot be properly modified. Manual update of the trigger may be necessary. - - Cannot not update view %1 according to table %2 modifications. -The view will remain as it is. + + All columns covered by the trigger %1 are gone. The trigger will not be recreated after table modification. - - - - There is a problem with updating an %1 statement within %2 trigger. One of the SELECT substatements which might be referring to table %3 cannot be properly modified. Manual update of the trigger may be necessary. + + Cannot not update view %1 according to table %2 modifications. +The view will remain as it is. diff --git a/SQLiteStudio3/coreSQLiteStudio/tsvserializer.cpp b/SQLiteStudio3/coreSQLiteStudio/tsvserializer.cpp index 486763b..a42c76d 100644 --- a/SQLiteStudio3/coreSQLiteStudio/tsvserializer.cpp +++ b/SQLiteStudio3/coreSQLiteStudio/tsvserializer.cpp @@ -45,7 +45,39 @@ QList TsvSerializer::deserialize(const QString& data) { QList rows; QStringList cells; + QStringList tokens; + QStringList parts = data.split(columnSeparator); + for (const QString& part : parts) + { + if (!part.contains(rowSeparator)) + { + cells << part; + continue; + } + + tokens = tokenizeStrWithRowSeparator(part); + for (const QString& token : tokens) + { + if (token != rowSeparator) + { + cells << token; + continue; + } + + rows << cells; + cells.clear(); + } + } + + if ((cells.size() > 0 && !cells.first().isEmpty()) || cells.size() > 1) + rows << cells; + return rows; +} + +QStringList TsvSerializer::tokenizeStrWithRowSeparator(const QString& data) +{ + QStringList tokens; int pos = 0; int lgt = data.length(); bool quotes = false; @@ -59,32 +91,27 @@ QList TsvSerializer::deserialize(const QString& data) { if (field.isEmpty()) quotes = true; - else - field += c; + + field += c; } else if (quotes && c == '"' ) { + field += c; if (pos + 1 < data.length() && data[pos+1] == '"' ) { - field += c; - pos++; + field += c; + pos++; } else { - quotes = false; + quotes = false; } } - else if (!quotes && c == columnSeparator) - { - cells << field; - field.clear(); - } else if (!quotes && c == rowSeparator) { - cells << field; - rows << cells; - cells.clear(); + tokens << flushToken(field); field.clear(); + tokens << QString(c); } else { @@ -94,10 +121,19 @@ QList TsvSerializer::deserialize(const QString& data) } if (field.size() > 0) - cells << field; + tokens << flushToken(field); - if (cells.size() > 0) - rows << cells; + return tokens; +} - return rows; +QString TsvSerializer::flushToken(const QString& token) +{ + if (!token.startsWith('"') || !token.contains(rowSeparator)) + return token; + + int decr = 1; + if (token.endsWith('"')) + decr++; + + return token.mid(1, token.length() - decr).replace("\"\"", "\""); } diff --git a/SQLiteStudio3/coreSQLiteStudio/tsvserializer.h b/SQLiteStudio3/coreSQLiteStudio/tsvserializer.h index efb3934..27d1da6 100644 --- a/SQLiteStudio3/coreSQLiteStudio/tsvserializer.h +++ b/SQLiteStudio3/coreSQLiteStudio/tsvserializer.h @@ -13,6 +13,8 @@ class API_EXPORT TsvSerializer static QList deserialize(const QString& data); private: + static QStringList tokenizeStrWithRowSeparator(const QString& data); + static QString flushToken(const QString& token); static QString rowSeparator; static QString columnSeparator; }; diff --git a/SQLiteStudio3/create_linux_portable.sh b/SQLiteStudio3/create_linux_portable.sh index 3bcb87d..55d4813 100644 --- a/SQLiteStudio3/create_linux_portable.sh +++ b/SQLiteStudio3/create_linux_portable.sh @@ -1,7 +1,7 @@ #!/bin/sh printUsage() { - echo "$0 [tgz|dist]" + echo "$0 [tgz|dist|dist_full]" } if [ "$#" -lt 2 ] || [ "$#" -gt 3 ]; then @@ -9,7 +9,7 @@ if [ "$#" -lt 2 ] || [ "$#" -gt 3 ]; then exit 1 fi -if [ "$#" -eq 3 ] && [ "$3" != "tgz" ] && [ "$3" != "dist" ] && [ "$3" != "dist_plugins" ]; then +if [ "$#" -eq 3 ] && [ "$3" != "tgz" ] && [ "$3" != "dist" ] && [ "$3" != "dist_plugins" ] && [ "$3" != "dist_full" ]; then printUsage exit 1 fi @@ -106,8 +106,8 @@ VERSION=`SQLiteStudio/sqlitestudiocli -v | awk '{print $2}'` if [ "$3" == "tgz" ]; then tar cf sqlitestudio-$VERSION.tar SQLiteStudio xz -z sqlitestudio-$VERSION.tar -elif [ "$3" == "dist" ] || [ "$3" == "dist_plugins" ]; then - if [ "$3" == "dist" ]; then +elif [ "$3" == "dist" ] || [ "$3" == "dist_plugins" ] || [ "$3" == "dist_full" ]; then + if [ "$3" == "dist" ] || [ "$3" == "dist_full" ]; then # Complete echo "Building complete package: sqlitestudio-$VERSION.tar.xz" tar cf sqlitestudio-$VERSION.tar SQLiteStudio @@ -117,16 +117,18 @@ elif [ "$3" == "dist" ] || [ "$3" == "dist_plugins" ]; then echo "Building incremental update package: sqlitestudio-$VERSION.tar.gz" cp -R SQLiteStudio app cd app - rm -rf plugins - rm -f lib/libQ* - rm -rf iconengines - rm -rf imageformats - rm -rf platforms - rm -rf platformthemes - rm -rf printsupport + if [ "$3" == "dist" ]; then + rm -rf plugins + rm -f lib/libQ* + rm -rf iconengines + rm -rf imageformats + rm -rf platforms + rm -rf platformthemes + rm -rf printsupport + find . -type l -exec rm -f {} \; + fi rm -f lib/libicu* rm -f lib/libsqlite.so.0 ;# this is for SQLite 2 - find . -type l -exec rm -f {} \; tar cf sqlitestudio-$VERSION.tar * gzip -9 sqlitestudio-$VERSION.tar mv sqlitestudio-$VERSION.tar.gz .. diff --git a/SQLiteStudio3/create_macosx_bundle.sh b/SQLiteStudio3/create_macosx_bundle.sh index bdad545..d3ce15b 100755 --- a/SQLiteStudio3/create_macosx_bundle.sh +++ b/SQLiteStudio3/create_macosx_bundle.sh @@ -1,7 +1,7 @@ #!/bin/sh printUsage() { - echo "$0 [dmg|dist]" + echo "$0 [dmg|dist|dist_full]" } if [ "$#" -lt 2 ] || [ "$#" -gt 3 ]; then @@ -9,7 +9,7 @@ if [ "$#" -lt 2 ] || [ "$#" -gt 3 ]; then exit 1 fi -if [ "$#" -eq 3 ] && [ "$3" != "dmg" ] && [ "$3" != "dist" ] && [ "$3" != "dist_plugins" ]; then +if [ "$#" -eq 3 ] && [ "$3" != "dmg" ] && [ "$3" != "dist" ] && [ "$3" != "dist_plugins" ] && [ "$3" != "dist_full" ]; then printUsage exit 1 fi @@ -46,8 +46,8 @@ cp -RP ../../../lib/*.dylib SQLiteStudio.app/Contents/Frameworks if [ "$3" == "dmg" ]; then $qt_deploy_bin SQLiteStudio.app -dmg -elif [ "$3" == "dist" ] || [ "$3" == "dist_plugins" ]; then - if [ "$3" == "dist" ]; then +elif [ "$3" == "dist" ] || [ "$3" == "dist_plugins" ] || [ "$3" == "dist_full" ]; then + if [ "$3" == "dist" ] || [ "$3" == "dist_full" ]; then $qt_deploy_bin SQLiteStudio.app -dmg cd $1/SQLiteStudio @@ -59,8 +59,10 @@ elif [ "$3" == "dist" ] || [ "$3" == "dist_plugins" ]; then echo "Building incremental update package: sqlitestudio-$VERSION.zip" cp -R SQLiteStudio.app app cd app/Contents - rm -rf PlugIns - rm -rf Frameworks/Qt*.framework + if [ "$3" == "dist" ]; then + rm -rf PlugIns + rm -rf Frameworks/Qt*.framework + fi find Frameworks -type l -exec rm -f {} \; cd .. zip -r sqlitestudio-$VERSION.zip * diff --git a/SQLiteStudio3/guiSQLiteStudio/common/ipvalidator.cpp b/SQLiteStudio3/guiSQLiteStudio/common/ipvalidator.cpp new file mode 100644 index 0000000..35c8b75 --- /dev/null +++ b/SQLiteStudio3/guiSQLiteStudio/common/ipvalidator.cpp @@ -0,0 +1,95 @@ +#include "ipvalidator.h" +#include + +QString IpValidator::reStr = "^%1(\\d%2)%1\\.%1(\\d%2)%1\\.%1(\\d%2)%1\\.%1(\\d%2)%1$"; + +IpValidator::IpValidator(QObject* parent) : + QValidator(parent) +{ +} + +IpValidator::~IpValidator() +{ +} + +QValidator::State IpValidator::validate(QString& input, int&) const +{ + QString regexp = getPattern(acceptWhiteSpaces, false, whitespaceCharacter); + QRegularExpression re(regexp); + QRegularExpressionMatch match = re.match(input); + if (!match.hasMatch()) + return Invalid; + + QString part; + int value; + bool ok; + for (int i = 1; i <= 4; i++) + { + part = match.captured(i); + if (part.isEmpty()) + { + if (acceptEmptyParts) + continue; + else + return Invalid; + } + + value = part.toInt(&ok); + if (!ok) + return Invalid; + + if (value > 255 || value < 0) + return Invalid; + } + + return Acceptable; +} + +bool IpValidator::getAcceptWhiteSpaces() const +{ + return acceptWhiteSpaces; +} + +void IpValidator::setAcceptWhiteSpaces(bool value) +{ + acceptWhiteSpaces = value; +} +bool IpValidator::getAcceptEmptyParts() const +{ + return acceptEmptyParts; +} + +void IpValidator::setAcceptEmptyParts(bool value) +{ + acceptEmptyParts = value; +} +QChar IpValidator::getWhitespaceCharacter() const +{ + return whitespaceCharacter; +} + +void IpValidator::setWhitespaceCharacter(const QChar& value) +{ + whitespaceCharacter = value; +} + +bool IpValidator::check(const QString& input, bool acceptWhiteSpaces) +{ + QString regexp = getPattern(acceptWhiteSpaces, true, ' '); + QRegularExpression re(regexp); + return re.match(input).hasMatch(); +} + +QString IpValidator::getPattern(bool acceptWhiteSpaces, bool requireFull, QChar whitespaceCharacter) +{ + QString countChar = requireFull ? "+" : "*"; + if (acceptWhiteSpaces) + { + if (whitespaceCharacter == ' ') + return reStr.arg("\\s*", countChar); + else + return reStr.arg(whitespaceCharacter + QString("*"), countChar); + } + else + return reStr.arg("", countChar); +} diff --git a/SQLiteStudio3/guiSQLiteStudio/common/ipvalidator.h b/SQLiteStudio3/guiSQLiteStudio/common/ipvalidator.h new file mode 100644 index 0000000..1c9ca4d --- /dev/null +++ b/SQLiteStudio3/guiSQLiteStudio/common/ipvalidator.h @@ -0,0 +1,35 @@ +#ifndef IPVALIDATOR_H +#define IPVALIDATOR_H + +#include + +class IpValidator : public QValidator +{ + public: + IpValidator(QObject* parent = 0); + ~IpValidator(); + + State validate(QString& input, int&) const; + + bool getAcceptWhiteSpaces() const; + void setAcceptWhiteSpaces(bool value); + + bool getAcceptEmptyParts() const; + void setAcceptEmptyParts(bool value); + + QChar getWhitespaceCharacter() const; + void setWhitespaceCharacter(const QChar& value); + + static bool check(const QString& input, bool acceptWhiteSpaces = false); + + private: + static QString getPattern(bool acceptWhiteSpaces, bool requireFull, QChar whitespaceCharacter); + + bool acceptWhiteSpaces = false; + bool acceptEmptyParts = false; + QChar whitespaceCharacter = ' '; + + static QString reStr; +}; + +#endif // IPVALIDATOR_H diff --git a/SQLiteStudio3/guiSQLiteStudio/completer/completeritemdelegate.cpp b/SQLiteStudio3/guiSQLiteStudio/completer/completeritemdelegate.cpp index a0da399..3268960 100644 --- a/SQLiteStudio3/guiSQLiteStudio/completer/completeritemdelegate.cpp +++ b/SQLiteStudio3/guiSQLiteStudio/completer/completeritemdelegate.cpp @@ -1,5 +1,6 @@ #include "completeritemdelegate.h" #include "completermodel.h" +#include "common/unused.h" #include #include #include @@ -21,8 +22,7 @@ void CompleterItemDelegate::paint(QPainter* painter, const QStyleOptionViewItem& QStyleOptionViewItem opt = option; initStyleOption(&opt, index); - QApplication::style()->drawPrimitive(QStyle::PE_PanelItemViewItem, &opt, painter, opt.widget); - + paintBackground(painter, opt, index); paintIcon(painter, opt, index); paintText(painter, opt, index); } @@ -36,6 +36,25 @@ QSize CompleterItemDelegate::sizeHint(const QStyleOptionViewItem& option, const return size; } +void CompleterItemDelegate::paintBackground(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const +{ + UNUSED(index); + + painter->save(); + QPalette::ColorGroup cg = (option.state & QStyle::State_Enabled) ? QPalette::Normal : QPalette::Disabled; + if (cg == QPalette::Normal && !(option.state & QStyle::State_Active)) + cg = QPalette::Inactive; + + QColor bg = option.palette.color(cg, QPalette::Base); + if (option.state & QStyle::State_Selected) + bg = option.palette.color(cg, QPalette::Highlight); + + painter->setPen(Qt::NoPen); + painter->setBrush(bg); + painter->drawRect(option.rect); + painter->restore(); +} + void CompleterItemDelegate::paintIcon(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const { QIcon icon = index.data(Qt::DecorationRole).value(); @@ -69,15 +88,9 @@ void CompleterItemDelegate::paintText(QPainter* painter, const QStyleOptionViewI QColor labelColor = option.palette.color(cg, QPalette::Link); if (option.state & QStyle::State_Selected) { -#ifdef Q_OS_WIN32 - prefixColor = option.palette.color(cg, QPalette::Text); - valueColor = option.palette.color(cg, QPalette::Text); - labelColor = option.palette.color(cg, QPalette::Text); -#else prefixColor = option.palette.color(cg, QPalette::HighlightedText); valueColor = option.palette.color(cg, QPalette::HighlightedText); labelColor = option.palette.color(cg, QPalette::HighlightedText); -#endif } // Using ascent() to measure usual height of the font, excluding anything below baseline. diff --git a/SQLiteStudio3/guiSQLiteStudio/completer/completerwindow.cpp b/SQLiteStudio3/guiSQLiteStudio/completer/completerwindow.cpp index 34ae30b..544adca 100644 --- a/SQLiteStudio3/guiSQLiteStudio/completer/completerwindow.cpp +++ b/SQLiteStudio3/guiSQLiteStudio/completer/completerwindow.cpp @@ -138,7 +138,7 @@ void CompleterWindow::changeEvent(QEvent *e) void CompleterWindow::keyPressEvent(QKeyEvent* e) { - if (e->key() == Qt::Key_Return) + if (e->key() == Qt::Key_Return || e->key() == Qt::Key_Enter) { accept(); return; diff --git a/SQLiteStudio3/guiSQLiteStudio/datagrid/sqlqueryitem.cpp b/SQLiteStudio3/guiSQLiteStudio/datagrid/sqlqueryitem.cpp index 53227fd..9b8dd03 100644 --- a/SQLiteStudio3/guiSQLiteStudio/datagrid/sqlqueryitem.cpp +++ b/SQLiteStudio3/guiSQLiteStudio/datagrid/sqlqueryitem.cpp @@ -94,7 +94,7 @@ bool SqlQueryItem::isDeletedRow() const void SqlQueryItem::setDeletedRow(bool isDeleted) { - if (isDeleted) + if (isDeleted && !getOldValue().isValid()) setOldValue(getValue()); QStandardItem::setData(QVariant(isDeleted), DataRole::DELETED); diff --git a/SQLiteStudio3/guiSQLiteStudio/datagrid/sqlquerymodel.cpp b/SQLiteStudio3/guiSQLiteStudio/datagrid/sqlquerymodel.cpp index 7fe3a68..8024abf 100644 --- a/SQLiteStudio3/guiSQLiteStudio/datagrid/sqlquerymodel.cpp +++ b/SQLiteStudio3/guiSQLiteStudio/datagrid/sqlquerymodel.cpp @@ -17,6 +17,7 @@ #include #include #include +#include #include SqlQueryModel::SqlQueryModel(QObject *parent) : @@ -224,20 +225,21 @@ QList > SqlQueryModel::groupItemsByRows(const QList> SqlQueryModel::groupItemsByTable(const QList& items) +QHash > SqlQueryModel::groupItemsByTable(const QList& items) { - QHash> itemsByTable; - Table table; + QHash> itemsByTable; + AliasedTable table; foreach (SqlQueryItem* item, items) { if (item->getColumn()) { table.setDatabase(item->getColumn()->database.toLower()); table.setTable(item->getColumn()->table.toLower()); + table.setTableAlias(item->getColumn()->tableAlias.toLower()); itemsByTable[table] << item; } else - itemsByTable[Table()] << item; + itemsByTable[AliasedTable()] << item; } return itemsByTable; @@ -373,12 +375,16 @@ void SqlQueryModel::commitInternal(const QList& items) return; } + // Getting number of rows to be added and deleted, so we can update totalPages at the end + int numberOfItemsAdded = groupItemsByRows(findItems(SqlQueryItem::DataRole::NEW_ROW, true)).size(); + int numberOfItemsDeleted = groupItemsByRows(findItems(SqlQueryItem::DataRole::DELETED, true)).size(); + // Removing "commit error" mark from items that are going to be commited now for (SqlQueryItem* item : items) item->setCommitingError(false); // Grouping by row and commiting - QList > groupedItems = groupItemsByRows(items); + QList> groupedItems = groupItemsByRows(items); bool ok = true; foreach (const QList& itemsInRow, groupedItems) { @@ -433,6 +439,14 @@ void SqlQueryModel::commitInternal(const QList& items) dbNameToAttachNameMapForCommit.clear(); for (Db* dbToDetach : dbListToDetach) db->detach(dbToDetach); + + + // Updating added/deleted counts, to honor rows not deleted because of some errors + numberOfItemsAdded -= groupItemsByRows(findItems(SqlQueryItem::DataRole::NEW_ROW, true)).size(); + numberOfItemsDeleted -= groupItemsByRows(findItems(SqlQueryItem::DataRole::DELETED, true)).size(); + int itemsAddedDeletedDelta = numberOfItemsAdded - numberOfItemsDeleted; + + recalculateRowsAndPages(itemsAddedDeletedDelta); } void SqlQueryModel::rollbackInternal(const QList& items) @@ -497,7 +511,7 @@ bool SqlQueryModel::commitEditedRow(const QList& itemsInRow) Dialect dialect = db->getDialect(); - QHash> itemsByTable = groupItemsByTable(itemsInRow); + QHash> itemsByTable = groupItemsByTable(itemsInRow); // Values QString query; @@ -507,9 +521,9 @@ bool SqlQueryModel::commitEditedRow(const QList& itemsInRow) RowId rowId; RowId newRowId; CommitUpdateQueryBuilder queryBuilder; - QHashIterator> it(itemsByTable); + QHashIterator> it(itemsByTable); QList items; - Table table; + AliasedTable table; while (it.hasNext()) { it.next(); @@ -713,7 +727,7 @@ QList SqlQueryModel::loadRow(SqlResultsRowPtr row) RowId SqlQueryModel::getRowIdValue(SqlResultsRowPtr row, int columnIdx) { RowId rowId; - Table table = tablesForColumns[columnIdx]; + AliasedTable table = tablesForColumns[columnIdx]; QHash rowIdColumns = tableToRowIdColumn[table]; QHashIterator it(rowIdColumns); QString col; @@ -795,7 +809,7 @@ RowId SqlQueryModel::getNewRowId(const RowId& currentRowId, const QListgetRowIdResultColumns()) { table.setDatabase(resCol->dbName); table.setTable(resCol->table); + table.setTableAlias(resCol->tableAlias); tableToRowIdColumn[table] = resCol->queryExecutorAliasToColumn; totalRowIdCols += resCol->queryExecutorAliasToColumn.size(); } @@ -850,10 +865,10 @@ void SqlQueryModel::readColumnDetails() editionForbiddenGlobalReasons << SqlQueryModelColumn::convert(reason); // Reading all the details from query executor source tables - QHash tableDetails = readTableDetails(); + QHash tableDetails = readTableDetails(); // Preparing for processing - Table table; + AliasedTable table; Column column; TableDetails details; TableDetails::ColumnDetails colDetails; @@ -871,7 +886,7 @@ void SqlQueryModel::readColumnDetails() modelColumn->editionForbiddenReason += editionForbiddenGlobalReasons; // Getting details of given table and column - table = Table(modelColumn->database, modelColumn->table); + table = AliasedTable(modelColumn->database, modelColumn->table, modelColumn->tableAlias); column = Column(modelColumn->database, modelColumn->table, modelColumn->column); details = tableDetails[table]; @@ -906,15 +921,15 @@ void SqlQueryModel::readColumnDetails() } } -QHash SqlQueryModel::readTableDetails() +QHash SqlQueryModel::readTableDetails() { - QHash results; + QHash results; SqliteQueryPtr query; SqliteCreateTablePtr createTable; Dialect dialect = db->getDialect(); SchemaResolver resolver(getDb()); QString database; - Table table; + AliasedTable table; QString columnName; foreach (const QueryExecutor::SourceTablePtr& srcTable, queryExecutor->getSourceTables()) @@ -932,7 +947,7 @@ QHash SqlQueryModel::readTableDetails() // Table details TableDetails tableDetails; - table = {database, srcTable->table}; + table = {database, srcTable->table, srcTable->alias}; // Table constraints foreach (SqliteCreateTable::Constraint* tableConstr, createTable->constraints) @@ -965,18 +980,18 @@ QHash SqlQueryModel::readTableDetails() } -QList SqlQueryModel::getTablesForColumns() +QList SqlQueryModel::getTablesForColumns() { - QList
columnTables; - Table table; + QList columnTables; + AliasedTable table; foreach (SqlQueryModelColumnPtr column, columns) { if (column->editionForbiddenReason.size() > 0) { - columnTables << Table(); + columnTables << AliasedTable(); continue; } - table = Table(column->database, column->table); + table = AliasedTable(column->database, column->table, column->tableAlias); columnTables << table; } return columnTables; @@ -1034,7 +1049,10 @@ void SqlQueryModel::handleExecFinished(SqlQueryPtr results) bool rowsCountedManually = queryExecutor->isRowCountingRequired() || rowCount() < CFG_UI.General.NumberOfRowsPerPage.get(); bool countRes = false; if (rowsCountedManually) + { emit totalRowsAndPagesAvailable(); + emit storeExecutionInHistory(); + } else countRes = queryExecutor->countResults(); @@ -1080,6 +1098,7 @@ void SqlQueryModel::resultsCountingFinished(quint64 rowsAffected, quint64 rowsRe this->totalPages = totalPages; detachDatabases(); emit totalRowsAndPagesAvailable(); + emit storeExecutionInHistory(); } void SqlQueryModel::itemValueEdited(SqlQueryItem* item) @@ -1375,6 +1394,18 @@ QString SqlQueryModel::getDatabaseForCommit(const QString& database) return database; } +void SqlQueryModel::recalculateRowsAndPages(int rowsDelta) +{ + totalRowsReturned += rowsDelta; + + int rowsPerPage = CFG_UI.General.NumberOfRowsPerPage.get(); + totalPages = (int)qCeil(((double)totalRowsReturned) / ((double)rowsPerPage)); + emit totalRowsAndPagesAvailable(); + + if (rowCount() == 0) + reload(); +} + void SqlQueryModel::addNewRow() { int row = rowCount(); diff --git a/SQLiteStudio3/guiSQLiteStudio/datagrid/sqlquerymodel.h b/SQLiteStudio3/guiSQLiteStudio/datagrid/sqlquerymodel.h index bdba29b..3e92bb2 100644 --- a/SQLiteStudio3/guiSQLiteStudio/datagrid/sqlquerymodel.h +++ b/SQLiteStudio3/guiSQLiteStudio/datagrid/sqlquerymodel.h @@ -120,7 +120,7 @@ class GUI_API_EXPORT SqlQueryModel : public QStandardItemModel void setView(SqlQueryView* value); static QList> groupItemsByRows(const QList& items); - static QHash > groupItemsByTable(const QList& items); + static QHash > groupItemsByTable(const QList& items); protected: class CommitUpdateQueryBuilder : public RowIdConditionBuilder @@ -204,7 +204,7 @@ class GUI_API_EXPORT SqlQueryModel : public QStandardItemModel QList getTableColumnModels(const QString& table); void updateItem(SqlQueryItem* item, const QVariant& value, int columnIndex, const RowId& rowId); RowId getNewRowId(const RowId& currentRowId, const QList items); - void updateRowIdForAllItems(const Table& table, const RowId& rowId, const RowId& newRowId); + void updateRowIdForAllItems(const AliasedTable& table, const RowId& rowId, const RowId& newRowId); QueryExecutor* queryExecutor = nullptr; Db* db = nullptr; @@ -241,8 +241,8 @@ class GUI_API_EXPORT SqlQueryModel : public QStandardItemModel void updateColumnHeaderLabels(); void executeQueryInternal(); void internalExecutionStopped(); - QHash readTableDetails(); - QList
getTablesForColumns(); + QHash readTableDetails(); + QList getTablesForColumns(); QList getColumnEditionEnabledList(); QList toItemList(const QModelIndexList& indexes) const; bool commitRow(const QList& itemsInRow); @@ -258,6 +258,7 @@ class GUI_API_EXPORT SqlQueryModel : public QStandardItemModel Icon& getIconForIdx(int idx) const; void detachDatabases(); QString getDatabaseForCommit(const QString& database); + void recalculateRowsAndPages(int rowsDelta); QString query; bool explain = false; @@ -323,7 +324,7 @@ class GUI_API_EXPORT SqlQueryModel : public QStandardItemModel QueryExecutor::SortList sortOrder; QHash columnMap; - QHash> tableToRowIdColumn; + QHash> tableToRowIdColumn; QStringList headerColumns; int rowNumBase = 0; SqlQueryView* view = nullptr; @@ -342,7 +343,7 @@ class GUI_API_EXPORT SqlQueryModel : public QStandardItemModel * @brief tablesForColumns * List of tables associated to \link #columns by order index. */ - QList
tablesForColumns; + QList tablesForColumns; /** * @brief columnEditionStatus @@ -418,6 +419,8 @@ class GUI_API_EXPORT SqlQueryModel : public QStandardItemModel */ void totalRowsAndPagesAvailable(); + void storeExecutionInHistory(); + /** * @brief commitStatusChanged * @param commitAvailable Tells if there's anything to commit/rollback or not. diff --git a/SQLiteStudio3/guiSQLiteStudio/datagrid/sqlquerymodelcolumn.cpp b/SQLiteStudio3/guiSQLiteStudio/datagrid/sqlquerymodelcolumn.cpp index 0966ede..3a2457c 100644 --- a/SQLiteStudio3/guiSQLiteStudio/datagrid/sqlquerymodelcolumn.cpp +++ b/SQLiteStudio3/guiSQLiteStudio/datagrid/sqlquerymodelcolumn.cpp @@ -7,6 +7,7 @@ SqlQueryModelColumn::SqlQueryModelColumn(const QueryExecutor::ResultColumnPtr& r displayName = resultColumn->displayName; column = resultColumn->column; table = resultColumn->table; + tableAlias = resultColumn->tableAlias; database = resultColumn->database.isEmpty() ? "main": resultColumn->database; foreach (QueryExecutor::ColumnEditionForbiddenReason reason, resultColumn->editionForbiddenReasons) editionForbiddenReason << SqlQueryModelColumn::convert(reason); @@ -223,7 +224,10 @@ SqlQueryModelColumn::Constraint* SqlQueryModelColumn::Constraint::create(const Q int idx = tableConstraint->getAffectedColumnIdx(column); if (idx < 0 || tableConstraint->foreignKey->indexedColumns.size() <= idx) { - qWarning() << "Could not find FK column for definition:" << tableConstraint->detokenize(); + // This case is perfectly fine if there are for example 2 foreign keys on the table, + // for 2 different columns. For each of those columns there will be 1 FK + // that enters here. + //qWarning() << "Could not find FK column for definition:" << tableConstraint->detokenize(); return nullptr; } diff --git a/SQLiteStudio3/guiSQLiteStudio/datagrid/sqlquerymodelcolumn.h b/SQLiteStudio3/guiSQLiteStudio/datagrid/sqlquerymodelcolumn.h index fb55fe5..e0f11e0 100644 --- a/SQLiteStudio3/guiSQLiteStudio/datagrid/sqlquerymodelcolumn.h +++ b/SQLiteStudio3/guiSQLiteStudio/datagrid/sqlquerymodelcolumn.h @@ -156,6 +156,7 @@ class GUI_API_EXPORT SqlQueryModelColumn QString column; QString table; QString database; + QString tableAlias; DataType dataType; QSet editionForbiddenReason; QList constraints; diff --git a/SQLiteStudio3/guiSQLiteStudio/datagrid/sqlqueryview.cpp b/SQLiteStudio3/guiSQLiteStudio/datagrid/sqlqueryview.cpp index 1f08b30..23a4991 100644 --- a/SQLiteStudio3/guiSQLiteStudio/datagrid/sqlqueryview.cpp +++ b/SQLiteStudio3/guiSQLiteStudio/datagrid/sqlqueryview.cpp @@ -11,6 +11,7 @@ #include "multieditor/multieditordialog.h" #include "uiconfig.h" #include "dialogs/sortdialog.h" +#include "services/notifymanager.h" #include #include #include @@ -21,6 +22,8 @@ #include #include #include +#include +#include CFG_KEYS_DEFINE(SqlQueryView) @@ -245,6 +248,59 @@ bool SqlQueryView::editInEditorIfNecessary(SqlQueryItem* item) return true; } +void SqlQueryView::paste(const QList >& data) +{ + QList selectedItems = getSelectedItems(); + if (selectedItems.isEmpty()) + { + notifyWarn(tr("No items selected to paste clipboard contents to.")); + return; + } + + qSort(selectedItems); + SqlQueryItem* topLeft = selectedItems.first(); + + int columnCount = getModel()->columnCount(); + int rowCount = getModel()->rowCount(); + int rowIdx = topLeft->row(); + int colIdx = topLeft->column(); + + SqlQueryItem* item = nullptr; + + foreach (const QList& cells, data) + { + // Check if we're out of rows range + if (rowIdx >= rowCount) + { + // No more rows available. + qDebug() << "Tried to paste more rows than available in the grid."; + break; + } + + foreach (const QVariant& cell, cells) + { + // Get current cell + if (colIdx >= columnCount) + { + // No more columns available. + qDebug() << "Tried to paste more columns than available in the grid."; + break; + } + item = getModel()->itemFromIndex(rowIdx, colIdx); + + // Set value to the cell + item->setValue(cell, false, false); + + // Go to next cell + colIdx++; + } + + // Go to next row, first cell + rowIdx++; + colIdx = topLeft->column(); + } +} + void SqlQueryView::updateCommitRollbackActions(bool enabled) { actionMap[COMMIT]->setEnabled(enabled); @@ -324,69 +380,80 @@ void SqlQueryView::copy() QList selectedItems = getSelectedItems(); QList > groupedItems = SqlQueryModel::groupItemsByRows(selectedItems); + QVariant itemValue; QStringList cells; QList rows; + QPair>> theDataPair; + QList> theData; + QList theDataRow; + foreach (const QList& itemsInRows, groupedItems) { foreach (SqlQueryItem* item, itemsInRows) - cells << item->getFullValue().toString(); + { + itemValue = item->getFullValue(); + cells << itemValue.toString(); + theDataRow << itemValue; + } rows << cells; cells.clear(); + + theData << theDataRow; + theDataRow.clear(); } + QMimeData* mimeData = new QMimeData(); QString tsv = TsvSerializer::serialize(rows); - qApp->clipboard()->setText(tsv); + mimeData->setText(tsv); + + QString md5 = QCryptographicHash::hash(tsv.toUtf8(), QCryptographicHash::Md5); + theDataPair.first = md5; + theDataPair.second = theData; + + QByteArray serializedData; + QDataStream stream(&serializedData, QIODevice::WriteOnly); + stream << theDataPair; + mimeData->setData(mimeDataId, serializedData); + + qApp->clipboard()->setMimeData(mimeData); } void SqlQueryView::paste() { - QList deserializedRows = TsvSerializer::deserialize(qApp->clipboard()->text()); - - QList selectedItems = getSelectedItems(); - qSort(selectedItems); - SqlQueryItem* topLeft = selectedItems.first(); + const QMimeData* mimeData = qApp->clipboard()->mimeData(); + if (mimeData->hasFormat(mimeDataId)) + { + QString tsv = mimeData->text(); + QString md5 = QCryptographicHash::hash(tsv.toUtf8(), QCryptographicHash::Md5); - int columnCount = getModel()->columnCount(); - int rowCount = getModel()->rowCount(); - int rowIdx = topLeft->row(); - int colIdx = topLeft->column(); + QPair>> theDataPair; + QByteArray serializedData = mimeData->data(mimeDataId); + QDataStream stream(&serializedData, QIODevice::ReadOnly); + stream >> theDataPair; - SqlQueryItem* item = nullptr; - - foreach (const QStringList& cells, deserializedRows) - { - // Check if we're out of rows range - if (rowIdx >= rowCount) + if (md5 == theDataPair.first) { - // No more rows available. - qDebug() << "Tried to paste more rows than available in the grid."; - break; + paste(theDataPair.second); + return; } + } - foreach (const QString& cell, cells) - { - // Get current cell - if (colIdx >= columnCount) - { - // No more columns available. - qDebug() << "Tried to paste more columns than available in the grid."; - break; - } - item = getModel()->itemFromIndex(rowIdx, colIdx); - - // Set value to the cell - item->setValue(cell, false, false); + QList deserializedRows = TsvSerializer::deserialize(mimeData->text()); - // Go to next cell - colIdx++; - } + QList dataRow; + QList> dataToPaste; + for (const QStringList& cells : deserializedRows) + { + for (const QString& cell : cells) + dataRow << cell; - // Go to next row, first cell - rowIdx++; - colIdx = topLeft->column(); + dataToPaste << dataRow; + dataRow.clear(); } + + paste(dataToPaste); } void SqlQueryView::copyAs() diff --git a/SQLiteStudio3/guiSQLiteStudio/datagrid/sqlqueryview.h b/SQLiteStudio3/guiSQLiteStudio/datagrid/sqlqueryview.h index a523200..f409559 100644 --- a/SQLiteStudio3/guiSQLiteStudio/datagrid/sqlqueryview.h +++ b/SQLiteStudio3/guiSQLiteStudio/datagrid/sqlqueryview.h @@ -80,6 +80,9 @@ class GUI_API_EXPORT SqlQueryView : public QTableView, public ExtActionContainer void setupActionsForMenu(SqlQueryItem* currentItem, const QList& selectedItems); void setupHeaderMenu(); bool editInEditorIfNecessary(SqlQueryItem* item); + void paste(const QList>& data); + + constexpr static const char* mimeDataId = "application/x-sqlitestudio-data-view-data"; SqlQueryItemDelegate* itemDelegate = nullptr; QMenu* contextMenu = nullptr; diff --git a/SQLiteStudio3/guiSQLiteStudio/dblistmodel.cpp b/SQLiteStudio3/guiSQLiteStudio/dblistmodel.cpp index af9da8f..8153fed 100644 --- a/SQLiteStudio3/guiSQLiteStudio/dblistmodel.cpp +++ b/SQLiteStudio3/guiSQLiteStudio/dblistmodel.cpp @@ -77,6 +77,8 @@ void DbListModel::setSortMode(const QString& sortMode) this->sortMode = SortMode::LikeDbTree; else if (sortMode == "Alphabetical") this->sortMode = SortMode::Alphabetical; + else if (sortMode == "AlphabeticalCaseInsensitive") + this->sortMode = SortMode::AlphabeticalCaseInsensitive; else this->sortMode = SortMode::ConnectionOrder; @@ -91,6 +93,8 @@ QString DbListModel::getSortModeString() const return "LikeDbTree"; case DbListModel::SortMode::Alphabetical: return "Alphabetical"; + case DbListModel::SortMode::AlphabeticalCaseInsensitive: + return "AlphabeticalCaseInsensitive"; case DbListModel::SortMode::ConnectionOrder: break; } @@ -119,6 +123,12 @@ void DbListModel::sort() qSort(dbList.begin(), dbList.end(), comparer); break; } + case DbListModel::SortMode::AlphabeticalCaseInsensitive: + { + AlphaComparer comparer(Qt::CaseInsensitive); + qSort(dbList.begin(), dbList.end(), comparer); + break; + } case DbListModel::SortMode::ConnectionOrder: break; } @@ -183,7 +193,12 @@ bool DbListModel::DbTreeComparer::operator()(Db* db1, Db* db2) return dbTreeOrder.indexOf(db1->getName()) < dbTreeOrder.indexOf(db2->getName()); } +DbListModel::AlphaComparer::AlphaComparer(Qt::CaseSensitivity cs) : + cs(cs) +{ +} + bool DbListModel::AlphaComparer::operator()(Db* db1, Db* db2) { - return db1->getName().compare(db2->getName()) < 0; + return db1->getName().compare(db2->getName(), cs) < 0; } diff --git a/SQLiteStudio3/guiSQLiteStudio/dblistmodel.h b/SQLiteStudio3/guiSQLiteStudio/dblistmodel.h index 57928df..c375674 100644 --- a/SQLiteStudio3/guiSQLiteStudio/dblistmodel.h +++ b/SQLiteStudio3/guiSQLiteStudio/dblistmodel.h @@ -15,6 +15,7 @@ class GUI_API_EXPORT DbListModel : public QAbstractListModel { LikeDbTree, Alphabetical, + AlphabeticalCaseInsensitive, ConnectionOrder }; @@ -49,7 +50,12 @@ class GUI_API_EXPORT DbListModel : public QAbstractListModel class AlphaComparer { public: + AlphaComparer(Qt::CaseSensitivity cs = Qt::CaseSensitive); + bool operator()(Db* db1, Db* db2); + + private: + Qt::CaseSensitivity cs; }; void sort(); diff --git a/SQLiteStudio3/guiSQLiteStudio/dbobjlistmodel.cpp b/SQLiteStudio3/guiSQLiteStudio/dbobjlistmodel.cpp index 99d3f27..00914a1 100644 --- a/SQLiteStudio3/guiSQLiteStudio/dbobjlistmodel.cpp +++ b/SQLiteStudio3/guiSQLiteStudio/dbobjlistmodel.cpp @@ -14,12 +14,7 @@ QVariant DbObjListModel::data(const QModelIndex& index, int role) const return QVariant(); if (role == Qt::DisplayRole || role == Qt::EditRole) - { - if (sortMode == SortMode::Alphabetical) - return objectList[index.row()]; - else - return unsortedObjectList[index.row()]; - } + return objectList[index.row()]; return QVariant(); } @@ -84,7 +79,19 @@ void DbObjListModel::updateList() resolver.setIgnoreSystemObjects(!includeSystemObjects); objectList = resolver.getObjects(typeString().toLower()); unsortedObjectList = objectList; - qSort(objectList); + + switch (sortMode) + { + case SortMode::Alphabetical: + objectList.sort(); + break; + case SortMode::AlphabeticalCaseInsensitive: + objectList.sort(Qt::CaseInsensitive); + break; + case SortMode::LikeInDb: + break; + } + endResetModel(); } diff --git a/SQLiteStudio3/guiSQLiteStudio/dbobjlistmodel.h b/SQLiteStudio3/guiSQLiteStudio/dbobjlistmodel.h index cac1202..4ae3608 100644 --- a/SQLiteStudio3/guiSQLiteStudio/dbobjlistmodel.h +++ b/SQLiteStudio3/guiSQLiteStudio/dbobjlistmodel.h @@ -14,7 +14,8 @@ class GUI_API_EXPORT DbObjListModel : public QAbstractListModel enum class SortMode { LikeInDb, - Alphabetical + Alphabetical, + AlphabeticalCaseInsensitive }; enum class ObjectType diff --git a/SQLiteStudio3/guiSQLiteStudio/dbtree/dbtree.ui b/SQLiteStudio3/guiSQLiteStudio/dbtree/dbtree.ui index 52b0c7b..755c9b0 100644 --- a/SQLiteStudio3/guiSQLiteStudio/dbtree/dbtree.ui +++ b/SQLiteStudio3/guiSQLiteStudio/dbtree/dbtree.ui @@ -14,7 +14,7 @@ false - QDockWidget::AllDockWidgetFeatures + QDockWidget::DockWidgetFloatable|QDockWidget::DockWidgetMovable Qt::LeftDockWidgetArea|Qt::RightDockWidgetArea diff --git a/SQLiteStudio3/guiSQLiteStudio/dbtree/dbtreemodel.cpp b/SQLiteStudio3/guiSQLiteStudio/dbtree/dbtreemodel.cpp index 281510f..a4e736f 100644 --- a/SQLiteStudio3/guiSQLiteStudio/dbtree/dbtreemodel.cpp +++ b/SQLiteStudio3/guiSQLiteStudio/dbtree/dbtreemodel.cpp @@ -222,15 +222,16 @@ void DbTreeModel::restoreGroup(const Config::DbGroupPtr& group, QList* dbLi } else { - // If db is managed by manager, it means it was successfully loaded. - // Otherwise there was a problem with the file, or with plugin for that database - // and we still want to have dbtree item for that database, we will just hide it. - // Later, when plugin is loaded, item might become visible. + db = DBLIST->getByName(group->referencedDbName); + + // Databases referenced in groups must exist on database list. If not, we ignore them. + // Even invalid (no plugin, no file) databases have entry in dblist. + if (!db) + return; + item = DbTreeItemFactory::createDb(group->referencedDbName, this); item->setDb(group->referencedDbName); - - db = DBLIST->getByName(group->referencedDbName); - if (db && dbList) + if (dbList) dbList->removeOne(db); } @@ -297,6 +298,7 @@ void DbTreeModel::dbUpdated(const QString& oldName, Db* db) item->setText(db->getName()); item->setDb(db->getName()); + item->updateDbIcon(); } void DbTreeModel::dbRemoved(Db* db) diff --git a/SQLiteStudio3/guiSQLiteStudio/dialogs/columndialog.ui b/SQLiteStudio3/guiSQLiteStudio/dialogs/columndialog.ui index 2133aca..1ac6cbb 100644 --- a/SQLiteStudio3/guiSQLiteStudio/dialogs/columndialog.ui +++ b/SQLiteStudio3/guiSQLiteStudio/dialogs/columndialog.ui @@ -31,6 +31,9 @@ 0 + + Scale + @@ -48,6 +51,9 @@ 0 + + Precision + diff --git a/SQLiteStudio3/guiSQLiteStudio/dialogs/configdialog.cpp b/SQLiteStudio3/guiSQLiteStudio/dialogs/configdialog.cpp index b22ee6e..1ff053f 100644 --- a/SQLiteStudio3/guiSQLiteStudio/dialogs/configdialog.cpp +++ b/SQLiteStudio3/guiSQLiteStudio/dialogs/configdialog.cpp @@ -1238,7 +1238,7 @@ void ConfigDialog::initPluginsPage() builtIn = PLUGINS->isBuiltIn(pluginName); title = PLUGINS->getTitle(pluginName); if (builtIn) - title += tr("%1 (built-in)", "plugins manager in configuration dialog").arg(title); + title = tr("%1 (built-in)", "plugins manager in configuration dialog").arg(title); item = new QTreeWidgetItem({title}); item->setCheckState(0, PLUGINS->isLoaded(pluginName) ? Qt::Checked : Qt::Unchecked); diff --git a/SQLiteStudio3/guiSQLiteStudio/dialogs/dbdialog.cpp b/SQLiteStudio3/guiSQLiteStudio/dialogs/dbdialog.cpp index a2a9c36..05d50af 100644 --- a/SQLiteStudio3/guiSQLiteStudio/dialogs/dbdialog.cpp +++ b/SQLiteStudio3/guiSQLiteStudio/dialogs/dbdialog.cpp @@ -15,6 +15,7 @@ #include #include #include +#include DbDialog::DbDialog(Mode mode, QWidget *parent) : QDialog(parent), @@ -54,26 +55,6 @@ QString DbDialog::getName() return ui->nameEdit->text(); } -Db* DbDialog::getDb() -{ - if (ui->typeCombo->currentIndex() < 0) - return nullptr; - - Db* testDb = nullptr; - QHash options = collectOptions(); - QString path = ui->fileEdit->text(); - foreach (DbPlugin* plugin, dbPlugins) - { - if (options.contains(DB_PLUGIN) && options[DB_PLUGIN].toString() != plugin->getName()) - continue; - - testDb = plugin->getInstance("", path, options); - if (testDb) - return testDb; - } - return testDb; -} - bool DbDialog::isPermanent() { return ui->permamentCheckBox->isChecked(); @@ -95,17 +76,18 @@ void DbDialog::showEvent(QShowEvent *e) { if (db) { + disableTypeAutodetection = true; int idx = ui->typeCombo->findText(db->getTypeLabel()); ui->typeCombo->setCurrentIndex(idx); - ui->typeCombo->setEnabled(false); // converting to other type is in separate dialog, it's different feature ui->generateCheckBox->setChecked(false); ui->fileEdit->setText(db->getPath()); ui->nameEdit->setText(db->getName()); + disableTypeAutodetection = false; } else if (ui->typeCombo->count() > 0) { - int idx = ui->typeCombo->findText("SQLite3"); // we should have SQLite3 plugin + int idx = ui->typeCombo->findText("SQLite 3", Qt::MatchFixedString); // we should have SQLite 3 plugin if (idx > -1) ui->typeCombo->setCurrentIndex(idx); else @@ -126,24 +108,30 @@ void DbDialog::init() { ui->setupUi(this); - ui->browseButton->setIcon(ICONS.DATABASE_FILE); - dbPlugins = PLUGINS->getLoadedPlugins(); - foreach (DbPlugin* dbPlugin, dbPlugins) - { - ui->typeCombo->addItem(dbPlugin->getLabel()); - } + ui->browseCreateButton->setIcon(ICONS.PLUS); - ui->browseButton->setVisible(true); + for (DbPlugin* dbPlugin : PLUGINS->getLoadedPlugins()) + dbPlugins[dbPlugin->getLabel()] = dbPlugin; + + QStringList typeLabels; + typeLabels += dbPlugins.keys(); + typeLabels.sort(Qt::CaseInsensitive); + ui->typeCombo->addItems(typeLabels); + + ui->browseCreateButton->setVisible(true); ui->testConnIcon->setVisible(false); connect(ui->fileEdit, SIGNAL(textChanged(QString)), this, SLOT(fileChanged(QString))); connect(ui->nameEdit, SIGNAL(textChanged(QString)), this, SLOT(nameModified(QString))); connect(ui->generateCheckBox, SIGNAL(toggled(bool)), this, SLOT(generateNameSwitched(bool))); - connect(ui->browseButton, SIGNAL(clicked()), this, SLOT(browseClicked())); + connect(ui->browseCreateButton, SIGNAL(clicked()), this, SLOT(browseClicked())); + connect(ui->browseOpenButton, SIGNAL(clicked()), this, SLOT(browseClicked())); connect(ui->testConnButton, SIGNAL(clicked()), this, SLOT(testConnectionClicked())); connect(ui->typeCombo, SIGNAL(currentIndexChanged(int)), this, SLOT(dbTypeChanged(int))); generateNameSwitched(true); + + layout()->setSizeConstraint(QLayout::SetFixedSize); } void DbDialog::updateOptions() @@ -153,10 +141,14 @@ void DbDialog::updateOptions() // Remove olds foreach (QWidget* w, optionWidgets) { - ui->gridLayout->removeWidget(w); + ui->optionsGrid->removeWidget(w); delete w; } - adjustSize(); + + customBrowseHandler = nullptr; + ui->pathGroup->setTitle(tr("File")); + ui->browseOpenButton->setToolTip(tr("Browse for existing database file on local computer")); + ui->browseCreateButton->setVisible(true); optionWidgets.clear(); optionKeyToWidget.clear(); @@ -166,31 +158,43 @@ void DbDialog::updateOptions() lastWidgetInTabOrder = ui->permamentCheckBox; // Retrieve new list - DbPlugin* plugin = nullptr; - if (dbPlugins.count() > 0) + if (ui->typeCombo->currentIndex() > -1) { - int idx = ui->typeCombo->currentIndex(); - if (idx > -1 ) + DbPlugin* plugin = dbPlugins[ui->typeCombo->currentText()]; + QList optList = plugin->getOptionsList(); + if (optList.size() > 0) { - plugin = dbPlugins[idx]; - QList optList = plugin->getOptionsList(); - if (optList.size() > 0) + // Add new options + int row = ADDITIONAL_ROWS_BEGIN_INDEX; + for (const DbPluginOption& opt : optList) { - // Add new options - int row = ADDITIONAL_ROWS_BEGIN_INDEX; - foreach (DbPluginOption opt, optList) - addOption(opt, row++); + addOption(opt, row); + row++; } } } - adjustSize(); + setUpdatesEnabled(true); } -void DbDialog::addOption(const DbPluginOption& option, int row) +void DbDialog::addOption(const DbPluginOption& option, int& row) { + if (option.type == DbPluginOption::CUSTOM_PATH_BROWSE) + { + // This option does not add any editor, but has it's own label for path edit. + row--; + ui->pathGroup->setTitle(option.label); + ui->browseCreateButton->setVisible(false); + if (!option.toolTip.isEmpty()) + ui->browseOpenButton->setToolTip(option.toolTip); + + customBrowseHandler = option.customBrowseHandler; + return; + } + QLabel* label = new QLabel(option.label, this); + label->setAlignment(Qt::AlignVCenter|Qt::AlignRight); QWidget* editor = nullptr; QWidget* editorHelper = nullptr; // TODO, based on plugins for Url handlers @@ -204,15 +208,15 @@ void DbDialog::addOption(const DbPluginOption& option, int row) optionKeyToWidget[option.key] = editor; optionKeyToType[option.key] = option.type; - ui->gridLayout->addWidget(label, row, 0); - ui->gridLayout->addWidget(editor, row, 1); + ui->optionsGrid->addWidget(label, row, 0); + ui->optionsGrid->addWidget(editor, row, 1); setTabOrder(lastWidgetInTabOrder, editor); lastWidgetInTabOrder = editor; if (editorHelper) { - ui->gridLayout->addWidget(editorHelper, row, 2); + ui->optionsGrid->addWidget(editorHelper, row, 2); optionWidgets << editorHelper; helperToKey[editorHelper] = option.key; @@ -307,6 +311,8 @@ QWidget *DbDialog::getEditor(const DbPluginOption& opt, QWidget*& editorHelper) connect(sb, SIGNAL(valueChanged(double)), this, SLOT(propertyChanged())); break; } + case DbPluginOption::CUSTOM_PATH_BROWSE: + return nullptr; // should not happen ever, asserted one stack level before default: // TODO plugin based handling of custom editors qWarning() << "Unhandled DbDialog option for creating editor."; @@ -344,6 +350,8 @@ QVariant DbDialog::getValueFrom(DbPluginOption::Type type, QWidget *editor) case DbPluginOption::CHOICE: value = dynamic_cast(editor)->currentText(); break; + case DbPluginOption::CUSTOM_PATH_BROWSE: + break; // should not happen ever default: // TODO plugin based handling of custom editors qWarning() << "Unhandled DbDialog option for value."; @@ -373,6 +381,8 @@ void DbDialog::setValueFor(DbPluginOption::Type type, QWidget *editor, const QVa case DbPluginOption::CHOICE: dynamic_cast(editor)->setCurrentText(value.toString()); break; + case DbPluginOption::CUSTOM_PATH_BROWSE: + break; // should not happen ever default: qWarning() << "Unhandled DbDialog option to set value."; // TODO plugin based handling of custom editors @@ -382,18 +392,19 @@ void DbDialog::setValueFor(DbPluginOption::Type type, QWidget *editor, const QVa void DbDialog::updateType() { + if (disableTypeAutodetection) + return; + QFileInfo file(ui->fileEdit->text()); if (!file.exists() || file.isDir()) - { - ui->typeCombo->setEnabled(true); return; - } - DbPlugin* validPlugin = nullptr; + QString currentPluginLabel = ui->typeCombo->currentText(); + QList validPlugins; QHash options; QString path = ui->fileEdit->text(); Db* probeDb = nullptr; - foreach (DbPlugin* plugin, dbPlugins) + for (DbPlugin* plugin : dbPlugins) { probeDb = plugin->getInstance("", path, options); if (probeDb) @@ -401,15 +412,15 @@ void DbDialog::updateType() delete probeDb; probeDb = nullptr; - validPlugin = plugin; - break; + if (plugin->getLabel() == currentPluginLabel) + return; // current plugin is among valid plugins, no need to change anything + + validPlugins << plugin; } } - if (validPlugin) - ui->typeCombo->setCurrentText(validPlugin->getLabel()); - - ui->typeCombo->setEnabled(!validPlugin); + if (validPlugins.size() > 0) + ui->typeCombo->setCurrentText(validPlugins.first()->getLabel()); } QHash DbDialog::collectOptions() @@ -424,7 +435,7 @@ QHash DbDialog::collectOptions() DbPlugin* plugin = nullptr; if (dbPlugins.count() > 0) { - plugin = dbPlugins[ui->typeCombo->currentIndex()]; + plugin = dbPlugins[ui->typeCombo->currentText()]; options[DB_PLUGIN] = plugin->getName(); } @@ -433,9 +444,32 @@ QHash DbDialog::collectOptions() bool DbDialog::testDatabase() { + if (ui->typeCombo->currentIndex() < 0) + return false; + QString path = ui->fileEdit->text(); - bool existed = QFile::exists(path); - bool res = getDb() != nullptr; + if (path.isEmpty()) + return false; + + QUrl url(path); + if (url.scheme().isEmpty()) + url.setScheme("file"); + + bool existed = false; + if (url.isLocalFile() && QFile::exists(path)) + existed = QFile::exists(path); + + QHash options = collectOptions(); + DbPlugin* plugin = dbPlugins[ui->typeCombo->currentText()]; + Db* testDb = plugin->getInstance("", path, options); + + bool res = false; + if (testDb) + { + res = true; + delete testDb; + } + if (!existed) { QFile file(path); @@ -522,10 +556,9 @@ void DbDialog::valueForNameGenerationChanged() if (!ui->generateCheckBox->isChecked()) return; - DbPlugin* plugin = nullptr; if (dbPlugins.count() > 0) { - plugin = dbPlugins[ui->typeCombo->currentIndex()]; + DbPlugin* plugin = dbPlugins[ui->typeCombo->currentText()]; QString generatedName = plugin->generateDbName(ui->fileEdit->text()); generatedName = generateUniqueName(generatedName, existingDatabaseNames); ui->nameEdit->setText(generatedName); @@ -549,7 +582,7 @@ void DbDialog::generateNameSwitched(bool checked) { if (checked) { - ui->nameEdit->setPlaceholderText(tr("The name will be auto-generated")); + ui->nameEdit->setPlaceholderText(tr("Auto-generated")); valueForNameGenerationChanged(); } else @@ -570,6 +603,14 @@ void DbDialog::fileChanged(const QString &arg1) void DbDialog::browseClicked() { + if (customBrowseHandler) + { + customBrowseHandler(ui->fileEdit->text()); + return; + } + + bool createMode = (sender() == ui->browseCreateButton); + QFileInfo fileInfo(ui->fileEdit->text()); QString dir; if (ui->fileEdit->text().isEmpty()) @@ -581,7 +622,7 @@ void DbDialog::browseClicked() else dir = getFileDialogInitPath(); - QString path = getDbPath(dir); + QString path = getDbPath(createMode, dir); if (path.isNull()) return; diff --git a/SQLiteStudio3/guiSQLiteStudio/dialogs/dbdialog.h b/SQLiteStudio3/guiSQLiteStudio/dialogs/dbdialog.h index b2c0d68..ce73b11 100644 --- a/SQLiteStudio3/guiSQLiteStudio/dialogs/dbdialog.h +++ b/SQLiteStudio3/guiSQLiteStudio/dialogs/dbdialog.h @@ -47,12 +47,11 @@ class GUI_API_EXPORT DbDialog : public QDialog private: void init(); void updateOptions(); - void addOption(const DbPluginOption& option, int row); + void addOption(const DbPluginOption& option, int& row); QWidget* getEditor(const DbPluginOption& opt, QWidget *&editorHelper); QVariant getValueFrom(DbPluginOption::Type type, QWidget* editor); void setValueFor(DbPluginOption::Type type, QWidget* editor, const QVariant& value); void updateType(); - Db* getDb(); bool testDatabase(); bool validate(); void updateState(); @@ -61,14 +60,16 @@ class GUI_API_EXPORT DbDialog : public QDialog Mode mode; QStringList existingDatabaseNames; Db* db = nullptr; - QList dbPlugins; + QHash dbPlugins; QList optionWidgets; QHash optionKeyToWidget; QHash optionKeyToType; QHash helperToKey; QWidget* lastWidgetInTabOrder = nullptr; + DbPluginOption::CustomBrowseHandler customBrowseHandler = nullptr; + bool disableTypeAutodetection = false; - static const constexpr int ADDITIONAL_ROWS_BEGIN_INDEX = 4; + static const constexpr int ADDITIONAL_ROWS_BEGIN_INDEX = 1; private slots: void typeChanged(int index); diff --git a/SQLiteStudio3/guiSQLiteStudio/dialogs/dbdialog.ui b/SQLiteStudio3/guiSQLiteStudio/dialogs/dbdialog.ui index fb53428..6f35079 100644 --- a/SQLiteStudio3/guiSQLiteStudio/dialogs/dbdialog.ui +++ b/SQLiteStudio3/guiSQLiteStudio/dialogs/dbdialog.ui @@ -7,7 +7,7 @@ 0 0 455 - 200 + 365 @@ -21,127 +21,124 @@ - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - Database driver - - - - - - - - - true - - - - - - - Name - - - - - - - Type - - - - - - - - - - - - Browse for database file on local computer - - - - - - - - - - - - File - - - - - - - Generate name basing on file path - - - - - - true - - - - - - - Permanent - - - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - <p>Enable this if you want the database to be stored in configuration file and restored every time SQLiteStudio is started.</p> - - - - - - true - - - - - - + + + Database type + + + + + + Database driver + + + + + + + + + + File + + + + + + + + + Create new database file + + + + + + + :/icons/img/plus.png:/icons/img/plus.png + + + + + + + + + + + :/icons/img/open_sql_file.png:/icons/img/open_sql_file.png + + + + + + + + + + Name (on the list) + + + + + + true + + + + + + + Generate name basing on file path + + + Generate automatically + + + true + + + + + + + + + + Options + + + + + + <p>Enable this if you want the database to be stored in configuration file and restored every time SQLiteStudio is started.</p> + + + Permanent (keep it in configuration) + + + true + + + + + + + + + + Qt::Horizontal + + + QSizePolicy::Fixed + + + + 360 + 1 + + + @@ -161,7 +158,7 @@ - Test database connection + Test connection @@ -190,15 +187,9 @@ - - fileEdit - browseButton - nameEdit - generateCheckBox - typeCombo - permamentCheckBox - - + + + buttonBox diff --git a/SQLiteStudio3/guiSQLiteStudio/dialogs/exportdialog.cpp b/SQLiteStudio3/guiSQLiteStudio/dialogs/exportdialog.cpp index e495dd9..91b4087 100644 --- a/SQLiteStudio3/guiSQLiteStudio/dialogs/exportdialog.cpp +++ b/SQLiteStudio3/guiSQLiteStudio/dialogs/exportdialog.cpp @@ -124,6 +124,14 @@ void ExportDialog::setDatabaseMode(Db* db) this->db = db; } +void ExportDialog::setPreselectedDb(Db *db) +{ + if (!db->isOpen()) + return; + + this->db = db; +} + void ExportDialog::initModePage() { connect(ui->subjectDatabaseRadio, SIGNAL(clicked()), this, SLOT(updateExportMode())); @@ -146,10 +154,11 @@ void ExportDialog::initTablePage() dbListModel = new DbListModel(this); dbListModel->setCombo(ui->exportTableDbNameCombo); - dbListModel->setSortMode(DbListModel::SortMode::Alphabetical); + dbListModel->setSortMode(DbListModel::SortMode::AlphabeticalCaseInsensitive); tablesModel = new DbObjListModel(this); tablesModel->setType(DbObjListModel::ObjectType::TABLE); + tablesModel->setSortMode(DbObjListModel::SortMode::AlphabeticalCaseInsensitive); connect(this, SIGNAL(tablePageCompleteChanged()), ui->tablePage, SIGNAL(completeChanged())); } @@ -295,6 +304,9 @@ void ExportDialog::tablePageDisplayed() if (table.isNull()) // table mode selected by user, not forced by setTableMode(). { ui->exportTableDbNameCombo->setModel(dbListModel); + if (db) + ui->exportTableDbNameCombo->setCurrentText(db->getName()); + connect(ui->exportTableDbNameCombo, SIGNAL(currentIndexChanged(int)), this, SLOT(updateDbTables())); ui->exportTableNameCombo->setModel(tablesModel); @@ -313,6 +325,9 @@ void ExportDialog::queryPageDisplayed() if (query.isNull()) // query mode selected by user, not forced by setQueryMode(). { ui->queryDatabaseCombo->setModel(dbListModel); + if (db) + ui->queryDatabaseCombo->setCurrentText(db->getName()); + connect(ui->queryDatabaseCombo, SIGNAL(currentIndexChanged(int)), ui->queryPage, SIGNAL(completeChanged())); } diff --git a/SQLiteStudio3/guiSQLiteStudio/dialogs/exportdialog.h b/SQLiteStudio3/guiSQLiteStudio/dialogs/exportdialog.h index 296aa4d..0471172 100644 --- a/SQLiteStudio3/guiSQLiteStudio/dialogs/exportdialog.h +++ b/SQLiteStudio3/guiSQLiteStudio/dialogs/exportdialog.h @@ -26,6 +26,7 @@ class GUI_API_EXPORT ExportDialog : public QWizard void setTableMode(Db* db, const QString& table); void setQueryMode(Db* db, const QString& query); void setDatabaseMode(Db* db); + void setPreselectedDb(Db* db); int nextId() const; bool isPluginConfigValid() const; diff --git a/SQLiteStudio3/guiSQLiteStudio/dialogs/importdialog.cpp b/SQLiteStudio3/guiSQLiteStudio/dialogs/importdialog.cpp index 32ec30f..c16b90e 100644 --- a/SQLiteStudio3/guiSQLiteStudio/dialogs/importdialog.cpp +++ b/SQLiteStudio3/guiSQLiteStudio/dialogs/importdialog.cpp @@ -83,12 +83,13 @@ void ImportDialog::initTablePage() { dbListModel = new DbListModel(this); dbListModel->setCombo(ui->dbNameCombo); - dbListModel->setSortMode(DbListModel::SortMode::Alphabetical); + dbListModel->setSortMode(DbListModel::SortMode::AlphabeticalCaseInsensitive); ui->dbNameCombo->setModel(dbListModel); tablesModel = new DbObjListModel(this); tablesModel->setIncludeSystemObjects(false); tablesModel->setType(DbObjListModel::ObjectType::TABLE); + tablesModel->setSortMode(DbObjListModel::SortMode::AlphabeticalCaseInsensitive); ui->tableNameCombo->setModel(tablesModel); refreshTables(); @@ -166,14 +167,6 @@ void ImportDialog::updateStandardOptions() bool showFileName = currentPlugin->standardOptionsToEnable().testFlag(ImportManager::FILE_NAME); bool showCodec = currentPlugin->standardOptionsToEnable().testFlag(ImportManager::CODEC); - if (!showFileName && !showCodec) - { - ui->dsOptionsGroup->setVisible(false); - return; - } - - ui->dsOptionsGroup->setVisible(true); - int row = 0; QGridLayout* grid = dynamic_cast(ui->dsOptionsGroup->layout()); if (showFileName) @@ -355,6 +348,8 @@ void ImportDialog::accept() if (currentPlugin->standardOptionsToEnable().testFlag(ImportManager::CODEC)) stdConfig.codec = ui->codecCombo->currentText(); + stdConfig.ignoreErrors = ui->ignoreErrorsCheck->isChecked(); + Db* db = DBLIST->getByName(ui->dbNameCombo->currentText());; if (!db) { diff --git a/SQLiteStudio3/guiSQLiteStudio/dialogs/importdialog.ui b/SQLiteStudio3/guiSQLiteStudio/dialogs/importdialog.ui index c8756f7..dfa8ace 100644 --- a/SQLiteStudio3/guiSQLiteStudio/dialogs/importdialog.ui +++ b/SQLiteStudio3/guiSQLiteStudio/dialogs/importdialog.ui @@ -103,8 +103,8 @@ 0 0 - 479 - 310 + 269 + 280 @@ -141,13 +141,6 @@ Options - - - - Input file: - - - @@ -183,9 +176,26 @@ + + + + Input file: + + + + + + + <p>If enabled, any constraint violation, or invalid data format (wrong column count), or any other problem encountered during import will be ignored and the importing will be continued.</p> + + + Ignore errors + + + diff --git a/SQLiteStudio3/guiSQLiteStudio/dialogs/triggerdialog.cpp b/SQLiteStudio3/guiSQLiteStudio/dialogs/triggerdialog.cpp index 0707bd3..12baafd 100644 --- a/SQLiteStudio3/guiSQLiteStudio/dialogs/triggerdialog.cpp +++ b/SQLiteStudio3/guiSQLiteStudio/dialogs/triggerdialog.cpp @@ -19,6 +19,9 @@ #include #include +QStringList TriggerDialog::tableEventNames; +QStringList TriggerDialog::viewEventNames; + TriggerDialog::TriggerDialog(Db* db, QWidget *parent) : QDialog(parent), db(db), @@ -54,6 +57,18 @@ void TriggerDialog::setTrigger(const QString& name) initTrigger(); } +void TriggerDialog::staticInit() +{ + tableEventNames = QStringList({ + SqliteCreateTrigger::time(SqliteCreateTrigger::Time::null), + SqliteCreateTrigger::time(SqliteCreateTrigger::Time::AFTER), + SqliteCreateTrigger::time(SqliteCreateTrigger::Time::BEFORE) + }); + viewEventNames = QStringList({ + SqliteCreateTrigger::time(SqliteCreateTrigger::Time::INSTEAD_OF) + }); +} + void TriggerDialog::changeEvent(QEvent *e) { QDialog::changeEvent(e); @@ -99,6 +114,9 @@ void TriggerDialog::init() }); } + // Event combo - default values + ui->whenCombo->addItems(tableEventNames + viewEventNames); + // Precondition connect(ui->preconditionCheck, SIGNAL(clicked()), this, SLOT(updateState())); connect(ui->preconditionEdit, SIGNAL(errorsChecked(bool)), this, SLOT(updateValidation())); @@ -128,22 +146,19 @@ void TriggerDialog::initTrigger() } // Event combo + QString eventValue = ui->whenCombo->currentText(); + ui->whenCombo->clear(); if (forTable) { - ui->whenCombo->addItems({ - SqliteCreateTrigger::time(SqliteCreateTrigger::Time::null), - SqliteCreateTrigger::time(SqliteCreateTrigger::Time::BEFORE), - SqliteCreateTrigger::time(SqliteCreateTrigger::Time::AFTER) - }); + ui->whenCombo->addItems(tableEventNames); } else { - ui->whenCombo->addItems({ - SqliteCreateTrigger::time(SqliteCreateTrigger::Time::INSTEAD_OF) - }); + ui->whenCombo->addItems(viewEventNames); ui->whenCombo->setEnabled(false); ui->onLabel->setText(tr("On view:")); } + ui->whenCombo->setCurrentText(eventValue); if (!view.isNull() || !table.isNull()) { diff --git a/SQLiteStudio3/guiSQLiteStudio/dialogs/triggerdialog.h b/SQLiteStudio3/guiSQLiteStudio/dialogs/triggerdialog.h index d8e7ed4..712ea5e 100644 --- a/SQLiteStudio3/guiSQLiteStudio/dialogs/triggerdialog.h +++ b/SQLiteStudio3/guiSQLiteStudio/dialogs/triggerdialog.h @@ -22,6 +22,8 @@ class GUI_API_EXPORT TriggerDialog : public QDialog void setParentView(const QString& name); void setTrigger(const QString& name); + static void staticInit(); + protected: void changeEvent(QEvent *e); @@ -35,6 +37,9 @@ class GUI_API_EXPORT TriggerDialog : public QDialog QString getTargetObjectName() const; void rebuildTrigger(); + static QStringList tableEventNames; + static QStringList viewEventNames; + QString originalTriggerName; QString trigger; QString table; diff --git a/SQLiteStudio3/guiSQLiteStudio/guiSQLiteStudio.pro b/SQLiteStudio3/guiSQLiteStudio/guiSQLiteStudio.pro index 55b7380..e32aff5 100644 --- a/SQLiteStudio3/guiSQLiteStudio/guiSQLiteStudio.pro +++ b/SQLiteStudio3/guiSQLiteStudio/guiSQLiteStudio.pro @@ -174,7 +174,8 @@ SOURCES +=\ dialogs/newversiondialog.cpp \ dialogs/quitconfirmdialog.cpp \ common/datawidgetmapper.cpp \ - dialogs/languagedialog.cpp + dialogs/languagedialog.cpp \ + common/ipvalidator.cpp HEADERS += mainwindow.h \ iconmanager.h \ @@ -318,7 +319,8 @@ HEADERS += mainwindow.h \ guiSQLiteStudio_global.h \ dialogs/quitconfirmdialog.h \ common/datawidgetmapper.h \ - dialogs/languagedialog.h + dialogs/languagedialog.h \ + common/ipvalidator.h FORMS += mainwindow.ui \ dbtree/dbtree.ui \ diff --git a/SQLiteStudio3/guiSQLiteStudio/guiSQLiteStudio.qrc b/SQLiteStudio3/guiSQLiteStudio/guiSQLiteStudio.qrc index 40dfe53..4f33880 100644 --- a/SQLiteStudio3/guiSQLiteStudio/guiSQLiteStudio.qrc +++ b/SQLiteStudio3/guiSQLiteStudio/guiSQLiteStudio.qrc @@ -3,5 +3,7 @@ translations/guiSQLiteStudio_pl.qm translations/guiSQLiteStudio_ru.qm translations/guiSQLiteStudio_fr.qm + translations/guiSQLiteStudio_sk.qm + translations/guiSQLiteStudio_zh_CN.qm diff --git a/SQLiteStudio3/guiSQLiteStudio/iconmanager.h b/SQLiteStudio3/guiSQLiteStudio/iconmanager.h index 8a30d99..cf4f2ec 100644 --- a/SQLiteStudio3/guiSQLiteStudio/iconmanager.h +++ b/SQLiteStudio3/guiSQLiteStudio/iconmanager.h @@ -84,9 +84,9 @@ class GUI_API_EXPORT IconManager : public QObject DEF_ICON(DATABASE_EXPORT_WIZARD, "database_export_wizard") DEF_ICON(DATABASE_FILE, "database_file") DEF_ICON(DATABASE_IMPORT_WIZARD, "database_import_wizard") - DEF_ICO2(DATABASE_INVALID, DATABASE, WARNING) DEF_ICON(DATABASE_NETWORK, "database_network") DEF_ICON(DATABASE_OFFLINE, "database_offline") + DEF_ICO2(DATABASE_INVALID, DATABASE_OFFLINE, WARNING) DEF_ICON(DATABASE_ONLINE, "database_online") DEF_ICON(DATABASE_RELOAD, "database_reload") DEF_ICON(DDL_HISTORY, "ddl_history") @@ -150,6 +150,7 @@ class GUI_API_EXPORT IconManager : public QObject DEF_ICON(PAGE_PREV, "page_prev") DEF_ICO3(MOVE_LEFT, PAGE_PREV) DEF_ICO3(MOVE_RIGHT, PAGE_NEXT) + DEF_ICON(PLUS, "plus") DEF_ICON(RELOAD, "reload") DEF_ICON(RENAME_FN_ARG, "rename_fn_arg") DEF_ICO3(RENAME_DATATYPE, RENAME_FN_ARG) diff --git a/SQLiteStudio3/guiSQLiteStudio/icons.qrc b/SQLiteStudio3/guiSQLiteStudio/icons.qrc index d89afa9..6612814 100644 --- a/SQLiteStudio3/guiSQLiteStudio/icons.qrc +++ b/SQLiteStudio3/guiSQLiteStudio/icons.qrc @@ -38,7 +38,6 @@ img/database_disconnect.png img/database_export.png img/database_file.png - img/database_invalid.png img/database_network.png img/database_reload.png img/database.png @@ -191,5 +190,6 @@ img/close.png img/go_back.png img/reset_autoincrement.png + img/plus.png diff --git a/SQLiteStudio3/guiSQLiteStudio/img/database_invalid.png b/SQLiteStudio3/guiSQLiteStudio/img/database_invalid.png deleted file mode 100644 index 7ccd0a3..0000000 Binary files a/SQLiteStudio3/guiSQLiteStudio/img/database_invalid.png and /dev/null differ diff --git a/SQLiteStudio3/guiSQLiteStudio/img/plus.png b/SQLiteStudio3/guiSQLiteStudio/img/plus.png new file mode 100644 index 0000000..1138739 Binary files /dev/null and b/SQLiteStudio3/guiSQLiteStudio/img/plus.png differ diff --git a/SQLiteStudio3/guiSQLiteStudio/img/sort_ind_asc.png b/SQLiteStudio3/guiSQLiteStudio/img/sort_ind_asc.png index b8e6af1..7d30175 100644 Binary files a/SQLiteStudio3/guiSQLiteStudio/img/sort_ind_asc.png and b/SQLiteStudio3/guiSQLiteStudio/img/sort_ind_asc.png differ diff --git a/SQLiteStudio3/guiSQLiteStudio/img/sort_ind_desc.png b/SQLiteStudio3/guiSQLiteStudio/img/sort_ind_desc.png index 6d88b78..9427ceb 100644 Binary files a/SQLiteStudio3/guiSQLiteStudio/img/sort_ind_desc.png and b/SQLiteStudio3/guiSQLiteStudio/img/sort_ind_desc.png differ diff --git a/SQLiteStudio3/guiSQLiteStudio/mainwindow.cpp b/SQLiteStudio3/guiSQLiteStudio/mainwindow.cpp index fe61b95..373b21d 100644 --- a/SQLiteStudio3/guiSQLiteStudio/mainwindow.cpp +++ b/SQLiteStudio3/guiSQLiteStudio/mainwindow.cpp @@ -571,10 +571,6 @@ FormManager* MainWindow::getFormManager() const void MainWindow::setupDefShortcuts() { BIND_SHORTCUTS(MainWindow, Action); - - QList bindings = QKeySequence::keyBindings(QKeySequence::Close); - if (bindings.size() > 0) - actionMap[Action::CLOSE_WINDOW]->setShortcut(bindings.first()); } void MainWindow::openSqlEditorSlot() @@ -627,6 +623,10 @@ void MainWindow::exportAnything() } ExportDialog dialog(this); + Db* db = DBTREE->getSelectedOpenDb(); + if (db) + dialog.setPreselectedDb(db); + dialog.exec(); } @@ -639,6 +639,10 @@ void MainWindow::importAnything() } ImportDialog dialog(this); + Db* db = DBTREE->getSelectedOpenDb(); + if (db) + dialog.setDb(db); + dialog.exec(); } diff --git a/SQLiteStudio3/guiSQLiteStudio/mdiarea.cpp b/SQLiteStudio3/guiSQLiteStudio/mdiarea.cpp index d53874c..0d07bcb 100644 --- a/SQLiteStudio3/guiSQLiteStudio/mdiarea.cpp +++ b/SQLiteStudio3/guiSQLiteStudio/mdiarea.cpp @@ -4,6 +4,7 @@ #include "mdichild.h" #include "mdiwindow.h" #include "taskbar.h" +#include "uiconfig.h" #include #include #include @@ -35,6 +36,12 @@ MdiWindow *MdiArea::addSubWindow(MdiChild *mdiChild) if (!mdiChild->handleInitialFocus()) mdiChild->setFocus(); + if (taskBar) + { + if (taskBar->getTasks().size() == 1 && CFG_UI.General.OpenMaximized.get()) + mdiWin->setWindowState(mdiWin->windowState()|Qt::WindowMaximized); + } + emit windowListChanged(); return mdiWin; } @@ -111,12 +118,23 @@ void MdiArea::windowDestroyed(MdiWindow* window) return; QAction* action = winToActionMap[window]; + QAction* taskToSelect = nullptr; + if (!MAINWINDOW->isClosingApp()) + { + taskToSelect = taskBar->getNextTask(action); + if (!taskToSelect) + taskToSelect = taskBar->getPrevTask(action); + } + winToActionMap.remove(window); actionToWinMap.remove(action); taskBar->removeTask(action); delete action; emit windowListChanged(); + + if (taskToSelect) + taskBar->setActiveTask(taskToSelect); } void MdiArea::windowActivated() diff --git a/SQLiteStudio3/guiSQLiteStudio/mdiwindow.cpp b/SQLiteStudio3/guiSQLiteStudio/mdiwindow.cpp index 0e8d298..f2257c6 100644 --- a/SQLiteStudio3/guiSQLiteStudio/mdiwindow.cpp +++ b/SQLiteStudio3/guiSQLiteStudio/mdiwindow.cpp @@ -5,6 +5,7 @@ #include "mainwindow.h" #include "services/dbmanager.h" #include "db/db.h" +#include "uiconfig.h" #include #include #include @@ -143,6 +144,14 @@ void MdiWindow::changeEvent(QEvent* event) } else QMdiSubWindow::changeEvent(event); + + if (!MAINWINDOW->isClosingApp()) + { + bool wasMaximized = changeEvent->oldState().testFlag(Qt::WindowMaximized); + bool isMaximized = windowState().testFlag(Qt::WindowMaximized); + if (wasMaximized != isMaximized && CFG_UI.General.OpenMaximized.get() != isMaximized) + CFG_UI.General.OpenMaximized.set(isMaximized); + } } void MdiWindow::closeEvent(QCloseEvent* e) diff --git a/SQLiteStudio3/guiSQLiteStudio/taskbar.cpp b/SQLiteStudio3/guiSQLiteStudio/taskbar.cpp index 359dc29..b63c58d 100644 --- a/SQLiteStudio3/guiSQLiteStudio/taskbar.cpp +++ b/SQLiteStudio3/guiSQLiteStudio/taskbar.cpp @@ -65,6 +65,22 @@ void TaskBar::mousePressed() dragStartTask->trigger(); } +void TaskBar::taskBarMenuAboutToShow() +{ + // This is a hack. We want to display "Ctrl+W" shortcut to the user in this menu, but assigning that shortcut + // permanently to the action makes it ambigous to Qt, because it's already a standard shortcut, + // thus making Qt confused and this shortcut working only every second time. + // Here we assign the shortcut only for the time of displaying the menu. Rest of the time it's not assigned. + QList bindings = QKeySequence::keyBindings(QKeySequence::Close); + if (bindings.size() > 0) + MAINWINDOW->getAction(MainWindow::Action::CLOSE_WINDOW)->setShortcut(bindings.first()); +} + +void TaskBar::taskBarMenuAboutToHide() +{ + MAINWINDOW->getAction(MainWindow::Action::CLOSE_WINDOW)->setShortcut(QKeySequence()); +} + int TaskBar::getActiveTaskIdx() { QAction* checked = taskGroup.checkedAction(); @@ -95,6 +111,14 @@ void TaskBar::prevTask() tasks[idx]->trigger(); } +void TaskBar::setActiveTask(QAction* task) +{ + if (!task) + return; + + task->trigger(); +} + void TaskBar::initContextMenu(ExtActionContainer* mainWin) { // MainWindow is passed as argument to this function, so it's not referenced with MAINWINDOW macro, @@ -107,6 +131,8 @@ void TaskBar::initContextMenu(ExtActionContainer* mainWin) taskMenu->addAction(mainWin->getAction(MainWindow::RESTORE_WINDOW)); taskMenu->addAction(mainWin->getAction(MainWindow::RENAME_WINDOW)); + connect(taskMenu, SIGNAL(aboutToShow()), this, SLOT(taskBarMenuAboutToShow())); + connect(taskMenu, SIGNAL(aboutToHide()), this, SLOT(taskBarMenuAboutToHide())); connect(this, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(taskBarMenuRequested(QPoint))); } @@ -313,3 +339,44 @@ int TaskBar::count() { return tasks.count(); } + +QAction* TaskBar::getActiveTask() const +{ + QAction* checked = taskGroup.checkedAction(); + if (!checked) + return nullptr; + + return checked; +} + +QAction* TaskBar::getNextTask(QAction* from) const +{ + if (!from) + from = getActiveTask(); + + if (!from) + return nullptr; + + int idx = tasks.indexOf(from); + idx++; + if (idx < tasks.size()) + return tasks[idx]; + + return nullptr; +} + +QAction* TaskBar::getPrevTask(QAction* from) const +{ + if (!from) + from = getActiveTask(); + + if (!from) + return nullptr; + + int idx = tasks.indexOf(from); + idx--; + if (idx > 0) + return tasks[idx]; + + return nullptr; +} diff --git a/SQLiteStudio3/guiSQLiteStudio/taskbar.h b/SQLiteStudio3/guiSQLiteStudio/taskbar.h index 652b3f6..a7b7d4f 100644 --- a/SQLiteStudio3/guiSQLiteStudio/taskbar.h +++ b/SQLiteStudio3/guiSQLiteStudio/taskbar.h @@ -23,6 +23,9 @@ class GUI_API_EXPORT TaskBar : public QToolBar QList getTasks() const; bool isEmpty(); int count(); + QAction* getActiveTask() const; + QAction* getNextTask(QAction* from = nullptr) const; + QAction* getPrevTask(QAction* from = nullptr) const; protected: void mousePressEvent(QMouseEvent* event); @@ -63,11 +66,14 @@ class GUI_API_EXPORT TaskBar : public QToolBar public slots: void nextTask(); void prevTask(); + void setActiveTask(QAction* task); void initContextMenu(ExtActionContainer *mainWin); private slots: void taskBarMenuRequested(const QPoint& p); void mousePressed(); + void taskBarMenuAboutToShow(); + void taskBarMenuAboutToHide(); }; #endif // TASKBAR_H diff --git a/SQLiteStudio3/guiSQLiteStudio/translations/guiSQLiteStudio_de.ts b/SQLiteStudio3/guiSQLiteStudio/translations/guiSQLiteStudio_de.ts index 6790149..55a5e5e 100644 --- a/SQLiteStudio3/guiSQLiteStudio/translations/guiSQLiteStudio_de.ts +++ b/SQLiteStudio3/guiSQLiteStudio/translations/guiSQLiteStudio_de.ts @@ -1,6 +1,6 @@ - + AboutDialog @@ -505,73 +505,83 @@ - + + Scale + + + + + Precision + + + + Data type: - + Column name: - + Size: - + Constraints - + Unique - - - - - - - + + + + + + + Configure - + Foreign Key - + Collate - + Not NULL - + Check condition - + Primary Key - + Default - + Advanced mode @@ -1821,88 +1831,104 @@ Browsing other pages will be possible after the row counting is done. - + + Database type + + + + Database driver - - Name + + Generate automatically - - Type + + Options + + + + + Permanent (keep it in configuration) - - Browse for database file on local computer + + Test connection - + + Create new database file + + + + + File - - Generate name basing on file path + + Name (on the list) - - Permanent + + Generate name basing on file path - + <p>Enable this if you want the database to be stored in configuration file and restored every time SQLiteStudio is started.</p> aasfd - - Test database connection + + Browse for existing database file on local computer - + Browse - + Enter an unique database name. - + This name is already in use. Please enter unique name. - + Enter a database file path. - + This database is already on the list under name: %1 - + Select a database type. - - The name will be auto-generated + + Auto-generated - + Type the name @@ -2318,123 +2344,123 @@ All objects from this group will be moved to parent group. DbTreeModel - + Database: %1 dbtree tooltip - + Version: dbtree tooltip - + File size: dbtree tooltip - + Encoding: dbtree tooltip - + Error details: dbtree tooltip - + Table : %1 dbtree tooltip - + Columns (%1): dbtree tooltip - + Indexes (%1): dbtree tooltip - + Triggers (%1): dbtree tooltip - + Copy - + Move - + Include data - + Include indexes - + Include triggers - + Abort - + Referenced tables - + Do you want to include following referenced tables as well: %1 - + Name conflict - + Following object already exists in the target database. Please enter new, unique name, or press '%1' to abort the operation: - + SQL statements conversion - + Following error occurred while converting SQL statements to the target SQLite version: - + Would you like to ignore those errors and proceed? @@ -2788,59 +2814,59 @@ Please enter new, unique name, or press '%1' to abort the operation: - - - + + + Select database to export. - + Select table to export. - + Enter valid query to export. - + Select at least one object to export. - + You must provide a file name to export to. - + Path you provided is an existing directory. You cannot overwrite it. - + The directory '%1' does not exist. - + The file '%1' exists and will be overwritten. - + All files (*) - + Pick file to export to - + Internal error during export. This is a bug. Please report it. @@ -3111,17 +3137,27 @@ Please enter new, unique name, or press '%1' to abort the operation: - + Input file: - + Text encoding: + + + <p>If enabled, any constraint violation, or invalid data format (wrong column count), or any other problem encountered during import will be ignored and the importing will be continued.</p> + + + Ignore errors + + + + Data source options @@ -3131,37 +3167,37 @@ Please enter new, unique name, or press '%1' to abort the operation: - + If you type table name that doesn't exist, it will be created. - + Enter the table name - + Select import plugin. - + You must provide a file to import from. - + The file '%1' does not exist. - + Path you provided is a directory. A regular file is required. - + Pick file to import from @@ -3532,7 +3568,7 @@ Please enter new, unique name, or press '%1' to abort the operation: - + Cannot export, because no export plugin is loaded. @@ -3542,37 +3578,37 @@ Please enter new, unique name, or press '%1' to abort the operation: - + Rename window - + Enter new name for the window: - + New updates are available. <a href="%1">Click here for details</a>. - + You're running the most recent version. No updates are available. - + Database passed in command line parameters (%1) was already on the list under name: %2 - + Database passed in command line parameters (%1) has been temporarily added to the list under name: %2 - + Could not add database %1 to list. @@ -3580,17 +3616,17 @@ Please enter new, unique name, or press '%1' to abort the operation: MdiWindow - + Uncommited changes - + Close anyway - + Don't close @@ -3900,68 +3936,68 @@ Please enter new, unique name, or press '%1' to abort the operation: QObject - + Cannot edit columns that are result of compound %1 statements (one that includes %2, %3 or %4 keywords). - + The query execution mechanism had problems with extracting ROWID's properly. This might be a bug in the application. You may want to report this. - + Requested column is a result of SQL expression, instead of a simple column selection. Such columns cannot be edited. - + Requested column belongs to restricted SQLite table. Those tables cannot be edited directly. - + Cannot edit results of query other than %1. - + Cannot edit columns that are result of aggregated %1 statements. - + Cannot edit columns that are result of %1 statement. - + Cannot edit columns that are result of common table expression statement (%1). - - - - + + + + on conflict: %1 data view tooltip - + references table %1, column %2 data view tooltip - + condition: %1 data view tooltip - + collation name: %1 data view tooltip @@ -4319,7 +4355,8 @@ Please enter new, unique name, or press '%1' to abort the operation: - + + Database file @@ -4810,69 +4847,69 @@ find next SqlQueryModel - - + + Only one query can be executed simultaneously. - + Uncommited data - + There are uncommited data changes. Do you want to proceed anyway? All uncommited changes will be lost. - + Cannot commit the data for a cell that refers to the already closed database. - + Could not begin transaction on the database. Details: %1 - + An error occurred while commiting the transaction: %1 - + An error occurred while rolling back the transaction: %1 - + Tried to commit a cell which is not editable (yet modified and waiting for commit)! This is a bug. Please report it. - + An error occurred while commiting the data: %1 - - + + Error while executing SQL query on database '%1': %2 - + Error while loading query results: %1 - + Insert multiple rows - + Number of rows to insert: @@ -4880,87 +4917,92 @@ find next SqlQueryView - + Copy - + Copy as... - + Paste - + Paste as... - + Set NULL values - + Erase values - + Edit value in editor - + Commit - + Rollback - + Commit selected cells - + Rollback selected cells - + Define columns to sort by - + Remove custom sorting - + Insert row - + Insert multiple rows - + Delete selected row - + + No items selected to paste clipboard contents to. + + + + Edit value @@ -5566,41 +5608,41 @@ Do you want to commit the structure, or do you want to go back to the structure - + Name table window triggers - + Event table window triggers - + Condition table window triggers - + Details table window triggers - + Table window "%1" has uncommited structure modifications and data. - + Table window "%1" has uncommited data. - + Table window "%1" has uncommited structure modifications. @@ -5688,33 +5730,33 @@ Do you want to commit the structure, or do you want to go back to the structure - + On view: - + Could not process trigger %1 correctly. Unable to open a trigger dialog. - + Enter a valid condition. - + Enter a valid trigger code. - + Error trigger dialog - + An error occurred while executing SQL statements: %1 diff --git a/SQLiteStudio3/guiSQLiteStudio/translations/guiSQLiteStudio_es.ts b/SQLiteStudio3/guiSQLiteStudio/translations/guiSQLiteStudio_es.ts index edc3e21..428d538 100644 --- a/SQLiteStudio3/guiSQLiteStudio/translations/guiSQLiteStudio_es.ts +++ b/SQLiteStudio3/guiSQLiteStudio/translations/guiSQLiteStudio_es.ts @@ -1,6 +1,6 @@ - + AboutDialog @@ -505,73 +505,83 @@ - + + Scale + + + + + Precision + + + + Data type: - + Column name: - + Size: - + Constraints - + Unique - - - - - - - + + + + + + + Configure - + Foreign Key - + Collate - + Not NULL - + Check condition - + Primary Key - + Default - + Advanced mode @@ -1821,88 +1831,104 @@ Browsing other pages will be possible after the row counting is done. - + + Database type + + + + Database driver - - Name + + Generate automatically - - Type + + Options + + + + + Permanent (keep it in configuration) - - Browse for database file on local computer + + Test connection - + + Create new database file + + + + + File - - Generate name basing on file path + + Name (on the list) - - Permanent + + Generate name basing on file path - + <p>Enable this if you want the database to be stored in configuration file and restored every time SQLiteStudio is started.</p> aasfd - - Test database connection + + Browse for existing database file on local computer - + Browse - + Enter an unique database name. - + This name is already in use. Please enter unique name. - + Enter a database file path. - + This database is already on the list under name: %1 - + Select a database type. - - The name will be auto-generated + + Auto-generated - + Type the name @@ -2318,123 +2344,123 @@ All objects from this group will be moved to parent group. DbTreeModel - + Database: %1 dbtree tooltip - + Version: dbtree tooltip - + File size: dbtree tooltip - + Encoding: dbtree tooltip - + Error details: dbtree tooltip - + Table : %1 dbtree tooltip - + Columns (%1): dbtree tooltip - + Indexes (%1): dbtree tooltip - + Triggers (%1): dbtree tooltip - + Copy - + Move - + Include data - + Include indexes - + Include triggers - + Abort - + Referenced tables - + Do you want to include following referenced tables as well: %1 - + Name conflict - + Following object already exists in the target database. Please enter new, unique name, or press '%1' to abort the operation: - + SQL statements conversion - + Following error occurred while converting SQL statements to the target SQLite version: - + Would you like to ignore those errors and proceed? @@ -2788,59 +2814,59 @@ Please enter new, unique name, or press '%1' to abort the operation: - - - + + + Select database to export. - + Select table to export. - + Enter valid query to export. - + Select at least one object to export. - + You must provide a file name to export to. - + Path you provided is an existing directory. You cannot overwrite it. - + The directory '%1' does not exist. - + The file '%1' exists and will be overwritten. - + All files (*) - + Pick file to export to - + Internal error during export. This is a bug. Please report it. @@ -3111,17 +3137,27 @@ Please enter new, unique name, or press '%1' to abort the operation: - + Input file: - + Text encoding: + + + <p>If enabled, any constraint violation, or invalid data format (wrong column count), or any other problem encountered during import will be ignored and the importing will be continued.</p> + + + Ignore errors + + + + Data source options @@ -3131,37 +3167,37 @@ Please enter new, unique name, or press '%1' to abort the operation: - + If you type table name that doesn't exist, it will be created. - + Enter the table name - + Select import plugin. - + You must provide a file to import from. - + The file '%1' does not exist. - + Path you provided is a directory. A regular file is required. - + Pick file to import from @@ -3532,7 +3568,7 @@ Please enter new, unique name, or press '%1' to abort the operation: - + Cannot export, because no export plugin is loaded. @@ -3542,37 +3578,37 @@ Please enter new, unique name, or press '%1' to abort the operation: - + Rename window - + Enter new name for the window: - + New updates are available. <a href="%1">Click here for details</a>. - + You're running the most recent version. No updates are available. - + Database passed in command line parameters (%1) was already on the list under name: %2 - + Database passed in command line parameters (%1) has been temporarily added to the list under name: %2 - + Could not add database %1 to list. @@ -3580,17 +3616,17 @@ Please enter new, unique name, or press '%1' to abort the operation: MdiWindow - + Uncommited changes - + Close anyway - + Don't close @@ -3900,68 +3936,68 @@ Please enter new, unique name, or press '%1' to abort the operation: QObject - + Cannot edit columns that are result of compound %1 statements (one that includes %2, %3 or %4 keywords). - + The query execution mechanism had problems with extracting ROWID's properly. This might be a bug in the application. You may want to report this. - + Requested column is a result of SQL expression, instead of a simple column selection. Such columns cannot be edited. - + Requested column belongs to restricted SQLite table. Those tables cannot be edited directly. - + Cannot edit results of query other than %1. - + Cannot edit columns that are result of aggregated %1 statements. - + Cannot edit columns that are result of %1 statement. - + Cannot edit columns that are result of common table expression statement (%1). - - - - + + + + on conflict: %1 data view tooltip - + references table %1, column %2 data view tooltip - + condition: %1 data view tooltip - + collation name: %1 data view tooltip @@ -4319,7 +4355,8 @@ Please enter new, unique name, or press '%1' to abort the operation: - + + Database file @@ -4810,69 +4847,69 @@ find next SqlQueryModel - - + + Only one query can be executed simultaneously. - + Uncommited data - + There are uncommited data changes. Do you want to proceed anyway? All uncommited changes will be lost. - + Cannot commit the data for a cell that refers to the already closed database. - + Could not begin transaction on the database. Details: %1 - + An error occurred while commiting the transaction: %1 - + An error occurred while rolling back the transaction: %1 - + Tried to commit a cell which is not editable (yet modified and waiting for commit)! This is a bug. Please report it. - + An error occurred while commiting the data: %1 - - + + Error while executing SQL query on database '%1': %2 - + Error while loading query results: %1 - + Insert multiple rows - + Number of rows to insert: @@ -4880,87 +4917,92 @@ find next SqlQueryView - + Copy - + Copy as... - + Paste - + Paste as... - + Set NULL values - + Erase values - + Edit value in editor - + Commit - + Rollback - + Commit selected cells - + Rollback selected cells - + Define columns to sort by - + Remove custom sorting - + Insert row - + Insert multiple rows - + Delete selected row - + + No items selected to paste clipboard contents to. + + + + Edit value @@ -5566,41 +5608,41 @@ Do you want to commit the structure, or do you want to go back to the structure - + Name table window triggers - + Event table window triggers - + Condition table window triggers - + Details table window triggers - + Table window "%1" has uncommited structure modifications and data. - + Table window "%1" has uncommited data. - + Table window "%1" has uncommited structure modifications. @@ -5688,33 +5730,33 @@ Do you want to commit the structure, or do you want to go back to the structure - + On view: - + Could not process trigger %1 correctly. Unable to open a trigger dialog. - + Enter a valid condition. - + Enter a valid trigger code. - + Error trigger dialog - + An error occurred while executing SQL statements: %1 diff --git a/SQLiteStudio3/guiSQLiteStudio/translations/guiSQLiteStudio_fr.qm b/SQLiteStudio3/guiSQLiteStudio/translations/guiSQLiteStudio_fr.qm index bdd914e..42d19a7 100644 Binary files a/SQLiteStudio3/guiSQLiteStudio/translations/guiSQLiteStudio_fr.qm and b/SQLiteStudio3/guiSQLiteStudio/translations/guiSQLiteStudio_fr.qm differ diff --git a/SQLiteStudio3/guiSQLiteStudio/translations/guiSQLiteStudio_fr.ts b/SQLiteStudio3/guiSQLiteStudio/translations/guiSQLiteStudio_fr.ts index 480d4ad..6fa9ba0 100644 --- a/SQLiteStudio3/guiSQLiteStudio/translations/guiSQLiteStudio_fr.ts +++ b/SQLiteStudio3/guiSQLiteStudio/translations/guiSQLiteStudio_fr.ts @@ -1,6 +1,6 @@ - + AboutDialog @@ -506,73 +506,83 @@ Nom et type - + + Scale + + + + + Precision + + + + Data type: Type de données: - + Column name: Nom de colonne: - + Size: Taille: - + Constraints Contraintes - + Unique Unique - - - - - - - + + + + + + + Configure Configurer - + Foreign Key Clé étranère - + Collate Jointure - + Not NULL Non NULL - + Check condition Vérifiez la contition - + Primary Key Clé primaire - + Default Défaut - + Advanced mode Mode avancé @@ -1823,88 +1833,128 @@ Browsing other pages will be possible after the row counting is done. Base de donnée - + + Database type + + + + Database driver Pilote de base de données - + + Generate automatically + + + + + Options + Options + + + + Permanent (keep it in configuration) + + + + + Test connection + + + Name - Nom + Nom - Type - Type + Type - Browse for database file on local computer - Navigation de la base de données en local + Navigation de la base de données en local - + + Create new database file + + + + + File Fichier - + + Name (on the list) + + + + Generate name basing on file path Génération du nom basé sur le chemin du fichier - Permanent - Permanent + Permanent - + <p>Enable this if you want the database to be stored in configuration file and restored every time SQLiteStudio is started.</p> aasfd <p>Autorisez-ceci si vous voulez que la base de données soit stockée dans le fichier de configuration et restauré chaque fois SQLiteStudio est lancé.</p> - Test database connection - Test de connexion + Test de connexion - + + Browse for existing database file on local computer + + + + Browse Navigateur - + Enter an unique database name. - + This name is already in use. Please enter unique name. - + Enter a database file path. - + This database is already on the list under name: %1 - + Select a database type. - + + Auto-generated + + + The name will be auto-generated - Le non sera généré automatiquement + Le non sera généré automatiquement - + Type the name Saississez le nom @@ -2321,125 +2371,125 @@ Tous les objets de ce groupe seront déplacés dans le groupe parent. DbTreeModel - + Database: %1 dbtree tooltip Base de données: %1 - + Version: dbtree tooltip Version: - + File size: dbtree tooltip Taille fichier: - + Encoding: dbtree tooltip Codage: - + Error details: dbtree tooltip Détails erreur: - + Table : %1 dbtree tooltip Table: %1 - + Columns (%1): dbtree tooltip Colonnes:(%1): - + Indexes (%1): dbtree tooltip Index (%1): - + Triggers (%1): dbtree tooltip Déclencheurs (%1): - + Copy Copier - + Move Déplcer - + Include data Données incluses - + Include indexes Index inclus - + Include triggers Déclencheurs inclus - + Abort Abandonner - + Referenced tables Tables référencées - + Do you want to include following referenced tables as well: %1 Vous voulez inclure des tables référencées suivantes aussi : %1 - + Name conflict Conflit de nom - + Following object already exists in the target database. Please enter new, unique name, or press '%1' to abort the operation: L'objet suivant existe déjà dans la base de données cible. Entrez SVP un nouveau nom, unique, ou cliquez '%1' pour d'interrompre l'opération : - + SQL statements conversion Conversion des déclarations SQL - + Following error occurred while converting SQL statements to the target SQLite version: L'erreur suivante est survenue en convertissant des déclarations de SQL de la version cible SQLite : - + Would you like to ignore those errors and proceed? Voulez-vous ignorer ces erreurs et procéder? @@ -2795,59 +2845,59 @@ Entrez SVP un nouveau nom, unique, ou cliquez '%1' pour d'interro annuler - - - + + + Select database to export. Sélecctionnez la base de données à exporter. - + Select table to export. Sélectionnez la table à exporter. - + Enter valid query to export. Saississez une requête valide à exporter. - + Select at least one object to export. Sélectionnez au moins un objet à exporter. - + You must provide a file name to export to. Vous devez fournir le nom d'un fichier à exporter. - + Path you provided is an existing directory. You cannot overwrite it. Le chemin fourni est un répertoire existant. Vous ne pouvez pas l'écraser. - + The directory '%1' does not exist. Le répertoire %1 n'existe pas. - + The file '%1' exists and will be overwritten. Le fichier '%1' existe et sera écrasé. - + All files (*) tous les fichiers(*) - + Pick file to export to Sélectionnez un fichier à exporter - + Internal error during export. This is a bug. Please report it. Erreur interne pendant l'exportation. c'est un bug. SVP veuillez le reporter. @@ -3118,17 +3168,27 @@ Entrez SVP un nouveau nom, unique, ou cliquez '%1' pour d'interro Options - + Input file: Fichier: - + Text encoding: Texte codé: + + + <p>If enabled, any constraint violation, or invalid data format (wrong column count), or any other problem encountered during import will be ignored and the importing will be continued.</p> + + + Ignore errors + + + + Data source options Optrions de source de données @@ -3138,37 +3198,37 @@ Entrez SVP un nouveau nom, unique, ou cliquez '%1' pour d'interro Annuler - + If you type table name that doesn't exist, it will be created. Si vous saississez un nom de table inexistant, celle-ci sera créée. - + Enter the table name Saississez un nom de table - + Select import plugin. Sélectionnez un plugin d'importation. - + You must provide a file to import from. Vous devez fournir un fichier à importer. - + The file '%1' does not exist. Le fichier '%1' n'existe pas. - + Path you provided is a directory. A regular file is required. Le chemin indiqué est un répertoire. Un fichier est requis. - + Pick file to import from Sélectionnez le fichier d'importation @@ -3540,7 +3600,7 @@ Entrez SVP un nouveau nom, unique, ou cliquez '%1' pour d'interro Impossible de positionner le style: %1 - + Cannot export, because no export plugin is loaded. Exportation impossible, aucun plugin d'exportation n'est chargé. @@ -3550,37 +3610,37 @@ Entrez SVP un nouveau nom, unique, ou cliquez '%1' pour d'interro Importation impossible, aucun plugin d'importation n'est chargé. - + Rename window Renommer la fenêtre - + Enter new name for the window: Saississez un nouveau nom de fenêtre: - + New updates are available. <a href="%1">Click here for details</a>. Une nouvelle mise à jour est disponible. <a href="%1"> cliquez ici pour détails</a>. - + You're running the most recent version. No updates are available. Vous utilisez la dernière version. Aucune mise à jour de disponible. - + Database passed in command line parameters (%1) was already on the list under name: %2 - + Database passed in command line parameters (%1) has been temporarily added to the list under name: %2 La base de données passée en paramètre dans la ligne de commande (%1)a été temporaire ajoutée à la liste sous le nom: %2 - + Could not add database %1 to list. Impossible d'ajouter la base de données %1 à la liste. @@ -3588,17 +3648,17 @@ Entrez SVP un nouveau nom, unique, ou cliquez '%1' pour d'interro MdiWindow - + Uncommited changes Modification non enregistrées - + Close anyway Fermer - + Don't close Ne pas fermer @@ -3908,68 +3968,68 @@ Entrez SVP un nouveau nom, unique, ou cliquez '%1' pour d'interro QObject - + Cannot edit columns that are result of compound %1 statements (one that includes %2, %3 or %4 keywords). impossible d'éditer les colonnes qui ont le résultat composé des déclarations %1 (inclus %2, %3 ou %4 mots-clés). - + The query execution mechanism had problems with extracting ROWID's properly. This might be a bug in the application. You may want to report this. Le mécanisme d'exécution de la requête a eu des problèmes avec l'extraction du ROWID'S. Ceci pourrait être un bogue de l'application. Vous pouvez le rapporter. - + Requested column is a result of SQL expression, instead of a simple column selection. Such columns cannot be edited. La colonne demandée est un résultat d'expression de SQL, au lieu d'une sélection de colonne simple. De telles colonnes ne peuvent pas être éditées. - + Requested column belongs to restricted SQLite table. Those tables cannot be edited directly. La colonne demandée appartient à une table limitée SQLite. Ces tables ne peuvent pas être éditées directement. - + Cannot edit results of query other than %1. Impossible d'éditer les résultats de la requëte autrement que %1. - + Cannot edit columns that are result of aggregated %1 statements. Impossible d'éditer les colonnes qui sont le résultat de déclarations agrégées %1. - + Cannot edit columns that are result of %1 statement. Impossible d'éditer les colonnesqui sont le résultat de déclaration %1. - + Cannot edit columns that are result of common table expression statement (%1). Impossible d'éditer les colonnes qui sont le résultat de table commune de déclaration (%1). - - - - + + + + on conflict: %1 data view tooltip Sur conflit %1 - + references table %1, column %2 data view tooltip Références table %1, colonne %2 - + condition: %1 data view tooltip Condition: %1 - + collation name: %1 data view tooltip Nom de collation: %1 @@ -4327,7 +4387,8 @@ Entrez SVP un nouveau nom, unique, ou cliquez '%1' pour d'interro Tous les fichiers - + + Database file Fichier base de données @@ -4819,69 +4880,69 @@ recherche suivant SqlQueryModel - - + + Only one query can be executed simultaneously. Uniquement une seule requête peut être exécutée à la fois. - + Uncommited data Données non enregistrées - + There are uncommited data changes. Do you want to proceed anyway? All uncommited changes will be lost. - + Cannot commit the data for a cell that refers to the already closed database. Impossible d'enregistrer les données pour la cell qui référe à une base de données déjà fermée. - + Could not begin transaction on the database. Details: %1 Impossible de lancer la transaction sur la base de données. Détails: %1 - + An error occurred while commiting the transaction: %1 Une erreur est survenuelors de l'enregistrement de la transaction: %1 - + An error occurred while rolling back the transaction: %1 Une erreur est survenuelors de l'annulation de la transaction: %1 - + Tried to commit a cell which is not editable (yet modified and waiting for commit)! This is a bug. Please report it. Tentative d'enregistrement d'une une cellule qui n'est pas modifiable! Ceci est un bogue. Rapportez-le SVP. - + An error occurred while commiting the data: %1 Une erreur est survenuelors de l'enregistrement des données: %1 - - + + Error while executing SQL query on database '%1': %2 Erreur pendant l'exécution de la requête sur la base de données %1: %2 - + Error while loading query results: %1 Erreur lors du chargement des résultats de la requête: %1 - + Insert multiple rows Insérer plusieurs lignes - + Number of rows to insert: Nombre de lignes à inserrer: @@ -4889,87 +4950,92 @@ recherche suivant SqlQueryView - + Copy Copier - + Copy as... Copier comme ... - + Paste Coller - + Paste as... Coller comme ... - + Set NULL values Valeurs NULL positionnées - + Erase values valeurs écrasées - + Edit value in editor Valeur modifiée par l'éditeur - + Commit Enregistrer - + Rollback Annuler - + Commit selected cells Enregistrer les cellules sélectionnées - + Rollback selected cells Annuler les modifications des cellules sélectionnées - + Define columns to sort by Définit les colonnes triées par - + Remove custom sorting Enléve le tri personnalisé - + Insert row Insérer une ligne - + Insert multiple rows Insérer plusieurs lignes - + Delete selected row Supprimer les lignes sélectionnées - + + No items selected to paste clipboard contents to. + + + + Edit value Modifier la valeur @@ -5578,41 +5644,41 @@ Voulez-vous enregistrer la structure, ou voulez-vous retourner à l'onglet Condition partielle d'index - + Name table window triggers Nom - + Event table window triggers Événement - + Condition table window triggers Condition - + Details table window triggers Details - + Table window "%1" has uncommited structure modifications and data. La fenêtre de table "%1" n'a pas enregistré les modifications de structure et de données. - + Table window "%1" has uncommited data. La fenêtre de table "%1" n'a pas enregistrer les données. - + Table window "%1" has uncommited structure modifications. La fenêtre de table "%1" n'a pas enregistré les modifications de structure. @@ -5700,33 +5766,33 @@ Voulez-vous enregistrer la structure, ou voulez-vous retourner à l'onglet DDL - + On view: Sur vue: - + Could not process trigger %1 correctly. Unable to open a trigger dialog. Impossible d'exécuter correctement le déclencheur %1. Ouverture invalide du dialogue de déclencheur. - + Enter a valid condition. Saisissez une condition valide. - + Enter a valid trigger code. Saisissez un code de déclencheur valide. - + Error trigger dialog Erreur - + An error occurred while executing SQL statements: %1 Une erreur survenue lors de l'exécution de l'intruction SQL: %1 diff --git a/SQLiteStudio3/guiSQLiteStudio/translations/guiSQLiteStudio_pl.qm b/SQLiteStudio3/guiSQLiteStudio/translations/guiSQLiteStudio_pl.qm index c8c85a8..f927e35 100644 Binary files a/SQLiteStudio3/guiSQLiteStudio/translations/guiSQLiteStudio_pl.qm and b/SQLiteStudio3/guiSQLiteStudio/translations/guiSQLiteStudio_pl.qm differ diff --git a/SQLiteStudio3/guiSQLiteStudio/translations/guiSQLiteStudio_pl.ts b/SQLiteStudio3/guiSQLiteStudio/translations/guiSQLiteStudio_pl.ts index 48ff371..dcd9b50 100644 --- a/SQLiteStudio3/guiSQLiteStudio/translations/guiSQLiteStudio_pl.ts +++ b/SQLiteStudio3/guiSQLiteStudio/translations/guiSQLiteStudio_pl.ts @@ -1,6 +1,6 @@ - + AboutDialog @@ -507,75 +507,85 @@ Nazwa i typ - + + Scale + Skala + + + + Precision + Precyzja + + + Data type: Typ danych: - + Column name: Nazwa kolumny: - + Size: Rozmiar: - + Constraints Ograniczenia - + Unique Wartości unikalne - - - - - - - + + + + + + + Configure Konfiguruj - + Foreign Key Klucz obcy - + Collate Zestawienie - + Not NULL Niepuste - + Check condition Sprawdzaj warunek - + Primary Key Klucz główny - + Default Wartość domyślna - + Advanced mode - Tryb zaawandowany + Tryb zaawansowany @@ -1829,88 +1839,128 @@ Przeglądanie pozostałych stron będzie możliwe kiedy liczenie wierszy zostani Baza danych - + + Database type + Typ bazy danych + + + Database driver Sterownik bazy danych - + + Generate automatically + Generuj automatycznie + + + + Options + Opcje + + + + Permanent (keep it in configuration) + Trwała (trzymaj w konfiguracji) + + + + Test connection + Testuj połączenie + + Name - Nazwa + Nazwa - Type - Typ + Typ - Browse for database file on local computer - Przeglądaj w poszukiwaniu pliku bazy danych na lokalnym komputerze + Przeglądaj w poszukiwaniu pliku bazy danych na lokalnym komputerze + + + + Create new database file + Utwórz nową bazę - + + File Plik - + + Name (on the list) + Nazwa (na liście) + + + Generate name basing on file path Generuj nazwę bazując na ścieżce do pliku - Permanent - Trwała + Trwała - + <p>Enable this if you want the database to be stored in configuration file and restored every time SQLiteStudio is started.</p> aasfd <p>Włącz to, jeśli chcesz aby baza danych była przechowywana w pliku konfiguracji i przywracana za każdym razem, gdy startuje SQLiteStudio.</p> - Test database connection - Testuj połączenie z bazą + Testuj połączenie z bazą - + + Browse for existing database file on local computer + Przeglądaj lokalny komputer w poszukiwaniu istniejącej bazy + + + Browse Przeglądaj - + Enter an unique database name. Wprowadź unikalną nazwę bazy danych. - + This name is already in use. Please enter unique name. Ta nazwa jest już w użyciu. Proszę wprowadzić unikalną nazwę. - + Enter a database file path. Wprowadź ścieżkę do pliku bazy danych. - + This database is already on the list under name: %1 Ta baza jest już na liście pod nazwą: %1 - + Select a database type. Wybierz typ bazy danych. - + + Auto-generated + Auto-generowana + + The name will be auto-generated - Nazwa będzie generowana automatycznie + Nazwa będzie generowana automatycznie - + Type the name Wprowadź nazwę @@ -2343,125 +2393,125 @@ Wszystkie obiekty z tej grupy zostaną przeniesione do nadrzędnej grupy. DbTreeModel - + Database: %1 dbtree tooltip Baza danych: %1 - + Version: dbtree tooltip Wersja: - + File size: dbtree tooltip Rozmiar pliku: - + Encoding: dbtree tooltip Kodowanie: - + Error details: dbtree tooltip Szczegóły błędu: - + Table : %1 dbtree tooltip Tablela: : %1 - + Columns (%1): dbtree tooltip Kolumny (%1): - + Indexes (%1): dbtree tooltip Indeksy (%1): - + Triggers (%1): dbtree tooltip Wyzwalacze (%1): - + Copy Kopiuj - + Move Przenieś - + Include data Również dane - + Include indexes Również indeksy - + Include triggers Również wyzwalacze - + Abort Przerwij - + Referenced tables Tabele powiązane - + Do you want to include following referenced tables as well: %1 Czy chcesz zawrzeć również powiązane tabele: %1 - + Name conflict Konflikt nazwy - + Following object already exists in the target database. Please enter new, unique name, or press '%1' to abort the operation: Następująy obiekt istnieje już w docelowej bazie danych. Proszę podać nową, unikalną nazwę, lub nacisnąć '%1', aby przerwać operację. - + SQL statements conversion Konwersja zapytań SQL - + Following error occurred while converting SQL statements to the target SQLite version: Następujące błędy wystąpiły podczas konwersji zapytań SQL do docelowej wersji SQLite: - + Would you like to ignore those errors and proceed? Czy chcesz zignorować te błędy i kontynuować? @@ -2821,59 +2871,59 @@ Proszę podać nową, unikalną nazwę, lub nacisnąć '%1', aby przer Anuluj - - - + + + Select database to export. Wybierz bazę do eksportu. - + Select table to export. Wybierz tabelę do eksportu. - + Enter valid query to export. Wprowadź poprawne zapytanie do eksportu. - + Select at least one object to export. Wybierz przynajmniej jeden obiekt do eksportu. - + You must provide a file name to export to. Musisz podać nazwę pliku do którego należy wyeksportować. - + Path you provided is an existing directory. You cannot overwrite it. Ścieżka którą podałeś jest istniejącym katalogiem. Nie można go nadpisać. - + The directory '%1' does not exist. Katalog '%1' nie istnieje. - + The file '%1' exists and will be overwritten. Plik '%1' istnieje i zostanie nadpisany. - + All files (*) Wszystkie pliki (*) - + Pick file to export to Wybierz plik do eksportu - + Internal error during export. This is a bug. Please report it. Wystąpił wewnętrzny błąd podczas eksportu. To jest błąd programu. Proszę to zgłosić. @@ -3144,17 +3194,27 @@ Proszę podać nową, unikalną nazwę, lub nacisnąć '%1', aby przer OOpcje - + Input file: Plik wejściowy: - + Text encoding: Kodowanie tekstu: + + + <p>If enabled, any constraint violation, or invalid data format (wrong column count), or any other problem encountered during import will be ignored and the importing will be continued.</p> + <p>Jeśli włączone, to jakiekolwiek naruszenia ograniczeń, lub niepoprawny format danych (niepoprawna liczba kolumn), lub jakikolwiek inny problem, który wystąpi podczas importu zostanie zignorowany i importowanie będzie kontynuowane.</p> + + Ignore errors + Ignoruj błędy + + + Data source options Opcje źródła danych @@ -3164,37 +3224,37 @@ Proszę podać nową, unikalną nazwę, lub nacisnąć '%1', aby przer Anuluj - + If you type table name that doesn't exist, it will be created. Jeśli wpiszesz nazwę tabeli, która nie istnieje, to zostanie ona stworzona. - + Enter the table name Wprowadź nazwę tabeli - + Select import plugin. Wybierz wtyczkę importu - + You must provide a file to import from. Musisz podać plik z którego należy zaimportować. - + The file '%1' does not exist. Plik '%1' nie istnieje. - + Path you provided is a directory. A regular file is required. Ścieżka którą podałeś jest katalogiem. Wymagany jest zwykły plik. - + Pick file to import from Wybierz plik do importu @@ -3566,7 +3626,7 @@ Proszę podać nową, unikalną nazwę, lub nacisnąć '%1', aby przer Nie udało się ustawić stylu: %1 - + Cannot export, because no export plugin is loaded. Nie można wyeksportować, ponieważ żadna wtyczka eksportu nie została załadowana. @@ -3576,37 +3636,37 @@ Proszę podać nową, unikalną nazwę, lub nacisnąć '%1', aby przer Nie można zaimportować, ponieważ żadna wtyczka importu nie została załadowana. - + Rename window Zmień nazwę okna - + Enter new name for the window: Wprowadź nową nazwę dla okna: - + New updates are available. <a href="%1">Click here for details</a>. Nowe aktualizacje są dostępne: <a href="%1">Kliknij aby poznać szczegóły</a>. - + You're running the most recent version. No updates are available. Uruchomiona jest najnowsza wersja. Nie ma dostępnych aktualizacji. - + Database passed in command line parameters (%1) was already on the list under name: %2 Baza danych podana w parametrach linii poleceń (%1) była już na liście pod nazwą: %2 - + Database passed in command line parameters (%1) has been temporarily added to the list under name: %2 Baza danych podana w linii poleceń (%1) jest tymczasowo dodana do listy pod nazwą: %2 - + Could not add database %1 to list. Nie udało się dodać bazy danych %1 do listy. @@ -3614,17 +3674,17 @@ Proszę podać nową, unikalną nazwę, lub nacisnąć '%1', aby przer MdiWindow - + Uncommited changes Niezatwierdzone dane - + Close anyway Zamknij mimo to - + Don't close Nie zamykaj @@ -3938,68 +3998,68 @@ Proszę podać nową, unikalną nazwę, lub nacisnąć '%1', aby przer QObject - + The query execution mechanism had problems with extracting ROWID's properly. This might be a bug in the application. You may want to report this. Mechanizm wykonywania zapytań miał problemy z wyciągnięciem własności ROWID. To może być błąd aplikacji. Możesz to zgłosić. - + Requested column is a result of SQL expression, instead of a simple column selection. Such columns cannot be edited. Ta kolumna jest wynikiem wyrażenia SQL, a nie zwykłej selekcji kolumny. Takie kolumny nie mogą być edytowane. - + Requested column belongs to restricted SQLite table. Those tables cannot be edited directly. Ta kolumna należy do systemowej tabeli SQLite. Te tabele nie mogą być edytowane bezpośrednio. - + Cannot edit columns that are result of compound %1 statements (one that includes %2, %3 or %4 keywords). Nie można edytować kolumn, które są wynikiem złożonego zapytania %1 (tego, które zawiera słowo kluczowe %2, %3, lub %4). - + Cannot edit results of query other than %1. Nie można edytować wyników zapytania innego niż %1. - + Cannot edit columns that are result of aggregated %1 statements. Nie można edytować kolumn, które są wynikiem zapytania agregacyjnego %1. - + Cannot edit columns that are result of %1 statement. Nie można edytować kolumn, które są wynikiem zapytania %1. - + Cannot edit columns that are result of common table expression statement (%1). Nie można edytować kolumn, które są wynikiem zapytania ze wspólnym wyrażeniem tabeli (%1). - - - - + + + + on conflict: %1 data view tooltip w razie konfliktu: %1 - + references table %1, column %2 data view tooltip odwołuje się do tabeli %1, kolumny %2 - + condition: %1 data view tooltip warunek: %1 - + collation name: %1 data view tooltip nazwa zestawienia: %1 @@ -4357,7 +4417,8 @@ Proszę podać nową, unikalną nazwę, lub nacisnąć '%1', aby przer Wszystkie pliki - + + Database file Plik bazy danych @@ -4851,54 +4912,54 @@ znajdź następny SqlQueryModel - - + + Only one query can be executed simultaneously. Tylko jedno zapytanie może być wykonywane w danym momencie. - + Uncommited data Niezatwierdzone dane - + There are uncommited data changes. Do you want to proceed anyway? All uncommited changes will be lost. Niektóre zmiany w danych nie zostały zatwierdzone. Czy na pewno chcesz kontynuować? Wszystkie niezatwierdzone zmiany zostaną utracone. - + Cannot commit the data for a cell that refers to the already closed database. Nie można zatwierdzić danych dla komórki, która odnosi się do zamkniętej już bazy danych. - + Could not begin transaction on the database. Details: %1 Nie udało się rozpocząć transakcji na bazie danych. Szczegóły: %1 - + An error occurred while commiting the transaction: %1 Wystąpił błąd podczas zatwierdzania transakcji: %1 - + An error occurred while rolling back the transaction: %1 Wystąpił błąd podczas wycofywania transakcji: %1 - + Tried to commit a cell which is not editable (yet modified and waiting for commit)! This is a bug. Please report it. Próbowano zatwierdzić komórkę, której nie można edytować (a mimo to została zmodyfikowana i czeka na zatwierdzenie)! To jest błąd. Proszę to zgłosić. - + An error occurred while commiting the data: %1 Wystąpił błąd podczas zatwierdzania danych: %1 - - + + Error while executing SQL query on database '%1': %2 Błąd podczas wykonywania zapytania SQL na bazie '%1': %2 @@ -4907,17 +4968,17 @@ znajdź następny Błąd podczas wykonywania zapytania SQL: %1 - + Error while loading query results: %1 Błąd podczas wczytywania wyników zapytania: %1 - + Insert multiple rows Wstaw wiele wierszy - + Number of rows to insert: Liczba wierszy do wstawienia: @@ -4925,87 +4986,92 @@ znajdź następny SqlQueryView - + Copy Kopiuj - + Copy as... Kopiuj jako... - + Paste Wklej - + Paste as... Wklej jako... - + Set NULL values Ustaw wartości NULL - + Erase values Wymaż wartości - + Edit value in editor Edytuj wartość w edytorze - + Commit Zatwierdź - + Rollback Wycofaj - + Commit selected cells Zatwierdź zaznaczone komórki - + Rollback selected cells Wycofaj zaznaczone komórki - + Define columns to sort by Zdefiniuj kolumny po których sortować - + Remove custom sorting Wycofaj własne sortowanie - + Insert row Wstaw wiersz - + Insert multiple rows Wstaw wiele wierszy - + Delete selected row Usuń zaznaczony wiersz - + + No items selected to paste clipboard contents to. + Nie wybrano elementów do których należy wkleić zawartość schowka. + + + Edit value Edytuj wartość @@ -5615,41 +5681,41 @@ Czy chcesz zatwierdzić strukturę, czy jednak chcesz wrócić do karty struktur Warunek indeksu częściowego: - + Name table window triggers Nazwa - + Event table window triggers Zdarzenie - + Condition table window triggers Warunek - + Details table window triggers Szczegóły - + Table window "%1" has uncommited structure modifications and data. Okno tabeli "%1" ma niezatwierdzone modyfikacje struktury i danych. - + Table window "%1" has uncommited data. Okno tabeli "%1" ma niezatwierdzone dane. - + Table window "%1" has uncommited structure modifications. Okno tabeli "%1" ma niezatwierdzone modyfikacje struktury. @@ -5737,33 +5803,33 @@ Czy chcesz zatwierdzić strukturę, czy jednak chcesz wrócić do karty struktur DDL - + On view: Na widoku: - + Could not process trigger %1 correctly. Unable to open a trigger dialog. Nie udało się przetworzyć poprawnie wyzwalacza %1. Nie można otworzyć okna wyzwalacza. - + Enter a valid condition. Wprowadź poprawny warunek. - + Enter a valid trigger code. Wprowadź poprawny kod wyzwalacza. - + Error trigger dialog Błąd - + An error occurred while executing SQL statements: %1 Wystąpił błąd podczas wykonywania zapytań SQL: diff --git a/SQLiteStudio3/guiSQLiteStudio/translations/guiSQLiteStudio_pt_BR.ts b/SQLiteStudio3/guiSQLiteStudio/translations/guiSQLiteStudio_pt_BR.ts index b83a8f3..450cfbf 100644 --- a/SQLiteStudio3/guiSQLiteStudio/translations/guiSQLiteStudio_pt_BR.ts +++ b/SQLiteStudio3/guiSQLiteStudio/translations/guiSQLiteStudio_pt_BR.ts @@ -1,6 +1,6 @@ - + AboutDialog @@ -505,73 +505,83 @@ - + + Scale + + + + + Precision + + + + Data type: - + Column name: - + Size: - + Constraints - + Unique - - - - - - - + + + + + + + Configure - + Foreign Key - + Collate - + Not NULL - + Check condition - + Primary Key - + Default - + Advanced mode @@ -1821,88 +1831,104 @@ Browsing other pages will be possible after the row counting is done. - + + Database type + + + + Database driver - - Name + + Generate automatically - - Type + + Options + + + + + Permanent (keep it in configuration) - - Browse for database file on local computer + + Test connection - + + Create new database file + + + + + File - - Generate name basing on file path + + Name (on the list) - - Permanent + + Generate name basing on file path - + <p>Enable this if you want the database to be stored in configuration file and restored every time SQLiteStudio is started.</p> aasfd - - Test database connection + + Browse for existing database file on local computer - + Browse - + Enter an unique database name. - + This name is already in use. Please enter unique name. - + Enter a database file path. - + This database is already on the list under name: %1 - + Select a database type. - - The name will be auto-generated + + Auto-generated - + Type the name @@ -2318,123 +2344,123 @@ All objects from this group will be moved to parent group. DbTreeModel - + Database: %1 dbtree tooltip - + Version: dbtree tooltip - + File size: dbtree tooltip - + Encoding: dbtree tooltip - + Error details: dbtree tooltip - + Table : %1 dbtree tooltip - + Columns (%1): dbtree tooltip - + Indexes (%1): dbtree tooltip - + Triggers (%1): dbtree tooltip - + Copy - + Move - + Include data - + Include indexes - + Include triggers - + Abort - + Referenced tables - + Do you want to include following referenced tables as well: %1 - + Name conflict - + Following object already exists in the target database. Please enter new, unique name, or press '%1' to abort the operation: - + SQL statements conversion - + Following error occurred while converting SQL statements to the target SQLite version: - + Would you like to ignore those errors and proceed? @@ -2788,59 +2814,59 @@ Please enter new, unique name, or press '%1' to abort the operation: - - - + + + Select database to export. - + Select table to export. - + Enter valid query to export. - + Select at least one object to export. - + You must provide a file name to export to. - + Path you provided is an existing directory. You cannot overwrite it. - + The directory '%1' does not exist. - + The file '%1' exists and will be overwritten. - + All files (*) - + Pick file to export to - + Internal error during export. This is a bug. Please report it. @@ -3111,17 +3137,27 @@ Please enter new, unique name, or press '%1' to abort the operation: - + Input file: - + Text encoding: + + + <p>If enabled, any constraint violation, or invalid data format (wrong column count), or any other problem encountered during import will be ignored and the importing will be continued.</p> + + + Ignore errors + + + + Data source options @@ -3131,37 +3167,37 @@ Please enter new, unique name, or press '%1' to abort the operation: - + If you type table name that doesn't exist, it will be created. - + Enter the table name - + Select import plugin. - + You must provide a file to import from. - + The file '%1' does not exist. - + Path you provided is a directory. A regular file is required. - + Pick file to import from @@ -3532,7 +3568,7 @@ Please enter new, unique name, or press '%1' to abort the operation: - + Cannot export, because no export plugin is loaded. @@ -3542,37 +3578,37 @@ Please enter new, unique name, or press '%1' to abort the operation: - + Rename window - + Enter new name for the window: - + New updates are available. <a href="%1">Click here for details</a>. - + You're running the most recent version. No updates are available. - + Database passed in command line parameters (%1) was already on the list under name: %2 - + Database passed in command line parameters (%1) has been temporarily added to the list under name: %2 - + Could not add database %1 to list. @@ -3580,17 +3616,17 @@ Please enter new, unique name, or press '%1' to abort the operation: MdiWindow - + Uncommited changes - + Close anyway - + Don't close @@ -3900,68 +3936,68 @@ Please enter new, unique name, or press '%1' to abort the operation: QObject - + Cannot edit columns that are result of compound %1 statements (one that includes %2, %3 or %4 keywords). - + The query execution mechanism had problems with extracting ROWID's properly. This might be a bug in the application. You may want to report this. - + Requested column is a result of SQL expression, instead of a simple column selection. Such columns cannot be edited. - + Requested column belongs to restricted SQLite table. Those tables cannot be edited directly. - + Cannot edit results of query other than %1. - + Cannot edit columns that are result of aggregated %1 statements. - + Cannot edit columns that are result of %1 statement. - + Cannot edit columns that are result of common table expression statement (%1). - - - - + + + + on conflict: %1 data view tooltip - + references table %1, column %2 data view tooltip - + condition: %1 data view tooltip - + collation name: %1 data view tooltip @@ -4319,7 +4355,8 @@ Please enter new, unique name, or press '%1' to abort the operation: - + + Database file @@ -4810,69 +4847,69 @@ find next SqlQueryModel - - + + Only one query can be executed simultaneously. - + Uncommited data - + There are uncommited data changes. Do you want to proceed anyway? All uncommited changes will be lost. - + Cannot commit the data for a cell that refers to the already closed database. - + Could not begin transaction on the database. Details: %1 - + An error occurred while commiting the transaction: %1 - + An error occurred while rolling back the transaction: %1 - + Tried to commit a cell which is not editable (yet modified and waiting for commit)! This is a bug. Please report it. - + An error occurred while commiting the data: %1 - - + + Error while executing SQL query on database '%1': %2 - + Error while loading query results: %1 - + Insert multiple rows - + Number of rows to insert: @@ -4880,87 +4917,92 @@ find next SqlQueryView - + Copy - + Copy as... - + Paste - + Paste as... - + Set NULL values - + Erase values - + Edit value in editor - + Commit - + Rollback - + Commit selected cells - + Rollback selected cells - + Define columns to sort by - + Remove custom sorting - + Insert row - + Insert multiple rows - + Delete selected row - + + No items selected to paste clipboard contents to. + + + + Edit value @@ -5566,41 +5608,41 @@ Do you want to commit the structure, or do you want to go back to the structure - + Name table window triggers - + Event table window triggers - + Condition table window triggers - + Details table window triggers - + Table window "%1" has uncommited structure modifications and data. - + Table window "%1" has uncommited data. - + Table window "%1" has uncommited structure modifications. @@ -5688,33 +5730,33 @@ Do you want to commit the structure, or do you want to go back to the structure - + On view: - + Could not process trigger %1 correctly. Unable to open a trigger dialog. - + Enter a valid condition. - + Enter a valid trigger code. - + Error trigger dialog - + An error occurred while executing SQL statements: %1 diff --git a/SQLiteStudio3/guiSQLiteStudio/translations/guiSQLiteStudio_ru.qm b/SQLiteStudio3/guiSQLiteStudio/translations/guiSQLiteStudio_ru.qm index d3a90ca..3e51d97 100644 Binary files a/SQLiteStudio3/guiSQLiteStudio/translations/guiSQLiteStudio_ru.qm and b/SQLiteStudio3/guiSQLiteStudio/translations/guiSQLiteStudio_ru.qm differ diff --git a/SQLiteStudio3/guiSQLiteStudio/translations/guiSQLiteStudio_ru.ts b/SQLiteStudio3/guiSQLiteStudio/translations/guiSQLiteStudio_ru.ts index a3d8093..467ca92 100644 --- a/SQLiteStudio3/guiSQLiteStudio/translations/guiSQLiteStudio_ru.ts +++ b/SQLiteStudio3/guiSQLiteStudio/translations/guiSQLiteStudio_ru.ts @@ -51,7 +51,7 @@ SQLite 3 version: - + Версия SQLite 3: @@ -507,73 +507,83 @@ Имя и тип - + + Scale + Размер + + + + Precision + Точность + + + Data type: Тип данных: - + Column name: Имя столбца: - + Size: Размер: - + Constraints Ограничения - + Unique Уникальность - - - - - - - + + + + + + + Configure Настроить - + Foreign Key Внешний ключ - + Collate Сравнение - + Not NULL Не NULL - + Check condition Проверка условия - + Primary Key Первичный ключ - + Default - + Advanced mode Расширенный режим @@ -1824,88 +1834,128 @@ Browsing other pages will be possible after the row counting is done. База данных - + + Database type + Тип базы данных + + + Database driver Драйвер базы данных - + + Generate automatically + Сгенерировать автоматически + + + + Options + Опции + + + + Permanent (keep it in configuration) + Постоянная (сохранить базу в конфигурационном файле) + + + + Test connection + Тест соединения + + Name Имя - Type Тип - Browse for database file on local computer - Указать файл базы данных на локальном компьютере + Указать файл базы данных на локальном компьютере + + + + Create new database file + Создать новый файл базы данных - + + File Файл - + + Name (on the list) + Имя (в списке) + + + Generate name basing on file path Генерировать имя на основе пути к файлу - Permanent Запомнить - + <p>Enable this if you want the database to be stored in configuration file and restored every time SQLiteStudio is started.</p> aasfd <p>Активируйте эту опцию для сохранения базы данных в конфигурационном файле и добавления её в список при каждом запуске SQLiteStudio.</p> - Test database connection Тест соединения с базой данных - + + Browse for existing database file on local computer + Указать существующий файл базы данных на локальном компьютере + + + Browse Обзор - + Enter an unique database name. - + Введите уникальное имя базы данных. - + This name is already in use. Please enter unique name. - + Данное имя уже используется. Пожалуйста, укажите уникальное имя. - + Enter a database file path. - + Введите путь к базе данных. - + This database is already on the list under name: %1 - + Указанная база данных уже находится в списке под именем %1 - + Select a database type. - + Выберите тип базы данных. + + + + Auto-generated + Автоматически сгенерировано - The name will be auto-generated Имя будет сгенерировано автоматически - + Type the name Введите имя @@ -2321,125 +2371,125 @@ All objects from this group will be moved to parent group. DbTreeModel - + Database: %1 dbtree tooltip База данных: %1 - + Version: dbtree tooltip Версия: - + File size: dbtree tooltip Размер файла: - + Encoding: dbtree tooltip Кодировка: - + Error details: dbtree tooltip Подробности ошибки: - + Table : %1 dbtree tooltip Таблица: %1 - + Columns (%1): dbtree tooltip Столбцы (%1): - + Indexes (%1): dbtree tooltip Индексы (%1): - + Triggers (%1): dbtree tooltip Триггеры (%1): - + Copy Копировать - + Move Переместить - + Include data Включая данные - + Include indexes Включая индексы - + Include triggers Включая триггеры - + Abort Прервать - + Referenced tables Связанные таблицы - + Do you want to include following referenced tables as well: %1 Вы хотите также включить следующие связанные таблицы: %1 - + Name conflict Конфликт имён - + Following object already exists in the target database. Please enter new, unique name, or press '%1' to abort the operation: Данный объект уже существует в целевой базе данных. Пожалуйста введите новое уникальное имя или нажмите %1 для прерывания операции: - + SQL statements conversion Конвертация конструкций SQL - + Following error occurred while converting SQL statements to the target SQLite version: При конвертации конструкций SQL в новую версию SQLite произошла ошибка: - + Would you like to ignore those errors and proceed? Вы хотите проигнорировать эти ошибки и продолжить? @@ -2795,59 +2845,59 @@ Please enter new, unique name, or press '%1' to abort the operation:Отмена - - - + + + Select database to export. Выберите базу данных для экспорта. - + Select table to export. Выберите таблицу для экспорта. - + Enter valid query to export. Введи корректный запрос для экспорта. - + Select at least one object to export. Выберите хотя бы один объект для экспорта. - + You must provide a file name to export to. Необходимо указать имя файла, в который будет произведён экспорт. - + Path you provided is an existing directory. You cannot overwrite it. Указанный путь является существующим каталогом. Его невозможно перезаписать. - + The directory '%1' does not exist. Каталог '%1' не существует. - + The file '%1' exists and will be overwritten. Файл '%1' существует и будет перезаписан. - + All files (*) Все файлы (*) - + Pick file to export to Выберите файл для экспорта - + Internal error during export. This is a bug. Please report it. Внутренняя ошибка во время экспорта. Пожалуйста, вышлите отчёт об этой ошибке. @@ -3118,17 +3168,27 @@ Please enter new, unique name, or press '%1' to abort the operation:Опции - + Input file: Файл-источник: - + Text encoding: Кодировка текста: + + + <p>If enabled, any constraint violation, or invalid data format (wrong column count), or any other problem encountered during import will be ignored and the importing will be continued.</p> + <p>Если опция активирована, все нарушения ограничений, неправильный формат данных (неверное количество столбцов) и любые другие проблемы, возникшие при осуществлении импорта, будут проигнорированы и импорт будет продолжен.</p> + + Ignore errors + Игнорировать ошибки + + + Data source options Опции источника данных @@ -3138,37 +3198,37 @@ Please enter new, unique name, or press '%1' to abort the operation:Отмена - + If you type table name that doesn't exist, it will be created. Если вы введёте несуществующее имя таблицы, она будет создана. - + Enter the table name Введите имя таблицы - + Select import plugin. Выберите модуль импорта. - + You must provide a file to import from. Необходимо указать файл, из которого осуществляется импорт. - + The file '%1' does not exist. Файл '%1' не существует. - + Path you provided is a directory. A regular file is required. Указанный путь является каталогом. Необходимо указать файл. - + Pick file to import from Выберите файл для импорта @@ -3540,7 +3600,7 @@ Please enter new, unique name, or press '%1' to abort the operation:Невозможно применить стиль: %1 - + Cannot export, because no export plugin is loaded. Невозможно произвести экспорт, т.к. не загружено ни одного модуля экспорта. @@ -3550,37 +3610,37 @@ Please enter new, unique name, or press '%1' to abort the operation:Невозможно произвести импорт, т.к. не загружено ни одного модуля импорта. - + Rename window Переименовать окно - + Enter new name for the window: Введите новое имя для окна: - + New updates are available. <a href="%1">Click here for details</a>. Доступны обновления. <a href="%1">Нажмите здесь для подробностей</a>. - + You're running the most recent version. No updates are available. Установлена последняя версия. Обновлений нет. - + Database passed in command line parameters (%1) was already on the list under name: %2 - + База данных, переданная через аргументы командной строки (%1), уже находится в списке под именем %2 - + Database passed in command line parameters (%1) has been temporarily added to the list under name: %2 - База данных, переданная через аргумент командной строки (%1), была временно добавлена в список под именем %2 + База данных, переданная через аргументы командной строки (%1), была временно добавлена в список под именем %2 - + Could not add database %1 to list. Невозможно добавить базу данных %1 в список. @@ -3588,17 +3648,17 @@ Please enter new, unique name, or press '%1' to abort the operation: MdiWindow - + Uncommited changes Неподтверждённые изменения - + Close anyway Всё равно закрыть - + Don't close Не закрывать @@ -3908,68 +3968,68 @@ Please enter new, unique name, or press '%1' to abort the operation: QObject - + Cannot edit columns that are result of compound %1 statements (one that includes %2, %3 or %4 keywords). Невозможно редактировать столцбы, являющиеся результатом составных конструкций %1 (те, которые включают ключевые слова %2, %3 и %4). - + The query execution mechanism had problems with extracting ROWID's properly. This might be a bug in the application. You may want to report this. В механизме выполнения запросов возникли проблемы при корректном извлечении значений ROWID. Предположительно это ошибка в приложении. Возможно стоит отправить отчёт об ошибке. - + Requested column is a result of SQL expression, instead of a simple column selection. Such columns cannot be edited. Запрошенный столбец является результатом SQL выражения, а не просто выбором столбца. Такие столбцы не могут быть отредактированы. - + Requested column belongs to restricted SQLite table. Those tables cannot be edited directly. Запрошенный столбец принадлежит служебной таблице SQLite. Эти таблицы нельзя редактировать напрямую. - + Cannot edit results of query other than %1. Невозможно редактировать результаты запросов, отличных от %1. - + Cannot edit columns that are result of aggregated %1 statements. Невозможно редактировать столцбы, являющиеся результатом агрегирующих конструкций %1. - + Cannot edit columns that are result of %1 statement. Невозможно редактировать столцбы, являющиеся результатом конструкции %1. - + Cannot edit columns that are result of common table expression statement (%1). Невозможно редактировать столцбы, являющиеся результатом обобщённого табличного выражения (%1). - - - - + + + + on conflict: %1 data view tooltip при конфликте: %1 - + references table %1, column %2 data view tooltip ссылается на таблицу %1, столбец %2 - + condition: %1 data view tooltip условие: %1 - + collation name: %1 data view tooltip имя сравнения: %1 @@ -4327,7 +4387,8 @@ Please enter new, unique name, or press '%1' to abort the operation:Все файлы - + + Database file Файл баз данных @@ -4820,69 +4881,69 @@ find next SqlQueryModel - - + + Only one query can be executed simultaneously. Одновременно может быть выполнен только один запрос. - + Uncommited data Неподтверждённые данные - + There are uncommited data changes. Do you want to proceed anyway? All uncommited changes will be lost. Имеются неподтверждённые изменения данных. Вы действительно хотите продолжить? Все неподтверждённые изменения будут утеряны. - + Cannot commit the data for a cell that refers to the already closed database. Невозможно подтвердить данные для ячейки, которая ссылается на уже закрытую базу данных. - + Could not begin transaction on the database. Details: %1 Невозможно начать транзакцию в базе данных. Подробности: %1 - + An error occurred while commiting the transaction: %1 При завершении транзакции возникла ошибка: %1 - + An error occurred while rolling back the transaction: %1 При отмене транзакции возникла ошибка: %1 - + Tried to commit a cell which is not editable (yet modified and waiting for commit)! This is a bug. Please report it. Попытка подтверждения данных для нередактируемой ячейки (которая тем не менее была изменена и ожидает подтверждения). Это программная ошибка. Пожалуйста, отправьте о ней отчёт. - + An error occurred while commiting the data: %1 При подтверждении данных произошла ошибка: %1 - - + + Error while executing SQL query on database '%1': %2 Ошибка при выполнении SQL запроса к базе данных '%1': %2 - + Error while loading query results: %1 Ошибка при загрузке результатов запроса: %1 - + Insert multiple rows Вставить несколько строк - + Number of rows to insert: Количество вставляемых строк: @@ -4890,87 +4951,92 @@ find next SqlQueryView - + Copy Копировать - + Copy as... Копировать как... - + Paste Вставить - + Paste as... Вставить как... - + Set NULL values Установить значения на NULL - + Erase values Стереть содержимое - + Edit value in editor Править содержимое в редакторе - + Commit Подтвердить - + Rollback Откатить - + Commit selected cells Подтвердить выбранные ячейки - + Rollback selected cells Откатить выбранные ячейки - + Define columns to sort by Определить столбцы для сортировки - + Remove custom sorting Сбросить указанную сортировку - + Insert row Вставить строку - + Insert multiple rows Вставить несколько строк - + Delete selected row Удалить выбранную строку - + + No items selected to paste clipboard contents to. + Не выбраны элементы для вставки в них содержимого буфера обмена. + + + Edit value Править содержимое @@ -5580,41 +5646,41 @@ Do you want to commit the structure, or do you want to go back to the structure Условие для частичного индекса - + Name table window triggers Имя - + Event table window triggers Событие - + Condition table window triggers Условие - + Details table window triggers Подробности - + Table window "%1" has uncommited structure modifications and data. В окне таблицы "%1" имеются неподтверждённые изменения структуры и данных. - + Table window "%1" has uncommited data. В окне таблицы "%1" имеются неподтверждённые изменения данных. - + Table window "%1" has uncommited structure modifications. В окне таблицы "%1" имеются неподтверждённые изменения структуры. @@ -5702,33 +5768,33 @@ Do you want to commit the structure, or do you want to go back to the structure DDL - + On view: Для представления: - + Could not process trigger %1 correctly. Unable to open a trigger dialog. Не удалось корректно обработать триггер %1. Невозможно открыть окно триггера. - + Enter a valid condition. Введите корректное условие. - + Enter a valid trigger code. Введите корректный код триггера. - + Error trigger dialog Ошибка - + An error occurred while executing SQL statements: %1 При выполнении конструкций SQL произошла ошибка: diff --git a/SQLiteStudio3/guiSQLiteStudio/translations/guiSQLiteStudio_sk.qm b/SQLiteStudio3/guiSQLiteStudio/translations/guiSQLiteStudio_sk.qm index 1776294..a2ccadd 100644 Binary files a/SQLiteStudio3/guiSQLiteStudio/translations/guiSQLiteStudio_sk.qm and b/SQLiteStudio3/guiSQLiteStudio/translations/guiSQLiteStudio_sk.qm differ diff --git a/SQLiteStudio3/guiSQLiteStudio/translations/guiSQLiteStudio_sk.ts b/SQLiteStudio3/guiSQLiteStudio/translations/guiSQLiteStudio_sk.ts index c71f491..26e0fb1 100644 --- a/SQLiteStudio3/guiSQLiteStudio/translations/guiSQLiteStudio_sk.ts +++ b/SQLiteStudio3/guiSQLiteStudio/translations/guiSQLiteStudio_sk.ts @@ -6,87 +6,87 @@ About SQLiteStudio and licenses - + O programe SQLiteStudio a licenciách About - + O programe <html><head/><body><p align="center"><span style=" font-size:11pt; font-weight:600;">SQLiteStudio v%1</span></p><p align="center">Free, open-source, cross-platform SQLite database manager.<br/><a href="http://sqlitestudio.pl"><span style=" text-decoration: underline; color:#0000ff;">http://sqlitestudio.pl</span></a><br/></p><p align="center">%2<br/></p><p align="center">Author and active maintainer:<br/>SalSoft (<a href="http://salsoft.com.pl"><span style=" text-decoration: underline; color:#0000ff;">http://salsoft.com.pl</span></a>)<br/></p></body></html> - + <html><head/><body><p align="center"><span style=" font-size:11pt; font-weight:600;">SQLiteStudio v%1</span></p><p align="center">Slobodný, open-source, multi-platformový SQLite databázový manažér.<br/><a href="http://sqlitestudio.pl"><span style=" text-decoration: underline; color:#0000ff;">http://sqlitestudio.pl</span></a><br/></p><p align="center">%2<br/></p><p align="center">Autor a aktívny správca:<br/>SalSoft (<a href="http://salsoft.com.pl"><span style=" text-decoration: underline; color:#0000ff;">http://salsoft.com.pl</span></a>)<br/></p></body></html> Licenses - + Licencie Environment - + Prostredie Icon directories - + Adresáre s ikonami Form directories - + Adresáre so štýlmi Plugin directories - + Adresáre s pluginmi Application directory - + Adresár aplikácie SQLite 3 version: - + Verzia SQLite3: Configuration directory - + Adresár s konfiguráciou Qt version: - + Verzia Qt: Portable distribution. - + Prenosná distribúcia. MacOS X application boundle distribution. - + MacOS X aplikačná distribúcia. Operating system managed distribution. - + Distribúcia spravovaná operačným systémom. Copy - + Kopírovať <h3>Table of contents:</h3><ol>%2</ol> - + <h3>Tabuľka obsahu:</h3><ol>%2</ol> @@ -94,74 +94,75 @@ Bugs and ideas - + Chyby a nápady Reporter - + Reportér E-mail address - + emailová adresa Log in - + Prihlásenie Short description - + Krátky popis Detailed description - + Detailný popis Show more details - + Zobraziť viacej detailov SQLiteStudio version - + Verzia SQLiteStudio Operating system - + Operačný systém Loaded plugins - + Načítané pluginy Send - + Odoslať You can see all your reported bugs and ideas by selecting menu '%1' and then '%2'. - + Všetky svoje nahlásené chyby a nápady môžte vidieť výberom '%1' a následne '%2'. A bug report sent successfully. - + Správa o chybe bola úspešne odoslaná. An error occurred while sending a bug report: %1 %2 - + Vyskytol sa problém pri posielaní správy o chybe: %1 +%2 @@ -252,7 +253,7 @@ Title - + Titulok @@ -264,7 +265,7 @@ URL - + URL @@ -279,7 +280,7 @@ Delete selected entry - + Vymazať vybranú položku @@ -292,7 +293,7 @@ Log in - + Prihlásenie @@ -302,12 +303,12 @@ Login: - + Meno: Password: - + Heslo: @@ -327,17 +328,17 @@ Abort - + Zrušiť A login must be at least 2 characters long. - + meno musí mať dĺžku minimálne 2 znaky. A password must be at least 5 characters long. - + Heslo musí mať dĺžku minimálne 5 znakov. @@ -350,22 +351,22 @@ Filter collations - + Filtrovať porovnávania Collation name: - + Názov porovnánavania: Implementation language: - + Implementačný jazyk: Databases - + Databázy @@ -385,27 +386,27 @@ Collations editor - + Editor porovnávaní Commit all collation changes - + Potvrdiť všetky zmeny v porovnávaní Rollback all collation changes - + Vrátiť späť všetky zmeny v porovnávaní Create new collation - + Vytvoriť nové porovnávanie Delete selected collation - + Vymazať vybrané porovnávanie @@ -430,7 +431,7 @@ Collations editor window has uncommited modifications. - + Okno editora porovnávaní obsahuje nepotvrdené zmeny. @@ -438,7 +439,7 @@ Pick a color - + Vyberte farbu @@ -446,22 +447,22 @@ Collation name: - + Názov porovnánavania: Named constraint: - + Pomenovanie obmedzenia: Enter a name of the constraint. - + Zadajte názov obmedzenia. Enter a collation name. - + Zadajte názov porovnávania. @@ -469,12 +470,12 @@ Default value: - + Prednastavená hodnota: Named constraint: - + Pomenovanie obmedzenia: @@ -489,7 +490,7 @@ Enter a name of the constraint. - + Zadajte názov obmedzenia. @@ -497,132 +498,142 @@ Column - + Stĺpec Name and type + Názov a typ + + + + Scale - - Data type: + + Precision - + + Data type: + Datový typ: + + + Column name: - + Názov stĺpca: - + Size: - + Veľkosť: - + Constraints - + Obmedzenia - + Unique - + Jedinečný - - - - - - - + + + + + + + Configure - + Konfigurovať - + Foreign Key - + Cudzí klúč - + Collate - + Porovnanie - + Not NULL - + Nie NULL - + Check condition - + Primary Key - + Primárny klúč - + Default - + Prednastavená hodnota - + Advanced mode - + Rozšírený mód Add constraint column dialog - + Pridať obmedzenie Edit constraint column dialog - + Upraviť obmedzenie Delete constraint column dialog - + Vymazať obmedzenie Move constraint up column dialog - + Posunúť obmedzenie hore Move constraint down column dialog - + Posunúť obmedzenie dole Add a primary key column dialog - + Pridať primárny kľúč Add a foreign key column dialog - + Pridať cudzí kľúč Add an unique constraint column dialog - + Pridať jedinečné obmedzenie @@ -672,19 +683,19 @@ but it's okay to use it. Type column dialog constraints - + Typ Name column dialog constraints - + Názov Details column dialog constraints - + Detaily @@ -692,17 +703,17 @@ but it's okay to use it. Foreign table: - + Cudzia tabuľka: Foreign column: - + Cudzí stĺpec: Reactions - + Reakcie @@ -712,27 +723,27 @@ but it's okay to use it. Named constraint - + Pomenovanie obmedzenia Constraint name - + Názov obmedzenia Pick the foreign table. - + Vyberte cudziu tabuľku. Pick the foreign column. - + Vyberte cudzí stĺpec. Enter a name of the constraint. - + Zadajte názov obmedzenia. @@ -740,33 +751,33 @@ but it's okay to use it. Autoincrement - + Autoikrement Sort order: - + Zoradiť: Named constraint: - + Pomenovanie obmedzenia: On conflict: - + Pri konflikte: Enter a name of the constraint. - + Zadajte názov obmedzenia. Autoincrement (only for %1 type columns) column primary key - + Autoinkrement (iba pre stĺpec typu %1) @@ -774,17 +785,17 @@ but it's okay to use it. Named constraint: - + Pomenovanie obmedzenia: On conflict: - + Pri konflikte: Enter a name of the constraint. - + Zadajte názov obmedzenia. @@ -793,85 +804,85 @@ but it's okay to use it. Column: %1 completer statusbar - + Stĺpec: %1 Table: %1 completer statusbar - + Tabuľka: %1 Index: %1 completer statusbar - + Index: %1 Trigger: %1 completer statusbar - + Spúšťač: %1 View: %1 completer statusbar - + Pohľad: %1 Database: %1 completer statusbar - + Databáza: %1 Keyword: %1 completer statusbar - + Kľúčové slovo: %1 Function: %1 completer statusbar - + Funkcia: %1 Operator: %1 completer statusbar - + Operátor: %1 String completer statusbar - + Reťazec Number completer statusbar - + Číslo Binary data completer statusbar - + Binárne dáta Collation: %1 completer statusbar - + Porovnávanie: %1 Pragma function: %1 completer statusbar - + Pragma funkcia : %1 @@ -880,72 +891,72 @@ but it's okay to use it. Configuration - + Konfigurácia Search - + Hľadať General - + Všeobecné Keyboard shortcuts - + Klávesové skratky Look & feel - + Vzhľad Style - + Štýl Fonts - + Fonty Colors - + Farby Plugins - + Pluginy Code formatters - + Formát kódu Data browsing - + Prezeranie dát Data editors - + Editory dát Data browsing and editing - + Prezeranie a úprava dát Number of data rows per page: - + Počet data riadkov na stranu: @@ -961,12 +972,12 @@ but it's okay to use it. Data types - + Datové typy Available editors: - + Dostupné editory: @@ -976,38 +987,38 @@ but it's okay to use it. Schema editing - + Úprava schémy Number of DDL changes kept in history. - + Počet DDL zmien uchovávaných v histórii. DDL history size: - + Veľkosť DDL histórie: Don't show DDL preview dialog when commiting schema changes - + Nezobrazovať náhľad DDL pri potvrdzovaní zmien v schéme SQL queries - + SQL dotazy Number of queries kept in the history. - + Počet dotazov uchovávaných v histórii. History size: - + Veľkosť SQL histórie: @@ -1022,53 +1033,53 @@ but it's okay to use it. Updates - + Aktualizácie Automatically check for updates at startup - + Kontrolovať aktualizácie pri štarte Session - + Sedenie Restore last session (active MDI windows) after startup - + Obnoviť posledné sedenie (aktívne okná) pri štarte Filter shortcuts by name or key combination - + Filtrovať podľa názvu alebo klávesovej skratky Action - + Akcia Key combination - + Klávesová skratka Language - + Jazyk Changing language requires application restart to take effect. - + Je potrebné reštartovať aplikáciu aby sa zmena jazyka prejavila. Database list - + Zoznam databáz @@ -1168,7 +1179,7 @@ but it's okay to use it. Hide built-in plugins - + Nezobrazovať interné pluginy @@ -1386,7 +1397,7 @@ but it's okay to use it. Version: plugin details - + Verzia: @@ -1431,7 +1442,7 @@ but it's okay to use it. Details - + Detaily @@ -1441,17 +1452,17 @@ but it's okay to use it. Add new data type - + Pridať nový datový typ Rename selected data type - + Premenovať vybraný datový typ Delete selected data type - + Vymazať vybraný datový typ @@ -1464,27 +1475,27 @@ but it's okay to use it. The condition - + Podmienka Named constraint: - + Pomenovanie obmedzenia: On conflict - + Pri konflikte Enter a valid condition. - + Zadajte platnú podmienku. Enter a name of the constraint. - + Zadajte názov obmedzenia. @@ -1493,49 +1504,49 @@ but it's okay to use it. New constraint constraint dialog - + Nové obmedzenie Create constraint dialog - + Vytvoriť Edit constraint dialog window - + Upraviť obmedzenie Apply constraint dialog - + Aplikovať Primary key table constraints - + Primárny klúč Foreign key table constraints - + Cudzí klúč Unique table constraints - + Jedinečnosť Not NULL table constraints - + Nie NULL @@ -1547,13 +1558,13 @@ but it's okay to use it. Collate table constraints - + Porovnanie Default table constraints - + Prednastavená hodnota @@ -1562,13 +1573,13 @@ but it's okay to use it. Table table constraints - + Tabuľka Column (%1) table constraints - + Stĺpec (%1) @@ -1580,19 +1591,19 @@ but it's okay to use it. Type table constraints - + Typ Details table constraints - + Detaily Name table constraints - + Názov @@ -1601,118 +1612,119 @@ but it's okay to use it. Filter data data view - + Filtrovať Grid view - + Tabuľkové zobrazenie Form view - + Formulárové zobrazenie Refresh table data data view - + Obnoviť dáta v tabuľke First page data view - + Prvá strana Previous page data view - + Predchádzajúca strana Next page data view - + Nasledujúca strana Last page data view - + Posledná strana Apply filter data view - + Aplikovať filter Commit changes for selected cells data view - + Potvrdiť zmeny pre vybrané bunky Rollback changes for selected cells data view - + Vrátiť späť zmeny pre vybrané bunky Show grid view of results sql editor - + Výsledky zobraziť v tabuľke Show form view of results sql editor - + Výsledky zobraziť vo formulári Filter by text data view - + Filtrovať pomocou textu Filter by the Regular Expression data view - + Filtrovať pomocou regulárneho výrazu Filter by SQL expression data view - + Filtrovať pomocou SQL výrazu Tabs on top data view - + Záložky hore Tabs at bottom data view - + Záložky dole Total number of rows is being counted. Browsing other pages will be possible after the row counting is done. - + Spočítava sa celkový počet riadkov. +Prezeranie ďalších strán bude možné až po dokončení spočítavania. Row: %1 - + Riadok:%1 @@ -1720,27 +1732,27 @@ Browsing other pages will be possible after the row counting is done. Convert database - + Konvertovať databázu Source database - + Zdrojová databáza Source database version: - + Verzia zdrojovej databázy: Target database - + Cieľová databáza Target version: - + Cieľová databáza: @@ -1750,12 +1762,12 @@ Browsing other pages will be possible after the row counting is done. Target file: - + Cieľový súbor: Name of the new database: - + Názov novej databázy: @@ -1818,93 +1830,133 @@ Browsing other pages will be possible after the row counting is done. Database + Databáza + + + + Database type - + Database driver + Databázový ovládač + + + + Generate automatically - - Name + + Options + Voľby + + + + Permanent (keep it in configuration) - - Type + + Test connection - + Name + Názov + + + Type + Typ + + Browse for database file on local computer + Hľadať databázový súbor na lokálnom počítači + + + + Create new database file - + + File + Súbor + + + + Name (on the list) - + Generate name basing on file path - + Generovať názov na základe cesty k súboru - Permanent - + Uložiť natrvalo - + <p>Enable this if you want the database to be stored in configuration file and restored every time SQLiteStudio is started.</p> aasfd - + <p>Databáza sa uloží do konfiguračného súboru a bude obnovená pri každom spustení SQLiteStudia.</p> - Test database connection + Otestovať spojenie s databázou + + + + Browse for existing database file on local computer - + Browse - + Prehľadávať - + Enter an unique database name. - + Zadajte názov databázy. - + This name is already in use. Please enter unique name. - + Tento názov už existuje. Prosím zadajte iný názov. - + Enter a database file path. - + Zadajte cestu k databázovému súboru. - + This database is already on the list under name: %1 - + Táto databáza už je v zozname pod názvom: %1 - + Select a database type. + Vyberte typ databázy. + + + + Auto-generated - The name will be auto-generated - + Názov bude vygenerovaný automaticky - + Type the name - + Zadajte meno @@ -1912,47 +1964,48 @@ Browsing other pages will be possible after the row counting is done. Delete table - + Vymazať tabuľku Are you sure you want to delete table %1? - + Ste si istý, že chcete vymazať tabuľku %1? Delete index - + Vymazať index Are you sure you want to delete index %1? - + Ste si istý, že chcete vymazať index %1? Delete trigger - + Vymazať spúšťač Are you sure you want to delete trigger %1? - + Ste si istý, že chcete vymazať spúšťač %1? Delete view - + Vymazať pohľad Are you sure you want to delete view %1? - + Ste si istý, že chcete vymazať pohľad %1? + Error while dropping %1: %2 - + Vyskystla sa chyba počas mazania %1: %2 @@ -1960,260 +2013,261 @@ Browsing other pages will be possible after the row counting is done. Databases - + Databázy Filter by name - + Filtrovať podľa názvu Copy - + Kopírovať Paste - + Vložiť Select all - + Vybrať všetko Create a group - + Vytvoriť skupinu Delete the group - + Vymazať skupinu Rename the group - + Premenovať skupinu Add a database - + Pridať databázu Edit the database - + Upraviť databázu Remove the database - + Odstrániť databázu Connect to the database - + Pripojiť sa k databáze Disconnect from the database - + Odpojiť sa od databázy Import - + Importovať Export the database - + Exportovať databázu Convert database type - + Konvertovať databázu Vacuum - + Vacuum Integrity check - + Kontrola integrity Create a table - + Vytvoriť tabuľku Edit the table - + Upraviť tabuľku Delete the table - + Vymazať tabuľku Export the table - + Exportovať tabuľku Import into the table - + Importovať do tabuľky Populate table - + Naplniť tabuľku Create similar table - + Vytvoriť rovnakú tabuľku Reset autoincrement sequence - + Resetovať sekvenciu autoinkrementu Create an index - + Vytvoriť index Edit the index - + Upraviť index Delete the index - + Vymazať index Create a trigger - + Vytvoriť spúšťač Edit the trigger - + Upraviť spúšťač Delete the trigger - + Vymazať spúšťač Create a view - + Vytvoriť pohľad Edit the view - + Upraviť pohľad Delete the view - + Vymazať pohľad Add a column - + Pridať stĺpec Edit the column - + Upraviť stĺpec Delete the column - + Vymazať stĺpec Delete selected items - + Vymazať vybrané položky Clear filter - + Zrušiť filter Refresh all database schemas - + Obnoviť všetky databázové schémy Refresh selected database schema - + Obnoviť vybranú databázovú schému Database - + Databáza Grouping - + Zoskupovanie Create group - + Vytvoriť skupinu Group name - + Názov skupiny Entry with name %1 already exists in group %2. - + Položka s názvom %1 už existuje v skupine %2. Delete group - + Vymazať skupinu Are you sure you want to delete group %1? All objects from this group will be moved to parent group. - + Ste si istý, že chcete vymazať skupinu %1? +Všetky objekty z tejto skupiny budú presunuté do nadradenej skupiny. Delete database - + Vymazať databázu Are you sure you want to delete database '%1'? - + Ste si istý, že chcete vymazať databázu '%1'? @@ -2230,32 +2284,32 @@ All objects from this group will be moved to parent group. Error while executing VACUUM on the database %1: %2 - + Vyskytla sa chyba počas vykonávania príkazu VACUUM na databáze %1: %2 VACUUM execution finished successfully. - + VACUUM úspešne skončilo. Integrity check (%1) - + Kontrola integrity (%1) Reset autoincrement - + Resetovať autoinkrement Are you sure you want to reset autoincrement value for table '%1'? - + Ste si istý, že chcete zresetovať hodnotu autoinkrementu pre tabuľku %1 ? An error occurred while trying to reset autoincrement value for table '%1': %2 - + Vyskytla sa chyba pri pokuse o zresetovanie hodnoty autoinkrementu pre tebuľku '%1': %2 @@ -2318,123 +2372,123 @@ All objects from this group will be moved to parent group. DbTreeModel - + Database: %1 dbtree tooltip - + Databáza: %1 - + Version: dbtree tooltip - + Verzia: - + File size: dbtree tooltip - + Veľkosť súboru: - + Encoding: dbtree tooltip - + Kódovanie: - + Error details: dbtree tooltip - + Detaily chyby: - + Table : %1 dbtree tooltip - + Tabuľka : %1 - + Columns (%1): dbtree tooltip - + Stĺpce (%1): - + Indexes (%1): dbtree tooltip - + Indexy (%1): - + Triggers (%1): dbtree tooltip - + Spúšťače (%1): - + Copy - + Kopírovať - + Move - + Include data - + Include indexes - + Include triggers - + Abort - + Zrušiť - + Referenced tables - + Do you want to include following referenced tables as well: %1 - + Name conflict - + Following object already exists in the target database. Please enter new, unique name, or press '%1' to abort the operation: - + SQL statements conversion - + Following error occurred while converting SQL statements to the target SQLite version: - + Would you like to ignore those errors and proceed? @@ -2456,7 +2510,7 @@ Please enter new, unique name, or press '%1' to abort the operation: DDL history - + DDL história @@ -2464,12 +2518,12 @@ Please enter new, unique name, or press '%1' to abort the operation: Queries to be executed - + Dotazy, ktoré budú vykonané Don't show again - + Znovu nezobrazovať @@ -2485,83 +2539,83 @@ Please enter new, unique name, or press '%1' to abort the operation: Query - + Dotaz History - + História Results in the separate tab - + Výsledky zobraziť v samostatnej záložke Results below the query - + Výsledky zobraziť pod dotaz SQL editor %1 - + SQL editor %1 Results - + Výsledky Execute query - + Vykonať dotaz Explain query - + Vysvetliť dotaz Clear execution history sql editor - + Vyprázdniť históriu dotazov Export results sql editor - + Vyexportovať výsledky Create view from query sql editor - + Vytvoriť pohľad z dotazu Previous database - + Predchádzajúca databáza Next database - + Nasledujúca databáza Show next tab sql editor - + Zobraziť nasledujúcu záložku Show previous tab sql editor - + Zobraziť predchádzajúcu záložku @@ -2578,42 +2632,42 @@ Please enter new, unique name, or press '%1' to abort the operation: Active database (%1/%2) - + Aktívna databáza (%1/%2) Query finished in %1 second(s). Rows affected: %2 - + Dotaz trval %1 sekúnd. Počet dotknutých riadkov: %2 Query finished in %1 second(s). - + Dotaz trval %1 sekúnd. Clear execution history - + Vyprázdniť históriu dotazov Are you sure you want to erase the entire SQL execution history? This cannot be undone. - + Ste si istý, že chete vymazať celú históriu SQL dotazov? Túto operáciu nieje možné vrátiť späť. Cannot export, because no export plugin is loaded. - + Nemôžem exportovať, lebo nebol načítaný žiaden plugin na export. No database selected in the SQL editor. Cannot create a view for unknown database. - + Nebola vybraná žiadna databáza v SQL editore. Nemôžem vytvoriť view pre neznámu databázu. Editor window "%1" has uncommited data. - + Okno editora "%1" obsahuje nepotrdené dáta. @@ -2639,210 +2693,210 @@ Please enter new, unique name, or press '%1' to abort the operation: Export - + Export What do you want to export? - + Čo chcete exportovať? A database - + Databáza A single table - + Jednotlivá tabuľka Query results - + Výsledky dotazu Table to export - + Tabuľka na export Database - + Databáza Table - + Tabuľka Options - + Voľby When this option is unchecked, then only table DDL (CREATE TABLE statement) is exported. - + Ak táto voľba nebude označená, tak sa vyexportuje len DDL tabuľky(príkaz CREATE TABLE). Export table data - + Exportovať dáta tabuľky Export table indexes - + Exportovať indexy tabuľky Export table triggers - + Exportovať spúšťače tabuľky Note, that exporting table indexes and triggers may be unsupported by some output formats. - + Poznámka. Niektoré exportné formáty nemusia podporovať export indexov a spúšťačov. Select database objects to export - + Vyberte databázové objekty, ktoré chcete exportovať Export data from tables - + Exportovať dáta z tabuliek Select all - + Vybrať všetko Deselect all - + Zrušiť výber Database: - + Databáza: Query to export results for - + Dotaz pre export výsledkov pre Query to be executed for results: - + Dotaz, ktorý bude vykonaný pre získanie dát: Export format and options - + Formát exportu a možnosti Export format - + Formát exportu Output - + Výstup Exported file path - + Cesta k výstupnému súboru Clipboard - + Schránka File - + Súbor Exported text encoding: - + Kódovanie vyexportovaného textu: Export format options - + Možnosti formátu exportu Cancel - + Zrušiť - - - + + + Select database to export. - + Vyberte databázu, ktorú chcete exportovať. - + Select table to export. - + Vyberte tabuľku, ktorú chcete exportovať. - + Enter valid query to export. - + Zadajte platný dotaz pre export. - + Select at least one object to export. - + Vyberte aspoň jeden objekt pre export. - + You must provide a file name to export to. - + Musíte zadať názov súboru, do ktorého sa budú exportovať dáta. - + Path you provided is an existing directory. You cannot overwrite it. - + Cesta, ktorú ste zadali je existujúci adresár. Nemôžte ho prepísať. - + The directory '%1' does not exist. - + Adresár %1 neexistuje. - + The file '%1' exists and will be overwritten. - + Súbor %1 už existuje a bude prepísaný. - + All files (*) - + Všetky súbory (*) - + Pick file to export to - + Výber súboru do ktorého sa budú exportovať dáta - + Internal error during export. This is a bug. Please report it. - + Počas exportu sa vyskytla interná chyba. Toto je chyba v programe. Prosím nahláste ju. @@ -2868,49 +2922,49 @@ Please enter new, unique name, or press '%1' to abort the operation: Commit row form view - + Potvrdiť riadok Rollback row form view - + Vrátiť späť riadok First row form view - + Prvý riadok Previous row form view - + Predchádzajúci riadok Next row form view - + Nasledujúci riadok Last row form view - + Posledný riadok Insert new row form view - + Vložiť nový riadok Delete current row form view - + Vymazať aktuálny riadok @@ -2933,7 +2987,7 @@ Please enter new, unique name, or press '%1' to abort the operation: Type: - + Typ: @@ -2948,7 +3002,7 @@ Please enter new, unique name, or press '%1' to abort the operation: Databases - + Databázy @@ -3078,92 +3132,102 @@ Please enter new, unique name, or press '%1' to abort the operation: Import data - + Import dát Table to import to - + Tabuľka na import Table - + Tabuľka Database - + Databáza Data source to import from - + Dátový zdroj na import Data source type - + Typ dátového zdroja Options - + Voľby - + Input file: - + Vstupný súbor: - + Text encoding: + Kódovanie textu: + + + + <p>If enabled, any constraint violation, or invalid data format (wrong column count), or any other problem encountered during import will be ignored and the importing will be continued.</p> - Data source options + Ignore errors + + + Data source options + Nastavenia dátového zdroja + Cancel - + Zrušiť - + If you type table name that doesn't exist, it will be created. - + Ak zadáte názov neexistujúcej tabuľky, tak bude vytvorená. - + Enter the table name - + Zadajte názov tabuľky - + Select import plugin. - + Vyberte importný plugin. - + You must provide a file to import from. - + Musíte zadať súbor, z ktorého sa budú importovať dáta. - + The file '%1' does not exist. - + Súbor %1 neexistuje. - + Path you provided is a directory. A regular file is required. - + Cesta, ktorú ste zadali je adresár. Prosím zadajte celú cestu. - + Pick file to import from - + Výber súboru, z ktorého sa budú importovať dáta @@ -3172,17 +3236,17 @@ Please enter new, unique name, or press '%1' to abort the operation: Index - + Index On table: - + Na tabuľke: Index name: - + Názov indexu: @@ -3192,27 +3256,27 @@ Please enter new, unique name, or press '%1' to abort the operation: Unique index - + Jedinečný index Column - + Stĺpec Collation - + Porovnávanie Sort - + Zoradiť DDL - + DDL @@ -3232,12 +3296,12 @@ Please enter new, unique name, or press '%1' to abort the operation: Select at least one column. - + Vyberte minimálne jeden stĺpec. Enter a valid condition. - + Zadajte platnú podmienku. @@ -3249,7 +3313,7 @@ Please enter new, unique name, or press '%1' to abort the operation: Sort order table constraints - + Zoradiť @@ -3275,12 +3339,12 @@ Please enter new, unique name, or press '%1' to abort the operation: Language - + Jazyk Please choose language: - + Prosím vyberte si jazyk: @@ -3288,27 +3352,27 @@ Please enter new, unique name, or press '%1' to abort the operation: Database toolbar - + Databázová lišta Structure toolbar - + Lišta štruktúr Tools - + Nástroje Window list - + Lišta okien View toolbar - + Lišta pohľadov @@ -3323,7 +3387,7 @@ Please enter new, unique name, or press '%1' to abort the operation: Data editors - + Editory dát @@ -3333,77 +3397,77 @@ Please enter new, unique name, or press '%1' to abort the operation: Running in debug mode. Debug messages are printed to the standard output. - + Beží v ladiacom móde. Ladiace správy sú vypisované na štandardný výstup. You need to restart application to make the language change take effect. - + Je potrebné reštartovať aplikáciu aby sa zmena jazyka prejavila. Open SQL editor - + Otvoriť SQL editor Open DDL history - + Otvoriť DDL históriu Open SQL functions editor - + Otvoriť editor SQL funkcií Open collations editor - + Otvoriť editor porovnávaní Import - + Import Export - + Export Open configuration dialog - + Konfigurácia Tile windows - + Oddeliť okná Tile windows horizontally - + Oddeliť okná horizontálne Tile windows vertically - + Oddeliť okná vertikálne Cascade windows - + Okná kaskádovito Next window - + Nasledujúce okno Previous window - + Predchádzajúce okno @@ -3413,184 +3477,184 @@ Please enter new, unique name, or press '%1' to abort the operation: Close selected window - + Zatvoriť vybrané okno Close all windows but selected - + Zatvoriť všetky okná okrem vybraného Close all windows - + Zatvoriť všetky okná Restore recently closed window - + Obnoviť posledné zatvorené okno Rename selected window - + Premenovať vybrané okno Open Debug Console - + Otvoriť ladiacu konzolu Report a bug - + Nahlásiť chybu Propose a new feature - + Navrhnúť novú funkciu About - + O programe Licenses - + Licencie Open home page - + Otvoriť domovskú stránku Open forum page - + Otvoriť fórum User Manual - + Užívateľský manuál SQLite documentation - + Dokumentácia SQLite Report history - + História hlásení Check for updates - + Skontrolovať akutalizácie Database menubar - + Databázy Structure menubar - + Štruktúry View menubar - + Zobrazenie Window list menubar view menu - + Lišta okien Tools menubar - + Nástroje Help - + Pomoc Could not set style: %1 main window - + Nemôžem nastaviť štýl: %1 - + Cannot export, because no export plugin is loaded. - + Nemôžem exportovať, lebo nebol načítaný žiaden plugin na export. Cannot import, because no import plugin is loaded. - + Nemôžem importovať, lebo nebol načítaný žiaden plugin na import. - + Rename window - + Premenovať okno - + Enter new name for the window: - + Zadajte nový názov pre okno: - + New updates are available. <a href="%1">Click here for details</a>. - + Nové aktualizácie sú dostupné. <a href="%1">Kliknite sem pre zobrazenie detailov</a>. - + You're running the most recent version. No updates are available. - + Niesú dostupné žiadne aktualizácie. Používate aktuálnu verziu. - + Database passed in command line parameters (%1) was already on the list under name: %2 - + Database passed in command line parameters (%1) has been temporarily added to the list under name: %2 - + Could not add database %1 to list. - + Nemôžem pridať databázu %1 do zoznamu. MdiWindow - + Uncommited changes - + Nepotvrdené zmeny - + Close anyway - + Don't close @@ -3601,7 +3665,7 @@ Please enter new, unique name, or press '%1' to abort the operation: Null value multieditor - + Hodnota null @@ -3639,7 +3703,7 @@ Please enter new, unique name, or press '%1' to abort the operation: Date - + Dátum @@ -3647,7 +3711,7 @@ Please enter new, unique name, or press '%1' to abort the operation: Date & time - + Dátum a čas @@ -3664,7 +3728,7 @@ Please enter new, unique name, or press '%1' to abort the operation: Number numeric multi editor tab name - + Číslo @@ -3682,22 +3746,22 @@ Please enter new, unique name, or press '%1' to abort the operation: Cut - + Vystrihnúť Copy - + Kopírovať Paste - + Vložiť Delete - + Vymazať @@ -3723,28 +3787,28 @@ Please enter new, unique name, or press '%1' to abort the operation: New constraint - + Nové obmedzenie Primary Key new constraint dialog - + Primárny klúč Foreign Key new constraint dialog - + Cudzí klúč Unique new constraint dialog - + Jedinečnosť @@ -3757,19 +3821,19 @@ Please enter new, unique name, or press '%1' to abort the operation: Not NULL new constraint dialog - + Nie NULL Collate new constraint dialog - + Porovnanie Default new constraint dialog - + Prednastavená hodnota @@ -3782,7 +3846,7 @@ Please enter new, unique name, or press '%1' to abort the operation: New updates are available! - + Nové aktualizácie sú dostupné! @@ -3792,7 +3856,7 @@ Please enter new, unique name, or press '%1' to abort the operation: Current version - + Nainštalovaná verzia @@ -3802,7 +3866,7 @@ Please enter new, unique name, or press '%1' to abort the operation: Check for updates on startup - + Kontrolovať aktualizácie pri štarte @@ -3843,38 +3907,38 @@ Please enter new, unique name, or press '%1' to abort the operation: Populate table - + Naplniť tabuľku Database - + Databáza Table - + Tabuľka Columns - + Stĺpce Number of rows to populate: - + Počet riadkov na naplnenie: Populate populate dialog button - + Naplniť Configure - + Konfigurovať @@ -3884,319 +3948,319 @@ Please enter new, unique name, or press '%1' to abort the operation: Select database with table to populate - + Vyberte databázu s tabuľkou na naplnenie Select table to populate - + Vyberte tabuľku na naplnenie You have to select at least one column. - + Musíte vybrať minimálne jeden stĺpec. QObject - + Cannot edit columns that are result of compound %1 statements (one that includes %2, %3 or %4 keywords). - + The query execution mechanism had problems with extracting ROWID's properly. This might be a bug in the application. You may want to report this. - + Requested column is a result of SQL expression, instead of a simple column selection. Such columns cannot be edited. - + Requested column belongs to restricted SQLite table. Those tables cannot be edited directly. - + Cannot edit results of query other than %1. - + Cannot edit columns that are result of aggregated %1 statements. - + Cannot edit columns that are result of %1 statement. - + Cannot edit columns that are result of common table expression statement (%1). - - - - + + + + on conflict: %1 data view tooltip - + Pri konflikte: %1 - + references table %1, column %2 data view tooltip - + condition: %1 data view tooltip - + collation name: %1 data view tooltip - + Názov porovnánavania: %1 Data grid view - + Tabuľkové zobrazenie dát Copy cell(s) contents to clipboard - + Kopírovať obsah buniek do schránky Paste cell(s) contents from clipboard - + Vložiť obsah buniek zo schránky Set empty value to selected cell(s) - + Vymazať hodnoty z vybraných buniek Set NULL value to selected cell(s) - + Nastaviť NULL hodnotu vo vybraných bunkách Commit changes to cell(s) contents - + Potvrdiť zmeny v bunkách Rollback changes to cell(s) contents - + Vrátiť späť zmeny v bunkách Delete selected data row - + Vymazať vybraný riadok Insert new data row - + Vložiť nový riadok Open contents of selected cell in a separate editor - + Otvoriť obsah vybranej bunky v samostatnom editore Total pages available: %1 - + Celkový počet strán: %1 Total rows loaded: %1 - + Celkový počet riadkov: %1 Data view (both grid and form) - + Zobrazenie dát (tabuľka a formulár) Refresh data - + Obnoviť dáta Switch to grid view of the data - + Prepnúť na tabuľkové zobrazenie dát Switch to form view of the data - + Prepnúť na formulárové zobrazenie dát Database list - + Zoznam databáz Delete selected item - + Vymazať vybranú položku Clear filter contents - + Vymazať filter Refresh schema - + Obnoviť schému Refresh all schemas - + Obnoviť všetky schémy Add database - + Pridať databázu Select all items - + Vybrať všetky položky Copy selected item(s) - + Kopírovať vybrané položky Paste from clipboard - + Vložiť zo schránky Tables - + Tabuľky Indexes - + Indexy Triggers - + Spúšťače Views - + Pohľady Columns - + Stĺpce Data form view - + Formulárové zobrazenie dát Commit changes for current row - + Potvrdiť zmeny pre aktuálny riadok Rollback changes for current row - + Vrátiť späť zmeny na aktuálnom riadku Go to first row on current page - + Prejsť na prvý riadok na aktuálnej strane Go to next row - + Prejsť na nasledujúci riadok Go to previous row - + Prejsť na predchádzajúci riadok Go to last row on current page - + Prejsť na posledný riadok na aktuálnej strane Insert new row - + Vložiť nový riadok Delete current row - + Vymazať aktuálny riadok Main window - + Hlavné okno Open SQL editor - + Otvoriť SQL editor Previous window - + Predchádzajúce okno Next window - + Nasledujúce okno Hide status area - + Skryť status okno Open configuration dialog - + Otvoriť konfiguračné okno Open Debug Console - + Otvoriť ladiacu konzolu @@ -4207,19 +4271,19 @@ Please enter new, unique name, or press '%1' to abort the operation: Cut selected text - + Vystrihnúť vybraný text Copy selected text - + Kopírovať vybraný text Delete selected text - + Vymazať vybraný text @@ -4241,72 +4305,72 @@ Please enter new, unique name, or press '%1' to abort the operation: Select whole editor contents - + Označiť všetko Save contents into a file - + Uložiť SQL do súboru Load contents from a file - + Načítať SQL zo súboru Find in text - + Nájsť v SQL Find next - + Nájsť ďalší Find previous - + Nájsť predchádzajúci Replace in text - + Nahradiť v SQL Delete current line - + Vymazať aktuálny riadok Request code assistant - + Otvoriť SQL pomocníka Format contents - + Formátovať SQL Move selected block of text one line down - + Presunúť blok kódu o riadok nižšie Move selected block of text one line up - + Presunúť blok kódu o riadok vyššie Copy selected block of text and paste it a line below - + Kopírovať blok kódu a vložiť ho na riadok nižšie Copy selected block of text and paste it a line above - + Kopírovať blok kódu a vložiť ho na riadok vyššie @@ -4319,9 +4383,10 @@ Please enter new, unique name, or press '%1' to abort the operation: - + + Database file - + Databázový súbor @@ -4331,7 +4396,7 @@ Please enter new, unique name, or press '%1' to abort the operation: Delete selected entry - + Vymazať vybranú položku @@ -4341,7 +4406,7 @@ Please enter new, unique name, or press '%1' to abort the operation: Execute query - + Vykonať dotaz @@ -4386,102 +4451,102 @@ Please enter new, unique name, or press '%1' to abort the operation: Refresh table structure - + Obnoviť štruktúru tabuľky Add new column - + Pridať nový stĺpec Edit selected column - + Upraviť vybraný stĺpec Delete selected column - + Vymazať vybraný stĺpec Export table data - + Exportovať dáta z tabuľky Import data to the table - + Importovať dáta do tabuľky Add new table constraint - + Pridať nové obmedzenie Edit selected table constraint - + Upraviť vybrané obmedzenie Delete selected table constraint - + Vymazaťˇvybrané obmedzenie Refresh table index list - + Obnoviť zoznam indexov Add new index - + Pridať nový index Edit selected index - + Upraviť vybraný index Delete selected index - + Vymazať vybraný index Refresh table trigger list - + Obnoviť zoznam spúšťačov Add new trigger - + Pridať nový spúšťač Edit selected trigger - + Upraviť vybraný spúšťač Delete selected trigger - + Vymazať vybraný spúšťač Go to next tab - + Prechod na nasledujúcu záložku Go to previous tab - + Prechod na predchádzajúcu záložku @@ -4499,7 +4564,7 @@ Please enter new, unique name, or press '%1' to abort the operation: Uncommited changes - + Nepotvrdené zmeny @@ -4514,22 +4579,22 @@ Following items are pending: Find or replace - + Nájsť alebo nahradiť Find: - + Nájsť: Case sensitive - + Rozlišovať veľké písmená Search backwards - + Hľadať spätne @@ -4540,22 +4605,23 @@ Following items are pending: Replace && find next - + Nahradiť a +nájsť ďalší Replace with: - + Nahradiť s: Replace all - + Nahradiť všetko Find - + Nájsť @@ -4563,34 +4629,34 @@ find next Sort by columns - + Zoradiť podľa stĺpcov Column - + Stĺpec Order - + Usporiadanie Sort by: %1 - + Zoradiť podľa : %1 Move column up - + Posunúť stĺpec hore Move column down - + Posunúť stĺpec dole @@ -4605,13 +4671,13 @@ find next Copy sql editor - + Kopírovať Paste sql editor - + Vložiť @@ -4623,7 +4689,7 @@ find next Select all sql editor - + Vybrať všetko @@ -4647,25 +4713,25 @@ find next Format SQL sql editor - + Formátovať SQL Save SQL to file sql editor - + Uložiť SQL do súboru Load SQL from file sql editor - + Načítať SQL zo súboru Delete line sql editor - + Vymazať riadok @@ -4695,25 +4761,25 @@ find next Find sql editor - + Nájsť Find next sql editor - + Nájsť ďalší Find previous sql editor - + Nájsť predchádzajúci Replace sql editor - + Nahradiť @@ -4728,7 +4794,7 @@ find next Save to file - + Uložiť do súboru @@ -4743,7 +4809,7 @@ find next Open file - + Otvoriť súbor @@ -4762,30 +4828,30 @@ find next Column: data view tooltip - + Stĺpec: Data type: data view - + Datový typ: Table: data view tooltip - + Tabuľka: Constraints: data view tooltip - + Obmedzenia: This cell is not editable, because: %1 - + Táto bunka nieje editovateľná, pretože: %1 @@ -4810,159 +4876,164 @@ find next SqlQueryModel - - + + Only one query can be executed simultaneously. - + Nemôže byť spustených viacero dotazov súčasne. - + Uncommited data - + Nepotvrdené dáta - + There are uncommited data changes. Do you want to proceed anyway? All uncommited changes will be lost. - + Sú tu nepotvrdené zmeny. Chcete aj napriek tomu pokračovať? Všetky nepotvrdené zmeny budú stratené. - + Cannot commit the data for a cell that refers to the already closed database. - + Nemôžem potrdiť dáta bunky, ktorá odkazuje na už uzatvorenú databázu. - + Could not begin transaction on the database. Details: %1 - + Nemôžem začať tranzakciu na databáze. Detaily: %1 - + An error occurred while commiting the transaction: %1 - + Vyskytla sa chyba počas potvrdzovania tranzakcie: %1 - + An error occurred while rolling back the transaction: %1 - + Vyskytla sa chyba počas vracania späť tranzakcie: %1 - + Tried to commit a cell which is not editable (yet modified and waiting for commit)! This is a bug. Please report it. - + Nastal pokus o potvrdenie zmien v bunke, ktorú nieje možné upravovať (napriek tomu bola upravená a čaká na potvrdenie)! Toto je chyba. Prosím nahláste ju. - + An error occurred while commiting the data: %1 - + Vyskytla sa chyba počas potvrdzovania dát: %1 - - + + Error while executing SQL query on database '%1': %2 - + Vyskytla sa chyba počas vykonávania SQL dotazu na databáze '%1': %2 - + Error while loading query results: %1 - + Vyskytla sa chyba počas načítavania výsledkov dotazu: %1 - + Insert multiple rows - + Vložiť viacero riadkov - + Number of rows to insert: - + Počet vkládaných riadkov: SqlQueryView - + Copy - + Kopírovať - + Copy as... - + Kopírovať ako... - + Paste - + Vložiť - + Paste as... - + Vložiť ako... - + Set NULL values - + Nastaviť null hodnoty - + Erase values - + Vymazať hodnoty - + Edit value in editor - + Upraviť hodnotu v editory - + Commit - + Potvrdiť - + Rollback - + Vrátiť späť - + Commit selected cells - + Potvrdiť vybrané bunky - + Rollback selected cells - + Vrátiť späť vybrané bunky - + Define columns to sort by - + Vybrať stĺpce na zoradenie podľa - + Remove custom sorting - + Odstrániť užívateľské triedenie - + Insert row - + Vložiť riadok - + Insert multiple rows - + Vložiť viacero riadkov - + Delete selected row - + Vymazať viacero riadkov + + + + No items selected to paste clipboard contents to. + Neboli vybrané žiadne položky na vloženie obsahu schránky. - + Edit value - + Upraviť hodnotu @@ -4970,12 +5041,12 @@ find next Error while commiting new row: %1 - + Vyskytla sa chyba počas potvrdzovania nového riadka: %1 Error while deleting row from table %1: %2 - + Vyskytla sa chyba počas mazania riadka z tabuľky %1: %2 @@ -4983,17 +5054,17 @@ find next Status - + Status Copy - + Kopírovať Clear - + Vyčistiť @@ -5002,19 +5073,19 @@ find next Type table constraints - + Typ Details table constraints - + Detaily Name table constraints - + Názov @@ -5022,7 +5093,7 @@ find next Foreign table: - + Cudzia tabuľka: @@ -5033,22 +5104,22 @@ but it's okay to use them anyway. Columns - + Stĺpce Local column - + Lokálny stĺpec Foreign column - + Cudzí stĺpec Reactions - + Reakcie @@ -5058,22 +5129,22 @@ but it's okay to use them anyway. Named constraint - + Pomenovanie obmedzenia Constraint name - + Názov obmedzenia Pick the foreign column. - + Vyberte cudzí stĺpec. Pick the foreign table. - + Vyberte cudziu tabuľku. @@ -5083,13 +5154,13 @@ but it's okay to use them anyway. Enter a name of the constraint. - + Zadajte názov obmedzenia. Foreign column table constraints - + Cudzí stĺpec @@ -5097,69 +5168,69 @@ but it's okay to use them anyway. Columns - + Stĺpce Column - + Stĺpec Collation - + Porovnávanie Sort - + Zoradiť Valid only for a single column with INTEGER data type - + Platné len pre jeden stĺpec s datovým typom INTEGER Autoincrement - + Autoinkrement Named constraint - + Pomenovanie obmedzenia Constraint name - + Názov obmedzenia On conflict - + Pri konflikte Collate table constraints - + Porovnať Sort order table constraints - + Zoradiť Select at least one column. - + Vyberte minimálne jeden stĺpec. Enter a name of the constraint. - + Zadajte názov obmedzenia. @@ -5168,19 +5239,19 @@ but it's okay to use them anyway. Name table structure columns - + Názov Data type table structure columns - + Datový typ Default value table structure columns - + Prednastavená hodnota @@ -5188,164 +5259,164 @@ but it's okay to use them anyway. Structure - + Štruktúra Table name: - + Názov tabuľky: Data - + Dáta Constraints - + Obmedzovače Indexes - + Indexy Triggers - + Spúšťače DDL - + DDL Export table table window - + Exportovať tabuľku Import data to table table window - + Importovať dáta do tabuľky Populate table table window - + Naplniť tabuľku Refresh structure table window - + Obnoviť štruktúru Commit structure changes table window - + Potvrdiť zmeny štruktúr Rollback structure changes table window - + Vrátiť späť zmeny štruktúr Add column table window - + Pridať stĺpec Edit column table window - + Upraviť stĺpec Delete column table window - + Vymazať stĺpec Move column up table window - + Posunúť stĺpec hore Move column down table window - + Posunúť stĺpec dole Create similar table table window - + Vytvoriť rovnakú tabuľku Reset autoincrement value table window - + Resetovať hodnotu autoinkrementu Add table constraint table window - + Pridať obmedzenie Edit table constraint table window - + Upraviť obmedzenie Delete table constraint table window - + Vymazať obmedzenie Move table constraint up table window - + Posunúť obmedzenie hore Move table constraint down table window - + Posunúť obmedzenie dole Add table primary key table window - + Pridať primárny kľúč Add table foreign key table window - + Pridať cudzí kľúč Add table unique constraint table window - + Pridať jedinečné obmedzenie @@ -5357,55 +5428,55 @@ but it's okay to use them anyway. Refresh index list table window - + Obnoviť zoznam indexov Create index table window - + Vytvoriť index Edit index table window - + Upraviť index Delete index table window - + Vymazať index Refresh trigger list table window - + Obnoviť zoznam spúšťačov Create trigger table window - + Vytvoriť spúšťač Edit trigger table window - + Upraviť spúšťač Delete trigger table window - + Vymazať spúšťač Are you sure you want to delete column '%1'? table window - + Ste si istý, že chcete vymazať stĺpec '%1' ? @@ -5455,17 +5526,17 @@ Would you like to proceed? Reset autoincrement - + Resetovať autoinkrement Are you sure you want to reset autoincrement value for table '%1'? - + Ste si istý, že chcete zresetovať hodnotu autoinkrementu pre tabuľku %1 ? An error occurred while trying to reset autoincrement value for table '%1': %2 - + Vyskytla sa chyba pri pokuse o zresetovanie hodnoty autoinkrementu pre tebuľku '%1': %2 @@ -5502,13 +5573,13 @@ Are you sure you want to create a table with blank name? Are you sure you want to delete table constraint '%1'? table window - + Ste si istý, že chcete vymazať obmedzenie '%1'? Delete constraint table window - + Vymazať obmedzenie @@ -5523,41 +5594,42 @@ Are you sure you want to create a table with blank name? Uncommited changes - + Nepotvrdené zmeny There are uncommited structure modifications. You cannot browse or edit data until you have table structure settled. Do you want to commit the structure, or do you want to go back to the structure tab? - + Sú tu nepotvrdené zmeny štruktúr. Nemôžte prezerať alebo editovať dáta dokiaľ nebude štruktúra tabuľky jasná. +Chcete potvrdiť štruktúru alebo sa chcete vrátiť do záložky štruktúr? Go back to structure tab - + Choď späť na záložku štruktúr Commit modifications and browse data. - + Potvrdiť zmeny a prezerať dáta. Name table window indexes - + Názov Unique table window indexes - + Jedinečný Columns table window indexes - + Stĺpce @@ -5566,43 +5638,43 @@ Do you want to commit the structure, or do you want to go back to the structure - + Name table window triggers - + Názov - + Event table window triggers - + Udalosť - + Condition table window triggers - + Podmienka - + Details table window triggers - + Detaily - + Table window "%1" has uncommited structure modifications and data. - + V okne tabuľky %1 sú nepotvrdené zmeny štruktúry a dáta. - + Table window "%1" has uncommited data. - + V okne tabuľky %1 sú nepotvrdené dáta. - + Table window "%1" has uncommited structure modifications. - + V okne tabuľky %1 sú nepotvrdené zmeny štruktúry. @@ -5624,17 +5696,17 @@ Do you want to commit the structure, or do you want to go back to the structure Trigger - + Spúšťač On table: - + Na tabuľke: Action: - + Akcia: @@ -5655,12 +5727,12 @@ Do you want to commit the structure, or do you want to go back to the structure Trigger name: - + Názov spúšťača: When: - + Kedy: @@ -5675,7 +5747,7 @@ Do you want to commit the structure, or do you want to go back to the structure Code: - + Kód: @@ -5685,36 +5757,36 @@ Do you want to commit the structure, or do you want to go back to the structure DDL - + DDL - + On view: - + Could not process trigger %1 correctly. Unable to open a trigger dialog. - + Enter a valid condition. - + Zadajte platnú podmienku. - + Enter a valid trigger code. - + Zadajte validný kód spúšťača. - + Error trigger dialog - + An error occurred while executing SQL statements: %1 @@ -5748,27 +5820,27 @@ Do you want to commit the structure, or do you want to go back to the structure Query - + Dotaz View name: - + Názov pohľadu: Data - + Dáta Triggers - + Spúšťače DDL - + DDL @@ -5795,43 +5867,43 @@ Do you want to commit the structure, or do you want to go back to the structure Refresh the view view window - + Obnoviť pohľad Commit the view changes view window - + Potvrdiť zmeny v pohľade Rollback the view changes view window - + Vrátiť späť zmeny v pohľade Refresh trigger list view window - + Obnoviť zoznam spúšťačov Create new trigger view window - + Vytvoriť nový spúšťač Edit selected trigger view window - + Upraviť vybraný spúšťač Delete selected trigger view window - + Vymazať vybraný spúšťač @@ -5856,35 +5928,36 @@ Do you want to commit the structure, or do you want to go back to the structure Uncommited changes - + Nepotvrdené zmeny There are uncommited structure modifications. You cannot browse or edit data until you have the view structure settled. Do you want to commit the structure, or do you want to go back to the structure tab? - + Sú tu nepotvrdené zmeny štruktúr. Nemôžte prezerať alebo editovať dáta dokiaľ nebude štruktúra tabuľky jasná. +Chcete potvrdiť štruktúru alebo sa chcete vrátiť do záložky štruktúr? Go back to structure tab - + Choď späť na záložku štruktúr Commit modifications and browse data. - + Potvrdiť zmeny a prezerať dáta. Could not commit view changes. Error message: %1 view window - + Nemôžem potvrdiť zmeny v pohľade. Chyba: %1 Name view window triggers - + Názov @@ -5896,13 +5969,13 @@ Do you want to commit the structure, or do you want to go back to the structure Condition view window triggers - + Podmienka Details table window triggers - + Detaily diff --git a/SQLiteStudio3/guiSQLiteStudio/translations/guiSQLiteStudio_zh_CN.qm b/SQLiteStudio3/guiSQLiteStudio/translations/guiSQLiteStudio_zh_CN.qm index be651ee..8879190 100644 Binary files a/SQLiteStudio3/guiSQLiteStudio/translations/guiSQLiteStudio_zh_CN.qm and b/SQLiteStudio3/guiSQLiteStudio/translations/guiSQLiteStudio_zh_CN.qm differ diff --git a/SQLiteStudio3/guiSQLiteStudio/translations/guiSQLiteStudio_zh_CN.ts b/SQLiteStudio3/guiSQLiteStudio/translations/guiSQLiteStudio_zh_CN.ts index a0dd959..9a6bd32 100644 --- a/SQLiteStudio3/guiSQLiteStudio/translations/guiSQLiteStudio_zh_CN.ts +++ b/SQLiteStudio3/guiSQLiteStudio/translations/guiSQLiteStudio_zh_CN.ts @@ -1,92 +1,92 @@ - + AboutDialog About SQLiteStudio and licenses - + 关于 SQLiteStudio 和许可协议 About - + 关于 <html><head/><body><p align="center"><span style=" font-size:11pt; font-weight:600;">SQLiteStudio v%1</span></p><p align="center">Free, open-source, cross-platform SQLite database manager.<br/><a href="http://sqlitestudio.pl"><span style=" text-decoration: underline; color:#0000ff;">http://sqlitestudio.pl</span></a><br/></p><p align="center">%2<br/></p><p align="center">Author and active maintainer:<br/>SalSoft (<a href="http://salsoft.com.pl"><span style=" text-decoration: underline; color:#0000ff;">http://salsoft.com.pl</span></a>)<br/></p></body></html> - + <html><head/><body><p align="center"><span style=" font-size:11pt; font-weight:600;">SQLiteStudio v%1</span></p><p align="center">自由,开源,跨平台的 SQLite 数据库管理工具。<br/><a href="http://sqlitestudio.pl"><span style=" text-decoration: underline; color:#0000ff;">http://sqlitestudio.pl</span></a><br/></p><p align="center">%2<br/></p><p align="center">作者和活跃维护人:<br/>SalSoft (<a href="http://salsoft.com.pl"><span style=" text-decoration: underline; color:#0000ff;">http://salsoft.com.pl</span></a>)<br/></p></body></html> Licenses - + 许可协议 Environment - + 环境 Icon directories - + 图标目录 Form directories - + 表格目录 Plugin directories - + 插件目录 Application directory - + 应用程序目录 SQLite 3 version: - + SQLite 3 版本: Configuration directory - + 配置文件目录 Qt version: - + Qt版本: Portable distribution. - + 便携版。 MacOS X application boundle distribution. - + MacOS X 应用版。 Operating system managed distribution. - + 系统提供版。 Copy - + 复制 <h3>Table of contents:</h3><ol>%2</ol> - + <h3>目录:</h3><ol>%2</ol> @@ -94,156 +94,158 @@ Bugs and ideas - + Bugs 和想法 Reporter - + 上报人 E-mail address - + E-mail 地址 Log in - + 登录 Short description - + 简要描述 Detailed description - + 详细描述 Show more details - + 更多详细信息 SQLiteStudio version - + SQLiteStudio 版本 Operating system - + 操作系统 Loaded plugins - + 已加载插件 Send - + 发送 You can see all your reported bugs and ideas by selecting menu '%1' and then '%2'. - + 您可以通过选择菜单 “1%”下的“%2”来查看全部您报告的bugs和想法。 A bug report sent successfully. - + Bug报告提交成功。 An error occurred while sending a bug report: %1 %2 - + 提交bug报告时发生了错误:%1 +%2 You can retry sending. The contents will be restored when you open a report dialog after an error like this. - + 您可以重新发送试试。当你在发生错误后重新打开上报对话框时,你之前输入的内容将会恢复。 An idea proposal sent successfully. - + 提交建议成功。 An error occurred while sending an idea proposal: %1 %2 - + 在提交建议时发生错误:%1 +%2 A bug report - + Bug报告 Describe problem in few words - + 简要描述一下问题 Describe problem and how to reproduce it - + 描述一下问题,怎么复现问题 A new feature idea - + 新功能建议 A title for your idea - + 您的建议题目 Describe your idea in more details - + 仔细描述一下您的想法 Reporting as an unregistered user, using e-mail address. - + 使用e-mail地址以未注册用户身份上报。 Reporting as a registered user. - + 作为已注册用户报告。 Log out - + 退出 Providing true email address will make it possible to contact you regarding your report. To learn more, press 'help' button on the right side. - + 使用真实email地址有助于您上报后联系到您。如果想了解更多,请点击右方的“帮助”按钮。 Enter vaild e-mail address, or log in. - + 输入正确的e-mail地址,或者登录。 Short description requires at least 10 characters, but not more than 100. Longer description can be entered in the field below. - + 简要描述至少10个字符,但不超过100个字符。更详细的描述内容请在下面的区域填写。 Long description requires at least 30 characters. - + 详细描述内容至少30个字符。 @@ -252,39 +254,39 @@ Title - + 标题 Reported at - + 报告时间 URL - + URL Reports history - + 报告历史 Clear reports history - + 清空报告历史 Delete selected entry - + 删除选中项 Invalid response from server. - + 无效的服务器回应。 @@ -292,57 +294,59 @@ Log in - + 登录 Credentials - + 认证信息 Login: - + 登录名: Password: - + 密码: Validation - + 这里不是很确认。Not sure about this translation. + 确认 Validate - + not sure about this translation + 确认 Validation result message - + 验证信息 Abort - + 中止 A login must be at least 2 characters long. - + 登录名至少2个字符。 A password must be at least 5 characters long. - + 密码至少5个字符。 Valid - + 已验证 @@ -350,87 +354,87 @@ Filter collations - + 过滤器排序规则 Collation name: - + 排序规则名称: Implementation language: - + 实现语言: Databases - + 数据库 Register in all databases - + 在所有数据库中注册 Register in following databases: - + 在下列数据库中注册: Implementation code: - + 实现代码: Collations editor - + 排序编辑器 Commit all collation changes - + 提交全部排序规则更改 Rollback all collation changes - + 回滚所有排序更改 Create new collation - + 创建新排序规则 Delete selected collation - + 删除选中排序规则 Editing collations manual - + 手动更改排序规则 Enter a non-empty, unique name of the collation. - + 为排序规则输入一个非空唯一的名称。 Pick the implementation language. - + 选择实现语言。 Enter a non-empty implementation code. - + 输入非空实现代码。 Collations editor window has uncommited modifications. - + 排序规则编辑器存在未提交的改动。 @@ -438,7 +442,7 @@ Pick a color - + 选择一种颜色 @@ -446,22 +450,22 @@ Collation name: - + 排序名称: Named constraint: - + 约束名: Enter a name of the constraint. - + 输入约束名称。 Enter a collation name. - + 输入排序规则名称。 @@ -469,27 +473,27 @@ Default value: - + 默认值: Named constraint: - + 已命名的约束: Enter a default value expression. - + 默认值表达式。 Invalid default value expression: %1 - + 无效的默认值表达式:%1 Enter a name of the constraint. - + 输入约束名: @@ -497,173 +501,183 @@ Column - + 字段 Name and type - + 名称和类型 + + + + Scale + 小数长度 + + + + Precision + 精度 - + Data type: - + 数据类型: - + Column name: - + 字段名: - + Size: - + 大小: - + Constraints - + 约束 - + Unique - + 唯一 - - - - - - - + + + + + + + Configure - + 配置 - + Foreign Key - + 外键 - + Collate - + 排序规则 - + Not NULL - + 非空 - + Check condition - + 条件 - + Primary Key - + 主键 - + Default - + 默认 - + Advanced mode - + 高级模式 Add constraint column dialog - + 添加约束 Edit constraint column dialog - + 编辑约束 Delete constraint column dialog - + 删除约束 Move constraint up column dialog - + 上移约束 Move constraint down column dialog - + 下移约束 Add a primary key column dialog - + 添加主键 Add a foreign key column dialog - + 添加外键 Add an unique constraint column dialog - + 添加唯一约束 Add a check constraint column dialog - + 添加条件约束 Add a not null constraint column dialog - + 添加非空约束 Add a collate constraint column dialog - + 添加排序规则约束 Add a default constraint column dialog - + 添加默认约束 Are you sure you want to delete constraint '%1'? column dialog - + 您确定要删除约束“%1”吗? Correct the constraint's configuration. - + 修正约束配置。 This constraint is not officially supported by SQLite 2, but it's okay to use it. - + SQLite2没有官方支持该约束,但是可以使用。 @@ -672,19 +686,19 @@ but it's okay to use it. Type column dialog constraints - + 类型 Name column dialog constraints - + 名称 Details column dialog constraints - + 详情 @@ -692,7 +706,7 @@ but it's okay to use it. Foreign table: - + @@ -717,7 +731,7 @@ but it's okay to use it. Constraint name - + 约束名称 @@ -732,7 +746,7 @@ but it's okay to use it. Enter a name of the constraint. - + 输入约束名称 @@ -745,7 +759,7 @@ but it's okay to use it. Sort order: - + 排序: @@ -755,7 +769,7 @@ but it's okay to use it. On conflict: - + 冲突: @@ -766,7 +780,7 @@ but it's okay to use it. Autoincrement (only for %1 type columns) column primary key - + Autoincrement (只能%1类型的字段才能有该属性) @@ -779,12 +793,12 @@ but it's okay to use it. On conflict: - + 冲突: Enter a name of the constraint. - + 输入约束名。 @@ -793,49 +807,49 @@ but it's okay to use it. Column: %1 completer statusbar - + 字段:%1 Table: %1 completer statusbar - + 表:%1 Index: %1 completer statusbar - + 索引:%1 Trigger: %1 completer statusbar - + 触发器:%1 View: %1 completer statusbar - + 视图:%1 Database: %1 completer statusbar - + 数据库:%1 Keyword: %1 completer statusbar - + 关键字:%1 Function: %1 completer statusbar - + 函数:%1 @@ -847,19 +861,19 @@ but it's okay to use it. String completer statusbar - + 字符串 Number completer statusbar - + 数值 Binary data completer statusbar - + 二进制数据 @@ -900,144 +914,144 @@ but it's okay to use it. Look & feel - + 外观 Style - + 风格 Fonts - + 字体 Colors - + 颜色 Plugins - + 插件 Code formatters - + 代码格式化 Data browsing - + 浏览数据 Data editors - + 数据编辑器 Data browsing and editing - + 流量和编辑数据 Number of data rows per page: - + 每页的行数: <p>When the data is read into grid view columns width is automatically adjusted. This value limits the initial width for the adjustment, but user can still resize the column manually over this limit.</p> - + <p>在以列表方式显示数据时,列宽度会自动调整。该值控制初始列宽度,之后您可以手动调整列宽度,不受此限制。</p> Limit initial data column width to (in pixels): - + 限制宽度(单位:像素): Data types - + 数据类型 Available editors: - + 可用的编辑器: Editors selected for this data type: - + 已选的该数据类型编辑器: Schema editing - + 架构编辑 Number of DDL changes kept in history. - + 数据库定义(DDL)的更改历史记录数量。 DDL history size: - + 数据库定义(DDL)历史大小: Don't show DDL preview dialog when commiting schema changes - + 当提交schema变动时不显示数据库定义(DDL)预览对话框 SQL queries - + SQL查询 Number of queries kept in the history. - + 查询历史记录数量。 History size: - + 历史大小: <p>If there is more than one query in the SQL editor window, then (if this option is enabled) only a single query will be executed - the one under the keyboard insertion cursor. Otherwise all queries will be executed. You can always limit queries to be executed by selecting those queries before calling to execute.</p> - + <p>如果SQL编辑器中有多个语句,如果启用该选项,只执行光标下的语句;反之则执行全部语句。另外您可以选择需要执行的语句来执行</p> Execute only the query under the cursor - + 只执行光标下的语句 Updates - + 更新 Automatically check for updates at startup - + 在启动时自己检查更新 Session - + 会话 Restore last session (active MDI windows) after startup - + 启动后恢复上一次会话。 @@ -1052,38 +1066,38 @@ but it's okay to use it. Key combination - + 按键编定 Language - + 语言 Changing language requires application restart to take effect. - + 更改语言后,重启程序生效。 Database list - + 数据库列表 If switched off, then columns will be sorted in the order they are typed in CREATE TABLE statement. - + 如果关闭,将会以 CREATE TABLE 中的顺序对列进行排序。 Sort table columns alphabetically - + 按字母对列排序 Expand tables node when connected to a database - + 当连接到数据库时,展开数据库节点。 @@ -1178,67 +1192,67 @@ but it's okay to use it. Preview - + 预览 Enabled - + 已启用 Disabled - + 已禁用 Active formatter plugin - + 启用格式化插件 SQL editor font - + SQL编辑器字体 Database list font - + 数据库字体 Database list additional label font - + 数据库额外标签字体 Data view font - + 数据浏览字体 Status field font - + 状态栏字体 SQL editor colors - + SQL编辑器颜色 Current line background - + 当前行的背景色 <p>SQL strings are enclosed with single quote characters.</p> - + <p>单引号内的SQL字符串</p> String foreground - + 字符串颜色 @@ -1263,32 +1277,32 @@ but it's okay to use it. BLOB value foreground - + BLOB值的颜色 Regular foreground - + 背景色 Line numbers area background - + 行号的背景色 Keyword foreground - + 关键字的颜色 Number foreground - + 数字颜色 Comment foreground - + 注释颜色 @@ -1328,17 +1342,17 @@ but it's okay to use it. NULL value foreground - + NULL值的颜色 Deleted row background - + 已删除行的背景色 Database list colors - + 数据库列表颜色 @@ -1358,47 +1372,47 @@ but it's okay to use it. Information message foreground - + 信息颜色 Warning message foreground - + 警告信息颜色 Error message foreground - + 错误信息颜色 Description: plugin details - + 描述: Category: plugin details - + 分类: Version: plugin details - + 版本: Author: plugin details - + 作者: Internal name: plugin details - + 内部名字: @@ -1415,7 +1429,7 @@ but it's okay to use it. Plugin details - + 插件详情 @@ -1431,27 +1445,27 @@ but it's okay to use it. Details - + 详情 No plugins in this category. - + 该分类下没有插件。 Add new data type - + 添加新的数据类型 Rename selected data type - + 重命名选择的数据类型 Delete selected data type - + 删除已选数据类型 @@ -1493,7 +1507,7 @@ but it's okay to use it. New constraint constraint dialog - + 新约束 @@ -1505,7 +1519,7 @@ but it's okay to use it. Edit constraint dialog window - + 编辑约束 @@ -1529,31 +1543,31 @@ but it's okay to use it. Unique table constraints - + 唯一 Not NULL table constraints - + 非空 Check table constraints - + 条件 Collate table constraints - + 排序规则 Default table constraints - + 默认 @@ -1562,7 +1576,7 @@ but it's okay to use it. Table table constraints - + @@ -1580,19 +1594,19 @@ but it's okay to use it. Type table constraints - + 类型 Details table constraints - + 详情 Name table constraints - + 名称 @@ -1818,91 +1832,115 @@ Browsing other pages will be possible after the row counting is done. Database + 数据库 + + + + Database type - + Database driver - - Name + + Generate automatically - - Type + + Options + 选项 + + + + Permanent (keep it in configuration) - - Browse for database file on local computer + + Test connection - - File + Name + 名称 + + + Type + 类型 + + + + Create new database file - - Generate name basing on file path + + + File + 文件 + + + + Name (on the list) - - Permanent + + Generate name basing on file path - + <p>Enable this if you want the database to be stored in configuration file and restored every time SQLiteStudio is started.</p> aasfd - - Test database connection + + Browse for existing database file on local computer - + Browse - + Enter an unique database name. - + This name is already in use. Please enter unique name. - + Enter a database file path. - + This database is already on the list under name: %1 - + Select a database type. - - The name will be auto-generated + + Auto-generated - + Type the name @@ -1960,7 +1998,7 @@ Browsing other pages will be possible after the row counting is done. Databases - + 数据库 @@ -1970,17 +2008,17 @@ Browsing other pages will be possible after the row counting is done. Copy - + 复制 Paste - + 粘贴 Select all - + 全选 @@ -2025,7 +2063,7 @@ Browsing other pages will be possible after the row counting is done. Import - + 导入 @@ -2171,7 +2209,7 @@ Browsing other pages will be possible after the row counting is done. Database - + 数据库 @@ -2318,123 +2356,123 @@ All objects from this group will be moved to parent group. DbTreeModel - + Database: %1 dbtree tooltip - + 数据库:%1 - + Version: dbtree tooltip - + 版本: - + File size: dbtree tooltip - + Encoding: dbtree tooltip - + Error details: dbtree tooltip - + Table : %1 dbtree tooltip - + Columns (%1): dbtree tooltip - + Indexes (%1): dbtree tooltip - + Triggers (%1): dbtree tooltip - + Copy - + 复制 - + Move - + Include data - + Include indexes - + Include triggers - + Abort - + 中止 - + Referenced tables - + Do you want to include following referenced tables as well: %1 - + Name conflict - + Following object already exists in the target database. Please enter new, unique name, or press '%1' to abort the operation: - + SQL statements conversion - + Following error occurred while converting SQL statements to the target SQLite version: - + Would you like to ignore those errors and proceed? @@ -2477,7 +2515,7 @@ Please enter new, unique name, or press '%1' to abort the operation: SQLiteStudio Debug Console - + SQLiteStudio 调试终端 @@ -2639,47 +2677,47 @@ Please enter new, unique name, or press '%1' to abort the operation: Export - + 导出 What do you want to export? - + 您想导出什么? A database - + 数据库 A single table - + 一张表 Query results - + 查询结果 Table to export - + 要导出的表 Database - + 数据库 Table - + Options - + 选项 @@ -2689,17 +2727,17 @@ Please enter new, unique name, or press '%1' to abort the operation: Export table data - + 导出表里的数据 Export table indexes - + 导出表的索引 Export table triggers - + 导出表的触发器 @@ -2719,18 +2757,18 @@ Please enter new, unique name, or press '%1' to abort the operation: Select all - + 全选 Deselect all - + 全不选 Database: - + 数据库: @@ -2745,102 +2783,102 @@ Please enter new, unique name, or press '%1' to abort the operation: Export format and options - + 导出格式和选项 Export format - + 导出格式 Output - + 输出 Exported file path - + 导出文件路径 Clipboard - + 剪贴板 File - + 文件 Exported text encoding: - + 导出编码: Export format options - + 导出格式选项 Cancel - + 取消 - - - + + + Select database to export. - + 选择要导出的数据库。 - + Select table to export. - + 选择要导出的表。 - + Enter valid query to export. - + Select at least one object to export. - + You must provide a file name to export to. - + Path you provided is an existing directory. You cannot overwrite it. - + The directory '%1' does not exist. - + The file '%1' exists and will be overwritten. - + All files (*) - + 所有文件 (*) - + Pick file to export to - + Internal error during export. This is a bug. Please report it. @@ -2851,7 +2889,7 @@ Please enter new, unique name, or press '%1' to abort the operation: Choose font font configuration - + 字体选择 @@ -2859,7 +2897,7 @@ Please enter new, unique name, or press '%1' to abort the operation: Active SQL formatter plugin - + 激活SQL语句格式化插件 @@ -2928,7 +2966,7 @@ Please enter new, unique name, or press '%1' to abort the operation: Implementation language: - + 实现语言: @@ -2948,17 +2986,17 @@ Please enter new, unique name, or press '%1' to abort the operation: Databases - + 数据库 Register in all databases - + 在所有数据库中注册 Register in following databases: - + 在下列数据库中注册: @@ -3049,7 +3087,7 @@ Please enter new, unique name, or press '%1' to abort the operation: Pick the implementation language. - + 选择实现语言。 @@ -3059,7 +3097,7 @@ Please enter new, unique name, or press '%1' to abort the operation: Enter a non-empty implementation code. - + 输入非空实现代码。 @@ -3088,12 +3126,12 @@ Please enter new, unique name, or press '%1' to abort the operation: Table - + Database - + 数据库 @@ -3108,60 +3146,70 @@ Please enter new, unique name, or press '%1' to abort the operation: Options - + 选项 - + Input file: - + Text encoding: + + + <p>If enabled, any constraint violation, or invalid data format (wrong column count), or any other problem encountered during import will be ignored and the importing will be continued.</p> + + + Ignore errors + + + + Data source options Cancel - + 取消 - + If you type table name that doesn't exist, it will be created. - + Enter the table name - + Select import plugin. - + You must provide a file to import from. - + The file '%1' does not exist. - + Path you provided is a directory. A regular file is required. - + Pick file to import from @@ -3172,7 +3220,7 @@ Please enter new, unique name, or press '%1' to abort the operation: Index - + 索引 @@ -3182,7 +3230,7 @@ Please enter new, unique name, or press '%1' to abort the operation: Index name: - + 索引名: @@ -3192,12 +3240,12 @@ Please enter new, unique name, or press '%1' to abort the operation: Unique index - + 唯一索引 Column - + 字段 @@ -3275,12 +3323,12 @@ Please enter new, unique name, or press '%1' to abort the operation: Language - + 语言 Please choose language: - + 请选择一门语言: @@ -3298,32 +3346,32 @@ Please enter new, unique name, or press '%1' to abort the operation: Tools - + 工具 Window list - + 窗口列表 View toolbar - + 查看工具栏 Configuration widgets - + 配置部件 Syntax highlighting engines - + 语法高亮引擎 Data editors - + 数据编辑器 @@ -3343,17 +3391,17 @@ Please enter new, unique name, or press '%1' to abort the operation: Open SQL editor - + 打开SQL编辑器 Open DDL history - + 打开数据库定义(DDL)历史 Open SQL functions editor - + 打开SQL函数编辑器 @@ -3363,167 +3411,167 @@ Please enter new, unique name, or press '%1' to abort the operation: Import - + 导入 Export - + 导出 Open configuration dialog - + 打开配置对话框 Tile windows - + 平铺窗口 Tile windows horizontally - + 水平排列窗口 Tile windows vertically - + 垂直排列窗口 Cascade windows - + 层叠窗口 Next window - + 下一个窗口 Previous window - + 上一个窗口 Hide status field - + 隐藏状态栏 Close selected window - + 关闭当前窗口 Close all windows but selected - + 关闭其它窗口 Close all windows - + 关闭全部窗口 Restore recently closed window - + 恢复最近关闭的窗口 Rename selected window - + 重命名当前窗口 Open Debug Console - + 打开调试终端 Report a bug - + 提交Bug Propose a new feature - + 提交新功能建议 About - + 关于 Licenses - + 许可 Open home page - + 访问主页 Open forum page - + 访问论坛 User Manual - + 用户手册 SQLite documentation - + SQLite文档 Report history - + 报告历史 Check for updates - + 检查更新 Database menubar - + 数据库 Structure menubar - + 结构 View menubar - + 查看 Window list menubar view menu - + 窗口列表 Tools menubar - + 工具 Help - + 帮助 @@ -3532,7 +3580,7 @@ Please enter new, unique name, or press '%1' to abort the operation: - + Cannot export, because no export plugin is loaded. @@ -3542,37 +3590,37 @@ Please enter new, unique name, or press '%1' to abort the operation: - + Rename window - + 重命名窗口 - + Enter new name for the window: - + 窗口的新名称: - + New updates are available. <a href="%1">Click here for details</a>. - + 有新更新 <a href="%1">点此查看更新详情</a>. - + You're running the most recent version. No updates are available. - + 您使用的是最新版,不需要更新。 - + Database passed in command line parameters (%1) was already on the list under name: %2 - + Database passed in command line parameters (%1) has been temporarily added to the list under name: %2 - + Could not add database %1 to list. @@ -3580,19 +3628,19 @@ Please enter new, unique name, or press '%1' to abort the operation: MdiWindow - + Uncommited changes - + 未提交的更改 - + Close anyway - + 仍然关闭 - + Don't close - + 不关闭 @@ -3601,7 +3649,7 @@ Please enter new, unique name, or press '%1' to abort the operation: Null value multieditor - + Null 值 @@ -3617,13 +3665,13 @@ Please enter new, unique name, or press '%1' to abort the operation: Deleted multieditor - + 已删除 Read only multieditor - + 只读 @@ -3631,7 +3679,7 @@ Please enter new, unique name, or press '%1' to abort the operation: Boolean - + 布尔 @@ -3639,7 +3687,7 @@ Please enter new, unique name, or press '%1' to abort the operation: Date - + 日期 @@ -3647,7 +3695,7 @@ Please enter new, unique name, or press '%1' to abort the operation: Date & time - + 日期和时间 @@ -3655,7 +3703,7 @@ Please enter new, unique name, or press '%1' to abort the operation: Hex - + 十六进制 @@ -3664,7 +3712,7 @@ Please enter new, unique name, or press '%1' to abort the operation: Number numeric multi editor tab name - + 数值 @@ -3682,32 +3730,32 @@ Please enter new, unique name, or press '%1' to abort the operation: Cut - + 剪切 Copy - + 复制 Paste - + 粘贴 Delete - + 删除 Undo - + 撤销 Redo - + 恢复 @@ -3715,7 +3763,7 @@ Please enter new, unique name, or press '%1' to abort the operation: Time - + 时间 @@ -3723,53 +3771,53 @@ Please enter new, unique name, or press '%1' to abort the operation: New constraint - + 新约束 Primary Key new constraint dialog - + 主键 Foreign Key new constraint dialog - + 外键 Unique new constraint dialog - + 唯一 Check new constraint dialog - + 条件 Not NULL new constraint dialog - + 非空 Collate new constraint dialog - + 排序规则 Default new constraint dialog - + 默认 @@ -3777,52 +3825,52 @@ Please enter new, unique name, or press '%1' to abort the operation: SQLiteStudio updates - + SQLiteStudio 更新 New updates are available! - + 有新更新! Component - + 组件 Current version - + 当年版本 Update version - + 可更新版本 Check for updates on startup - + 在启动时检查更新 Update to new version! - + 更新到新版本! The update will be automatically downloaded and installed. This will also restart application at the end. - + 本次更新将会自动下载和安装。在更新后会重启程序。 Not now. - + 现在不更新。 Don't install the update and close this window. - + 不安装更新并关闭本窗口。 @@ -3835,7 +3883,7 @@ Please enter new, unique name, or press '%1' to abort the operation: Configuring <b>%1</b> for column <b>%2</b> - + 给字段 <b>%2</b> 配置 <b>%1</b> @@ -3848,17 +3896,17 @@ Please enter new, unique name, or press '%1' to abort the operation: Database - + 数据库 Table - + Columns - + 字段 @@ -3874,7 +3922,7 @@ Please enter new, unique name, or press '%1' to abort the operation: Configure - + 配置 @@ -3894,74 +3942,74 @@ Please enter new, unique name, or press '%1' to abort the operation: You have to select at least one column. - + 您至少得选择一个字段。 QObject - + Cannot edit columns that are result of compound %1 statements (one that includes %2, %3 or %4 keywords). - + The query execution mechanism had problems with extracting ROWID's properly. This might be a bug in the application. You may want to report this. - + Requested column is a result of SQL expression, instead of a simple column selection. Such columns cannot be edited. - + Requested column belongs to restricted SQLite table. Those tables cannot be edited directly. - + Cannot edit results of query other than %1. - + Cannot edit columns that are result of aggregated %1 statements. - + Cannot edit columns that are result of %1 statement. - + Cannot edit columns that are result of common table expression statement (%1). - - - - + + + + on conflict: %1 data view tooltip - + references table %1, column %2 data view tooltip - + condition: %1 data view tooltip - + collation name: %1 data view tooltip @@ -4049,7 +4097,7 @@ Please enter new, unique name, or press '%1' to abort the operation: Database list - + 数据库列表 @@ -4116,7 +4164,7 @@ Please enter new, unique name, or press '%1' to abort the operation: Columns - + 字段 @@ -4171,17 +4219,17 @@ Please enter new, unique name, or press '%1' to abort the operation: Open SQL editor - + 打开SQL编辑器 Previous window - + 上一个窗口 Next window - + 下一个窗口 @@ -4191,12 +4239,12 @@ Please enter new, unique name, or press '%1' to abort the operation: Open configuration dialog - + 打开配置对话框 Open Debug Console - + 打开调试终端 @@ -4225,13 +4273,13 @@ Please enter new, unique name, or press '%1' to abort the operation: Undo - + 撤销 Redo - + 恢复 @@ -4261,12 +4309,12 @@ Please enter new, unique name, or press '%1' to abort the operation: Find next - + 查找下一个 Find previous - + 查找上一个 @@ -4319,7 +4367,8 @@ Please enter new, unique name, or press '%1' to abort the operation: - + + Database file @@ -4331,7 +4380,7 @@ Please enter new, unique name, or press '%1' to abort the operation: Delete selected entry - + 删除选中项 @@ -4406,7 +4455,7 @@ Please enter new, unique name, or press '%1' to abort the operation: Export table data - + 导出表里的数据 @@ -4499,7 +4548,7 @@ Please enter new, unique name, or press '%1' to abort the operation: Uncommited changes - + 未提交的更改 @@ -4555,7 +4604,7 @@ find next Find - + 查找 @@ -4569,7 +4618,7 @@ find next Column - + 字段 @@ -4599,85 +4648,85 @@ find next Cut sql editor - + 剪切 Copy sql editor - + 复制 Paste sql editor - + 粘贴 Delete sql editor - + 删除 Select all sql editor - + 全选 Undo sql editor - + 撤销 Redo sql editor - + 恢复 Complete sql editor - + 完成 Format SQL sql editor - + 格式化SQL Save SQL to file sql editor - + 保存SQL到文件 Load SQL from file sql editor - + 从文件加载SQL Delete line sql editor - + 删除行 Move block down sql editor - + 整块下移 Move block up sql editor - + 整块上移 @@ -4695,25 +4744,25 @@ find next Find sql editor - + 查找 Find next sql editor - + 查找下一个 Find previous sql editor - + 查找上一个 Replace sql editor - + 替换 @@ -4728,7 +4777,7 @@ find next Save to file - + 保存到文件 @@ -4738,12 +4787,12 @@ find next SQL scripts (*.sql);;All files (*) - + SQL文件(*.sql);;所有文件(*) Open file - + 打开文件 @@ -4753,7 +4802,7 @@ find next Reached the end of document. Hit the find again to restart the search. - + 已搜索到文档底部。点击查找从头程序开始搜索。 @@ -4768,7 +4817,7 @@ find next Data type: data view - + 数据类型: @@ -4810,69 +4859,69 @@ find next SqlQueryModel - - + + Only one query can be executed simultaneously. - + Uncommited data - + There are uncommited data changes. Do you want to proceed anyway? All uncommited changes will be lost. - + Cannot commit the data for a cell that refers to the already closed database. - + Could not begin transaction on the database. Details: %1 - + An error occurred while commiting the transaction: %1 - + An error occurred while rolling back the transaction: %1 - + Tried to commit a cell which is not editable (yet modified and waiting for commit)! This is a bug. Please report it. - + An error occurred while commiting the data: %1 - - + + Error while executing SQL query on database '%1': %2 - + Error while loading query results: %1 - + Insert multiple rows - + Number of rows to insert: @@ -4880,87 +4929,92 @@ find next SqlQueryView - + Copy - + 复制 - + Copy as... - + Paste - + 粘贴 - + Paste as... - + Set NULL values - + Erase values - + Edit value in editor - + Commit - + Rollback - + Commit selected cells - + Rollback selected cells - + Define columns to sort by - + Remove custom sorting - + Insert row - + Insert multiple rows - + Delete selected row - + + No items selected to paste clipboard contents to. + + + + Edit value @@ -4983,17 +5037,17 @@ find next Status - + 状态 Copy - + 复制 Clear - + 清除 @@ -5002,19 +5056,19 @@ find next Type table constraints - + 类型 Details table constraints - + 详情 Name table constraints - + 名称 @@ -5033,7 +5087,7 @@ but it's okay to use them anyway. Columns - + 字段 @@ -5063,7 +5117,7 @@ but it's okay to use them anyway. Constraint name - + 约束名称 @@ -5097,12 +5151,12 @@ but it's okay to use them anyway. Columns - + 字段 Column - + 字段 @@ -5132,7 +5186,7 @@ but it's okay to use them anyway. Constraint name - + 约束名称 @@ -5143,7 +5197,7 @@ but it's okay to use them anyway. Collate table constraints - + 排序规则 @@ -5168,7 +5222,7 @@ but it's okay to use them anyway. Name table structure columns - + 名称 @@ -5188,7 +5242,7 @@ but it's okay to use them anyway. Structure - + 结构 @@ -5203,7 +5257,7 @@ but it's okay to use them anyway. Constraints - + 约束 @@ -5508,7 +5562,7 @@ Are you sure you want to create a table with blank name? Delete constraint table window - + 删除约束 @@ -5523,7 +5577,7 @@ Are you sure you want to create a table with blank name? Uncommited changes - + 未提交的更改 @@ -5545,19 +5599,19 @@ Do you want to commit the structure, or do you want to go back to the structure Name table window indexes - + 名称 Unique table window indexes - + 唯一 Columns table window indexes - + 字段 @@ -5566,41 +5620,41 @@ Do you want to commit the structure, or do you want to go back to the structure - + Name table window triggers - + 名称 - + Event table window triggers - + Condition table window triggers - + Details table window triggers - + 详情 - + Table window "%1" has uncommited structure modifications and data. - + Table window "%1" has uncommited data. - + Table window "%1" has uncommited structure modifications. @@ -5688,33 +5742,33 @@ Do you want to commit the structure, or do you want to go back to the structure - + On view: - + Could not process trigger %1 correctly. Unable to open a trigger dialog. - + Enter a valid condition. - + Enter a valid trigger code. - + Error trigger dialog - + An error occurred while executing SQL statements: %1 @@ -5856,7 +5910,7 @@ Do you want to commit the structure, or do you want to go back to the structure Uncommited changes - + 未提交的更改 @@ -5884,7 +5938,7 @@ Do you want to commit the structure, or do you want to go back to the structure Name view window triggers - + 名称 @@ -5902,7 +5956,7 @@ Do you want to commit the structure, or do you want to go back to the structure Details table window triggers - + 详情 diff --git a/SQLiteStudio3/guiSQLiteStudio/uiconfig.h b/SQLiteStudio3/guiSQLiteStudio/uiconfig.h index e6cfea2..3372979 100644 --- a/SQLiteStudio3/guiSQLiteStudio/uiconfig.h +++ b/SQLiteStudio3/guiSQLiteStudio/uiconfig.h @@ -81,6 +81,7 @@ CFG_CATEGORIES(Ui, CFG_ENTRY(QString, FileDialogLastPath, QString()) CFG_ENTRY(int, MaxInitialColumnWith, 600) CFG_ENTRY(bool, LanguageAsked, false) + CFG_ENTRY(bool, OpenMaximized, true) ) ) diff --git a/SQLiteStudio3/guiSQLiteStudio/uidebug.cpp b/SQLiteStudio3/guiSQLiteStudio/uidebug.cpp index 9504bda..00aaac4 100644 --- a/SQLiteStudio3/guiSQLiteStudio/uidebug.cpp +++ b/SQLiteStudio3/guiSQLiteStudio/uidebug.cpp @@ -3,12 +3,14 @@ #include "qio.h" #include "debugconsole.h" #include "common/global.h" +#include #include DebugConsole* sqliteStudioUiDebugConsole = nullptr; MsgHandlerThreadProxy* msgHandlerThreadProxy = nullptr; bool UI_DEBUG_ENABLED = false; bool UI_DEBUG_CONSOLE = true; +QString UI_DEBUG_FILE; void uiMessageHandler(QtMsgType type, const QMessageLogContext &context, const QString &msg) { @@ -39,18 +41,22 @@ void uiMessageHandler(QtMsgType type, const QMessageLogContext &context, const Q } } -void setUiDebug(bool enabled, bool useUiConsole) +void setUiDebug(bool enabled, bool useUiConsole, const QString& file) { UI_DEBUG_ENABLED = enabled; - UI_DEBUG_CONSOLE = useUiConsole; + UI_DEBUG_CONSOLE = useUiConsole && file.isEmpty(); + UI_DEBUG_FILE = file; safe_delete(msgHandlerThreadProxy); safe_delete(sqliteStudioUiDebugConsole); if (enabled) { - if (useUiConsole) + if (UI_DEBUG_CONSOLE) sqliteStudioUiDebugConsole = new DebugConsole(); - msgHandlerThreadProxy = new MsgHandlerThreadProxy(); + if (file.isEmpty()) + msgHandlerThreadProxy = new MsgHandlerThreadProxy(); + else + msgHandlerThreadProxy = new MsgHandlerThreadProxy(file); } } @@ -72,6 +78,27 @@ bool isDebugConsoleEnabled() MsgHandlerThreadProxy::MsgHandlerThreadProxy(QObject *parent) : QObject(parent) +{ + init(); +} + +MsgHandlerThreadProxy::MsgHandlerThreadProxy(const QString &file, QObject *parent) : + QObject(parent) +{ + initFile(file); + init(); +} + +MsgHandlerThreadProxy::~MsgHandlerThreadProxy() +{ + if (outFile) + { + outFile->close(); + safe_delete(outFile); + } +} + +void MsgHandlerThreadProxy::init() { if (sqliteStudioUiDebugConsole) { @@ -80,6 +107,13 @@ MsgHandlerThreadProxy::MsgHandlerThreadProxy(QObject *parent) : connect(this, SIGNAL(criticalRequested(QString)), sqliteStudioUiDebugConsole, SLOT(critical(QString))); connect(this, SIGNAL(fatalRequested(QString)), sqliteStudioUiDebugConsole, SLOT(fatal(QString))); } + else if (outFile) + { + connect(this, SIGNAL(debugRequested(QString)), this, SLOT(printToFile(QString))); + connect(this, SIGNAL(warnRequested(QString)), this, SLOT(printToFile(QString))); + connect(this, SIGNAL(criticalRequested(QString)), this, SLOT(printToFile(QString))); + connect(this, SIGNAL(fatalRequested(QString)), this, SLOT(printToFile(QString))); + } else { connect(this, SIGNAL(debugRequested(QString)), this, SLOT(print(QString))); @@ -89,6 +123,15 @@ MsgHandlerThreadProxy::MsgHandlerThreadProxy(QObject *parent) : } } +void MsgHandlerThreadProxy::initFile(const QString &fileName) +{ + outFile = new QFile(fileName); + if (outFile->open(QIODevice::WriteOnly)) + outFileStream.setDevice(outFile); + else + safe_delete(outFile); +} + void MsgHandlerThreadProxy::debug(const QString &msg) { emit debugRequested(msg); @@ -114,3 +157,9 @@ void MsgHandlerThreadProxy::print(const QString& txt) qOut << txt << "\n"; qOut.flush(); } + +void MsgHandlerThreadProxy::printToFile(const QString &txt) +{ + outFileStream << txt << "\n"; + outFileStream.flush(); +} diff --git a/SQLiteStudio3/guiSQLiteStudio/uidebug.h b/SQLiteStudio3/guiSQLiteStudio/uidebug.h index d1b04b7..d2a2a51 100644 --- a/SQLiteStudio3/guiSQLiteStudio/uidebug.h +++ b/SQLiteStudio3/guiSQLiteStudio/uidebug.h @@ -3,6 +3,9 @@ #include "guiSQLiteStudio_global.h" #include +#include + +class QFile; class GUI_API_EXPORT MsgHandlerThreadProxy : public QObject { @@ -10,6 +13,15 @@ class GUI_API_EXPORT MsgHandlerThreadProxy : public QObject public: explicit MsgHandlerThreadProxy(QObject* parent = 0); + MsgHandlerThreadProxy(const QString& file, QObject* parent = 0); + ~MsgHandlerThreadProxy(); + + private: + void init(); + void initFile(const QString& fileName); + + QFile* outFile = nullptr; + QTextStream outFileStream; public slots: void debug(const QString& msg); @@ -25,10 +37,11 @@ class GUI_API_EXPORT MsgHandlerThreadProxy : public QObject private slots: void print(const QString& txt); + void printToFile(const QString& txt); }; GUI_API_EXPORT void uiMessageHandler(QtMsgType type, const QMessageLogContext &context, const QString &msg); -GUI_API_EXPORT void setUiDebug(bool enabled, bool useUiConsole = true); +GUI_API_EXPORT void setUiDebug(bool enabled, bool useUiConsole = true, const QString& file = QString()); GUI_API_EXPORT void showUiDebugConsole(); GUI_API_EXPORT bool isDebugEnabled(); GUI_API_EXPORT bool isDebugConsoleEnabled(); diff --git a/SQLiteStudio3/guiSQLiteStudio/uiutils.cpp b/SQLiteStudio3/guiSQLiteStudio/uiutils.cpp index 182cdb2..72dde94 100644 --- a/SQLiteStudio3/guiSQLiteStudio/uiutils.cpp +++ b/SQLiteStudio3/guiSQLiteStudio/uiutils.cpp @@ -22,7 +22,7 @@ const QStringList pageSizes = { const QStringList pageSizesWithDimensions; -QString getDbPath(const QString &startWith) +QString getDbPath(bool newFileMode, const QString &startWith) { QString dir = startWith; if (dir.isNull()) @@ -35,8 +35,10 @@ QString getDbPath(const QString &startWith) filters += QObject::tr("All files")+" (*)"; QString filter = filters.join(";;"); - QString path = QFileDialog::getSaveFileName(0, QObject::tr("Database file"), dir, filter, &filters[0], QFileDialog::DontConfirmOverwrite); - return path; + if (newFileMode) + return QFileDialog::getSaveFileName(0, QObject::tr("Database file"), dir, filter, &filters[0], QFileDialog::DontConfirmOverwrite); + else + return QFileDialog::getOpenFileName(0, QObject::tr("Database file"), dir, filter, &filters[0]); } void setValidState(QWidget *widget, bool valid, const QString& message) diff --git a/SQLiteStudio3/guiSQLiteStudio/uiutils.h b/SQLiteStudio3/guiSQLiteStudio/uiutils.h index b1c78f3..01652b7 100644 --- a/SQLiteStudio3/guiSQLiteStudio/uiutils.h +++ b/SQLiteStudio3/guiSQLiteStudio/uiutils.h @@ -7,7 +7,7 @@ class QWidget; -GUI_API_EXPORT QString getDbPath(const QString& startWith = QString::null); +GUI_API_EXPORT QString getDbPath(bool newFileMode, const QString& startWith = QString::null); GUI_API_EXPORT void setValidState(QWidget* widget, bool valid, const QString& message = QString()); GUI_API_EXPORT void setValidStateWihtTooltip(QWidget* widget, const QString& tooltip, bool valid, const QString& message = QString()); GUI_API_EXPORT void setValidStateWarning(QWidget* widget, const QString& warning); diff --git a/SQLiteStudio3/guiSQLiteStudio/windows/editorwindow.cpp b/SQLiteStudio3/guiSQLiteStudio/windows/editorwindow.cpp index 590a2fd..c494702 100644 --- a/SQLiteStudio3/guiSQLiteStudio/windows/editorwindow.cpp +++ b/SQLiteStudio3/guiSQLiteStudio/windows/editorwindow.cpp @@ -104,7 +104,7 @@ void EditorWindow::init() connect(resultsModel, SIGNAL(executionSuccessful()), this, SLOT(executionSuccessful())); connect(resultsModel, SIGNAL(executionFailed(QString)), this, SLOT(executionFailed(QString))); - connect(resultsModel, SIGNAL(totalRowsAndPagesAvailable()), this, SLOT(totalRowsAndPagesAvailable())); + connect(resultsModel, SIGNAL(storeExecutionInHistory()), this, SLOT(storeExecutionInHistory())); // SQL history list ui->historyList->setModel(CFG->getSqlHistoryModel()); @@ -520,7 +520,7 @@ void EditorWindow::executionFailed(const QString &errorText) updateState(); } -void EditorWindow::totalRowsAndPagesAvailable() +void EditorWindow::storeExecutionInHistory() { qint64 rowsReturned = resultsModel->getTotalRowsReturned(); qint64 rowsAffected = resultsModel->getTotalRowsAffected(); diff --git a/SQLiteStudio3/guiSQLiteStudio/windows/editorwindow.h b/SQLiteStudio3/guiSQLiteStudio/windows/editorwindow.h index 4666386..d952b1b 100644 --- a/SQLiteStudio3/guiSQLiteStudio/windows/editorwindow.h +++ b/SQLiteStudio3/guiSQLiteStudio/windows/editorwindow.h @@ -134,7 +134,7 @@ class GUI_API_EXPORT EditorWindow : public MdiChild void dbChanged(); void executionSuccessful(); void executionFailed(const QString& errorText); - void totalRowsAndPagesAvailable(); + void storeExecutionInHistory(); void updateResultsDisplayMode(); void prevDb(); void nextDb(); diff --git a/SQLiteStudio3/guiSQLiteStudio/windows/tablewindow.cpp b/SQLiteStudio3/guiSQLiteStudio/windows/tablewindow.cpp index fdbbac2..77a4adc 100644 --- a/SQLiteStudio3/guiSQLiteStudio/windows/tablewindow.cpp +++ b/SQLiteStudio3/guiSQLiteStudio/windows/tablewindow.cpp @@ -1406,6 +1406,7 @@ void TableWindow::updateIndexes() } ui->indexList->resizeColumnsToContents(); + ui->indexList->horizontalHeader()->setSectionResizeMode(2, QHeaderView::Stretch); updateIndexesState(); } @@ -1453,6 +1454,7 @@ void TableWindow::updateTriggers() } ui->triggerList->resizeColumnsToContents(); + ui->triggerList->horizontalHeader()->setSectionResizeMode(3, QHeaderView::Stretch); updateTriggersState(); } diff --git a/SQLiteStudio3/lang.tcl b/SQLiteStudio3/lang.tcl index d9cacf9..00fd151 100755 --- a/SQLiteStudio3/lang.tcl +++ b/SQLiteStudio3/lang.tcl @@ -2,7 +2,7 @@ proc usage {} { puts "$::argv0 (add|remove) " - puts "$::argv0 (update|release)" + puts "$::argv0 (update|release|status)" } lassign $argv op lang @@ -13,6 +13,41 @@ if {$::tcl_platform(platform) == "windows"} { set ERR_NULL "2>/dev/null" } +proc countstrings {data search} { + set l [string length $search] + set count 0 + while {[set i [string first $search $data]]>=0} { + incr count + incr i $l + set data [string range $data $i end] + } + set count +} + +proc scanLangs {} { + set langs [dict create] + foreach f [exec find .. -name "*.ts"] { + set lang [lindex [regexp -inline {[^_]*_(\w+(\w+)?).ts$} $f] 1] + if {[dict exists $langs $lang]} { + set langDict [dict get $langs $lang] + } else { + set langDict [dict create translated 0 untranslated 0] + } + + set fd [open $f r] + set data [read $fd] + close $fd + + set c1 [countstrings $data ""] + set c2 [countstrings $data ""] + dict incr langDict translated $c1 + dict incr langDict untranslated $c2 + dict set langs $lang $langDict + } + + return $langs +} + switch -- $op { "update" - "release" { if {$argc != 1} { @@ -61,6 +96,21 @@ switch -- $op { } } } + "status" { + set langs [scanLangs] + foreach k [dict keys $langs] { + set lang [dict get $langs $k] + set tr [dict get $lang translated] + set untr [dict get $lang untranslated] + set all [expr {$tr + $untr}] + if {$all == 0} continue + + set perc [expr {round(double($tr)/$all * 1000)/10.0}] + + set lang [string tolower $lang] + puts "$k - ${perc}% ($tr / $all)" + } + } "add" - "remove" { if {$argc != 2} { usage diff --git a/SQLiteStudio3/sqlitestudio/main.cpp b/SQLiteStudio3/sqlitestudio/main.cpp index f2284a6..4ec98cc 100644 --- a/SQLiteStudio3/sqlitestudio/main.cpp +++ b/SQLiteStudio3/sqlitestudio/main.cpp @@ -24,6 +24,7 @@ #include "qio.h" #include "translations.h" #include "dialogs/languagedialog.h" +#include "dialogs/triggerdialog.h" #include "services/pluginmanager.h" #include #include @@ -45,12 +46,14 @@ QString uiHandleCmdLineArgs() QCommandLineOption debugOption({"d", "debug"}, QObject::tr("Enables debug messages in console (accessible with F12).")); QCommandLineOption debugStdOutOption("debug-stdout", QObject::tr("Redirects debug messages into standard output (forces debug mode).")); + QCommandLineOption debugFileOption("debug-file", QObject::tr("Redirects debug messages into given file (forces debug mode)."), QObject::tr("log file")); QCommandLineOption lemonDebugOption("debug-lemon", QObject::tr("Enables Lemon parser debug messages for SQL code assistant.")); QCommandLineOption sqlDebugOption("debug-sql", QObject::tr("Enables debugging of every single SQL query being sent to any database.")); QCommandLineOption sqlDebugDbNameOption("debug-sql-db", QObject::tr("Limits SQL query messages to only the given ."), QObject::tr("database")); QCommandLineOption listPluginsOption("list-plugins", QObject::tr("Lists plugins installed in the SQLiteStudio and quits.")); parser.addOption(debugOption); parser.addOption(debugStdOutOption); + parser.addOption(debugFileOption); parser.addOption(lemonDebugOption); parser.addOption(sqlDebugOption); parser.addOption(sqlDebugDbNameOption); @@ -60,7 +63,8 @@ QString uiHandleCmdLineArgs() parser.process(qApp->arguments()); - setUiDebug(parser.isSet(debugOption) || parser.isSet(debugStdOutOption) || parser.isSet(sqlDebugOption), !parser.isSet(debugStdOutOption)); + bool enableDebug = parser.isSet(debugOption) || parser.isSet(debugStdOutOption) || parser.isSet(sqlDebugOption) || parser.isSet(debugFileOption); + setUiDebug(enableDebug, !parser.isSet(debugStdOutOption), parser.value(debugFileOption)); CompletionHelper::enableLemonDebug = parser.isSet(lemonDebugOption); setSqlLoggingEnabled(parser.isSet(sqlDebugOption)); if (parser.isSet(sqlDebugDbNameOption)) @@ -118,6 +122,7 @@ int main(int argc, char *argv[]) MultiEditorTime::staticInit(); MultiEditorDate::staticInit(); MultiEditorBool::staticInit(); + TriggerDialog::staticInit(); MainWindow::getInstance(); diff --git a/SQLiteStudio3/sqlitestudio/sqlitestudio.qrc b/SQLiteStudio3/sqlitestudio/sqlitestudio.qrc index de49c48..1abc1e0 100644 --- a/SQLiteStudio3/sqlitestudio/sqlitestudio.qrc +++ b/SQLiteStudio3/sqlitestudio/sqlitestudio.qrc @@ -3,5 +3,7 @@ translations/sqlitestudio_pl.qm translations/sqlitestudio_ru.qm translations/sqlitestudio_fr.qm + translations/sqlitestudio_sk.qm + translations/sqlitestudio_zh_CN.qm diff --git a/SQLiteStudio3/sqlitestudio/translations/sqlitestudio_de.ts b/SQLiteStudio3/sqlitestudio/translations/sqlitestudio_de.ts index 65c406f..1d96a62 100644 --- a/SQLiteStudio3/sqlitestudio/translations/sqlitestudio_de.ts +++ b/SQLiteStudio3/sqlitestudio/translations/sqlitestudio_de.ts @@ -1,61 +1,71 @@ - + QObject - + GUI interface to SQLiteStudio, a SQLite manager. - + Enables debug messages in console (accessible with F12). - + Redirects debug messages into standard output (forces debug mode). - - Enables Lemon parser debug messages for SQL code assistant. + + Redirects debug messages into given file (forces debug mode). - Enables debugging of every single SQL query being sent to any database. + log file + Enables Lemon parser debug messages for SQL code assistant. + + + + + Enables debugging of every single SQL query being sent to any database. + + + + Limits SQL query messages to only the given <database>. - + database - + Lists plugins installed in the SQLiteStudio and quits. - + file - + Database file to open - - + + Error diff --git a/SQLiteStudio3/sqlitestudio/translations/sqlitestudio_es.ts b/SQLiteStudio3/sqlitestudio/translations/sqlitestudio_es.ts index 2e4f578..34ff1b5 100644 --- a/SQLiteStudio3/sqlitestudio/translations/sqlitestudio_es.ts +++ b/SQLiteStudio3/sqlitestudio/translations/sqlitestudio_es.ts @@ -1,61 +1,71 @@ - + QObject - + GUI interface to SQLiteStudio, a SQLite manager. - + Enables debug messages in console (accessible with F12). - + Redirects debug messages into standard output (forces debug mode). - - Enables Lemon parser debug messages for SQL code assistant. + + Redirects debug messages into given file (forces debug mode). - Enables debugging of every single SQL query being sent to any database. + log file + Enables Lemon parser debug messages for SQL code assistant. + + + + + Enables debugging of every single SQL query being sent to any database. + + + + Limits SQL query messages to only the given <database>. - + database - + Lists plugins installed in the SQLiteStudio and quits. - + file - + Database file to open - - + + Error diff --git a/SQLiteStudio3/sqlitestudio/translations/sqlitestudio_fr.ts b/SQLiteStudio3/sqlitestudio/translations/sqlitestudio_fr.ts index 8ff363f..3a5ef09 100644 --- a/SQLiteStudio3/sqlitestudio/translations/sqlitestudio_fr.ts +++ b/SQLiteStudio3/sqlitestudio/translations/sqlitestudio_fr.ts @@ -1,62 +1,72 @@ - + QObject - + GUI interface to SQLiteStudio, a SQLite manager. Interface GUI de SQLiteStudio un outil pour SQLite - + Enables debug messages in console (accessible with F12). Messages de déboguage avec la console(accessible avec F12). - + Redirects debug messages into standard output (forces debug mode). Messages de déboguage redirigés vers sortie standard(mode déboguage forcé). - + + Redirects debug messages into given file (forces debug mode). + + + + + log file + + + + Enables Lemon parser debug messages for SQL code assistant. Message de déboguage avec l'analyseur Lemon pour un assistant code SQL. - + Enables debugging of every single SQL query being sent to any database. Déboguage pour toutes requêtes SQL simple utilisé pour la plupart des bases de données. - + Limits SQL query messages to only the given <database>. Limites des meesages de la requête SQL pour la <database>. - + database Base de données - + Lists plugins installed in the SQLiteStudio and quits. Listes des plugins installés dans SQLiteStudio et quitter. - + file Fichier - + Database file to open Fichier de la base de données à ouvrir - - + + Error Erreur diff --git a/SQLiteStudio3/sqlitestudio/translations/sqlitestudio_pl.qm b/SQLiteStudio3/sqlitestudio/translations/sqlitestudio_pl.qm index 610ec3f..2da6fe3 100644 Binary files a/SQLiteStudio3/sqlitestudio/translations/sqlitestudio_pl.qm and b/SQLiteStudio3/sqlitestudio/translations/sqlitestudio_pl.qm differ diff --git a/SQLiteStudio3/sqlitestudio/translations/sqlitestudio_pl.ts b/SQLiteStudio3/sqlitestudio/translations/sqlitestudio_pl.ts index cc2f9ca..967434a 100644 --- a/SQLiteStudio3/sqlitestudio/translations/sqlitestudio_pl.ts +++ b/SQLiteStudio3/sqlitestudio/translations/sqlitestudio_pl.ts @@ -1,6 +1,6 @@ - + QObject @@ -47,5 +47,13 @@ Lists plugins installed in the SQLiteStudio and quits. Wypisuje listę zainstalowanych w SQLiteStudio wtyczek i wychodzi. + + Redirects debug messages into given file (forces debug mode). + Przekierowuje wiadomości debugujące do danego pliku (wymusza tryb debugujący). + + + log file + plik logów + diff --git a/SQLiteStudio3/sqlitestudio/translations/sqlitestudio_pt_BR.ts b/SQLiteStudio3/sqlitestudio/translations/sqlitestudio_pt_BR.ts index f549b1e..c95e02a 100644 --- a/SQLiteStudio3/sqlitestudio/translations/sqlitestudio_pt_BR.ts +++ b/SQLiteStudio3/sqlitestudio/translations/sqlitestudio_pt_BR.ts @@ -1,61 +1,71 @@ - + QObject - + GUI interface to SQLiteStudio, a SQLite manager. - + Enables debug messages in console (accessible with F12). - + Redirects debug messages into standard output (forces debug mode). - - Enables Lemon parser debug messages for SQL code assistant. + + Redirects debug messages into given file (forces debug mode). - Enables debugging of every single SQL query being sent to any database. + log file + Enables Lemon parser debug messages for SQL code assistant. + + + + + Enables debugging of every single SQL query being sent to any database. + + + + Limits SQL query messages to only the given <database>. - + database - + Lists plugins installed in the SQLiteStudio and quits. - + file - + Database file to open - - + + Error diff --git a/SQLiteStudio3/sqlitestudio/translations/sqlitestudio_ru.qm b/SQLiteStudio3/sqlitestudio/translations/sqlitestudio_ru.qm index c8e1e69..e6a4c31 100644 Binary files a/SQLiteStudio3/sqlitestudio/translations/sqlitestudio_ru.qm and b/SQLiteStudio3/sqlitestudio/translations/sqlitestudio_ru.qm differ diff --git a/SQLiteStudio3/sqlitestudio/translations/sqlitestudio_ru.ts b/SQLiteStudio3/sqlitestudio/translations/sqlitestudio_ru.ts index 3b24e3c..8a9b8ca 100644 --- a/SQLiteStudio3/sqlitestudio/translations/sqlitestudio_ru.ts +++ b/SQLiteStudio3/sqlitestudio/translations/sqlitestudio_ru.ts @@ -4,58 +4,68 @@ QObject - + GUI interface to SQLiteStudio, a SQLite manager. Графический интерфейс для SQLiteStudio, менеджера баз данных SQLite. - + Enables debug messages in console (accessible with F12). Включает вывод отладочных сообщений в консоль (доступную по нажатию F12). - + Redirects debug messages into standard output (forces debug mode). Перенаправляет отладочные сообщения в стандартный поток (принудительный отладочный режим). - + + Redirects debug messages into given file (forces debug mode). + Перенаправляет отладочные сообщения в указанный файл (принудительный отладочный режим). + + + + log file + файл журнала + + + Enables Lemon parser debug messages for SQL code assistant. Включает вывод отладочных сообщений анализатора Lemon для автодополнения SQL кода. - + Enables debugging of every single SQL query being sent to any database. Включает отладку каждого запроса SQL, посылаемого к любой базе данных. - + Limits SQL query messages to only the given <database>. Ограничивает сообщения запросов SQL только для указанной <базы данных>. - + database база данных - + Lists plugins installed in the SQLiteStudio and quits. Выводит список установленных в SQLiteStudio модулей и осуществляет выход. - + file файл - + Database file to open Файл базы данных для открытия - - + + Error Ошибка diff --git a/SQLiteStudio3/sqlitestudio/translations/sqlitestudio_sk.qm b/SQLiteStudio3/sqlitestudio/translations/sqlitestudio_sk.qm index 1776294..526751e 100644 Binary files a/SQLiteStudio3/sqlitestudio/translations/sqlitestudio_sk.qm and b/SQLiteStudio3/sqlitestudio/translations/sqlitestudio_sk.qm differ diff --git a/SQLiteStudio3/sqlitestudio/translations/sqlitestudio_sk.ts b/SQLiteStudio3/sqlitestudio/translations/sqlitestudio_sk.ts index 1b4c3a2..4c82ea1 100644 --- a/SQLiteStudio3/sqlitestudio/translations/sqlitestudio_sk.ts +++ b/SQLiteStudio3/sqlitestudio/translations/sqlitestudio_sk.ts @@ -1,63 +1,73 @@ - + QObject - + GUI interface to SQLiteStudio, a SQLite manager. - + GUI rozhranie pre SQLiteStudio, SQLite manažér. - + Enables debug messages in console (accessible with F12). - + Aktivuje ladiace správy v konzole (dostupné pomocou F12). - + Redirects debug messages into standard output (forces debug mode). + Presmerovať ladiace informácie na štandardný výstup (vynútený ladiaci mód). + + + + Redirects debug messages into given file (forces debug mode). - + + log file + + + + Enables Lemon parser debug messages for SQL code assistant. - + Enables debugging of every single SQL query being sent to any database. - + Limits SQL query messages to only the given <database>. - + database - + databáza - + Lists plugins installed in the SQLiteStudio and quits. - + file - + Súbor - + Database file to open - - + + Error - + Chyba diff --git a/SQLiteStudio3/sqlitestudio/translations/sqlitestudio_zh_CN.ts b/SQLiteStudio3/sqlitestudio/translations/sqlitestudio_zh_CN.ts index e5f6a78..ff9ee04 100644 --- a/SQLiteStudio3/sqlitestudio/translations/sqlitestudio_zh_CN.ts +++ b/SQLiteStudio3/sqlitestudio/translations/sqlitestudio_zh_CN.ts @@ -1,61 +1,71 @@ - + QObject - + GUI interface to SQLiteStudio, a SQLite manager. - + Enables debug messages in console (accessible with F12). - + Redirects debug messages into standard output (forces debug mode). - - Enables Lemon parser debug messages for SQL code assistant. + + Redirects debug messages into given file (forces debug mode). - Enables debugging of every single SQL query being sent to any database. + log file + Enables Lemon parser debug messages for SQL code assistant. + + + + + Enables debugging of every single SQL query being sent to any database. + + + + Limits SQL query messages to only the given <database>. - + database - + Lists plugins installed in the SQLiteStudio and quits. - + file - + Database file to open - - + + Error diff --git a/SQLiteStudio3/sqlitestudiocli/sqlitestudiocli.qrc b/SQLiteStudio3/sqlitestudiocli/sqlitestudiocli.qrc index 7a27dfe..46f8566 100644 --- a/SQLiteStudio3/sqlitestudiocli/sqlitestudiocli.qrc +++ b/SQLiteStudio3/sqlitestudiocli/sqlitestudiocli.qrc @@ -3,5 +3,7 @@ translations/sqlitestudiocli_pl.qm translations/sqlitestudiocli_ru.qm translations/sqlitestudiocli_fr.qm + translations/sqlitestudiocli_sk.qm + translations/sqlitestudiocli_zh_CN.qm diff --git a/SQLiteStudio3/sqlitestudiocli/translations/sqlitestudiocli_de.ts b/SQLiteStudio3/sqlitestudiocli/translations/sqlitestudiocli_de.ts index 887f13b..9dee56c 100644 --- a/SQLiteStudio3/sqlitestudiocli/translations/sqlitestudiocli_de.ts +++ b/SQLiteStudio3/sqlitestudiocli/translations/sqlitestudiocli_de.ts @@ -1,6 +1,6 @@ - + CLI diff --git a/SQLiteStudio3/sqlitestudiocli/translations/sqlitestudiocli_es.ts b/SQLiteStudio3/sqlitestudiocli/translations/sqlitestudiocli_es.ts index bd93869..d446494 100644 --- a/SQLiteStudio3/sqlitestudiocli/translations/sqlitestudiocli_es.ts +++ b/SQLiteStudio3/sqlitestudiocli/translations/sqlitestudiocli_es.ts @@ -1,6 +1,6 @@ - + CLI diff --git a/SQLiteStudio3/sqlitestudiocli/translations/sqlitestudiocli_fr.ts b/SQLiteStudio3/sqlitestudiocli/translations/sqlitestudiocli_fr.ts index 3d10f87..5096d8c 100644 --- a/SQLiteStudio3/sqlitestudiocli/translations/sqlitestudiocli_fr.ts +++ b/SQLiteStudio3/sqlitestudiocli/translations/sqlitestudiocli_fr.ts @@ -1,6 +1,6 @@ - + CLI diff --git a/SQLiteStudio3/sqlitestudiocli/translations/sqlitestudiocli_pl.qm b/SQLiteStudio3/sqlitestudiocli/translations/sqlitestudiocli_pl.qm index b438a02..6af2684 100644 Binary files a/SQLiteStudio3/sqlitestudiocli/translations/sqlitestudiocli_pl.qm and b/SQLiteStudio3/sqlitestudiocli/translations/sqlitestudiocli_pl.qm differ diff --git a/SQLiteStudio3/sqlitestudiocli/translations/sqlitestudiocli_pl.ts b/SQLiteStudio3/sqlitestudiocli/translations/sqlitestudiocli_pl.ts index b2ecd33..c7bdf0f 100644 --- a/SQLiteStudio3/sqlitestudiocli/translations/sqlitestudiocli_pl.ts +++ b/SQLiteStudio3/sqlitestudiocli/translations/sqlitestudiocli_pl.ts @@ -1,6 +1,6 @@ - + CLI @@ -25,7 +25,7 @@ Database passed in command line parameters (%1) was already on the list under name: %2 - + Baz danych przekazana w parametrach linii poleceń (%1) była już na liście pod nazwą: %2 diff --git a/SQLiteStudio3/sqlitestudiocli/translations/sqlitestudiocli_pt_BR.ts b/SQLiteStudio3/sqlitestudiocli/translations/sqlitestudiocli_pt_BR.ts index f9c8a82..5b92d37 100644 --- a/SQLiteStudio3/sqlitestudiocli/translations/sqlitestudiocli_pt_BR.ts +++ b/SQLiteStudio3/sqlitestudiocli/translations/sqlitestudiocli_pt_BR.ts @@ -1,6 +1,6 @@ - + CLI diff --git a/SQLiteStudio3/sqlitestudiocli/translations/sqlitestudiocli_ru.qm b/SQLiteStudio3/sqlitestudiocli/translations/sqlitestudiocli_ru.qm index ab88676..2f2ac76 100644 Binary files a/SQLiteStudio3/sqlitestudiocli/translations/sqlitestudiocli_ru.qm and b/SQLiteStudio3/sqlitestudiocli/translations/sqlitestudiocli_ru.qm differ diff --git a/SQLiteStudio3/sqlitestudiocli/translations/sqlitestudiocli_ru.ts b/SQLiteStudio3/sqlitestudiocli/translations/sqlitestudiocli_ru.ts index c63207d..0cbe067 100644 --- a/SQLiteStudio3/sqlitestudiocli/translations/sqlitestudiocli_ru.ts +++ b/SQLiteStudio3/sqlitestudiocli/translations/sqlitestudiocli_ru.ts @@ -1,6 +1,6 @@ - + CLI @@ -21,7 +21,7 @@ Database passed in command line parameters (%1) was already on the list under name: %2 - + База данных, переданная через аргументы командной строки (%1), уже находится в списке под именем %2 diff --git a/SQLiteStudio3/sqlitestudiocli/translations/sqlitestudiocli_sk.ts b/SQLiteStudio3/sqlitestudiocli/translations/sqlitestudiocli_sk.ts index d817c65..df9da22 100644 --- a/SQLiteStudio3/sqlitestudiocli/translations/sqlitestudiocli_sk.ts +++ b/SQLiteStudio3/sqlitestudiocli/translations/sqlitestudiocli_sk.ts @@ -1,6 +1,6 @@ - + CLI diff --git a/SQLiteStudio3/sqlitestudiocli/translations/sqlitestudiocli_zh_CN.ts b/SQLiteStudio3/sqlitestudiocli/translations/sqlitestudiocli_zh_CN.ts index 01469f1..4dd7f0a 100644 --- a/SQLiteStudio3/sqlitestudiocli/translations/sqlitestudiocli_zh_CN.ts +++ b/SQLiteStudio3/sqlitestudiocli/translations/sqlitestudiocli_zh_CN.ts @@ -1,6 +1,6 @@ - + CLI -- cgit v1.2.3