diff -Nru sqlitebrowser-3.10.100ubuntu1/BUILDING.md sqlitebrowser-3.11.1/BUILDING.md --- sqlitebrowser-3.10.100ubuntu1/BUILDING.md 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/BUILDING.md 2019-02-19 23:51:34.000000000 +0000 @@ -55,7 +55,7 @@ ```bash $ sudo apt install build-essential git-core cmake libsqlite3-dev qt5-default qttools5-dev-tools \ - libsqlcipher-dev + libsqlcipher-dev qtbase5-dev libantlr-dev libqt5scintilla2-dev libqcustomplot-dev qttools5-dev $ git clone https://github.com/sqlitebrowser/sqlitebrowser $ cd sqlitebrowser $ mkdir build @@ -88,10 +88,26 @@ This should complete without errors, and `sqlitebrowser` should now be launch-able from the command line. -### MacOS X +### OpenSUSE + +```bash + + +$ zypper in -y build git-core, libQt5Core5, libQt5Core5-32bit, libqt5-qtbase, libqt5-qtbase-devel, libqt5-qttools, libqt5-qttools-devel, build, gcc-c++, gcc, sqlite3-devel, libsqlite3-0, cmake, antlr-devel, sqlcipher-devel +$ git clone https://github.com/sqlitebrowser/sqlitebrowser +$ cd sqlitebrowser +$ mkdir build +$ cd build +$ cmake -Dsqlcipher=1 -Wno-dev -DFORCE_INTERNAL_QSCINTILLA=ON .. +$ make +$ sudo make install +``` + + +### macOS The application can be compiled to a single executable binary file, similar to -other command line utilities. Or it can be compiled to a .app bundle, suitable +other command line utilities, or it can be compiled to an .app bundle, suitable for placing in /Applications. ### Building a single executable binary @@ -144,6 +160,22 @@ (before the 'make' step) +### Building with CMake + +Install Qt and SQLite as instructed in the previous section and clone the repo to a directory (it's `sqlitebrowser` as usual). + +Install CMake: + + $ brew install cmake + +And build with these commands: + + $ cd sqlitebrowser + $ mkdir build # You can easily make a fresh build again by removing this directory + $ cd build + $ cmake -DCMAKE_PREFIX_PATH=/usr/local/opt/qt .. + $ cmake --build . + ### Compiling on Windows with MSVC Complete setup, build, and packaging instructions with MSVC 2013 x64 are online diff -Nru sqlitebrowser-3.10.100ubuntu1/cmake/FindQScintilla.cmake sqlitebrowser-3.11.1/cmake/FindQScintilla.cmake --- sqlitebrowser-3.10.100ubuntu1/cmake/FindQScintilla.cmake 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/cmake/FindQScintilla.cmake 2019-02-19 23:51:34.000000000 +0000 @@ -16,15 +16,15 @@ #============================================================================= # Copyright 2010-2013, Julien Schueller # All rights reserved. -# +# # Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# +# modification, are permitted provided that the following conditions are met: +# # 1. Redistributions of source code must retain the above copyright notice, this -# list of conditions and the following disclaimer. +# list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the above copyright notice, # this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. +# and/or other materials provided with the distribution. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED @@ -38,21 +38,20 @@ # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # The views and conclusions contained in the software and documentation are those -# of the authors and should not be interpreted as representing official policies, +# of the authors and should not be interpreted as representing official policies, # either expressed or implied, of the FreeBSD Project. #============================================================================= -find_path ( QSCINTILLA_INCLUDE_DIR - NAMES qsciscintilla.h - HINTS ${QT_INCLUDE_DIR} - PATH_SUFFIXES Qsci +find_path ( QSCINTILLA_INCLUDE_DIR qsciscintilla.h + HINTS /usr/local/include/Qsci /usr/local/opt/qscintilla2/include/Qsci ) set ( QSCINTILLA_INCLUDE_DIRS ${QSCINTILLA_INCLUDE_DIR} ) # version -set ( _VERSION_FILE ${QSCINTILLA_INCLUDE_DIR}/Qsci/qsciglobal.h ) +set ( _VERSION_FILE ${QSCINTILLA_INCLUDE_DIR}/qsciglobal.h ) + if ( EXISTS ${_VERSION_FILE} ) file ( STRINGS ${_VERSION_FILE} _VERSION_LINE REGEX "define[ ]+QSCINTILLA_VERSION_STR" ) if ( _VERSION_LINE ) @@ -63,9 +62,9 @@ endif () endif () - # check version set ( _QSCINTILLA_VERSION_MATCH TRUE ) + if ( QScintilla_FIND_VERSION AND QSCINTILLA_VERSION_STRING ) if ( QScintilla_FIND_VERSION_EXACT ) if ( NOT QScintilla_FIND_VERSION VERSION_EQUAL QSCINTILLA_VERSION_STRING ) @@ -78,15 +77,13 @@ endif () endif () - find_library ( QSCINTILLA_LIBRARY - NAMES qscintilla qscintilla2 libqscintilla2 - HINTS ${QT_LIBRARY_DIR} + NAMES qscintilla2 qscintilla2_qt5 + HINTS /usr/local/lib /usr/local/opt/qscintilla2/lib ) set ( QSCINTILLA_LIBRARIES ${QSCINTILLA_LIBRARY} ) - # try to guess root dir from include dir if ( QSCINTILLA_INCLUDE_DIR ) string ( REGEX REPLACE "(.*)/include.*" "\\1" QSCINTILLA_ROOT_DIR ${QSCINTILLA_INCLUDE_DIR} ) @@ -95,7 +92,6 @@ string ( REGEX REPLACE "(.*)/lib[/|32|64].*" "\\1" QSCINTILLA_ROOT_DIR ${QSCINTILLA_LIBRARY} ) endif () - # handle the QUIETLY and REQUIRED arguments include ( FindPackageHandleStandardArgs ) if ( CMAKE_VERSION VERSION_LESS 2.8.3 ) diff -Nru sqlitebrowser-3.10.100ubuntu1/CMakeLists.txt sqlitebrowser-3.11.1/CMakeLists.txt --- sqlitebrowser-3.10.100ubuntu1/CMakeLists.txt 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/CMakeLists.txt 2019-02-19 23:51:34.000000000 +0000 @@ -1,49 +1,64 @@ project(sqlitebrowser) -cmake_minimum_required(VERSION 2.8.7) +cmake_minimum_required(VERSION 2.8.12.2) + +# BUILD_VERSION is the current date in YYYYMMDD format. It is only +# used by the nightly version to add the date of the build. +string(TIMESTAMP BUILD_VERSION "%Y%m%d") + +# Choose between building a stable version or nightly (the default), depending +# on whether '-DBUILD_STABLE_VERSION=1' is passed on the command line or not. +option(BUILD_STABLE_VERSION "Don't build the stable version by default" OFF) +if(NOT BUILD_STABLE_VERSION) + add_definitions(-DBUILD_VERSION=${BUILD_VERSION}) +endif() set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake" "${CMAKE_MODULE_PATH}") OPTION(ENABLE_TESTING "Enable the unit tests" OFF) OPTION(FORCE_INTERNAL_ANTLR "Don't use the distribution's Antlr library even if there is one" OFF) OPTION(FORCE_INTERNAL_QSCINTILLA "Don't use the distribution's QScintilla library even if there is one" OFF) +OPTION(ALL_WARNINGS "Enable some useful warning flags" OFF) if(NOT CMAKE_BUILD_TYPE) set(CMAKE_BUILD_TYPE "Release") endif() add_definitions(-std=c++11) +set(CMAKE_CXX_STANDARD 11) +set(CMAKE_CXX_STANDARD_REQUIRED True) + +# Fix behavior of CMAKE_CXX_STANDARD when targeting macOS. +if (POLICY CMP0025) + cmake_policy(SET CMP0025 NEW) +endif () if(WIN32 AND MSVC) - project("DB Browser for SQLite") if(CMAKE_CL_64) # Paths for 64-bit windows builds - set(OPENSSL_PATH "C:/dev/OpenSSL-Win64") - set(QT5_PATH "C:/dev/Qt/5.7/msvc2013_64") - set(VSREDIST "vcredist_x64.exe") + set(OPENSSL_PATH "C:/dev/OpenSSL-Win64" CACHE PATH "OpenSSL Path") + set(QT5_PATH "C:/dev/Qt/5.11.3/msvc2017_64" CACHE PATH "Qt5 Path") # Choose between SQLCipher or SQLite, depending whether # -Dsqlcipher=1 is passed on the command line if(sqlcipher) - set(SQLITE3_PATH "C:/git_repos/SQLCipher-Win64") + set(SQLITE3_PATH "C:/git_repos/SQLCipher-Win64" CACHE PATH "SQLCipher Path") else() - set(SQLITE3_PATH "C:/dev/SQLite-Win64") + set(SQLITE3_PATH "C:/dev/SQLite-Win64" CACHE PATH "SQLite Path") endif() else() # Paths for 32-bit windows builds - set(OPENSSL_PATH "C:/dev/OpenSSL-Win32") - set(QT5_PATH "C:/dev/Qt/5.7/msvc2013") - set(VSREDIST "vcredist_x86.exe") + set(OPENSSL_PATH "C:/dev/OpenSSL-Win32" CACHE PATH "OpenSSL Path") + set(QT5_PATH "C:/dev/Qt/5.7/msvc2013" CACHE PATH "Qt5 Path") # Choose between SQLCipher or SQLite, depending whether # -Dsqlcipher=1 is passed on the command line if(sqlcipher) - set(SQLITE3_PATH "C:/git_repos/SQLCipher-Win32") + set(SQLITE3_PATH "C:/git_repos/SQLCipher-Win32" CACHE PATH "SQLCipher Path") else() - set(SQLITE3_PATH "C:/dev/SQLite-Win32") + set(SQLITE3_PATH "C:/dev/SQLite-Win32" CACHE PATH "SQLite Path") endif() endif() set(CMAKE_PREFIX_PATH "${QT5_PATH};${SQLITE3_PATH}") - set(VSREDIST_DIR "C:/dev/dependencies") endif() if(NOT FORCE_INTERNAL_ANTLR) @@ -67,11 +82,8 @@ add_subdirectory(${QHEXEDIT_DIR}) add_subdirectory(${QCUSTOMPLOT_DIR}) -find_package(Qt5Widgets REQUIRED) -find_package(Qt5LinguistTools REQUIRED) -find_package(Qt5Network REQUIRED) -find_package(Qt5Concurrent REQUIRED) -find_package(Qt5Xml REQUIRED) +find_package(Qt5 REQUIRED COMPONENTS Concurrent Gui LinguistTools Network PrintSupport Test Widgets Xml) + set(CMAKE_AUTOMOC ON) set(CMAKE_INCLUDE_CURRENT_DIR ON) @@ -81,7 +93,8 @@ set(SQLB_HDR src/version.h - src/sqlitetypes.h + src/sql/sqlitetypes.h + src/sql/Query.h src/csvparser.h src/sqlite.h src/grammar/sqlite3TokenTypes.hpp @@ -96,6 +109,7 @@ src/EditIndexDialog.h src/EditDialog.h src/EditTableDialog.h + src/AddRecordDialog.h src/ExportDataDialog.h src/ExtendedTableWidget.h src/FilterTableHeader.h @@ -106,6 +120,8 @@ src/SqlExecutionArea.h src/VacuumDialog.h src/sqlitetablemodel.h + src/RowLoader.h + src/RowCache.h src/sqltextedit.h src/docktextedit.h src/DbStructureModel.h @@ -125,6 +141,11 @@ src/FindReplaceDialog.h src/ExtendedScintilla.h src/FileExtensionManager.h + src/CipherSettings.h + src/DotenvFormat.h + src/Palette.h + src/CondFormat.h + src/RunSql.h ) set(SQLB_SRC @@ -132,6 +153,7 @@ src/EditIndexDialog.cpp src/EditDialog.cpp src/EditTableDialog.cpp + src/AddRecordDialog.cpp src/ExportDataDialog.cpp src/ExtendedTableWidget.cpp src/FilterTableHeader.cpp @@ -143,7 +165,9 @@ src/VacuumDialog.cpp src/sqlitedb.cpp src/sqlitetablemodel.cpp - src/sqlitetypes.cpp + src/RowLoader.cpp + src/sql/sqlitetypes.cpp + src/sql/Query.cpp src/sqltextedit.cpp src/docktextedit.cpp src/csvparser.cpp @@ -168,6 +192,11 @@ src/ExtendedScintilla.cpp src/FileExtensionManager.cpp src/Data.cpp + src/CipherSettings.cpp + src/DotenvFormat.cpp + src/Palette.cpp + src/CondFormat.cpp + src/RunSql.cpp ) set(SQLB_FORMS @@ -175,6 +204,7 @@ src/EditIndexDialog.ui src/EditDialog.ui src/EditTableDialog.ui + src/AddRecordDialog.ui src/ExportDataDialog.ui src/ImportCsvDialog.ui src/MainWindow.ui @@ -212,11 +242,13 @@ "${CMAKE_SOURCE_DIR}/src/translations/sqlb_es_ES.ts" "${CMAKE_SOURCE_DIR}/src/translations/sqlb_fr.ts" "${CMAKE_SOURCE_DIR}/src/translations/sqlb_ru.ts" + "${CMAKE_SOURCE_DIR}/src/translations/sqlb_pl.ts" "${CMAKE_SOURCE_DIR}/src/translations/sqlb_pt_BR.ts" "${CMAKE_SOURCE_DIR}/src/translations/sqlb_en_GB.ts" "${CMAKE_SOURCE_DIR}/src/translations/sqlb_ko_KR.ts" "${CMAKE_SOURCE_DIR}/src/translations/sqlb_tr.ts" "${CMAKE_SOURCE_DIR}/src/translations/sqlb_uk_UA.ts" + "${CMAKE_SOURCE_DIR}/src/translations/sqlb_it.ts" ) # Windows image format plugin files @@ -249,7 +281,6 @@ LICENSE-PLUGINS ) - qt5_wrap_ui(SQLB_FORM_HDR ${SQLB_FORMS}) if(SQLB_TSS) # add translations @@ -276,6 +307,8 @@ ELSE( MINGW ) set(SQLB_SRC ${SQLB_SRC} "${CMAKE_CURRENT_SOURCE_DIR}/src/winapp.rc") ENDIF( MINGW ) +else() + set(LPTHREAD pthread) endif(WIN32) #enable version check for MacOS @@ -335,8 +368,15 @@ ${SQLB_RESOURCES_RCC} ${SQLB_MISC}) -qt5_use_modules(${PROJECT_NAME} Gui Widgets Network Test PrintSupport Concurrent Xml) -set(QT_LIBRARIES "") + +# Warnings +if (ALL_WARNINGS AND CMAKE_COMPILER_IS_GNUCC) + target_compile_options(${PROJECT_NAME} PRIVATE -Wall -Wextra -Wshadow -Wnon-virtual-dtor -Wold-style-cast -Wcast-align -Wunused -Woverloaded-virtual -Wpedantic -Wconversion -Wsign-conversion) + target_compile_options(${PROJECT_NAME} PRIVATE -Wdouble-promotion -Wformat=2 -Wlogical-op -Wuseless-cast) + if(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 7.0) + target_compile_options(${PROJECT_NAME} PRIVATE -Wnull-dereference -Wduplicated-cond -Wduplicated-branches) + endif() +endif() add_dependencies(${PROJECT_NAME} qhexedit qcustomplot) if(NOT ANTLR2_FOUND) @@ -357,13 +397,16 @@ link_directories("${CMAKE_CURRENT_BINARY_DIR}/${QSCINTILLA_DIR}") endif() +set(QT_LIBS Qt5::Gui Qt5::Test Qt5::PrintSupport Qt5::Widgets Qt5::Network Qt5::Concurrent Qt5::Xml) + target_link_libraries(${PROJECT_NAME} - qhexedit - qcustomplot - ${QT_LIBRARIES} - ${WIN32_STATIC_LINK} - ${LIBSQLITE} - ${ADDITIONAL_LIBS}) + qhexedit + qcustomplot + ${LPTHREAD} + ${QT_LIBS} + ${WIN32_STATIC_LINK} + ${LIBSQLITE} + ${ADDITIONAL_LIBS}) if(ANTLR2_FOUND) target_link_libraries(${PROJECT_NAME} ${ANTLR2_LIBRARIES}) else() @@ -376,6 +419,7 @@ endif() if(WIN32 AND MSVC) + set_target_properties(${PROJECT_NAME} PROPERTIES OUTPUT_NAME "DB Browser for SQLite") set_target_properties(${PROJECT_NAME} PROPERTIES LINK_FLAGS_DEBUG "/SUBSYSTEM:CONSOLE") set_target_properties(${PROJECT_NAME} PROPERTIES COMPILE_DEFINITIONS_DEBUG "_CONSOLE") set_target_properties(${PROJECT_NAME} PROPERTIES LINK_FLAGS_RELWITHDEBINFO "/SUBSYSTEM:CONSOLE") @@ -399,16 +443,16 @@ add_subdirectory(src/tests) endif() -if(UNIX AND NOT APPLE) +if(UNIX) install(FILES src/icons/${PROJECT_NAME}.png DESTINATION share/icons/hicolor/256x256/apps/) - + install(FILES distri/${PROJECT_NAME}.desktop DESTINATION share/applications/) install(FILES distri/${PROJECT_NAME}.desktop.appdata.xml DESTINATION share/appdata/) -endif(UNIX AND NOT APPLE) +endif(UNIX) if(WIN32 AND MSVC) install(TARGETS ${PROJECT_NAME} @@ -445,7 +489,6 @@ install(FILES ${QT5_PATH}/plugins/platforms/qwindows.dll DESTINATION platforms) - install(PROGRAMS "${VSREDIST_DIR}/${VSREDIST}" DESTINATION redist) # The XML dll install(FILES @@ -477,40 +520,3 @@ distri/winlaunch.bat DESTINATION "/") endif() - -#cpack -set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "DB Browser for SQLite") -set(CPACK_PACKAGE_VENDOR "DB Browser for SQLite Team") -set(CPACK_PACKAGE_DESCRIPTION_FILE "${CMAKE_CURRENT_SOURCE_DIR}/README.md") -set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/LICENSE") -set(CPACK_PACKAGE_VERSION_MAJOR "3") -set(CPACK_PACKAGE_VERSION_MINOR "10") -set(CPACK_PACKAGE_VERSION_PATCH "99") -set(CPACK_PACKAGE_INSTALL_DIRECTORY "DB Browser for SQLite") -if(WIN32 AND NOT UNIX) - # There is a bug in NSIS that does not handle full unix paths properly. Make - # sure there is at least one set of four (4) backlasshes. - set(CPACK_PACKAGE_ICON "${CMAKE_CURRENT_SOURCE_DIR}\\\\src\\\\iconwin.ico") - set(CPACK_NSIS_MUI_ICON "${CMAKE_CURRENT_SOURCE_DIR}\\\\src\\\\iconwin.ico") - set(CPACK_NSIS_EXECUTABLES_DIRECTORY "/") - set(CPACK_NSIS_INSTALLED_ICON_NAME "DB Browser for SQLite.exe") - set(CPACK_NSIS_DISPLAY_NAME "DB Browser for SQLite") - set(CPACK_NSIS_HELP_LINK "https:\\\\\\\\github.com\\\\sqlitebrowser\\\\sqlitebrowser") - set(CPACK_NSIS_URL_INFO_ABOUT "https:\\\\\\\\github.com\\\\sqlitebrowser\\\\sqlitebrowser") - set(CPACK_NSIS_CONTACT "justin@postgresql.org") - set(CPACK_NSIS_MODIFY_PATH OFF) - set(CPACK_NSIS_ENABLE_UNINSTALL_BEFORE_INSTALL ON) - set(CPACK_NSIS_MUI_FINISHPAGE_RUN "winlaunch.bat") - set(CPACK_NSIS_COMPRESSOR "/SOLID lzma") - - # VS redist - list(APPEND CPACK_NSIS_EXTRA_INSTALL_COMMANDS " - ExecWait '\\\"$INSTDIR\\\\redist\\\\${VSREDIST}\\\" /install /passive /norestart /quiet' - Delete '\\\"$INSTDIR\\\\redist\\\\${VSREDIST}\\\"' - ") -else(WIN32 AND NOT UNIX) - set(CPACK_STRIP_FILES "DB Browser for SQLite") - set(CPACK_SOURCE_STRIP_FILES "") -endif(WIN32 AND NOT UNIX) -set(CPACK_PACKAGE_EXECUTABLES "DB Browser for SQLite" "DB Browser for SQLite") -include(CPack) diff -Nru sqlitebrowser-3.10.100ubuntu1/debian/changelog sqlitebrowser-3.11.1/debian/changelog --- sqlitebrowser-3.10.100ubuntu1/debian/changelog 2018-03-28 23:16:51.000000000 +0000 +++ sqlitebrowser-3.11.1/debian/changelog 2019-02-19 23:51:37.000000000 +0000 @@ -1,14 +1,14 @@ -sqlitebrowser (3.10.100ubuntu1-0~1956~201803282316~ubuntu18.04.1) bionic; urgency=low +sqlitebrowser (3.11.1-0~2363~201902192351~ubuntu18.04.1) bionic; urgency=low * Auto build. - -- Gajj GNDU Wed, 28 Mar 2018 23:16:51 +0000 + -- Gajj GNDU Tue, 19 Feb 2019 23:51:37 +0000 -sqlitebrowser (3.10.100ubuntu1) UNRELEASED; urgency=medium +sqlitebrowser (3.11.1) UNRELEASED; urgency=medium - * Stable Build + * Stable Build - -- nika Thu, 21 Sep 2017 17:00:59 -0500 + -- nika Tue, 19 Feb 2019 17:47:44 -0600 sqlitebrowser (3.10.1) UNRELEASED; urgency=medium diff -Nru sqlitebrowser-3.10.100ubuntu1/debian/git-build-recipe.manifest sqlitebrowser-3.11.1/debian/git-build-recipe.manifest --- sqlitebrowser-3.10.100ubuntu1/debian/git-build-recipe.manifest 2018-03-28 23:16:51.000000000 +0000 +++ sqlitebrowser-3.11.1/debian/git-build-recipe.manifest 2019-02-19 23:51:37.000000000 +0000 @@ -1,3 +1,3 @@ -# git-build-recipe format 0.4 deb-version {debupstream}-0~1956~201803282316 -lp:sqlitebrowser-recipe git-commit:85dbe7b01686f31a22cf3ce141e258801da986e8 -nest-part packaging lp:~linuxgndu/sqlitebrowser-recipe/+git/sqlitebrowser-deb-packaging debian debian git-commit:97f5a8e9693eed0775f9c5de70bbf492958ddd84 +# git-build-recipe format 0.4 deb-version {debupstream}-0~2363~201902192351 +lp:~linuxgndu/sqlitebrowser-recipe/+git/sqlitebrowser git-commit:a75acc01efca57313bca733cc4efa33044f17d1f +nest-part packaging lp:~linuxgndu/sqlitebrowser-recipe/+git/sqlitebrowser-deb-packaging debian debian git-commit:974583d5558edcdfb2f15ecb1651c928316c5526 diff -Nru sqlitebrowser-3.10.100ubuntu1/distri/sqlitebrowser.desktop sqlitebrowser-3.11.1/distri/sqlitebrowser.desktop --- sqlitebrowser-3.10.100ubuntu1/distri/sqlitebrowser.desktop 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/distri/sqlitebrowser.desktop 2019-02-19 23:51:34.000000000 +0000 @@ -2,6 +2,7 @@ Name=DB Browser for SQLite Comment=DB Browser for SQLite is a light GUI editor for SQLite databases Comment[de]=DB Browser for SQLite ist ein GUI-Editor für SQLite-Datenbanken +Comment[fr]=Un éditeur graphique léger pour les bases de données SQLite Exec=sqlitebrowser %f Icon=sqlitebrowser Terminal=false diff -Nru sqlitebrowser-3.10.100ubuntu1/distri/sqlitebrowser.desktop.appdata.xml sqlitebrowser-3.11.1/distri/sqlitebrowser.desktop.appdata.xml --- sqlitebrowser-3.10.100ubuntu1/distri/sqlitebrowser.desktop.appdata.xml 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/distri/sqlitebrowser.desktop.appdata.xml 2019-02-19 23:51:34.000000000 +0000 @@ -40,6 +40,6 @@ DB Browser for SQLite, creating a table - http://sqlitebrowser.org/ + https://sqlitebrowser.org/ https://github.com/sqlitebrowser/sqlitebrowser/issues diff -Nru sqlitebrowser-3.10.100ubuntu1/distri/winlaunch.bat sqlitebrowser-3.11.1/distri/winlaunch.bat --- sqlitebrowser-3.10.100ubuntu1/distri/winlaunch.bat 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/distri/winlaunch.bat 1970-01-01 00:00:00.000000000 +0000 @@ -1 +0,0 @@ -%WINDIR%\explorer.exe "DB Browser for SQLite.exe" diff -Nru sqlitebrowser-3.10.100ubuntu1/.github/ISSUE_TEMPLATE/Bug_report.md sqlitebrowser-3.11.1/.github/ISSUE_TEMPLATE/Bug_report.md --- sqlitebrowser-3.10.100ubuntu1/.github/ISSUE_TEMPLATE/Bug_report.md 1970-01-01 00:00:00.000000000 +0000 +++ sqlitebrowser-3.11.1/.github/ISSUE_TEMPLATE/Bug_report.md 2019-02-19 23:51:34.000000000 +0000 @@ -0,0 +1,48 @@ +--- +name: Bug Report +about: Create a report to help us improve + +--- + + + +Details for the issue +-------------------- + +#### What did you do? + + +#### What did you expect to see? + + +#### What did you see instead? + + +Useful extra information +------------------------- + +The info below often helps, please fill it out if you're able to. :) + +#### What operating system are you using? + +- [ ] Windows: ( _version:_ ___ ) +- [ ] Linux: ( _distro:_ ___ ) +- [ ] Mac OS: ( _version:_ ___ ) +- [ ] Other: ___ + +#### What is your DB4S version? + +- [ ] 3.11.1 +- [ ] 3.11.0 +- [ ] 3.10.1 +- [ ] Other: ___ + +#### Did you also + +- [ ] Try out the latest nightly version: https://github.com/sqlitebrowser/sqlitebrowser#nightly-builds +- [ ] Search for an existing similar issue: https://github.com/sqlitebrowser/sqlitebrowser/issues?utf8=%E2%9C%93&q=is%3Aissue%20 diff -Nru sqlitebrowser-3.10.100ubuntu1/.github/ISSUE_TEMPLATE/Feature_request.md sqlitebrowser-3.11.1/.github/ISSUE_TEMPLATE/Feature_request.md --- sqlitebrowser-3.10.100ubuntu1/.github/ISSUE_TEMPLATE/Feature_request.md 1970-01-01 00:00:00.000000000 +0000 +++ sqlitebrowser-3.11.1/.github/ISSUE_TEMPLATE/Feature_request.md 2019-02-19 23:51:34.000000000 +0000 @@ -0,0 +1,23 @@ +--- +name: Feature Request +about: Suggest an idea or request a new feature + +--- + + + +Describe the new feature +-------------------------- + + +Additional info +--------------- +Please answer these questions before submitting your feature request. + +#### Is your feature request related to an issue? Please include the issue number. + + +#### Does this feature exist in another product or project? Please provide a link. + + +#### Do you have a screenshot? Please add screenshots to help explain your idea. diff -Nru sqlitebrowser-3.10.100ubuntu1/.github/ISSUE_TEMPLATE/Question.md sqlitebrowser-3.11.1/.github/ISSUE_TEMPLATE/Question.md --- sqlitebrowser-3.10.100ubuntu1/.github/ISSUE_TEMPLATE/Question.md 1970-01-01 00:00:00.000000000 +0000 +++ sqlitebrowser-3.11.1/.github/ISSUE_TEMPLATE/Question.md 2019-02-19 23:51:34.000000000 +0000 @@ -0,0 +1,14 @@ +--- +name: Question +about: Ask a question related to this project or SQLite in general + +--- + + + +What is your question +----------------------- diff -Nru sqlitebrowser-3.10.100ubuntu1/.github/ISSUE_TEMPLATE.md sqlitebrowser-3.11.1/.github/ISSUE_TEMPLATE.md --- sqlitebrowser-3.10.100ubuntu1/.github/ISSUE_TEMPLATE.md 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/.github/ISSUE_TEMPLATE.md 2019-02-19 23:51:34.000000000 +0000 @@ -31,9 +31,9 @@ #### I'm using DB4S version: +- [ ] 3.11.1 +- [ ] 3.11.0 - [ ] 3.10.1 -- [ ] 3.10.0 -- [ ] 3.9.1 - [ ] Other: ___ #### I have also: Binary files /tmp/tmp6Z6cU5/j7Ppk8t7g0/sqlitebrowser-3.10.100ubuntu1/installer/macos/background@2x.png and /tmp/tmp6Z6cU5/0KfjjA5oc3/sqlitebrowser-3.11.1/installer/macos/background@2x.png differ Binary files /tmp/tmp6Z6cU5/j7Ppk8t7g0/sqlitebrowser-3.10.100ubuntu1/installer/macos/background.png and /tmp/tmp6Z6cU5/0KfjjA5oc3/sqlitebrowser-3.11.1/installer/macos/background.png differ diff -Nru sqlitebrowser-3.10.100ubuntu1/installer/macos/build_sqlitebrowser_nightly.sh sqlitebrowser-3.11.1/installer/macos/build_sqlitebrowser_nightly.sh --- sqlitebrowser-3.10.100ubuntu1/installer/macos/build_sqlitebrowser_nightly.sh 1970-01-01 00:00:00.000000000 +0000 +++ sqlitebrowser-3.11.1/installer/macos/build_sqlitebrowser_nightly.sh 2019-02-19 23:51:34.000000000 +0000 @@ -0,0 +1,230 @@ +#!/bin/bash + +# Builds and uploads DB Browser for SQLite nightlies, +# after updating the Homebrew dependencies + +QTVER="5.11.3" +BRANCH="master" +BREW="/usr/local/bin/brew" +BUILD_TYPE="release" +DATE=`date "+%Y%m%d"` +LOG="$HOME/db4s_nightlies/nightly.log-$DATE" +LRELEASE="$HOME/Qt/${QTVER}/clang_64/bin/lrelease" +LUPDATE="$HOME/Qt/${QTVER}/clang_64/bin/lupdate" +MACDEPLOYQT="$HOME/Qt/${QTVER}/clang_64/bin/macdeployqt" +PATH="$PATH:/usr/local/bin:/usr/sbin" +QMAKE="$HOME/Qt/${QTVER}/clang_64/bin/qmake" + +# Add the sensitive values we don't want to store in this script file +source ~/.db4s_secure + +# Update the branch to build, if specified on the command line with "-b [branch name]" +if [ "$1" = "-b" ]; then + if [ ! -z "$2" ]; then + BRANCH="$2" + echo "New branch = ${BRANCH}" >>$LOG 2>&1 + else + # Warn on missing branch name override + echo "Missing branch name after the '-b'" + exit 1 + fi +fi + +# Determine if a Release or Debug build is to be built +if [ "$3" = "-t" ]; then + if [ ! -z "$4" ]; then + BUILD_TYPE="$4" + echo "Build type = ${BUILD_TYPE}" >>$LOG 2>&1 + else + # Warn on missing build type override + echo "Missing build type after the '-t'" + exit 2 + fi +fi + +# Verify the build type is valid +if [ "${BUILD_TYPE}" != "debug" -a "${BUILD_TYPE}" != "release" ]; then + echo "Unknown build type" + exit 3 +fi + +# Ensure Homebrew is owned by my user +echo Ensure Homebrew is owned by my user >>$LOG 2>&1 +sudo chown -Rh jc:staff /usr/local >>$LOG 2>&1 + +# Update Homebrew +echo Update Homebrew >>$LOG 2>&1 +$BREW update >>$LOG 2>&1 + +### Build standard version + +# Remove any existing Homebrew installed packages +echo Remove any existing Homebrew installed packages >>$LOG 2>&1 +$BREW remove `$BREW list` --force >>$LOG 2>&1 + +# Install SQLite3 +# Note - `brew tap sqlitebrowser/homebrew-sqlite3` needs to have been run at least once (manually) first +echo Install SQLite3 >>$LOG 2>&1 +$BREW install sqlitefts5 >>$LOG 2>&1 + +# Update the sqlitebrowser source +echo Update the sqlitebrowser source >>$LOG 2>&1 +cd $HOME/git_repos/sqlitebrowser >>$LOG 2>&1 +git reset --hard HEAD >>$LOG 2>&1 +git clean -dffx >>$LOG 2>&1 +git pull >>$LOG 2>&1 +git checkout $BRANCH >>$LOG 2>&1 +git reset --hard HEAD >>$LOG 2>&1 +git clean -dffx >>$LOG 2>&1 +git pull >>$LOG 2>&1 + +# Update the translation files +echo Updating the translations >>$LOG 2>&1 +$LUPDATE src/src.pro >>$LOG 2>&1 +$LRELEASE src/src.pro >>$LOG 2>&1 + +# Build and package standard sqlitebrowser nightly +echo Build and package standard sqlitebrowser nightly >>$LOG 2>&1 +if [ "${BUILD_TYPE}" = "debug" ]; then + $QMAKE sqlitebrowser.pro -r -spec macx-clang CONFIG+=debug CONFIG+=x86_64 >>$LOG 2>&1 +else + $QMAKE sqlitebrowser.pro -r -spec macx-clang CONFIG+=x86_64 >>$LOG 2>&1 +fi +make -j3 >>$LOG 2>&1 +make -j3 >>$LOG 2>&1 # Seems to need a 2nd time now, due to language files needing initialisation or something + +# Include the depencencies in the .app bundle +$MACDEPLOYQT src/DB\ Browser\ for\ SQLite.app -verbose=2 >>$LOG 2>&1 + +# Add the math extensions to the .dmg +echo Add the math extensions to the .dmg >>$LOG 2>&1 +mkdir src/DB\ Browser\ for\ SQLite.app/Contents/Extensions >>$LOG 2>&1 +gcc -I/usr/local/opt/sqlitefts5/include -L/usr/local/opt/sqlitefts5/lib -fno-common -dynamiclib src/extensions/extension-functions.c -o src/DB\ Browser\ for\ SQLite.app/Contents/Extensions/math.dylib >>$LOG 2>&1 + +# Copy the license files to the .dmg +echo Copying the license files to the .dmg >>$LOG 2>&1 +cp LICENSE LICENSE-PLUGINS src/DB\ Browser\ for\ SQLite.app/Contents/Resources/ >>$LOG 2>&1 + +# Copy the translation files to the .dmg +mkdir -p src/DB\ Browser\ for\ SQLite.app/Contents/translations >>$LOG 2>&1 +for i in ar zh_CN zh_TW cs en fr de it ko pl pt ru es uk; do + cp -v $HOME/Qt/${QTVER}/clang_64/translations/qt_${i}.qm src/DB\ Browser\ for\ SQLite.app/Contents/translations/ >>$LOG 2>&1 + cp -v $HOME/Qt/${QTVER}/clang_64/translations/qtbase_${i}.qm src/DB\ Browser\ for\ SQLite.app/Contents/translations/ >>$LOG 2>&1 + cp -v $HOME/Qt/${QTVER}/clang_64/translations/qtmultimedia_${i}.qm src/DB\ Browser\ for\ SQLite.app/Contents/translations/ >>$LOG 2>&1 + cp -v $HOME/Qt/${QTVER}/clang_64/translations/qtquick1_${i}.qm src/DB\ Browser\ for\ SQLite.app/Contents/translations/ >>$LOG 2>&1 + cp -v $HOME/Qt/${QTVER}/clang_64/translations/qtscript_${i}.qm src/DB\ Browser\ for\ SQLite.app/Contents/translations/ >>$LOG 2>&1 + cp -v $HOME/Qt/${QTVER}/clang_64/translations/qtxmlpatterns_${i}.qm src/DB\ Browser\ for\ SQLite.app/Contents/translations/ >>$LOG 2>&1 +done + +# Unlock the local security keychain, so signing can be done +security unlock-keychain -p "${KEYCHAIN_PASSWORD}" "${HOME}/Library/Keychains/login.keychain" + +# Sign the .app +codesign --sign "${DEV_ID}" --verbose --deep --keychain "/Library/Keychains/System.keychain" src/DB\ Browser\ for\ SQLite.app >>$LOG 2>&1 + +# Make a .dmg file from the .app +mv src/DB\ Browser\ for\ SQLite.app $HOME/appdmg/ >>$LOG 2>&1 +cd $HOME/appdmg >>$LOG 2>&1 +$BREW install npm >>$LOG 2>&1 +npm -g update >>$LOG 2>&1 +npm -g upgrade >>$LOG 2>&1 +npm -g uninstall appdmg >>$LOG 2>&1 +npm -g install appdmg >>$LOG 2>&1 +appdmg --quiet nightly.json DB\ Browser\ for\ SQLite_${DATE}.dmg >>$LOG 2>&1 +mv DB\ Browser\ for\ SQLite_${DATE}.dmg $HOME/db4s_nightlies/ >>$LOG 2>&1 +rm -rf $HOME/appdmg/DB\ Browser\ for\ SQLite.app >>$LOG 2>&1 + +### Build SQLCipher version +# Remove any existing Homebrew installed packages +echo Remove any existing Homebrew installed packages >>$LOG 2>&1 +$BREW remove `$BREW list` --force >>$LOG 2>&1 + +# Install SQLCipher +echo Install SQLCipher >>$LOG 2>&1 +$BREW install sqlcipher >>$LOG 2>&1 + +# Clean the sqlitebrowser source +echo Clean the sqlitebrowser source >>$LOG 2>&1 +cd $HOME/git_repos/sqlitebrowser >>$LOG 2>&1 +git reset --hard HEAD >>$LOG 2>&1 +git clean -dffx >>$LOG 2>&1 +git checkout $BRANCH >>$LOG 2>&1 +git reset --hard HEAD >>$LOG 2>&1 +git clean -dffx >>$LOG 2>&1 + +# Update the translation files +echo Updating the translations >>$LOG 2>&1 +$LUPDATE src/src.pro >>$LOG 2>&1 +$LRELEASE src/src.pro >>$LOG 2>&1 + +# Build and package sqlitebrowser with SQLCipher support +echo Build and package sqlitebrowser with SQLCipher support >>$LOG 2>&1 +if [ "${BUILD_TYPE}" = "debug" ]; then + $QMAKE sqlitebrowser.pro -r -spec macx-clang CONFIG+=debug CONFIG+=x86_64 CONFIG+=sqlcipher >>$LOG 2>&1 +else + $QMAKE sqlitebrowser.pro -r -spec macx-clang CONFIG+=x86_64 CONFIG+=sqlcipher >>$LOG 2>&1 +fi +make -j3 >>$LOG 2>&1 +make -j3 >>$LOG 2>&1 # Seems to need a 2nd time now, due to language files needing initialisation or something + +# Include the depencencies in the .app bundle +$MACDEPLOYQT src/DB\ Browser\ for\ SQLite.app -verbose=2 >>$LOG 2>&1 + +# Add the math extensions to the .dmg +echo Add the math extensions to the .dmg >>$LOG 2>&1 +mkdir src/DB\ Browser\ for\ SQLite.app/Contents/Extensions >>$LOG 2>&1 +gcc -I/usr/local/opt/sqlitefts5/include -L/usr/local/opt/sqlitefts5/lib -fno-common -dynamiclib src/extensions/extension-functions.c -o src/DB\ Browser\ for\ SQLite.app/Contents/Extensions/math.dylib >>$LOG 2>&1 + +# Copy the license files to the .dmg +echo Copying the license files to the .dmg >>$LOG 2>&1 +cp LICENSE LICENSE-PLUGINS src/DB\ Browser\ for\ SQLite.app/Contents/Resources/ >>$LOG 2>&1 + +# Copy the translation files to the .dmg +mkdir -p src/DB\ Browser\ for\ SQLite.app/Contents/translations >>$LOG 2>&1 +for i in ar zh_CN zh_TW cs en fr de it ko pl pt ru es uk; do + cp -v $HOME/Qt/${QTVER}/clang_64/translations/qt_${i}.qm src/DB\ Browser\ for\ SQLite.app/Contents/translations/ >>$LOG 2>&1 + cp -v $HOME/Qt/${QTVER}/clang_64/translations/qtbase_${i}.qm src/DB\ Browser\ for\ SQLite.app/Contents/translations/ >>$LOG 2>&1 + cp -v $HOME/Qt/${QTVER}/clang_64/translations/qtmultimedia_${i}.qm src/DB\ Browser\ for\ SQLite.app/Contents/translations/ >>$LOG 2>&1 + cp -v $HOME/Qt/${QTVER}/clang_64/translations/qtquick1_${i}.qm src/DB\ Browser\ for\ SQLite.app/Contents/translations/ >>$LOG 2>&1 + cp -v $HOME/Qt/${QTVER}/clang_64/translations/qtscript_${i}.qm src/DB\ Browser\ for\ SQLite.app/Contents/translations/ >>$LOG 2>&1 + cp -v $HOME/Qt/${QTVER}/clang_64/translations/qtxmlpatterns_${i}.qm src/DB\ Browser\ for\ SQLite.app/Contents/translations/ >>$LOG 2>&1 +done + +# Unlock the local security keychain, so signing can be done +security unlock-keychain -p "${KEYCHAIN_PASSWORD}" "${HOME}/Library/Keychains/login.keychain" + +# Sign the .app +codesign --sign "${DEV_ID}" --verbose --deep --keychain "/Library/Keychains/System.keychain" src/DB\ Browser\ for\ SQLite.app >>$LOG 2>&1 + +# Make a .dmg file from the .app +mv src/DB\ Browser\ for\ SQLite.app $HOME/appdmg/ >>$LOG 2>&1 +cd $HOME/appdmg >>$LOG 2>&1 +$BREW install npm >>$LOG 2>&1 +npm -g update >>$LOG 2>&1 +npm -g upgrade >>$LOG 2>&1 +npm -g uninstall appdmg >>$LOG 2>&1 +npm -g install appdmg >>$LOG 2>&1 +appdmg --quiet nightly.json DB\ Browser\ for\ SQLite-sqlcipher_${DATE}.dmg >>$LOG 2>&1 +mv DB\ Browser\ for\ SQLite-sqlcipher_${DATE}.dmg $HOME/db4s_nightlies/ >>$LOG 2>&1 +rm -rf $HOME/appdmg/DB\ Browser\ for\ SQLite.app >>$LOG 2>&1 + +# If building a non-master branch, remove it now that we're finished +if [ "${BRANCH}" != "master" ]; then + echo "Removing non-master branch, now we're finihed" >>$LOG 2>&1 + cd $HOME/git_repos/sqlitebrowser >>$LOG 2>&1 + git reset --hard HEAD >>$LOG 2>&1 + git clean -dffx >>$LOG 2>&1 + git checkout master >>$LOG 2>&1 + git branch -D "${BRANCH}" >>$LOG 2>&1 +fi + +# Upload nightly builds and the build log thus far +echo Upload nightly builds >>$LOG 2>&1 +rsync -aP $HOME/db4s_nightlies/DB\ Browser\ for\ SQLite*${DATE}.dmg $HOME/db4s_nightlies/nightly.log-${DATE} ${UPLOAD_SERVER}:/nightlies/osx/ >>$LOG 2>&1 + +# Add the new builds to the "latest" directory +ssh ${UPLOAD_SERVER} "cd /nightlies/latest; rm -f *dmg" >>$LOG 2>&1 +ssh ${UPLOAD_SERVER} "cd /nightlies/latest; cp /nightlies/osx/DB\ Browser\ for\ SQLite_${DATE}.dmg /nightlies/latest/DB.Browser.for.SQLite.dmg" >>$LOG 2>&1 +ssh ${UPLOAD_SERVER} "cd /nightlies/latest; cp /nightlies/osx/DB\ Browser\ for\ SQLite-sqlcipher_${DATE}.dmg /nightlies/latest/DB.Browser.for.SQLite-sqlcipher.dmg" >>$LOG 2>&1 + +echo Done! >>$LOG 2>&1 diff -Nru sqlitebrowser-3.10.100ubuntu1/installer/macos/.db4s_secure sqlitebrowser-3.11.1/installer/macos/.db4s_secure --- sqlitebrowser-3.10.100ubuntu1/installer/macos/.db4s_secure 1970-01-01 00:00:00.000000000 +0000 +++ sqlitebrowser-3.11.1/installer/macos/.db4s_secure 2019-02-19 23:51:34.000000000 +0000 @@ -0,0 +1,3 @@ +DEV_ID="Developer ID Application: Your name (AABBCCDDEE)" +KEYCHAIN_PASSWORD="yourpassword" +UPLOAD_SERVER="user@example.org" Binary files /tmp/tmp6Z6cU5/j7Ppk8t7g0/sqlitebrowser-3.10.100ubuntu1/installer/macos/macapp.icns and /tmp/tmp6Z6cU5/0KfjjA5oc3/sqlitebrowser-3.11.1/installer/macos/macapp.icns differ diff -Nru sqlitebrowser-3.10.100ubuntu1/installer/macos/nightly.json sqlitebrowser-3.11.1/installer/macos/nightly.json --- sqlitebrowser-3.10.100ubuntu1/installer/macos/nightly.json 1970-01-01 00:00:00.000000000 +0000 +++ sqlitebrowser-3.11.1/installer/macos/nightly.json 2019-02-19 23:51:34.000000000 +0000 @@ -0,0 +1,22 @@ +{ + "title": "Install DB4S Nightly build", + "icon": "macapp.icns", + "icon-size": 128, + "background": "background.png", + "window": { + "size": { + "width": 500, + "height": 320 + } + }, + "contents": [ + { "x": 90, "y": 180, "type": "file", "path": "DB Browser for SQLite.app" }, + { "x": 395, "y": 180, "type": "link", "path": "/Applications" }, + + { "x": 90, "y": 380, "type": "position", "path": ".background" }, + { "x": 240, "y": 380, "type": "position", "path": ".DS_Store" }, + { "x": 400, "y": 380, "type": "position", "path": ".VolumeIcon.icns" }, + { "x": 90, "y": 530, "type": "position", "path": ".Trashes" } + ] +} + Binary files /tmp/tmp6Z6cU5/j7Ppk8t7g0/sqlitebrowser-3.10.100ubuntu1/installer/windows/background.bmp and /tmp/tmp6Z6cU5/0KfjjA5oc3/sqlitebrowser-3.11.1/installer/windows/background.bmp differ Binary files /tmp/tmp6Z6cU5/j7Ppk8t7g0/sqlitebrowser-3.10.100ubuntu1/installer/windows/banner.bmp and /tmp/tmp6Z6cU5/0KfjjA5oc3/sqlitebrowser-3.11.1/installer/windows/banner.bmp differ diff -Nru sqlitebrowser-3.10.100ubuntu1/installer/windows/build.cmd sqlitebrowser-3.11.1/installer/windows/build.cmd --- sqlitebrowser-3.10.100ubuntu1/installer/windows/build.cmd 1970-01-01 00:00:00.000000000 +0000 +++ sqlitebrowser-3.11.1/installer/windows/build.cmd 2019-02-19 23:51:34.000000000 +0000 @@ -0,0 +1,37 @@ +@echo off + +:: Output file name +set MSI=DB.Browser.for.SQLite-%1 + +:: Set the ARCH based on the first parameter +if "%1"=="" ( + echo ERROR: You must select a build type, either "win64" or "win32" + goto :eof +) else if "%1"=="win32" ( + set ARCH=x86 +) else if "%1"=="win64" ( + set ARCH=x64 +) else ( + echo ERROR: Unknown build type="%1" + goto :eof +) + +:: Suppress some ICE checks +:: - 61 (major upgrade) +:: - 03 & 82 (merge module) +:: - 38 & 43 & 57 (non-advertised shortcuts) +set ICE=-sice:ICE03 -sice:ICE82 -sice:ICE61 -sice:ICE38 -sice:ICE43 -sice:ICE57 + +:: Suppress 'light.exe' warning +:: - 1104 (vcredist merge module installer version) +set LIGHT=-sw1104 + +:: Compile & Link +"%WIX%\bin\candle.exe" -nologo -pedantic -arch %ARCH% product.wxs translations.wxs ui.wxs +"%WIX%\bin\light.exe" -sval -nologo -pedantic %LIGHT% %ICE% -ext WixUIExtension -ext WixUtilExtension -cultures:en-us -loc strings.wxl product.wixobj translations.wixobj ui.wixobj -out %MSI%.msi + +:: Cleanup +del product.wixobj +del translations.wixobj +del ui.wixobj +del %MSI%.wixpdb diff -Nru sqlitebrowser-3.10.100ubuntu1/installer/windows/license.rtf sqlitebrowser-3.11.1/installer/windows/license.rtf --- sqlitebrowser-3.10.100ubuntu1/installer/windows/license.rtf 1970-01-01 00:00:00.000000000 +0000 +++ sqlitebrowser-3.11.1/installer/windows/license.rtf 2019-02-19 23:51:34.000000000 +0000 @@ -0,0 +1,238 @@ +{\rtf1\ansi\ansicpg1252\deff0\deflang1033{\fonttbl{\f0\fnil\fcharset0 Calibri;}} +{\colortbl ;\red0\green0\blue255;} +{\*\generator Msftedit 5.41.21.2510;}\viewkind4\uc1\pard\sa200\sl276\slmult1\lang9\f0\fs20 DB Browser for SQLite is bi-licensed under the Mozilla Public License Version 2, as well as the GNU General Public License Version 3 or later.\par +You can modify or redistribute it under the conditions of these licenses.\par +\pard\sa200\sl276\slmult1\qc ----------------------------------------------------------------------------------------------------\par +\b\fs22 GNU GENERAL PUBLIC LICENSE\par +\b0\fs20 Version 3, 29 June 2007\par +\pard\sa200\sl276\slmult1\par +Copyright (C) 2007 Free Software Foundation, Inc. <{\field{\*\fldinst{HYPERLINK "http://fsf.org/"}}{\fldrslt{\ul\cf1 http://fsf.org/}}}\f0\fs20 >\par +Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed.\par +\par +\pard\sa200\sl276\slmult1\qc\b Preamble\b0\par +\pard\fi142\sa200\sl276\slmult1\qj The GNU General Public License is a free, copyleft license for software and other kinds of works.\par +The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too.\par +When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things.\par +To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others.\par +For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights.\par +Developers that use the GNU GPL protect your rights with two steps:\par +\pard\sa200\sl276\slmult1\qj (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it.\par +\pard\fi142\sa200\sl276\slmult1\qj For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions.\par +Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users.\par +Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free.\par +The precise terms and conditions for copying, distribution and modification follow.\par +\pard\sa200\sl276\slmult1\par +\pard\sa200\sl276\slmult1\qc\b TERMS AND CONDITIONS\b0\par +\pard\sa200\sl276\slmult1 0. Definitions.\par +\pard\fi142\sa200\sl276\slmult1 "This License" refers to version 3 of the GNU General Public License.\par +\pard\fi142\sa200\sl276\slmult1\qj "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks.\par +"The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations.\par +To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work.\par +A "covered work" means either the unmodified Program or a work based on the Program.\par +To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well.\par +To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying.\par +An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion.\par +\pard\sa200\sl276\slmult1 1. Source Code.\par +\pard\fi142\sa200\sl276\slmult1\qj The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work.\par +A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language.\par +The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it.\par +The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work.\par +The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source.\par +\pard\fi142\sa200\sl276\slmult1 The Corresponding Source for a work in source code form is that same work.\par +\pard\sa200\sl276\slmult1 2. Basic Permissions.\par +\pard\fi142\sa200\sl276\slmult1\qj All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law.\par +You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you.\par +Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary.\par +\pard\sa200\sl276\slmult1 3. Protecting Users' Legal Rights From Anti-Circumvention Law.\par +\pard\fi142\sa200\sl276\slmult1\qj No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures.\par +When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures.\par +\pard\sa200\sl276\slmult1 4. Conveying Verbatim Copies.\par +\pard\fi142\sa200\sl276\slmult1\qj You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program.\par +You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee.\par +\pard\sa200\sl276\slmult1 5. Conveying Modified Source Versions.\par +\pard\fi142\sa200\sl276\slmult1\qj You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions:\par +\pard\li284\sa200\sl276\slmult1\qj a) The work must carry prominent notices stating that you modified it, and giving a relevant date.\par +b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices".\par +c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it.\par +d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so.\par +\pard\fi142\sa200\sl276\slmult1\qj A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate.\par +\pard\sa200\sl276\slmult1 6. Conveying Non-Source Forms.\par +\pard\fi142\sa200\sl276\slmult1\qj You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways:\par +\pard\li284\sa200\sl276\slmult1\qj a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange.\par +b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge.\par +c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b.\par +d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements.\par +e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d.\par +\pard\fi142\sa200\sl276\slmult1\qj A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work.\par +A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product.\par +"Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made.\par +If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM).\par +The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network.\par +Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying.\par +\pard\sa200\sl276\slmult1 7. Additional Terms.\par +\pard\fi142\sa200\sl276\slmult1\qj "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions.\par +When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission.\par +Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms:\par +\pard\li284\sa200\sl276\slmult1\qj a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or\par +b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or\par +c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or\par +d) Limiting the use for publicity purposes of names of licensors or authors of the material; or\par +e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or\par +f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors.\par +\pard\fi142\sa200\sl276\slmult1\qj All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying.\par +If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms.\par +Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way.\par +\pard\sa200\sl276\slmult1 8. Termination.\par +\pard\fi142\sa200\sl276\slmult1\qj You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11).\par +However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation.\par +Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice.\par +Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10.\par +\pard\sa200\sl276\slmult1 9. Acceptance Not Required for Having Copies.\par +\pard\fi142\sa200\sl276\slmult1\qj You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so.\par +\pard\sa200\sl276\slmult1 10. Automatic Licensing of Downstream Recipients.\par +\pard\fi142\sa200\sl276\slmult1\qj Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License.\par +An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts.\par +You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it.\par +\pard\sa200\sl276\slmult1 11. Patents.\par +\pard\fi142\sa200\sl276\slmult1\qj A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version".\par +A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License.\par +Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version.\par +In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party.\par +If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid.\par +If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it.\par +A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007.\par +Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law.\par +\pard\sa200\sl276\slmult1 12. No Surrender of Others' Freedom.\par +\pard\fi142\sa200\sl276\slmult1\qj If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program.\par +\pard\sa200\sl276\slmult1 13. Use with the GNU Affero General Public License.\par +\pard\fi142\sa200\sl276\slmult1\qj Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such.\par +\pard\sa200\sl276\slmult1 14. Revised Versions of this License.\par +\pard\fi142\sa200\sl276\slmult1\qj The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns.\par +Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation.\par +If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program.\par +Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version.\par +\pard\sa200\sl276\slmult1 15. Disclaimer of Warranty.\par +\pard\fi142\sa200\sl276\slmult1\qj THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.\par +\pard\sa200\sl276\slmult1 16. Limitation of Liability.\par +\pard\fi142\sa200\sl276\slmult1\qj IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.\par +\pard\sa200\sl276\slmult1 17. Interpretation of Sections 15 and 16.\par +\pard\fi142\sa200\sl276\slmult1\qj If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee.\par +\pard\sa200\sl276\slmult1\qc\b END OF TERMS AND CONDITIONS\b0\par +\pard\sa200\sl276\slmult1\par +\pard\sa200\sl276\slmult1\qc\b How to Apply These Terms to Your New Programs\par +\pard\fi142\sa200\sl276\slmult1\qj\b0 If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms.\par +To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found.\par +\pard\sa200\sl276\slmult1 \par +\pard\li284\sa200\sl276\slmult1\qj Copyright (C) \par +This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.\par +This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.\par +You should have received a copy of the GNU General Public License along with this program. If not, see <{\field{\*\fldinst{HYPERLINK "http://www.gnu.org/licenses/"}}{\fldrslt{\ul\cf1 http://www.gnu.org/licenses/}}}\f0\fs20 >.\par +\pard\sa200\sl276\slmult1 Also add information on how to contact you by electronic and paper mail.\par +\pard\fi142\sa200\sl276\slmult1\qj If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode:\par +\pard\li284\sa200\sl276\slmult1\qj Copyright (C) This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details.\par +\pard\sa200\sl276\slmult1\qj The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box".\par +\pard\fi142\sa200\sl276\slmult1\qj You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see <{\field{\*\fldinst{HYPERLINK "http://www.gnu.org/licenses/"}}{\fldrslt{\ul\cf1 http://www.gnu.org/licenses/}}}\f0\fs20 >.\par +The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read <{\field{\*\fldinst{HYPERLINK "http://www.gnu.org/philosophy/why-not-lgpl.html"}}{\fldrslt{\ul\cf1 http://www.gnu.org/philosophy/why-not-lgpl.html}}}\f0\fs20 >.\par +\pard\sa200\sl276\slmult1\par +\pard\sa200\sl276\slmult1\qc ----------------------------------------------------------------------------------------------------\par +\pard\sa200\sl276\slmult1\par +\pard\sa200\sl276\slmult1\qc\b\fs22 Mozilla Public License Version 2.0\par +\pard\sa200\sl276\slmult1\b0\fs20\par +\fs22 1. Definitions\fs20\par +1.1. "Contributor"\par +\pard\fi-10\li426\sa200\sl276\slmult1\qj means each individual or legal entity that creates, contributes to the creation of, or owns Covered Software.\par +\pard\sa200\sl276\slmult1 1.2. "Contributor Version"\par +\pard\li426\sa200\sl276\slmult1\qj means the combination of the Contributions of others (if any) used by a Contributor and that particular Contributor's Contribution.\par +\pard\sa200\sl276\slmult1 1.3. "Contribution"\par +\pard\li426\sa200\sl276\slmult1\qj means Covered Software of a particular Contributor.\par +\pard\sa200\sl276\slmult1 1.4. "Covered Software"\par +\pard\li426\sa200\sl276\slmult1\qj means Source Code Form to which the initial Contributor has attached the notice in Exhibit A, the Executable Form of such Source Code Form, and Modifications of such Source Code Form, in each case including portions thereof.\par +\pard\sa200\sl276\slmult1 1.5. "Incompatible With Secondary Licenses"\par +\pard\li426\sa200\sl276\slmult1\qj means\par +(a) that the initial Contributor has attached the notice described in Exhibit B to the Covered Software; or\par +(b) that the Covered Software was made available under the terms of version 1.1 or earlier of the License, but not also under the terms of a Secondary License.\par +\pard\sa200\sl276\slmult1 1.6. "Executable Form"\par +\pard\li426\sa200\sl276\slmult1\qj means any form of the work other than Source Code Form.\par +\pard\sa200\sl276\slmult1 1.7. "Larger Work"\par +\pard\li426\sa200\sl276\slmult1\qj means a work that combines Covered Software with other material, in a separate file or files, that is not Covered Software.\par +\pard\sa200\sl276\slmult1 1.8. "License"\par +\pard\li426\sa200\sl276\slmult1\qj means this document.\par +\pard\sa200\sl276\slmult1 1.9. "Licensable"\par +\pard\li426\sa200\sl276\slmult1\qj means having the right to grant, to the maximum extent possible, whether at the time of the initial grant or subsequently, any and all of the rights conveyed by this License.\par +\pard\sa200\sl276\slmult1 1.10. "Modifications"\par +\pard\li426\sa200\sl276\slmult1\qj means any of the following:\par +(a) any file in Source Code Form that results from an addition to, deletion from, or modification of the contents of Covered Software; or\par +(b) any new file in Source Code Form that contains any Covered Software.\par +\pard\sa200\sl276\slmult1 1.11. "Patent Claims" of a Contributor\par +\pard\li426\sa200\sl276\slmult1\qj means any patent claim(s), including without limitation, method, process, and apparatus claims, in any patent Licensable by such Contributor that would be infringed, but for the grant of the License, by the making, using, selling, offering for sale, having made, import, or transfer of either its Contributions or its Contributor Version.\par +\pard\sa200\sl276\slmult1 1.12. "Secondary License"\par +\pard\li426\sa200\sl276\slmult1\qj means either the GNU General Public License, Version 2.0, the GNU Lesser General Public License, Version 2.1, the GNU Affero General Public License, Version 3.0, or any later versions of those licenses.\par +\pard\sa200\sl276\slmult1 1.13. "Source Code Form"\par +\pard\li426\sa200\sl276\slmult1\qj means the form of the work preferred for making modifications.\par +\pard\sa200\sl276\slmult1 1.14. "You" (or "Your")\par +\pard\li426\sa200\sl276\slmult1\qj means an individual or a legal entity exercising rights under this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with You. For purposes of this definition, "control" means (a) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (b) ownership of more than fifty percent (50%) of the outstanding shares or beneficial ownership of such entity.\par +\pard\sa200\sl276\slmult1\fs22 2. License Grants and Conditions\fs20\par +2.1. Grants\par +Each Contributor hereby grants You a world-wide, royalty-free, non-exclusive license:\par +\pard\li426\sa200\sl276\slmult1\qj (a) under intellectual property rights (other than patent or trademark) Licensable by such Contributor to use, reproduce, make available, modify, display, perform, distribute, and otherwise exploit its Contributions, either on an unmodified basis, with Modifications, or as part of a Larger Work; and\par +(b) under Patent Claims of such Contributor to make, use, sell, offer for sale, have made, import, and otherwise transfer either its Contributions or its Contributor Version.\par +\pard\sa200\sl276\slmult1 2.2. Effective Date\par +\pard\sa200\sl276\slmult1\qj The licenses granted in Section 2.1 with respect to any Contribution become effective for each Contribution on the date the Contributor first distributes such Contribution.\par +\pard\sa200\sl276\slmult1 2.3. Limitations on Grant Scope\par +\pard\sa200\sl276\slmult1\qj The licenses granted in this Section 2 are the only rights granted under this License. No additional rights or licenses will be implied from the distribution or licensing of Covered Software under this License. Notwithstanding Section 2.1(b) above, no patent license is granted by a Contributor:\par +\pard\li426\sa200\sl276\slmult1 (a) for any code that a Contributor has removed from Covered Software; or\par +(b) for infringements caused by: (i) Your and any other third party's modifications of Covered Software, or (ii) the combination of its Contributions with other software (except as part of its Contributor Version); or\par +(c) under Patent Claims infringed by Covered Software in the absence of its Contributions.\par +\pard\sa200\sl276\slmult1\qj This License does not grant any rights in the trademarks, service marks, or logos of any Contributor (except as may be necessary to comply with the notice requirements in Section 3.4).\par +\pard\sa200\sl276\slmult1 2.4. Subsequent Licenses\par +\pard\sa200\sl276\slmult1\qj No Contributor makes additional grants as a result of Your choice to distribute the Covered Software under a subsequent version of this License (see Section 10.2) or under the terms of a Secondary License (if permitted under the terms of Section 3.3).\par +\pard\sa200\sl276\slmult1 2.5. Representation\par +\pard\sa200\sl276\slmult1\qj Each Contributor represents that the Contributor believes its Contributions are its original creation(s) or it has sufficient rights to grant the rights to its Contributions conveyed by this License.\par +\pard\sa200\sl276\slmult1 2.6. Fair Use\par +\pard\sa200\sl276\slmult1\qj This License is not intended to limit any rights You have under applicable copyright doctrines of fair use, fair dealing, or other equivalents.\par +\pard\sa200\sl276\slmult1 2.7. Conditions\par +Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted in Section 2.1.\par +\fs22 3. Responsibilities\par +\fs20 3.1. Distribution of Source Form\par +\pard\sa200\sl276\slmult1\qj All distribution of Covered Software in Source Code Form, including any Modifications that You create or to which You contribute, must be under the terms of this License. You must inform recipients that the Source Code Form of the Covered Software is governed by the terms of this License, and how they can obtain a copy of this License. You may not attempt to alter or restrict the recipients' rights in the Source Code Form.\par +\pard\sa200\sl276\slmult1 3.2. Distribution of Executable Form\par +If You distribute Covered Software in Executable Form then:\par +\pard\li426\sa200\sl276\slmult1\qj (a) such Covered Software must also be made available in Source Code Form, as described in Section 3.1, and You must inform recipients of the Executable Form how they can obtain a copy of such Source Code Form by reasonable means in a timely manner, at a charge no more than the cost of distribution to the recipient; and\par +(b) You may distribute such Executable Form under the terms of this License, or sublicense it under different terms, provided that the license for the Executable Form does not attempt to limit or alter the recipients' rights in the Source Code Form under this License.\par +\pard\sa200\sl276\slmult1 3.3. Distribution of a Larger Work\par +\pard\sa200\sl276\slmult1\qj You may create and distribute a Larger Work under terms of Your choice, provided that You also comply with the requirements of this License for the Covered Software. If the Larger Work is a combination of Covered Software with a work governed by one or more Secondary Licenses, and the Covered Software is not Incompatible With Secondary Licenses, this License permits You to additionally distribute such Covered Software under the terms of such Secondary License(s), so that the recipient of the Larger Work may, at their option, further distribute the Covered Software under the terms of either this License or such Secondary License(s).\par +\pard\sa200\sl276\slmult1 3.4. Notices\par +\pard\sa200\sl276\slmult1\qj You may not remove or alter the substance of any license notices (including copyright notices, patent notices, disclaimers of warranty, or limitations of liability) contained within the Source Code Form of the Covered Software, except that You may alter any license notices to the extent required to remedy known factual inaccuracies.\par +\pard\sa200\sl276\slmult1 3.5. Application of Additional Terms\par +\pard\sa200\sl276\slmult1\qj You may choose to offer, and to charge a fee for, warranty, support, indemnity or liability obligations to one or more recipients of Covered Software. However, You may do so only on Your own behalf, and not on behalf of any Contributor. You must make it absolutely clear that any such warranty, support, indemnity, or liability obligation is offered by You alone, and You hereby agree to indemnify every Contributor for any liability incurred by such Contributor as a result of warranty, support, indemnity or liability terms You offer. You may include additional disclaimers of warranty and limitations of liability specific to any jurisdiction.\par +\pard\sa200\sl276\slmult1\fs22 4. Inability to Comply Due to Statute or Regulation\par +\pard\sa200\sl276\slmult1\qj\fs20 If it is impossible for You to comply with any of the terms of this License with respect to some or all of the Covered Software due to statute, judicial order, or regulation then You must: (a) comply with the terms of this License to the maximum extent possible; and (b) describe the limitations and the code they affect. Such description must be placed in a text file included with all distributions of the Covered Software under this License. Except to the extent prohibited by statute or regulation, such description must be sufficiently detailed for a recipient of ordinary skill to be able to understand it.\par +\pard\sa200\sl276\slmult1\fs22 5. Termination\fs20\par +\pard\sa200\sl276\slmult1\qj 5.1. The rights granted under this License will terminate automatically if You fail to comply with any of its terms. However, if You become compliant, then the rights granted under this License from a particular Contributor are reinstated (a) provisionally, unless and until such Contributor explicitly and finally terminates Your grants, and (b) on an ongoing basis, if such Contributor fails to notify You of the non-compliance by some reasonable means prior to 60 days after You have come back into compliance. Moreover, Your grants from a particular Contributor are reinstated on an ongoing basis if such Contributor notifies You of the non-compliance by some reasonable means, this is the first time You have received notice of non-compliance with this License from such Contributor, and You become compliant prior to 30 days after Your receipt of the notice.\par +5.2. If You initiate litigation against any entity by asserting a patent infringement claim (excluding declaratory judgment actions, counter-claims, and cross-claims) alleging that a Contributor Version directly or indirectly infringes any patent, then the rights granted to You by any and all Contributors for the Covered Software under Section 2.1 of this License shall terminate.\par +5.3. In the event of termination under Sections 5.1 or 5.2 above, all end user license agreements (excluding distributors and resellers) which have been validly granted by You or Your distributors under this License prior to termination shall survive termination.\par +\pard\sa200\sl276\slmult1\fs22 6. Disclaimer of Warranty\fs20\par +\pard\sa200\sl276\slmult1\qj Covered Software is provided under this License on an "as is" basis, without warranty of any kind, either expressed, implied, or statutory, including, without limitation, warranties that the Covered Software is free of defects, merchantable, fit for a particular purpose or non-infringing. The entire risk as to the quality and performance of the Covered Software is with You. Should any Covered Software prove defective in any respect, You (not any Contributor) assume the cost of any necessary servicing, repair, or correction. This disclaimer of warranty constitutes an essential part of this License. No use of any Covered Software is authorized under this License except under this disclaimer.\par +\pard\sa200\sl276\slmult1\fs22 7. Limitation of Liability\fs20\par +\pard\sa200\sl276\slmult1\qj Under no circumstances and under no legal theory, whether tort (including negligence), contract, or otherwise, shall any Contributor, or anyone who distributes Covered Software as permitted above, be liable to You for any direct, indirect, special, incidental, or consequential damages of any character including, without limitation, damages for lost profits, loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses, even if such party shall have been informed of the possibility of such damages. This limitation of liability shall not apply to liability for death or personal injury resulting from such party's negligence to the extent applicable law prohibits such limitation. Some jurisdictions do not allow the exclusion or limitation of incidental or consequential damages, so this exclusion and limitation may not apply to You.\par +\pard\sa200\sl276\slmult1\fs22 8. Litigation\fs20\par +\pard\sa200\sl276\slmult1\qj Any litigation relating to this License may be brought only in the courts of a jurisdiction where the defendant maintains its principal place of business and such litigation shall be governed by laws of that jurisdiction, without reference to its conflict-of-law provisions. Nothing in this Section shall prevent a party's ability to bring cross-claims or counter-claims.\par +\pard\sa200\sl276\slmult1\fs22 9. Miscellaneous\fs20\par +\pard\sa200\sl276\slmult1\qj This License represents the complete agreement concerning the subject matter hereof. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable. Any law or regulation which provides that the language of a contract shall be construed against the drafter shall not be used to construe this License against a Contributor.\par +\pard\sa200\sl276\slmult1\fs22 10. Versions of the License\par +\fs20 10.1. New Versions\par +\pard\sa200\sl276\slmult1\qj Mozilla Foundation is the license steward. Except as provided in Section 10.3, no one other than the license steward has the right to modify or publish new versions of this License. Each version will be given a distinguishing version number.\par +\pard\sa200\sl276\slmult1 10.2. Effect of New Versions\par +\pard\sa200\sl276\slmult1\qj You may distribute the Covered Software under the terms of the version of the License under which You originally received the Covered Software, or under the terms of any subsequent version published by the license steward.\par +\pard\sa200\sl276\slmult1 10.3. Modified Versions\par +\pard\sa200\sl276\slmult1\qj If you create software not governed by this License, and you want to create a new license for such software, you may create and use a modified version of this License if you rename the license and remove any references to the name of the license steward (except to note that such modified license differs from this License).\par +\pard\sa200\sl276\slmult1 10.4. Distributing Source Code Form that is Incompatible With Secondary Licenses\par +\pard\sa200\sl276\slmult1\qj If You choose to distribute Source Code Form that is Incompatible With Secondary Licenses under the terms of this version of the License, the notice described in Exhibit B of this License must be attached.\par +\pard\sa200\sl276\slmult1\fs22 Exhibit A - Source Code Form License Notice\par +\pard\li284\sa200\sl276\slmult1\qj\fs20 This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. If a copy of the MPL was not distributed with this file, You can obtain one at {\field{\*\fldinst{HYPERLINK "http://mozilla.org/MPL/2.0/"}}{\fldrslt{\ul\cf1 http://mozilla.org/MPL/2.0/}}}\f0\fs20 .\par +\pard\sa200\sl276\slmult1\qj If it is not possible or desirable to put the notice in a particular file, then You may include the notice in a location (such as a LICENSE file in a relevant directory) where a recipient would be likely to look for such a notice.\par +\pard\sa200\sl276\slmult1 You may add additional accurate notices of copyright ownership.\par +\fs22 Exhibit B - "Incompatible With Secondary Licenses" Notice\par +\pard\li284\sa200\sl276\slmult1\qj\fs20 This Source Code Form is "Incompatible With Secondary Licenses", as defined by the Mozilla Public License, v. 2.0.\par +} + \ No newline at end of file diff -Nru sqlitebrowser-3.10.100ubuntu1/installer/windows/nightly_build_scripts/win32build.bat sqlitebrowser-3.11.1/installer/windows/nightly_build_scripts/win32build.bat --- sqlitebrowser-3.10.100ubuntu1/installer/windows/nightly_build_scripts/win32build.bat 1970-01-01 00:00:00.000000000 +0000 +++ sqlitebrowser-3.11.1/installer/windows/nightly_build_scripts/win32build.bat 2019-02-19 23:51:34.000000000 +0000 @@ -0,0 +1,114 @@ +:: Destination path - specify where to move package after build +SET DEST_PATH=C:\\builds +MKDIR "%DEST_PATH%" + +SET ZIP_EXE="C:\Program Files\7-Zip\7z.exe" +SET SQLITE_DIR=C:\\dev\\SQLite-Win32 +SET SQLCIPHER_DIR=C:\\git_repos\\SQLCipher-Win32 +SET SQLCIPHER_TAG=v4.0.1 + +:: You need to change the date format in Windows settings to YYYY-MM-DD +:: before this will work properly. ;) +set RUN_DATE=%DATE% + +:: If no branch given on the command line, use master +IF "%1"=="" (SET BRANCH="master") ELSE (SET BRANCH="%1") + +CD /d "C:\" +if exist "%SQLITE_DIR%" rd /q /s "%SQLITE_DIR%" +if exist "C:\\builds\\release-sqlite-win32" rd /q /s "C:\\builds\\release-sqlite-win32" +if exist "C:\\builds\\release-sqlcipher-win32" rd /q /s "C:\\builds\\release-sqlcipher-win32" + +:: Unpack SQLite +CD C:\dev +%ZIP_EXE% e sqlite*zip "-o%SQLITE_DIR%" + +:: Update repositories +::git clone -b v3.4.2 https://github.com/sqlcipher/sqlcipher.git SQLCipher-Win32 +CD C:\\git_repos\\SQLCipher-Win32 +git clean -dffx +git checkout -f HEAD +git checkout master +git pull +git checkout "%SQLCIPHER_TAG%" +git clean -dffx +git pull +git clean -dffx + +::git clone -b %BRANCH% https://github.com/sqlitebrowser/sqlitebrowser.git "%DB4S_DIR%Win32" +CD C:\\git_repos\\sqlitebrowser +git clean -dffx +git checkout -f HEAD +git checkout master +git pull +git checkout %BRANCH% +git clean -dffx +git pull +git clean -dffx + + +:: WIN32 SQLITE BUILD PROCEDURE + +:: Set path variables +CALL "C:\\Program Files (x86)\\Microsoft Visual Studio 12.0\\VC\\bin\\vcvars32.bat" + +:: Build SQLite x86 +CD %SQLITE_DIR% +cl sqlite3.c -DSQLITE_ENABLE_FTS5 -DSQLITE_ENABLE_FTS3 -DSQLITE_ENABLE_FTS3_PARENTHESIS -DSQLITE_ENABLE_STAT4 -DSQLITE_ENABLE_JSON1 -DSQLITE_API=__declspec(dllexport) -link -dll -out:sqlite3.dll + +:: Build Math extension x86 +COPY C:\git_repos\sqlitebrowser\src\extensions\extension-functions.c +COPY C:\git_repos\sqlitebrowser\src\extensions\extension-functions.def +cl /MD extension-functions.c -link -dll -def:extension-functions.def -out:math.dll + +:: Run CMake for SQLite x86 +CD C:\\builds +MKDIR "release-sqlite-win32" +CD "release-sqlite-win32" +cmake -G "Visual Studio 12 2013" -Wno-dev C:\\git_repos\\sqlitebrowser + +:: Build package +devenv /Build Release sqlitebrowser.sln /project "ALL_BUILD" + + +:: WIN32 SQLCIPHER BUILD PROCEDURE + +:: Build SQLCipher x86 +CD %SQLCIPHER_DIR% +nmake /f Makefile.msc sqlcipher.dll USE_AMALGAMATION=1 NO_TCL=1 SQLITE3DLL=sqlcipher.dll SQLITE3LIB=sqlcipher.lib SQLITE3EXE=sqlcipher.exe LTLINKOPTS="C:\dev\OpenSSL-Win32\lib\libeay32.lib" OPT_FEATURE_FLAGS="-DSQLITE_TEMP_STORE=2 -DSQLITE_HAS_CODEC=1 -DSQLITE_ENABLE_FTS3=1 -DSQLITE_ENABLE_FTS5=1 -DSQLITE_ENABLE_FTS3_PARENTHESIS=1 -DSQLITE_ENABLE_STAT4=1 -DSQLITE_ENABLE_JSON1=1 -DSQLCIPHER_CRYPTO_OPENSSL=1 -IC:\dev\OpenSSL-Win32\include" + +:: Run CMake for SQLCipher x86 +CD C:\\builds +MKDIR "release-sqlcipher-win32" +CD "release-sqlcipher-win32" +cmake -G "Visual Studio 12 2013" -Wno-dev -Dsqlcipher=1 C:\\git_repos\\sqlitebrowser + +:: Build package +devenv /Build Release sqlitebrowser.sln /project "ALL_BUILD" + +:: Rename SQLCipher +CD "Release" +MOVE "DB Browser for SQLite.exe" "DB Browser for SQLCipher.exe" + +:: Build MSI +CD C:\\git_repos\\sqlitebrowser\\installer\\windows +CALL build.cmd win32 + +:: Move package to DEST_PATH +MOVE /Y *.msi "%DEST_PATH%\DB.Browser.for.SQLite-%RUN_DATE%-win32.msi" + +:: Create ZIP +CD %DEST_PATH% +msiexec /a "DB.Browser.for.SQLite-%RUN_DATE%-win32.msi" /q TARGETDIR=%CD%\zip +MOVE %CD%\zip\System\* "%CD%\zip\DB Browser for SQLite" +%ZIP_EXE% a "DB.Browser.for.SQLite-%RUN_DATE%-win32.zip" "%CD%\zip\DB Browser for SQLite" +RMDIR /S /Q %CD%\zip + + +:: Upload the packages to the nightlies server +pscp -q -p -i C:\dev\puttygen_private.ppk "%DEST_PATH%\DB*%RUN_DATE%*win32.*" nightlies@nightlies.sqlitebrowser.org:/nightlies/win32 + +:: Copy the new binaries to /latest directory on the nightlies server +plink -i C:\dev\puttygen_private.ppk nightlies@nightlies.sqlitebrowser.org "cd /nightlies/latest; rm -f *-win32.*" +plink -i C:\dev\puttygen_private.ppk nightlies@nightlies.sqlitebrowser.org "cp /nightlies/win32/DB*SQLite-%RUN_DATE%-win32.msi /nightlies/latest/DB.Browser.for.SQLite-win32.msi" +plink -i C:\dev\puttygen_private.ppk nightlies@nightlies.sqlitebrowser.org "cp /nightlies/win32/DB*SQLite-%RUN_DATE%-win32.zip /nightlies/latest/DB.Browser.for.SQLite-win32.zip" diff -Nru sqlitebrowser-3.10.100ubuntu1/installer/windows/nightly_build_scripts/win64build.bat sqlitebrowser-3.11.1/installer/windows/nightly_build_scripts/win64build.bat --- sqlitebrowser-3.10.100ubuntu1/installer/windows/nightly_build_scripts/win64build.bat 1970-01-01 00:00:00.000000000 +0000 +++ sqlitebrowser-3.11.1/installer/windows/nightly_build_scripts/win64build.bat 2019-02-19 23:51:34.000000000 +0000 @@ -0,0 +1,114 @@ +:: Destination path - specify where to move package after build +SET DEST_PATH=C:\\builds +MKDIR "%DEST_PATH%" + +SET ZIP_EXE="C:\Program Files\7-Zip\7z.exe" +SET SQLITE_DIR=C:\\dev\\SQLite-Win64 +SET SQLCIPHER_DIR=C:\\git_repos\\SQLCipher-Win64 +SET SQLCIPHER_TAG=v4.0.1 + +:: You need to change the date format in Windows settings to YYYY-MM-DD +:: before this will work properly. ;) +set RUN_DATE=%DATE% + +:: If no branch given on the command line, use master +IF "%1"=="" (SET BRANCH="master") ELSE (SET BRANCH="%1") + +CD /d "C:\" +if exist "%SQLITE_DIR%" rd /q /s "%SQLITE_DIR%" +if exist "C:\\builds\\release-sqlite-win64" rd /q /s "C:\\builds\\release-sqlite-win64" +if exist "C:\\builds\\release-sqlcipher-win64" rd /q /s "C:\\builds\\release-sqlcipher-win64" + +:: Unpack SQLite +CD C:\dev +%ZIP_EXE% e sqlite*zip "-o%SQLITE_DIR%" + +:: Update repositories +::git clone -b v3.4.2 https://github.com/sqlcipher/sqlcipher.git SQLCipher-Win64 +CD C:\\git_repos\\SQLCipher-Win64 +git clean -dffx +git checkout -f HEAD +git checkout master +git pull +git checkout "%SQLCIPHER_TAG%" +git clean -dffx +git pull +git clean -dffx + +::git clone -b %BRANCH% https://github.com/sqlitebrowser/sqlitebrowser.git "%DB4S_DIR%Win64" +CD C:\\git_repos\\sqlitebrowser +git clean -dffx +git checkout -f HEAD +git checkout master +git pull +git checkout %BRANCH% +git clean -dffx +git pull +git clean -dffx + + +:: WIN64 SQLITE BUILD PROCEDURE + +:: Set path variables +CALL "C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build\vcvars64.bat" + +:: Build SQLite x64 +CD %SQLITE_DIR% +cl sqlite3.c -DSQLITE_ENABLE_FTS5 -DSQLITE_ENABLE_FTS3 -DSQLITE_ENABLE_FTS3_PARENTHESIS -DSQLITE_ENABLE_STAT4 -DSQLITE_ENABLE_JSON1 -DSQLITE_API=__declspec(dllexport) -link -dll -out:sqlite3.dll + +:: Build Math extension x64 +COPY C:\git_repos\sqlitebrowser\src\extensions\extension-functions.c +COPY C:\git_repos\sqlitebrowser\src\extensions\extension-functions.def +cl /MD extension-functions.c -link -dll -def:extension-functions.def -out:math.dll + +:: Run CMake for SQLite x64 +CD C:\\builds +MKDIR "release-sqlite-win64" +CD "release-sqlite-win64" +cmake -G "Visual Studio 15 2017 Win64" -Wno-dev C:\\git_repos\\sqlitebrowser + +:: Build package +devenv /Build Release sqlitebrowser.sln /project "ALL_BUILD" + + +:: WIN64 SQLCIPHER BUILD PROCEDURE + +:: Build SQLCipher x64 +CD %SQLCIPHER_DIR% +nmake /f Makefile.msc sqlcipher.dll USE_AMALGAMATION=1 NO_TCL=1 SQLITE3DLL=sqlcipher.dll SQLITE3LIB=sqlcipher.lib SQLITE3EXE=sqlcipher.exe LTLINKOPTS="C:\dev\OpenSSL-Win64\lib\libeay32.lib" OPT_FEATURE_FLAGS="-DSQLITE_TEMP_STORE=2 -DSQLITE_HAS_CODEC=1 -DSQLITE_ENABLE_FTS3=1 -DSQLITE_ENABLE_FTS5=1 -DSQLITE_ENABLE_FTS3_PARENTHESIS=1 -DSQLITE_ENABLE_STAT4=1 -DSQLITE_ENABLE_JSON1=1 -DSQLCIPHER_CRYPTO_OPENSSL=1 -IC:\dev\OpenSSL-Win64\include" + +:: Run CMake for SQLCipher x64 +CD C:\\builds +MKDIR "release-sqlcipher-win64" +CD "release-sqlcipher-win64" +cmake -G "Visual Studio 15 2017 Win64" -Wno-dev -Dsqlcipher=1 C:\\git_repos\\sqlitebrowser + +:: Build package +devenv /Build Release sqlitebrowser.sln /project "ALL_BUILD" + +:: Rename SQLCipher +CD "Release" +MOVE "DB Browser for SQLite.exe" "DB Browser for SQLCipher.exe" + +:: Build MSI +CD C:\\git_repos\\sqlitebrowser\\installer\\windows +CALL build.cmd win64 + +:: Move package to DEST_PATH +MOVE /Y *.msi "%DEST_PATH%\DB.Browser.for.SQLite-%RUN_DATE%-win64.msi" + +:: Create ZIP +CD %DEST_PATH% +msiexec /a "DB.Browser.for.SQLite-%RUN_DATE%-win64.msi" /q TARGETDIR=%CD%\zip +MOVE %CD%\zip\System64\* "%CD%\zip\DB Browser for SQLite" +%ZIP_EXE% a "DB.Browser.for.SQLite-%RUN_DATE%-win64.zip" "%CD%\zip\DB Browser for SQLite" +RMDIR /S /Q %CD%\zip + + +:: Upload the packages to the nightlies server +pscp -q -p -i C:\dev\puttygen_private.ppk "%DEST_PATH%\DB*%RUN_DATE%*win64.*" nightlies@nightlies.sqlitebrowser.org:/nightlies/win64 + +:: Copy the new binaries to /latest directory on the nightlies server +plink -i C:\dev\puttygen_private.ppk nightlies@nightlies.sqlitebrowser.org "cd /nightlies/latest; rm -f *-win64.*" +plink -i C:\dev\puttygen_private.ppk nightlies@nightlies.sqlitebrowser.org "cp /nightlies/win64/DB*SQLite-%RUN_DATE%-win64.msi /nightlies/latest/DB.Browser.for.SQLite-win64.msi" +plink -i C:\dev\puttygen_private.ppk nightlies@nightlies.sqlitebrowser.org "cp /nightlies/win64/DB*SQLite-%RUN_DATE%-win64.zip /nightlies/latest/DB.Browser.for.SQLite-win64.zip" diff -Nru sqlitebrowser-3.10.100ubuntu1/installer/windows/product.wxs sqlitebrowser-3.11.1/installer/windows/product.wxs --- sqlitebrowser-3.10.100ubuntu1/installer/windows/product.wxs 1970-01-01 00:00:00.000000000 +0000 +++ sqlitebrowser-3.11.1/installer/windows/product.wxs 2019-02-19 23:51:34.000000000 +0000 @@ -0,0 +1,300 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + SHORTCUT_SQLITE_DESKTOP + + + + + SHORTCUT_SQLCIPHER_DESKTOP + + + + + + + SHORTCUT_SQLITE_PROGRAMMENU + + + + + SHORTCUT_SQLCIPHER_PROGRAMMENU + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LicenseAccepted = "1" + NOT Installed + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + NSIS_INSTALLDIR + + + + + + + NSIS_INSTALLDIR + + + + + Binary files /tmp/tmp6Z6cU5/j7Ppk8t7g0/sqlitebrowser-3.10.100ubuntu1/installer/windows/resources/background.xcf and /tmp/tmp6Z6cU5/0KfjjA5oc3/sqlitebrowser-3.11.1/installer/windows/resources/background.xcf differ Binary files /tmp/tmp6Z6cU5/j7Ppk8t7g0/sqlitebrowser-3.10.100ubuntu1/installer/windows/resources/banner.xcf and /tmp/tmp6Z6cU5/0KfjjA5oc3/sqlitebrowser-3.11.1/installer/windows/resources/banner.xcf differ Binary files /tmp/tmp6Z6cU5/j7Ppk8t7g0/sqlitebrowser-3.10.100ubuntu1/installer/windows/resources/icon.png and /tmp/tmp6Z6cU5/0KfjjA5oc3/sqlitebrowser-3.11.1/installer/windows/resources/icon.png differ diff -Nru sqlitebrowser-3.10.100ubuntu1/installer/windows/strings.wxl sqlitebrowser-3.11.1/installer/windows/strings.wxl --- sqlitebrowser-3.10.100ubuntu1/installer/windows/strings.wxl 1970-01-01 00:00:00.000000000 +0000 +++ sqlitebrowser-3.11.1/installer/windows/strings.wxl 2019-02-19 23:51:34.000000000 +0000 @@ -0,0 +1,14 @@ + + + This Setup Wizard will install [ProductName] on your computer. If you have a previous version already installed, this installation process will update it. + + + [ProductName] Setup + {\WixUI_Font_Title}Shortcuts + Select the shortcuts for the application. + [ProductName] uses the latest version of SQLite, so you can enjoy all of its new features and bug fixes, but it does not have encryption support. It is also built with SQLCipher as a separate application. SQLCipher is an open source extension to SQLite providing transparent 256-bit AES encryption of database files, but uses a slightly older version of SQLite. Both applications (with and without SQLCipher) are installed and can run concurrently. This page allows you to choose the shortcuts for each application and where to place them. + DB Browser (SQLite) + DB Browser (SQLCipher) + Desktop + Program Menu + diff -Nru sqlitebrowser-3.10.100ubuntu1/installer/windows/translations.wxs sqlitebrowser-3.11.1/installer/windows/translations.wxs --- sqlitebrowser-3.10.100ubuntu1/installer/windows/translations.wxs 1970-01-01 00:00:00.000000000 +0000 +++ sqlitebrowser-3.11.1/installer/windows/translations.wxs 2019-02-19 23:51:34.000000000 +0000 @@ -0,0 +1,248 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -Nru sqlitebrowser-3.10.100ubuntu1/installer/windows/ui.wxs sqlitebrowser-3.11.1/installer/windows/ui.wxs --- sqlitebrowser-3.10.100ubuntu1/installer/windows/ui.wxs 1970-01-01 00:00:00.000000000 +0000 +++ sqlitebrowser-3.11.1/installer/windows/ui.wxs 2019-02-19 23:51:34.000000000 +0000 @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + 1 + + + 1 + + + 1 + + + + + diff -Nru sqlitebrowser-3.10.100ubuntu1/installer/windows/variables.wxi sqlitebrowser-3.11.1/installer/windows/variables.wxi --- sqlitebrowser-3.10.100ubuntu1/installer/windows/variables.wxi 1970-01-01 00:00:00.000000000 +0000 +++ sqlitebrowser-3.11.1/installer/windows/variables.wxi 2019-02-19 23:51:34.000000000 +0000 @@ -0,0 +1,73 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -Nru sqlitebrowser-3.10.100ubuntu1/libs/antlr-2.7.7/CMakeLists.txt sqlitebrowser-3.11.1/libs/antlr-2.7.7/CMakeLists.txt --- sqlitebrowser-3.10.100ubuntu1/libs/antlr-2.7.7/CMakeLists.txt 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/libs/antlr-2.7.7/CMakeLists.txt 2019-02-19 23:51:34.000000000 +0000 @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 2.6) +cmake_minimum_required(VERSION 2.8.12.2) set(ANTLR_SRC src/ANTLRUtil.cpp diff -Nru sqlitebrowser-3.10.100ubuntu1/libs/DB4S_PATCH_02 sqlitebrowser-3.11.1/libs/DB4S_PATCH_02 --- sqlitebrowser-3.10.100ubuntu1/libs/DB4S_PATCH_02 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/libs/DB4S_PATCH_02 1970-01-01 00:00:00.000000000 +0000 @@ -1,18 +0,0 @@ -diff --git a/libs/qscintilla/Qt4Qt5/qsciscintilla.cpp b/libs/qscintilla/Qt4Qt5/qsciscintilla.cpp -index d40b742..4c9fe75 100644 ---- a/libs/qscintilla/Qt4Qt5/qsciscintilla.cpp -+++ b/libs/qscintilla/Qt4Qt5/qsciscintilla.cpp -@@ -386,7 +386,12 @@ void QsciScintilla::callTip() - ct = ct_entries.join("\n"); - } - -- QByteArray ct_ba = ct.toLatin1(); -+ QByteArray ct_ba; -+ if (isUtf8()) -+ ct_ba = ct.toUtf8(); -+ else -+ ct_ba = ct.toLatin1(); -+ - const char *cts = ct_ba.data(); - - SendScintilla(SCI_CALLTIPSHOW, adjustedCallTipPosition(shift), cts); diff -Nru sqlitebrowser-3.10.100ubuntu1/libs/DB4S_PATCH_03 sqlitebrowser-3.11.1/libs/DB4S_PATCH_03 --- sqlitebrowser-3.10.100ubuntu1/libs/DB4S_PATCH_03 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/libs/DB4S_PATCH_03 1970-01-01 00:00:00.000000000 +0000 @@ -1,70 +0,0 @@ -diff --git a/libs/qscintilla/Qt4Qt5/Qsci/qsciscintilla.h b/libs/qscintilla/Qt4Qt5/Qsci/qsciscintilla.h -index 3b5f185..49ca5cc 100644 ---- a/libs/qscintilla/Qt4Qt5/Qsci/qsciscintilla.h -+++ b/libs/qscintilla/Qt4Qt5/Qsci/qsciscintilla.h -@@ -2009,6 +2009,34 @@ public slots: - //! \sa zoomIn(), zoomOut() - virtual void zoomTo(int size); - -+ //! For performance, Scintilla does not measure the display width -+ //! of the document to determine the properties of the horizontal -+ //! scroll bar. Instead, an assumed width is used. This sets the -+ //! document width in pixels assumed by Scintilla to \a -+ //! pixelWidth. The default value is 2000. -+ //! -+ //! \sa getScrollWidth(), setScrollWidthTracking() -+ virtual void setScrollWidth(int pixelWidth); -+ -+ //! Gets the document width in pixels assumed by Scintilla. -+ //! -+ //! \sa setScrollWidth(), setScrollWidthTracking() -+ virtual int getScrollWidth() const; -+ -+ //! If scroll width tracking is enabled then the scroll width is -+ //! adjusted to ensure that all of the lines currently displayed -+ //! can be completely scrolled. This mode never adjusts the scroll -+ //! width to be narrower. -+ //! Sets the scroll width tracking to \a enabled. -+ //! -+ //! \sa setScrollWidth(), getScrollWidthTracking() -+ virtual void setScrollWidthTracking(bool enabled); -+ -+ //! Gets the current scroll width tracking mode. -+ //! -+ //! \sa getScrollWidth(), setScrollWidthTracking() -+ virtual bool getScrollWidthTracking() const; -+ - signals: - //! This signal is emitted whenever the cursor position changes. \a line - //! contains the line number and \a index contains the character index -diff --git a/libs/qscintilla/Qt4Qt5/qsciscintilla.cpp b/libs/qscintilla/Qt4Qt5/qsciscintilla.cpp -index 4c9fe75..31dc579 100644 ---- a/libs/qscintilla/Qt4Qt5/qsciscintilla.cpp -+++ b/libs/qscintilla/Qt4Qt5/qsciscintilla.cpp -@@ -4481,3 +4481,26 @@ static QColor asQColor(long sci_colour) - ((int)(sci_colour >> 8)) & 0x00ff, - ((int)(sci_colour >> 16)) & 0x00ff); - } -+ -+void QsciScintilla::setScrollWidth(int pixelWidth) -+{ -+ SendScintilla(SCI_SETSCROLLWIDTH, pixelWidth); -+} -+ -+int QsciScintilla::getScrollWidth() const -+{ -+ return SendScintilla(SCI_GETSCROLLWIDTH); -+} -+ -+void QsciScintilla::setScrollWidthTracking(bool enabled) -+{ -+ SendScintilla(SCI_SETSCROLLWIDTHTRACKING, enabled); -+} -+ -+bool QsciScintilla::getScrollWidthTracking() const -+{ -+ return SendScintilla(SCI_GETSCROLLWIDTHTRACKING); -+} -+ -+ -+ diff -Nru sqlitebrowser-3.10.100ubuntu1/libs/DB4S_PATCH_04 sqlitebrowser-3.11.1/libs/DB4S_PATCH_04 --- sqlitebrowser-3.10.100ubuntu1/libs/DB4S_PATCH_04 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/libs/DB4S_PATCH_04 1970-01-01 00:00:00.000000000 +0000 @@ -1,24 +0,0 @@ -diff --git a/libs/qscintilla/lexers/LexJSON.cpp b/libs/qscintilla/lexers/LexJSON.cpp -index 9c044e5..6c06061 100644 ---- a/libs/qscintilla/lexers/LexJSON.cpp -+++ b/libs/qscintilla/lexers/LexJSON.cpp -@@ -457,7 +457,9 @@ void SCI_METHOD LexerJSON::Fold(Sci_PositionU startPos, - LexAccessor styler(pAccess); - Sci_PositionU currLine = styler.GetLine(startPos); - Sci_PositionU endPos = startPos + length; -- int currLevel = styler.LevelAt(currLine) & SC_FOLDLEVELNUMBERMASK; -+ int currLevel = SC_FOLDLEVELBASE; -+ if (currLine > 0) -+ currLevel = styler.LevelAt(currLine - 1) >> 16; - int nextLevel = currLevel; - int visibleChars = 0; - for (Sci_PositionU i = startPos; i < endPos; i++) { -@@ -472,7 +474,7 @@ void SCI_METHOD LexerJSON::Fold(Sci_PositionU startPos, - } - } - if (atEOL || i == (endPos-1)) { -- int level = currLevel; -+ int level = currLevel | nextLevel << 16; - if (!visibleChars && options.foldCompact) { - level |= SC_FOLDLEVELWHITEFLAG; - } else if (nextLevel > currLevel) { diff -Nru sqlitebrowser-3.10.100ubuntu1/libs/DB4S_PATCH_05 sqlitebrowser-3.11.1/libs/DB4S_PATCH_05 --- sqlitebrowser-3.10.100ubuntu1/libs/DB4S_PATCH_05 1970-01-01 00:00:00.000000000 +0000 +++ sqlitebrowser-3.11.1/libs/DB4S_PATCH_05 2019-02-19 23:51:34.000000000 +0000 @@ -0,0 +1,363 @@ +--- QScintilla_gpl-2.10.8/Qt4Qt5/qscintilla.pro 2018-10-01 15:46:06.000000000 +0200 ++++ qscintilla/Qt4Qt5/qscintilla.pro 2018-11-21 19:51:25.870248673 +0100 +@@ -23,24 +23,12 @@ + !win32:VERSION = 13.2.1 + + TEMPLATE = lib +-CONFIG += qt warn_off thread exceptions hide_symbols +- +-CONFIG(debug, debug|release) { +- mac: { +- TARGET = qscintilla2_qt$${QT_MAJOR_VERSION}_debug +- } else { +- win32: { +- TARGET = qscintilla2_qt$${QT_MAJOR_VERSION}d +- } else { +- TARGET = qscintilla2_qt$${QT_MAJOR_VERSION} +- } +- } +-} else { +- TARGET = qscintilla2_qt$${QT_MAJOR_VERSION} +-} +- ++TARGET = qscintilla2 ++CONFIG += qt warn_off thread exceptions hide_symbols staticlib debug_and_release + INCLUDEPATH += . ../include ../lexlib ../src + ++QMAKE_CXXFLAGS += -std=c++11 ++ + !CONFIG(staticlib) { + DEFINES += QSCINTILLA_MAKE_DLL + } +@@ -59,11 +47,6 @@ + DEFINES += QT_NO_ACCESSIBILITY + } + +-# For old versions of GCC. +-unix:!macx { +- CONFIG += c++11 +-} +- + # Comment this in if you want the internal Scintilla classes to be placed in a + # Scintilla namespace rather than pollute the global namespace. + #DEFINES += SCI_NAMESPACE +@@ -97,69 +80,20 @@ + + HEADERS = \ + ./Qsci/qsciglobal.h \ +- ./Qsci/qsciscintilla.h \ +- ./Qsci/qsciscintillabase.h \ +- ./Qsci/qsciabstractapis.h \ +- ./Qsci/qsciapis.h \ + ./Qsci/qscicommand.h \ + ./Qsci/qscicommandset.h \ + ./Qsci/qscidocument.h \ +- ./Qsci/qscilexer.h \ +- ./Qsci/qscilexeravs.h \ +- ./Qsci/qscilexerbash.h \ +- ./Qsci/qscilexerbatch.h \ +- ./Qsci/qscilexercmake.h \ +- ./Qsci/qscilexercoffeescript.h \ +- ./Qsci/qscilexercpp.h \ +- ./Qsci/qscilexercsharp.h \ +- ./Qsci/qscilexercss.h \ +- ./Qsci/qscilexercustom.h \ +- ./Qsci/qscilexerd.h \ +- ./Qsci/qscilexerdiff.h \ +- ./Qsci/qscilexeredifact.h \ +- ./Qsci/qscilexerfortran.h \ +- ./Qsci/qscilexerfortran77.h \ +- ./Qsci/qscilexerhtml.h \ +- ./Qsci/qscilexeridl.h \ +- ./Qsci/qscilexerjava.h \ +- ./Qsci/qscilexerjavascript.h \ +- ./Qsci/qscilexerjson.h \ +- ./Qsci/qscilexerlua.h \ +- ./Qsci/qscilexermakefile.h \ +- ./Qsci/qscilexermarkdown.h \ +- ./Qsci/qscilexermatlab.h \ +- ./Qsci/qscilexeroctave.h \ +- ./Qsci/qscilexerpascal.h \ +- ./Qsci/qscilexerperl.h \ +- ./Qsci/qscilexerpostscript.h \ +- ./Qsci/qscilexerpo.h \ +- ./Qsci/qscilexerpov.h \ +- ./Qsci/qscilexerproperties.h \ +- ./Qsci/qscilexerpython.h \ +- ./Qsci/qscilexerruby.h \ +- ./Qsci/qscilexerspice.h \ +- ./Qsci/qscilexersql.h \ +- ./Qsci/qscilexertcl.h \ +- ./Qsci/qscilexertex.h \ +- ./Qsci/qscilexerverilog.h \ +- ./Qsci/qscilexervhdl.h \ +- ./Qsci/qscilexerxml.h \ +- ./Qsci/qscilexeryaml.h \ +- ./Qsci/qscimacro.h \ + ./Qsci/qsciprinter.h \ + ./Qsci/qscistyle.h \ + ./Qsci/qscistyledtext.h \ + ListBoxQt.h \ +- SciAccessibility.h \ +- SciClasses.h \ + SciNamespace.h \ +- ScintillaQt.h \ + ../include/ILexer.h \ + ../include/Platform.h \ +- ../include/Sci_Position.h \ + ../include/SciLexer.h \ + ../include/Scintilla.h \ + ../include/ScintillaWidget.h \ ++ ../include/Sci_Position.h \ + ../lexlib/Accessor.h \ + ../lexlib/CharacterCategory.h \ + ../lexlib/CharacterSet.h \ +@@ -170,7 +104,6 @@ + ../lexlib/LexerSimple.h \ + ../lexlib/OptionSet.h \ + ../lexlib/PropSetSimple.h \ +- ../lexlib/StringCopy.h \ + ../lexlib/StyleContext.h \ + ../lexlib/SubStyles.h \ + ../lexlib/WordList.h \ +@@ -184,15 +117,12 @@ + ../src/ContractionState.h \ + ../src/Decoration.h \ + ../src/Document.h \ +- ../src/EditModel.h \ + ../src/Editor.h \ +- ../src/EditView.h \ + ../src/ExternalLexer.h \ + ../src/FontQuality.h \ + ../src/Indicator.h \ + ../src/KeyMap.h \ + ../src/LineMarker.h \ +- ../src/MarginView.h \ + ../src/Partitioning.h \ + ../src/PerLine.h \ + ../src/PositionCache.h \ +@@ -205,7 +135,26 @@ + ../src/UnicodeFromUTF8.h \ + ../src/UniConversion.h \ + ../src/ViewStyle.h \ +- ../src/XPM.h ++ ../src/XPM.h \ ++ ../src/Position.h \ ++ ../src/SparseVector.h \ ++ ./Qsci/qsciscintilla.h \ ++ ./Qsci/qsciscintillabase.h \ ++ ./Qsci/qsciabstractapis.h \ ++ ./Qsci/qsciapis.h \ ++ ./Qsci/qscilexer.h \ ++ ./Qsci/qscilexercustom.h \ ++ ./Qsci/qscilexersql.h \ ++ ./Qsci/qscilexerjson.h \ ++ ./Qsci/qscilexerhtml.h \ ++ ./Qsci/qscilexerxml.h \ ++ ./Qsci/qscilexerjavascript.h \ ++ ./Qsci/qscilexercpp.h \ ++ ./Qsci/qscilexerpython.h \ ++ ./Qsci/qscimacro.h \ ++ SciClasses.h \ ++ ScintillaQt.h \ ++ SciAccessibility.h + + SOURCES = \ + qsciscintilla.cpp \ +@@ -216,161 +165,28 @@ + qscicommandset.cpp \ + qscidocument.cpp \ + qscilexer.cpp \ +- qscilexeravs.cpp \ +- qscilexerbash.cpp \ +- qscilexerbatch.cpp \ +- qscilexercmake.cpp \ +- qscilexercoffeescript.cpp \ +- qscilexercpp.cpp \ +- qscilexercsharp.cpp \ +- qscilexercss.cpp \ + qscilexercustom.cpp \ +- qscilexerd.cpp \ +- qscilexerdiff.cpp \ +- qscilexeredifact.cpp \ +- qscilexerfortran.cpp \ +- qscilexerfortran77.cpp \ ++ qscilexersql.cpp \ ++ qscilexerjson.cpp \ + qscilexerhtml.cpp \ +- qscilexeridl.cpp \ +- qscilexerjava.cpp \ ++ qscilexerxml.cpp \ + qscilexerjavascript.cpp \ +- qscilexerjson.cpp \ +- qscilexerlua.cpp \ +- qscilexermakefile.cpp \ +- qscilexermarkdown.cpp \ +- qscilexermatlab.cpp \ +- qscilexeroctave.cpp \ +- qscilexerpascal.cpp \ +- qscilexerperl.cpp \ +- qscilexerpostscript.cpp \ +- qscilexerpo.cpp \ +- qscilexerpov.cpp \ +- qscilexerproperties.cpp \ ++ qscilexercpp.cpp \ + qscilexerpython.cpp \ +- qscilexerruby.cpp \ +- qscilexerspice.cpp \ +- qscilexersql.cpp \ +- qscilexertcl.cpp \ +- qscilexertex.cpp \ +- qscilexerverilog.cpp \ +- qscilexervhdl.cpp \ +- qscilexerxml.cpp \ +- qscilexeryaml.cpp \ + qscimacro.cpp \ + qsciprinter.cpp \ + qscistyle.cpp \ + qscistyledtext.cpp \ +- MacPasteboardMime.cpp \ +- InputMethod.cpp \ +- SciAccessibility.cpp \ ++ MacPasteboardMime.cpp \ ++ InputMethod.cpp \ + SciClasses.cpp \ + ListBoxQt.cpp \ + PlatQt.cpp \ + ScintillaQt.cpp \ +- ../lexers/LexA68k.cpp \ +- ../lexers/LexAbaqus.cpp \ +- ../lexers/LexAda.cpp \ +- ../lexers/LexAPDL.cpp \ +- ../lexers/LexAsm.cpp \ +- ../lexers/LexAsn1.cpp \ +- ../lexers/LexASY.cpp \ +- ../lexers/LexAU3.cpp \ +- ../lexers/LexAVE.cpp \ +- ../lexers/LexAVS.cpp \ +- ../lexers/LexBaan.cpp \ +- ../lexers/LexBash.cpp \ +- ../lexers/LexBasic.cpp \ +- ../lexers/LexBatch.cpp \ +- ../lexers/LexBibTeX.cpp \ +- ../lexers/LexBullant.cpp \ +- ../lexers/LexCaml.cpp \ +- ../lexers/LexCLW.cpp \ +- ../lexers/LexCmake.cpp \ +- ../lexers/LexCOBOL.cpp \ +- ../lexers/LexCoffeeScript.cpp \ +- ../lexers/LexConf.cpp \ +- ../lexers/LexCPP.cpp \ +- ../lexers/LexCrontab.cpp \ +- ../lexers/LexCsound.cpp \ +- ../lexers/LexCSS.cpp \ +- ../lexers/LexD.cpp \ +- ../lexers/LexDiff.cpp \ +- ../lexers/LexDMAP.cpp \ +- ../lexers/LexDMIS.cpp \ +- ../lexers/LexECL.cpp \ +- ../lexers/LexEDIFACT.cpp \ +- ../lexers/LexEiffel.cpp \ +- ../lexers/LexErlang.cpp \ +- ../lexers/LexErrorList.cpp \ +- ../lexers/LexEScript.cpp \ +- ../lexers/LexFlagship.cpp \ +- ../lexers/LexForth.cpp \ +- ../lexers/LexFortran.cpp \ +- ../lexers/LexGAP.cpp \ +- ../lexers/LexGui4Cli.cpp \ +- ../lexers/LexHaskell.cpp \ +- ../lexers/LexHex.cpp \ +- ../lexers/LexHTML.cpp \ +- ../lexers/LexInno.cpp \ +- ../lexers/LexJSON.cpp \ +- ../lexers/LexKix.cpp \ +- ../lexers/LexKVIrc.cpp \ +- ../lexers/LexLaTeX.cpp \ +- ../lexers/LexLisp.cpp \ +- ../lexers/LexLout.cpp \ +- ../lexers/LexLua.cpp \ +- ../lexers/LexMagik.cpp \ +- ../lexers/LexMake.cpp \ +- ../lexers/LexMarkdown.cpp \ +- ../lexers/LexMatlab.cpp \ +- ../lexers/LexMetapost.cpp \ +- ../lexers/LexMMIXAL.cpp \ +- ../lexers/LexModula.cpp \ +- ../lexers/LexMPT.cpp \ +- ../lexers/LexMSSQL.cpp \ +- ../lexers/LexMySQL.cpp \ +- ../lexers/LexNimrod.cpp \ +- ../lexers/LexNsis.cpp \ +- ../lexers/LexNull.cpp \ +- ../lexers/LexOpal.cpp \ +- ../lexers/LexOScript.cpp \ +- ../lexers/LexPascal.cpp \ +- ../lexers/LexPB.cpp \ +- ../lexers/LexPerl.cpp \ +- ../lexers/LexPLM.cpp \ +- ../lexers/LexPO.cpp \ +- ../lexers/LexPOV.cpp \ +- ../lexers/LexPowerPro.cpp \ +- ../lexers/LexPowerShell.cpp \ +- ../lexers/LexProgress.cpp \ +- ../lexers/LexProps.cpp \ +- ../lexers/LexPS.cpp \ +- ../lexers/LexPython.cpp \ +- ../lexers/LexR.cpp \ +- ../lexers/LexRebol.cpp \ +- ../lexers/LexRegistry.cpp \ +- ../lexers/LexRuby.cpp \ +- ../lexers/LexRust.cpp \ +- ../lexers/LexScriptol.cpp \ +- ../lexers/LexSmalltalk.cpp \ +- ../lexers/LexSML.cpp \ +- ../lexers/LexSorcus.cpp \ +- ../lexers/LexSpecman.cpp \ +- ../lexers/LexSpice.cpp \ ++ SciAccessibility.cpp \ + ../lexers/LexSQL.cpp \ +- ../lexers/LexSTTXT.cpp \ +- ../lexers/LexTACL.cpp \ +- ../lexers/LexTADS3.cpp \ +- ../lexers/LexTAL.cpp \ +- ../lexers/LexTCL.cpp \ +- ../lexers/LexTCMD.cpp \ +- ../lexers/LexTeX.cpp \ +- ../lexers/LexTxt2tags.cpp \ +- ../lexers/LexVB.cpp \ +- ../lexers/LexVerilog.cpp \ +- ../lexers/LexVHDL.cpp \ +- ../lexers/LexVisualProlog.cpp \ +- ../lexers/LexYAML.cpp \ ++ ../lexers/LexJSON.cpp \ ++ ../lexers/LexHTML.cpp \ + ../lexlib/Accessor.cpp \ + ../lexlib/CharacterCategory.cpp \ + ../lexlib/CharacterSet.cpp \ +@@ -391,20 +207,20 @@ + ../src/ContractionState.cpp \ + ../src/Decoration.cpp \ + ../src/Document.cpp \ +- ../src/EditModel.cpp \ + ../src/Editor.cpp \ ++ ../src/EditModel.cpp \ + ../src/EditView.cpp \ + ../src/ExternalLexer.cpp \ + ../src/Indicator.cpp \ +- ../src/KeyMap.cpp \ ++ ../src/KeyMap.cpp \ + ../src/LineMarker.cpp \ + ../src/MarginView.cpp \ + ../src/PerLine.cpp \ + ../src/PositionCache.cpp \ +- ../src/RESearch.cpp \ ++ ../src/RESearch.cpp \ + ../src/RunStyles.cpp \ +- ../src/ScintillaBase.cpp \ +- ../src/Selection.cpp \ ++ ../src/ScintillaBase.cpp \ ++ ../src/Selection.cpp \ + ../src/Style.cpp \ + ../src/UniConversion.cpp \ + ../src/ViewStyle.cpp \ diff -Nru sqlitebrowser-3.10.100ubuntu1/libs/DB4S_PATCH_06 sqlitebrowser-3.11.1/libs/DB4S_PATCH_06 --- sqlitebrowser-3.10.100ubuntu1/libs/DB4S_PATCH_06 1970-01-01 00:00:00.000000000 +0000 +++ sqlitebrowser-3.11.1/libs/DB4S_PATCH_06 2019-02-19 23:51:34.000000000 +0000 @@ -0,0 +1,131 @@ +--- QScintilla_gpl-2.10.8/src/Catalogue.cpp 2018-10-01 15:41:57.000000000 +0200 ++++ qscintilla/src/Catalogue.cpp 2018-11-18 16:09:52.796704316 +0100 +@@ -77,124 +77,10 @@ + + //++Autogenerated -- run scripts/LexGen.py to regenerate + //**\(\tLINK_LEXER(\*);\n\) +- LINK_LEXER(lmA68k); +- LINK_LEXER(lmAbaqus); +- LINK_LEXER(lmAda); +- LINK_LEXER(lmAPDL); +- LINK_LEXER(lmAs); +- LINK_LEXER(lmAsm); +- LINK_LEXER(lmAsn1); +- LINK_LEXER(lmASY); +- LINK_LEXER(lmAU3); +- LINK_LEXER(lmAVE); +- LINK_LEXER(lmAVS); +- LINK_LEXER(lmBaan); +- LINK_LEXER(lmBash); +- LINK_LEXER(lmBatch); +- LINK_LEXER(lmBibTeX); +- LINK_LEXER(lmBlitzBasic); +- LINK_LEXER(lmBullant); +- LINK_LEXER(lmCaml); +- LINK_LEXER(lmClw); +- LINK_LEXER(lmClwNoCase); +- LINK_LEXER(lmCmake); +- LINK_LEXER(lmCOBOL); +- LINK_LEXER(lmCoffeeScript); +- LINK_LEXER(lmConf); +- LINK_LEXER(lmCPP); +- LINK_LEXER(lmCPPNoCase); +- LINK_LEXER(lmCsound); +- LINK_LEXER(lmCss); +- LINK_LEXER(lmD); +- LINK_LEXER(lmDiff); +- LINK_LEXER(lmDMAP); +- LINK_LEXER(lmDMIS); +- LINK_LEXER(lmECL); +- LINK_LEXER(lmEDIFACT); +- LINK_LEXER(lmEiffel); +- LINK_LEXER(lmEiffelkw); +- LINK_LEXER(lmErlang); +- LINK_LEXER(lmErrorList); +- LINK_LEXER(lmESCRIPT); +- LINK_LEXER(lmF77); +- LINK_LEXER(lmFlagShip); +- LINK_LEXER(lmForth); +- LINK_LEXER(lmFortran); +- LINK_LEXER(lmFreeBasic); +- LINK_LEXER(lmGAP); +- LINK_LEXER(lmGui4Cli); +- LINK_LEXER(lmHaskell); +- LINK_LEXER(lmHTML); +- LINK_LEXER(lmIHex); +- LINK_LEXER(lmInno); +- LINK_LEXER(lmJSON); +- LINK_LEXER(lmKix); +- LINK_LEXER(lmKVIrc); +- LINK_LEXER(lmLatex); +- LINK_LEXER(lmLISP); +- LINK_LEXER(lmLiterateHaskell); +- LINK_LEXER(lmLot); +- LINK_LEXER(lmLout); +- LINK_LEXER(lmLua); +- LINK_LEXER(lmMagikSF); +- LINK_LEXER(lmMake); +- LINK_LEXER(lmMarkdown); +- LINK_LEXER(lmMatlab); +- LINK_LEXER(lmMETAPOST); +- LINK_LEXER(lmMMIXAL); +- LINK_LEXER(lmModula); +- LINK_LEXER(lmMSSQL); +- LINK_LEXER(lmMySQL); +- LINK_LEXER(lmNimrod); +- LINK_LEXER(lmNncrontab); +- LINK_LEXER(lmNsis); +- LINK_LEXER(lmNull); +- LINK_LEXER(lmOctave); +- LINK_LEXER(lmOpal); +- LINK_LEXER(lmOScript); +- LINK_LEXER(lmPascal); +- LINK_LEXER(lmPB); +- LINK_LEXER(lmPerl); +- LINK_LEXER(lmPHPSCRIPT); +- LINK_LEXER(lmPLM); +- LINK_LEXER(lmPO); +- LINK_LEXER(lmPOV); +- LINK_LEXER(lmPowerPro); +- LINK_LEXER(lmPowerShell); +- LINK_LEXER(lmProgress); +- LINK_LEXER(lmProps); +- LINK_LEXER(lmPS); +- LINK_LEXER(lmPureBasic); +- LINK_LEXER(lmPython); +- LINK_LEXER(lmR); +- LINK_LEXER(lmREBOL); +- LINK_LEXER(lmRegistry); +- LINK_LEXER(lmRuby); +- LINK_LEXER(lmRust); +- LINK_LEXER(lmScriptol); +- LINK_LEXER(lmSmalltalk); +- LINK_LEXER(lmSML); +- LINK_LEXER(lmSorc); +- LINK_LEXER(lmSpecman); +- LINK_LEXER(lmSpice); +- LINK_LEXER(lmSQL); +- LINK_LEXER(lmSrec); +- LINK_LEXER(lmSTTXT); +- LINK_LEXER(lmTACL); +- LINK_LEXER(lmTADS3); +- LINK_LEXER(lmTAL); +- LINK_LEXER(lmTCL); +- LINK_LEXER(lmTCMD); +- LINK_LEXER(lmTEHex); +- LINK_LEXER(lmTeX); +- LINK_LEXER(lmTxt2tags); +- LINK_LEXER(lmVB); +- LINK_LEXER(lmVBScript); +- LINK_LEXER(lmVerilog); +- LINK_LEXER(lmVHDL); +- LINK_LEXER(lmVisualProlog); +- LINK_LEXER(lmXML); +- LINK_LEXER(lmYAML); ++ LINK_LEXER(lmSQL); ++ LINK_LEXER(lmJSON); ++ LINK_LEXER(lmHTML); ++ LINK_LEXER(lmXML); + + //--Autogenerated -- end of automatically generated section + diff -Nru sqlitebrowser-3.10.100ubuntu1/libs/qcustomplot-source/CMakeLists.txt sqlitebrowser-3.11.1/libs/qcustomplot-source/CMakeLists.txt --- sqlitebrowser-3.10.100ubuntu1/libs/qcustomplot-source/CMakeLists.txt 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/libs/qcustomplot-source/CMakeLists.txt 2019-02-19 23:51:34.000000000 +0000 @@ -1,8 +1,9 @@ -cmake_minimum_required(VERSION 2.8.7) +cmake_minimum_required(VERSION 2.8.12.2) set(CMAKE_AUTOMOC ON) set(CMAKE_INCLUDE_CURRENT_DIR ON) -find_package(Qt5Widgets REQUIRED) + +find_package(Qt5 REQUIRED COMPONENTS Widgets PrintSupport) set(QCUSTOMPLOT_SRC qcustomplot.cpp @@ -17,4 +18,4 @@ add_library(qcustomplot ${QCUSTOMPLOT_SRC} ${QCUSTOMPLOT_HDR} ${QCUSTOMPLOT_MOC}) -qt5_use_modules(qcustomplot Widgets PrintSupport) +target_link_libraries(qcustomplot Qt5::Widgets Qt5::PrintSupport) diff -Nru sqlitebrowser-3.10.100ubuntu1/libs/qhexedit/CMakeLists.txt sqlitebrowser-3.11.1/libs/qhexedit/CMakeLists.txt --- sqlitebrowser-3.10.100ubuntu1/libs/qhexedit/CMakeLists.txt 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/libs/qhexedit/CMakeLists.txt 2019-02-19 23:51:34.000000000 +0000 @@ -1,8 +1,9 @@ -cmake_minimum_required(VERSION 2.8.7) +cmake_minimum_required(VERSION 2.8.12.2) set(CMAKE_AUTOMOC ON) set(CMAKE_INCLUDE_CURRENT_DIR ON) -find_package(Qt5Widgets REQUIRED) + +find_package(Qt5 REQUIRED COMPONENTS Widgets) set(QHEXEDIT_SRC src/qhexedit.cpp @@ -22,4 +23,4 @@ add_library(qhexedit ${QHEXEDIT_SRC} ${QHEXEDIT_HDR} ${QHEXEDIT_MOC}) -qt5_use_modules(qhexedit Widgets) +target_link_libraries(qhexedit Qt5::Widgets) diff -Nru sqlitebrowser-3.10.100ubuntu1/libs/qhexedit/src/qhexedit.cpp sqlitebrowser-3.11.1/libs/qhexedit/src/qhexedit.cpp --- sqlitebrowser-3.10.100ubuntu1/libs/qhexedit/src/qhexedit.cpp 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/libs/qhexedit/src/qhexedit.cpp 2019-02-19 23:51:34.000000000 +0000 @@ -807,13 +807,16 @@ void QHexEdit::mousePressEvent(QMouseEvent * event) { - _blink = false; - viewport()->update(); - qint64 cPos = cursorPosition(event->pos()); - if (cPos >= 0) + if (event->button() != Qt::RightButton) { - resetSelection(cPos); - setCursorPosition(cPos); + _blink = false; + viewport()->update(); + qint64 cPos = cursorPosition(event->pos()); + if (cPos >= 0) + { + resetSelection(cPos); + setCursorPosition(cPos); + } } } diff -Nru sqlitebrowser-3.10.100ubuntu1/libs/qscintilla/ChangeLog sqlitebrowser-3.11.1/libs/qscintilla/ChangeLog --- sqlitebrowser-3.10.100ubuntu1/libs/qscintilla/ChangeLog 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/libs/qscintilla/ChangeLog 2019-02-19 23:51:34.000000000 +0000 @@ -1,5 +1,396 @@ +2018-10-01 Phil Thompson + + * NEWS: + Released as v2.10.8. + [57c8b6076899] [2.10.8] <2.10-maint> + +2018-09-30 Phil Thompson + + * NEWS: + Updated the NEWS file. + [345f597a4a90] <2.10-maint> + +2018-08-02 Phil Thompson + + * qt/SciAccessibility.cpp: + More accessibility fixes. + [2cc2d6865762] <2.10-maint> + + * qt/SciAccessibility.cpp, qt/SciAccessibility.h, qt/qscintilla.pro: + Refactored the accessibility support to use less of the Qt stuff + which doesn't handle CR-LF end-of-lines. + [8b2d6e3e73d8] <2.10-maint> + +2018-07-15 Phil Thompson + + * NEWS: + Updated the NEWS file. + [fc1deaccc716] <2.10-maint> + +2018-06-29 Phil Thompson + + * .hgtags: + Added tag 2.10.7 for changeset 60598a703fd4 + [8828f9ad7dc6] <2.10-maint> + + * NEWS: + Released as v2.10.7. + [60598a703fd4] [2.10.7] <2.10-maint> + + * NEWS: + Updated the NEWS file. + [92edf18019ec] <2.10-maint> + +2018-06-25 Phil Thompson + + * NEWS, Python/sip/qsciscintillabase.sip: + Tweaked the signature of the QscoScintillaBase::SCN_MACRORECORD() + signal so that it matches what Qt uses so that the signal test + passes. + [bfcd9319329a] <2.10-maint> + +2018-06-23 Phil Thompson + + * .hgtags: + Added tag 2.10.6 for changeset dc0993c72a05 + [9c774d0a9694] <2.10-maint> + + * NEWS: + Released as v2.10.6. + [dc0993c72a05] [2.10.6] <2.10-maint> + +2018-06-22 Phil Thompson + + * .hgtags: + Added tag 2.10.5 for changeset f35b3a43a241 + [8cf5694ca328] <2.10-maint> + + * NEWS: + Released as v2.10.5. + [f35b3a43a241] [2.10.5] <2.10-maint> + +2018-06-21 Phil Thompson + + * NEWS: + Updated the NEWS file. + [12cb1a2f5ec6] <2.10-maint> + +2018-06-19 Phil Thompson + + * NEWS, Python/sip/qscistyle.sip, qt/qscistyle.cpp, qt/qscistyle.h: + Added setStyle() to QsciStyle. + [cf5281041224] <2.10-maint> + +2018-06-16 Phil Thompson + + * qt/qscintilla_es.qm, qt/qscintilla_es.ts: + Updated Spanish translations from Jaime Seuma. + [a479b9f5436f] <2.10-maint> + +2018-06-09 Phil Thompson + + * qt/qscintilla_cs.qm, qt/qscintilla_de.qm, qt/qscintilla_de.ts, + qt/qscintilla_es.qm, qt/qscintilla_fr.qm, qt/qscintilla_pt_br.qm: + Updated German translations from Detlev. + [f69379899fb3] <2.10-maint> + +2018-06-04 Phil Thompson + + * NEWS, Python/configure.py: + Implemented support for the .dist-info directory. + [387aa9bf6ad8] <2.10-maint> + +2018-06-03 Phil Thompson + + * NEWS, Python/sip/qsciscintillabase.sip, qt/PlatQt.cpp, + qt/ScintillaQt.cpp, qt/qsciscintillabase.cpp, + qt/qsciscintillabase.h: + Fixes for font changes caused by dragging to a different display. + [27b1f435e27a] <2.10-maint> + +2018-05-29 Phil Thompson + + * qt/PlatQt.cpp: + Disable to macOS use of integer font metrics for Qt5 as it is + (probably) specific to Qt4. + [c32fe0c4e55d] <2.10-maint> + + * qt/PlatQt.cpp: + Fixed cursor positioning when using a secondary display with + different scaling to the primary. + [20420b7c4a4d] <2.10-maint> + +2018-05-22 Phil Thompson + + * qt/qscilexerverilog.cpp: + Fix the handling of the 'fold.verilog.flags' property in the Verilog + lexer. + [9b698ba38c2b] <2.10-maint> + +2018-05-16 Phil Thompson + + * qt/qscilexerverilog.cpp, qt/qscintilla_cs.ts, qt/qscintilla_de.ts, + qt/qscintilla_es.ts, qt/qscintilla_fr.ts, qt/qscintilla_pt_br.ts: + Added the missing descriptions of inactive styles in the Verilog + lexer. + [4be691232e03] <2.10-maint> + +2018-05-15 Phil Thompson + + * qt/qscilexer.h: + Updated the QsciLexer::keywords() documentation to point out that + sets are numbered from 1. + [5954b91e7ec1] <2.10-maint> + +2018-04-26 Phil Thompson + + * Python/sip/qscilexeredifact.sip, qt/qscilexeredifact.cpp, + qt/qscilexeredifact.h: + Added some default colours to the EDIFACT lexer. + [175598286833] <2.10-maint> + +2018-04-20 Phil Thompson + + * NEWS, Python/sip/qscilexeredifact.sip, qt/qscilexeredifact.cpp, + qt/qscilexeredifact.h, qt/qscintilla.pro, qt/qscintilla_cs.ts, + qt/qscintilla_de.ts, qt/qscintilla_es.ts, qt/qscintilla_fr.ts, + qt/qscintilla_pt_br.ts: + Added the QsciLexerEDIFACT class. + [c1e31857f3e7] <2.10-maint> + + * qt/qsciscintilla.cpp, qt/qsciscintillabase.cpp, + qt/qsciscintillabase.h: + If the context menu is invoked when the cursor is outside the + selection then the selection is cleared and the cursor moved to + where the mouse was clicked. + [7d230dad9379] <2.10-maint> + +2018-04-19 Phil Thompson + + * Python/sip/qsciscintilla.sip, qt/qscintilla.pro, + qt/qsciscintilla.cpp, qt/qsciscintilla.h: + Control-wheel up/down will now zoom in and out. + [ba0049fe03b6] <2.10-maint> + +2018-04-11 Phil Thompson + + * qt/PlatQt.cpp, qt/qsciabstractapis.cpp, qt/qscilexerpython.cpp, + qt/qscilexerxml.cpp, qt/qsciscintilla.cpp: + Removed warning messages about unused variables. + [c2008ef93ee0] <2.10-maint> + + * qt/qscicommandset.cpp: + Fixed the saving of alternative keys in the settings. + [687470e937c1] <2.10-maint> + + * qt/ScintillaQt.cpp, qt/qsciapis.cpp, qt/qsciscintilla.cpp: + Various stylistic changes to eliminate some warning messages. + [dc753169870e] <2.10-maint> + +2018-04-10 Phil Thompson + + * .hgtags: + Added tag 2.10.4 for changeset 24cb0edc89a9 + [05ada666e2cf] <2.10-maint> + + * NEWS: + Released as v2.10.4. + [24cb0edc89a9] [2.10.4] <2.10-maint> + + * qt/SciAccessibility.cpp: + Fixed the retrieval of accessibility attributes. + [e430a7dd7818] <2.10-maint> + +2018-04-07 Phil Thompson + + * qt/qscilexer.cpp: + Use STYLE_MAX to define the maximum number of styles. + [23ca0cad0227] <2.10-maint> + +2018-03-11 Phil Thompson + + * qt/qscintilla.pro: + Force QT_NO_ACCESSIBILITY when building against Qt4. + [b65f48ec1852] <2.10-maint> + +2018-02-27 Phil Thompson + + * .hgtags: + Added tag 2.10.3 for changeset bc769d6fcf53 + [279625f1d8c9] <2.10-maint> + + * NEWS: + Released as v2.10.3. + [bc769d6fcf53] [2.10.3] <2.10-maint> + + * rb-product: + Updated the PyQt5 wheel dependency. + [7cef6e297ddf] <2.10-maint> + + * NEWS: + Updated the NEWS file. + [1e073e29eca4] <2.10-maint> + +2018-02-10 Phil Thompson + + * qsci/api/python/Python-3.7.api: + Added the API file for Python v3.70b1. + [6d0032674462] <2.10-maint> + +2018-02-07 Phil Thompson + + * qt/qsciscintilla.cpp: + Fix the hotspot active background colour. + [45cfd8c68394] <2.10-maint> + + * qt/SciAccessibility.cpp, qt/SciAccessibility.h: + Completed the accessibility support. + [2af3a5b045fa] <2.10-maint> + +2018-02-06 Phil Thompson + + * qt/SciAccessibility.cpp, qt/SciAccessibility.h: + Implemented all of the accessible interface except for attributes(). + [434539a243dc] <2.10-maint> + + * qt/SciAccessibility.cpp: + Implemented more of the accessible interface. + [e8f3df5442cc] <2.10-maint> + + * qt/SciAccessibility.cpp, qt/SciAccessibility.h, qt/ScintillaQt.cpp: + Implemented more of the accessible interface. + [fb26d9fdba27] <2.10-maint> + +2018-02-05 Phil Thompson + + * qt/SciAccessibility.cpp, qt/SciAccessibility.h, qt/ScintillaQt.cpp, + qt/qsciscintillabase.cpp: + More accessibility progress. + [ea2432348b49] <2.10-maint> + + * qt/SciAccessibility.cpp, qt/SciAccessibility.h, qt/ScintillaQt.cpp: + Some progress on accessibility. + [055345b62d7b] <2.10-maint> + + * qt/qscintilla.pro: + Updated the version of the shared library. + [fb50133f8770] <2.10-maint> + +2018-02-04 Phil Thompson + + * qt/SciAccessibility.cpp, qt/SciAccessibility.h, qt/qscintilla.pro, + qt/qsciscintillabase.cpp: + Added the stubs for accessibility support. + [61e00a4f944f] <2.10-maint> + +2017-11-23 Phil Thompson + + * .hgtags: + Added tag 2.10.2 for changeset bdfb9584af36 + [d127fc44d4c4] <2.10-maint> + + * NEWS: + Released as v2.10.2. + [bdfb9584af36] [2.10.2] <2.10-maint> + + * qt/qscintilla.pro: + Bumed the .so minor version. + [4bb28057d3c2] <2.10-maint> + +2017-11-13 Phil Thompson + + * NEWS, Python/sip/qsciscintilla.sip, qt/qsciscintilla.cpp, + qt/qsciscintilla.h: + Added setScrollWidth() , scrollWidth, setScrollWidthTracking() and + scrollWidthTracking() to QsciScintilla. + [c6e64e99cb12] <2.10-maint> + +2017-11-01 Phil Thompson + + * qt/qsciscintilla.cpp: + Fixed the handling of UTF8 call tips. + [7aa9b863f330] <2.10-maint> + +2017-07-04 Phil Thompson + + * qt/qscintilla.pro: + Fixed case sensitivity of a couple of file names. + [e9d9b80fd61b] <2.10-maint> + + * .hgignore: + Ignore the new-style build directory. + [6c20c6b41705] <2.10-maint> + +2017-07-03 Phil Thompson + + * .hgtags: + Added tag 2.10.1 for changeset 20e0e2d419ba + [d6eba6c9e5ce] <2.10-maint> + + * NEWS: + Released as v2.10.1. + [20e0e2d419ba] [2.10.1] <2.10-maint> + + * rb-product: + Updated the PyQt5 dependency to v5.9. + [83200ee6b295] <2.10-maint> + +2017-05-24 Phil Thompson + + * lib/README.doc: + Updated the docs regarding use of build options supported by + Scintilla. + [fe6e73057d9e] <2.10-maint> + +2017-05-15 Phil Thompson + + * Python/sip/qscilexer.sip, Python/sip/qscilexeravs.sip, + Python/sip/qscilexerbash.sip, Python/sip/qscilexerbatch.sip, + Python/sip/qscilexercoffeescript.sip, Python/sip/qscilexercpp.sip, + Python/sip/qscilexercss.sip, Python/sip/qscilexerd.sip, + Python/sip/qscilexerfortran77.sip, Python/sip/qscilexerhtml.sip, + Python/sip/qscilexerlua.sip, Python/sip/qscilexerpascal.sip, + Python/sip/qscilexerperl.sip, Python/sip/qscilexerpostscript.sip, + Python/sip/qscilexerpov.sip, Python/sip/qscilexerpython.sip, + Python/sip/qscilexerruby.sip, Python/sip/qscilexerspice.sip, + Python/sip/qscilexersql.sip, Python/sip/qscilexertcl.sip, + Python/sip/qscilexerverilog.sip, Python/sip/qscilexervhdl.sip: + Added the lexer-specific re-implementations of previously internal + methods to the Python bindings. + [e8402392cedc] <2.10-maint> + +2017-03-22 Phil Thompson + + * qt/qscintilla.pro: + Enabled explicit C++11 support for Linux for old versions of GCC. + [e0e0b344ccf1] <2.10-maint> + +2017-03-16 Phil Thompson + + * qt/qscilexer.cpp: + Changed the default macOS font to Menlo 12pt as it has bold etc. + [39d69e37d352] <2.10-maint> + + * qt/qscilexer.cpp: + Changed the default font on macOS to Monaco 12pt. + [9030535e2457] <2.10-maint> + + * Python/configure.py: + Fixed the rpath change of the Python bindings on macOS. + [dd45e695812a] <2.10-maint> + +2017-02-22 Phil Thompson + + * qt/qscintilla.pro: + Fixed the .pro file so that debug builds match the features file. + [1aedd0c6eeda] <2.10-maint> + 2017-02-20 Phil Thompson + * .hgtags: + Added tag 2.10 for changeset 6c07847b2835 + [2442f8d2df34] + * NEWS: Released as v2.10. [6c07847b2835] [2.10] diff -Nru sqlitebrowser-3.10.100ubuntu1/libs/qscintilla/NEWS sqlitebrowser-3.11.1/libs/qscintilla/NEWS --- sqlitebrowser-3.10.100ubuntu1/libs/qscintilla/NEWS 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/libs/qscintilla/NEWS 2019-02-19 23:51:34.000000000 +0000 @@ -1,3 +1,39 @@ +v2.10.8 1st October 2018 + - Bug fixes. + +v2.10.7 2nd July 2018 + - Bug fixes. + +v2.10.6 24th June 2018 + - A pseudo-release to create a version number for updated Python wheels. + +v2.10.5 23rd June 2018 + - Added the QsciLexerEDIFACT class. + - Added setStyle() to QsciStyle. + - Control-wheel scroll will now zoom in and out of the document. + - Buffered drawing is now disabled by default. + - The Python bindings create a PEP 376 .dist-info directory on installation + that provides version information for dependent packages and allows pip to + uninstall. + - Added the --no-dist-info option to the Python bindings' configure.py. + - Bug fixes. + +v2.10.4 10th April 2018 + - Bug fixes. + +v2.10.3 26th February 2018 + - Added accessibility support. + - Added the API file for Python v3.7. + +v2.10.2 23rd November 2017 + - Added setScrollWidth() , scrollWidth, setScrollWidthTracking() and + scrollWidthTracking() to QsciScintilla. + - Bug fixes. + +v2.10.1 3rd July 2017 + - Changed the default font on macOS to Menlo 12pt. + - Added previously internal lexer methods to the Python bindings. + v2.10 20th February 2017 - Based on Scintilla v3.7.2. - Added the QsciLexerJSON class. diff -Nru sqlitebrowser-3.10.100ubuntu1/libs/qscintilla/Qt4Qt5/CMakeLists.txt sqlitebrowser-3.11.1/libs/qscintilla/Qt4Qt5/CMakeLists.txt --- sqlitebrowser-3.10.100ubuntu1/libs/qscintilla/Qt4Qt5/CMakeLists.txt 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/libs/qscintilla/Qt4Qt5/CMakeLists.txt 2019-02-19 23:51:34.000000000 +0000 @@ -1,11 +1,13 @@ -cmake_minimum_required(VERSION 2.8.7) +cmake_minimum_required(VERSION 2.8.12.2) -set(CMAKE_AUTOMOC ON) +# Disable AUTOMOC because it cannot be made to work with QScintilla +set(CMAKE_AUTOMOC OFF) set(CMAKE_INCLUDE_CURRENT_DIR ON) -find_package(Qt5Widgets REQUIRED) + +find_package(Qt5 REQUIRED COMPONENTS PrintSupport Widgets) if(APPLE) - find_package(Qt5MacExtras) + find_package(Qt5 REQUIRED COMPONENTS MacExtras) endif() add_definitions(-DSCINTILLA_QT) @@ -38,6 +40,7 @@ ListBoxQt.cpp PlatQt.cpp ScintillaQt.cpp + SciAccessibility.cpp ../lexers/LexSQL.cpp ../lexers/LexJSON.cpp ../lexers/LexHTML.cpp @@ -160,14 +163,17 @@ ./Qsci/qscimacro.h SciClasses.h ScintillaQt.h + SciAccessibility.h ) +QT5_WRAP_CPP(QSCINTILLA_WRAP_MOC_HDR ${QSCINTILLA_MOC_HDR}) + include_directories(. ../include ../lexlib ../src) -add_library(qscintilla2 ${QSCINTILLA_SRC} ${QSCINTILLA_HDR} ${QSCINTILLA_MOC_HDR} ${QSCINTILLA_MOC}) +add_library(qscintilla2 ${QSCINTILLA_SRC} ${QSCINTILLA_HDR} ${QSCINTILLA_MOC_HDR} ${QSCINTILLA_MOC} ${QSCINTILLA_WRAP_MOC_HDR}) + +target_link_libraries(qscintilla2 Qt5::Widgets Qt5::PrintSupport) if (APPLE) - qt5_use_modules(qscintilla2 Widgets PrintSupport MacExtras) -else() - qt5_use_modules(qscintilla2 Widgets PrintSupport) + target_link_libraries(qscintilla2 Qt5::MacExtras) endif() diff -Nru sqlitebrowser-3.10.100ubuntu1/libs/qscintilla/Qt4Qt5/ListBoxQt.cpp sqlitebrowser-3.11.1/libs/qscintilla/Qt4Qt5/ListBoxQt.cpp --- sqlitebrowser-3.10.100ubuntu1/libs/qscintilla/Qt4Qt5/ListBoxQt.cpp 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/libs/qscintilla/Qt4Qt5/ListBoxQt.cpp 2019-02-19 23:51:34.000000000 +0000 @@ -1,7 +1,7 @@ // This module implements the specialisation of QListBox that handles the // Scintilla double-click callback. // -// Copyright (c) 2017 Riverbank Computing Limited +// Copyright (c) 2018 Riverbank Computing Limited // // This file is part of QScintilla. // diff -Nru sqlitebrowser-3.10.100ubuntu1/libs/qscintilla/Qt4Qt5/ListBoxQt.h sqlitebrowser-3.11.1/libs/qscintilla/Qt4Qt5/ListBoxQt.h --- sqlitebrowser-3.10.100ubuntu1/libs/qscintilla/Qt4Qt5/ListBoxQt.h 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/libs/qscintilla/Qt4Qt5/ListBoxQt.h 2019-02-19 23:51:34.000000000 +0000 @@ -1,7 +1,7 @@ // This defines the specialisation of QListBox that handles the Scintilla // double-click callback. // -// Copyright (c) 2017 Riverbank Computing Limited +// Copyright (c) 2018 Riverbank Computing Limited // // This file is part of QScintilla. // diff -Nru sqlitebrowser-3.10.100ubuntu1/libs/qscintilla/Qt4Qt5/MacPasteboardMime.cpp sqlitebrowser-3.11.1/libs/qscintilla/Qt4Qt5/MacPasteboardMime.cpp --- sqlitebrowser-3.10.100ubuntu1/libs/qscintilla/Qt4Qt5/MacPasteboardMime.cpp 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/libs/qscintilla/Qt4Qt5/MacPasteboardMime.cpp 2019-02-19 23:51:34.000000000 +0000 @@ -2,7 +2,7 @@ // OS/X. It is a separate file to avoid clashes between OS/X and Scintilla // data types. // -// Copyright (c) 2017 Riverbank Computing Limited +// Copyright (c) 2018 Riverbank Computing Limited // // This file is part of QScintilla. // diff -Nru sqlitebrowser-3.10.100ubuntu1/libs/qscintilla/Qt4Qt5/PlatQt.cpp sqlitebrowser-3.11.1/libs/qscintilla/Qt4Qt5/PlatQt.cpp --- sqlitebrowser-3.10.100ubuntu1/libs/qscintilla/Qt4Qt5/PlatQt.cpp 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/libs/qscintilla/Qt4Qt5/PlatQt.cpp 2019-02-19 23:51:34.000000000 +0000 @@ -1,6 +1,6 @@ // This module implements the portability layer for the Qt port of Scintilla. // -// Copyright (c) 2017 Riverbank Computing Limited +// Copyright (c) 2018 Riverbank Computing Limited // // This file is part of QScintilla. // @@ -105,7 +105,7 @@ strategy = QFont::PreferDefault; } -#if defined(Q_OS_MAC) +#if defined(Q_OS_MAC) && QT_VERSION < 0x050000 #if QT_VERSION >= 0x040700 strategy = static_cast(strategy | QFont::ForceIntegerMetrics); #else @@ -171,7 +171,7 @@ void Init(WindowID wid); void Init(SurfaceID sid, WindowID); void Init(QPainter *p); - void InitPixMap(int width, int height, Surface *, WindowID wid); + void InitPixMap(int width, int height, Surface *sid, WindowID wid); void Release(); bool Initialised() {return painter;} @@ -207,7 +207,7 @@ XYPOSITION WidthChar(Font &font_, char ch); XYPOSITION Ascent(Font &font_); XYPOSITION Descent(Font &font_); - XYPOSITION InternalLeading(Font &font_) {return 0;} + XYPOSITION InternalLeading(Font &font_) {Q_UNUSED(font_); return 0;} XYPOSITION ExternalLeading(Font &font_); XYPOSITION Height(Font &font_); XYPOSITION AverageCharWidth(Font &font_); @@ -216,7 +216,7 @@ void FlushCachedState(); void SetUnicodeMode(bool unicodeMode_) {unicodeMode = unicodeMode_;} - void SetDBCSMode(int codePage) {} + void SetDBCSMode(int codePage) {Q_UNUSED(codePage);} void DrawXPM(PRectangle rc, const XPM *xpm); @@ -281,7 +281,7 @@ painter = p; } -void SurfaceImpl::InitPixMap(int width, int height, Surface *, WindowID wid) +void SurfaceImpl::InitPixMap(int width, int height, Surface *sid, WindowID wid) { Release(); @@ -298,6 +298,8 @@ painter = new QPainter(pd); my_resources = true; + + SetUnicodeMode(static_cast(sid)->unicodeMode); } void SurfaceImpl::Release() @@ -539,6 +541,8 @@ void SurfaceImpl::DrawRGBAImage(PRectangle rc, int width, int height, const unsigned char *pixelsImage) { + Q_UNUSED(width); + Q_UNUSED(height); Q_ASSERT(painter); const QImage *qim = reinterpret_cast(pixelsImage); @@ -1004,15 +1008,14 @@ return false; } -long Platform::SendScintilla(WindowID w, unsigned int msg, - unsigned long wParam, long lParam) +long Platform::SendScintilla(WindowID, unsigned int, unsigned long, long) { // This is never called. return 0; } -long Platform::SendScintillaPointer(WindowID w, unsigned int msg, - unsigned long wParam, void *lParam) +long Platform::SendScintillaPointer(WindowID, unsigned int, unsigned long, + void *) { // This is never called. return 0; diff -Nru sqlitebrowser-3.10.100ubuntu1/libs/qscintilla/Qt4Qt5/Qsci/qsciabstractapis.h sqlitebrowser-3.11.1/libs/qscintilla/Qt4Qt5/Qsci/qsciabstractapis.h --- sqlitebrowser-3.10.100ubuntu1/libs/qscintilla/Qt4Qt5/Qsci/qsciabstractapis.h 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/libs/qscintilla/Qt4Qt5/Qsci/qsciabstractapis.h 2019-02-19 23:51:34.000000000 +0000 @@ -1,6 +1,6 @@ // This module defines interface to the QsciAbstractAPIs class. // -// Copyright (c) 2017 Riverbank Computing Limited +// Copyright (c) 2018 Riverbank Computing Limited // // This file is part of QScintilla. // diff -Nru sqlitebrowser-3.10.100ubuntu1/libs/qscintilla/Qt4Qt5/Qsci/qsciapis.h sqlitebrowser-3.11.1/libs/qscintilla/Qt4Qt5/Qsci/qsciapis.h --- sqlitebrowser-3.10.100ubuntu1/libs/qscintilla/Qt4Qt5/Qsci/qsciapis.h 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/libs/qscintilla/Qt4Qt5/Qsci/qsciapis.h 2019-02-19 23:51:34.000000000 +0000 @@ -1,6 +1,6 @@ // This module defines interface to the QsciAPIs class. // -// Copyright (c) 2017 Riverbank Computing Limited +// Copyright (c) 2018 Riverbank Computing Limited // // This file is part of QScintilla. // diff -Nru sqlitebrowser-3.10.100ubuntu1/libs/qscintilla/Qt4Qt5/Qsci/qscicommand.h sqlitebrowser-3.11.1/libs/qscintilla/Qt4Qt5/Qsci/qscicommand.h --- sqlitebrowser-3.10.100ubuntu1/libs/qscintilla/Qt4Qt5/Qsci/qscicommand.h 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/libs/qscintilla/Qt4Qt5/Qsci/qscicommand.h 2019-02-19 23:51:34.000000000 +0000 @@ -1,6 +1,6 @@ // This defines the interface to the QsciCommand class. // -// Copyright (c) 2017 Riverbank Computing Limited +// Copyright (c) 2018 Riverbank Computing Limited // // This file is part of QScintilla. // diff -Nru sqlitebrowser-3.10.100ubuntu1/libs/qscintilla/Qt4Qt5/Qsci/qscicommandset.h sqlitebrowser-3.11.1/libs/qscintilla/Qt4Qt5/Qsci/qscicommandset.h --- sqlitebrowser-3.10.100ubuntu1/libs/qscintilla/Qt4Qt5/Qsci/qscicommandset.h 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/libs/qscintilla/Qt4Qt5/Qsci/qscicommandset.h 2019-02-19 23:51:34.000000000 +0000 @@ -1,6 +1,6 @@ // This defines the interface to the QsciCommandSet class. // -// Copyright (c) 2017 Riverbank Computing Limited +// Copyright (c) 2018 Riverbank Computing Limited // // This file is part of QScintilla. // diff -Nru sqlitebrowser-3.10.100ubuntu1/libs/qscintilla/Qt4Qt5/Qsci/qscidocument.h sqlitebrowser-3.11.1/libs/qscintilla/Qt4Qt5/Qsci/qscidocument.h --- sqlitebrowser-3.10.100ubuntu1/libs/qscintilla/Qt4Qt5/Qsci/qscidocument.h 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/libs/qscintilla/Qt4Qt5/Qsci/qscidocument.h 2019-02-19 23:51:34.000000000 +0000 @@ -1,6 +1,6 @@ // This defines the interface to the QsciDocument class. // -// Copyright (c) 2017 Riverbank Computing Limited +// Copyright (c) 2018 Riverbank Computing Limited // // This file is part of QScintilla. // diff -Nru sqlitebrowser-3.10.100ubuntu1/libs/qscintilla/Qt4Qt5/Qsci/qsciglobal.h sqlitebrowser-3.11.1/libs/qscintilla/Qt4Qt5/Qsci/qsciglobal.h --- sqlitebrowser-3.10.100ubuntu1/libs/qscintilla/Qt4Qt5/Qsci/qsciglobal.h 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/libs/qscintilla/Qt4Qt5/Qsci/qsciglobal.h 2019-02-19 23:51:34.000000000 +0000 @@ -1,6 +1,6 @@ // This module defines various things common to all of the Scintilla Qt port. // -// Copyright (c) 2017 Riverbank Computing Limited +// Copyright (c) 2018 Riverbank Computing Limited // // This file is part of QScintilla. // @@ -24,8 +24,8 @@ #include -#define QSCINTILLA_VERSION 0x020a00 -#define QSCINTILLA_VERSION_STR "2.10" +#define QSCINTILLA_VERSION 0x020a08 +#define QSCINTILLA_VERSION_STR "2.10.8" // Define QSCINTILLA_MAKE_DLL to create a QScintilla shared library, or diff -Nru sqlitebrowser-3.10.100ubuntu1/libs/qscintilla/Qt4Qt5/Qsci/qscilexercpp.h sqlitebrowser-3.11.1/libs/qscintilla/Qt4Qt5/Qsci/qscilexercpp.h --- sqlitebrowser-3.10.100ubuntu1/libs/qscintilla/Qt4Qt5/Qsci/qscilexercpp.h 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/libs/qscintilla/Qt4Qt5/Qsci/qscilexercpp.h 2019-02-19 23:51:34.000000000 +0000 @@ -1,6 +1,6 @@ // This defines the interface to the QsciLexerCPP class. // -// Copyright (c) 2017 Riverbank Computing Limited +// Copyright (c) 2018 Riverbank Computing Limited // // This file is part of QScintilla. // diff -Nru sqlitebrowser-3.10.100ubuntu1/libs/qscintilla/Qt4Qt5/Qsci/qscilexercustom.h sqlitebrowser-3.11.1/libs/qscintilla/Qt4Qt5/Qsci/qscilexercustom.h --- sqlitebrowser-3.10.100ubuntu1/libs/qscintilla/Qt4Qt5/Qsci/qscilexercustom.h 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/libs/qscintilla/Qt4Qt5/Qsci/qscilexercustom.h 2019-02-19 23:51:34.000000000 +0000 @@ -1,6 +1,6 @@ // This defines the interface to the QsciLexerCustom class. // -// Copyright (c) 2017 Riverbank Computing Limited +// Copyright (c) 2018 Riverbank Computing Limited // // This file is part of QScintilla. // diff -Nru sqlitebrowser-3.10.100ubuntu1/libs/qscintilla/Qt4Qt5/Qsci/qscilexer.h sqlitebrowser-3.11.1/libs/qscintilla/Qt4Qt5/Qsci/qscilexer.h --- sqlitebrowser-3.10.100ubuntu1/libs/qscintilla/Qt4Qt5/Qsci/qscilexer.h 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/libs/qscintilla/Qt4Qt5/Qsci/qscilexer.h 2019-02-19 23:51:34.000000000 +0000 @@ -1,6 +1,6 @@ // This defines the interface to the QsciLexer class. // -// Copyright (c) 2017 Riverbank Computing Limited +// Copyright (c) 2018 Riverbank Computing Limited // // This file is part of QScintilla. // @@ -153,8 +153,8 @@ virtual int indentationGuideView() const; //! Returns the set of keywords for the keyword set \a set recognised - //! by the lexer as a space separated string. 0 is returned if there - //! is no such set. + //! by the lexer as a space separated string. Keyword sets are numbered + //! from 1. 0 is returned if there is no such set. virtual const char *keywords(int set) const; //! Returns the number of the style used for whitespace. The default diff -Nru sqlitebrowser-3.10.100ubuntu1/libs/qscintilla/Qt4Qt5/Qsci/qscilexerhtml.h sqlitebrowser-3.11.1/libs/qscintilla/Qt4Qt5/Qsci/qscilexerhtml.h --- sqlitebrowser-3.10.100ubuntu1/libs/qscintilla/Qt4Qt5/Qsci/qscilexerhtml.h 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/libs/qscintilla/Qt4Qt5/Qsci/qscilexerhtml.h 2019-02-19 23:51:34.000000000 +0000 @@ -1,6 +1,6 @@ // This defines the interface to the QsciLexerHTML class. // -// Copyright (c) 2017 Riverbank Computing Limited +// Copyright (c) 2018 Riverbank Computing Limited // // This file is part of QScintilla. // diff -Nru sqlitebrowser-3.10.100ubuntu1/libs/qscintilla/Qt4Qt5/Qsci/qscilexerjavascript.h sqlitebrowser-3.11.1/libs/qscintilla/Qt4Qt5/Qsci/qscilexerjavascript.h --- sqlitebrowser-3.10.100ubuntu1/libs/qscintilla/Qt4Qt5/Qsci/qscilexerjavascript.h 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/libs/qscintilla/Qt4Qt5/Qsci/qscilexerjavascript.h 2019-02-19 23:51:34.000000000 +0000 @@ -1,6 +1,6 @@ // This defines the interface to the QsciLexerJavaScript class. // -// Copyright (c) 2017 Riverbank Computing Limited +// Copyright (c) 2018 Riverbank Computing Limited // // This file is part of QScintilla. // diff -Nru sqlitebrowser-3.10.100ubuntu1/libs/qscintilla/Qt4Qt5/Qsci/qscilexerjson.h sqlitebrowser-3.11.1/libs/qscintilla/Qt4Qt5/Qsci/qscilexerjson.h --- sqlitebrowser-3.10.100ubuntu1/libs/qscintilla/Qt4Qt5/Qsci/qscilexerjson.h 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/libs/qscintilla/Qt4Qt5/Qsci/qscilexerjson.h 2019-02-19 23:51:34.000000000 +0000 @@ -1,6 +1,6 @@ // This defines the interface to the QsciLexerJSON class. // -// Copyright (c) 2017 Riverbank Computing Limited +// Copyright (c) 2018 Riverbank Computing Limited // // This file is part of QScintilla. // diff -Nru sqlitebrowser-3.10.100ubuntu1/libs/qscintilla/Qt4Qt5/Qsci/qscilexerpython.h sqlitebrowser-3.11.1/libs/qscintilla/Qt4Qt5/Qsci/qscilexerpython.h --- sqlitebrowser-3.10.100ubuntu1/libs/qscintilla/Qt4Qt5/Qsci/qscilexerpython.h 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/libs/qscintilla/Qt4Qt5/Qsci/qscilexerpython.h 2019-02-19 23:51:34.000000000 +0000 @@ -1,6 +1,6 @@ // This defines the interface to the QsciLexerPython class. // -// Copyright (c) 2017 Riverbank Computing Limited +// Copyright (c) 2018 Riverbank Computing Limited // // This file is part of QScintilla. // diff -Nru sqlitebrowser-3.10.100ubuntu1/libs/qscintilla/Qt4Qt5/Qsci/qscilexersql.h sqlitebrowser-3.11.1/libs/qscintilla/Qt4Qt5/Qsci/qscilexersql.h --- sqlitebrowser-3.10.100ubuntu1/libs/qscintilla/Qt4Qt5/Qsci/qscilexersql.h 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/libs/qscintilla/Qt4Qt5/Qsci/qscilexersql.h 2019-02-19 23:51:34.000000000 +0000 @@ -1,6 +1,6 @@ // This defines the interface to the QsciLexerSQL class. // -// Copyright (c) 2017 Riverbank Computing Limited +// Copyright (c) 2018 Riverbank Computing Limited // // This file is part of QScintilla. // diff -Nru sqlitebrowser-3.10.100ubuntu1/libs/qscintilla/Qt4Qt5/Qsci/qscilexerxml.h sqlitebrowser-3.11.1/libs/qscintilla/Qt4Qt5/Qsci/qscilexerxml.h --- sqlitebrowser-3.10.100ubuntu1/libs/qscintilla/Qt4Qt5/Qsci/qscilexerxml.h 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/libs/qscintilla/Qt4Qt5/Qsci/qscilexerxml.h 2019-02-19 23:51:34.000000000 +0000 @@ -1,6 +1,6 @@ // This defines the interface to the QsciLexerXML class. // -// Copyright (c) 2017 Riverbank Computing Limited +// Copyright (c) 2018 Riverbank Computing Limited // // This file is part of QScintilla. // diff -Nru sqlitebrowser-3.10.100ubuntu1/libs/qscintilla/Qt4Qt5/Qsci/qscimacro.h sqlitebrowser-3.11.1/libs/qscintilla/Qt4Qt5/Qsci/qscimacro.h --- sqlitebrowser-3.10.100ubuntu1/libs/qscintilla/Qt4Qt5/Qsci/qscimacro.h 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/libs/qscintilla/Qt4Qt5/Qsci/qscimacro.h 2019-02-19 23:51:34.000000000 +0000 @@ -1,6 +1,6 @@ // This defines the interface to the QsciMacro class. // -// Copyright (c) 2017 Riverbank Computing Limited +// Copyright (c) 2018 Riverbank Computing Limited // // This file is part of QScintilla. // diff -Nru sqlitebrowser-3.10.100ubuntu1/libs/qscintilla/Qt4Qt5/Qsci/qsciprinter.h sqlitebrowser-3.11.1/libs/qscintilla/Qt4Qt5/Qsci/qsciprinter.h --- sqlitebrowser-3.10.100ubuntu1/libs/qscintilla/Qt4Qt5/Qsci/qsciprinter.h 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/libs/qscintilla/Qt4Qt5/Qsci/qsciprinter.h 2019-02-19 23:51:34.000000000 +0000 @@ -1,6 +1,6 @@ // This module defines interface to the QsciPrinter class. // -// Copyright (c) 2017 Riverbank Computing Limited +// Copyright (c) 2018 Riverbank Computing Limited // // This file is part of QScintilla. // diff -Nru sqlitebrowser-3.10.100ubuntu1/libs/qscintilla/Qt4Qt5/Qsci/qsciscintillabase.h sqlitebrowser-3.11.1/libs/qscintilla/Qt4Qt5/Qsci/qsciscintillabase.h --- sqlitebrowser-3.10.100ubuntu1/libs/qscintilla/Qt4Qt5/Qsci/qsciscintillabase.h 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/libs/qscintilla/Qt4Qt5/Qsci/qsciscintillabase.h 2019-02-19 23:51:34.000000000 +0000 @@ -1,6 +1,6 @@ // This class defines the "official" low-level API. // -// Copyright (c) 2017 Riverbank Computing Limited +// Copyright (c) 2018 Riverbank Computing Limited // // This file is part of QScintilla. // @@ -3662,6 +3662,9 @@ //! \sa canInsertFromMimeData(), fromMimeData() virtual QMimeData *toMimeData(const QByteArray &text, bool rectangular) const; + //! \reimp + virtual void changeEvent(QEvent *e); + //! Re-implemented to handle the context menu. virtual void contextMenuEvent(QContextMenuEvent *e); @@ -3728,6 +3731,9 @@ //! \internal Convert encoded bytes to a QString. QString bytesAsText(const char *bytes) const; + //! \internal A helper for QsciScintilla::contextMenuEvent(). + bool contextMenuNeeded(int x, int y) const; + private slots: void handleVSb(int value); void handleHSb(int value); diff -Nru sqlitebrowser-3.10.100ubuntu1/libs/qscintilla/Qt4Qt5/Qsci/qsciscintilla.h sqlitebrowser-3.11.1/libs/qscintilla/Qt4Qt5/Qsci/qsciscintilla.h --- sqlitebrowser-3.10.100ubuntu1/libs/qscintilla/Qt4Qt5/Qsci/qsciscintilla.h 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/libs/qscintilla/Qt4Qt5/Qsci/qsciscintilla.h 2019-02-19 23:51:34.000000000 +0000 @@ -1,7 +1,7 @@ // This module defines the "official" high-level API of the Qt port of // Scintilla. // -// Copyright (c) 2017 Riverbank Computing Limited +// Copyright (c) 2018 Riverbank Computing Limited // // This file is part of QScintilla. // @@ -1155,6 +1155,16 @@ //! \sa setHotspotForegroundColor(), resetHotspotBackgroundColor() void resetHotspotForegroundColor(); + //! Gets the assumed document width in pixels. + //! + //! \sa setScrollWidth(), setScrollWidthTracking() + int scrollWidth() const; + + //! Returns true if scroll width tracking is enabled. + //! + //! \sa scrollWidth(), setScrollWidthTracking() + bool scrollWidthTracking() const; + //! The fold margin may be drawn as a one pixel sized checkerboard pattern //! of two colours, \a fore and \a back. //! @@ -1370,6 +1380,23 @@ //! \sa setMatchedBraceIndicator() void resetMatchedBraceIndicator(); + //! For performance, QScintilla does not measure the display width of the + //! document to determine the properties of the horizontal scroll bar. + //! Instead, an assumed width is used. This sets the document width in + //! pixels assumed by QScintilla to \a pixelWidth. The default value is + //! 2000. + //! + //! \sa scrollWidth(), setScrollWidthTracking() + void setScrollWidth(int pixelWidth); + + //! If scroll width tracking is enabled then the scroll width is adjusted + //! to ensure that all of the lines currently displayed can be completely + //! scrolled. This mode never adjusts the scroll width to be narrower. + //! This sets the scroll width tracking to \a enabled. + //! + //! \sa setScrollWidth(), scrollWidthTracking() + void setScrollWidthTracking(bool enabled); + //! Sets the mode used to draw tab characters when whitespace is visible to //! \a mode. The default is to use an arrow. //! @@ -2009,34 +2036,6 @@ //! \sa zoomIn(), zoomOut() virtual void zoomTo(int size); - //! For performance, Scintilla does not measure the display width - //! of the document to determine the properties of the horizontal - //! scroll bar. Instead, an assumed width is used. This sets the - //! document width in pixels assumed by Scintilla to \a - //! pixelWidth. The default value is 2000. - //! - //! \sa getScrollWidth(), setScrollWidthTracking() - virtual void setScrollWidth(int pixelWidth); - - //! Gets the document width in pixels assumed by Scintilla. - //! - //! \sa setScrollWidth(), setScrollWidthTracking() - virtual int getScrollWidth() const; - - //! If scroll width tracking is enabled then the scroll width is - //! adjusted to ensure that all of the lines currently displayed - //! can be completely scrolled. This mode never adjusts the scroll - //! width to be narrower. - //! Sets the scroll width tracking to \a enabled. - //! - //! \sa setScrollWidth(), getScrollWidthTracking() - virtual void setScrollWidthTracking(bool enabled); - - //! Gets the current scroll width tracking mode. - //! - //! \sa getScrollWidth(), setScrollWidthTracking() - virtual bool getScrollWidthTracking() const; - signals: //! This signal is emitted whenever the cursor position changes. \a line //! contains the line number and \a index contains the character index @@ -2128,6 +2127,9 @@ //! \reimp virtual void contextMenuEvent(QContextMenuEvent *e); + //! \reimp + virtual void wheelEvent(QWheelEvent *e); + private slots: void handleCallTipClick(int dir); void handleCharAdded(int charadded); diff -Nru sqlitebrowser-3.10.100ubuntu1/libs/qscintilla/Qt4Qt5/Qsci/qscistyledtext.h sqlitebrowser-3.11.1/libs/qscintilla/Qt4Qt5/Qsci/qscistyledtext.h --- sqlitebrowser-3.10.100ubuntu1/libs/qscintilla/Qt4Qt5/Qsci/qscistyledtext.h 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/libs/qscintilla/Qt4Qt5/Qsci/qscistyledtext.h 2019-02-19 23:51:34.000000000 +0000 @@ -1,6 +1,6 @@ // This module defines interface to the QsciStyledText class. // -// Copyright (c) 2017 Riverbank Computing Limited +// Copyright (c) 2018 Riverbank Computing Limited // // This file is part of QScintilla. // diff -Nru sqlitebrowser-3.10.100ubuntu1/libs/qscintilla/Qt4Qt5/Qsci/qscistyle.h sqlitebrowser-3.11.1/libs/qscintilla/Qt4Qt5/Qsci/qscistyle.h --- sqlitebrowser-3.10.100ubuntu1/libs/qscintilla/Qt4Qt5/Qsci/qscistyle.h 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/libs/qscintilla/Qt4Qt5/Qsci/qscistyle.h 2019-02-19 23:51:34.000000000 +0000 @@ -1,6 +1,6 @@ // This module defines interface to the QsciStyle class. // -// Copyright (c) 2017 Riverbank Computing Limited +// Copyright (c) 2018 Riverbank Computing Limited // // This file is part of QScintilla. // @@ -55,21 +55,36 @@ }; //! Constructs a QsciStyle instance for style number \a style. If \a style - //! is negative then a new style number is automatically allocated. + //! is negative then a new style number is automatically allocated if + //! possible. If it is not possible then style() will return a negative + //! value. + //! + //! \sa style() QsciStyle(int style = -1); //! Constructs a QsciStyle instance for style number \a style. If \a style - //! is negative then a new style number is automatically allocated. The - //! styles description, color, paper color, font and end-of-line fill are - //! set to \a description, \a color, \a paper, \a font and \a eolFill - //! respectively. + //! is negative then a new style number is automatically allocated if + //! possible. If it is not possible then style() will return a negative + //! value. The styles description, color, paper color, font and + //! end-of-line fill are set to \a description, \a color, \a paper, \a font + //! and \a eolFill respectively. + //! + //! \sa style() QsciStyle(int style, const QString &description, const QColor &color, const QColor &paper, const QFont &font, bool eolFill = false); //! \internal Apply the style to a particular editor. void apply(QsciScintillaBase *sci) const; - //! Returns the number of the style. + //! The style's number is set to \a style. + //! + //! \sa style() + void setStyle(int style) {style_nr = style;} + + //! Returns the number of the style. This will be negative if the style is + //! invalid. + //! + //! \sa setStyle() int style() const {return style_nr;} //! The style's description is set to \a description. diff -Nru sqlitebrowser-3.10.100ubuntu1/libs/qscintilla/Qt4Qt5/qsciabstractapis.cpp sqlitebrowser-3.11.1/libs/qscintilla/Qt4Qt5/qsciabstractapis.cpp --- sqlitebrowser-3.10.100ubuntu1/libs/qscintilla/Qt4Qt5/qsciabstractapis.cpp 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/libs/qscintilla/Qt4Qt5/qsciabstractapis.cpp 2019-02-19 23:51:34.000000000 +0000 @@ -1,6 +1,6 @@ // This module implements the QsciAbstractAPIs class. // -// Copyright (c) 2017 Riverbank Computing Limited +// Copyright (c) 2018 Riverbank Computing Limited // // This file is part of QScintilla. // @@ -47,4 +47,5 @@ // Called when the user has made a selection from the auto-completion list. void QsciAbstractAPIs::autoCompletionSelected(const QString &selection) { + Q_UNUSED(selection); } diff -Nru sqlitebrowser-3.10.100ubuntu1/libs/qscintilla/Qt4Qt5/qsciapis.cpp sqlitebrowser-3.11.1/libs/qscintilla/Qt4Qt5/qsciapis.cpp --- sqlitebrowser-3.10.100ubuntu1/libs/qscintilla/Qt4Qt5/qsciapis.cpp 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/libs/qscintilla/Qt4Qt5/qsciapis.cpp 2019-02-19 23:51:34.000000000 +0000 @@ -1,6 +1,6 @@ // This module implements the QsciAPIs class. // -// Copyright (c) 2017 Riverbank Computing Limited +// Copyright (c) 2018 Riverbank Computing Limited // // This file is part of QScintilla. // @@ -128,7 +128,7 @@ // The worker thread ctor. QsciAPIsWorker::QsciAPIsWorker(QsciAPIs *apis) - : proxy(apis), prepared(0), abort(false) + : prepared(0), proxy(apis), abort(false) { } @@ -250,6 +250,9 @@ emit apiPreparationFinished(); return true; + + default: + break; } return QObject::event(e); diff -Nru sqlitebrowser-3.10.100ubuntu1/libs/qscintilla/Qt4Qt5/qscicommand.cpp sqlitebrowser-3.11.1/libs/qscintilla/Qt4Qt5/qscicommand.cpp --- sqlitebrowser-3.10.100ubuntu1/libs/qscintilla/Qt4Qt5/qscicommand.cpp 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/libs/qscintilla/Qt4Qt5/qscicommand.cpp 2019-02-19 23:51:34.000000000 +0000 @@ -1,6 +1,6 @@ // This module implements the QsciCommand class. // -// Copyright (c) 2017 Riverbank Computing Limited +// Copyright (c) 2018 Riverbank Computing Limited // // This file is part of QScintilla. // diff -Nru sqlitebrowser-3.10.100ubuntu1/libs/qscintilla/Qt4Qt5/qscicommandset.cpp sqlitebrowser-3.11.1/libs/qscintilla/Qt4Qt5/qscicommandset.cpp --- sqlitebrowser-3.10.100ubuntu1/libs/qscintilla/Qt4Qt5/qscicommandset.cpp 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/libs/qscintilla/Qt4Qt5/qscicommandset.cpp 2019-02-19 23:51:34.000000000 +0000 @@ -1,6 +1,6 @@ // This module implements the QsciCommandSet class. // -// Copyright (c) 2017 Riverbank Computing Limited +// Copyright (c) 2018 Riverbank Computing Limited // // This file is part of QScintilla. // @@ -937,7 +937,7 @@ qs.setValue(skey + "key", cmd->key()); // Write the alternate key. - qs.setValue(skey + "alt", cmd->key()); + qs.setValue(skey + "alt", cmd->alternateKey()); } return rc; diff -Nru sqlitebrowser-3.10.100ubuntu1/libs/qscintilla/Qt4Qt5/qscidocument.cpp sqlitebrowser-3.11.1/libs/qscintilla/Qt4Qt5/qscidocument.cpp --- sqlitebrowser-3.10.100ubuntu1/libs/qscintilla/Qt4Qt5/qscidocument.cpp 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/libs/qscintilla/Qt4Qt5/qscidocument.cpp 2019-02-19 23:51:34.000000000 +0000 @@ -1,6 +1,6 @@ // This module implements the QsciDocument class. // -// Copyright (c) 2017 Riverbank Computing Limited +// Copyright (c) 2018 Riverbank Computing Limited // // This file is part of QScintilla. // diff -Nru sqlitebrowser-3.10.100ubuntu1/libs/qscintilla/Qt4Qt5/qscilexer.cpp sqlitebrowser-3.11.1/libs/qscintilla/Qt4Qt5/qscilexer.cpp --- sqlitebrowser-3.10.100ubuntu1/libs/qscintilla/Qt4Qt5/qscilexer.cpp 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/libs/qscintilla/Qt4Qt5/qscilexer.cpp 2019-02-19 23:51:34.000000000 +0000 @@ -1,6 +1,6 @@ // This module implements the QsciLexer class. // -// Copyright (c) 2017 Riverbank Computing Limited +// Copyright (c) 2018 Riverbank Computing Limited // // This file is part of QScintilla. // @@ -36,11 +36,11 @@ autoIndStyle(-1), apiSet(0), attached_editor(0) { #if defined(Q_OS_WIN) - defFont = QFont("Verdana",10); + defFont = QFont("Verdana", 10); #elif defined(Q_OS_MAC) - defFont = QFont("Verdana", 12); + defFont = QFont("Menlo", 12); #else - defFont = QFont("Bitstream Vera Sans",9); + defFont = QFont("Bitstream Vera Sans", 9); #endif // Set the default fore and background colours. @@ -103,7 +103,7 @@ { if (!style_map->style_data_set) { - for (int i = 0; i < 128; ++i) + for (int i = 0; i <= QsciScintillaBase::STYLE_MAX; ++i) if (!description(i).isEmpty()) styleData(i); @@ -370,7 +370,7 @@ setStyleDefaults(); // Read the styles. - for (int i = 0; i < 128; ++i) + for (int i = 0; i <= QsciScintillaBase::STYLE_MAX; ++i) { // Ignore invalid styles. if (description(i).isEmpty()) @@ -570,7 +570,7 @@ setStyleDefaults(); // Write the styles. - for (int i = 0; i < 128; ++i) + for (int i = 0; i <= QsciScintillaBase::STYLE_MAX; ++i) { // Ignore invalid styles. if (description(i).isEmpty()) @@ -685,7 +685,7 @@ emit colorChanged(c, style); } else - for (int i = 0; i < 128; ++i) + for (int i = 0; i <= QsciScintillaBase::STYLE_MAX; ++i) if (!description(i).isEmpty()) setColor(c, i); } @@ -700,7 +700,7 @@ emit eolFillChanged(eolfill, style); } else - for (int i = 0; i < 128; ++i) + for (int i = 0; i <= QsciScintillaBase::STYLE_MAX; ++i) if (!description(i).isEmpty()) setEolFill(eolfill, i); } @@ -715,7 +715,7 @@ emit fontChanged(f, style); } else - for (int i = 0; i < 128; ++i) + for (int i = 0; i <= QsciScintillaBase::STYLE_MAX; ++i) if (!description(i).isEmpty()) setFont(f, i); } @@ -731,7 +731,7 @@ } else { - for (int i = 0; i < 128; ++i) + for (int i = 0; i <= QsciScintillaBase::STYLE_MAX; ++i) if (!description(i).isEmpty()) setPaper(c, i); diff -Nru sqlitebrowser-3.10.100ubuntu1/libs/qscintilla/Qt4Qt5/qscilexercpp.cpp sqlitebrowser-3.11.1/libs/qscintilla/Qt4Qt5/qscilexercpp.cpp --- sqlitebrowser-3.10.100ubuntu1/libs/qscintilla/Qt4Qt5/qscilexercpp.cpp 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/libs/qscintilla/Qt4Qt5/qscilexercpp.cpp 2019-02-19 23:51:34.000000000 +0000 @@ -1,6 +1,6 @@ // This module implements the QsciLexerCPP class. // -// Copyright (c) 2017 Riverbank Computing Limited +// Copyright (c) 2018 Riverbank Computing Limited // // This file is part of QScintilla. // diff -Nru sqlitebrowser-3.10.100ubuntu1/libs/qscintilla/Qt4Qt5/qscilexercustom.cpp sqlitebrowser-3.11.1/libs/qscintilla/Qt4Qt5/qscilexercustom.cpp --- sqlitebrowser-3.10.100ubuntu1/libs/qscintilla/Qt4Qt5/qscilexercustom.cpp 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/libs/qscintilla/Qt4Qt5/qscilexercustom.cpp 2019-02-19 23:51:34.000000000 +0000 @@ -1,6 +1,6 @@ // This module implements the QsciLexerCustom class. // -// Copyright (c) 2017 Riverbank Computing Limited +// Copyright (c) 2018 Riverbank Computing Limited // // This file is part of QScintilla. // diff -Nru sqlitebrowser-3.10.100ubuntu1/libs/qscintilla/Qt4Qt5/qscilexerhtml.cpp sqlitebrowser-3.11.1/libs/qscintilla/Qt4Qt5/qscilexerhtml.cpp --- sqlitebrowser-3.10.100ubuntu1/libs/qscintilla/Qt4Qt5/qscilexerhtml.cpp 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/libs/qscintilla/Qt4Qt5/qscilexerhtml.cpp 2019-02-19 23:51:34.000000000 +0000 @@ -1,6 +1,6 @@ // This module implements the QsciLexerHTML class. // -// Copyright (c) 2017 Riverbank Computing Limited +// Copyright (c) 2018 Riverbank Computing Limited // // This file is part of QScintilla. // diff -Nru sqlitebrowser-3.10.100ubuntu1/libs/qscintilla/Qt4Qt5/qscilexerjavascript.cpp sqlitebrowser-3.11.1/libs/qscintilla/Qt4Qt5/qscilexerjavascript.cpp --- sqlitebrowser-3.10.100ubuntu1/libs/qscintilla/Qt4Qt5/qscilexerjavascript.cpp 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/libs/qscintilla/Qt4Qt5/qscilexerjavascript.cpp 2019-02-19 23:51:34.000000000 +0000 @@ -1,6 +1,6 @@ // This module implements the QsciLexerJavaScript class. // -// Copyright (c) 2017 Riverbank Computing Limited +// Copyright (c) 2018 Riverbank Computing Limited // // This file is part of QScintilla. // diff -Nru sqlitebrowser-3.10.100ubuntu1/libs/qscintilla/Qt4Qt5/qscilexerjson.cpp sqlitebrowser-3.11.1/libs/qscintilla/Qt4Qt5/qscilexerjson.cpp --- sqlitebrowser-3.10.100ubuntu1/libs/qscintilla/Qt4Qt5/qscilexerjson.cpp 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/libs/qscintilla/Qt4Qt5/qscilexerjson.cpp 2019-02-19 23:51:34.000000000 +0000 @@ -1,6 +1,6 @@ // This module implements the QsciLexerJSON class. // -// Copyright (c) 2017 Riverbank Computing Limited +// Copyright (c) 2018 Riverbank Computing Limited // // This file is part of QScintilla. // diff -Nru sqlitebrowser-3.10.100ubuntu1/libs/qscintilla/Qt4Qt5/qscilexerpython.cpp sqlitebrowser-3.11.1/libs/qscintilla/Qt4Qt5/qscilexerpython.cpp --- sqlitebrowser-3.10.100ubuntu1/libs/qscintilla/Qt4Qt5/qscilexerpython.cpp 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/libs/qscintilla/Qt4Qt5/qscilexerpython.cpp 2019-02-19 23:51:34.000000000 +0000 @@ -1,6 +1,6 @@ // This module implements the QsciLexerPython class. // -// Copyright (c) 2017 Riverbank Computing Limited +// Copyright (c) 2018 Riverbank Computing Limited // // This file is part of QScintilla. // @@ -309,7 +309,7 @@ // Read properties from the settings. bool QsciLexerPython::readProperties(QSettings &qs,const QString &prefix) { - int rc = true, num; + int rc = true; fold_comments = qs.value(prefix + "foldcomments", false).toBool(); fold_compact = qs.value(prefix + "foldcompact", true).toBool(); diff -Nru sqlitebrowser-3.10.100ubuntu1/libs/qscintilla/Qt4Qt5/qscilexersql.cpp sqlitebrowser-3.11.1/libs/qscintilla/Qt4Qt5/qscilexersql.cpp --- sqlitebrowser-3.10.100ubuntu1/libs/qscintilla/Qt4Qt5/qscilexersql.cpp 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/libs/qscintilla/Qt4Qt5/qscilexersql.cpp 2019-02-19 23:51:34.000000000 +0000 @@ -1,6 +1,6 @@ // This module implements the QsciLexerSQL class. // -// Copyright (c) 2017 Riverbank Computing Limited +// Copyright (c) 2018 Riverbank Computing Limited // // This file is part of QScintilla. // diff -Nru sqlitebrowser-3.10.100ubuntu1/libs/qscintilla/Qt4Qt5/qscilexerxml.cpp sqlitebrowser-3.11.1/libs/qscintilla/Qt4Qt5/qscilexerxml.cpp --- sqlitebrowser-3.10.100ubuntu1/libs/qscintilla/Qt4Qt5/qscilexerxml.cpp 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/libs/qscintilla/Qt4Qt5/qscilexerxml.cpp 2019-02-19 23:51:34.000000000 +0000 @@ -1,6 +1,6 @@ // This module implements the QsciLexerXML class. // -// Copyright (c) 2017 Riverbank Computing Limited +// Copyright (c) 2018 Riverbank Computing Limited // // This file is part of QScintilla. // @@ -210,7 +210,7 @@ // Read properties from the settings. bool QsciLexerXML::readProperties(QSettings &qs, const QString &prefix) { - int rc = QsciLexerHTML::readProperties(qs, prefix), num; + int rc = QsciLexerHTML::readProperties(qs, prefix); scripts = qs.value(prefix + "scriptsstyled", true).toBool(); diff -Nru sqlitebrowser-3.10.100ubuntu1/libs/qscintilla/Qt4Qt5/qscimacro.cpp sqlitebrowser-3.11.1/libs/qscintilla/Qt4Qt5/qscimacro.cpp --- sqlitebrowser-3.10.100ubuntu1/libs/qscintilla/Qt4Qt5/qscimacro.cpp 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/libs/qscintilla/Qt4Qt5/qscimacro.cpp 2019-02-19 23:51:34.000000000 +0000 @@ -1,6 +1,6 @@ // This module implements the QsciMacro class. // -// Copyright (c) 2017 Riverbank Computing Limited +// Copyright (c) 2018 Riverbank Computing Limited // // This file is part of QScintilla. // Binary files /tmp/tmp6Z6cU5/j7Ppk8t7g0/sqlitebrowser-3.10.100ubuntu1/libs/qscintilla/Qt4Qt5/qscintilla_cs.qm and /tmp/tmp6Z6cU5/0KfjjA5oc3/sqlitebrowser-3.11.1/libs/qscintilla/Qt4Qt5/qscintilla_cs.qm differ diff -Nru sqlitebrowser-3.10.100ubuntu1/libs/qscintilla/Qt4Qt5/qscintilla_cs.ts sqlitebrowser-3.11.1/libs/qscintilla/Qt4Qt5/qscintilla_cs.ts --- sqlitebrowser-3.10.100ubuntu1/libs/qscintilla/Qt4Qt5/qscintilla_cs.ts 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/libs/qscintilla/Qt4Qt5/qscintilla_cs.ts 2019-02-19 23:51:34.000000000 +0000 @@ -4,493 +4,493 @@ QsciCommand - + Move down one line Posun o jednu řádku dolů - + Extend selection down one line Rozšířit výběr o jednu řádku dolů - + Scroll view down one line Rolovat pohled o jednu řádku dolů - + Extend rectangular selection down one line Rozšířit obdélníkový výběr o jednu řádku dolů - + Move up one line Posun o jednu řádku nahoru - + Extend selection up one line Rozšířit výběr o jednu řádku nahoru - + Scroll view up one line Rolovat pohled o jednu řádku nahoru - + Extend rectangular selection up one line Rozšířit obdélníkový výběr o jednu řádku nahoru - + Move up one paragraph Posun o jeden odstavec nahoru - + Extend selection up one paragraph Rozšířit výběr o jeden odstavec nahoru - + Move down one paragraph Posun o jeden odstavec dolů - + Scroll to start of document - + Scroll to end of document - + Scroll vertically to centre current line - + Extend selection down one paragraph Rozšířit výběr o jeden odstavec dolů - + Move left one character Posun o jedno písmeno doleva - + Extend selection left one character Rozšířit výběr o jedno písmeno doleva - + Move left one word Posun o jedno slovo vlevo - + Extend selection left one word Rozšířit výběr o jedno slovo doleva - + Extend rectangular selection left one character Rozšířit obdélníkový výběr o jedno písmeno doleva - + Move right one character Posun o jedno písmeno doprava - + Extend selection right one character Rozšířit výběr o jedno písmeno doprava - + Move right one word Posun o jedno slovo doprava - + Extend selection right one word Rozšířit výběr o jedno slovo doprava - + Extend rectangular selection right one character Rozšířit obdélníkový výběr o jedno písmeno doprava - + Move to end of previous word - + Extend selection to end of previous word - + Move to end of next word - + Extend selection to end of next word - + Move left one word part Posun o část slova doleva - + Extend selection left one word part Rozšířit výběr o část slova doleva - + Move right one word part Posun o část slova doprava - + Extend selection right one word part Rozšířit výběr o část slova doprava - + Move up one page Posun na předchozí stranu - + Extend selection up one page Rozšířit výběr na předchozí stranu - + Extend rectangular selection up one page Rozšířit obdélníkový výběr na předchozí stranu - + Move down one page Posun na další stranu - + Extend selection down one page Rozšířit výběr na další stranu - + Extend rectangular selection down one page Rozšířit obdélníkový výběr na další stranu - + Delete current character Smazat aktuální znak - + Cut selection Vyjmout výběr - + Delete word to right Smazat slovo doprava - + Move to start of document line - + Extend selection to start of document line - + Extend rectangular selection to start of document line - + Move to start of display line - + Extend selection to start of display line - + Move to start of display or document line - + Extend selection to start of display or document line - + Move to first visible character in document line - + Extend selection to first visible character in document line - + Extend rectangular selection to first visible character in document line - + Move to first visible character of display in document line - + Extend selection to first visible character in display or document line - + Move to end of document line - + Extend selection to end of document line - + Extend rectangular selection to end of document line - + Move to end of display line - + Extend selection to end of display line - + Move to end of display or document line - + Extend selection to end of display or document line - + Move to start of document - + Extend selection to start of document - + Move to end of document - + Extend selection to end of document - + Stuttered move up one page - + Stuttered extend selection up one page - + Stuttered move down one page - + Stuttered extend selection down one page - + Delete previous character if not at start of line - + Delete right to end of next word - + Delete line to right Smazat řádku doprava - + Transpose current and previous lines - + Duplicate the current line - + Select all Select document - + Move selected lines up one line - + Move selected lines down one line - + Toggle insert/overtype Přepnout vkládání/přepisování - + Paste Vložit - + Copy selection Kopírovat výběr - + Insert newline - + De-indent one level - + Cancel Zrušit - + Delete previous character Smazat předchozí znak - + Delete word to left Smazat slovo doleva - + Delete line to left Smazat řádku doleva - + Undo last command - + Redo last command Znovu použít poslední příkaz - + Indent one level Odsadit o jednu úroveň - + Zoom in Zvětšit - + Zoom out Zmenšit - + Formfeed Vysunout - + Cut current line Vyjmout aktuální řádku - + Delete current line Smazat aktuální řádku - + Copy current line Kopírovat aktuální řádku - + Convert selection to lower case Vybraný text převést na malá písmena - + Convert selection to upper case Vybraný text převést na velká písmena - + Duplicate selection Duplikovat výběr @@ -498,77 +498,77 @@ QsciLexerAVS - + Default Default - + Block comment - + Nested block comment - + Line comment Jednořádkový komentář - + Number Číslo - + Operator Operátor - + Identifier Identifikátor - + Double-quoted string String ve dvojitých uvozovkách - + Triple double-quoted string String ve třech dvojitých uvozovkách - + Keyword Klíčové slovo - + Filter - + Plugin - + Function - + Clip property - + User defined @@ -576,72 +576,72 @@ QsciLexerBash - + Default Default - + Error Chyba - + Comment Komentář - + Number Číslo - + Keyword Klíčové slovo - + Double-quoted string String ve dvojitých uvozovkách - + Single-quoted string String v jednoduchých uvozovkách - + Operator Operátor - + Identifier Identifikátor - + Scalar Skalár - + Parameter expansion Rozklad parametru - + Backticks Zpětný chod - + Here document delimiter Zde je oddělovač dokumentu - + Single-quoted here document Jednoduché uvozovky zde v dokumentu @@ -649,42 +649,42 @@ QsciLexerBatch - + Default Default - + Comment Komentář - + Keyword Klíčové slovo - + Label Nadpis - + Hide command character Skrýt písmeno příkazu - + External command Externí příkaz - + Variable Proměnná - + Operator Operátor @@ -692,77 +692,77 @@ QsciLexerCMake - + Default Default - + Comment Komentář - + String - + Left quoted string - + Right quoted string - + Function - + Variable Proměnná - + Label Nadpis - + User defined - + WHILE block - + FOREACH block - + IF block - + MACRO block - + Variable within a string - + Number Číslo @@ -770,282 +770,282 @@ QsciLexerCPP - + Default Default - + Inactive default - + C comment C komentář - + Inactive C comment - + C++ comment C++ komentář - + Inactive C++ comment - + JavaDoc style C comment JavaDoc styl C komentáře - + Inactive JavaDoc style C comment - + Number Číslo - + Inactive number - + Keyword Klíčové slovo - + Inactive keyword - + Double-quoted string String ve dvojitých uvozovkách - + Inactive double-quoted string - + Single-quoted string String v jednoduchých uvozovkách - + Inactive single-quoted string - + IDL UUID - + Inactive IDL UUID - + Pre-processor block Pre-procesor blok - + Inactive pre-processor block - + Operator Operátor - + Inactive operator - + Identifier Identifikátor - + Inactive identifier - + Unclosed string Neuzavřený string - + Inactive unclosed string - + C# verbatim string - + Inactive C# verbatim string - + JavaScript regular expression JavaSript regulární výraz - + Inactive JavaScript regular expression - + JavaDoc style C++ comment JavaDoc styl C++ komentáře - + Inactive JavaDoc style C++ comment - + Secondary keywords and identifiers Sekundární klíčová slova a identifikátory - + Inactive secondary keywords and identifiers - + JavaDoc keyword JavaDoc klíčové slovo - + Inactive JavaDoc keyword - + JavaDoc keyword error JavaDoc klíčové slovo chyby - + Inactive JavaDoc keyword error - + Global classes and typedefs Globální třídy a definice typů - + Inactive global classes and typedefs - + C++ raw string - + Inactive C++ raw string - + Vala triple-quoted verbatim string - + Inactive Vala triple-quoted verbatim string - + Pike hash-quoted string - + Inactive Pike hash-quoted string - + Pre-processor C comment - + Inactive pre-processor C comment - + JavaDoc style pre-processor comment - + Inactive JavaDoc style pre-processor comment - + User-defined literal - + Inactive user-defined literal - + Task marker - + Inactive task marker - + Escape sequence - + Inactive escape sequence @@ -1053,117 +1053,117 @@ QsciLexerCSS - + Default Default - + Tag Tag - + Class selector Selektor třídy - + Pseudo-class Pseudotřída - + Unknown pseudo-class Nedefinovaná pseudotřída - + Operator Operátor - + CSS1 property CSS1 vlastnost - + Unknown property Nedefinovaná vlastnost - + Value Hodnota - + ID selector ID selektor - + Important Important - + @-rule @-pravidlo - + Double-quoted string String ve dvojitých uvozovkách - + Single-quoted string String v jednoduchých uvozovkách - + CSS2 property CSS2 vlastnost - + Attribute Atribut - + CSS3 property CSS2 vlastnost {3 ?} - + Pseudo-element - + Extended CSS property - + Extended pseudo-class - + Extended pseudo-element - + Media rule - + Variable Proměnná @@ -1171,7 +1171,7 @@ QsciLexerCSharp - + Verbatim string @@ -1179,122 +1179,122 @@ QsciLexerCoffeeScript - + Default Default - + C-style comment - + C++-style comment - + JavaDoc C-style comment - + Number Číslo - + Keyword Klíčové slovo - + Double-quoted string String ve dvojitých uvozovkách - + Single-quoted string String v jednoduchých uvozovkách - + IDL UUID - + Pre-processor block Pre-procesor blok - + Operator Operátor - + Identifier Identifikátor - + Unclosed string Neuzavřený string - + C# verbatim string - + Regular expression Regulární výraz - + JavaDoc C++-style comment - + Secondary keywords and identifiers Sekundární klíčová slova a identifikátory - + JavaDoc keyword JavaDoc klíčové slovo - + JavaDoc keyword error JavaDoc klíčové slovo chyby - + Global classes - + Block comment - + Block regular expression - + Block regular expression comment - + Instance property @@ -1302,117 +1302,117 @@ QsciLexerD - + Default Default - + Block comment - + Line comment Jednořádkový komentář - + DDoc style block comment - + Nesting comment - + Number Číslo - + Keyword Klíčové slovo - + Secondary keyword - + Documentation keyword - + Type definition - + String - + Unclosed string Neuzavřený string - + Character Znak - + Operator Operátor - + Identifier Identifikátor - + DDoc style line comment - + DDoc keyword - + DDoc keyword error - + Backquoted string - + Raw string - + User defined 1 Definováno uživatelem 1 - + User defined 2 Definováno uživatelem 2 - + User defined 3 Definováno uživatelem 3 @@ -1420,120 +1420,168 @@ QsciLexerDiff - + Default Default - + Comment Komentář - + Command Příkaz - + Header Hlavička - + Position Pozice - + Removed line Odebraná řádka - + Added line Přidaná řádka - + Changed line + QsciLexerEDIFACT + + + Default + Default + + + + Segment start + + + + + Segment end + + + + + Element separator + + + + + Composite separator + + + + + Release separator + + + + + UNA segment header + + + + + UNH segment header + + + + + Badly formed segment + + + + QsciLexerFortran77 - + Default Default - + Comment Komentář - + Number Číslo - + Single-quoted string String v jednoduchých uvozovkách - + Double-quoted string String ve dvojitých uvozovkách - + Unclosed string Neuzavřený string - + Operator Operátor - + Identifier Identifikátor - + Keyword Klíčové slovo - + Intrinsic function - + Extended function - + Pre-processor block Pre-procesor blok - + Dotted operator - + Label Nadpis - + Continuation @@ -1541,547 +1589,547 @@ QsciLexerHTML - + HTML default - + Tag - + Unknown tag Nedefinovaný tag - + Attribute Atribut - + Unknown attribute Nedefinovaný atribut - + HTML number HTML číslo - + HTML double-quoted string HTML string ve dojtých uvozovkách - + HTML single-quoted string HTML string v jednoduchých uvozovkách - + Other text in a tag Další text v tagu - + HTML comment HTML komentář - + Entity Entita - + End of a tag Konec tagu - + Start of an XML fragment Začátek XML části - + End of an XML fragment Konec XML části - + Script tag Tag skriptu - + Start of an ASP fragment with @ Začátek ASP kódu s @ - + Start of an ASP fragment Začátek ASP kódu - + CDATA - + Start of a PHP fragment Začátek PHP kódu - + Unquoted HTML value HTML hodnota bez uvozovek - + ASP X-Code comment ASP X-Code komentář - + SGML default - + SGML command SGML příkaz - + First parameter of an SGML command První parametr v SGML příkazu - + SGML double-quoted string SGML string ve dvojitých uvozovkách - + SGML single-quoted string SGML string v jednoduchých uvozovkách - + SGML error SGML chyba - + SGML special entity SGML speciální entita - + SGML comment SGML komentář - + First parameter comment of an SGML command Komentář prvního parametru SGML příkazu - + SGML block default SGML defaultní blok - + Start of a JavaScript fragment Začátek JavaScript kódu - + JavaScript default - + JavaScript comment JavaScript komentář - + JavaScript line comment JavaScript jednořádkový komentář - + JavaDoc style JavaScript comment JavaDoc styl JavaScript komentáře - + JavaScript number JavaScript číslo - + JavaScript word JavaSript slovo - + JavaScript keyword JavaSript klíčové slovo - + JavaScript double-quoted string JavaSript string ve dvojitých uvozovkách - + JavaScript single-quoted string JavaSript string v jednoduchých uvozovkách - + JavaScript symbol - + JavaScript unclosed string JavaSript neuzavřený string - + JavaScript regular expression JavaSript regulární výraz - + Start of an ASP JavaScript fragment Začátek ASP JavaScript kódu - + ASP JavaScript default - + ASP JavaScript comment ASP JavaScript komentář - + ASP JavaScript line comment ASP JavaScript jednořádkový komenář - + JavaDoc style ASP JavaScript comment JavaDoc styl ASP JavaScript komentář - + ASP JavaScript number ASP JavaScript číslo - + ASP JavaScript word ASP JavaScript slovo - + ASP JavaScript keyword ASP JavaScript klíčové slovo - + ASP JavaScript double-quoted string ASP JavaScript string ve dvojitých uvozovkách - + ASP JavaScript single-quoted string ASP JavaScript v jednoduchých uvozovkách - + ASP JavaScript symbol - + ASP JavaScript unclosed string ASP JavaScript neuzavřený string - + ASP JavaScript regular expression ASP JavaScript regulární výraz - + Start of a VBScript fragment Začátek VBScript kódu - + VBScript default - + VBScript comment VBScript komentář - + VBScript number VBScript číslo - + VBScript keyword VBScript klíčové slovo - + VBScript string - + VBScript identifier VBScript identifikátor - + VBScript unclosed string VBScript neuzavřený string - + Start of an ASP VBScript fragment Začátek ASP VBScript kódu - + ASP VBScript default - + ASP VBScript comment ASP VBScript komentář - + ASP VBScript number ASP VBScript číslo - + ASP VBScript keyword ASP VBScript klíčové slovo - + ASP VBScript string - + ASP VBScript identifier ASP VBScript identifikátor - + ASP VBScript unclosed string ASP VBScript neuzavřený string - + Start of a Python fragment Začátek Python kódu - + Python default - + Python comment Python komentář - + Python number Python číslo - + Python double-quoted string Python string ve dojtých uvozovkách - + Python single-quoted string Python string v jednoduchých uvozovkách - + Python keyword Python klíčové slovo - + Python triple double-quoted string Python string ve třech dvojitých uvozovkách - + Python triple single-quoted string Python ve třech jednoduchých uvozovkách - + Python class name Python jméno třídy - + Python function or method name Python jméno funkce nebo metody - + Python operator Python operátor - + Python identifier Python identifikátor - + Start of an ASP Python fragment Začátek ASP Python kódu - + ASP Python default - + ASP Python comment ASP Python komentář - + ASP Python number ASP Python číslo - + ASP Python double-quoted string ASP Python string ve dvojitých uvozovkách - + ASP Python single-quoted string ASP Python v jednoduchých uvozovkách - + ASP Python keyword ASP Python klíčové slovo - + ASP Python triple double-quoted string ASP Python ve třech dvojitých uvozovkách - + ASP Python triple single-quoted string ASP Python ve třech jednoduchých uvozovkách - + ASP Python class name ASP Python jméno třídy - + ASP Python function or method name ASP Python jméno funkce nebo metody - + ASP Python operator ASP Python operátor - + ASP Python identifier ASP Python identifikátor - + PHP default - + PHP double-quoted string PHP string ve dvojitých uvozovkách - + PHP single-quoted string PHP v jednoduchých uvozovkách - + PHP keyword PHP klíčové slovo - + PHP number PHP číslo - + PHP variable PHP proměnná - + PHP comment PHP komentář - + PHP line comment PHP jednořádkový komentář - + PHP double-quoted variable PHP proměnná ve dvojitých uvozovkách - + PHP operator PHP operátor @@ -2089,7 +2137,7 @@ QsciLexerIDL - + UUID @@ -2097,72 +2145,72 @@ QsciLexerJSON - + Default Default - + Number Číslo - + String - + Unclosed string Neuzavřený string - + Property - + Escape sequence - + Line comment Jednořádkový komentář - + Block comment - + Operator Operátor - + IRI - + JSON-LD compact IRI - + JSON keyword - + JSON-LD keyword - + Parsing error @@ -2170,7 +2218,7 @@ QsciLexerJavaScript - + Regular expression Regulární výraz @@ -2178,102 +2226,102 @@ QsciLexerLua - + Default - + Comment Komentář - + Line comment Jednořádkový komentář - + Number Číslo - + Keyword Klíčové slovo - + String - + Character Znak - + Literal string - + Preprocessor - + Operator Operátor - + Identifier Identifikátor - + Unclosed string Neuzavřený string - + Basic functions Základní funkce - + String, table and maths functions String, tabulka a matematické funkce - + Coroutines, i/o and system facilities - + User defined 1 Definováno uživatelem 1 - + User defined 2 Definováno uživatelem 2 - + User defined 3 Definováno uživatelem 3 - + User defined 4 Definováno uživatelem 4 - + Label Nadpis @@ -2281,37 +2329,37 @@ QsciLexerMakefile - + Default - + Comment Komentář - + Preprocessor - + Variable Proměnná - + Operator Operátor - + Target Cíl - + Error Chyba @@ -2319,112 +2367,112 @@ QsciLexerMarkdown - + Default Default - + Special - + Strong emphasis using double asterisks - + Strong emphasis using double underscores - + Emphasis using single asterisks - + Emphasis using single underscores - + Level 1 header - + Level 2 header - + Level 3 header - + Level 4 header - + Level 5 header - + Level 6 header - + Pre-char - + Unordered list item - + Ordered list item - + Block quote - + Strike out - + Horizontal rule - + Link - + Code between backticks - + Code between double backticks - + Code block @@ -2432,47 +2480,47 @@ QsciLexerMatlab - + Default Default - + Comment Komentář - + Command Příkaz - + Number Číslo - + Keyword Klíčové slovo - + Single-quoted string String v jednoduchých uvozovkách - + Operator Operátor - + Identifier Identifikátor - + Double-quoted string String ve dvojitých uvozovkách @@ -2480,77 +2528,77 @@ QsciLexerPO - + Default Default - + Comment Komentář - + Message identifier - + Message identifier text - + Message string - + Message string text - + Message context - + Message context text - + Fuzzy flag - + Programmer comment - + Reference - + Flags - + Message identifier text end-of-line - + Message string text end-of-line - + Message context text end-of-line @@ -2558,87 +2606,87 @@ QsciLexerPOV - + Default - + Comment Komentář - + Comment line Jednořádkový komentář - + Number Číslo - + Operator Operátor - + Identifier Identifikátor - + String - + Unclosed string Neuzavřený string - + Directive Direktiva - + Bad directive - + Objects, CSG and appearance - + Types, modifiers and items - + Predefined identifiers - + Predefined functions - + User defined 1 - + User defined 2 - + User defined 3 @@ -2646,77 +2694,77 @@ QsciLexerPascal - + Default Default - + Line comment Jednořádkový komentář - + Number Číslo - + Keyword Klíčové slovo - + Single-quoted string String v jednoduchých uvozovkách - + Operator Operátor - + Identifier Identifikátor - + '{ ... }' style comment - + '(* ... *)' style comment - + '{$ ... }' style pre-processor block - + '(*$ ... *)' style pre-processor block - + Hexadecimal number - + Unclosed string Neuzavřený string - + Character Znak - + Inline asm @@ -2724,207 +2772,207 @@ QsciLexerPerl - + Default - + Error Chyba - + Comment Komentář - + POD - + Number Číslo - + Keyword Klíčové slovo - + Double-quoted string String ve dvojitých uvozovkách - + Single-quoted string String v jednoduchých uvozovkách - + Operator Operátor - + Identifier Identifikátor - + Scalar Skalár - + Array Pole - + Hash - + Symbol table - + Regular expression Regulární výraz - + Substitution - + Backticks - + Data section - + Here document delimiter Zde je oddělovač dokumentu - + Single-quoted here document Zde je dokument v jednoduchých uvozovkách - + Double-quoted here document Zde je dokument ve dvojitých uvozovkách - + Backtick here document - + Quoted string (q) - + Quoted string (qq) - + Quoted string (qx) - + Quoted string (qr) - + Quoted string (qw) - + POD verbatim - + Subroutine prototype - + Format identifier - + Format body - + Double-quoted string (interpolated variable) - + Translation - + Regular expression (interpolated variable) - + Substitution (interpolated variable) - + Backticks (interpolated variable) - + Double-quoted here document (interpolated variable) - + Backtick here document (interpolated variable) - + Quoted string (qq, interpolated variable) - + Quoted string (qx, interpolated variable) - + Quoted string (qr, interpolated variable) @@ -2932,82 +2980,82 @@ QsciLexerPostScript - + Default Default - + Comment Komentář - + DSC comment - + DSC comment value - + Number Číslo - + Name - + Keyword Klíčové slovo - + Literal - + Immediately evaluated literal - + Array parenthesis - + Dictionary parenthesis - + Procedure parenthesis - + Text - + Hexadecimal string - + Base85 string - + Bad string character @@ -3015,32 +3063,32 @@ QsciLexerProperties - + Default - + Comment - + Section - + Assignment - + Default value - + Key @@ -3048,82 +3096,82 @@ QsciLexerPython - + Default - + Comment Komentář - + Number Číslo - + Double-quoted string String ve dvojitých uvozovkách - + Single-quoted string String v jednoduchých uvozovkách - + Keyword Klíčové slovo - + Triple single-quoted string String ve třech jednoduchých uvozovkách - + Triple double-quoted string String ve třech dvojitých uvozovkách - + Class name Jméno třídy - + Function or method name Jméno funkce nebo metody - + Operator Operátor - + Identifier Identifikátor - + Comment block Blok komentáře - + Unclosed string Neuzavřený string - + Highlighted identifier Zvýrazněný identifikátor - + Decorator Dekorátor @@ -3131,157 +3179,157 @@ QsciLexerRuby - + Default - + Comment Komentář - + Number Číslo - + Double-quoted string String ve dvojitých uvozovkách - + Single-quoted string String v jednoduchých uvozovkách - + Keyword Klíčové slovo - + Class name Jméno třídy - + Function or method name Jméno funkce nebo metody - + Operator Operátor - + Identifier Identifikátor - + Error Chyba - + POD POD - + Regular expression Regulární výraz - + Global - + Symbol - + Module name Jméno modulu - + Instance variable Proměnná instance - + Class variable Proměnná třídy - + Backticks - + Data section Datová sekce - + Here document delimiter Zde je oddělovač dokumentu - + Here document Zde je dokument - + %q string - + %Q string - + %x string - + %r string - + %w string - + Demoted keyword - + stdin - + stdout - + stderr @@ -3289,112 +3337,112 @@ QsciLexerSQL - + Default - + Comment Komentář - + Number Číslo - + Keyword Klíčové slovo - + Single-quoted string String v jednoduchých uvozovkách - + Operator Operátor - + Identifier Identifikátor - + Comment line Jednořádkový komentář - + JavaDoc style comment JavaDoc styl komentář - + Double-quoted string String ve dvojitých uvozovkách - + SQL*Plus keyword SQL*Plus klíčové slovo - + SQL*Plus prompt - + SQL*Plus comment SQL*Plus komentář - + # comment line # jednořádkový komentář - + JavaDoc keyword JavaDoc klíčové slovo - + JavaDoc keyword error JavaDoc klíčové slovo chyby - + User defined 1 Definováno uživatelem 1 - + User defined 2 Definováno uživatelem 2 - + User defined 3 Definováno uživatelem 3 - + User defined 4 Definováno uživatelem 4 - + Quoted identifier - + Quoted operator @@ -3402,47 +3450,47 @@ QsciLexerSpice - + Default Default - + Identifier Identifikátor - + Command Příkaz - + Function - + Parameter - + Number Číslo - + Delimiter - + Value Hodnota - + Comment Komentář @@ -3450,112 +3498,112 @@ QsciLexerTCL - + Default Default - + Comment Komentář - + Comment line Jednořádkový komentář - + Number Číslo - + Quoted keyword - + Quoted string - + Operator Operátor - + Identifier Identifikátor - + Substitution - + Brace substitution - + Modifier - + Expand keyword - + TCL keyword - + Tk keyword - + iTCL keyword - + Tk command - + User defined 1 Definováno uživatelem 1 - + User defined 2 Definováno uživatelem 2 - + User defined 3 Definováno uživatelem 3 - + User defined 4 Definováno uživatelem 4 - + Comment box - + Comment block Blok komentáře @@ -3563,32 +3611,32 @@ QsciLexerTeX - + Default - + Special - + Group Skupina - + Symbol - + Command Příkaz - + Text @@ -3596,82 +3644,82 @@ QsciLexerVHDL - + Default Default - + Comment Komentář - + Comment line Jednořádkový komentář - + Number Číslo - + String - + Operator Operátor - + Identifier Identifikátor - + Unclosed string Neuzavřený string - + Keyword Klíčové slovo - + Standard operator - + Attribute Atribut - + Standard function - + Standard package - + Standard type - + User defined - + Comment block Blok komentáře @@ -3679,122 +3727,172 @@ QsciLexerVerilog - + Default Default - + + Inactive default + + + + Comment Komentář - + Line comment Jednořádkový komentář - + + Inactive line comment + + + + Bang comment - + + Inactive bang comment + + + + Number Číslo - + + Inactive number + + + + Primary keywords and identifiers - + + Inactive primary keywords and identifiers + + + + String - + + Inactive string + + + + Secondary keywords and identifiers Sekundární klíčová slova a identifikátory - + System task - + + Inactive system task + + + + Preprocessor block - + Operator Operátor - + + Inactive operator + + + + Identifier Identifikátor - + Unclosed string Neuzavřený string - + + Inactive unclosed string + + + + User defined tasks and identifiers - + + Inactive user defined tasks and identifiers + + + + Keyword comment - + Inactive keyword comment - + Input port declaration - + Inactive input port declaration - + Output port declaration - + Inactive output port declaration - + Input/output port declaration - + Inactive input/output port declaration - + Port connection - + Inactive port connection @@ -3802,52 +3900,52 @@ QsciLexerYAML - + Default Default - + Comment Komentář - + Identifier Identifikátor - + Keyword Klíčové slovo - + Number Číslo - + Reference - + Document delimiter - + Text block marker - + Syntax error marker - + Operator Operátor @@ -3855,37 +3953,37 @@ QsciScintilla - + &Undo - + &Redo - + Cu&t - + &Copy - + &Paste - + Delete - + Select All Binary files /tmp/tmp6Z6cU5/j7Ppk8t7g0/sqlitebrowser-3.10.100ubuntu1/libs/qscintilla/Qt4Qt5/qscintilla_de.qm and /tmp/tmp6Z6cU5/0KfjjA5oc3/sqlitebrowser-3.11.1/libs/qscintilla/Qt4Qt5/qscintilla_de.qm differ diff -Nru sqlitebrowser-3.10.100ubuntu1/libs/qscintilla/Qt4Qt5/qscintilla_de.ts sqlitebrowser-3.11.1/libs/qscintilla/Qt4Qt5/qscintilla_de.ts --- sqlitebrowser-3.10.100ubuntu1/libs/qscintilla/Qt4Qt5/qscintilla_de.ts 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/libs/qscintilla/Qt4Qt5/qscintilla_de.ts 2019-02-19 23:51:34.000000000 +0000 @@ -4,493 +4,493 @@ QsciCommand - + Move left one character Ein Zeichen nach links - + Move right one character Ein Zeichen nach rechts - + Move up one line Eine Zeile nach oben - + Move down one line Eine Zeile nach unten - + Move left one word part Ein Wortteil nach links - + Move right one word part Ein Wortteil nach rechts - + Move left one word Ein Wort nach links - + Move right one word Ein Wort nach rechts - + Scroll view down one line Eine Zeile nach unten rollen - + Scroll view up one line Eine Zeile nach oben rollen - + Move up one page Eine Seite hoch - + Move down one page Eine Seite nach unten - + Indent one level Eine Ebene einrücken - + Extend selection left one character Auswahl um ein Zeichen nach links erweitern - + Extend selection right one character Auswahl um ein Zeichen nach rechts erweitern - + Extend selection up one line Auswahl um eine Zeile nach oben erweitern - + Extend selection down one line Auswahl um eine Zeile nach unten erweitern - + Extend selection left one word part Auswahl um einen Wortteil nach links erweitern - + Extend selection right one word part Auswahl um einen Wortteil nach rechts erweitern - + Extend selection left one word Auswahl um ein Wort nach links erweitern - + Extend selection right one word Auswahl um ein Wort nach rechts erweitern - + Extend selection up one page Auswahl um eine Seite nach oben erweitern - + Extend selection down one page Auswahl um eine Seite nach unten erweitern - + Delete previous character Zeichen links löschen - + Delete current character Aktuelles Zeichen löschen - + Delete word to left Wort links löschen - + Delete word to right Wort rechts löschen - + Delete line to left Zeile links löschen - + Delete line to right Zeile rechts löschen - + Delete current line Aktuelle Zeile löschen - + Cut current line Aktuelle Zeile ausschneiden - + Cut selection Auswahl ausschneiden - + Copy selection Auswahl kopieren - + Paste Einfügen - + Redo last command Letzten Befehl wiederholen - + Cancel Abbrechen - + Toggle insert/overtype Einfügen/Überschreiben umschalten - + Scroll to start of document Zum Dokumentenanfang rollen - + Scroll to end of document Zum Dokumentenende rollen - + Scroll vertically to centre current line Vertical rollen, um aktuelle Zeile zu zentrieren - + Move to end of previous word Zum Ende des vorigen Wortes springen - + Extend selection to end of previous word Auswahl bis zum Ende des vorigen Wortes erweitern - + Move to end of next word Zum Ende des nächsten Wortes springen - + Extend selection to end of next word Auswahl bis zum Ende des nächsten Wortes erweitern - + Move to start of document line Zum Beginn der Dokumentenzeile springen - + Extend selection to start of document line Auswahl zum Beginn der Dokumentenzeile erweitern - + Extend rectangular selection to start of document line Rechteckige Auswahl zum Beginn der Dokumentenzeile erweitern - + Move to start of display line Zum Beginn der Anzeigezeile springen - + Extend selection to start of display line Auswahl zum Beginn der Anzeigezeile erweitern - + Move to start of display or document line Zum Beginn der Dokumenten- oder Anzeigezeile springen - + Extend selection to start of display or document line Rechteckige Auswahl zum Beginn der Dokumenten- oder Anzeigezeile erweitern - + Move to first visible character in document line Zum ersten sichtbaren Zeichen der Dokumentzeile springen - + Extend selection to first visible character in document line Auswahl zum ersten sichtbaren Zeichen der Dokumentzeile erweitern - + Extend rectangular selection to first visible character in document line Rechteckige Auswahl zum ersten sichtbaren Zeichen der Dokumentzeile erweitern - + Move to first visible character of display in document line Zum ersten angezeigten Zeichen der Dokumentzeile springen - + Extend selection to first visible character in display or document line Auswahl zum ersten sichtbaren Zeichen der Dokument- oder Anzeigezeile erweitern - + Move to end of document line Zum Ende der Dokumentzeile springen - + Extend selection to end of document line Auswahl zum Ende der Dokumentenzeile erweitern - + Extend rectangular selection to end of document line Rechteckige Auswahl zum Ende der Dokumentenzeile erweitern - + Move to end of display line Zum Ende der Anzeigezeile springen - + Extend selection to end of display line Auswahl zum Ende der Anzeigezeile erweitern - + Move to end of display or document line Zum Ende der Dokumenten- oder Anzeigezeile springen - + Extend selection to end of display or document line Rechteckige Auswahl zum Ende der Dokumenten- oder Anzeigezeile erweitern - + Move to start of document Zum Dokumentenanfang springen - + Extend selection to start of document Auswahl zum Dokumentenanfang erweitern - + Move to end of document Zum Dokumentenende springen - + Extend selection to end of document Auswahl zum Dokumentenende erweitern - + Stuttered move up one page "Stotternd" um eine Seite nach oben - + Stuttered extend selection up one page Auswahl "stotternd" um eine Seite nach oben erweitern - + Stuttered move down one page "Stotternd" um eine Seite nach unten - + Stuttered extend selection down one page Auswahl "stotternd" um eine Seite nach unten erweitern - + Delete previous character if not at start of line Zeichen links löschen, wenn nicht am Zeilenanfang - + Delete right to end of next word Rechts bis zum Ende des nächsten Wortes löschen - + Transpose current and previous lines Aktuelle und vorherige Zeile tauschen - + Duplicate the current line Aktuelle Zeile duplizieren - + Select all Select document Alle auswählen - + Move selected lines up one line Ausgewählte Zeilen um eine Zeile nach oben - + Move selected lines down one line Ausgewählte Zeilen um eine Zeile nach unten - + Convert selection to lower case Auswahl in Kleinbuchstaben umwandeln - + Convert selection to upper case Auswahl in Großbuchstaben umwandeln - + Insert newline Neue Zeile einfügen - + De-indent one level Eine Ebene ausrücken - + Undo last command Letzten Befehl rückgängig machen - + Zoom in Vergrößern - + Zoom out Verkleinern - + Move up one paragraph Einen Absatz nach oben - + Move down one paragraph Einen Absatz nach unten - + Extend selection up one paragraph Auswahl um einen Absatz nach oben erweitern - + Extend selection down one paragraph Auswahl um einen Absatz nach unten erweitern - + Copy current line Aktuelle Zeile kopieren - + Extend rectangular selection down one line Rechteckige Auswahl um eine Zeile nach unten erweitern - + Extend rectangular selection up one line Rechteckige Auswahl um eine Zeile nach oben erweitern - + Extend rectangular selection left one character Rechteckige Auswahl um ein Zeichen nach links erweitern - + Extend rectangular selection right one character Rechteckige Auswahl um ein Zeichen nach rechts erweitern - + Extend rectangular selection up one page Rechteckige Auswahl um eine Seite nach oben erweitern - + Extend rectangular selection down one page Rechteckige Auswahl um eine Seite nach unten erweitern - + Formfeed Seitenumbruch - + Duplicate selection Auswahl duplizieren @@ -498,77 +498,77 @@ QsciLexerAVS - + Default Standard - + Block comment Blockkommentar - + Nested block comment Verschachtelter Blockkommentar - + Line comment Zeilenkommentar - + Number Zahl - + Operator Operator - + Identifier Bezeichner - + Double-quoted string Zeichenkette in Anführungszeichen - + Triple double-quoted string Zeichenkette in dreifachen Anführungszeichen - + Keyword Schlüsselwort - + Filter Filter - + Plugin Plugin - + Function Funktion - + Clip property Clip Eigenschaft - + User defined Nutzer definiert @@ -576,72 +576,72 @@ QsciLexerBash - + Default Standard - + Error Fehler - + Comment Kommentar - + Number Zahl - + Keyword Schlüsselwort - + Double-quoted string Zeichenkette in Anführungszeichen - + Single-quoted string Zeichenkette in Hochkommata - + Operator Operator - + Identifier Bezeichner - + Scalar Skalar - + Parameter expansion Parametererweiterung - + Backticks Backticks - + Here document delimiter Here Dokument-Begrenzer - + Single-quoted here document Here Dokument in Hochkommata @@ -649,42 +649,42 @@ QsciLexerBatch - + Default Standard - + Comment Kommentar - + Keyword Schlüsselwort - + Label Marke - + Variable Variable - + Operator Operator - + Hide command character "Befehl verbergen" Zeichen - + External command Externer Befehl @@ -692,77 +692,77 @@ QsciLexerCMake - + Default Standard - + Comment Kommentar - + String Zeichenkette - + Left quoted string Links quotierte Zeichenkette - + Right quoted string Rechts quotierte Zeichenkette - + Function Funktion - + Variable Variable - + Label Marke - + User defined Nutzer definiert - + WHILE block WHILE Block - + FOREACH block FOREACH Block - + IF block IF Block - + MACRO block MACRO Block - + Variable within a string Variable in einer Zeichenkette - + Number Zahl @@ -770,282 +770,282 @@ QsciLexerCPP - + Number Zahl - + Keyword Schlüsselwort - + Double-quoted string Zeichenkette in Anführungszeichen - + Single-quoted string Zeichenkette in Hochkommata - + IDL UUID IDL UUID - + Pre-processor block Präprozessorblock - + Operator Operator - + Identifier Bezeichner - + Unclosed string Unbeendete Zeichenkette - + Default Standard - + Inactive default Inaktiver Standard - + C comment C Kommentar - + Inactive C comment Inaktiver C Kommentar - + C++ comment C++ Kommentar - + Inactive C++ comment Inaktiver C++ Kommentar - + JavaDoc style C comment JavaDoc C Kommentar - + Inactive JavaDoc style C comment Inaktiver JavaDoc C Kommentar - + Inactive number Inaktive Zahl - + Inactive keyword Inaktives Schlüsselwort - + Inactive double-quoted string Inaktive Zeichenkette in Anführungszeichen - + Inactive single-quoted string Inaktive Zeichenkette in Hochkommata - + Inactive IDL UUID Inaktive IDL UUID - + Inactive pre-processor block Inaktiver Präprozessorblock - + Inactive operator Inaktiver Operator - + Inactive identifier Inaktiver Bezeichner - + Inactive unclosed string Inaktive unbeendete Zeichenkette - + C# verbatim string Uninterpretierte C# Zeichenkette - + Inactive C# verbatim string Inaktive, Uninterpretierte C# Zeichenkette - + JavaScript regular expression JavaScript Regulärer Ausdruck - + Inactive JavaScript regular expression JavaScript Inaktiver Regulärer Ausdruck - + JavaDoc style C++ comment JavaDoc C++ Kommentar - + Inactive JavaDoc style C++ comment Inaktiver JavaDoc C++ Kommentar - + Inactive secondary keywords and identifiers Inaktive sekundäre Schlusselwörter und Bezeichner - + JavaDoc keyword JavaDoc Schlüsselwort - + Inactive JavaDoc keyword Inaktives JavaDoc Schlüsselwort - + JavaDoc keyword error JavaDoc Schlüsselwortfehler - + Inactive global classes and typedefs Inaktive globale Klassen und Typdefinitionen - + C++ raw string Rohe C++ Zeichenkette - + Inactive C++ raw string Inaktive rohe C++ Zeichenkette - + Vala triple-quoted verbatim string Vala Zeichenkette in dreifachen Hochkommata - + Inactive Vala triple-quoted verbatim string Inaktive Vala Zeichenkette in dreifachen Hochkommata - + Pike hash-quoted string Pike Zeichenkette in '#-Anführungszeichen' - + Inactive Pike hash-quoted string Inaktive Pike Zeichenkette in '#-Anführungszeichen' - + Pre-processor C comment C Präprozessorkommentar - + Inactive pre-processor C comment Inaktiver C Präprozessorkommentar - + JavaDoc style pre-processor comment JavaDoc Präprozessorkommentar - + Inactive JavaDoc style pre-processor comment Inaktiver JavaDoc Präprozessorkommentar - + User-defined literal Nutzer definiertes Literal - + Inactive user-defined literal Inaktives Nutzer definiertes Literal - + Task marker Aufgabenmarkierung - + Inactive task marker Inaktive Aufgabenmarkierung - + Escape sequence Escape-Sequenz - + Inactive escape sequence Inaktive Escape-Sequenz - + Secondary keywords and identifiers Sekundäre Schlusselwörter und Bezeichner - + Inactive JavaDoc keyword error Inaktiver JavaDoc Schlüsselwortfehler - + Global classes and typedefs Globale Klassen und Typdefinitionen @@ -1053,117 +1053,117 @@ QsciLexerCSS - + Default Standard - + Tag Tag - + Class selector Klassenselektor - + Pseudo-class Pseudoklasse - + Unknown pseudo-class Unbekannte Pseudoklasse - + Operator Operator - + CSS1 property CSS1 Eigenschaft - + Unknown property Unbekannte Eigenschaft - + Value Wert - + ID selector ID-Selektor - + Important Wichtig - + @-rule @-Regel - + Double-quoted string Zeichenkette in Anführungszeichen - + Single-quoted string Zeichenkette in Hochkommata - + CSS2 property CSS2 Eigenschaft - + Attribute Attribut - + CSS3 property CSS3 Eigenschaft - + Pseudo-element Pseudoelement - + Extended CSS property Erweiterte CSS Eigenschaft - + Extended pseudo-class Erweiterte Pseudoklasse - + Extended pseudo-element Erweitertes Pseudoelement - + Media rule Medienregel - + Variable Variable @@ -1171,7 +1171,7 @@ QsciLexerCSharp - + Verbatim string Uninterpretierte Zeichenkette @@ -1179,122 +1179,122 @@ QsciLexerCoffeeScript - + Default Standard - + C-style comment C Kommentar - + C++-style comment C++ Kommentar - + JavaDoc C-style comment JavaDoc C Kommentar - + Number Zahl - + Keyword Schlüsselwort - + Double-quoted string Zeichenkette in Anführungszeichen - + Single-quoted string Zeichenkette in Hochkommata - + IDL UUID IDL UUID - + Pre-processor block Präprozessorblock - + Operator Operator - + Identifier Bezeichner - + Unclosed string Unbeendete Zeichenkette - + C# verbatim string Uninterpretierte C# Zeichenkette - + Regular expression Regulärer Ausdruck - + JavaDoc C++-style comment JavaDoc C++ Kommentar - + Secondary keywords and identifiers Sekundäre Schlusselwörter und Bezeichner - + JavaDoc keyword JavaDoc Schlüsselwort - + JavaDoc keyword error JavaDoc Schlüsselwortfehler - + Global classes Globale Klassen - + Block comment Blockkommentar - + Block regular expression Regulärer Ausdrucksblock - + Block regular expression comment Regulärer Ausdrucksblockkommentar - + Instance property Instanz-Eigenschaft @@ -1302,117 +1302,117 @@ QsciLexerD - + Default Standard - + Block comment Blockkommentar - + Line comment Zeilenkommentar - + DDoc style block comment DDoc Blockkommentar - + Nesting comment schachtelbarer Kommentar - + Number Zahl - + Keyword Schlüsselwort - + Secondary keyword Sekundäres Schlüsselwort - + Documentation keyword Dokumentationsschlüsselwort - + Type definition Typdefinition - + String Zeichenkette - + Unclosed string Unbeendete Zeichenkette - + Character Zeichen - + Operator Operator - + Identifier Bezeichner - + DDoc style line comment DDoc Zeilenkommentar - + DDoc keyword DDoc Schlüsselwort - + DDoc keyword error DDoc Schlüsselwortfehler - + Backquoted string Zeichenkette in Rückwärtsstrichen - + Raw string Rohe Zeichenkette - + User defined 1 Nutzer definiert 1 - + User defined 2 Nutzer definiert 2 - + User defined 3 Nutzer definiert 3 @@ -1420,120 +1420,168 @@ QsciLexerDiff - + Default Standard - + Comment Kommentar - + Command Befehl - + Header Kopfzeilen - + Position Position - + Removed line Entfernte Zeile - + Added line Hinzugefügte Zeile - + Changed line Geänderte Zeile + QsciLexerEDIFACT + + + Default + Standard + + + + Segment start + Segmentstart + + + + Segment end + Segmentende + + + + Element separator + Elementtrenner + + + + Composite separator + Zusammengesetzter Trenner + + + + Release separator + Freigabetrenner + + + + UNA segment header + UNA Segmentkopf + + + + UNH segment header + UNH Segmentkopf + + + + Badly formed segment + Schlecht geformtes Segment + + + QsciLexerFortran77 - + Default Standard - + Comment Kommentar - + Number Zahl - + Single-quoted string Zeichenkette in Hochkommata - + Double-quoted string Zeichenkette in Anführungszeichen - + Unclosed string Unbeendete Zeichenkette - + Operator Operator - + Identifier Bezeichner - + Keyword Schlüsselwort - + Intrinsic function Intrinsic-Funktion - + Extended function Erweiterte Funktion - + Pre-processor block Präprozessorblock - + Dotted operator Dotted Operator - + Label Marke - + Continuation Fortsetzung @@ -1541,547 +1589,547 @@ QsciLexerHTML - + HTML default HTML Standard - + Tag Tag - + Unknown tag Unbekanntes Tag - + Attribute Attribut - + Unknown attribute Unbekanntes Attribut - + HTML number HTML Zahl - + HTML double-quoted string HTML Zeichenkette in Anführungszeichen - + HTML single-quoted string HTML Zeichenkette in Hochkommata - + Other text in a tag Anderer Text in einem Tag - + HTML comment HTML Kommentar - + Entity Entität - + End of a tag Tagende - + Start of an XML fragment Beginn eines XML Fragmentes - + End of an XML fragment Ende eines XML Fragmentes - + Script tag Skript Tag - + Start of an ASP fragment with @ Beginn eines ASP Fragmentes mit @ - + Start of an ASP fragment Beginn eines ASP Fragmentes - + CDATA CDATA - + Start of a PHP fragment Beginn eines PHP Fragmentes - + Unquoted HTML value HTML Wert ohne Anführungszeichen - + ASP X-Code comment ASP X-Code Kommentar - + SGML default SGML Standard - + SGML command SGML Befehl - + First parameter of an SGML command Erster Parameter eines SGML Befehls - + SGML double-quoted string SGML Zeichenkette in Anführungszeichen - + SGML single-quoted string SGML Zeichenkette in Hochkommata - + SGML error SGML Fehler - + SGML special entity SGML Spezielle Entität - + SGML comment SGML Kommentar - + First parameter comment of an SGML command Kommentar des ersten Parameters eines SGML Befehls - + SGML block default SGML Standardblock - + Start of a JavaScript fragment Beginn eines JavaScript Fragmentes - + JavaScript default JavaScript Standard - + JavaScript comment JavaScript Kommentar - + JavaScript line comment JavaScript Zeilenkommentar - + JavaDoc style JavaScript comment JavaDoc JavaScript Kommentar - + JavaScript number JavaScript Zahl - + JavaScript word JavaScript Wort - + JavaScript keyword JavaScript Schlüsselwort - + JavaScript double-quoted string JavaScript Zeichenkette in Anführungszeichen - + JavaScript single-quoted string JavaScript Zeichenkette in Hochkommata - + JavaScript symbol JavaScript Symbol - + JavaScript unclosed string JavaScript Unbeendete Zeichenkette - + JavaScript regular expression JavaScript Regulärer Ausdruck - + Start of an ASP JavaScript fragment Beginn eines ASP JavaScript Fragmentes - + ASP JavaScript default ASP JavaScript Standard - + ASP JavaScript comment ASP JavaScript Kommentar - + ASP JavaScript line comment ASP JavaScript Zeilenkommentar - + JavaDoc style ASP JavaScript comment JavaDoc ASP JavaScript Kommentar - + ASP JavaScript number ASP JavaScript Zahl - + ASP JavaScript word ASP JavaScript Wort - + ASP JavaScript keyword ASP JavaScript Schlüsselwort - + ASP JavaScript double-quoted string ASP JavaScript Zeichenkette in Anführungszeichen - + ASP JavaScript single-quoted string ASP JavaScript Zeichenkette in Hochkommata - + ASP JavaScript symbol ASP JavaScript Symbol - + ASP JavaScript unclosed string ASP JavaScript Unbeendete Zeichenkette - + ASP JavaScript regular expression ASP JavaScript Regulärer Ausdruck - + Start of a VBScript fragment Beginn eines VBScript Fragmentes - + VBScript default VBScript Standard - + VBScript comment VBScript Kommentar - + VBScript number VBScript Zahl - + VBScript keyword VBScript Schlüsselwort - + VBScript string VBScript Zeichenkette - + VBScript identifier VBScript Bezeichner - + VBScript unclosed string VBScript Unbeendete Zeichenkette - + Start of an ASP VBScript fragment Beginn eines ASP VBScript Fragmentes - + ASP VBScript default ASP VBScript Standard - + ASP VBScript comment ASP VBScript Kommentar - + ASP VBScript number ASP VBScript Zahl - + ASP VBScript keyword ASP VBScript Schlüsselwort - + ASP VBScript string ASP VBScript Zeichenkette - + ASP VBScript identifier ASP VBScript Bezeichner - + ASP VBScript unclosed string ASP VBScript Unbeendete Zeichenkette - + Start of a Python fragment Beginn eines Python Fragmentes - + Python default Python Standard - + Python comment Python Kommentar - + Python number Python Zahl - + Python double-quoted string Python Zeichenkette in Anführungszeichen - + Python single-quoted string Python Zeichenkette in Hochkommata - + Python keyword Python Schlüsselwort - + Python triple double-quoted string Python Zeichenkette in dreifachen Anführungszeichen - + Python triple single-quoted string Python Zeichenkette in dreifachen Hochkommata - + Python class name Python Klassenname - + Python function or method name Python Funktions- oder Methodenname - + Python operator Python Operator - + Python identifier Python Bezeichner - + Start of an ASP Python fragment Beginn eines ASP Python Fragmentes - + ASP Python default ASP Python Standard - + ASP Python comment ASP Python Kommentar - + ASP Python number ASP Python Zahl - + ASP Python double-quoted string ASP Python Zeichenkette in Anführungszeichen - + ASP Python single-quoted string ASP Python Zeichenkette in Hochkommata - + ASP Python keyword ASP Python Schlüsselwort - + ASP Python triple double-quoted string ASP Python Zeichenkette in dreifachen Anführungszeichen - + ASP Python triple single-quoted string ASP Python Zeichenkette in dreifachen Hochkommata - + ASP Python class name ASP Python Klassenname - + ASP Python function or method name ASP Python Funktions- oder Methodenname - + ASP Python operator ASP Python Operator - + ASP Python identifier ASP Python Bezeichner - + PHP default PHP Standard - + PHP double-quoted string PHP Zeichenkette in Anführungszeichen - + PHP single-quoted string PHP Zeichenkette in Hochkommata - + PHP keyword PHP Schlüsselwort - + PHP number PHP Zahl - + PHP comment PHP Kommentar - + PHP line comment PHP Zeilenkommentar - + PHP double-quoted variable PHP Variable in Anführungszeichen - + PHP operator PHP Operator - + PHP variable PHP Variable @@ -2089,7 +2137,7 @@ QsciLexerIDL - + UUID UUID @@ -2097,72 +2145,72 @@ QsciLexerJSON - + Default Standard - + Number Zahl - + String Zeichenkette - + Unclosed string Unbeendete Zeichenkette - + Property Eigenschaft - + Escape sequence Escape-Sequenz - + Line comment Zeilenkommentar - + Block comment Blockkommentar - + Operator Operator - + IRI IRI - + JSON-LD compact IRI JSON-LD kompaktes IRI - + JSON keyword JSON Schlüsselwort - + JSON-LD keyword JSON-LD Schlüsselwort - + Parsing error Analysefehler @@ -2170,7 +2218,7 @@ QsciLexerJavaScript - + Regular expression Regulärer Ausdruck @@ -2178,102 +2226,102 @@ QsciLexerLua - + Default Standard - + Comment Kommentar - + Line comment Zeilenkommentar - + Number Zahl - + Keyword Schlüsselwort - + String Zeichenkette - + Character Zeichen - + Literal string Uninterpretierte Zeichenkette - + Preprocessor Präprozessor - + Operator Operator - + Identifier Bezeichner - + Unclosed string Unbeendete Zeichenkette - + Basic functions Basisfunktionen - + String, table and maths functions Zeichenketten-, Tabelle- und mathematische Funktionen - + Coroutines, i/o and system facilities Koroutinen, I/O- und Systemfunktionen - + User defined 1 Nutzer definiert 1 - + User defined 2 Nutzer definiert 2 - + User defined 3 Nutzer definiert 3 - + User defined 4 Nutzer definiert 4 - + Label Marke @@ -2281,37 +2329,37 @@ QsciLexerMakefile - + Default Standard - + Comment Kommentar - + Preprocessor Präprozessor - + Variable Variable - + Operator Operator - + Target Ziel - + Error Fehler @@ -2319,112 +2367,112 @@ QsciLexerMarkdown - + Default Standard - + Special Spezial - + Strong emphasis using double asterisks Fettschrift mit doppelten Sternen - + Strong emphasis using double underscores Fettschrift mit doppelten Unterstrichen - + Emphasis using single asterisks Kursive Schrift mit einfachen Sternen - + Emphasis using single underscores Kursive Schrift mit einfachen Unterstrichen - + Level 1 header Überschrift Ebene 1 - + Level 2 header Überschrift Ebene 2 - + Level 3 header Überschrift Ebene 3 - + Level 4 header Überschrift Ebene 4 - + Level 5 header Überschrift Ebene 5 - + Level 6 header Überschrift Ebene 6 - + Pre-char Einleitungszeichen - + Unordered list item Nicht nummeriertes Listenelement - + Ordered list item Nummeriertes Listenelement - + Block quote Blockzitat - + Strike out Durchgestrichen - + Horizontal rule Horizontale Linie - + Link Hyperlink - + Code between backticks Code zwischen Backticks - + Code between double backticks Code zwischen doppelten Backticks - + Code block Codeblock @@ -2432,47 +2480,47 @@ QsciLexerMatlab - + Default Standard - + Comment Kommentar - + Command Befehl - + Number Zahl - + Keyword Schlüsselwort - + Single-quoted string Zeichenkette in Hochkommata - + Operator Operator - + Identifier Bezeichner - + Double-quoted string Zeichenkette in Anführungszeichen @@ -2480,77 +2528,77 @@ QsciLexerPO - + Default Standard - + Comment Kommentar - + Message identifier Meldungsbezeichner - + Message identifier text Meldungsbezeichnertext - + Message string Meldungszeichenkette - + Message string text Meldungszeichenkettentext - + Message context Meldungskontext - + Message context text Meldungskontexttext - + Fuzzy flag Unschrfmarkierung - + Programmer comment Programmiererkommentar - + Reference Referenz - + Flags Markierung - + Message identifier text end-of-line Meldungsbezeichnertext Zeilenende - + Message string text end-of-line Meldungszeichenkettentext Zeilenende - + Message context text end-of-line Meldungskontexttext Zeilenende @@ -2558,87 +2606,87 @@ QsciLexerPOV - + Default Standard - + Comment Kommentar - + Comment line Kommentarzeile - + Number Zahl - + Operator Operator - + Identifier Bezeichner - + String Zeichenkette - + Unclosed string Unbeendete Zeichenkette - + Directive Direktive - + Bad directive Ungültige Direktive - + Objects, CSG and appearance Objekte, CSG und Erscheinung - + Types, modifiers and items Typen, Modifizierer und Items - + Predefined identifiers Vordefinierter Bezeichner - + Predefined functions Vordefinierte Funktion - + User defined 1 Nutzer definiert 1 - + User defined 2 Nutzer definiert 2 - + User defined 3 Nutzer definiert 3 @@ -2646,77 +2694,77 @@ QsciLexerPascal - + Default Standard - + Line comment Zeilenkommentar - + Number Zahl - + Keyword Schlüsselwort - + Single-quoted string Zeichenkette in Hochkommata - + Operator Operator - + Identifier Bezeichner - + '{ ... }' style comment '{ ... }' Kommentar - + '(* ... *)' style comment '(* ... *)' Kommentar - + '{$ ... }' style pre-processor block '{$ ... }' Präprozessorblock - + '(*$ ... *)' style pre-processor block '(*$ ... *)' Präprozessorblock - + Hexadecimal number Hexadezimale Zahl - + Unclosed string Unbeendete Zeichenkette - + Character Zeichen - + Inline asm Inline Assembler @@ -2724,207 +2772,207 @@ QsciLexerPerl - + Default Standard - + Error Fehler - + Comment Kommentar - + POD POD - + Number Zahl - + Keyword Schlüsselwort - + Double-quoted string Zeichenkette in Anführungszeichen - + Single-quoted string Zeichenkette in Hochkommata - + Operator Operator - + Identifier Bezeichner - + Scalar Skalar - + Array Feld - + Hash Hash - + Symbol table Symboltabelle - + Regular expression Regulärer Ausdruck - + Substitution Ersetzung - + Backticks Backticks - + Data section Datensektion - + Here document delimiter Here Dokument-Begrenzer - + Single-quoted here document Here Dokument in Hochkommata - + Double-quoted here document Here Dokument in Anführungszeichen - + Backtick here document Here Dokument in Backticks - + Quoted string (q) Zeichenkette (q) - + Quoted string (qq) Zeichenkette (qq) - + Quoted string (qx) Zeichenkette (qx) - + Quoted string (qr) Zeichenkette (qr) - + Quoted string (qw) Zeichenkette (qw) - + POD verbatim POD wörtlich - + Subroutine prototype Subroutinen Prototyp - + Format identifier Formatidentifikator - + Format body Formatzweig - + Double-quoted string (interpolated variable) Zeichenkette in Anführungszeichen (interpolierte Variable) - + Translation Übersetzung - + Regular expression (interpolated variable) Regulärer Ausdruck (interpolierte Variable) - + Substitution (interpolated variable) Ersetzung (interpolierte Variable) - + Backticks (interpolated variable) Backticks (interpolierte Variable) - + Double-quoted here document (interpolated variable) Here Dokument in Anführungszeichen (interpolierte Variable) - + Backtick here document (interpolated variable) Here Dokument in Backticks (interpolierte Variable) - + Quoted string (qq, interpolated variable) Zeichenkette (qq, interpolierte Variable) - + Quoted string (qx, interpolated variable) Zeichenkette (qx, interpolierte Variable) - + Quoted string (qr, interpolated variable) Zeichenkette (qr, interpolierte Variable) @@ -2932,82 +2980,82 @@ QsciLexerPostScript - + Default Standard - + Comment Kommentar - + DSC comment DSC Kommentar - + DSC comment value DSC Kommentarwert - + Number Zahl - + Name Name - + Keyword Schlüsselwort - + Literal Literal - + Immediately evaluated literal Direkt ausgeführtes Literal - + Array parenthesis Feldklammern - + Dictionary parenthesis Dictionary-Klammern - + Procedure parenthesis Prozedurklammern - + Text Text - + Hexadecimal string Hexadezimale Zeichenkette - + Base85 string Base85 Zeichenkette - + Bad string character Ungültiges Zeichen für Zeichenkette @@ -3015,32 +3063,32 @@ QsciLexerProperties - + Default Standard - + Comment Kommentar - + Section Abschnitt - + Assignment Zuweisung - + Default value Standardwert - + Key Schlüssel @@ -3048,82 +3096,82 @@ QsciLexerPython - + Comment Kommentar - + Number Zahl - + Double-quoted string Zeichenkette in Anführungszeichen - + Single-quoted string Zeichenkette in Hochkommata - + Keyword Schlüsselwort - + Triple single-quoted string Zeichenkette in dreifachen Hochkommata - + Triple double-quoted string Zeichenkette in dreifachen Anführungszeichen - + Class name Klassenname - + Function or method name Funktions- oder Methodenname - + Operator Operator - + Identifier Bezeichner - + Comment block Kommentarblock - + Unclosed string Unbeendete Zeichenkette - + Default Standard - + Highlighted identifier Hervorgehobener Bezeichner - + Decorator Dekorator @@ -3131,157 +3179,157 @@ QsciLexerRuby - + Default Standard - + Comment Kommentar - + Number Zahl - + Double-quoted string Zeichenkette in Anführungszeichen - + Single-quoted string Zeichenkette in Hochkommata - + Keyword Schlüsselwort - + Class name Klassenname - + Function or method name Funktions- oder Methodenname - + Operator Operator - + Identifier Bezeichner - + Error Fehler - + POD POD - + Regular expression Regulärer Ausdruck - + Global Global - + Symbol Symbol - + Module name Modulname - + Instance variable Instanzvariable - + Class variable Klassenvariable - + Backticks Backticks - + Data section Datensektion - + Here document delimiter Here Dokument-Begrenzer - + Here document Here Dokument - + %q string %q Zeichenkette - + %Q string %Q Zeichenkette - + %x string %x Zeichenkette - + %r string %r Zeichenkette - + %w string %w Zeichenkette - + Demoted keyword zurückgestuftes Schlüsselwort - + stdin Stdin - + stdout Stdout - + stderr Stderr @@ -3289,112 +3337,112 @@ QsciLexerSQL - + Default Standard - + Comment Kommentar - + Number Zahl - + Keyword Schlüsselwort - + Single-quoted string Zeichenkette in Hochkommata - + Operator Operator - + Identifier Bezeichner - + Comment line Kommentarzeile - + JavaDoc style comment JavaDoc Kommentar - + Double-quoted string Zeichenkette in Anführungszeichen - + SQL*Plus keyword SQL*Plus Schlüsselwort - + SQL*Plus prompt SQL*Plus Eingabe - + SQL*Plus comment SQL*Plus Kommentar - + # comment line # Kommentarzeile - + JavaDoc keyword JavaDoc Schlüsselwort - + JavaDoc keyword error JavaDoc Schlüsselwortfehler - + User defined 1 Nutzer definiert 1 - + User defined 2 Nutzer definiert 2 - + User defined 3 Nutzer definiert 3 - + User defined 4 Nutzer definiert 4 - + Quoted identifier Bezeichner in Anführungszeichen - + Quoted operator Operator in Anführungszeichen @@ -3402,47 +3450,47 @@ QsciLexerSpice - + Default Standard - + Identifier Bezeichner - + Command Befehl - + Function Funktion - + Parameter Parameter - + Number Zahl - + Delimiter Delimiter - + Value Wert - + Comment Kommentar @@ -3450,112 +3498,112 @@ QsciLexerTCL - + Default Standard - + Comment Kommentar - + Comment line Kommentarzeile - + Number Zahl - + Quoted keyword angeführtes Schlüsselwort - + Quoted string Zeichenkette - + Operator Operator - + Identifier Bezeichner - + Substitution Ersetzung - + Brace substitution Klammerersetzung - + Modifier Modifizierer - + Expand keyword Erweiterungsschlüsselwort - + TCL keyword TCL Schlüsselwort - + Tk keyword Tk Schlüsselwort - + iTCL keyword iTCL Schlüsselwort - + Tk command Tk Befehl - + User defined 1 Nutzer definiert 1 - + User defined 2 Nutzer definiert 2 - + User defined 3 Nutzer definiert 3 - + User defined 4 Nutzer definiert 4 - + Comment box Kommentarbox - + Comment block Kommentarblock @@ -3563,32 +3611,32 @@ QsciLexerTeX - + Default Standard - + Special Spezial - + Group Gruppe - + Symbol Symbol - + Command Befehl - + Text Text @@ -3596,82 +3644,82 @@ QsciLexerVHDL - + Default Standard - + Comment Kommentar - + Comment line Kommentarzeile - + Number Zahl - + String Zeichenkette - + Operator Operator - + Identifier Bezeichner - + Unclosed string Unbeendete Zeichenkette - + Keyword Schlüsselwort - + Standard operator Standardoperator - + Attribute Attribut - + Standard function Standardfunktion - + Standard package Standardpaket - + Standard type Standardtyp - + User defined Nutzer definiert - + Comment block Kommentarblock @@ -3679,122 +3727,172 @@ QsciLexerVerilog - + Default Standard - + + Inactive default + Inaktiver Standard + + + Comment Kommentar - + Line comment Zeilenkommentar - + + Inactive line comment + Inaktiver Zeilenkommentar + + + Bang comment Bang Kommentar - + + Inactive bang comment + Inaktiver Bang Kommentar + + + Number Zahl - + + Inactive number + Inaktive Zahl + + + Primary keywords and identifiers Primäre Schlusselwörter und Bezeichner - + + Inactive primary keywords and identifiers + Inaktive primäre Schlusselwörter und Bezeichner + + + String Zeichenkette - + + Inactive string + Inaktive Zeichenkette + + + Secondary keywords and identifiers Sekundäre Schlusselwörter und Bezeichner - + System task Systemtask - + + Inactive system task + Inaktiver Systemtask + + + Preprocessor block Präprozessorblock - + Operator Operator - + + Inactive operator + Inaktiver Operator + + + Identifier Bezeichner - + Unclosed string Unbeendete Zeichenkette - + + Inactive unclosed string + Inaktive unbeendete Zeichenkette + + + User defined tasks and identifiers Nutzerdefinierte Tasks und Bezeichner - + + Inactive user defined tasks and identifiers + Inaktive nutzerdefinierte Tasks und Bezeichner + + + Keyword comment Schlüsselwortkommentar - + Inactive keyword comment Inaktiver Schlüsselwortkommentar - + Input port declaration Eingabeportdefinition - + Inactive input port declaration Inaktive Eingabeportdefinition - + Output port declaration Ausgabeportdefinition - + Inactive output port declaration Inaktive Ausgabeportdefinition - + Input/output port declaration Ein-/Ausgabeportdefinition - + Inactive input/output port declaration Inaktive Ein-/Ausgabeportdefinition - + Port connection Portverbindung - + Inactive port connection Inaktive Portverbindung @@ -3802,52 +3900,52 @@ QsciLexerYAML - + Default Standard - + Comment Kommentar - + Identifier Bezeichner - + Keyword Schlüsselwort - + Number Zahl - + Reference Referenz - + Document delimiter Dokumentbegrenzer - + Text block marker Textblock Markierung - + Syntax error marker Syntaxfehler Markierung - + Operator Operator @@ -3855,37 +3953,37 @@ QsciScintilla - + &Undo &Rückgängig - + &Redo Wieder&herstellen - + Cu&t &Ausschneiden - + &Copy &Kopieren - + &Paste Ein&fügen - + Delete Löschen - + Select All Alle auswählen Binary files /tmp/tmp6Z6cU5/j7Ppk8t7g0/sqlitebrowser-3.10.100ubuntu1/libs/qscintilla/Qt4Qt5/qscintilla_es.qm and /tmp/tmp6Z6cU5/0KfjjA5oc3/sqlitebrowser-3.11.1/libs/qscintilla/Qt4Qt5/qscintilla_es.qm differ diff -Nru sqlitebrowser-3.10.100ubuntu1/libs/qscintilla/Qt4Qt5/qscintilla_es.ts sqlitebrowser-3.11.1/libs/qscintilla/Qt4Qt5/qscintilla_es.ts --- sqlitebrowser-3.10.100ubuntu1/libs/qscintilla/Qt4Qt5/qscintilla_es.ts 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/libs/qscintilla/Qt4Qt5/qscintilla_es.ts 2019-02-19 23:51:34.000000000 +0000 @@ -4,493 +4,493 @@ QsciCommand - + Move down one line Desplazar una línea hacia abajo - + Extend selection down one line Extender la selección una línea hacia abajo - + Scroll view down one line Desplazar la vista una línea hacia abajo - + Extend rectangular selection down one line Extender la selección rectangular una línea hacia abajo - + Move up one line Desplazar una línea hacia arriba - + Extend selection up one line Extender la selección una línea hacia arriba - + Scroll view up one line Desplazar la vista una línea hacia arriba - + Extend rectangular selection up one line Extender la selección rectangular una línea hacia arriba - + Move up one paragraph Desplazar un párrafo hacia arriba - + Extend selection up one paragraph Extender la selección un párrafo hacia arriba - + Move down one paragraph Desplazar un párrafo hacia abajo - + Scroll to start of document Desplazar al principio del documento - + Scroll to end of document Desplazar al final del documento - + Scroll vertically to centre current line Desplazar verticalmente al centro de la línea actual - + Extend selection down one paragraph Extender la selección un párrafo hacia abajo - + Move left one character Mover un carácter hacia la izquierda - + Extend selection left one character Extender la selección un carácter hacia la izquierda - + Move left one word Mover una palabra hacia la izquierda - + Extend selection left one word Extender la selección una palabra a la izquierda - + Extend rectangular selection left one character Extender la selección rectangular un carácter hacia la izquierda - + Move right one character Mover un carácter hacia la derecha - + Extend selection right one character Extender la selección un carácter hacia la derecha - + Move right one word Mover una palabra hacia la derecha - + Extend selection right one word Extender la selección una palabra a la derecha - + Extend rectangular selection right one character Extender la selección rectangular un carácter hacia la derecha - + Move to end of previous word Mover al final de palabra anterior - + Extend selection to end of previous word Extender selección al final de la palabra anterior - + Move to end of next word Mover al final de la palabra siguiente - + Extend selection to end of next word Extender la selección hasta el final de la palabra siguiente - + Move left one word part Mover parte de una palabra hacia la izquierda - + Extend selection left one word part Extender la selección parte de una palabra a la izquierda - + Move right one word part Mover parte de una palabra hacia la derecha - + Extend selection right one word part Extender la selección parte de una palabra a la derecha - + Move up one page Mover hacia arriba una página - + Extend selection up one page Extender la selección hacia arriba una página - + Extend rectangular selection up one page Extender la selección rectangular hacia arriba una página - + Move down one page Mover hacia abajo una página - + Extend selection down one page Extender la selección hacia abajo una página - + Extend rectangular selection down one page Extender la selección rectangular una página hacia abajo - + Delete current character Borrar el carácter actual - + Cut selection Cortar selección - + Delete word to right Borrar palabra hacia la derecha - + Move to start of document line Mover al principio de la línea del documento - + Extend selection to start of document line Extender selección al principio de la línea del documento - + Extend rectangular selection to start of document line Extender selección rectangular al principio de la línea del documento - + Move to start of display line Mover al principio de la línea visualizada - + Extend selection to start of display line Extender selección al principio de la línea visualizada - + Move to start of display or document line Mover al principio de la línea visualizada o del documento - + Extend selection to start of display or document line Extender selección al principio de la línea visualizada o del documento - + Move to first visible character in document line Mover al primer carácter visible en la línea del documento - + Extend selection to first visible character in document line Extender selección al primer carácter visible en la línea del documento - + Extend rectangular selection to first visible character in document line Extender selección rectangular al primer carácter visible en la línea del documento - + Move to first visible character of display in document line Extender selección al primer carácter visualizado en la línea del documento - + Extend selection to first visible character in display or document line Extender selección al primer carácter de línea visualizada o del documento - + Move to end of document line Mover al final de la línea del documento - + Extend selection to end of document line Extender selección al final de la línea del documento - + Extend rectangular selection to end of document line Extender selección rectangular al final de la línea del documento - + Move to end of display line Mover al final de la línea visualizada - + Extend selection to end of display line Extender selección al final de la línea visualizada - + Move to end of display or document line Mover al final de la línea visualizada o del documento - + Extend selection to end of display or document line Extender selección al final de la línea visualizada o del documento - + Move to start of document Mover al principio del documento - + Extend selection to start of document Extender selección al principio del documento - + Move to end of document Mover al final del documento - + Extend selection to end of document Extender selección al final del documento - + Stuttered move up one page Mover progresivamente una página hacia arriba - + Stuttered extend selection up one page Extender progresivamente selección hacia arriba una página - + Stuttered move down one page Mover progresivamente una página hacia abajo - + Stuttered extend selection down one page Extender progresivamente selección hacia abajo una página - + Delete previous character if not at start of line Borrar carácter anterior si no está al principio de una línea - + Delete right to end of next word Borrar a la derecha hasta el final de la siguiente palabra - + Delete line to right Borrar línea hacia la derecha - + Transpose current and previous lines Transponer líneas actual y anterior - + Duplicate the current line Duplicar línea actual - + Select all Select document Seleccionar todo - + Move selected lines up one line Mover las líneas seleccionadas una línea hacia arriba - + Move selected lines down one line Mover las líneas seleccionadas una línea hacia abajo - + Toggle insert/overtype Conmutar insertar/sobreescribir - + Paste Pegar - + Copy selection Copiar selección - + Insert newline Insertar carácter de nueva línea - + De-indent one level Deshacer un nivel de indentado - + Cancel Cancelar - + Delete previous character Borrar carácter anterior - + Delete word to left Borrar palabra hacia la izquierda - + Delete line to left Borrar línea hacia la izquierda - + Undo last command Deshacer último comando - + Redo last command Rehacer último comando - + Indent one level Indentar un nivel - + Zoom in Aumentar zoom - + Zoom out Disminuir zoom - + Formfeed Carga de la página - + Cut current line Cortar línea actual - + Delete current line Borrar línea actual - + Copy current line Copiar línea actual - + Convert selection to lower case Convertir selección a minúsculas - + Convert selection to upper case Convertir selección a mayúsculas - + Duplicate selection Duplicar selección @@ -498,77 +498,77 @@ QsciLexerAVS - + Default Por defecto - + Block comment Comentario de bloque - + Nested block comment Comentario de bloque anidado - + Line comment Comentario de línea - + Number Número - + Operator Operador - + Identifier Identificador - + Double-quoted string Cadena con comillas dobles - + Triple double-quoted string Cadena con triple comilla doble - + Keyword Palabra clave - + Filter Filtro - + Plugin Plugin - + Function Función - + Clip property Propiedad de recorte - + User defined Definido por el usuario @@ -576,72 +576,72 @@ QsciLexerBash - + Default Por defecto - + Error Error - + Comment Comentario - + Number Número - + Keyword Palabra clave - + Double-quoted string Cadena con comillas dobles - + Single-quoted string Cadena con comillas simples - + Operator Operador - + Identifier Identificador - + Scalar Escalar - + Parameter expansion Expansión de parámetros - + Backticks Comilla inversa - + Here document delimiter Delimitador de documento integrado (here document) - + Single-quoted here document Documento integrado (here document) con comilla simple @@ -649,42 +649,42 @@ QsciLexerBatch - + Default Por defecto - + Comment Comentario - + Keyword Palabra clave - + Label Etiqueta - + Hide command character Ocultar caracteres de comando - + External command Comando externo - + Variable Variable - + Operator Operador @@ -692,77 +692,77 @@ QsciLexerCMake - + Default Por defecto - + Comment Comentario - + String Cadena de caracteres - + Left quoted string Cadena con comillas a la izquierda - + Right quoted string Cadena con comillas a la derecha - + Function Función - + Variable Variable - + Label Etiqueta - + User defined Definido por el usuario - + WHILE block Bloque WHILE - + FOREACH block Bloque FOREACH - + IF block Bloque IF - + MACRO block Bloque MACRO - + Variable within a string Variable en una cadena - + Number Número @@ -770,282 +770,282 @@ QsciLexerCPP - + Default Por defecto - + Inactive default Por defecto inactivo - + C comment Comentario C - + Inactive C comment Comentario C inactivo - + C++ comment Comentario C++ - + Inactive C++ comment Comentario C++ inactivo - + JavaDoc style C comment Comentario C de estilo JavaDoc - + Inactive JavaDoc style C comment Comentario C estilo JavaDoc inactivo - + Number Número - + Inactive number Número inactivo - + Keyword Palabra clave - + Inactive keyword Palabra clave inactiva - + Double-quoted string Cadena con comillas dobles - + Inactive double-quoted string Cadena con doble comilla inactiva - + Single-quoted string Cadena con comillas simples - + Inactive single-quoted string Cadena con comilla simple inactiva - + IDL UUID IDL UUID - + Inactive IDL UUID IDL UUID inactivo - + Pre-processor block Bloque de preprocesador - + Inactive pre-processor block Bloque de preprocesador inactivo - + Operator Operador - + Inactive operator Operador inactivo - + Identifier Identificador - + Inactive identifier Identificador inactivo - + Unclosed string Cadena sin cerrar - + Inactive unclosed string Cadena sin cerrar inactiva - + C# verbatim string Cadena C# textual - + Inactive C# verbatim string Cadena C# textual inactiva - + JavaScript regular expression Expresión regular JavaScript - + Inactive JavaScript regular expression Expresión regular JavaScript inactiva - + JavaDoc style C++ comment Comentario C++ de estilo JavaDoc - + Inactive JavaDoc style C++ comment Comentario C++ estilo JavaDoc inactivo - + Secondary keywords and identifiers Identificadores y palabras clave secundarios - + Inactive secondary keywords and identifiers Identificadores y palabras clave secundarios inactivos - + JavaDoc keyword Palabra clave de Javadoc - + Inactive JavaDoc keyword Palabra clave de JavaDoc inactiva - + JavaDoc keyword error Error en palabra clave de Javadoc - + Inactive JavaDoc keyword error Error en palabra clave de Javadoc inactivo - + Global classes and typedefs Clases globales y typedefs - + Inactive global classes and typedefs Clases globales y typedefs inactivos - + C++ raw string Cadena en bruto C++ - + Inactive C++ raw string Cadena inactiva C++ - + Vala triple-quoted verbatim string Cadena Vala con triple comilla textual - + Inactive Vala triple-quoted verbatim string Cadena Vala con triple comilla textual inactiva - + Pike hash-quoted string Cadena Pike con hash entrecomillado - + Inactive Pike hash-quoted string Cadena Pike con hash entrecomillado inactiva - + Pre-processor C comment Comentario C de preprocesador - + Inactive pre-processor C comment Comentario C de preprocesador inactivo - + JavaDoc style pre-processor comment Comentario de preprocesador estilo JavaDoc - + Inactive JavaDoc style pre-processor comment Comentario de preprocesador estilo JavaDoc inactivo - + User-defined literal Literal definido por el usuario - + Inactive user-defined literal Literal inactivo definido por el usuario - + Task marker Marcador de tarea - + Inactive task marker Marcador de tarea inactivo - + Escape sequence Secuencia de escape - + Inactive escape sequence Secuencia de escape inactiva @@ -1053,117 +1053,117 @@ QsciLexerCSS - + Default Por defecto - + Tag Etiqueta - + Class selector Selector de clase - + Pseudo-class Pseudoclase - + Unknown pseudo-class Pseudoclase desconocida - + Operator Operador - + CSS1 property Propiedad CSS1 - + Unknown property Propiedad desconocida - + Value Valor - + ID selector Selector de ID - + Important Importante - + @-rule Regla-@ - + Double-quoted string Cadena con comillas dobles - + Single-quoted string Cadena con comillas simples - + CSS2 property Propiedad CSS2 - + Attribute Atributo - + CSS3 property Propiedad CSS3 - + Pseudo-element Pseudoelemento - + Extended CSS property Propiedad CSS extendida - + Extended pseudo-class Pseudoclase extendida - + Extended pseudo-element Pseudoelemento extendido - + Media rule Regla de '@media' - + Variable Variable @@ -1171,7 +1171,7 @@ QsciLexerCSharp - + Verbatim string Cadena textual @@ -1179,122 +1179,122 @@ QsciLexerCoffeeScript - + Default Por defecto - + C-style comment Comentario de estilo C - + C++-style comment Comentario de estilo C++ - + JavaDoc C-style comment Comentario de estilo JavaDoc C - + Number Número - + Keyword Palabra clave - + Double-quoted string Cadena con comillas dobles - + Single-quoted string Cadena con comilla simple - + IDL UUID IDL UUID - + Pre-processor block Bloque de preprocesador - + Operator Operador - + Identifier Identificador - + Unclosed string Cadena sin cerrar - + C# verbatim string Cadena C# textual - + Regular expression Expresión regular - + JavaDoc C++-style comment Comentario de estilo JavaDoc C++ - + Secondary keywords and identifiers Identificadores y palabras clave secundarios - + JavaDoc keyword Palabra clave de JavaDoc - + JavaDoc keyword error Error en palabra clave de JavaDoc - + Global classes Clases globales - + Block comment Comentario de bloque - + Block regular expression Expresión regular de bloque - + Block regular expression comment Comentario de expresión regular de bloque - + Instance property Propiedad de instancia @@ -1302,117 +1302,117 @@ QsciLexerD - + Default Por defecto - + Block comment Comentario de bloque - + Line comment Comentario de línea - + DDoc style block comment Comentario de bloque estilo DDoc - + Nesting comment Comentario anidado - + Number Número - + Keyword Palabra clave - + Secondary keyword Palabra clave secundaria - + Documentation keyword Palabra clave de documentación - + Type definition Definición de tipo - + String Cadena de caracteres - + Unclosed string Cadena sin cerrar - + Character Carácter - + Operator Operador - + Identifier Identificador - + DDoc style line comment Comentario de línea estilo DDoc - + DDoc keyword Palabra clave DDoc - + DDoc keyword error Error en palabra clave DDOC - + Backquoted string Cadena con comillas hacia atrás - + Raw string Cadena en bruto - + User defined 1 Definido por el usuario 1 - + User defined 2 Definido por el usuario 2 - + User defined 3 Definido por el usuario 3 @@ -1420,120 +1420,168 @@ QsciLexerDiff - + Default Por defecto - + Comment Comentario - + Command Comando - + Header Encabezado - + Position Posición - + Removed line Línea eliminada - + Added line Línea añadida - + Changed line Línea modificada + QsciLexerEDIFACT + + + Default + Por defecto + + + + Segment start + Inicio de Segmento + + + + Segment end + Final de Segmento + + + + Element separator + Separador de elemento + + + + Composite separator + Separador compuesto + + + + Release separator + Separador de release + + + + UNA segment header + Encabezamiento de segmento UNA + + + + UNH segment header + Encabezamiento de segmento UNH + + + + Badly formed segment + Segmento mal formado + + + QsciLexerFortran77 - + Default Por defecto - + Comment Comentario - + Number Número - + Single-quoted string Cadena con comillas simples - + Double-quoted string Cadena con comillas dobles - + Unclosed string Cadena sin cerrar - + Operator Operador - + Identifier Identificador - + Keyword Palabra clave - + Intrinsic function Función intrínseca - + Extended function Función extendida - + Pre-processor block Bloque de preprocesador - + Dotted operator Operador punteado - + Label Etiqueta - + Continuation Continuación @@ -1541,547 +1589,547 @@ QsciLexerHTML - + HTML default HTML por defecto - + Tag Etiqueta - + Unknown tag Etiqueta desconocida - + Attribute Atributo - + Unknown attribute Atributo desconocido - + HTML number Número HTML - + HTML double-quoted string Cadena HTML con comillas dobles - + HTML single-quoted string Cadena HTML con comillas simples - + Other text in a tag Otro texto en una etiqueta - + HTML comment Comentario HTML - + Entity Entidad - + End of a tag Final de una etiqueta - + Start of an XML fragment Inicio de un fragmento XML - + End of an XML fragment Fin de un fragmento XML - + Script tag Etiqueta de script - + Start of an ASP fragment with @ Inicio de un fragmento ASP con @ - + Start of an ASP fragment Inicio de un fragmento ASP - + CDATA CDATA - + Start of a PHP fragment Inicio de un fragmento PHP - + Unquoted HTML value Valor HTML sin comillas - + ASP X-Code comment Comentario ASP X-Code - + SGML default SGML por defecto - + SGML command Comando SGML - + First parameter of an SGML command Primer parametro de un comando SGML - + SGML double-quoted string Cadena SGML con comillas dobles - + SGML single-quoted string Cadena SGML con comillas simples - + SGML error Error SGML - + SGML special entity Entidad SGML especial - + SGML comment Comentario SGML - + First parameter comment of an SGML command Comentario de primer parametro de un comando SGML - + SGML block default Bloque SGML por defecto - + Start of a JavaScript fragment Inicio de un fragmento JavaScript - + JavaScript default JavaScript por defecto - + JavaScript comment Comentario JavaScript - + JavaScript line comment Comentario de línea de JavaScript - + JavaDoc style JavaScript comment Comentario JavaScript de estilo JavaDoc - + JavaScript number Número JavaScript - + JavaScript word Palabra JavaScript - + JavaScript keyword Palabra clave JavaScript - + JavaScript double-quoted string Cadena JavaScript con comillas dobles - + JavaScript single-quoted string Cadena JavaScript con comillas simples - + JavaScript symbol Símbolo JavaScript - + JavaScript unclosed string Cadena JavaScript sin cerrar - + JavaScript regular expression Expresión regular JavaScript - + Start of an ASP JavaScript fragment Inicio de un fragmento de ASP JavaScript - + ASP JavaScript default ASP JavaScript por defecto - + ASP JavaScript comment Comentario de ASP JavaScript - + ASP JavaScript line comment Comentario de línea de ASP JavaScript - + JavaDoc style ASP JavaScript comment Comentario ASP JavaScript de estilo JavaDoc - + ASP JavaScript number Número ASP JavaScript - + ASP JavaScript word Palabra ASP JavaScript - + ASP JavaScript keyword Palabra clave ASP JavaScript - + ASP JavaScript double-quoted string Cadena ASP JavaScript con comillas dobles - + ASP JavaScript single-quoted string Cadena ASP JavaScript con comillas simples - + ASP JavaScript symbol Símbolo ASP JavaScript - + ASP JavaScript unclosed string Cadena ASP JavaScript sin cerrar - + ASP JavaScript regular expression Expresión regular ASP JavaScript - + Start of a VBScript fragment Inicio de un fragmento VBScript - + VBScript default VBScript por defecto - + VBScript comment Comentario VBScript - + VBScript number Número VBScript - + VBScript keyword Palabra clave VBScript - + VBScript string Cadena de caracteres VBScript - + VBScript identifier Identificador VBScript - + VBScript unclosed string Cadena VBScript sin cerrar - + Start of an ASP VBScript fragment Inicio de un fragmento de ASP VBScript - + ASP VBScript default ASP VBScript por defecto - + ASP VBScript comment Comentario de ASP VBScript - + ASP VBScript number Número ASP VBScript - + ASP VBScript keyword Palabra clave ASP VBScript - + ASP VBScript string Cadena de caracteres ASP VBScript - + ASP VBScript identifier Identificador ASP VBScript - + ASP VBScript unclosed string Cadena ASP VBScript sin cerrar - + Start of a Python fragment Inicio de un fragmento Python - + Python default Python por defecto - + Python comment Comentario Python - + Python number Número Python - + Python double-quoted string Cadena Python con comillas dobles - + Python single-quoted string Cadena Python con comillas simples - + Python keyword Palabra clave de Python - + Python triple double-quoted string Cadena Python con triple comilla doble - + Python triple single-quoted string Cadena Python con triple comilla simple - + Python class name Nombre de clase Python - + Python function or method name Nombre de método o función Python - + Python operator Operador Python - + Python identifier Identificador Python - + Start of an ASP Python fragment Inicio de un fragmento ASP Python - + ASP Python default ASP Python por defecto - + ASP Python comment Comentario ASP Python - + ASP Python number Número ASP Python - + ASP Python double-quoted string Cadena ASP Python con comillas dobles - + ASP Python single-quoted string Cadena ASP Python con comillas simples - + ASP Python keyword Palabra clave de ASP Python - + ASP Python triple double-quoted string Cadena ASP Python con triple comilla doble - + ASP Python triple single-quoted string Cadena ASP Python con triple comilla simple - + ASP Python class name Nombre de clase ASP Python - + ASP Python function or method name Nombre de método o función ASP Python - + ASP Python operator Operador ASP Python - + ASP Python identifier Identificador ASP Python - + PHP default PHP por defecto - + PHP double-quoted string Cadena PHP con comillas dobles - + PHP single-quoted string Cadena PHP con comillas simples - + PHP keyword Palabra clave PHP - + PHP number Número PHP - + PHP variable Variable PHP - + PHP comment Comentario PHP - + PHP line comment Comentario de línea PHP - + PHP double-quoted variable Variable PHP con comillas dobles - + PHP operator Operador PHP @@ -2089,7 +2137,7 @@ QsciLexerIDL - + UUID UUID @@ -2097,72 +2145,72 @@ QsciLexerJSON - + Default Por defecto - + Number Número - + String Cadena - + Unclosed string Cadena sin cerrar - + Property Propiedad - + Escape sequence Secuencia de escape - + Line comment Comentario de línea - + Block comment Comentario de bloque - + Operator Operador - + IRI IRI - + JSON-LD compact IRI JSON-LD compact IRI - + JSON keyword Palabra clave JSON - + JSON-LD keyword Palabra clave JSON-LD - + Parsing error Error de intérprete @@ -2170,7 +2218,7 @@ QsciLexerJavaScript - + Regular expression Expresión regular @@ -2178,102 +2226,102 @@ QsciLexerLua - + Default Por defecto - + Comment Comentario - + Line comment Comentario de línea - + Number Número - + Keyword Palabra clave - + String Cadena de caracteres - + Character Carácter - + Literal string Cadena literal - + Preprocessor Preprocesador - + Operator Operador - + Identifier Identificador - + Unclosed string Cadena sin cerrar - + Basic functions Funciones basicas - + String, table and maths functions Funcines de cadena, tabla y matemáticas - + Coroutines, i/o and system facilities Co-rutinas, e/s y funciones del sistema - + User defined 1 Definido por el usuario 1 - + User defined 2 Definido por el usuario 2 - + User defined 3 Definido por el usuario 3 - + User defined 4 Definido por el usuario 4 - + Label Etiqueta @@ -2281,37 +2329,37 @@ QsciLexerMakefile - + Default Por defecto - + Comment Comentario - + Preprocessor Preprocesador - + Variable Variable - + Operator Operador - + Target Objetivo - + Error Error @@ -2319,112 +2367,112 @@ QsciLexerMarkdown - + Default Por defecto - + Special Especial - + Strong emphasis using double asterisks Énfasis fuerte usando doble asterisco - + Strong emphasis using double underscores Énfasis fuerte usando doble guión bajo - + Emphasis using single asterisks Énfasis usando asterisco sencillo - + Emphasis using single underscores Énfasis usando guión bajo sencillo - + Level 1 header Encabezado de nivel 1 - + Level 2 header Encabezado de nivel 2 - + Level 3 header Encabezado de nivel 3 - + Level 4 header Encabezado de nivel 4 - + Level 5 header Encabezado de nivel 5 - + Level 6 header Encabezado de nivel 6 - + Pre-char Pre-char - + Unordered list item Elemento de lista sin ordenar - + Ordered list item Elemento de lista ordenada - + Block quote Bloque de cita - + Strike out Tachar - + Horizontal rule Regla horizontal - + Link Enlace - + Code between backticks Código entre comillas hacia atrás - + Code between double backticks Código entre comillas hacia atrás dobles - + Code block Bloque de código @@ -2432,47 +2480,47 @@ QsciLexerMatlab - + Default Por defecto - + Comment Comentario - + Command Comando - + Number Número - + Keyword Palabra clave - + Single-quoted string Cadena con comillas simples - + Operator Operador - + Identifier Identificador - + Double-quoted string Cadena con comillas dobles @@ -2480,77 +2528,77 @@ QsciLexerPO - + Default Por defecto - + Comment Comentario - + Message identifier Identificador de mensaje - + Message identifier text Texto identificador de mensaje - + Message string Cadena de mensaje - + Message string text Texto de cadena de mensaje - + Message context Contexto de mensaje - + Message context text Texto de contexto de mensaje - + Fuzzy flag Señalador difuso - + Programmer comment Comentario de programador - + Reference Referencia - + Flags Señaladores - + Message identifier text end-of-line Fin de línea de texto identificador de mensaje - + Message string text end-of-line Fin de línea de texto de cadena de mensaje - + Message context text end-of-line Fin de línea de texto de contexto de mensaje @@ -2558,87 +2606,87 @@ QsciLexerPOV - + Default Por defecto - + Comment Comentario - + Comment line Línea de comentario - + Number Número - + Operator Operador - + Identifier Identificador - + String Cadena de caracteres - + Unclosed string Cadena sin cerrar - + Directive Directiva - + Bad directive Mala directiva - + Objects, CSG and appearance Objetos, CSG y apariencia - + Types, modifiers and items Tipos, modificadores y elementos - + Predefined identifiers Identificadores predefinidos - + Predefined functions Funciones predefinidas - + User defined 1 Definido por el usuario 1 - + User defined 2 Definido por el usuario 2 - + User defined 3 Definido por el usuario 3 @@ -2646,77 +2694,77 @@ QsciLexerPascal - + Default Por defecto - + Line comment Comentario de línea - + Number Número - + Keyword Palabra clave - + Single-quoted string Cadena con comillas simples - + Operator Operador - + Identifier Identificador - + '{ ... }' style comment Comentario de estilo '{ ... }' - + '(* ... *)' style comment Comentario de estilo '(* ... *)' - + '{$ ... }' style pre-processor block Bloque de preprocesador de estilo '{$ ... }' - + '(*$ ... *)' style pre-processor block Bloque de preprocesador de estilo '(*$ ... *)' - + Hexadecimal number Número hexadecimal - + Unclosed string Cadena sin cerrar - + Character Carácter - + Inline asm asm inline @@ -2724,207 +2772,207 @@ QsciLexerPerl - + Default Por defecto - + Error Error - + Comment Comentario - + POD POD - + Number Número - + Keyword Palabra clave - + Double-quoted string Cadena con comillas dobles - + Single-quoted string Cadena con comillas simples - + Operator Operador - + Identifier Identificador - + Scalar Escalar - + Array Array - + Hash Hash - + Symbol table Tabla de símbolos - + Regular expression Expresión regular - + Substitution Sustitución - + Backticks Comilla inversa - + Data section Sección de datos - + Here document delimiter Delimitador de documento integrado (here document) - + Single-quoted here document Documento integrado (here document) con comilla simple - + Double-quoted here document Documento integrado (here document) con comilla doble - + Backtick here document Documento integrado (here document) con comilla inversa - + Quoted string (q) Cadena con comillas (q) - + Quoted string (qq) Cadena con comillas (qq) - + Quoted string (qx) Cadena con comillas (qx) - + Quoted string (qr) Cadena con comillas (qr) - + Quoted string (qw) Cadena con comillas (qw) - + POD verbatim POD textual - + Subroutine prototype Prototipo de subrutina - + Format identifier Identificador de formato - + Format body Cuerpo de formato - + Double-quoted string (interpolated variable) Cadena con doble comilla (variable interpolada) - + Translation Traducción - + Regular expression (interpolated variable) Expresión regular (variable interpolada) - + Substitution (interpolated variable) Substitución (variable interpolada) - + Backticks (interpolated variable) Comilla hacia atrás (variable interpolada) - + Double-quoted here document (interpolated variable) Here document con comilla doble (variable interpolada) - + Backtick here document (interpolated variable) Here document con comilla hacia atrás (variable interpolada) - + Quoted string (qq, interpolated variable) Cadena entrecomillada (qq, variable interpolada) - + Quoted string (qx, interpolated variable) Cadena entrecomillada (qx, variable interpolada) - + Quoted string (qr, interpolated variable) Cadena entrecomillada (qr, variable interpolada) @@ -2932,82 +2980,82 @@ QsciLexerPostScript - + Default Por defecto - + Comment Comentario - + DSC comment Comentario DSC - + DSC comment value Valor de comentario DSC - + Number Número - + Name Nombre - + Keyword Palabra clave - + Literal Literal - + Immediately evaluated literal Literal de evaluación inmediata - + Array parenthesis Paréntesis de array - + Dictionary parenthesis Paréntesis de diccionario - + Procedure parenthesis Paréntesis de procedimiento - + Text Texto - + Hexadecimal string Cadena hexadecimal - + Base85 string Cadena Base85 - + Bad string character Carácter de cadena mala @@ -3015,32 +3063,32 @@ QsciLexerProperties - + Default Por defecto - + Comment Comentario - + Section Sección - + Assignment Asignación - + Default value Valor por defecto - + Key Clave @@ -3048,82 +3096,82 @@ QsciLexerPython - + Default Por defecto - + Comment Comentario - + Number Número - + Double-quoted string Cadena con comillas dobles - + Single-quoted string Cadena con comillas simples - + Keyword Palabra clave - + Triple single-quoted string Cadena con triple comilla simple - + Triple double-quoted string Cadena con triple comilla doble - + Class name Nombre de clase - + Function or method name Nombre de método o función - + Operator Operador - + Identifier Identificador - + Comment block Bloque de comentario - + Unclosed string Cadena sin cerrar - + Highlighted identifier Identificador resaltado - + Decorator Decorador @@ -3131,157 +3179,157 @@ QsciLexerRuby - + Default Por defecto - + Comment Comentario - + Number Número - + Double-quoted string Cadena con comillas dobles - + Single-quoted string Cadena con comillas simples - + Keyword Palabra clave - + Class name Nombre de clase - + Function or method name Nombre de método o función - + Operator Operador - + Identifier Identificador - + Error Error - + POD POD - + Regular expression Expresión regular - + Global Global - + Symbol Símbolo - + Module name Nombre de módulo - + Instance variable Variable de instancia - + Class variable Variable de clase - + Backticks Comilla inversa - + Data section Sección de datos - + Here document delimiter Delimitador de documento integrado (here document) - + Here document Documento integrado (here document) - + %q string Cadena %q - + %Q string Cadena %Q - + %x string Cadena %x - + %r string Cadena %r - + %w string Cadena %w - + Demoted keyword Palabra clave degradada - + stdin stdin - + stdout stdout - + stderr stderr @@ -3289,112 +3337,112 @@ QsciLexerSQL - + Default Por defecto - + Comment Comentario - + Number Número - + Keyword Palabra clave - + Single-quoted string Cadena con comillas simples - + Operator Operador - + Identifier Identificador - + Comment line Línea de comentario - + JavaDoc style comment Comentario de estilo JavaDoc - + Double-quoted string Cadena con comillas dobles - + SQL*Plus keyword Palabra clave SQL*Plus - + SQL*Plus prompt Prompt SQL*Plus - + SQL*Plus comment Comentario SQL*Plus - + # comment line # línea de comentario - + JavaDoc keyword Palabra clave de Javadoc - + JavaDoc keyword error Error en palabra clave de Javadoc - + User defined 1 Definido por el usuario 1 - + User defined 2 Definido por el usuario 2 - + User defined 3 Definido por el usuario 3 - + User defined 4 Definido por el usuario 4 - + Quoted identifier Identificador entrecomillado - + Quoted operator Operador entrecomillado @@ -3402,47 +3450,47 @@ QsciLexerSpice - + Default Por defecto - + Identifier Identificador - + Command Comando - + Function Función - + Parameter Parámetro - + Number Número - + Delimiter Delimitador - + Value Valor - + Comment Comentario @@ -3450,112 +3498,112 @@ QsciLexerTCL - + Default Por defecto - + Comment Comentario - + Comment line Línea de comentario - + Number Número - + Quoted keyword Palabra clave entrecomillada - + Quoted string Cadena entrecomillada - + Operator Operador - + Identifier Identificador - + Substitution Sustitución - + Brace substitution Sustitución de corchetes - + Modifier Modificador - + Expand keyword Expandir palabra clave - + TCL keyword Palabra clave TCL - + Tk keyword Palabra clave Tk - + iTCL keyword Palabra clave iTCL - + Tk command Comando Tk - + User defined 1 Definido por el usuario 1 - + User defined 2 Definido por el usuario 2 - + User defined 3 Definido por el usuario 3 - + User defined 4 Definido por el usuario 4 - + Comment box Caja de comentario - + Comment block Bloque de comentario @@ -3563,32 +3611,32 @@ QsciLexerTeX - + Default Por defecto - + Special Especial - + Group Grupo - + Symbol Símbolo - + Command Comando - + Text Texto @@ -3596,82 +3644,82 @@ QsciLexerVHDL - + Default Por defecto - + Comment Comentario - + Comment line Línea de comentario - + Number Número - + String Cadena de caracteres - + Operator Operador - + Identifier Identificador - + Unclosed string Cadena sin cerrar - + Keyword Palabra clave - + Standard operator Operador estándar - + Attribute Atributo - + Standard function Función estándar - + Standard package Paquete estándar - + Standard type Tipo estándar - + User defined Definido por el usuario - + Comment block Bloque de comentario @@ -3679,122 +3727,172 @@ QsciLexerVerilog - + Default Por defecto - + + Inactive default + Inactivo por defecto + + + Comment Comentario - + Line comment Comentario de línea - + + Inactive line comment + Línea de comentario inactiva + + + Bang comment - Comentario'Bang + Comentario Bang + + + + Inactive bang comment + Comentario Bang inactivo - + Number - + + Inactive number + Número inactivo + + + Primary keywords and identifiers Identificadores y palabras clave primarios - + + Inactive primary keywords and identifiers + Palabras clave primarias e identificadores inactivos + + + String Cadena - + + Inactive string + Cadena inactiva + + + Secondary keywords and identifiers Palabras clave e identificadores secundarios - + System task Tarea de sistema - + + Inactive system task + Tarea de sistema inactiva + + + Preprocessor block Bloque de preprocesador - + Operator Operador - + + Inactive operator + Operador inactivo + + + Identifier Identificador - + Unclosed string Cadena sin cerrar - + + Inactive unclosed string + Cadena sin cerrar inactiva + + + User defined tasks and identifiers Tareas definidas por el usuario e identificadores - + + Inactive user defined tasks and identifiers + Tareas definidas por el usuario e identificadores inactivos + + + Keyword comment Comentario de palabra clave - + Inactive keyword comment Comentario de palabra clave inactiva - + Input port declaration Declaración de puerto de input - + Inactive input port declaration Declaración de puerto de input inactivo - + Output port declaration Declaración de puerto de output - + Inactive output port declaration Declaración de puerto de output inactivo - + Input/output port declaration Declaración de puerto de input/output inactivo - + Inactive input/output port declaration Declaración de puerto de input/output inactivo - + Port connection Conexión de puerto - + Inactive port connection Conexión inactiva de puerto @@ -3802,52 +3900,52 @@ QsciLexerYAML - + Default Por defecto - + Comment Comentario - + Identifier Identificador - + Keyword Palabra clave - + Number Número - + Reference Referencia - + Document delimiter Delimitador de documento - + Text block marker Marcador de bloque de texto - + Syntax error marker Marcador de error de sintaxis - + Operator Operador @@ -3855,37 +3953,37 @@ QsciScintilla - + &Undo &Deshacer - + &Redo &Rehacer - + Cu&t Cor&tar - + &Copy &Copiar - + &Paste &Pegar - + Delete Borrar - + Select All Seleccionar todo Binary files /tmp/tmp6Z6cU5/j7Ppk8t7g0/sqlitebrowser-3.10.100ubuntu1/libs/qscintilla/Qt4Qt5/qscintilla_fr.qm and /tmp/tmp6Z6cU5/0KfjjA5oc3/sqlitebrowser-3.11.1/libs/qscintilla/Qt4Qt5/qscintilla_fr.qm differ diff -Nru sqlitebrowser-3.10.100ubuntu1/libs/qscintilla/Qt4Qt5/qscintilla_fr.ts sqlitebrowser-3.11.1/libs/qscintilla/Qt4Qt5/qscintilla_fr.ts --- sqlitebrowser-3.10.100ubuntu1/libs/qscintilla/Qt4Qt5/qscintilla_fr.ts 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/libs/qscintilla/Qt4Qt5/qscintilla_fr.ts 2019-02-19 23:51:34.000000000 +0000 @@ -4,493 +4,493 @@ QsciCommand - + Move down one line Déplacement d'une ligne vers le bas - + Extend selection down one line Extension de la sélection d'une ligne vers le bas - + Scroll view down one line Decendre la vue d'une ligne - + Extend rectangular selection down one line Extension de la sélection rectangulaire d'une ligne vers le bas - + Move up one line Déplacement d'une ligne vers le haut - + Extend selection up one line Extension de la sélection d'une ligne vers le haut - + Scroll view up one line Remonter la vue d'une ligne - + Extend rectangular selection up one line Extension de la sélection rectangulaire d'une ligne vers le haut - + Move up one paragraph Déplacement d'un paragraphe vers le haut - + Extend selection up one paragraph Extension de la sélection d'un paragraphe vers le haut - + Move down one paragraph Déplacement d'un paragraphe vers le bas - + Scroll to start of document Remonter au début du document - + Scroll to end of document Descendre à la fin du document - + Scroll vertically to centre current line Défiler verticalement pour centrer la ligne courante - + Extend selection down one paragraph Extension de la sélection d'un paragraphe vers le bas - + Move left one character Déplacement d'un caractère vers la gauche - + Extend selection left one character Extension de la sélection d'un caractère vers la gauche - + Move left one word Déplacement d'un mot vers la gauche - + Extend selection left one word Extension de la sélection d'un mot vers la gauche - + Extend rectangular selection left one character Extension de la sélection rectangulaire d'un caractère vers la gauche - + Move right one character Déplacement d'un caractère vers la droite - + Extend selection right one character Extension de la sélection d'un caractère vers la droite - + Move right one word Déplacement d'un mot vers la droite - + Extend selection right one word Extension de la sélection d'un mot vers la droite - + Extend rectangular selection right one character Extension de la sélection rectangulaire d'un caractère vers la droite - + Move to end of previous word Déplacement vers fin du mot précédent - + Extend selection to end of previous word Extension de la sélection vers fin du mot précédent - + Move to end of next word Déplacement vers fin du mot suivant - + Extend selection to end of next word Extension de la sélection vers fin du mot suivant - + Move left one word part Déplacement d'une part de mot vers la gauche - + Extend selection left one word part Extension de la sélection d'une part de mot vers la gauche - + Move right one word part Déplacement d'une part de mot vers la droite - + Extend selection right one word part Extension de la sélection d'une part de mot vers la droite - + Move up one page Déplacement d'une page vers le haut - + Extend selection up one page Extension de la sélection d'une page vers le haut - + Extend rectangular selection up one page Extension de la sélection rectangulaire d'une page vers le haut - + Move down one page Déplacement d'une page vers le bas - + Extend selection down one page Extension de la sélection d'une page vers le bas - + Extend rectangular selection down one page Extension de la sélection rectangulaire d'une page vers le bas - + Delete current character Effacement du caractère courant - + Cut selection Couper la sélection - + Delete word to right Suppression du mot de droite - + Move to start of document line Déplacement vers début de ligne du document - + Extend selection to start of document line Extension de la sélection vers début de ligne du document - + Extend rectangular selection to start of document line - + Move to start of display line - + Extend selection to start of display line - + Move to start of display or document line - + Extend selection to start of display or document line - + Move to first visible character in document line - + Extend selection to first visible character in document line - + Extend rectangular selection to first visible character in document line - + Move to first visible character of display in document line - + Extend selection to first visible character in display or document line - + Move to end of document line - + Extend selection to end of document line - + Extend rectangular selection to end of document line - + Move to end of display line - + Extend selection to end of display line - + Move to end of display or document line - + Extend selection to end of display or document line - + Move to start of document - + Extend selection to start of document - + Move to end of document - + Extend selection to end of document - + Stuttered move up one page - + Stuttered extend selection up one page - + Stuttered move down one page - + Stuttered extend selection down one page - + Delete previous character if not at start of line - + Delete right to end of next word - + Delete line to right Suppression de la partie droite de la ligne - + Transpose current and previous lines - + Duplicate the current line - + Select all Select document - + Move selected lines up one line - + Move selected lines down one line - + Toggle insert/overtype Basculement Insertion /Ecrasement - + Paste Coller - + Copy selection Copier la sélection - + Insert newline - + De-indent one level - + Cancel Annuler - + Delete previous character Suppression du dernier caractère - + Delete word to left Suppression du mot de gauche - + Delete line to left Effacer la partie gauche de la ligne - + Undo last command - + Redo last command Refaire la dernière commande - + Indent one level Indentation d'un niveau - + Zoom in Zoom avant - + Zoom out Zoom arrière - + Formfeed Chargement de la page - + Cut current line Couper la ligne courante - + Delete current line Suppression de la ligne courante - + Copy current line Copier la ligne courante - + Convert selection to lower case Conversion de la ligne courante en minuscules - + Convert selection to upper case Conversion de la ligne courante en majuscules - + Duplicate selection @@ -498,150 +498,150 @@ QsciLexerAVS - + Default Par défaut - + Block comment - + Block de commentaires - + Nested block comment - + Line comment Commentaire de ligne - + Number Nombre - + Operator Opérateur - + Identifier Identificateur - + Double-quoted string Chaine de caractères (guillemets doubles) - + Triple double-quoted string Chaine de caractères HTML (guillemets simples) - + Keyword Mot-clé - + Filter Filtre - + Plugin Extension - + Function Fonction - + Clip property - + User defined - + Définition utilisateur QsciLexerBash - + Default Par défaut - + Error Erreur - + Comment Commentaire - + Number Nombre - + Keyword Mot-clé - + Double-quoted string Chaine de caractères (guillemets doubles) - + Single-quoted string Chaine de caractères (guillemets simples) - + Operator Opérateur - + Identifier Identificateur - + Scalar Scalaire - + Parameter expansion Extension de paramètre - + Backticks Quotes inverses - + Here document delimiter Ici délimiteur de document - + Single-quoted here document Document intégré guillemets simples @@ -649,42 +649,42 @@ QsciLexerBatch - + Default Par défaut - + Comment Commentaire - + Keyword Mot-clé - + Label Titre - + Hide command character Cacher le caratère de commande - + External command Commande externe - + Variable Variable - + Operator Opérateur @@ -692,77 +692,77 @@ QsciLexerCMake - + Default Par défaut - + Comment Commentaire - + String Chaîne de caractères - + Left quoted string - + Right quoted string - + Function - + Fonction - + Variable Variable - + Label Titre - + User defined - + Définition utilisateur - + WHILE block - + FOREACH block - + IF block - + MACRO block - + Variable within a string - + Number Nombre @@ -770,282 +770,282 @@ QsciLexerCPP - + Default Par défaut - + Inactive default - + C comment Commentaire C - + Inactive C comment - + C++ comment Commentaire C++ - + Inactive C++ comment - + JavaDoc style C comment Commentaire C de style JavaDoc - + Inactive JavaDoc style C comment - + Number Nombre - + Inactive number - + Keyword Mot-clé - + Inactive keyword - + Double-quoted string Chaine de caractères (guillemets doubles) - + Inactive double-quoted string - + Single-quoted string Chaine de caractères (guillemets simples) - + Inactive single-quoted string - + IDL UUID - + Inactive IDL UUID - + Pre-processor block Instructions de pré-processing - + Inactive pre-processor block - + Operator Opérateur - + Inactive operator - + Identifier Identificateur - + Inactive identifier - + Unclosed string Chaine de caractères non refermée - + Inactive unclosed string - + C# verbatim string - + Inactive C# verbatim string - + JavaScript regular expression Expression régulière JavaScript - + Inactive JavaScript regular expression - + JavaDoc style C++ comment Commentaire C++ de style JavaDoc - + Inactive JavaDoc style C++ comment - + Secondary keywords and identifiers Seconds mots-clés et identificateurs - + Inactive secondary keywords and identifiers - + JavaDoc keyword Mot-clé JavaDoc - + Inactive JavaDoc keyword - + JavaDoc keyword error Erreur de mot-clé JavaDoc - + Inactive JavaDoc keyword error - + Global classes and typedefs Classes globales et définitions de types - + Inactive global classes and typedefs - + C++ raw string - + Inactive C++ raw string - + Vala triple-quoted verbatim string - + Inactive Vala triple-quoted verbatim string - + Pike hash-quoted string - + Inactive Pike hash-quoted string - + Pre-processor C comment - + Inactive pre-processor C comment - + JavaDoc style pre-processor comment - + Inactive JavaDoc style pre-processor comment - + User-defined literal - + Inactive user-defined literal - + Task marker - + Inactive task marker - + Escape sequence - + Séquence d'échappement - + Inactive escape sequence @@ -1053,117 +1053,117 @@ QsciLexerCSS - + Default Par défaut - + Tag Balise - + Class selector Classe - + Pseudo-class Pseudo-classe - + Unknown pseudo-class Peudo-classe inconnue - + Operator Opérateur - + CSS1 property Propriété CSS1 - + Unknown property Propriété inconnue - + Value Valeur - + ID selector ID - + Important Important - + @-rule règle-@ - + Double-quoted string Chaine de caractères (guillemets doubles) - + Single-quoted string Chaine de caractères (guillemets simples) - + CSS2 property Propriété CSS2 - + Attribute Attribut - + CSS3 property Propriété CSS3 - + Pseudo-element - + Extended CSS property - + Extended pseudo-class - + Extended pseudo-element - + Media rule - + Variable Variable @@ -1171,7 +1171,7 @@ QsciLexerCSharp - + Verbatim string Chaine verbatim @@ -1179,122 +1179,122 @@ QsciLexerCoffeeScript - + Default Par défaut - + C-style comment - + C++-style comment - + JavaDoc C-style comment - + Number Nombre - + Keyword Mot-clé - + Double-quoted string Chaine de caractères (guillemets doubles) - + Single-quoted string Chaine de caractères (guillemets simples) - + IDL UUID - + Pre-processor block Instructions de pré-processing - + Operator Opérateur - + Identifier Identificateur - + Unclosed string Chaine de caractères non refermée - + C# verbatim string - + Regular expression Expression régulière - + JavaDoc C++-style comment - + Secondary keywords and identifiers Seconds mots-clés et identificateurs - + JavaDoc keyword Mot-clé JavaDoc - + JavaDoc keyword error Erreur de mot-clé JavaDoc - + Global classes - + Block comment - + Block de commentaires - + Block regular expression - + Block regular expression comment - + Instance property @@ -1302,117 +1302,117 @@ QsciLexerD - + Default Par défaut - + Block comment - + Block de commentaires - + Line comment Commentaire de ligne - + DDoc style block comment - + Nesting comment - + Number Nombre - + Keyword Mot-clé - + Secondary keyword - + Documentation keyword - + Type definition - + String Chaîne de caractères - + Unclosed string Chaine de caractères non refermée - + Character Caractère - + Operator Opérateur - + Identifier Identificateur - + DDoc style line comment - + DDoc keyword Mot-clé DDoc - + DDoc keyword error Erreur de mot-clé DDoc - + Backquoted string - + Raw string - + User defined 1 Définition utilisateur 1 - + User defined 2 Définition utilisateur 2 - + User defined 3 Définition utilisateur 3 @@ -1420,120 +1420,168 @@ QsciLexerDiff - + Default Par défaut - + Comment Commentaire - + Command Commande - + Header En-tête - + Position Position - + Removed line Ligne supprimée - + Added line Ligne ajoutée - + Changed line Ligne changée + QsciLexerEDIFACT + + + Default + Par défaut + + + + Segment start + + + + + Segment end + + + + + Element separator + + + + + Composite separator + + + + + Release separator + + + + + UNA segment header + + + + + UNH segment header + + + + + Badly formed segment + + + + QsciLexerFortran77 - + Default Par défaut - + Comment Commentaire - + Number Nombre - + Single-quoted string Chaine de caractères (guillemets simples) - + Double-quoted string Chaine de caractères (guillemets doubles) - + Unclosed string Chaine de caractères non refermée - + Operator Opérateur - + Identifier Identificateur - + Keyword Mot-clé - + Intrinsic function Fonction intrinsèque - + Extended function Fonction étendue - + Pre-processor block Instructions de pré-processing - + Dotted operator - + Label Titre - + Continuation @@ -1541,547 +1589,547 @@ QsciLexerHTML - + HTML default HTML par défaut - + Tag Balise - + Unknown tag Balise inconnue - + Attribute Attribut - + Unknown attribute Attribut inconnu - + HTML number Nombre HTML - + HTML double-quoted string Chaine de caractères HTML (guillemets doubles) - + HTML single-quoted string Chaine de caractères HTML (guillemets simples) - + Other text in a tag Autre texte dans les balises - + HTML comment Commentaire HTML - + Entity Entité - + End of a tag Balise fermante - + Start of an XML fragment Début de block XML - + End of an XML fragment Fin de block XML - + Script tag Balise de script - + Start of an ASP fragment with @ Début de block ASP avec @ - + Start of an ASP fragment Début de block ASP - + CDATA CDATA - + Start of a PHP fragment Début de block PHP - + Unquoted HTML value Valeur HTML sans guillemets - + ASP X-Code comment Commentaire X-Code ASP - + SGML default SGML par défaut - + SGML command Commande SGML - + First parameter of an SGML command Premier paramètre de commande SGML - + SGML double-quoted string Chaine de caractères SGML (guillemets doubles) - + SGML single-quoted string Chaine de caractères SGML (guillemets simples) - + SGML error Erreur SGML - + SGML special entity Entité SGML spéciale - + SGML comment Commentaire SGML - + First parameter comment of an SGML command Premier paramètre de commentaire de commande SGML - + SGML block default Block SGML par défaut - + Start of a JavaScript fragment Début de block JavaScript - + JavaScript default JavaScript par défaut - + JavaScript comment Commentaire JavaScript - + JavaScript line comment Commentaire de ligne JavaScript - + JavaDoc style JavaScript comment Commentaire JavaScript de style JavaDoc - + JavaScript number Nombre JavaScript - + JavaScript word Mot JavaScript - + JavaScript keyword Mot-clé JavaScript - + JavaScript double-quoted string Chaine de caractères JavaScript (guillemets doubles) - + JavaScript single-quoted string Chaine de caractères JavaScript (guillemets simples) - + JavaScript symbol Symbole JavaScript - + JavaScript unclosed string Chaine de caractères JavaScript non refermée - + JavaScript regular expression Expression régulière JavaScript - + Start of an ASP JavaScript fragment Début de block JavaScript ASP - + ASP JavaScript default JavaScript ASP par défaut - + ASP JavaScript comment Commentaire JavaScript ASP - + ASP JavaScript line comment Commentaire de ligne JavaScript ASP - + JavaDoc style ASP JavaScript comment Commentaire JavaScript ASP de style JavaDoc - + ASP JavaScript number Nombre JavaScript ASP - + ASP JavaScript word Mot JavaScript ASP - + ASP JavaScript keyword Mot-clé JavaScript ASP - + ASP JavaScript double-quoted string Chaine de caractères JavaScript ASP (guillemets doubles) - + ASP JavaScript single-quoted string Chaine de caractères JavaScript ASP (guillemets simples) - + ASP JavaScript symbol Symbole JavaScript ASP - + ASP JavaScript unclosed string Chaine de caractères JavaScript ASP non refermée - + ASP JavaScript regular expression Expression régulière JavaScript ASP - + Start of a VBScript fragment Début de block VBScript - + VBScript default VBScript par défaut - + VBScript comment Commentaire VBScript - + VBScript number Nombre VBScript - + VBScript keyword Mot-clé VBScript - + VBScript string Chaine de caractères VBScript - + VBScript identifier Identificateur VBScript - + VBScript unclosed string Chaine de caractères VBScript non refermée - + Start of an ASP VBScript fragment Début de block VBScript ASP - + ASP VBScript default VBScript ASP par défaut - + ASP VBScript comment Commentaire VBScript ASP - + ASP VBScript number Nombre VBScript ASP - + ASP VBScript keyword Mot-clé VBScript ASP - + ASP VBScript string Chaine de caractères VBScript ASP - + ASP VBScript identifier Identificateur VBScript ASP - + ASP VBScript unclosed string Chaine de caractères VBScript ASP non refermée - + Start of a Python fragment Début de block Python - + Python default Python par défaut - + Python comment Commentaire Python - + Python number Nombre Python - + Python double-quoted string Chaine de caractères Python (guillemets doubles) - + Python single-quoted string Chaine de caractères Python (guillemets simples) - + Python keyword Mot-clé Python - + Python triple double-quoted string Chaine de caractères Python (triples guillemets doubles) - + Python triple single-quoted string Chaine de caractères Python (triples guillemets simples) - + Python class name Nom de classe Python - + Python function or method name Méthode ou fonction Python - + Python operator Opérateur Python - + Python identifier Identificateur Python - + Start of an ASP Python fragment Début de block Python ASP - + ASP Python default Python ASP par défaut - + ASP Python comment Commentaire Python ASP - + ASP Python number Nombre Python ASP - + ASP Python double-quoted string Chaine de caractères Python ASP (guillemets doubles) - + ASP Python single-quoted string Chaine de caractères Python ASP (guillemets simples) - + ASP Python keyword Mot-clé Python ASP - + ASP Python triple double-quoted string Chaine de caractères Python ASP (triples guillemets doubles) - + ASP Python triple single-quoted string Chaine de caractères Python ASP (triples guillemets simples) - + ASP Python class name Nom de classe Python ASP - + ASP Python function or method name Méthode ou fonction Python ASP - + ASP Python operator Opérateur Python ASP - + ASP Python identifier Identificateur Python ASP - + PHP default PHP par défaut - + PHP double-quoted string Chaine de caractères PHP (guillemets doubles) - + PHP single-quoted string Chaine de caractères PHP (guillemets simples) - + PHP keyword Mot-clé PHP - + PHP number Nombre PHP - + PHP variable Variable PHP - + PHP comment Commentaire PHP - + PHP line comment Commentaire de ligne PHP - + PHP double-quoted variable Variable PHP (guillemets doubles) - + PHP operator Opérateur PHP @@ -2089,7 +2137,7 @@ QsciLexerIDL - + UUID UUID @@ -2097,72 +2145,72 @@ QsciLexerJSON - + Default Par défaut - + Number Nombre - + String Chaîne de caractères - + Unclosed string Chaine de caractères non refermée - + Property Propriété - + Escape sequence Séquence d'échappement - + Line comment Commentaire de ligne - + Block comment Block de commentaires - + Operator Opérateur - + IRI - + JSON-LD compact IRI - + JSON keyword Mot-clé JSON - + JSON-LD keyword Mot-clé JSON-LD - + Parsing error Erreur d'analyse @@ -2170,7 +2218,7 @@ QsciLexerJavaScript - + Regular expression Expression régulière @@ -2178,102 +2226,102 @@ QsciLexerLua - + Default Par défaut - + Comment Commentaire - + Line comment Commentaire de ligne - + Number Nombre - + Keyword Mot-clé - + String Chaîne de caractères - + Character Caractère - + Literal string Chaîne littérale - + Preprocessor Préprocessing - + Operator Opérateur - + Identifier Identificateur - + Unclosed string Chaine de caractères non refermée - + Basic functions Fonctions de base - + String, table and maths functions Fonctions sur les chaines, tables et fonctions math - + Coroutines, i/o and system facilities Coroutines, i/o et fonctions système - + User defined 1 Définition utilisateur 1 - + User defined 2 Définition utilisateur 2 - + User defined 3 Définition utilisateur 3 - + User defined 4 Définition utilisateur 4 - + Label Titre @@ -2281,37 +2329,37 @@ QsciLexerMakefile - + Default Par défaut - + Comment Commentaire - + Preprocessor Préprocessing - + Variable Variable - + Operator Opérateur - + Target Cible - + Error Erreur @@ -2319,112 +2367,112 @@ QsciLexerMarkdown - + Default Par défaut - + Special Spécial - + Strong emphasis using double asterisks - + Strong emphasis using double underscores - + Emphasis using single asterisks - + Emphasis using single underscores - + Level 1 header - + Level 2 header - + Level 3 header - + Level 4 header - + Level 5 header - + Level 6 header - + Pre-char - + Unordered list item - + Ordered list item - + Block quote - + Strike out - + Horizontal rule - + Link - + Code between backticks - + Code between double backticks - + Code block @@ -2432,47 +2480,47 @@ QsciLexerMatlab - + Default Par défaut - + Comment Commentaire - + Command Commande - + Number Nombre - + Keyword Mot-clé - + Single-quoted string Chaine de caractères (guillemets simples) - + Operator Opérateur - + Identifier Identificateur - + Double-quoted string Chaine de caractères (guillemets doubles) @@ -2480,77 +2528,77 @@ QsciLexerPO - + Default Par défaut - + Comment Commentaire - + Message identifier - + Message identifier text - + Message string - + Message string text - + Message context - + Message context text - + Fuzzy flag - + Programmer comment - + Reference - + Référence - + Flags - + Message identifier text end-of-line - + Message string text end-of-line - + Message context text end-of-line @@ -2558,87 +2606,87 @@ QsciLexerPOV - + Default Par défaut - + Comment Commentaire - + Comment line Ligne commentée - + Number Nombre - + Operator Opérateur - + Identifier Identificateur - + String Chaîne de caractères - + Unclosed string Chaine de caractères non refermée - + Directive Directive - + Bad directive Mauvaise directive - + Objects, CSG and appearance Objets, CSG et apparence - + Types, modifiers and items Types, modifieurs et éléments - + Predefined identifiers Identifiants prédéfinis - + Predefined functions Fonctions prédéfinies - + User defined 1 Définition utilisateur 1 - + User defined 2 Définition utilisateur 2 - + User defined 3 Définition utilisateur 3 @@ -2646,77 +2694,77 @@ QsciLexerPascal - + Default Par défaut - + Line comment Commentaire de ligne - + Number Nombre - + Keyword Mot-clé - + Single-quoted string Chaine de caractères (guillemets simples) - + Operator Opérateur - + Identifier Identificateur - + '{ ... }' style comment - + '(* ... *)' style comment - + '{$ ... }' style pre-processor block - + '(*$ ... *)' style pre-processor block - + Hexadecimal number Nombre hexadécimal - + Unclosed string Chaine de caractères non refermée - + Character Caractère - + Inline asm Asm en ligne @@ -2724,207 +2772,207 @@ QsciLexerPerl - + Default Par défaut - + Error Erreur - + Comment Commentaire - + POD POD - + Number Nombre - + Keyword Mot-clé - + Double-quoted string Chaine de caractères (guillemets doubles) - + Single-quoted string Chaine de caractères (guillemets simples) - + Operator Opérateur - + Identifier Identificateur - + Scalar Scalaire - + Array Tableau - + Hash Hashage - + Symbol table Table de symboles - + Regular expression Expression régulière - + Substitution Substitution - + Backticks Quotes inverses - + Data section Section de données - + Here document delimiter Ici délimiteur de document - + Single-quoted here document Document intégré guillemets simples - + Double-quoted here document Document intégré guillemets doubles - + Backtick here document Document intégré quotes inverses - + Quoted string (q) Chaine quotée (q) - + Quoted string (qq) Chaine quotée (qq) - + Quoted string (qx) Chaine quotée (qx) - + Quoted string (qr) Chaine quotée (qr) - + Quoted string (qw) Chaine quotée (qw) - + POD verbatim POD verbatim - + Subroutine prototype - + Format identifier - + Format body - + Double-quoted string (interpolated variable) - + Translation Traduction - + Regular expression (interpolated variable) - + Substitution (interpolated variable) - + Backticks (interpolated variable) - + Double-quoted here document (interpolated variable) - + Backtick here document (interpolated variable) - + Quoted string (qq, interpolated variable) - + Quoted string (qx, interpolated variable) - + Quoted string (qr, interpolated variable) @@ -2932,82 +2980,82 @@ QsciLexerPostScript - + Default Par défaut - + Comment Commentaire - + DSC comment Commentaire DSC - + DSC comment value - + Number Nombre - + Name Nom - + Keyword Mot-clé - + Literal - + Immediately evaluated literal - + Array parenthesis - + Dictionary parenthesis - + Procedure parenthesis - + Text Texte - + Hexadecimal string - + Base85 string - + Bad string character @@ -3015,32 +3063,32 @@ QsciLexerProperties - + Default Par défaut - + Comment Commentaire - + Section Section - + Assignment Affectation - + Default value Valeur par défaut - + Key Clé @@ -3048,82 +3096,82 @@ QsciLexerPython - + Default Par défaut - + Comment Commentaire - + Number Nombre - + Double-quoted string Chaine de caractères (guillemets doubles) - + Single-quoted string Chaine de caractères (guillemets simples) - + Keyword Mot-clé - + Triple single-quoted string Chaine de caractères HTML (guillemets simples) - + Triple double-quoted string Chaine de caractères HTML (guillemets simples) - + Class name Nom de classe - + Function or method name Nom de méthode ou de fonction - + Operator Opérateur - + Identifier Identificateur - + Comment block Block de commentaires - + Unclosed string Chaine de caractères non refermée - + Highlighted identifier - + Decorator @@ -3131,157 +3179,157 @@ QsciLexerRuby - + Default Par défaut - + Comment Commentaire - + Number Nombre - + Double-quoted string Chaine de caractères (guillemets doubles) - + Single-quoted string Chaine de caractères (guillemets simples) - + Keyword Mot-clé - + Class name Nom de classe - + Function or method name Nom de méthode ou de fonction - + Operator Opérateur - + Identifier Identificateur - + Error Erreur - + POD POD - + Regular expression Expression régulière - + Global Global - + Symbol Symbole - + Module name Nom de module - + Instance variable - + Class variable - + Backticks Quotes inverses - + Data section Section de données - + Here document delimiter Ici délimiteur de document - + Here document Ici document - + %q string - + %Q string - + %x string - + %r string - + %w string - + Demoted keyword - + stdin - + stdout - + stderr @@ -3289,112 +3337,112 @@ QsciLexerSQL - + Default Par défaut - + Comment Commentaire - + Number Nombre - + Keyword Mot-clé - + Single-quoted string Chaine de caractères (guillemets simples) - + Operator Opérateur - + Identifier Identificateur - + Comment line Ligne commentée - + JavaDoc style comment Commentaire style JavaDoc - + Double-quoted string Chaine de caractères (guillemets doubles) - + SQL*Plus keyword Mot-clé SQL*Plus - + SQL*Plus prompt Prompt SQL*Plus - + SQL*Plus comment Commentaire SQL*Plus - + # comment line # Ligne commentée - + JavaDoc keyword Mot-clé JavaDoc - + JavaDoc keyword error Erreur de mot-clé JavaDoc - + User defined 1 Définition utilisateur 1 - + User defined 2 Définition utilisateur 2 - + User defined 3 Définition utilisateur 3 - + User defined 4 Définition utilisateur 4 - + Quoted identifier - + Quoted operator @@ -3402,47 +3450,47 @@ QsciLexerSpice - + Default Par défaut - + Identifier Identificateur - + Command Commande - + Function Fonction - + Parameter Paramètre - + Number Nombre - + Delimiter Délimiteur - + Value Valeur - + Comment Commentaire @@ -3450,112 +3498,112 @@ QsciLexerTCL - + Default Par défaut - + Comment Commentaire - + Comment line Ligne commentée - + Number Nombre - + Quoted keyword - + Quoted string - + Operator Opérateur - + Identifier Identificateur - + Substitution Substitution - + Brace substitution - + Modifier - + Expand keyword - + TCL keyword - + Tk keyword - + iTCL keyword - + Tk command - + User defined 1 Définition utilisateur 1 - + User defined 2 Définition utilisateur 2 - + User defined 3 Définition utilisateur 3 - + User defined 4 Définition utilisateur 4 - + Comment box - + Comment block Block de commentaires @@ -3563,32 +3611,32 @@ QsciLexerTeX - + Default Par défaut - + Special Spécial - + Group Groupe - + Symbol Symbole - + Command Commande - + Text Texte @@ -3596,82 +3644,82 @@ QsciLexerVHDL - + Default Par défaut - + Comment Commentaire - + Comment line Ligne commentée - + Number Nombre - + String Chaîne de caractères - + Operator Opérateur - + Identifier Identificateur - + Unclosed string Chaine de caractères non refermée - + Keyword Mot-clé - + Standard operator - + Attribute Attribut - + Standard function - + Standard package - + Standard type - + User defined Définition utilisateur - + Comment block Block de commentaires @@ -3679,122 +3727,172 @@ QsciLexerVerilog - + Default Par défaut - + + Inactive default + + + + Comment Commentaire - + Line comment Commentaire de ligne - + + Inactive line comment + + + + Bang comment - + + Inactive bang comment + + + + Number Nombre - + + Inactive number + + + + Primary keywords and identifiers - + + Inactive primary keywords and identifiers + + + + String Chaîne de caractères - + + Inactive string + + + + Secondary keywords and identifiers Seconds mots-clés et identificateurs - + System task - + + Inactive system task + + + + Preprocessor block - + Operator Opérateur - + + Inactive operator + + + + Identifier Identificateur - + Unclosed string Chaine de caractères non refermée - + + Inactive unclosed string + + + + User defined tasks and identifiers - + + Inactive user defined tasks and identifiers + + + + Keyword comment - + Inactive keyword comment - + Input port declaration - + Inactive input port declaration - + Output port declaration - + Inactive output port declaration - + Input/output port declaration - + Inactive input/output port declaration - + Port connection - + Inactive port connection @@ -3802,52 +3900,52 @@ QsciLexerYAML - + Default Par défaut - + Comment Commentaire - + Identifier Identificateur - + Keyword Mot-clé - + Number Nombre - + Reference Référence - + Document delimiter Délimiteur de document - + Text block marker - + Syntax error marker - + Operator Opérateur @@ -3855,37 +3953,37 @@ QsciScintilla - + &Undo - + &Redo - + Cu&t - + &Copy - + &Paste - + Delete - + Select All diff -Nru sqlitebrowser-3.10.100ubuntu1/libs/qscintilla/Qt4Qt5/qscintilla.pro sqlitebrowser-3.11.1/libs/qscintilla/Qt4Qt5/qscintilla.pro --- sqlitebrowser-3.10.100ubuntu1/libs/qscintilla/Qt4Qt5/qscintilla.pro 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/libs/qscintilla/Qt4Qt5/qscintilla.pro 2019-02-19 23:51:34.000000000 +0000 @@ -1,6 +1,6 @@ # The project file for the QScintilla library. # -# Copyright (c) 2017 Riverbank Computing Limited +# Copyright (c) 2018 Riverbank Computing Limited # # This file is part of QScintilla. # @@ -20,13 +20,15 @@ # This must be kept in sync with Python/configure.py, Python/configure-old.py, # example-Qt4Qt5/application.pro and designer-Qt4Qt5/designer.pro. -!win32:VERSION = 13.0.0 +!win32:VERSION = 13.2.1 TEMPLATE = lib TARGET = qscintilla2 CONFIG += qt warn_off thread exceptions hide_symbols staticlib debug_and_release INCLUDEPATH += . ../include ../lexlib ../src +QMAKE_CXXFLAGS += -std=c++11 + !CONFIG(staticlib) { DEFINES += QSCINTILLA_MAKE_DLL } @@ -41,6 +43,8 @@ # Work around QTBUG-39300. CONFIG -= android_install +} else { + DEFINES += QT_NO_ACCESSIBILITY } # Comment this in if you want the internal Scintilla classes to be placed in a @@ -76,36 +80,20 @@ HEADERS = \ ./Qsci/qsciglobal.h \ - ./Qsci/qsciscintilla.h \ - ./Qsci/qsciscintillabase.h \ - ./Qsci/qsciabstractapis.h \ - ./Qsci/qsciapis.h \ ./Qsci/qscicommand.h \ ./Qsci/qscicommandset.h \ ./Qsci/qscidocument.h \ - ./Qsci/qscilexer.h \ - ./Qsci/qscilexercustom.h \ - ./Qsci/qscilexersql.h \ - ./Qsci/qscilexerjson.h \ - ./Qsci/qscilexerhtml.h \ - ./Qsci/qscilexerxml.h \ - ./Qsci/qscilexerjavascript.h \ - ./Qsci/qscilexercpp.h \ - ./Qsci/qscilexerpython.h \ - ./Qsci/qscimacro.h \ ./Qsci/qsciprinter.h \ ./Qsci/qscistyle.h \ ./Qsci/qscistyledtext.h \ ListBoxQt.h \ - SciClasses.h \ SciNamespace.h \ - ScintillaQt.h \ ../include/ILexer.h \ ../include/Platform.h \ - ../include/Sci_Position.h \ ../include/SciLexer.h \ ../include/Scintilla.h \ ../include/ScintillaWidget.h \ + ../include/Sci_Position.h \ ../lexlib/Accessor.h \ ../lexlib/CharacterCategory.h \ ../lexlib/CharacterSet.h \ @@ -116,7 +104,6 @@ ../lexlib/LexerSimple.h \ ../lexlib/OptionSet.h \ ../lexlib/PropSetSimple.h \ - ../lexlib/StringCopy.h \ ../lexlib/StyleContext.h \ ../lexlib/SubStyles.h \ ../lexlib/WordList.h \ @@ -130,15 +117,12 @@ ../src/ContractionState.h \ ../src/Decoration.h \ ../src/Document.h \ - ../src/EditModel.h \ ../src/Editor.h \ - ../src/EditView.h \ ../src/ExternalLexer.h \ ../src/FontQuality.h \ ../src/Indicator.h \ ../src/KeyMap.h \ ../src/LineMarker.h \ - ../src/MarginView.h \ ../src/Partitioning.h \ ../src/PerLine.h \ ../src/PositionCache.h \ @@ -151,7 +135,26 @@ ../src/UnicodeFromUTF8.h \ ../src/UniConversion.h \ ../src/ViewStyle.h \ - ../src/XPM.h + ../src/XPM.h \ + ../src/Position.h \ + ../src/SparseVector.h \ + ./Qsci/qsciscintilla.h \ + ./Qsci/qsciscintillabase.h \ + ./Qsci/qsciabstractapis.h \ + ./Qsci/qsciapis.h \ + ./Qsci/qscilexer.h \ + ./Qsci/qscilexercustom.h \ + ./Qsci/qscilexersql.h \ + ./Qsci/qscilexerjson.h \ + ./Qsci/qscilexerhtml.h \ + ./Qsci/qscilexerxml.h \ + ./Qsci/qscilexerjavascript.h \ + ./Qsci/qscilexercpp.h \ + ./Qsci/qscilexerpython.h \ + ./Qsci/qscimacro.h \ + SciClasses.h \ + ScintillaQt.h \ + SciAccessibility.h SOURCES = \ qsciscintilla.cpp \ @@ -180,6 +183,7 @@ ListBoxQt.cpp \ PlatQt.cpp \ ScintillaQt.cpp \ + SciAccessibility.cpp \ ../lexers/LexSQL.cpp \ ../lexers/LexJSON.cpp \ ../lexers/LexHTML.cpp \ @@ -203,8 +207,8 @@ ../src/ContractionState.cpp \ ../src/Decoration.cpp \ ../src/Document.cpp \ - ../src/EditModel.cpp \ ../src/Editor.cpp \ + ../src/EditModel.cpp \ ../src/EditView.cpp \ ../src/ExternalLexer.cpp \ ../src/Indicator.cpp \ Binary files /tmp/tmp6Z6cU5/j7Ppk8t7g0/sqlitebrowser-3.10.100ubuntu1/libs/qscintilla/Qt4Qt5/qscintilla_pt_br.qm and /tmp/tmp6Z6cU5/0KfjjA5oc3/sqlitebrowser-3.11.1/libs/qscintilla/Qt4Qt5/qscintilla_pt_br.qm differ diff -Nru sqlitebrowser-3.10.100ubuntu1/libs/qscintilla/Qt4Qt5/qscintilla_pt_br.ts sqlitebrowser-3.11.1/libs/qscintilla/Qt4Qt5/qscintilla_pt_br.ts --- sqlitebrowser-3.10.100ubuntu1/libs/qscintilla/Qt4Qt5/qscintilla_pt_br.ts 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/libs/qscintilla/Qt4Qt5/qscintilla_pt_br.ts 2019-02-19 23:51:34.000000000 +0000 @@ -4,493 +4,493 @@ QsciCommand - + Move down one line Mover uma linha para baixo - + Extend selection down one line Extender a seleção uma linha para baixo - + Scroll view down one line Descer a visão uma linha para baixo - + Extend rectangular selection down one line Extender a seleção retangular uma linha para baixo - + Move up one line Mover uma linha para cima - + Extend selection up one line Extender a seleção uma linha para cima - + Scroll view up one line Subir a visão uma linha para cima - + Extend rectangular selection up one line Extender a seleção retangular uma linha para cima - + Move up one paragraph Mover um paragrafo para cima - + Extend selection up one paragraph Extender a seleção um paragrafo para cima - + Move down one paragraph Mover um paragrafo para baixo - + Scroll to start of document - + Scroll to end of document - + Scroll vertically to centre current line - + Extend selection down one paragraph Extender a seleção um paragrafo para baixo - + Move left one character Mover um caractere para a esquerda - + Extend selection left one character Extender a seleção um caractere para esquerda - + Move left one word Mover uma palavra para esquerda - + Extend selection left one word Extender a seleção uma palavra para esquerda - + Extend rectangular selection left one character Extender a seleção retangular um caractere para esquerda - + Move right one character Mover um caractere para direita - + Extend selection right one character Extender a seleção um caractere para direita - + Move right one word Mover uma palavra para direita - + Extend selection right one word Extender a seleção uma palavra para direita - + Extend rectangular selection right one character Extender a seleção retangular um caractere para direita - + Move to end of previous word - + Extend selection to end of previous word - + Move to end of next word - + Extend selection to end of next word - + Move left one word part Mover uma parte da palavra para esquerda - + Extend selection left one word part Extender a seleção uma parte de palavra para esquerda - + Move right one word part Mover uma parte da palavra para direita - + Extend selection right one word part Extender a seleção uma parte de palavra para direita - + Move up one page Mover uma página para cima - + Extend selection up one page Extender a seleção uma página para cima - + Extend rectangular selection up one page Extender a seleção retangular uma página para cima - + Move down one page Mover uma página para baixo - + Extend selection down one page Extender a seleção uma página para baixo - + Extend rectangular selection down one page Extender a seleção retangular uma página para baixo - + Delete current character Excluir caractere atual - + Cut selection Recortar seleção - + Delete word to right Excluir palavra para direita - + Move to start of document line - + Extend selection to start of document line - + Extend rectangular selection to start of document line - + Move to start of display line - + Extend selection to start of display line - + Move to start of display or document line - + Extend selection to start of display or document line - + Move to first visible character in document line - + Extend selection to first visible character in document line - + Extend rectangular selection to first visible character in document line - + Move to first visible character of display in document line - + Extend selection to first visible character in display or document line - + Move to end of document line - + Extend selection to end of document line - + Extend rectangular selection to end of document line - + Move to end of display line - + Extend selection to end of display line - + Move to end of display or document line - + Extend selection to end of display or document line - + Move to start of document - + Extend selection to start of document - + Move to end of document - + Extend selection to end of document - + Stuttered move up one page - + Stuttered extend selection up one page - + Stuttered move down one page - + Stuttered extend selection down one page - + Delete previous character if not at start of line - + Delete right to end of next word - + Delete line to right Excluir linha para direita - + Transpose current and previous lines - + Duplicate the current line - + Select all Select document - + Move selected lines up one line - + Move selected lines down one line - + Toggle insert/overtype Alternar entre modo de inserir/sobreescrever - + Paste Copiar - + Copy selection Copiar seleção - + Insert newline - + De-indent one level - + Cancel Cancelar - + Delete previous character Excluir caractere anterior - + Delete word to left Excluir palavra a esquerda - + Delete line to left Excluir linha a esquerda - + Undo last command - + Redo last command Refazer último comando - + Indent one level Indentar um nível - + Zoom in Aumentar zoom - + Zoom out Diminuir zoom - + Formfeed Alimentação da Página - + Cut current line Configurar linha atual - + Delete current line Excluir linha atual - + Copy current line Copiar linha atual - + Convert selection to lower case Converter a seleção para minúscula - + Convert selection to upper case Converter a seleção para maiúscula - + Duplicate selection @@ -498,77 +498,77 @@ QsciLexerAVS - + Default Padrão - + Block comment - + Nested block comment - + Line comment Comentar Linha - + Number Número - + Operator Operador - + Identifier Identificador - + Double-quoted string Cadeia de caracteres envolvida por aspas duplas - + Triple double-quoted string Cadeia de caracteres envolvida por três aspas duplas - + Keyword Palavra Chave - + Filter - + Plugin - + Function - + Clip property - + User defined @@ -576,72 +576,72 @@ QsciLexerBash - + Default Padrão - + Error Número - + Comment Comentário - + Number Número - + Keyword Palavra Chave - + Double-quoted string Cadeia de caracteres envolvida por aspas duplas - + Single-quoted string Cadeia de caracteres envolvida por aspas simples - + Operator Operador - + Identifier Identificador - + Scalar Escalar - + Parameter expansion Parâmetro de Expansão - + Backticks Aspas Invertidas - + Here document delimiter Delimitador de "here documents" - + Single-quoted here document "here document" envolvido por aspas simples @@ -649,42 +649,42 @@ QsciLexerBatch - + Default Padrão - + Comment Comentário - + Keyword Palavra Chave - + Label Rótulo - + Hide command character Esconder caractere de comando - + External command Comando externo - + Variable Variável - + Operator Operador @@ -692,77 +692,77 @@ QsciLexerCMake - + Default Padrão - + Comment Comentário - + String Cadeia de Caracteres - + Left quoted string - + Right quoted string - + Function - + Variable Variável - + Label Rótulo - + User defined - + WHILE block - + FOREACH block - + IF block - + MACRO block - + Variable within a string - + Number Número @@ -770,282 +770,282 @@ QsciLexerCPP - + Default Padrão - + Inactive default - + C comment Comentário C - + Inactive C comment - + C++ comment Comentário C++ - + Inactive C++ comment - + JavaDoc style C comment Comentário JavaDoc estilo C - + Inactive JavaDoc style C comment - + Number Número - + Inactive number - + Keyword Palavra Chave - + Inactive keyword - + Double-quoted string Cadeia de caracteres envolvida por aspas duplas - + Inactive double-quoted string - + Single-quoted string Cadeia de caracteres envolvida por aspas simples - + Inactive single-quoted string - + IDL UUID - + Inactive IDL UUID - + Pre-processor block Instruções de pré-processamento - + Inactive pre-processor block - + Operator Operador - + Inactive operator - + Identifier Identificador - + Inactive identifier - + Unclosed string Cadeia de caracteres não fechada - + Inactive unclosed string - + C# verbatim string - + Inactive C# verbatim string - + JavaScript regular expression Expressão regular JavaScript - + Inactive JavaScript regular expression - + JavaDoc style C++ comment Comentário JavaDoc estilo C++ - + Inactive JavaDoc style C++ comment - + Secondary keywords and identifiers Identificadores e palavras chave secundárias - + Inactive secondary keywords and identifiers - + JavaDoc keyword Palavra chave JavaDoc - + Inactive JavaDoc keyword - + JavaDoc keyword error Erro de palavra chave do JavaDoc - + Inactive JavaDoc keyword error - + Global classes and typedefs Classes e definições de tipo globais - + Inactive global classes and typedefs - + C++ raw string - + Inactive C++ raw string - + Vala triple-quoted verbatim string - + Inactive Vala triple-quoted verbatim string - + Pike hash-quoted string - + Inactive Pike hash-quoted string - + Pre-processor C comment - + Inactive pre-processor C comment - + JavaDoc style pre-processor comment - + Inactive JavaDoc style pre-processor comment - + User-defined literal - + Inactive user-defined literal - + Task marker - + Inactive task marker - + Escape sequence - + Inactive escape sequence @@ -1053,117 +1053,117 @@ QsciLexerCSS - + Default Padrão - + Tag Marcador - + Class selector Seletor de classe - + Pseudo-class Pseudo-classe - + Unknown pseudo-class Pseudo-classe desconhecida - + Operator Operador - + CSS1 property Propriedade CSS1 - + Unknown property Propriedade desconhecida - + Value Valor - + ID selector Seletor de ID - + Important Importante - + @-rule regra-@ - + Double-quoted string Cadeia de caracteres envolvida por aspas duplas - + Single-quoted string Cadeia de caracteres envolvida por aspas simples - + CSS2 property Propriedade CSS2 - + Attribute Atributo - + CSS3 property Propriedade CSS2 {3 ?} - + Pseudo-element - + Extended CSS property - + Extended pseudo-class - + Extended pseudo-element - + Media rule - + Variable Variável @@ -1171,7 +1171,7 @@ QsciLexerCSharp - + Verbatim string Cadeia de caracteres no formato verbatim @@ -1179,122 +1179,122 @@ QsciLexerCoffeeScript - + Default Padrão - + C-style comment - + C++-style comment - + JavaDoc C-style comment - + Number Número - + Keyword Palavra Chave - + Double-quoted string Cadeia de caracteres envolvida por aspas duplas - + Single-quoted string Cadeia de caracteres envolvida por aspas simples - + IDL UUID - + Pre-processor block Instruções de pré-processamento - + Operator Operador - + Identifier Identificador - + Unclosed string Cadeia de caracteres não fechada - + C# verbatim string - + Regular expression Expressão Regular - + JavaDoc C++-style comment - + Secondary keywords and identifiers Identificadores e palavras chave secundárias - + JavaDoc keyword Palavra chave JavaDoc - + JavaDoc keyword error Erro de palavra chave do JavaDoc - + Global classes - + Block comment - + Block regular expression - + Block regular expression comment - + Instance property @@ -1302,117 +1302,117 @@ QsciLexerD - + Default Padrão - + Block comment - + Line comment Comentar Linha - + DDoc style block comment - + Nesting comment - + Number Número - + Keyword Palavra Chave - + Secondary keyword - + Documentation keyword - + Type definition - + String Cadeia de Caracteres - + Unclosed string Cadeia de caracteres não fechada - + Character Caractere - + Operator Operador - + Identifier Identificador - + DDoc style line comment - + DDoc keyword Palavra chave JavaDoc - + DDoc keyword error Erro de palavra chave do JavaDoc - + Backquoted string - + Raw string - + User defined 1 Definição de usuário 1 - + User defined 2 Definição de usuário 2 - + User defined 3 Definição de usuário 3 @@ -1420,120 +1420,168 @@ QsciLexerDiff - + Default Padrão - + Comment Comentário - + Command Comando - + Header Cabeçalho - + Position Posição - + Removed line Linha Removida - + Added line Linha Adicionada - + Changed line + QsciLexerEDIFACT + + + Default + Padrão + + + + Segment start + + + + + Segment end + + + + + Element separator + + + + + Composite separator + + + + + Release separator + + + + + UNA segment header + + + + + UNH segment header + + + + + Badly formed segment + + + + QsciLexerFortran77 - + Default Padrão - + Comment Comentário - + Number Número - + Single-quoted string Cadeia de caracteres envolvida por aspas simples - + Double-quoted string Cadeia de caracteres envolvida por aspas duplas - + Unclosed string Cadeia de caracteres não fechada - + Operator Operador - + Identifier Identificador - + Keyword Palavra Chave - + Intrinsic function - + Extended function - + Pre-processor block Instruções de pré-processamento - + Dotted operator - + Label Rótulo - + Continuation @@ -1541,547 +1589,547 @@ QsciLexerHTML - + HTML default HTML por padrão - + Tag Marcador - + Unknown tag Marcador desconhecido - + Attribute Atributo - + Unknown attribute Atributo desconhecido - + HTML number Número HTML - + HTML double-quoted string Cadeia de caracteres HTML envolvida por aspas duplas - + HTML single-quoted string Cadeia de caracteres HTML envolvida por aspas simples - + Other text in a tag Outro texto em um marcador - + HTML comment Comentário HTML - + Entity Entidade - + End of a tag Final de um marcador - + Start of an XML fragment Início de um bloco XML - + End of an XML fragment Final de um bloco XML - + Script tag Marcador de script - + Start of an ASP fragment with @ Início de um bloco ASP com @ - + Start of an ASP fragment Início de um bloco ASP - + CDATA CDATA - + Start of a PHP fragment Início de um bloco PHP - + Unquoted HTML value Valor HTML não envolvido por aspas - + ASP X-Code comment Comentário ASP X-Code - + SGML default SGML por padrão - + SGML command Comando SGML - + First parameter of an SGML command Primeiro parâmetro em um comando SGML - + SGML double-quoted string Cadeia de caracteres SGML envolvida por aspas duplas - + SGML single-quoted string Cadeia de caracteres SGML envolvida por aspas simples - + SGML error Erro SGML - + SGML special entity Entidade especial SGML - + SGML comment Comando SGML - + First parameter comment of an SGML command Primeiro comentário de parâmetro de uma comando SGML - + SGML block default Bloco SGML por padrão - + Start of a JavaScript fragment Início de um bloco Javascript - + JavaScript default JavaScript por padrão - + JavaScript comment Comentário JavaScript - + JavaScript line comment Comentário de linha JavaScript - + JavaDoc style JavaScript comment Comentário JavaScript no estilo JavaDoc - + JavaScript number Número JavaScript - + JavaScript word Palavra JavaScript - + JavaScript keyword Palavra chave JavaScript - + JavaScript double-quoted string Cadeia de caracteres JavaScript envolvida por aspas duplas - + JavaScript single-quoted string Cadeia de caracteres JavaScript envolvida por aspas simples - + JavaScript symbol Símbolo JavaScript - + JavaScript unclosed string Cadeia de caracteres JavaScript não fechada - + JavaScript regular expression Expressão regular JavaScript - + Start of an ASP JavaScript fragment Início de um bloco Javascript ASP - + ASP JavaScript default JavaScript ASP por padrão - + ASP JavaScript comment Comentário JavaScript ASP - + ASP JavaScript line comment Comentário de linha JavaScript ASP - + JavaDoc style ASP JavaScript comment Comentário JavaScript ASP no estilo JavaDoc - + ASP JavaScript number Número JavaScript ASP - + ASP JavaScript word Palavra chave JavaScript ASP - + ASP JavaScript keyword Palavra chave JavaScript ASP - + ASP JavaScript double-quoted string Cadeia de caracteres JavaScript ASP envolvida por aspas duplas - + ASP JavaScript single-quoted string Cadeia de caracteres JavaScript ASP envolvida por aspas simples - + ASP JavaScript symbol Símbolo JavaScript ASP - + ASP JavaScript unclosed string Cadeia de caracteres JavaScript ASP não fechada - + ASP JavaScript regular expression Expressão regular JavaScript ASP - + Start of a VBScript fragment Início de um bloco VBScript - + VBScript default VBScript por padrão - + VBScript comment Comentário VBScript - + VBScript number Número VBScript - + VBScript keyword Palavra chave VBScript - + VBScript string Cadeia de caracteres VBScript - + VBScript identifier Identificador VBScript - + VBScript unclosed string Cadeia de caracteres VBScript não fechada - + Start of an ASP VBScript fragment Início de um bloco VBScript ASP - + ASP VBScript default VBScript ASP por padrão - + ASP VBScript comment Comentário VBScript ASP - + ASP VBScript number Número VBScript ASP - + ASP VBScript keyword Palavra chave VBScript ASP - + ASP VBScript string Cadeia de caracteres VBScript ASP - + ASP VBScript identifier Identificador VBScript ASP - + ASP VBScript unclosed string Cadeia de caracteres VBScript ASP não fechada - + Start of a Python fragment Início de um bloco Python - + Python default Python por padrão - + Python comment Comentário Python - + Python number Número Python - + Python double-quoted string Cadeia de caracteres Python envolvida por aspas duplas - + Python single-quoted string Cadeia de caracteres Python envolvida por aspas simples - + Python keyword Palavra chave Python - + Python triple double-quoted string Cadeia de caracteres Python envolvida por aspas triplas duplas - + Python triple single-quoted string Cadeia de caracteres Python envolvida por aspas triplas simples - + Python class name Nome de classe Python - + Python function or method name Nome de método ou função Python - + Python operator Operador Python - + Python identifier Identificador Python - + Start of an ASP Python fragment Início de um bloco Python ASP - + ASP Python default Python ASP por padrão - + ASP Python comment Comentário Python ASP - + ASP Python number Número Python ASP - + ASP Python double-quoted string Cadeia de caracteres Python ASP envolvida por aspas duplas - + ASP Python single-quoted string Cadeia de caracteres Python ASP envolvida por aspas simples - + ASP Python keyword Palavra chave Python ASP - + ASP Python triple double-quoted string Cadeia de caracteres Python ASP envolvida por aspas triplas duplas - + ASP Python triple single-quoted string Cadeia de caracteres Python ASP envolvida por aspas triplas simples - + ASP Python class name Nome de classe Python ASP - + ASP Python function or method name Nome de método ou função Python ASP - + ASP Python operator Operador Python ASP - + ASP Python identifier Identificador Python ASP - + PHP default PHP por padrão - + PHP double-quoted string Cadeia de caracteres PHP envolvida por aspas duplas - + PHP single-quoted string Cadeia de caracteres PHP envolvida por aspas simples - + PHP keyword Palavra chave PHP - + PHP number Número PHP - + PHP variable Variável PHP - + PHP comment Comentário PHP - + PHP line comment Comentário de linha PHP - + PHP double-quoted variable Variável PHP envolvida por aspas duplas - + PHP operator Operador PHP @@ -2089,7 +2137,7 @@ QsciLexerIDL - + UUID UUID @@ -2097,72 +2145,72 @@ QsciLexerJSON - + Default Padrão - + Number Número - + String Cadeia de Caracteres - + Unclosed string Cadeia de caracteres não fechada - + Property - + Escape sequence - + Line comment Comentar Linha - + Block comment - + Operator Operador - + IRI - + JSON-LD compact IRI - + JSON keyword - + JSON-LD keyword - + Parsing error @@ -2170,7 +2218,7 @@ QsciLexerJavaScript - + Regular expression Expressão Regular @@ -2178,102 +2226,102 @@ QsciLexerLua - + Default Padrão - + Comment Comentário - + Line comment Comentar Linha - + Number Número - + Keyword Palavra Chave - + String Cadeia de Caracteres - + Character Caractere - + Literal string Cadeia de caracteres literal - + Preprocessor Preprocessador - + Operator Operador - + Identifier Identificador - + Unclosed string Cadeia de caracteres não fechada - + Basic functions Funções básicas - + String, table and maths functions Funções de cadeia de caracteres e de tabelas matemáticas - + Coroutines, i/o and system facilities Funções auxiiares, e/s e funções de sistema - + User defined 1 Definição de usuário 1 - + User defined 2 Definição de usuário 2 - + User defined 3 Definição de usuário 3 - + User defined 4 Definição de usuário 4 - + Label Rótulo @@ -2281,37 +2329,37 @@ QsciLexerMakefile - + Default Padrão - + Comment Comentário - + Preprocessor Preprocessador - + Variable Variável - + Operator Operador - + Target Destino - + Error Erro @@ -2319,112 +2367,112 @@ QsciLexerMarkdown - + Default Padrão - + Special Especial - + Strong emphasis using double asterisks - + Strong emphasis using double underscores - + Emphasis using single asterisks - + Emphasis using single underscores - + Level 1 header - + Level 2 header - + Level 3 header - + Level 4 header - + Level 5 header - + Level 6 header - + Pre-char - + Unordered list item - + Ordered list item - + Block quote - + Strike out - + Horizontal rule - + Link - + Code between backticks - + Code between double backticks - + Code block @@ -2432,47 +2480,47 @@ QsciLexerMatlab - + Default Padrão - + Comment Comentário - + Command Comando - + Number Número - + Keyword Palavra Chave - + Single-quoted string Cadeia de caracteres envolvida por aspas simples - + Operator Operador - + Identifier Identificador - + Double-quoted string Cadeia de caracteres envolvida por aspas duplas @@ -2480,77 +2528,77 @@ QsciLexerPO - + Default Padrão - + Comment Comentário - + Message identifier - + Message identifier text - + Message string - + Message string text - + Message context - + Message context text - + Fuzzy flag - + Programmer comment - + Reference - + Flags - + Message identifier text end-of-line - + Message string text end-of-line - + Message context text end-of-line @@ -2558,87 +2606,87 @@ QsciLexerPOV - + Default Padrão - + Comment Comentário - + Comment line Comentar Linha - + Number Número - + Operator Operador - + Identifier Identificador - + String Cadeia de Caracteres - + Unclosed string Cadeia de caracteres não fechada - + Directive Diretiva - + Bad directive Diretiva ruim - + Objects, CSG and appearance Objetos, CSG e aparência - + Types, modifiers and items Tipos, modificadores e itens - + Predefined identifiers Identificadores predefinidos - + Predefined functions Funções predefinidas - + User defined 1 Definição de usuário 1 - + User defined 2 Definição de usuário 2 - + User defined 3 Definição de usuário 3 @@ -2646,77 +2694,77 @@ QsciLexerPascal - + Default Padrão - + Line comment Comentar Linha - + Number Número - + Keyword Palavra Chave - + Single-quoted string Cadeia de caracteres envolvida por aspas simples - + Operator Operador - + Identifier Identificador - + '{ ... }' style comment - + '(* ... *)' style comment - + '{$ ... }' style pre-processor block - + '(*$ ... *)' style pre-processor block - + Hexadecimal number - + Unclosed string Cadeia de caracteres não fechada - + Character Caractere - + Inline asm @@ -2724,207 +2772,207 @@ QsciLexerPerl - + Default Padrão - + Error Erro - + Comment Comentário - + POD POD - + Number Número - + Keyword Palavra Chave - + Double-quoted string Cadeia de caracteres envolvida por aspas duplas - + Single-quoted string Cadeia de caracteres envolvida por aspas simples - + Operator Operador - + Identifier Identificador - + Scalar Escalar - + Array Vetor - + Hash Hash - + Symbol table Tabela de Símbolos - + Regular expression Expressão Regular - + Substitution Substituição - + Backticks Aspas Invertidas - + Data section Seção de dados - + Here document delimiter Delimitador de documentos criados através de redicionadores (>> e >) - + Single-quoted here document "here document" envolvido por aspas simples - + Double-quoted here document "here document" envolvido por aspas duplas - + Backtick here document "here document" envolvido por aspas invertidas - + Quoted string (q) Cadeia de caracteres envolvida por aspas (q) - + Quoted string (qq) Cadeia de caracteres envolvida por aspas (qq) - + Quoted string (qx) Cadeia de caracteres envolvida por aspas (qx) - + Quoted string (qr) Cadeia de caracteres envolvida por aspas (qr) - + Quoted string (qw) Cadeia de caracteres envolvida por aspas (qw) - + POD verbatim POD em formato verbatim - + Subroutine prototype - + Format identifier - + Format body - + Double-quoted string (interpolated variable) - + Translation - + Regular expression (interpolated variable) - + Substitution (interpolated variable) - + Backticks (interpolated variable) - + Double-quoted here document (interpolated variable) - + Backtick here document (interpolated variable) - + Quoted string (qq, interpolated variable) - + Quoted string (qx, interpolated variable) - + Quoted string (qr, interpolated variable) @@ -2932,82 +2980,82 @@ QsciLexerPostScript - + Default Padrão - + Comment Comentário - + DSC comment - + DSC comment value - + Number Número - + Name - + Keyword Palavra Chave - + Literal - + Immediately evaluated literal - + Array parenthesis - + Dictionary parenthesis - + Procedure parenthesis - + Text Texto - + Hexadecimal string - + Base85 string - + Bad string character @@ -3015,32 +3063,32 @@ QsciLexerProperties - + Default Padrão - + Comment Comentário - + Section Seção - + Assignment Atribuição - + Default value Valor Padrão - + Key @@ -3048,82 +3096,82 @@ QsciLexerPython - + Default Padrão - + Comment Comentário - + Number Número - + Double-quoted string Cadeia de caracteres envolvida por aspas duplas - + Single-quoted string Cadeia de caracteres envolvida por aspas simples - + Keyword Palavra Chave - + Triple single-quoted string Cadeia de caracteres envolvida por três aspas simples - + Triple double-quoted string Cadeia de caracteres envolvida por três aspas duplas - + Class name Nome da classe - + Function or method name Nome da função ou método - + Operator Operador - + Identifier Identificador - + Comment block Bloco de comentários - + Unclosed string Cadeia de caracteres não fechada - + Highlighted identifier - + Decorator @@ -3131,157 +3179,157 @@ QsciLexerRuby - + Default Padrão - + Comment Comentário - + Number Número - + Double-quoted string Cadeia de caracteres envolvida por aspas duplas - + Single-quoted string Cadeia de caracteres envolvida por aspas simples - + Keyword Palavra Chave - + Class name Nome da classe - + Function or method name Nome da função ou método - + Operator Operador - + Identifier Identificador - + Error - + POD POD - + Regular expression Expressão Regular - + Global - + Symbol Símbolo - + Module name - + Instance variable - + Class variable - + Backticks Aspas Invertidas - + Data section Seção de dados - + Here document delimiter - + Here document - + %q string - + %Q string - + %x string - + %r string - + %w string - + Demoted keyword - + stdin - + stdout - + stderr @@ -3289,112 +3337,112 @@ QsciLexerSQL - + Default Padrão - + Comment Comentário - + Number Número - + Keyword Palavra Chave - + Single-quoted string Cadeia de caracteres envolvida por aspas simples - + Operator Operador - + Identifier Identificador - + Comment line Comentário de Linha - + JavaDoc style comment Comentário estilo JavaDoc - + Double-quoted string Cadeia de caracteres envolvida por aspas duplas - + SQL*Plus keyword Palavra chave do SQL*Plus - + SQL*Plus prompt Prompt do SQL*Plus - + SQL*Plus comment Comentário do SQL*Plus - + # comment line Comentário de linha usando # - + JavaDoc keyword Palavra chave JavaDoc - + JavaDoc keyword error Erro de palavra chave do JavaDoc - + User defined 1 Definição de usuário 1 - + User defined 2 Definição de usuário 2 - + User defined 3 Definição de usuário 3 - + User defined 4 Definição de usuário 4 - + Quoted identifier - + Quoted operator @@ -3402,47 +3450,47 @@ QsciLexerSpice - + Default Padrão - + Identifier Identificador - + Command Comando - + Function - + Parameter - + Number Número - + Delimiter - + Value Valor - + Comment Comentário @@ -3450,112 +3498,112 @@ QsciLexerTCL - + Default Padrão - + Comment Comentário - + Comment line - + Number Número - + Quoted keyword - + Quoted string - + Operator Operador - + Identifier Identificador - + Substitution Substituição - + Brace substitution - + Modifier - + Expand keyword - + TCL keyword - + Tk keyword - + iTCL keyword - + Tk command - + User defined 1 Definição de usuário 1 - + User defined 2 Definição de usuário 2 - + User defined 3 Definição de usuário 3 - + User defined 4 Definição de usuário 4 - + Comment box - + Comment block Bloco de comentários @@ -3563,32 +3611,32 @@ QsciLexerTeX - + Default Padrão - + Special Especial - + Group Grupo - + Symbol Símbolo - + Command Comando - + Text Texto @@ -3596,82 +3644,82 @@ QsciLexerVHDL - + Default Padrão - + Comment Comentário - + Comment line - + Number Número - + String Cadeia de Caracteres - + Operator Operador - + Identifier Identificador - + Unclosed string Cadeia de caracteres não fechada - + Keyword Palavra Chave - + Standard operator - + Attribute Atributo - + Standard function - + Standard package - + Standard type - + User defined - + Comment block Bloco de comentários @@ -3679,122 +3727,172 @@ QsciLexerVerilog - + Default Padrão - + + Inactive default + + + + Comment Comentário - + Line comment Comentar Linha - + + Inactive line comment + + + + Bang comment - + + Inactive bang comment + + + + Number Número - + + Inactive number + + + + Primary keywords and identifiers - + + Inactive primary keywords and identifiers + + + + String Cadeia de Caracteres - + + Inactive string + + + + Secondary keywords and identifiers Identificadores e palavras chave secundárias - + System task - + + Inactive system task + + + + Preprocessor block - + Operator Operador - + + Inactive operator + + + + Identifier Identificador - + Unclosed string Cadeia de caracteres não fechada - + + Inactive unclosed string + + + + User defined tasks and identifiers - + + Inactive user defined tasks and identifiers + + + + Keyword comment - + Inactive keyword comment - + Input port declaration - + Inactive input port declaration - + Output port declaration - + Inactive output port declaration - + Input/output port declaration - + Inactive input/output port declaration - + Port connection - + Inactive port connection @@ -3802,52 +3900,52 @@ QsciLexerYAML - + Default Padrão - + Comment Comentário - + Identifier Identificador - + Keyword Palavra Chave - + Number Número - + Reference - + Document delimiter - + Text block marker - + Syntax error marker - + Operator Operador @@ -3855,37 +3953,37 @@ QsciScintilla - + &Undo - + &Redo - + Cu&t - + &Copy - + &Paste - + Delete - + Select All diff -Nru sqlitebrowser-3.10.100ubuntu1/libs/qscintilla/Qt4Qt5/qsciprinter.cpp sqlitebrowser-3.11.1/libs/qscintilla/Qt4Qt5/qsciprinter.cpp --- sqlitebrowser-3.10.100ubuntu1/libs/qscintilla/Qt4Qt5/qsciprinter.cpp 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/libs/qscintilla/Qt4Qt5/qsciprinter.cpp 2019-02-19 23:51:34.000000000 +0000 @@ -1,6 +1,6 @@ // This module implements the QsciPrinter class. // -// Copyright (c) 2017 Riverbank Computing Limited +// Copyright (c) 2018 Riverbank Computing Limited // // This file is part of QScintilla. // diff -Nru sqlitebrowser-3.10.100ubuntu1/libs/qscintilla/Qt4Qt5/qsciscintillabase.cpp sqlitebrowser-3.11.1/libs/qscintilla/Qt4Qt5/qsciscintillabase.cpp --- sqlitebrowser-3.10.100ubuntu1/libs/qscintilla/Qt4Qt5/qsciscintillabase.cpp 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/libs/qscintilla/Qt4Qt5/qsciscintillabase.cpp 2019-02-19 23:51:34.000000000 +0000 @@ -1,6 +1,6 @@ // This module implements the "official" low-level API. // -// Copyright (c) 2017 Riverbank Computing Limited +// Copyright (c) 2018 Riverbank Computing Limited // // This file is part of QScintilla. // @@ -38,6 +38,7 @@ #include #include +#include "SciAccessibility.h" #include "ScintillaQt.h" @@ -89,6 +90,10 @@ , clickCausedFocus(false) #endif { +#if !defined(QT_NO_ACCESSIBILITY) + QsciAccessibleScintillaBase::initialise(); +#endif + connectVerticalScrollBar(); connectHorizontalScrollBar(); @@ -298,6 +303,16 @@ } +// Re-implemented to handle font changes +void QsciScintillaBase::changeEvent(QEvent *e) +{ + if (e->type() == QEvent::FontChange || e->type() == QEvent::ApplicationFontChange) + sci->InvalidateStyleRedraw(); + + QAbstractScrollArea::changeEvent(e); +} + + // Re-implemented to handle the context menu. void QsciScintillaBase::contextMenuEvent(QContextMenuEvent *e) { @@ -827,3 +842,19 @@ setHorizontalScrollBar(scrollBar); connectHorizontalScrollBar(); } + + +// Return true if a context menu should be displayed. This is provided as a +// helper to QsciScintilla::contextMenuEvent(). A proper design would break +// backwards compatibility. +bool QsciScintillaBase::contextMenuNeeded(int x, int y) const +{ + QSCI_SCI_NAMESPACE(Point) pt(x, y); + + // Clear any selection if the mouse is outside. + if (!sci->PointInSelection(pt)) + sci->SetEmptySelection(sci->PositionFromLocation(pt)); + + // Respect SC_POPUP_*. + return sci->ShouldDisplayPopup(pt); +} diff -Nru sqlitebrowser-3.10.100ubuntu1/libs/qscintilla/Qt4Qt5/qsciscintilla.cpp sqlitebrowser-3.11.1/libs/qscintilla/Qt4Qt5/qsciscintilla.cpp --- sqlitebrowser-3.10.100ubuntu1/libs/qscintilla/Qt4Qt5/qsciscintilla.cpp 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/libs/qscintilla/Qt4Qt5/qsciscintilla.cpp 2019-02-19 23:51:34.000000000 +0000 @@ -2,7 +2,7 @@ // Scintilla. It is modelled on QTextEdit - a method of the same name should // behave in the same way. // -// Copyright (c) 2017 Riverbank Computing Limited +// Copyright (c) 2018 Riverbank Computing Limited // // This file is part of QScintilla. // @@ -264,17 +264,21 @@ // Handle auto-indentation. if (autoInd) + { if (lex.isNull() || (lex->autoIndentStyle() & AiMaintain)) maintainIndentation(ch, pos); else autoIndentation(ch, pos); + } // See if we might want to start auto-completion. if (!isCallTipActive() && acSource != AcsNone) + { if (isStartChar(ch)) startAutoCompletion(acSource, false, use_single == AcusAlways); else if (acThresh >= 1 && isWordCharacter(ch)) startAutoCompletion(acSource, true, use_single == AcusAlways); + } } @@ -386,13 +390,8 @@ ct = ct_entries.join("\n"); } - QByteArray ct_ba; - if (isUtf8()) - ct_ba = ct.toUtf8(); - else - ct_ba = ct.toLatin1(); - - const char *cts = ct_ba.data(); + ScintillaBytes ct_bytes = textAsBytes(ct); + const char *cts = ScintillaBytesConstData(ct_bytes); SendScintilla(SCI_CALLTIPSHOW, adjustedCallTipPosition(shift), cts); @@ -856,12 +855,16 @@ long new_pos = -1; if (pos_after > pos_before) + { new_pos = pos + (pos_after - pos_before); + } else if (pos_after < pos_before && pos >= pos_after) + { if (pos >= pos_before) new_pos = pos + (pos_after - pos_before); else new_pos = pos_after; + } if (new_pos >= 0) SendScintilla(SCI_SETSEL, new_pos, new_pos); @@ -1276,6 +1279,9 @@ switch (endFlag) { + case WrapFlagNone: + break; + case WrapFlagByText: flags |= SC_WRAPVISUALFLAG_END; loc |= SC_WRAPVISUALFLAGLOC_END_BY_TEXT; @@ -1292,6 +1298,9 @@ switch (startFlag) { + case WrapFlagNone: + break; + case WrapFlagByText: flags |= SC_WRAPVISUALFLAG_START; loc |= SC_WRAPVISUALFLAGLOC_START_BY_TEXT; @@ -1336,6 +1345,9 @@ // Set the marker symbols to use. switch (folding) { + case NoFoldStyle: + break; + case PlainFoldStyle: setFoldMarker(SC_MARKNUM_FOLDEROPEN, SC_MARK_MINUS); setFoldMarker(SC_MARKNUM_FOLDER, SC_MARK_PLUS); @@ -1636,6 +1648,12 @@ int len, int added, int line, int foldNow, int foldPrev, int token, int annotationLinesAdded) { + Q_UNUSED(pos); + Q_UNUSED(text); + Q_UNUSED(len); + Q_UNUSED(token); + Q_UNUSED(annotationLinesAdded); + if (mtype & SC_MOD_CHANGEFOLD) { if (fold) @@ -2086,7 +2104,7 @@ // Set the background colour of a hotspot area. void QsciScintilla::setHotspotBackgroundColor(const QColor &col) { - SendScintilla(SCI_SETSELBACK, 1, col); + SendScintilla(SCI_SETHOTSPOTACTIVEBACK, 1, col); } @@ -2100,7 +2118,7 @@ // Reset the background colour of a hotspot area to the default. void QsciScintilla::resetHotspotBackgroundColor() { - SendScintilla(SCI_SETSELBACK, 0UL); + SendScintilla(SCI_SETHOTSPOTACTIVEBACK, 0UL); } @@ -4334,6 +4352,29 @@ } +// Re-implemented to zoom when the Control modifier is pressed. +void QsciScintilla::wheelEvent(QWheelEvent *e) +{ +#if defined(Q_OS_MAC) + const Qt::KeyboardModifier zoom_modifier = Qt::MetaModifier; +#else + const Qt::KeyboardModifier zoom_modifier = Qt::ControlModifier; +#endif + + if ((e->modifiers() & zoom_modifier) != 0) + { + if (e->delta() > 0) + zoomIn(); + else + zoomOut(); + } + else + { + QsciScintillaBase::wheelEvent(e); + } +} + + // Re-implemented to handle chenges to the enabled state. void QsciScintilla::changeEvent(QEvent *e) { @@ -4396,12 +4437,15 @@ // Re-implemented to implement a more Qt-like context menu. void QsciScintilla::contextMenuEvent(QContextMenuEvent *e) { - QMenu *menu = createStandardContextMenu(); - - if (menu) + if (contextMenuNeeded(e->x(), e->y())) { - menu->setAttribute(Qt::WA_DeleteOnClose); - menu->popup(e->globalPos()); + QMenu *menu = createStandardContextMenu(); + + if (menu) + { + menu->setAttribute(Qt::WA_DeleteOnClose); + menu->popup(e->globalPos()); + } } } @@ -4482,22 +4526,29 @@ ((int)(sci_colour >> 16)) & 0x00ff); } + +// Set the scroll width. void QsciScintilla::setScrollWidth(int pixelWidth) { SendScintilla(SCI_SETSCROLLWIDTH, pixelWidth); } -int QsciScintilla::getScrollWidth() const +// Get the scroll width. +int QsciScintilla::scrollWidth() const { return SendScintilla(SCI_GETSCROLLWIDTH); } + +// Set scroll width tracking. void QsciScintilla::setScrollWidthTracking(bool enabled) { SendScintilla(SCI_SETSCROLLWIDTHTRACKING, enabled); } -bool QsciScintilla::getScrollWidthTracking() const + +// Get scroll width tracking. +bool QsciScintilla::scrollWidthTracking() const { return SendScintilla(SCI_GETSCROLLWIDTHTRACKING); } diff -Nru sqlitebrowser-3.10.100ubuntu1/libs/qscintilla/Qt4Qt5/qscistyle.cpp sqlitebrowser-3.11.1/libs/qscintilla/Qt4Qt5/qscistyle.cpp --- sqlitebrowser-3.10.100ubuntu1/libs/qscintilla/Qt4Qt5/qscistyle.cpp 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/libs/qscintilla/Qt4Qt5/qscistyle.cpp 2019-02-19 23:51:34.000000000 +0000 @@ -1,6 +1,6 @@ // This module implements the QsciStyle class. // -// Copyright (c) 2017 Riverbank Computing Limited +// Copyright (c) 2018 Riverbank Computing Limited // // This file is part of QScintilla. // @@ -87,6 +87,10 @@ // Apply the style to a particular editor. void QsciStyle::apply(QsciScintillaBase *sci) const { + // Don't do anything if the style is invalid. + if (style_nr < 0) + return; + sci->SendScintilla(QsciScintillaBase::SCI_STYLESETFORE, style_nr, style_color); sci->SendScintilla(QsciScintillaBase::SCI_STYLESETBACK, style_nr, diff -Nru sqlitebrowser-3.10.100ubuntu1/libs/qscintilla/Qt4Qt5/qscistyledtext.cpp sqlitebrowser-3.11.1/libs/qscintilla/Qt4Qt5/qscistyledtext.cpp --- sqlitebrowser-3.10.100ubuntu1/libs/qscintilla/Qt4Qt5/qscistyledtext.cpp 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/libs/qscintilla/Qt4Qt5/qscistyledtext.cpp 2019-02-19 23:51:34.000000000 +0000 @@ -1,6 +1,6 @@ // This module implements the QsciStyledText class. // -// Copyright (c) 2017 Riverbank Computing Limited +// Copyright (c) 2018 Riverbank Computing Limited // // This file is part of QScintilla. // diff -Nru sqlitebrowser-3.10.100ubuntu1/libs/qscintilla/Qt4Qt5/SciAccessibility.cpp sqlitebrowser-3.11.1/libs/qscintilla/Qt4Qt5/SciAccessibility.cpp --- sqlitebrowser-3.10.100ubuntu1/libs/qscintilla/Qt4Qt5/SciAccessibility.cpp 1970-01-01 00:00:00.000000000 +0000 +++ sqlitebrowser-3.11.1/libs/qscintilla/Qt4Qt5/SciAccessibility.cpp 2019-02-19 23:51:34.000000000 +0000 @@ -0,0 +1,760 @@ +// The implementation of the class that implements accessibility support. +// +// Copyright (c) 2018 Riverbank Computing Limited +// +// This file is part of QScintilla. +// +// This file may be used under the terms of the GNU General Public License +// version 3.0 as published by the Free Software Foundation and appearing in +// the file LICENSE included in the packaging of this file. Please review the +// following information to ensure the GNU General Public License version 3.0 +// requirements will be met: http://www.gnu.org/copyleft/gpl.html. +// +// If you do not wish to use this file under the terms of the GPL version 3.0 +// then you may purchase a commercial license. For more information contact +// info@riverbankcomputing.com. +// +// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + + +#include + +#if !defined(QT_NO_ACCESSIBILITY) + +#include "SciAccessibility.h" + +#include +#include +#include +#include +#include + +#include "Qsci/qsciscintillabase.h" + + +// Set if the accessibility support needs initialising. +bool QsciAccessibleScintillaBase::needs_initialising = true; + +// The list of all accessibles. +QList QsciAccessibleScintillaBase::all_accessibles; + + +// Forward declarations. +static QAccessibleInterface *factory(const QString &classname, QObject *object); + + +// The ctor. +QsciAccessibleScintillaBase::QsciAccessibleScintillaBase(QWidget *widget) : + QAccessibleWidget(widget, QAccessible::EditableText), + current_cursor_offset(-1), is_selection(false) +{ + all_accessibles.append(this); +} + + +// The dtor. +QsciAccessibleScintillaBase::~QsciAccessibleScintillaBase() +{ + all_accessibles.removeOne(this); +} + + +// Initialise the accessibility support. +void QsciAccessibleScintillaBase::initialise() +{ + if (needs_initialising) + { + QAccessible::installFactory(factory); + needs_initialising = false; + } +} + + +// Find the accessible for a widget. +QsciAccessibleScintillaBase *QsciAccessibleScintillaBase::findAccessible( + QsciScintillaBase *sb) +{ + for (int i = 0; i < all_accessibles.size(); ++i) + { + QsciAccessibleScintillaBase *acc_sb = all_accessibles.at(i); + + if (acc_sb->sciWidget() == sb) + return acc_sb; + } + + return 0; +} + + +// Return the QsciScintillaBase instance. +QsciScintillaBase *QsciAccessibleScintillaBase::sciWidget() const +{ + return static_cast(widget()); +} + + +// Update the accessible when the selection has changed. +void QsciAccessibleScintillaBase::selectionChanged(QsciScintillaBase *sb, + bool selection) +{ + QsciAccessibleScintillaBase *acc_sb = findAccessible(sb); + + if (!acc_sb) + return; + + acc_sb->is_selection = selection; +} + + +// Update the accessibility when text has been inserted. +void QsciAccessibleScintillaBase::textInserted(QsciScintillaBase *sb, + int position, const char *text, int length) +{ + Q_ASSERT(text); + + QString new_text = bytesAsText(sb, text, length); + int offset = positionAsOffset(sb, position); + + QAccessibleTextInsertEvent ev(sb, offset, new_text); + QAccessible::updateAccessibility(&ev); +} + + +// Return the fragment of text before an offset. +QString QsciAccessibleScintillaBase::textBeforeOffset(int offset, + QAccessible::TextBoundaryType boundaryType, int *startOffset, + int *endOffset) const +{ + QsciScintillaBase *sb = sciWidget(); + + // Initialise in case of errors. + *startOffset = *endOffset = -1; + + int position = validPosition(offset); + + if (position < 0) + return QString(); + + int start_position, end_position; + + if (!boundaries(sb, position, boundaryType, &start_position, &end_position)) + return QString(); + + if (start_position == 0) + return QString(); + + if (!boundaries(sb, start_position - 1, boundaryType, &start_position, &end_position)) + return QString(); + + positionRangeAsOffsetRange(sb, start_position, end_position, startOffset, + endOffset); + + return textRange(sb, start_position, end_position); +} + + +// Return the fragment of text after an offset. +QString QsciAccessibleScintillaBase::textAfterOffset(int offset, + QAccessible::TextBoundaryType boundaryType, int *startOffset, + int *endOffset) const +{ + QsciScintillaBase *sb = sciWidget(); + + // Initialise in case of errors. + *startOffset = *endOffset = -1; + + int position = validPosition(offset); + + if (position < 0) + return QString(); + + int start_position, end_position; + + if (!boundaries(sb, position, boundaryType, &start_position, &end_position)) + return QString(); + + if (end_position >= sb->SendScintilla(QsciScintillaBase::SCI_GETTEXTLENGTH)) + return QString(); + + if (!boundaries(sb, end_position, boundaryType, &start_position, &end_position)) + return QString(); + + positionRangeAsOffsetRange(sb, start_position, end_position, startOffset, + endOffset); + + return textRange(sb, start_position, end_position); +} + + +// Return the fragment of text at an offset. +QString QsciAccessibleScintillaBase::textAtOffset(int offset, + QAccessible::TextBoundaryType boundaryType, int *startOffset, + int *endOffset) const +{ + QsciScintillaBase *sb = sciWidget(); + + // Initialise in case of errors. + *startOffset = *endOffset = -1; + + int position = validPosition(offset); + + if (position < 0) + return QString(); + + int start_position, end_position; + + if (!boundaries(sb, position, boundaryType, &start_position, &end_position)) + return QString(); + + positionRangeAsOffsetRange(sb, start_position, end_position, startOffset, + endOffset); + + return textRange(sb, start_position, end_position); +} + + +// Update the accessibility when text has been deleted. +void QsciAccessibleScintillaBase::textDeleted(QsciScintillaBase *sb, + int position, const char *text, int length) +{ + Q_ASSERT(text); + + QString old_text = bytesAsText(sb, text, length); + int offset = positionAsOffset(sb, position); + + QAccessibleTextRemoveEvent ev(sb, offset, old_text); + QAccessible::updateAccessibility(&ev); +} + + +// Update the accessibility when the UI has been updated. +void QsciAccessibleScintillaBase::updated(QsciScintillaBase *sb) +{ + QsciAccessibleScintillaBase *acc_sb = findAccessible(sb); + + if (!acc_sb) + return; + + int cursor_offset = positionAsOffset(sb, + sb->SendScintilla(QsciScintillaBase::SCI_GETCURRENTPOS)); + + if (acc_sb->current_cursor_offset != cursor_offset) + { + acc_sb->current_cursor_offset = cursor_offset; + + QAccessibleTextCursorEvent ev(sb, cursor_offset); + QAccessible::updateAccessibility(&ev); + } +} + + +// Return a valid position from an offset or -1 if it was invalid. +int QsciAccessibleScintillaBase::validPosition(int offset) const +{ + // An offset of -1 is interpreted as the length of the text. + int nr_chars = characterCount(); + + if (offset == -1) + offset = nr_chars; + + // Check there is some text and the offset is within range. + if (nr_chars == 0 || offset < 0 || offset > nr_chars) + return -1; + + return offsetAsPosition(sciWidget(), offset); +} + + +// Get the start and end boundary positions for a type of boundary. true is +// returned if the boundary positions are valid. +bool QsciAccessibleScintillaBase::boundaries(QsciScintillaBase *sb, + int position, QAccessible::TextBoundaryType boundaryType, + int *start_position, int *end_position) +{ + // This implementation is based on what Qt does although that may itself be + // wrong. The cursor is in a word if it is before or after any character + // in the word. If the cursor is not in a word (eg. is has a space each + // side) then the previous word is current. + + switch (boundaryType) + { + case QAccessible::CharBoundary: + *start_position = position; + *end_position = sb->SendScintilla( + QsciScintillaBase::SCI_POSITIONAFTER, position); + break; + + case QAccessible::WordBoundary: + *start_position = sb->SendScintilla( + QsciScintillaBase::SCI_WORDSTARTPOSITION, position, 1); + *end_position = sb->SendScintilla( + QsciScintillaBase::SCI_WORDENDPOSITION, position, 1); + + // If the start and end positions are the same then we are not in a + // word. + if (*start_position == *end_position) + { + // We need the immediately preceding word. Note that Qt behaves + // differently as it will not move before the current line. + + // Find the end of the preceding word. + *end_position = sb->SendScintilla( + QsciScintillaBase::SCI_WORDSTARTPOSITION, position, 0L); + + // If the end is 0 then there isn't a preceding word. + if (*end_position == 0) + return false; + + // Now find the start. + *start_position = sb->SendScintilla( + QsciScintillaBase::SCI_WORDSTARTPOSITION, *end_position, + 1); + } + + break; + + case QAccessible::SentenceBoundary: + return false; + + case QAccessible::ParagraphBoundary: + // Paragraph boundaries are supposed to be supported but it isn't clear + // what this means in a code editor. + return false; + + case QAccessible::LineBoundary: + { + int line = sb->SendScintilla( + QsciScintillaBase::SCI_LINEFROMPOSITION, position); + + *start_position = sb->SendScintilla( + QsciScintillaBase::SCI_POSITIONFROMLINE, line); + *end_position = sb->SendScintilla( + QsciScintillaBase::SCI_POSITIONFROMLINE, line + 1); + + // See if we are after the last end-of-line character. + if (*start_position == *end_position) + return false; + } + + break; + + case QAccessible::NoBoundary: + *start_position = 0; + *end_position = sb->SendScintilla( + QsciScintillaBase::SCI_GETTEXTLENGTH); + break; + } + + return true; +} + + +// Return the text between two positions. +QString QsciAccessibleScintillaBase::textRange(QsciScintillaBase *sb, + int start_position, int end_position) +{ + QByteArray bytes(end_position - start_position + 1, '\0'); + + sb->SendScintilla(QsciScintillaBase::SCI_GETTEXTRANGE, start_position, + end_position, bytes.data()); + + return bytesAsText(sb, bytes.constData(), bytes.size() - 1); +} + + +// Convert bytes to text. +QString QsciAccessibleScintillaBase::bytesAsText(QsciScintillaBase *sb, + const char *bytes, int length) +{ + if (sb->SendScintilla(QsciScintillaBase::SCI_GETCODEPAGE) == QsciScintillaBase::SC_CP_UTF8) + return QString::fromUtf8(bytes, length); + + return QString::fromLatin1(bytes, length); +} + + +// Convert text to bytes. +QByteArray QsciAccessibleScintillaBase::textAsBytes(QsciScintillaBase *sb, + const QString &text) +{ + if (sb->SendScintilla(QsciScintillaBase::SCI_GETCODEPAGE) == QsciScintillaBase::SC_CP_UTF8) + return text.toUtf8(); + + return text.toLatin1(); +} + + +// Convert a byte position to a character offset. +int QsciAccessibleScintillaBase::positionAsOffset(QsciScintillaBase *sb, + int position) +{ + return sb->SendScintilla(QsciScintillaBase::SCI_COUNTCHARACTERS, 0, + position); +} + + +// Convert a range of byte poisitions to character offsets. +void QsciAccessibleScintillaBase::positionRangeAsOffsetRange( + QsciScintillaBase *sb, int start_position, int end_position, + int *startOffset, int *endOffset) +{ + *startOffset = positionAsOffset(sb, start_position); + *endOffset = positionAsOffset(sb, end_position); +} + + +// Convert character offset position to a byte position. +int QsciAccessibleScintillaBase::offsetAsPosition(QsciScintillaBase *sb, + int offset) +{ + return sb->SendScintilla(QsciScintillaBase::SCI_POSITIONRELATIVE, 0, + offset); +} + + +// Get the current selection if any. +void QsciAccessibleScintillaBase::selection(int selectionIndex, + int *startOffset, int *endOffset) const +{ + int start, end; + + if (selectionIndex == 0 && is_selection) + { + QsciScintillaBase *sb = sciWidget(); + int start_position = sb->SendScintilla( + QsciScintillaBase::SCI_GETSELECTIONSTART); + int end_position = sb->SendScintilla( + QsciScintillaBase::SCI_GETSELECTIONEND); + + start = positionAsOffset(sb, start_position); + end = positionAsOffset(sb, end_position); + } + else + { + start = end = 0; + } + + *startOffset = start; + *endOffset = end; +} + + +// Return the number of selections. +int QsciAccessibleScintillaBase::selectionCount() const +{ + return (is_selection ? 1 : 0); +} + + +// Add a selection. +void QsciAccessibleScintillaBase::addSelection(int startOffset, int endOffset) +{ + setSelection(0, startOffset, endOffset); +} + + +// Remove a selection. +void QsciAccessibleScintillaBase::removeSelection(int selectionIndex) +{ + if (selectionIndex == 0) + sciWidget()->SendScintilla(QsciScintillaBase::SCI_CLEARSELECTIONS); +} + + +// Set the selection. +void QsciAccessibleScintillaBase::setSelection(int selectionIndex, + int startOffset, int endOffset) +{ + if (selectionIndex == 0) + { + QsciScintillaBase *sb = sciWidget(); + sb->SendScintilla(QsciScintillaBase::SCI_SETSELECTIONSTART, + offsetAsPosition(sb, startOffset)); + sb->SendScintilla(QsciScintillaBase::SCI_SETSELECTIONEND, + offsetAsPosition(sb, endOffset)); + } +} + + +// Return the current cursor offset. +int QsciAccessibleScintillaBase::cursorPosition() const +{ + return current_cursor_offset; +} + + +// Set the cursor offset. +void QsciAccessibleScintillaBase::setCursorPosition(int position) +{ + QsciScintillaBase *sb = sciWidget(); + + sb->SendScintilla(QsciScintillaBase::SCI_GOTOPOS, + offsetAsPosition(sb, position)); +} + + +// Return the text between two offsets. +QString QsciAccessibleScintillaBase::text(int startOffset, int endOffset) const +{ + QsciScintillaBase *sb = sciWidget(); + + return textRange(sb, offsetAsPosition(sb, startOffset), + offsetAsPosition(sb, endOffset)); +} + + +// Return the number of characters in the text. +int QsciAccessibleScintillaBase::characterCount() const +{ + QsciScintillaBase *sb = sciWidget(); + + return sb->SendScintilla(QsciScintillaBase::SCI_COUNTCHARACTERS, 0, + sb->SendScintilla(QsciScintillaBase::SCI_GETTEXTLENGTH)); +} + + +QRect QsciAccessibleScintillaBase::characterRect(int offset) const +{ + QsciScintillaBase *sb = sciWidget(); + int position = offsetAsPosition(sb, offset); + int x_vport = sb->SendScintilla(QsciScintillaBase::SCI_POINTXFROMPOSITION, + position); + int y_vport = sb->SendScintilla(QsciScintillaBase::SCI_POINTYFROMPOSITION, + position); + const QString ch = text(offset, offset + 1); + + // Get the character's font metrics. + int style = sb->SendScintilla(QsciScintillaBase::SCI_GETSTYLEAT, position); + QFontMetrics metrics(fontForStyle(style)); + + QRect rect(x_vport, y_vport, metrics.width(ch), metrics.height()); + rect.moveTo(sb->viewport()->mapToGlobal(rect.topLeft())); + + return rect; +} + + +// Return the offset of the character at the given screen coordinates. +int QsciAccessibleScintillaBase::offsetAtPoint(const QPoint &point) const +{ + QsciScintillaBase *sb = sciWidget(); + QPoint p = sb->viewport()->mapFromGlobal(point); + int position = sb->SendScintilla(QsciScintillaBase::SCI_POSITIONFROMPOINT, + p.x(), p.y()); + + return (position >= 0) ? positionAsOffset(sb, position) : -1; +} + + +// Scroll to make sure an area of text is visible. +void QsciAccessibleScintillaBase::scrollToSubstring(int startIndex, + int endIndex) +{ + QsciScintillaBase *sb = sciWidget(); + int start = offsetAsPosition(sb, startIndex); + int end = offsetAsPosition(sb, endIndex); + + sb->SendScintilla(QsciScintillaBase::SCI_SCROLLRANGE, end, start); +} + + +// Return the attributes of a character and surrounding text. +QString QsciAccessibleScintillaBase::attributes(int offset, int *startOffset, + int *endOffset) const +{ + QsciScintillaBase *sb = sciWidget(); + int position = offsetAsPosition(sb, offset); + int style = sb->SendScintilla(QsciScintillaBase::SCI_GETSTYLEAT, position); + + // Find the start of the text with this style. + int start_position = position; + int start_text_position = offset; + + while (start_position > 0) + { + int before = sb->SendScintilla(QsciScintillaBase::SCI_POSITIONBEFORE, + start_position); + int s = sb->SendScintilla(QsciScintillaBase::SCI_GETSTYLEAT, before); + + if (s != style) + break; + + start_position = before; + --start_text_position; + } + + *startOffset = start_text_position; + + // Find the end of the text with this style. + int end_position = sb->SendScintilla(QsciScintillaBase::SCI_POSITIONAFTER, + position); + int end_text_position = offset + 1; + int last_position = sb->SendScintilla( + QsciScintillaBase::SCI_GETTEXTLENGTH); + + while (end_position < last_position) + { + int s = sb->SendScintilla(QsciScintillaBase::SCI_GETSTYLEAT, + end_position); + + if (s != style) + break; + + end_position = sb->SendScintilla(QsciScintillaBase::SCI_POSITIONAFTER, + end_position); + ++end_text_position; + } + + *endOffset = end_text_position; + + // Convert the style to attributes. + QString attrs; + + int back = sb->SendScintilla(QsciScintillaBase::SCI_STYLEGETBACK, style); + addAttribute(attrs, "background-color", colourAsRGB(back)); + + int fore = sb->SendScintilla(QsciScintillaBase::SCI_STYLEGETFORE, style); + addAttribute(attrs, "color", colourAsRGB(fore)); + + QFont font = fontForStyle(style); + + QString family = font.family(); + family = family.replace('\\', QLatin1String("\\\\")); + family = family.replace(':', QLatin1String("\\:")); + family = family.replace(',', QLatin1String("\\,")); + family = family.replace('=', QLatin1String("\\=")); + family = family.replace(';', QLatin1String("\\;")); + family = family.replace('\"', QLatin1String("\\\"")); + addAttribute(attrs, "font-familly", + QLatin1Char('"') + family + QLatin1Char('"')); + + int font_size = int(font.pointSize()); + addAttribute(attrs, "font-size", + QString::fromLatin1("%1pt").arg(font_size)); + + QFont::Style font_style = font.style(); + addAttribute(attrs, "font-style", + QString::fromLatin1((font_style == QFont::StyleItalic) ? "italic" : ((font_style == QFont::StyleOblique) ? "oblique": "normal"))); + + int font_weight = font.weight(); + addAttribute(attrs, "font-weight", + QString::fromLatin1( + (font_weight > QFont::Normal) ? "bold" : "normal")); + + int underline = sb->SendScintilla(QsciScintillaBase::SCI_STYLEGETUNDERLINE, + style); + if (underline) + addAttribute(attrs, "text-underline-type", + QString::fromLatin1("single")); + + return attrs; +} + + +// Add an attribute name/value pair. +void QsciAccessibleScintillaBase::addAttribute(QString &attrs, + const char *name, const QString &value) +{ + attrs.append(QLatin1String(name)); + attrs.append(QChar(':')); + attrs.append(value); + attrs.append(QChar(';')); +} + + +// Convert a integer colour to an RGB string. +QString QsciAccessibleScintillaBase::colourAsRGB(int colour) +{ + return QString::fromLatin1("rgb(%1,%2,%3)").arg(colour & 0xff).arg((colour >> 8) & 0xff).arg((colour >> 16) & 0xff); +} + + +// Convert a integer colour to an RGB string. +QFont QsciAccessibleScintillaBase::fontForStyle(int style) const +{ + QsciScintillaBase *sb = sciWidget(); + char fontName[64]; + int len = sb->SendScintilla(QsciScintillaBase::SCI_STYLEGETFONT, style, + fontName); + int size = sb->SendScintilla(QsciScintillaBase::SCI_STYLEGETSIZE, style); + bool italic = sb->SendScintilla(QsciScintillaBase::SCI_STYLEGETITALIC, + style); + int weight = sb->SendScintilla(QsciScintillaBase::SCI_STYLEGETWEIGHT, + style); + + return QFont(QString::fromUtf8(fontName, len), size, weight, italic); +} + + +// Delete some text. +void QsciAccessibleScintillaBase::deleteText(int startOffset, int endOffset) +{ + addSelection(startOffset, endOffset); + sciWidget()->SendScintilla(QsciScintillaBase::SCI_REPLACESEL, ""); +} + + +// Insert some text. +void QsciAccessibleScintillaBase::insertText(int offset, const QString &text) +{ + QsciScintillaBase *sb = sciWidget(); + + sb->SendScintilla(QsciScintillaBase::SCI_INSERTTEXT, + offsetAsPosition(sb, offset), textAsBytes(sb, text).constData()); +} + + +// Replace some text. +void QsciAccessibleScintillaBase::replaceText(int startOffset, int endOffset, + const QString &text) +{ + QsciScintillaBase *sb = sciWidget(); + + addSelection(startOffset, endOffset); + sb->SendScintilla(QsciScintillaBase::SCI_REPLACESEL, + textAsBytes(sb, text).constData()); +} + + +// Return the state. +QAccessible::State QsciAccessibleScintillaBase::state() const +{ + QAccessible::State st = QAccessibleWidget::state(); + + st.selectableText = true; + st.multiLine = true; + + if (sciWidget()->SendScintilla(QsciScintillaBase::SCI_GETREADONLY)) + st.readOnly = true; + else + st.editable = true; + + return st; +} + + +// Provide access to the indivual interfaces. +void *QsciAccessibleScintillaBase::interface_cast(QAccessible::InterfaceType t) +{ + if (t == QAccessible::TextInterface) + return static_cast(this); + + if (t == QAccessible::EditableTextInterface) + return static_cast(this); + + return QAccessibleWidget::interface_cast(t); +} + + +// The accessibility interface factory. +static QAccessibleInterface *factory(const QString &classname, QObject *object) +{ + if (classname == QLatin1String("QsciScintillaBase") && object && object->isWidgetType()) + return new QsciAccessibleScintillaBase(static_cast(object)); + + return 0; +} + + +#endif diff -Nru sqlitebrowser-3.10.100ubuntu1/libs/qscintilla/Qt4Qt5/SciAccessibility.h sqlitebrowser-3.11.1/libs/qscintilla/Qt4Qt5/SciAccessibility.h --- sqlitebrowser-3.10.100ubuntu1/libs/qscintilla/Qt4Qt5/SciAccessibility.h 1970-01-01 00:00:00.000000000 +0000 +++ sqlitebrowser-3.11.1/libs/qscintilla/Qt4Qt5/SciAccessibility.h 2019-02-19 23:51:34.000000000 +0000 @@ -0,0 +1,122 @@ +// The definition of the class that implements accessibility support. +// +// Copyright (c) 2018 Riverbank Computing Limited +// +// This file is part of QScintilla. +// +// This file may be used under the terms of the GNU General Public License +// version 3.0 as published by the Free Software Foundation and appearing in +// the file LICENSE included in the packaging of this file. Please review the +// following information to ensure the GNU General Public License version 3.0 +// requirements will be met: http://www.gnu.org/copyleft/gpl.html. +// +// If you do not wish to use this file under the terms of the GPL version 3.0 +// then you may purchase a commercial license. For more information contact +// info@riverbankcomputing.com. +// +// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + + +#ifndef _SCIACCESSIBILITY_H +#define _SCIACCESSIBILITY_H + +#include + +#if !defined(QT_NO_ACCESSIBILITY) + +#include +#include +#include +#include +#include +#include +#include +#include + + +class QsciScintillaBase; + + +// The implementation of accessibility support. +class QsciAccessibleScintillaBase : public QAccessibleWidget, + public QAccessibleTextInterface, + public QAccessibleEditableTextInterface +{ +public: + explicit QsciAccessibleScintillaBase(QWidget *widget); + ~QsciAccessibleScintillaBase(); + + static void initialise(); + + static void selectionChanged(QsciScintillaBase *sb, bool selection); + static void textInserted(QsciScintillaBase *sb, int position, + const char *text, int length); + static void textDeleted(QsciScintillaBase *sb, int position, + const char *text, int length); + static void updated(QsciScintillaBase *sb); + + void selection(int selectionIndex, int *startOffset, int *endOffset) const; + int selectionCount() const; + void addSelection(int startOffset, int endOffset); + void removeSelection(int selectionIndex); + void setSelection(int selectionIndex, int startOffset, int endOffset); + + int cursorPosition() const; + void setCursorPosition(int position); + + QString text(int startOffset, int endOffset) const; + QString textBeforeOffset(int offset, + QAccessible::TextBoundaryType boundaryType, int *startOffset, + int *endOffset) const; + QString textAfterOffset(int offset, + QAccessible::TextBoundaryType boundaryType, int *startOffset, + int *endOffset) const; + QString textAtOffset(int offset, + QAccessible::TextBoundaryType boundaryType, int *startOffset, + int *endOffset) const; + int characterCount() const; + QRect characterRect(int offset) const; + int offsetAtPoint(const QPoint &point) const; + void scrollToSubstring(int startIndex, int endIndex); + QString attributes(int offset, int *startOffset, int *endOffset) const; + + void deleteText(int startOffset, int endOffset); + void insertText(int offset, const QString &text); + void replaceText(int startOffset, int endOffset, const QString &text); + + QAccessible::State state() const; + void *interface_cast(QAccessible::InterfaceType t); + +private: + static bool needs_initialising; + static QList all_accessibles; + int current_cursor_offset; + bool is_selection; + + static QsciAccessibleScintillaBase *findAccessible(QsciScintillaBase *sb); + QsciScintillaBase *sciWidget() const; + int validPosition(int offset) const; + static bool boundaries(QsciScintillaBase *sb, int position, + QAccessible::TextBoundaryType boundaryType, int *start_position, + int *end_position); + static QString textRange(QsciScintillaBase *sb, int start_position, + int end_position); + static QString bytesAsText(QsciScintillaBase *sb, const char *bytes, + int length); + static QByteArray textAsBytes(QsciScintillaBase *sb, const QString &text); + static int positionAsOffset(QsciScintillaBase *sb, int position); + static void positionRangeAsOffsetRange(QsciScintillaBase *sb, + int start_position, int end_position, int *startOffset, + int *endOffset); + static int offsetAsPosition(QsciScintillaBase *sb, int offset); + static QString colourAsRGB(int colour); + static void addAttribute(QString &attrs, const char *name, + const QString &value); + QFont fontForStyle(int style) const; +}; + + +#endif + +#endif diff -Nru sqlitebrowser-3.10.100ubuntu1/libs/qscintilla/Qt4Qt5/SciClasses.cpp sqlitebrowser-3.11.1/libs/qscintilla/Qt4Qt5/SciClasses.cpp --- sqlitebrowser-3.10.100ubuntu1/libs/qscintilla/Qt4Qt5/SciClasses.cpp 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/libs/qscintilla/Qt4Qt5/SciClasses.cpp 2019-02-19 23:51:34.000000000 +0000 @@ -1,7 +1,7 @@ // The implementation of various Qt version independent classes used by the // rest of the port. // -// Copyright (c) 2017 Riverbank Computing Limited +// Copyright (c) 2018 Riverbank Computing Limited // // This file is part of QScintilla. // diff -Nru sqlitebrowser-3.10.100ubuntu1/libs/qscintilla/Qt4Qt5/SciClasses.h sqlitebrowser-3.11.1/libs/qscintilla/Qt4Qt5/SciClasses.h --- sqlitebrowser-3.10.100ubuntu1/libs/qscintilla/Qt4Qt5/SciClasses.h 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/libs/qscintilla/Qt4Qt5/SciClasses.h 2019-02-19 23:51:34.000000000 +0000 @@ -1,7 +1,7 @@ // The definition of various Qt version independent classes used by the rest of // the port. // -// Copyright (c) 2017 Riverbank Computing Limited +// Copyright (c) 2018 Riverbank Computing Limited // // This file is part of QScintilla. // diff -Nru sqlitebrowser-3.10.100ubuntu1/libs/qscintilla/Qt4Qt5/SciNamespace.h sqlitebrowser-3.11.1/libs/qscintilla/Qt4Qt5/SciNamespace.h --- sqlitebrowser-3.10.100ubuntu1/libs/qscintilla/Qt4Qt5/SciNamespace.h 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/libs/qscintilla/Qt4Qt5/SciNamespace.h 2019-02-19 23:51:34.000000000 +0000 @@ -1,7 +1,7 @@ // Support for building the Scintilla code in the Scintilla namespace using the // -DSCI_NAMESPACE compiler flag. // -// Copyright (c) 2017 Riverbank Computing Limited +// Copyright (c) 2018 Riverbank Computing Limited // // This file is part of QScintilla. // diff -Nru sqlitebrowser-3.10.100ubuntu1/libs/qscintilla/Qt4Qt5/ScintillaQt.cpp sqlitebrowser-3.11.1/libs/qscintilla/Qt4Qt5/ScintillaQt.cpp --- sqlitebrowser-3.10.100ubuntu1/libs/qscintilla/Qt4Qt5/ScintillaQt.cpp 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/libs/qscintilla/Qt4Qt5/ScintillaQt.cpp 2019-02-19 23:51:34.000000000 +0000 @@ -1,6 +1,6 @@ // The implementation of the Qt specific subclass of ScintillaBase. // -// Copyright (c) 2017 Riverbank Computing Limited +// Copyright (c) 2018 Riverbank Computing Limited // // This file is part of QScintilla. // @@ -31,6 +31,9 @@ #include "Qsci/qsciscintillabase.h" #include "ScintillaQt.h" +#if !defined(QT_NO_ACCESSIBILITY) +#include "SciAccessibility.h" +#endif #include "SciClasses.h" @@ -110,6 +113,11 @@ // This is ignored. imeInteraction = imeInline; + // Using pixmaps screws things up when moving to a different display + // (although this could be because we haven't got the pixmap code right). + // However Qt shouldn't need buffered drawing anyway. + WndProc(SCI_SETBUFFEREDDRAW, 0, 0); + for (int i = 0; i <= static_cast(tickPlatform); ++i) timers[i] = 0; @@ -192,10 +200,12 @@ void QsciScintillaQt::SetMouseCapture(bool on) { if (mouseDownCaptures) + { if (on) qsb->viewport()->grabMouse(); else qsb->viewport()->releaseMouse(); + } capturedMouse = on; } @@ -383,8 +393,17 @@ { char *text; +#if !defined(QT_NO_ACCESSIBILITY) + if ((scn.modificationType & SC_MOD_INSERTTEXT) != 0) + QsciAccessibleScintillaBase::textInserted(qsb, scn.position, + scn.text, scn.length); + else if ((scn.modificationType & SC_MOD_DELETETEXT) != 0) + QsciAccessibleScintillaBase::textDeleted(qsb, scn.position, + scn.text, scn.length); +#endif + // Give some protection to the Python bindings. - if (scn.text && (scn.modificationType & (SC_MOD_INSERTTEXT|SC_MOD_DELETETEXT) != 0)) + if (scn.text && (scn.modificationType & (SC_MOD_INSERTTEXT|SC_MOD_DELETETEXT)) != 0) { text = new char[scn.length + 1]; memcpy(text, scn.text, scn.length); @@ -430,6 +449,9 @@ break; case SCN_UPDATEUI: +#if !defined(QT_NO_ACCESSIBILITY) + QsciAccessibleScintillaBase::updated(qsb); +#endif emit qsb->SCN_UPDATEUI(scn.updated); break; @@ -567,6 +589,10 @@ else primarySelection = false; +#if !defined(QT_NO_ACCESSIBILITY) + QsciAccessibleScintillaBase::selectionChanged(qsb, isSel); +#endif + emit qsb->QSCN_SELCHANGED(isSel); } diff -Nru sqlitebrowser-3.10.100ubuntu1/libs/qscintilla/Qt4Qt5/ScintillaQt.h sqlitebrowser-3.11.1/libs/qscintilla/Qt4Qt5/ScintillaQt.h --- sqlitebrowser-3.10.100ubuntu1/libs/qscintilla/Qt4Qt5/ScintillaQt.h 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/libs/qscintilla/Qt4Qt5/ScintillaQt.h 2019-02-19 23:51:34.000000000 +0000 @@ -1,6 +1,6 @@ // The definition of the Qt specific subclass of ScintillaBase. // -// Copyright (c) 2017 Riverbank Computing Limited +// Copyright (c) 2018 Riverbank Computing Limited // // This file is part of QScintilla. // diff -Nru sqlitebrowser-3.10.100ubuntu1/README.md sqlitebrowser-3.11.1/README.md --- sqlitebrowser-3.10.100ubuntu1/README.md 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/README.md 2019-02-19 23:51:34.000000000 +0000 @@ -1,10 +1,13 @@ # DB Browser for SQLite +[![Wiki][wiki-img]][wiki] [![Build Status][travis-img]][travis] [![Join the chat at https://gitter.im/sqlitebrowser/sqlitebrowser][gitter-img]][gitter] +[![Join the chat at https://join.slack.com/t/db4s/shared_invite/enQtMzc3MzY5OTU4NDgzLWRlYjk0ZmE5ZDEzYWVmNDQxYTYxNmJjNWVkMjI3ZmVjZTY2NDBjODY3YzNhNTNmZDVlNWI2ZGFjNTk5MjJkYmU][slack-img]][slack] [![Download][download-img]][download] [![Qt][qt-img]][qt] [![Coverity][coverity-img]][coverity] +[![Patreon][patreon-img]][patreon] ![DB Browser for SQLite Screenshot](https://github.com/sqlitebrowser/sqlitebrowser/raw/master/images/sqlitebrowser.png "DB Browser for SQLite Screenshot") @@ -13,16 +16,15 @@ _DB Browser for SQLite_ (DB4S) is a high quality, visual, open source tool to create, design, and edit database files compatible with SQLite. -It is for users and developers wanting to create databases, search, and edit -data. It uses a familiar spreadsheet-like interface, and you don't need to -learn complicated SQL commands. +DB4S is for users and developers who want to create, search, and edit +databases. DB4S uses a familiar spreadsheet-like interface, and complicated SQL commands do not have to be learned. Controls and wizards are available for users to: * Create and compact database files * Create, define, modify and delete tables -* Create, define and delete indexes -* Browse, edit, add and delete records +* Create, define, and delete indexes +* Browse, edit, add, and delete records * Search records * Import and export records as text * Import and export tables from/to CSV files @@ -33,25 +35,30 @@ ## What it is not -This program is not a visual shell for the sqlite command line tool. It does -not require familiarity with SQL commands. It is a tool to be used both by -developers and by end users, and it must remain as simple to use as possible -in order to achieve its goals. +This program is not a visual shell for the sqlite command line tool, and does +not require familiarity with SQL commands. It is a tool to be used by both +developers and end users, and must remain as simple to use as possible +in order to achieve these goals. + +## Wiki + +For user and developer documentation, check out our Wiki at: +https://github.com/sqlitebrowser/sqlitebrowser/wiki. ## Nightly builds -Nightly builds for Windows and OSX can be downloaded here: +Download nightly builds for Windows and OSX here: * https://nightlies.sqlitebrowser.org/latest ## Windows -Windows releases can be downloaded here: +Download Windows releases here: * https://github.com/sqlitebrowser/sqlitebrowser/releases -**Note** - If for some reason the standard Windows release doesn't work for -you (eg it gives an error), try a nightly build. They often fix bugs +**Note** - If for some reason the standard Windows release does not work +(e.g. gives an error), try a nightly build. Nightly builds often fix bugs reported after the last release. :D ## MacOS X / macOS @@ -60,11 +67,11 @@ * OSX 10.8 (Mountain Lion) - 10.13 (High Sierra) are tested and known to work -OSX releases can be downloaded here: +Download OSX releases here: * https://github.com/sqlitebrowser/sqlitebrowser/releases -Latest OSX binary can be installed via [Homebrew Cask](https://caskroom.github.io/ "Homebrew Cask"): +The latest OSX binary can be installed via [Homebrew Cask](https://caskroom.github.io/ "Homebrew Cask"): ``` brew cask install db-browser-for-sqlite @@ -80,7 +87,7 @@ ### Fedora -For Fedora (i386 and x86_64) you can install by issuing: +Install for Fedora (i386 and x86_64) by issuing the following command: $ sudo dnf install sqlitebrowser @@ -102,7 +109,7 @@ #### Stable release For Ubuntu and derivaties, [@deepsidhu1313](https://github.com/deepsidhu1313) -provides a PPA with our latest release here: +provides a PPA with the latest release here: * https://launchpad.net/~linuxgndu/+archive/ubuntu/sqlitebrowser @@ -122,9 +129,9 @@ Launchpad decides to discontinue building for any series). Ubuntu Precise (12.04) and Utopic (14.10) are not supported: -* Precise doesn't have a new enough Qt package in its repository by default, +* Precise does not have a new enough Qt package in its repository by default, which is a dependency -* Launchpad doesn't support Utopic any more, as that has reached its End of +* Launchpad does not support Utopic any more, which has reached its End of Life #### Nightly builds @@ -133,7 +140,7 @@ * https://launchpad.net/~linuxgndu/+archive/ubuntu/sqlitebrowser-testing -To add this ppa just type in these commands in terminal: +To add this ppa, type these commands into the terminal: sudo add-apt-repository -y ppa:linuxgndu/sqlitebrowser-testing @@ -147,31 +154,38 @@ ### Other Linux -On others you'll need to compile it yourself using the (simple) instructions +On others, compile DB4S using the instructions in [BUILDING.md](BUILDING.md). ## FreeBSD DB Browser for SQLite works well on FreeBSD, and there is a port for it (thanks -to [lbartoletti](https://github.com/lbartoletti) :smile:). It can be installed -using either this: +to [lbartoletti](https://github.com/lbartoletti) :smile:). DB4S can be installed +using either this command: # make -C /usr/ports/databases/sqlitebrowser install -or this: +or this command: # pkg install sqlitebrowser -### Compiling +## Snap packages -Instructions for compiling on (at least) Windows, OSX, Linux, and FreeBSD are -in [BUILDING](BUILDING.md). +[![Get it from the Snap Store](https://snapcraft.io/static/images/badges/en/snap-store-black.svg)](https://snapcraft.io/sqlitebrowser) + +#### Snap Nightlies + + snap install sqlitebrowser --devmode -## Developer mailing list +#### Snap Stable -For development related discussion about DB4S and DBHub.io: + snap install sqlitebrowser -* https://lists.sqlitebrowser.org/mailman/listinfo/db4s-dev + +## Compiling + +Instructions for compiling on Windows, OSX, Linux, and FreeBSD are +in [BUILDING](BUILDING.md). ## Twitter @@ -179,7 +193,7 @@ ## Website -* http://sqlitebrowser.org +* https://sqlitebrowser.org ## Old project page @@ -187,6 +201,8 @@ ## Releases +* [Version 3.11.1 released](https://github.com/sqlitebrowser/sqlitebrowser/releases/tag/v3.11.1) - 2019-02-18 +* [Version 3.11.0 released](https://github.com/sqlitebrowser/sqlitebrowser/releases/tag/v3.11.0) - 2019-02-07 * [Version 3.10.1 released](https://github.com/sqlitebrowser/sqlitebrowser/releases/tag/v3.10.1) - 2017-09-20 * [Version 3.10.0 released](https://github.com/sqlitebrowser/sqlitebrowser/releases/tag/v3.10.0) - 2017-08-20 * [Version 3.9.1 released](https://github.com/sqlitebrowser/sqlitebrowser/releases/tag/v3.9.1) - 2016-10-03 @@ -249,20 +265,23 @@ ## Contributors -You can see the list by going to the [__Contributors__ tab](https://github.com/sqlitebrowser/sqlitebrowser/graphs/contributors). +View the list by going to the [__Contributors__ tab](https://github.com/sqlitebrowser/sqlitebrowser/graphs/contributors). ## License DB Browser for SQLite is bi-licensed under the Mozilla Public License Version 2, as well as the GNU General Public License Version 3 or later. -You can modify or redistribute it under the conditions of these licenses. +Modification or redistribution is permitted under the conditions of these licenses. [travis-img]: https://travis-ci.org/sqlitebrowser/sqlitebrowser.svg?branch=master [travis]: https://travis-ci.org/sqlitebrowser/sqlitebrowser [gitter-img]: https://badges.gitter.im/sqlitebrowser/sqlitebrowser.svg - [gitter]: https://gitter.im/sqlitebrowser/sqlitebrowser?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge + [gitter]: https://gitter.im/sqlitebrowser/sqlitebrowser + + [slack-img]: https://img.shields.io/badge/chat-on%20slack-orange.svg + [slack]: https://join.slack.com/t/db4s/shared_invite/enQtMzc3MzY5OTU4NDgzLWRlYjk0ZmE5ZDEzYWVmNDQxYTYxNmJjNWVkMjI3ZmVjZTY2NDBjODY3YzNhNTNmZDVlNWI2ZGFjNTk5MjJkYmU [download-img]: https://img.shields.io/github/downloads/sqlitebrowser/sqlitebrowser/total.svg [download]: https://github.com/sqlitebrowser/sqlitebrowser/releases @@ -272,3 +291,9 @@ [coverity-img]: https://img.shields.io/coverity/scan/11712.svg [coverity]: https://scan.coverity.com/projects/sqlitebrowser-sqlitebrowser + + [patreon-img]: https://img.shields.io/badge/donate-Patreon-coral.svg + [patreon]: https://www.patreon.com/bePatron?u=11578749 + + [wiki-img]: https://img.shields.io/badge/docs-Wiki-blue.svg + [wiki]: https://github.com/sqlitebrowser/sqlitebrowser/wiki diff -Nru sqlitebrowser-3.10.100ubuntu1/snap/snapcraft.yaml sqlitebrowser-3.11.1/snap/snapcraft.yaml --- sqlitebrowser-3.10.100ubuntu1/snap/snapcraft.yaml 1970-01-01 00:00:00.000000000 +0000 +++ sqlitebrowser-3.11.1/snap/snapcraft.yaml 2019-02-19 23:51:34.000000000 +0000 @@ -0,0 +1,145 @@ + name: sqlitebrowser # the name of the snap + # version: 3.10.1 # the version of the snap + version: master + version-script: printf "`cat currentrelease | head -n 1 `-`git rev-list master --count`-` git -C . rev-parse --short HEAD`" + + summary: DB Browser for SQLite # 79 char long summary + description: | + SQLite Database Browser is a visual tool used to create, design and edit database files compatible with SQLite. Its interface is based on Qt, and is meant to be used for users and developers that want to create databases, edit and search data using a familiar spreadsheet-like interface, without the need to learn complicated SQL commands. Controls and wizards are available for users to: + * Create and compact database files + * Create, define, modify and delete tables + * Create, define and delete indexes + * Browse, edit, add and delete records + * Search records + * Import and export records as text + * Import and export tables from/to CSV files + * Import and export databases from/to SQL dump files + * Issue SQL queries and inspect the results + * Examine a log of all SQL commands issued by the application + SQLite Database Browser is not a visual shell for the sqlite command line tool. It does not require familiarity with SQL commands. + confinement: strict # use "strict" to enforce system access only via declared interfaces + + grade: devel + icon: images/sqlitebrowser.svg + type: app + + apps: + sqlitebrowser: + command: desktop-launch $SNAP/bin/sqlitebrowser + desktop: share/applications/sqlitebrowser.desktop + environment: + TMPDIR: $XDG_RUNTIME_DIR + plugs: + # - browser-support + - desktop + - gsettings + - home + # - network + # - opengl + - unity7 + - wayland + - x11 + - removable-media + # - ssh-keys + + build-packages: + - build-essential + - g++ + - qtbase5-dev + - qttools5-dev + - qttools5-dev-tools + - libsqlite3-dev + - cmake + - libantlr-dev + - libsqlcipher-dev + - libqcustomplot-dev + # - libx11-xcb1 + # - libx11-xcb-dev + # - libxcb-xkb-dev + - libqt5scintilla2-dev + - git + parts: + # wrappers: + # plugin: dump + # source: snap/ + sqlitebrowser: + # source-type: git + plugin: cmake + configflags: ["-DUSE_QT5=True", "-Dsqlcipher=1", "-Wno-dev"] + source: . + desktop-qt5: + build-packages: + - qtbase5-dev + - dpkg-dev + - libgtk-3-dev + make-parameters: + - FLAVOR=qt5 + plugin: make + source: https://github.com/ubuntu/snapcraft-desktop-helpers.git + source-subdir: qt + stage-packages: + - libxkbcommon0 + # - qt5-gtk-platformtheme + - ttf-ubuntu-font-family + - dmz-cursor-theme + - light-themes + - adwaita-icon-theme + - gnome-themes-standard + - shared-mime-info + - libgtk-3-0 + - libqt5gui5 + - libgdk-pixbuf2.0-0 + - libqt5svg5 + - appmenu-qt5 + - libglib2.0-bin + - libgtk-3-bin + - unity-gtk3-module + - libappindicator3-1 + - locales-all + - xdg-user-dirs + - ibus-gtk3 + - libibus-1.0-5 + dump: + plugin: dump + after: + - desktop-qt5 + - sqlitebrowser + stage-packages: + # - qtbase5-dev + # - libqt5gui5 + # - libqt4gui4 + # - libxkbcommon0 + # - libxkbfile1 + # - gtk2-engines + - libc6 + # - gtk2-engines-oxygen + # - gtk3-engines-breeze + - libgcc1 + # - libqcustomplot1.3 + # - libqt5network5 + # - libqt5scintilla2-12v5 + - libsqlite3-0 + - libstdc++6 + - libsqlcipher-dev + - libatk-adaptor + - libgail-common + - libgail-3-0 + - libgail-3-dev + - libgail-dev + # - qt5-gtk-platformtheme + filesets: + wanted: + - bin/* + - share/* + - usr/lib/*.* + - usr/lib/*-linux-gnu*/libsqlcipher.so.0* + - usr/lib/*-linux-gnu*/libdb* + - usr/lib/*-linux-gnu*/libz.so* + - usr/lib/*-linux-gnu*/libatk* + - usr/lib/*-linux-gnu*/libgail* + - usr/lib/*-linux-gnu*/gtk-2.0/modules/* + - etc/X11/Xsession.d/90atk-adaptor + - usr/lib/gnome-settings-daemon-3.0/gtk-modules/at-spi2-atk.desktop + - usr/lib/unity-settings-daemon-1.0/gtk-modules/at-spi2-atk.desktop + prime: + - $wanted diff -Nru sqlitebrowser-3.10.100ubuntu1/src/AboutDialog.cpp sqlitebrowser-3.11.1/src/AboutDialog.cpp --- sqlitebrowser-3.10.100ubuntu1/src/AboutDialog.cpp 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/src/AboutDialog.cpp 2019-02-19 23:51:34.000000000 +0000 @@ -1,6 +1,6 @@ #include "AboutDialog.h" #include "ui_AboutDialog.h" -#include "sqlite.h" +#include "sqlitedb.h" #include "Application.h" AboutDialog::AboutDialog(QWidget *parent) : @@ -11,13 +11,17 @@ this->setFixedSize(this->width(), this->height()); this->setWindowFlags(this->windowFlags() & ~Qt::WindowContextHelpButtonHint); + QString sqlite_version, sqlcipher_version; + DBBrowserDB::getSqliteVersion(sqlite_version, sqlcipher_version); + if(sqlcipher_version.isNull()) + sqlite_version = tr("SQLite Version ") + sqlite_version; + else + sqlite_version = tr("SQLCipher Version ") + sqlcipher_version + tr(" (based on SQLite %1)").arg(sqlite_version); + ui->label_version->setText(tr("Version ") + Application::versionString() + "\n\n" + + tr("Built for ") + QSysInfo::buildAbi() + ", running on " + QSysInfo::currentCpuArchitecture() + "\n\n" + tr("Qt Version ") + QT_VERSION_STR + "\n\n" + -#ifdef ENABLE_SQLCIPHER - tr("SQLCipher Version ") + SQLITE_VERSION -#else - tr("SQLite Version ") + SQLITE_VERSION -#endif + sqlite_version ); } diff -Nru sqlitebrowser-3.10.100ubuntu1/src/AddRecordDialog.cpp sqlitebrowser-3.11.1/src/AddRecordDialog.cpp --- sqlitebrowser-3.10.100ubuntu1/src/AddRecordDialog.cpp 1970-01-01 00:00:00.000000000 +0000 +++ sqlitebrowser-3.11.1/src/AddRecordDialog.cpp 2019-02-19 23:51:34.000000000 +0000 @@ -0,0 +1,343 @@ +#include "AddRecordDialog.h" +#include "ui_AddRecordDialog.h" +#include "sqlitedb.h" +#include "Settings.h" + +#include +#include +#include +#include +#include +#include +#include + +class NullLineEdit: public QLineEdit { + Q_OBJECT +private: + bool m_isNull; + +public: + NullLineEdit(QWidget* parent=nullptr): QLineEdit(parent), m_isNull (true) {} + + bool isNull() {return m_isNull;} + void setNull(bool value) { + if (value) { + clear(); + setStyleSheet("QLineEdit{ font-style: italic; }"); + setPlaceholderText(Settings::getValue("databrowser", "null_text").toString()); + setModified(false); + } else { + setStyleSheet(""); + setPlaceholderText(""); + } + m_isNull = value; + } +protected: + void contextMenuEvent(QContextMenuEvent *event) + { + QMenu* editContextMenu = createStandardContextMenu(); + + QAction* nullAction = new QAction(QIcon(":/icons/set_to_null"), tr("Set to NULL"), editContextMenu); + connect(nullAction, &QAction::triggered, [&]() { + setNull(true); + }); + nullAction->setShortcut(QKeySequence(tr("Alt+Del"))); + editContextMenu->addSeparator(); + editContextMenu->addAction(nullAction); + + editContextMenu->exec(event->globalPos()); + delete editContextMenu; + } + + void keyPressEvent(QKeyEvent *evt) { + // Alt+Del sets field to NULL + if((evt->modifiers() & Qt::AltModifier) && (evt->key() == Qt::Key_Delete)) + setNull(true); + else { + // Remove any possible NULL mark when user starts typing + setStyleSheet(""); + setPlaceholderText(""); + QLineEdit::keyPressEvent(evt); + } + } +}; + +// Styled Item Delegate for non-editable columns (all except Value) +class NoEditDelegate: public QStyledItemDelegate { +public: + NoEditDelegate(QObject* parent=nullptr): QStyledItemDelegate(parent) {} + QWidget* createEditor(QWidget* /* parent */, const QStyleOptionViewItem& /* option */, const QModelIndex& /* index */) const override { + return nullptr; + } +}; + +// Styled Item Delegate for editable columns (Value) +class EditDelegate: public QStyledItemDelegate { + +public: + EditDelegate(QObject* parent=nullptr): QStyledItemDelegate(parent) {} + QWidget* createEditor(QWidget *parent, const QStyleOptionViewItem& /* option */, const QModelIndex& /* index */) const override { + return new NullLineEdit(parent); + } + + void setEditorData(QWidget *editor, const QModelIndex &index) const override { + + NullLineEdit* lineEditor = dynamic_cast(editor); + // Set the editor in the null state (unless the user has actually written NULL) + if (index.model()->data(index, Qt::UserRole).isNull() && + index.model()->data(index, Qt::DisplayRole) == Settings::getValue("databrowser", "null_text")) + lineEditor->setNull(true); + else { + QStyledItemDelegate::setEditorData(editor, index); + lineEditor->setNull(false); + } + } + void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const override { + + NullLineEdit* lineEditor = dynamic_cast(editor); + // Restore NULL text (unless the user has already modified the value) + if (lineEditor->isNull() && !lineEditor->isModified()) { + model->setData(index, Settings::getValue("databrowser", "null_text"), Qt::DisplayRole); + model->setData(index, QVariant(), Qt::UserRole); + } else { + // Get isModified flag before calling setModelData + bool modified = lineEditor->isModified(); + QStyledItemDelegate::setModelData(editor, model, index); + // Copy the just edited data to the user role, so it can be later used in the SQL insert statement. + if (modified) { + lineEditor->setNull(false); + model->setData(index, model->data(index, Qt::EditRole), Qt::UserRole); + } + } + } +}; + +AddRecordDialog::AddRecordDialog(DBBrowserDB& db, const sqlb::ObjectIdentifier& tableName, QWidget* parent) + : QDialog(parent), + ui(new Ui::AddRecordDialog), + pdb(db), + curTable(tableName), + m_table(*(pdb.getObjectByName(curTable))) +{ + // Create UI + ui->setupUi(this); + connect(ui->treeWidget, SIGNAL(itemChanged(QTreeWidgetItem*,int)),this,SLOT(itemChanged(QTreeWidgetItem*,int))); + + populateFields(); + + ui->sqlTextEdit->setReadOnly(true); + + // Update UI + ui->treeWidget->resizeColumnToContents(kName); + ui->treeWidget->resizeColumnToContents(kType); + ui->treeWidget->setFrameShape(QFrame::Box); +} + +AddRecordDialog::~AddRecordDialog() +{ + delete ui; +} + +void AddRecordDialog::keyPressEvent(QKeyEvent *evt) +{ + if((evt->modifiers() & Qt::ControlModifier) + && (evt->key() == Qt::Key_Enter || evt->key() == Qt::Key_Return)) + { + accept(); + return; + } + if(evt->key() == Qt::Key_Enter || evt->key() == Qt::Key_Return) + return; + QDialog::keyPressEvent(evt); +} + +void AddRecordDialog::setDefaultsStyle(QTreeWidgetItem* item) +{ + // Default values are displayed with the style configured for NULL values in the Data Browser. + QFont font; + font.setItalic(true); + item->setData(kValue, Qt::FontRole, font); + item->setData(kValue, Qt::BackgroundRole, QColor(Settings::getValue("databrowser", "null_bg_colour").toString())); + item->setData(kValue, Qt::ForegroundRole, QColor(Settings::getValue("databrowser", "null_fg_colour").toString())); +} + +void AddRecordDialog::populateFields() +{ + // disconnect the itemChanged signal or the SQL text will + // be updated while filling the treewidget. + disconnect(ui->treeWidget, SIGNAL(itemChanged(QTreeWidgetItem*,int)), + this,SLOT(itemChanged(QTreeWidgetItem*,int))); + + ui->treeWidget->clear(); + + // Allow all Edit Triggers, but they will only apply to the columns with + // editors (Value) + ui->treeWidget->setEditTriggers(QAbstractItemView::AllEditTriggers); + + // Disallow edition of columns except Value + ui->treeWidget->setItemDelegateForColumn(kName, new NoEditDelegate(this)); + ui->treeWidget->setItemDelegateForColumn(kType, new NoEditDelegate(this)); + ui->treeWidget->setItemDelegateForColumn(kValue, new EditDelegate(this)); + + const auto& fields = m_table.fields; + const QStringList& pk = m_table.primaryKey(); + for(const sqlb::Field& f : fields) + { + QTreeWidgetItem *tbitem = new QTreeWidgetItem(ui->treeWidget); + + tbitem->setFlags(Qt::ItemIsEnabled | Qt::ItemIsEditable); + + tbitem->setText(kName, f.name()); + tbitem->setText(kType, f.type()); + tbitem->setData(kType, Qt::UserRole, f.affinity()); + + // NOT NULL fields are indicated in bold. + if (f.notnull()) { + QFont font; + font.setBold(true); + tbitem->setData(kName, Qt::FontRole, font); + } + if (contains(pk, f.name())) + tbitem->setIcon(kName, QIcon(":/icons/field_key")); + else if (m_table.constraint({f.name()}, sqlb::Constraint::ForeignKeyConstraintType)) + tbitem->setIcon(kName, QIcon(":/icons/field_fk")); + else + tbitem->setIcon(kName, QIcon(":/icons/field")); + + QString defaultValue = f.defaultValue(); + QString toolTip; + + if (f.autoIncrement()) + toolTip.append(tr("Auto-increment\n")); + + if (f.unique()) + toolTip.append(tr("Unique constraint\n")); + + if (!f.check().isEmpty()) + toolTip.append(tr("Check constraint:\t %1\n").arg (f.check())); + + auto fk = std::dynamic_pointer_cast(m_table.constraint({f.name()}, sqlb::Constraint::ForeignKeyConstraintType)); + if(fk) + toolTip.append(tr("Foreign key:\t %1\n").arg(fk->toString())); + + setDefaultsStyle(tbitem); + + // Display Role is used for displaying the default values. + // Only when they are changed, the User Role is updated and then used in the INSERT query. + if (!defaultValue.isEmpty()) { + tbitem->setData(kValue, Qt::DisplayRole, f.defaultValue()); + toolTip.append(tr("Default value:\t %1\n").arg (defaultValue)); + } else + tbitem->setData(kValue, Qt::DisplayRole, Settings::getValue("databrowser", "null_text")); + + + if (!toolTip.isEmpty()) { + // Chop last end-of-line + toolTip.chop(1); + tbitem->setToolTip(kValue, toolTip); + tbitem->setToolTip(kType, toolTip); + } + } + + updateSqlText(); + + // and reconnect + connect(ui->treeWidget, SIGNAL(itemChanged(QTreeWidgetItem*,int)),this,SLOT(itemChanged(QTreeWidgetItem*,int))); +} + +void AddRecordDialog::accept() +{ + if(!pdb.executeSQL(ui->sqlTextEdit->text())) + { + QMessageBox::warning( + this, + QApplication::applicationName(), + tr("Error adding record. Message from database engine:\n\n%1").arg(pdb.lastError())); + return; + } + + QDialog::accept(); +} + +void AddRecordDialog::updateSqlText() +{ + QString stmt = QString("INSERT INTO %1").arg(curTable.toString()); + + QStringList vals; + QStringList fields; + + // If the User Role of the Value column is not null, the entered value is used + // in the INSERT statement. Otherwise, SQLite just uses the default value for the field. + for(int i = 0; i < ui->treeWidget->topLevelItemCount(); ++i) + { + QTreeWidgetItem *item = ui->treeWidget->topLevelItem(i); + // User role contains now values entered by the user, that we actually need to insert. + QVariant value = item->data(kValue, Qt::UserRole); + + if (!value.isNull()) { + bool isNumeric; + fields << sqlb::escapeIdentifier(item->text(kName)); + value.toDouble(&isNumeric); + // If it has a numeric format and has no text affinity, do not quote it. + if (isNumeric && item->data(kType, Qt::UserRole).toString() != "TEXT") + vals << value.toString(); + else + vals << QString("'%1'").arg(value.toString().replace("'", "''")); + } + } + + if(fields.empty()) + { + stmt.append(" DEFAULT VALUES;"); + } else { + stmt.append("\n("); + stmt.append(fields.join(", ")); + stmt.append(")\nVALUES ("); + stmt.append(vals.join(", ")); + stmt.append(");"); + } + + ui->sqlTextEdit->setText(stmt); +} + +void AddRecordDialog::itemChanged(QTreeWidgetItem *item, int column) +{ + if (item->data(column, Qt::UserRole).isNull()) + setDefaultsStyle(item); + else { + // Restore default fore/background for the value column, + // since the value has changed away from the default. + QFont font; + font.setItalic(false); + item->setData(column, Qt::FontRole, font); + item->setData(column, Qt::BackgroundRole, item->data(kName, Qt::BackgroundRole)); + item->setData(column, Qt::ForegroundRole, item->data(kName, Qt::ForegroundRole)); + } + + updateSqlText(); +} + +void AddRecordDialog::help() +{ + QWhatsThis::enterWhatsThisMode(); +} + +void AddRecordDialog::on_buttonBox_clicked(QAbstractButton* button) +{ + if (button == ui->buttonBox->button(QDialogButtonBox::Cancel)) + reject(); + else if (button == ui->buttonBox->button(QDialogButtonBox::Save)) + accept(); + else if (button == ui->buttonBox->button(QDialogButtonBox::Help)) + help(); + else if (button == ui->buttonBox->button(QDialogButtonBox::RestoreDefaults)) { + if (QMessageBox::warning(this, + QApplication::applicationName(), + tr("Are you sure you want to restore all the entered values to their defaults?"), + QMessageBox::RestoreDefaults | QMessageBox::Cancel, + QMessageBox::Cancel) == QMessageBox::RestoreDefaults) + populateFields(); + } +} + +#include "AddRecordDialog.moc" diff -Nru sqlitebrowser-3.10.100ubuntu1/src/AddRecordDialog.h sqlitebrowser-3.11.1/src/AddRecordDialog.h --- sqlitebrowser-3.10.100ubuntu1/src/AddRecordDialog.h 1970-01-01 00:00:00.000000000 +0000 +++ sqlitebrowser-3.11.1/src/AddRecordDialog.h 2019-02-19 23:51:34.000000000 +0000 @@ -0,0 +1,52 @@ +#ifndef ADDRECORDDIALOG_H +#define ADDRECORDDIALOG_H + +#include "sql/sqlitetypes.h" + +#include + +class DBBrowserDB; +class QTreeWidgetItem; + +namespace Ui { +class AddRecordDialog; +} +class QAbstractButton; + + +class AddRecordDialog : public QDialog +{ + Q_OBJECT + +public: + explicit AddRecordDialog(DBBrowserDB& pdb, const sqlb::ObjectIdentifier& tableName, QWidget* parent = nullptr); + ~AddRecordDialog() override; + +protected: + void keyPressEvent(QKeyEvent *evt) override; + +private: + enum Columns { + kName = 0, + kType = 1, + kValue = 2, + }; + + void updateSqlText(); + void populateFields(); + void setDefaultsStyle(QTreeWidgetItem* item); + +private slots: + void accept() override; + void itemChanged(QTreeWidgetItem* item, int column); + void help(); + void on_buttonBox_clicked(QAbstractButton* button); + +private: + Ui::AddRecordDialog* ui; + DBBrowserDB& pdb; + sqlb::ObjectIdentifier curTable; + sqlb::Table m_table; +}; + +#endif diff -Nru sqlitebrowser-3.10.100ubuntu1/src/AddRecordDialog.ui sqlitebrowser-3.11.1/src/AddRecordDialog.ui --- sqlitebrowser-3.10.100ubuntu1/src/AddRecordDialog.ui 1970-01-01 00:00:00.000000000 +0000 +++ sqlitebrowser-3.11.1/src/AddRecordDialog.ui 2019-02-19 23:51:34.000000000 +0000 @@ -0,0 +1,158 @@ + + + AddRecordDialog + + + + 0 + 0 + 650 + 500 + + + + Add New Record + + + + :/icons/table:/icons/table + + + true + + + + + + Enter values for the new record considering constraints. Fields in bold are mandatory. + + + + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + Qt::Vertical + + + + + 0 + 0 + + + + + 0 + 140 + + + + In the Value column you can specify the value for the field identified in the Name column. The Type column indicates the type of the field. Default values are displayed in the same style as NULL values. + + + false + + + + Name + + + + + Type + + + + + Value + + + Values to insert. Pre-filled default values are inserted automatically unless they are changed. + + + + + + When you edit the values in the upper frame, the SQL query for inserting this new record is shown here. You can edit manually the query before saving. + + + true + + + + + + + + + + + + + + <html><head/><body><p><span style=" font-weight:600;">Save</span> will submit the shown SQL statement to the database for inserting the new record.</p><p><span style=" font-weight:600;">Restore Defaults</span> will restore the initial values in the <span style=" font-weight:600;">Value</span> column.</p><p><span style=" font-weight:600;">Cancel</span> will close this dialog without executing the query.</p></body></html> + + + Qt::Horizontal + + + QDialogButtonBox::Cancel|QDialogButtonBox::Help|QDialogButtonBox::RestoreDefaults|QDialogButtonBox::Save + + + + + + + + SqlTextEdit + QWidget +
sqltextedit.h
+ 1 +
+
+ + treeWidget + sqlTextEdit + + + + + + + buttonBox + clicked(QAbstractButton*) + AddRecordDialog + on_buttonBox_clicked(QAbstractButton*) + + + 324 + 477 + + + 324 + 249 + + + + + + itemChanged() + +
diff -Nru sqlitebrowser-3.10.100ubuntu1/src/Application.cpp sqlitebrowser-3.11.1/src/Application.cpp --- sqlitebrowser-3.10.100ubuntu1/src/Application.cpp 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/src/Application.cpp 2019-02-19 23:51:34.000000000 +0000 @@ -90,6 +90,7 @@ qWarning() << qPrintable(tr(" -s, --sql [file]\tExecute this SQL file after opening the DB")); qWarning() << qPrintable(tr(" -t, --table [table]\tBrowse this table after opening the DB")); qWarning() << qPrintable(tr(" -R, --read-only\tOpen database in read-only mode")); + qWarning() << qPrintable(tr(" -o, --option [group/setting=value]\tRun application with this setting temporarily set to value")); qWarning() << qPrintable(tr(" -v, --version\t\tDisplay the current version")); qWarning() << qPrintable(tr(" [file]\t\tOpen this SQLite database")); m_dontShowMainWindow = true; @@ -113,6 +114,22 @@ m_dontShowMainWindow = true; } else if(arguments().at(i) == "-R" || arguments().at(i) == "--read-only") { readOnly = true; + } else if(arguments().at(i) == "-o" || arguments().at(i) == "--option") { + const QString optionWarning = tr("The -o/--option option requires an argument in the form group/setting=value"); + if(++i >= arguments().size()) + qWarning() << qPrintable(optionWarning); + else { + QStringList option = arguments().at(i).split("="); + if (option.size() != 2) + qWarning() << qPrintable(optionWarning); + else { + QStringList setting = option.at(0).split("/"); + if (setting.size() != 2) + qWarning() << qPrintable(optionWarning); + else + Settings::setValue(setting.at(0), setting.at(1), option.at(1), /* dont_save_to_disk */ true); + } + } } else { // Other: Check if it's a valid file name if(QFile::exists(arguments().at(i))) diff -Nru sqlitebrowser-3.10.100ubuntu1/src/Application.h sqlitebrowser-3.11.1/src/Application.h --- sqlitebrowser-3.10.100ubuntu1/src/Application.h 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/src/Application.h 2019-02-19 23:51:34.000000000 +0000 @@ -12,7 +12,7 @@ public: explicit Application(int& argc, char** argv); - virtual ~Application(); + ~Application() override; bool dontShowMainWindow() { return m_dontShowMainWindow; } @@ -21,7 +21,7 @@ static QString versionString(); protected: - bool event(QEvent* event); + bool event(QEvent* event) override; private: bool m_dontShowMainWindow; diff -Nru sqlitebrowser-3.10.100ubuntu1/src/app.plist sqlitebrowser-3.11.1/src/app.plist --- sqlitebrowser-3.10.100ubuntu1/src/app.plist 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/src/app.plist 2019-02-19 23:51:34.000000000 +0000 @@ -10,6 +10,9 @@ CFBundleTypeExtensions db + db3 + sqlite + sqlite3 CFBundleTypeName Database Document @@ -52,7 +55,7 @@ CFBundleExecutable @EXECUTABLE@ CFBundleGetInfoString - 3.10.99 + 3.11.99 CFBundleIconFile @ICON@ CFBundleIdentifier @@ -64,11 +67,11 @@ CFBundlePackageType APPL CFBundleShortVersionString - 3.10.99 + 3.11.99 CFBundleSignature SqLB CFBundleVersion - 3.10.99 + 3.11.99 NSPrincipalClass NSApplication NSHighResolutionCapable diff -Nru sqlitebrowser-3.10.100ubuntu1/src/CipherDialog.cpp sqlitebrowser-3.11.1/src/CipherDialog.cpp --- sqlitebrowser-3.10.100ubuntu1/src/CipherDialog.cpp 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/src/CipherDialog.cpp 2019-02-19 23:51:34.000000000 +0000 @@ -1,9 +1,12 @@ #include "CipherDialog.h" #include "ui_CipherDialog.h" +#include "sqlitedb.h" #include #include +#include + CipherDialog::CipherDialog(QWidget* parent, bool encrypt) : QDialog(parent), ui(new Ui::CipherDialog), @@ -12,6 +15,21 @@ { ui->setupUi(this); + int minimumPageSizeExponent = 9; + int maximumPageSizeExponent = 16; + int defaultPageSizeExponent = 10; + + for(int exponent = minimumPageSizeExponent; exponent <= maximumPageSizeExponent; exponent++) + { + int pageSize = static_cast(qPow(2, exponent)); + ui->comboPageSize->addItem(QLocale().toString(pageSize), pageSize); + + if (exponent == defaultPageSizeExponent) + ui->comboPageSize->setCurrentIndex(exponent - minimumPageSizeExponent); + } + + ui->comboPageSize->setMinimumWidth(ui->editPassword->width()); + if(encrypt) { ui->labelDialogDescription->setText(tr("Please set a key to encrypt the database.\nNote that if you change any of the other, optional, settings you'll need " @@ -24,6 +42,14 @@ ui->editPassword2->setVisible(false); ui->labelPassword2->setVisible(false); } + + // Set the default encryption settings depending on the SQLCipher version we use + QString sqlite_version, sqlcipher_version; + DBBrowserDB::getSqliteVersion(sqlite_version, sqlcipher_version); + if(sqlcipher_version.startsWith('4')) + ui->radioEncryptionSqlCipher4->setChecked(true); + else + ui->radioEncryptionSqlCipher3->setChecked(true); } CipherDialog::~CipherDialog() @@ -32,34 +58,36 @@ delete ui; } -CipherDialog::KeyFormats CipherDialog::keyFormat() const +CipherSettings CipherDialog::getCipherSettings() const { - return static_cast(ui->comboKeyFormat->currentIndex()); -} + CipherSettings::KeyFormats keyFormat = CipherSettings::getKeyFormat(ui->comboKeyFormat->currentIndex()); + QString password = ui->editPassword->text(); + int pageSize = ui->comboPageSize->itemData(ui->comboPageSize->currentIndex()).toInt(); + + CipherSettings cipherSettings; + + cipherSettings.setKeyFormat(keyFormat); + cipherSettings.setPassword(password); + cipherSettings.setPageSize(pageSize); + cipherSettings.setKdfIterations(ui->spinKdfIterations->value()); + cipherSettings.setHmacAlgorithm(QString("HMAC_") + ui->comboHmacAlgorithm->currentText()); + cipherSettings.setKdfAlgorithm(QString("PBKDF2_HMAC_") + ui->comboKdfAlgorithm->currentText()); -QString CipherDialog::password() const -{ - if(keyFormat() == KeyFormats::Passphrase) - return QString("'%1'").arg(ui->editPassword->text().replace("'", "''")); - else - return QString("\"x'%1'\"").arg(ui->editPassword->text().mid(2)); // Remove the '0x' part at the beginning -} - -int CipherDialog::pageSize() const -{ - return ui->spinPageSize->value(); + return cipherSettings; } void CipherDialog::checkInputFields() { if(sender() == ui->comboKeyFormat) { - if(keyFormat() == KeyFormats::Passphrase) + CipherSettings::KeyFormats keyFormat = CipherSettings::getKeyFormat(ui->comboKeyFormat->currentIndex()); + + if(keyFormat == CipherSettings::KeyFormats::Passphrase) { ui->editPassword->setValidator(nullptr); ui->editPassword2->setValidator(nullptr); ui->editPassword->setPlaceholderText(""); - } else if(keyFormat() == KeyFormats::RawKey) { + } else if(keyFormat == CipherSettings::KeyFormats::RawKey) { ui->editPassword->setValidator(rawKeyValidator); ui->editPassword2->setValidator(rawKeyValidator); ui->editPassword->setPlaceholderText("0x..."); @@ -75,3 +103,38 @@ ui->buttonBox->button(QDialogButtonBox::Ok)->setEnabled(valid); } + +void CipherDialog::toggleEncryptionSettings() +{ + if(ui->radioEncryptionSqlCipher3->isChecked()) + { + // SQLCipher3 + ui->comboPageSize->setCurrentText(QLocale().toString(1024)); + ui->spinKdfIterations->setValue(64000); + ui->comboHmacAlgorithm->setCurrentText("SHA1"); + ui->comboKdfAlgorithm->setCurrentText("SHA1"); + + ui->comboPageSize->setEnabled(false); + ui->spinKdfIterations->setEnabled(false); + ui->comboHmacAlgorithm->setEnabled(false); + ui->comboKdfAlgorithm->setEnabled(false); + } else if(ui->radioEncryptionSqlCipher4->isChecked()) { + // SQLCipher4 + ui->comboPageSize->setCurrentText(QLocale().toString(4096)); + ui->spinKdfIterations->setValue(256000); + ui->comboHmacAlgorithm->setCurrentText("SHA512"); + ui->comboKdfAlgorithm->setCurrentText("SHA512"); + + ui->comboPageSize->setEnabled(false); + ui->spinKdfIterations->setEnabled(false); + ui->comboHmacAlgorithm->setEnabled(false); + ui->comboKdfAlgorithm->setEnabled(false); + } else if(ui->radioEncryptionCustom->isChecked()) { + // Custom + + ui->comboPageSize->setEnabled(true); + ui->spinKdfIterations->setEnabled(true); + ui->comboHmacAlgorithm->setEnabled(true); + ui->comboKdfAlgorithm->setEnabled(true); + } +} diff -Nru sqlitebrowser-3.10.100ubuntu1/src/CipherDialog.h sqlitebrowser-3.11.1/src/CipherDialog.h --- sqlitebrowser-3.10.100ubuntu1/src/CipherDialog.h 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/src/CipherDialog.h 2019-02-19 23:51:34.000000000 +0000 @@ -3,6 +3,8 @@ #include +#include "CipherSettings.h" + class QRegExpValidator; namespace Ui { @@ -14,21 +16,12 @@ Q_OBJECT public: - enum KeyFormats - { - Passphrase, - RawKey - }; - // Set the encrypt parameter to true when the dialog is used to encrypt a database; // set it to false if the dialog is used to ask the user for the key to decrypt a file. explicit CipherDialog(QWidget* parent, bool encrypt); - ~CipherDialog(); + ~CipherDialog() override; - // Allow read access to the input fields - KeyFormats keyFormat() const; - QString password() const; - int pageSize() const; + CipherSettings getCipherSettings() const; private: Ui::CipherDialog* ui; @@ -37,6 +30,7 @@ private slots: void checkInputFields(); + void toggleEncryptionSettings(); }; #endif diff -Nru sqlitebrowser-3.10.100ubuntu1/src/CipherDialog.ui sqlitebrowser-3.11.1/src/CipherDialog.ui --- sqlitebrowser-3.10.100ubuntu1/src/CipherDialog.ui 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/src/CipherDialog.ui 2019-02-19 23:51:34.000000000 +0000 @@ -7,7 +7,7 @@ 0 0 712 - 183 + 299 @@ -18,7 +18,7 @@ - + @@ -55,29 +55,6 @@ - - - - Page si&ze - - - spinPageSize - - - - - - - 512 - - - 65536 - - - 1024 - - - @@ -114,6 +91,136 @@ + + + + + Encr&yption settings + + + radioEncryptionSqlCipher3 + + + + + + + + + SQLCipher &3 defaults + + + + + + + SQLCipher &4 defaults + + + + + + + Custo&m + + + + + + + + + Page si&ze + + + comboPageSize + + + + + + + + + + &KDF iterations + + + spinKdfIterations + + + + + + + 1 + + + 1000000 + + + + + + + HMAC algorithm + + + comboHmacAlgorithm + + + + + + + + SHA512 + + + + + SHA256 + + + + + SHA1 + + + + + + + + KDF algorithm + + + comboKdfAlgorithm + + + + + + + + SHA512 + + + + + SHA256 + + + + + SHA1 + + + + + + + Qt::Horizontal @@ -127,9 +234,15 @@ editPassword - comboKeyFormat editPassword2 - spinPageSize + comboKeyFormat + radioEncryptionSqlCipher3 + radioEncryptionSqlCipher4 + radioEncryptionCustom + comboPageSize + spinKdfIterations + comboHmacAlgorithm + comboKdfAlgorithm @@ -140,8 +253,8 @@ accept() - 233 - 174 + 175 + 265 157 @@ -156,8 +269,8 @@ reject() - 301 - 174 + 175 + 265 286 @@ -188,8 +301,8 @@ checkInputFields() - 319 - 96 + 446 + 79 206 @@ -213,8 +326,57 @@ + + radioEncryptionSqlCipher3 + toggled(bool) + CipherDialog + toggleEncryptionSettings() + + + 217 + 114 + + + 231 + 94 + + + + + radioEncryptionSqlCipher4 + toggled(bool) + CipherDialog + toggleEncryptionSettings() + + + 353 + 117 + + + 407 + 97 + + + + + radioEncryptionCustom + toggled(bool) + CipherDialog + toggleEncryptionSettings() + + + 552 + 120 + + + 590 + 99 + + + checkInputFields() + toggleEncryptionSettings() diff -Nru sqlitebrowser-3.10.100ubuntu1/src/CipherSettings.cpp sqlitebrowser-3.11.1/src/CipherSettings.cpp --- sqlitebrowser-3.10.100ubuntu1/src/CipherSettings.cpp 1970-01-01 00:00:00.000000000 +0000 +++ sqlitebrowser-3.11.1/src/CipherSettings.cpp 2019-02-19 23:51:34.000000000 +0000 @@ -0,0 +1,46 @@ +#include "CipherSettings.h" + +CipherSettings::KeyFormats CipherSettings::getKeyFormat() const +{ + return keyFormat; +} + +void CipherSettings::setKeyFormat(const KeyFormats &value) +{ + keyFormat = value; +} + +QString CipherSettings::getPassword() const +{ + if(keyFormat == Passphrase) + { + QString tempPassword = password; + + tempPassword.replace("'", "''"); + + return QString("'%1'").arg(tempPassword); + } else { + // Remove the '0x' part at the beginning + return QString("\"x'%1'\"").arg(password.mid(2)); + } +} + +void CipherSettings::setPassword(const QString &value) +{ + password = value; +} + +int CipherSettings::getPageSize() const +{ + return pageSize; +} + +void CipherSettings::setPageSize(int value) +{ + pageSize = value; +} + +CipherSettings::KeyFormats CipherSettings::getKeyFormat(int rawKeyFormat) +{ + return static_cast(rawKeyFormat); +} diff -Nru sqlitebrowser-3.10.100ubuntu1/src/CipherSettings.h sqlitebrowser-3.11.1/src/CipherSettings.h --- sqlitebrowser-3.10.100ubuntu1/src/CipherSettings.h 1970-01-01 00:00:00.000000000 +0000 +++ sqlitebrowser-3.11.1/src/CipherSettings.h 2019-02-19 23:51:34.000000000 +0000 @@ -0,0 +1,44 @@ +#ifndef CIPHERSETTINGS_H +#define CIPHERSETTINGS_H + +#include + +class CipherSettings +{ +public: + enum KeyFormats + { + Passphrase, + RawKey + }; + + KeyFormats getKeyFormat() const; + void setKeyFormat(const KeyFormats &value); + + QString getPassword() const; + void setPassword(const QString &value); + + int getPageSize() const; + void setPageSize(int value); + + int getKdfIterations() const { return kdfIterations; } + void setKdfIterations(int value) { kdfIterations = value; } + + QString getHmacAlgorithm() const { return hmacAlgorithm; } + void setHmacAlgorithm(const QString &value) { hmacAlgorithm = value; } + + QString getKdfAlgorithm() const { return kdfAlgorithm; } + void setKdfAlgorithm(const QString &value) { kdfAlgorithm = value; } + + static KeyFormats getKeyFormat(int rawKeyFormat); + +private: + KeyFormats keyFormat; + QString password; + int pageSize; + int kdfIterations; + QString hmacAlgorithm; + QString kdfAlgorithm; +}; + +#endif // CIPHERSETTINGS_H diff -Nru sqlitebrowser-3.10.100ubuntu1/src/ColumnDisplayFormatDialog.cpp sqlitebrowser-3.11.1/src/ColumnDisplayFormatDialog.cpp --- sqlitebrowser-3.10.100ubuntu1/src/ColumnDisplayFormatDialog.cpp 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/src/ColumnDisplayFormatDialog.cpp 2019-02-19 23:51:34.000000000 +0000 @@ -1,11 +1,16 @@ +#include + #include "ColumnDisplayFormatDialog.h" #include "ui_ColumnDisplayFormatDialog.h" -#include "sqlitetypes.h" +#include "sql/sqlitetypes.h" +#include "sqlitedb.h" -ColumnDisplayFormatDialog::ColumnDisplayFormatDialog(const QString& colname, QString current_format, QWidget* parent) +ColumnDisplayFormatDialog::ColumnDisplayFormatDialog(DBBrowserDB& db, const sqlb::ObjectIdentifier& tableName, const QString& colname, QString current_format, QWidget* parent) : QDialog(parent), ui(new Ui::ColumnDisplayFormatDialog), - column_name(colname) + column_name(colname), + pdb(db), + curTable(tableName) { // Create UI ui->setupUi(this); @@ -22,11 +27,15 @@ ui->comboDisplayFormat->addItem(tr("Java epoch (milliseconds) to date"), "javaEpoch"); ui->comboDisplayFormat->addItem(tr("Julian day to date"), "julian"); ui->comboDisplayFormat->addItem(tr("Unix epoch to date"), "epoch"); + ui->comboDisplayFormat->addItem(tr("Unix epoch to local time"), "epochLocalTime"); ui->comboDisplayFormat->addItem(tr("Windows DATE to date"), "winDate"); ui->comboDisplayFormat->addItem(tr("Date as dd/mm/yyyy"), "ddmmyyyyDate"); ui->comboDisplayFormat->insertSeparator(ui->comboDisplayFormat->count()); ui->comboDisplayFormat->addItem(tr("Lower case"), "lower"); ui->comboDisplayFormat->addItem(tr("Upper case"), "upper"); + ui->comboDisplayFormat->insertSeparator(ui->comboDisplayFormat->count()); + ui->comboDisplayFormat->addItem(tr("Custom"), "custom"); + ui->labelDisplayFormat->setText(ui->labelDisplayFormat->text().arg(column_name)); formatFunctions["decimal"] = "printf('%d', " + sqlb::escapeIdentifier(column_name) + ")"; @@ -35,12 +44,13 @@ formatFunctions["hex"] = "printf('0x%x', " + sqlb::escapeIdentifier(column_name) + ")"; formatFunctions["octal"] = "printf('%o', " + sqlb::escapeIdentifier(column_name) + ")"; formatFunctions["round"] = "round(" + sqlb::escapeIdentifier(column_name) + ")"; - formatFunctions["appleDate"] = "datetime('2001-01-01', " + sqlb::escapeIdentifier(column_name) + " || \" seconds\")"; + formatFunctions["appleDate"] = "datetime('2001-01-01', " + sqlb::escapeIdentifier(column_name) + " || ' seconds')"; formatFunctions["javaEpoch"] = "strftime('%Y-%m-%d %H:%M:%S.', " + sqlb::escapeIdentifier(column_name) + "/1000, 'unixepoch') || (" + sqlb::escapeIdentifier(column_name) + "%1000)"; formatFunctions["julian"] = "datetime(" + sqlb::escapeIdentifier(column_name) + ")"; formatFunctions["epoch"] = "datetime(" + sqlb::escapeIdentifier(column_name) + ", 'unixepoch')"; - formatFunctions["winDate"] = "datetime('1899-12-30', " + sqlb::escapeIdentifier(column_name) + " || \" days\")"; + formatFunctions["epochLocalTime"] = "datetime(" + sqlb::escapeIdentifier(column_name) + ", 'unixepoch', 'localtime')"; + formatFunctions["winDate"] = "datetime('1899-12-30', " + sqlb::escapeIdentifier(column_name) + " || ' days')"; formatFunctions["ddmmyyyyDate"] = "strftime('%d/%m/%Y', " + sqlb::escapeIdentifier(column_name) + ")"; formatFunctions["lower"] = "lower(" + sqlb::escapeIdentifier(column_name) + ")"; formatFunctions["upper"] = "upper(" + sqlb::escapeIdentifier(column_name) + ")"; @@ -51,19 +61,14 @@ ui->comboDisplayFormat->setCurrentIndex(0); updateSqlCode(); } else { - QString formatName; + // When it doesn't match any predefined format, it is considered custom + QString formatName = "custom"; for(auto& formatKey : formatFunctions.keys()) { if(current_format == formatFunctions.value(formatKey)) { formatName = formatKey; break; } } - - if(formatName.isEmpty()) { - ui->comboDisplayFormat->insertSeparator(ui->comboDisplayFormat->count()); - ui->comboDisplayFormat->addItem(tr("Custom"), "custom"); - formatName = "custom"; - } ui->comboDisplayFormat->setCurrentIndex(ui->comboDisplayFormat->findData(formatName)); ui->editDisplayFormat->setText(current_format); } @@ -88,7 +93,46 @@ if(format == "default") ui->editDisplayFormat->setText(sqlb::escapeIdentifier(column_name)); - else + else if(format != "custom") ui->editDisplayFormat->setText(formatFunctions.value(format)); +} +void ColumnDisplayFormatDialog::accept() +{ + QString errorMessage; + + // Accept the SQL code if it's the column name (default), it contains a function invocation applied to the column name and it can be + // executed without errors returning only one column. + // Users could still devise a way to break this, but this is considered good enough for letting them know about simple incorrect + // cases. + if(!(ui->editDisplayFormat->text() == sqlb::escapeIdentifier(column_name) || + ui->editDisplayFormat->text().contains(QRegExp("[a-z]+[a-z_0-9]* *\\(.*" + QRegExp::escape(sqlb::escapeIdentifier(column_name)) + ".*\\)", Qt::CaseInsensitive)))) + errorMessage = tr("Custom display format must contain a function call applied to %1").arg(sqlb::escapeIdentifier(column_name)); + else { + // Execute a query using the display format and check that it only returns one column. + int customNumberColumns = 0; + + DBBrowserDB::execCallback callback = [&customNumberColumns](int numberColumns, QStringList, QStringList) -> bool { + customNumberColumns = numberColumns; + // Return false so the query is not aborted and no error is reported. + return false; + }; + if(!pdb.executeSQL(QString("SELECT %1 FROM %2 LIMIT 1").arg(ui->editDisplayFormat->text(), curTable.toString()), + false, true, callback)) + errorMessage = tr("Error in custom display format. Message from database engine:\n\n%1").arg(pdb.lastError()); + else if(customNumberColumns != 1) + errorMessage = tr("Custom display format must return only one column but it returned %1.").arg(customNumberColumns); + + } + if(!errorMessage.isEmpty()) + QMessageBox::warning(this, QApplication::applicationName(), errorMessage); + else + QDialog::accept(); +} + +void ColumnDisplayFormatDialog::setCustom(bool modified) +{ + // If the SQL code is modified by user, select the custom value in the combo-box + if(modified && ui->editDisplayFormat->hasFocus()) + ui->comboDisplayFormat->setCurrentIndex(ui->comboDisplayFormat->findData("custom")); } diff -Nru sqlitebrowser-3.10.100ubuntu1/src/ColumnDisplayFormatDialog.h sqlitebrowser-3.11.1/src/ColumnDisplayFormatDialog.h --- sqlitebrowser-3.10.100ubuntu1/src/ColumnDisplayFormatDialog.h 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/src/ColumnDisplayFormatDialog.h 2019-02-19 23:51:34.000000000 +0000 @@ -5,6 +5,10 @@ #include #include +#include "sql/sqlitetypes.h" + +class DBBrowserDB; + namespace Ui { class ColumnDisplayFormatDialog; } @@ -14,18 +18,22 @@ Q_OBJECT public: - explicit ColumnDisplayFormatDialog(const QString& colname, QString current_format, QWidget* parent = nullptr); - ~ColumnDisplayFormatDialog(); + explicit ColumnDisplayFormatDialog(DBBrowserDB& db, const sqlb::ObjectIdentifier& tableName, const QString& colname, QString current_format, QWidget* parent = nullptr); + ~ColumnDisplayFormatDialog() override; QString selectedDisplayFormat() const; private slots: void updateSqlCode(); + void accept() override; + void setCustom(bool modified); private: Ui::ColumnDisplayFormatDialog* ui; QString column_name; QMap formatFunctions; + DBBrowserDB& pdb; + sqlb::ObjectIdentifier curTable; }; #endif diff -Nru sqlitebrowser-3.10.100ubuntu1/src/ColumnDisplayFormatDialog.ui sqlitebrowser-3.11.1/src/ColumnDisplayFormatDialog.ui --- sqlitebrowser-3.10.100ubuntu1/src/ColumnDisplayFormatDialog.ui 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/src/ColumnDisplayFormatDialog.ui 2019-02-19 23:51:34.000000000 +0000 @@ -31,11 +31,7 @@ - - - true - - + @@ -114,8 +110,25 @@ + + editDisplayFormat + modificationChanged(bool) + ColumnDisplayFormatDialog + setCustom(bool) + + + 125 + 69 + + + 244 + 4 + + + updateSqlCode() + setCustom() diff -Nru sqlitebrowser-3.10.100ubuntu1/src/CondFormat.cpp sqlitebrowser-3.11.1/src/CondFormat.cpp --- sqlitebrowser-3.10.100ubuntu1/src/CondFormat.cpp 1970-01-01 00:00:00.000000000 +0000 +++ sqlitebrowser-3.11.1/src/CondFormat.cpp 2019-02-19 23:51:34.000000000 +0000 @@ -0,0 +1,115 @@ +#include "CondFormat.h" +#include "Settings.h" +#include "Data.h" + +CondFormat::CondFormat(const QString& filter, const QColor& color, const QString& encoding) + : m_filter(filter), + m_color(color) +{ + m_sqlCondition = filterToSqlCondition(filter, encoding); +} + +QString CondFormat::filterToSqlCondition(const QString& value, const QString& encoding) +{ + // Check for any special comparison operators at the beginning of the value string. If there are none default to LIKE. + QString op = "LIKE"; + QString val, val2; + QString escape; + bool numeric = false, ok = false; + + // range/BETWEEN operator + if (value.contains("~")) { + int sepIdx = value.indexOf('~'); + val = value.mid(0, sepIdx); + val2 = value.mid(sepIdx+1); + val.toFloat(&ok); + if (ok) { + val2.toFloat(&ok); + ok = ok && (val.toFloat() < val2.toFloat()); + } + } + if (ok) { + op = "BETWEEN"; + numeric = true; + } else { + val.clear(); + val2.clear(); + if(value.left(2) == ">=" || value.left(2) == "<=" || value.left(2) == "<>") + { + // Check if we're filtering for '<> NULL'. In this case we need a special comparison operator. + if(value.left(2) == "<>" && value.mid(2) == "NULL") + { + // We are filtering for '<>NULL'. Override the comparison operator to search for NULL values in this column. Also treat search value (NULL) as number, + // in order to avoid putting quotes around it. + op = "IS NOT"; + numeric = true; + val = "NULL"; + } else if(value.left(2) == "<>" && value.mid(2) == "''") { + // We are filtering for "<>''", i.e. for everything which is not an empty string + op = "<>"; + numeric = true; + val = "''"; + } else { + value.mid(2).toFloat(&numeric); + op = value.left(2); + val = value.mid(2); + } + } else if(value.left(1) == ">" || value.left(1) == "<") { + value.mid(1).toFloat(&numeric); + op = value.left(1); + val = value.mid(1); + } else if(value.left(1) == "=") { + val = value.mid(1); + + // Check if value to compare with is 'NULL' + if(val != "NULL") + { + // It's not, so just compare normally to the value, whatever it is. + op = "="; + } else { + // It is NULL. Override the comparison operator to search for NULL values in this column. Also treat search value (NULL) as number, + // in order to avoid putting quotes around it. + op = "IS"; + numeric = true; + } + } else if(value.left(1) == "/" && value.right(1) == "/" && value.length() > 2) { + val = value.mid(1, value.length() - 2); + op = "REGEXP"; + numeric = false; + } else { + // Keep the default LIKE operator + + // Set the escape character if one has been specified in the settings dialog + QString escape_character = Settings::getValue("databrowser", "filter_escape").toString(); + if(escape_character == "'") escape_character = "''"; + if(escape_character.length()) + escape = QString("ESCAPE '%1'").arg(escape_character); + + // Add % wildcards at the start and at the beginning of the filter query, but only if there weren't set any + // wildcards manually. The idea is to assume that a user who's just typing characters expects the wildcards to + // be added but a user who adds them herself knows what she's doing and doesn't want us to mess up her query. + if(!value.contains("%")) + { + val = value; + val.prepend('%'); + val.append('%'); + } + } + } + if(val.isEmpty()) + val = value; + + if(val == "" || val == "%" || val == "%%") + return QString(); + else { + // Quote and escape value, but only if it's not numeric and not the empty string sequence + if(!numeric && val != "''") + val = QString("'%1'").arg(val.replace("'", "''")); + + QString whereClause(op + " " + QString(encodeString(val.toUtf8(), encoding))); + if (!val2.isEmpty()) + whereClause += " AND " + QString(encodeString(val2.toUtf8(), encoding)); + whereClause += " " + escape; + return whereClause; + } +} diff -Nru sqlitebrowser-3.10.100ubuntu1/src/CondFormat.h sqlitebrowser-3.11.1/src/CondFormat.h --- sqlitebrowser-3.10.100ubuntu1/src/CondFormat.h 1970-01-01 00:00:00.000000000 +0000 +++ sqlitebrowser-3.11.1/src/CondFormat.h 2019-02-19 23:51:34.000000000 +0000 @@ -0,0 +1,28 @@ +#ifndef CONDFORMAT_H +#define CONDFORMAT_H + +#include +#include + +// Conditional formatting for given format to table cells based on a specified condition. +class CondFormat +{ +public: + CondFormat() {}; + explicit CondFormat(const QString& filter, const QColor& color, const QString& encoding = QString()); + + static QString filterToSqlCondition(const QString& value, const QString& encoding = QString()); + +private: + QString m_sqlCondition; + QString m_filter; + QColor m_color; + +public: + QString sqlCondition() const { return m_sqlCondition; }; + QString filter() const { return m_filter; }; + QColor color() const { return m_color; }; + +}; + +#endif // CONDFORMAT_H diff -Nru sqlitebrowser-3.10.100ubuntu1/src/csvparser.cpp sqlitebrowser-3.11.1/src/csvparser.cpp --- sqlitebrowser-3.10.100ubuntu1/src/csvparser.cpp 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/src/csvparser.cpp 2019-02-19 23:51:34.000000000 +0000 @@ -189,7 +189,7 @@ // no linefeed, so assume that CR represents a newline if(nit != sBufferEnd && *nit != '\n') { - field = addColumn(record, field, m_bTrimFields); + addColumn(record, field, m_bTrimFields); if(!(field = addRow(insertFunction, record, parsedRows))) return ParserResult::ParserResultError; @@ -197,7 +197,7 @@ } else if(c == '\n') { - field = addColumn(record, field, m_bTrimFields); + addColumn(record, field, m_bTrimFields); if(!(field = addRow(insertFunction, record, parsedRows))) return ParserResult::ParserResultError; @@ -235,7 +235,7 @@ else if(c == '\n') { state = StateNormal; - field = addColumn(record, field, m_bTrimFields); + addColumn(record, field, m_bTrimFields); if(!(field = addRow(insertFunction, record, parsedRows))) return ParserResult::ParserResultError; @@ -257,7 +257,7 @@ // no linefeed, so assume that CR represents a newline if(nit != sBufferEnd && *nit != '\n') { - field = addColumn(record, field, m_bTrimFields); + addColumn(record, field, m_bTrimFields); if(!(field = addRow(insertFunction, record, parsedRows))) return ParserResult::ParserResultError; @@ -285,7 +285,7 @@ if(record.num_fields) { - field = addColumn(record, field, m_bTrimFields); + addColumn(record, field, m_bTrimFields); if(!(field = addRow(insertFunction, record, parsedRows))) return ParserResult::ParserResultError; diff -Nru sqlitebrowser-3.10.100ubuntu1/src/Data.cpp sqlitebrowser-3.11.1/src/Data.cpp --- sqlitebrowser-3.10.100ubuntu1/src/Data.cpp 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/src/Data.cpp 2019-02-19 23:51:34.000000000 +0000 @@ -1,6 +1,7 @@ #include "Data.h" #include +#include // Note that these aren't all possible BOMs. But they are probably the most common ones. // The size is needed at least for the ones with character zero in them. @@ -17,15 +18,11 @@ return true; // Truncate to the first couple of bytes for quick testing - if(quickTest) - data = data.left(512); - - // Convert to Unicode if necessary - if(!encoding.isEmpty()) - data = QTextCodec::codecForName(encoding.toUtf8())->toUnicode(data).toUtf8(); - - // Perform check - return QString(data).toUtf8() == data; + int testSize = quickTest? std::min(512, data.size()) : data.size(); + QTextCodec::ConverterState state; + QTextCodec *codec = encoding.isEmpty()? QTextCodec::codecForName("UTF-8") : QTextCodec::codecForName(encoding.toUtf8()); + const QString text = codec->toUnicode(data.constData(), testSize, &state); + return state.invalidChars <= 0; } bool startsWithBom(const QByteArray& data) @@ -57,3 +54,27 @@ return QByteArray(); } } + +QStringList toStringList(const QList list) { + QStringList strings; + for (const QByteArray &item : list) { + strings.append(QString::fromUtf8(item)); + } + return strings; +} + +QByteArray encodeString(const QByteArray& str, const QString& encoding) +{ + if(encoding.isEmpty()) + return str; + else + return QTextCodec::codecForName(encoding.toUtf8())->fromUnicode(str); +} + +QByteArray decodeString(const QByteArray& str, const QString& encoding) +{ + if(encoding.isEmpty()) + return str; + else + return QTextCodec::codecForName(encoding.toUtf8())->toUnicode(str).toUtf8(); +} diff -Nru sqlitebrowser-3.10.100ubuntu1/src/Data.h sqlitebrowser-3.11.1/src/Data.h --- sqlitebrowser-3.10.100ubuntu1/src/Data.h 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/src/Data.h 2019-02-19 23:51:34.000000000 +0000 @@ -2,6 +2,7 @@ #define DATA_H #include +#include // This returns false if the data in the data parameter contains binary data. If it is text only, the function returns // true. If the second parameter is specified, it will be used to convert the data from the given encoding to Unicode @@ -17,4 +18,10 @@ // with a BOM an empty byte array is returned and the original data is not modified. QByteArray removeBom(QByteArray& data); +QStringList toStringList(const QList list); + +QByteArray encodeString(const QByteArray& str, const QString& encoding); + +QByteArray decodeString(const QByteArray& str, const QString& encoding); + #endif diff -Nru sqlitebrowser-3.10.100ubuntu1/src/DbStructureModel.cpp sqlitebrowser-3.11.1/src/DbStructureModel.cpp --- sqlitebrowser-3.10.100ubuntu1/src/DbStructureModel.cpp 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/src/DbStructureModel.cpp 2019-02-19 23:51:34.000000000 +0000 @@ -10,7 +10,9 @@ DbStructureModel::DbStructureModel(DBBrowserDB& db, QObject* parent) : QAbstractItemModel(parent), - m_db(db) + m_db(db), + m_dropQualifiedNames(false), + m_dropEnquotedNames(false) { // Create root item and use its columns to store the header strings QStringList header; @@ -41,7 +43,7 @@ switch(role) { case Qt::DisplayRole: - // For the display role and the browsabled branch of the tree we want to show the column name including the schema name if necessary (i.e. + // For the display role and the browsable branch of the tree we want to show the column name including the schema name if necessary (i.e. // for schemata != "main"). For the normal structure branch of the tree we don't want to add the schema name because it's already obvious from // the position of the item in the tree. if(index.column() == ColumnName && item->parent() == browsablesRootItem) @@ -49,8 +51,16 @@ else return Settings::getValue("db", "hideschemalinebreaks").toBool() ? item->text(index.column()).replace("\n", " ").simplified() : item->text(index.column()); case Qt::EditRole: - case Qt::ToolTipRole: // Don't modify the text when it's supposed to be shown in a tooltip return item->text(index.column()); + case Qt::ToolTipRole: { + // Show the original text but limited, when it's supposed to be shown in a tooltip + QString text = item->text(index.column()); + if (text.length() > 512) { + text.truncate(509); + text.append("..."); + } + return text; + } case Qt::DecorationRole: return item->icon(index.column()); default: @@ -66,9 +76,10 @@ // All items are enabled and selectable Qt::ItemFlags flags = Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsDropEnabled; - // Only enable dragging for entire table objects and for fields (composition in SQL text editor) + // Only enable dragging for SQLite objects and for fields (composition in SQL text editor). + // Grouping nodes have no type. QString type = data(index.sibling(index.row(), ColumnObjectType), Qt::DisplayRole).toString(); - if(type == "table" || type == "field" || type == "view" || type == "index" || type == "trigger") + if(!type.isEmpty()) flags |= Qt::ItemIsDragEnabled; return flags; @@ -143,8 +154,8 @@ } // Create the nodes for browsables and for tables, indices, views and triggers. The idea here is to basically have two trees in one model: - // In the root node there are two nodes: 'browsables' and 'all'. The first node contains a list of a all browsable objects, i.e. views and tables. - // The seconds node contains four sub-nodes (tables, indices, views and triggers), each containing a list of objects of that type. + // In the root node there are two nodes: 'browsables' and 'all'. The first node contains a list of all browsable objects, i.e. views and tables. + // The second node contains four sub-nodes (tables, indices, views and triggers), each containing a list of objects of that type. // This way we only have to have and only have to update one model and can use it in all sorts of places, just by setting a different root node. browsablesRootItem = new QTreeWidgetItem(rootItem); browsablesRootItem->setIcon(ColumnName, QIcon(QString(":/icons/view"))); @@ -154,6 +165,7 @@ QTreeWidgetItem* itemAll = new QTreeWidgetItem(rootItem); itemAll->setIcon(ColumnName, QIcon(QString(":/icons/database"))); itemAll->setText(ColumnName, tr("All")); + itemAll->setText(ColumnObjectType, "database"); buildTree(itemAll, "main"); // Add the temporary database as a node if it isn't empty. Make sure it's always second if it exists. @@ -162,6 +174,7 @@ QTreeWidgetItem* itemTemp = new QTreeWidgetItem(itemAll); itemTemp->setIcon(ColumnName, QIcon(QString(":/icons/database"))); itemTemp->setText(ColumnName, tr("Temporary")); + itemTemp->setText(ColumnObjectType, "database"); buildTree(itemTemp, "temp"); } @@ -174,6 +187,7 @@ QTreeWidgetItem* itemSchema = new QTreeWidgetItem(itemAll); itemSchema->setIcon(ColumnName, QIcon(QString(":/icons/database"))); itemSchema->setText(ColumnName, it.key()); + itemSchema->setText(ColumnObjectType, "database"); buildTree(itemSchema, it.key()); } } @@ -198,14 +212,20 @@ // Loop through selected indices for(const QModelIndex& index : indices) { + // Get the item the index points at + QTreeWidgetItem* item = static_cast(index.internalPointer()); + // Only export data for valid indices and only once per row (SQL column or Name column). - // For names, export an escaped identifier of the item for statement composition in SQL editor. - // Commas are included for a list of identifiers. if(index.isValid()) { QString objectType = data(index.sibling(index.row(), ColumnObjectType), Qt::DisplayRole).toString(); - if(index.column() == ColumnName) - namesData.append(sqlb::escapeIdentifier(data(index, Qt::DisplayRole).toString()) + ", "); + // For names, export a (qualified) (escaped) identifier of the item for statement composition in SQL editor. + if(objectType == "field") + namesData.append(getNameForDropping(item->text(ColumnSchema), item->parent()->text(ColumnName), item->text(ColumnName))); + else if(objectType == "database") + namesData.append(getNameForDropping(item->text(ColumnName), "", "")); + else if(!objectType.isEmpty()) + namesData.append(getNameForDropping(item->text(ColumnSchema), item->text(ColumnName), "")); if(objectType != "field" && index.column() == ColumnSQL) { @@ -218,16 +238,20 @@ SqliteTableModel tableModel(m_db); sqlb::ObjectIdentifier objid(data(index.sibling(index.row(), ColumnSchema), Qt::DisplayRole).toString(), data(index.sibling(index.row(), ColumnName), Qt::DisplayRole).toString()); - tableModel.setTable(objid); - tableModel.waitForFetchingFinished(); - for(int i=0; i < tableModel.rowCount(); ++i) + tableModel.setQuery(sqlb::Query(objid)); + if(tableModel.completeCache()) { - QString insertStatement = "INSERT INTO " + objid.toString() + " VALUES("; - for(int j=1; j < tableModel.columnCount(); ++j) - insertStatement += QString("'%1',").arg(tableModel.data(tableModel.index(i, j), Qt::EditRole).toString()); - insertStatement.chop(1); - insertStatement += ");\n"; - sqlData.append(insertStatement); + // Only continue if all data was fetched + + for(int i=0; i < tableModel.rowCount(); ++i) + { + QString insertStatement = "INSERT INTO " + objid.toString() + " VALUES("; + for(int j=1; j < tableModel.columnCount(); ++j) + insertStatement += QString("'%1',").arg(tableModel.data(tableModel.index(i, j), Qt::EditRole).toString()); + insertStatement.chop(1); + insertStatement += ");\n"; + sqlData.append(insertStatement); + } } } } @@ -239,8 +263,12 @@ mime->setProperty("db_file", m_db.currentFile()); // Also save the file name to avoid dropping an object on the same database as it comes from // When we have both SQL and Names data (probable row selection mode) we give precedence to the SQL data if (sqlData.length() == 0 && namesData.length() > 0) { - // Remove last ", " - namesData.chop(2); + // Remove last ", " or "." + if (namesData.endsWith(", ")) + namesData.chop(2); + else if (namesData.endsWith(".")) + namesData.chop(1); + mime->setData("text/plain", namesData); } else mime->setData("text/plain", sqlData); @@ -303,34 +331,33 @@ // Get all database objects and sort them by their name QMultiMap dbobjs; - for(auto it=objmap.constBegin(); it != objmap.constEnd(); ++it) - dbobjs.insert((*it)->name(), (*it)); + for(auto it : objmap) + dbobjs.insert(it->name(), it); // Add the database objects to the tree nodes - for(auto it=dbobjs.constBegin();it!=dbobjs.constEnd();++it) + for(auto it : dbobjs) { // Object node - QTreeWidgetItem* item = addNode(typeToParentItem.value(sqlb::Object::typeToString((*it)->type())), *it, schema); + QTreeWidgetItem* item = addNode(typeToParentItem.value(sqlb::Object::typeToString(it->type())), it, schema); // If it is a table or view add the field nodes, add an extra node for the browsable section - if((*it)->type() == sqlb::Object::Types::Table || (*it)->type() == sqlb::Object::Types::View) - addNode(browsablesRootItem, *it, schema); + if(it->type() == sqlb::Object::Types::Table || it->type() == sqlb::Object::Types::View) + addNode(browsablesRootItem, it, schema); // Add field nodes if there are any - sqlb::FieldInfoList fieldList = (*it)->fieldInformation(); + sqlb::FieldInfoList fieldList = it->fieldInformation(); if(!fieldList.empty()) { QStringList pk_columns; - if((*it)->type() == sqlb::Object::Types::Table) - { - sqlb::FieldVector pk = (*it).dynamicCast()->primaryKey(); - for(const sqlb::FieldPtr& pk_col : pk) - pk_columns.push_back(pk_col->name()); - - } + if(it->type() == sqlb::Object::Types::Table) + pk_columns = std::dynamic_pointer_cast(it)->primaryKey(); for(const sqlb::FieldInfo& field : fieldList) { QTreeWidgetItem *fldItem = new QTreeWidgetItem(item); + bool isFK = false; + if(it->type() == sqlb::Object::Types::Table) + isFK = std::dynamic_pointer_cast(it)->constraint({field.name}, sqlb::Constraint::ForeignKeyConstraintType) != nullptr; + fldItem->setText(ColumnName, field.name); fldItem->setText(ColumnObjectType, "field"); fldItem->setText(ColumnDataType, field.type); @@ -338,6 +365,8 @@ fldItem->setText(ColumnSchema, schema); if(pk_columns.contains(field.name)) fldItem->setIcon(ColumnName, QIcon(":/icons/field_key")); + else if(isFK) + fldItem->setIcon(ColumnName, QIcon(":/icons/field_fk")); else fldItem->setIcon(ColumnName, QIcon(":/icons/field")); } @@ -358,3 +387,23 @@ return item; } + +QString DbStructureModel::getNameForDropping(const QString& domain, const QString& object, const QString& field) const +{ + // Take into account the drag&drop options for composing a name. Commas are included for composing a + // list of fields. A dot is added after other items, in order to allow composing a fully qualified name + // by selecting together and dropping a parent item and a child (e.g. select with control an attached + // database and a table, and drag and drop them to get "schema1"."table1".) Note that this only makes + // sense when the "Drop Qualified Names" option is not set. + QString name; + if ((domain != "main" && m_dropQualifiedNames) || object.isEmpty()) + name = m_dropEnquotedNames ? sqlb::escapeIdentifier(domain) + "." : domain + "."; + + if (!object.isEmpty() && (m_dropQualifiedNames || field.isEmpty())) + name += m_dropEnquotedNames ? sqlb::escapeIdentifier(object) + "." : object + "."; + + if (!field.isEmpty()) + name += m_dropEnquotedNames ? sqlb::escapeIdentifier(field) + ", " : field + ", "; + + return name; +} diff -Nru sqlitebrowser-3.10.100ubuntu1/src/DbStructureModel.h sqlitebrowser-3.11.1/src/DbStructureModel.h --- sqlitebrowser-3.10.100ubuntu1/src/DbStructureModel.h 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/src/DbStructureModel.h 2019-02-19 23:51:34.000000000 +0000 @@ -2,10 +2,11 @@ #define DBSTRUCTUREMODEL_H #include +#include class DBBrowserDB; class QTreeWidgetItem; -namespace sqlb { class Object; typedef QSharedPointer ObjectPtr; } +namespace sqlb { class Object; using ObjectPtr = std::shared_ptr; } class DbStructureModel : public QAbstractItemModel { @@ -13,19 +14,19 @@ public: explicit DbStructureModel(DBBrowserDB& db, QObject* parent = nullptr); - ~DbStructureModel(); + ~DbStructureModel() override; - QVariant data(const QModelIndex& index, int role) const; - Qt::ItemFlags flags(const QModelIndex& index) const; - QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const; - QModelIndex index(int row, int column, const QModelIndex& parent = QModelIndex()) const; - QModelIndex parent(const QModelIndex& index) const; - int rowCount(const QModelIndex& parent = QModelIndex()) const; - int columnCount(const QModelIndex& = QModelIndex()) const; - - QStringList mimeTypes() const; - QMimeData* mimeData(const QModelIndexList& indices) const; - bool dropMimeData(const QMimeData* data, Qt::DropAction action, int row, int column, const QModelIndex& parent); + QVariant data(const QModelIndex& index, int role) const override; + Qt::ItemFlags flags(const QModelIndex& index) const override; + QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override; + QModelIndex index(int row, int column, const QModelIndex& parent = QModelIndex()) const override; + QModelIndex parent(const QModelIndex& index) const override; + int rowCount(const QModelIndex& parent = QModelIndex()) const override; + int columnCount(const QModelIndex& = QModelIndex()) const override; + + QStringList mimeTypes() const override; + QMimeData* mimeData(const QModelIndexList& indices) const override; + bool dropMimeData(const QMimeData* data, Qt::DropAction action, int row, int column, const QModelIndex& parent) override; enum Columns { @@ -38,6 +39,8 @@ public slots: void reloadData(); + void setDropQualifiedNames(bool value) { m_dropQualifiedNames = value; } + void setDropEnquotedNames(bool value) { m_dropEnquotedNames = value; } signals: void structureUpdated(); @@ -46,9 +49,12 @@ DBBrowserDB& m_db; QTreeWidgetItem* rootItem; QTreeWidgetItem* browsablesRootItem; + bool m_dropQualifiedNames; + bool m_dropEnquotedNames; void buildTree(QTreeWidgetItem* parent, const QString& schema); QTreeWidgetItem* addNode(QTreeWidgetItem* parent, const sqlb::ObjectPtr& object, const QString& schema); + QString getNameForDropping(const QString& domain, const QString& object, const QString& field) const; }; #endif diff -Nru sqlitebrowser-3.10.100ubuntu1/src/docktextedit.h sqlitebrowser-3.11.1/src/docktextedit.h --- sqlitebrowser-3.10.100ubuntu1/src/docktextedit.h 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/src/docktextedit.h 2019-02-19 23:51:34.000000000 +0000 @@ -15,7 +15,7 @@ public: explicit DockTextEdit(QWidget *parent = nullptr); - virtual ~DockTextEdit(); + ~DockTextEdit() override; // Enumeration of supported languages enum Language @@ -25,7 +25,7 @@ }; void setLanguage(Language lang); - Language language() { return m_language; }; + Language language() { return m_language; } public slots: void reloadSettings(); diff -Nru sqlitebrowser-3.10.100ubuntu1/src/DotenvFormat.cpp sqlitebrowser-3.11.1/src/DotenvFormat.cpp --- sqlitebrowser-3.10.100ubuntu1/src/DotenvFormat.cpp 1970-01-01 00:00:00.000000000 +0000 +++ sqlitebrowser-3.11.1/src/DotenvFormat.cpp 2019-02-19 23:51:34.000000000 +0000 @@ -0,0 +1,28 @@ +#include "DotenvFormat.h" + +#include +#include + +bool DotenvFormat::readEnvFile(QIODevice &device, QSettings::SettingsMap &map) +{ + QTextStream in(&device); + + QString line; + + QRegularExpression keyValueRegex("^\\s*([\\w\\.\\-]+)\\s*=\\s*(.*)\\s*$"); + + while (in.readLineInto(&line)) { + QRegularExpressionMatch match = keyValueRegex.match(line); + + if (match.capturedLength() < 3) { + continue; + } + + QString key = match.captured(1); + QString value = match.captured(2); + + map.insert(key, value); + } + + return true; +} diff -Nru sqlitebrowser-3.10.100ubuntu1/src/DotenvFormat.h sqlitebrowser-3.11.1/src/DotenvFormat.h --- sqlitebrowser-3.10.100ubuntu1/src/DotenvFormat.h 1970-01-01 00:00:00.000000000 +0000 +++ sqlitebrowser-3.11.1/src/DotenvFormat.h 2019-02-19 23:51:34.000000000 +0000 @@ -0,0 +1,13 @@ +#ifndef DOTENVFORMAT_H +#define DOTENVFORMAT_H + +#include +#include + +class DotenvFormat +{ +public: + static bool readEnvFile(QIODevice &device, QSettings::SettingsMap &map); +}; + +#endif // DOTENVFORMAT_H diff -Nru sqlitebrowser-3.10.100ubuntu1/src/EditDialog.cpp sqlitebrowser-3.11.1/src/EditDialog.cpp --- sqlitebrowser-3.10.100ubuntu1/src/EditDialog.cpp 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/src/EditDialog.cpp 2019-02-19 23:51:34.000000000 +0000 @@ -14,8 +14,12 @@ #include #include #include -#include +#include #include +#include +#include +#include +#include EditDialog::EditDialog(QWidget* parent) : QDialog(parent), @@ -29,6 +33,7 @@ // Add Ctrl-Enter (Cmd-Enter on OSX) as a shortcut for the Apply button ui->buttonApply->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_Return)); + ui->buttonApply->setToolTip(ui->buttonApply->toolTip() + " [" + ui->buttonApply->shortcut().toString(QKeySequence::NativeText) + "]"); QHBoxLayout* hexLayout = new QHBoxLayout(ui->editorBinary); hexEdit = new QHexEdit(this); @@ -48,8 +53,19 @@ connect(sciEdit, SIGNAL(textChanged()), this, SLOT(updateApplyButton())); connect(sciEdit, SIGNAL(textChanged()), this, SLOT(editTextChanged())); + // Create shortcuts for the widgets that doesn't have its own print action or printing mechanism. + QShortcut* shortcutPrint = new QShortcut(QKeySequence::Print, this, nullptr, nullptr, Qt::WidgetShortcut); + connect(shortcutPrint, &QShortcut::activated, this, &EditDialog::openPrintDialog); + + // Add actions to editors that have a context menu based on actions. This also activates the shortcuts. + ui->editorImage->addAction(ui->actionPrintImage); + ui->editorBinary->addAction(ui->actionPrint); + ui->editorBinary->addAction(ui->actionCopyHexAscii); + mustIndentAndCompact = Settings::getValue("databrowser", "indent_compact").toBool(); - ui->buttonIndent->setChecked(mustIndentAndCompact); + ui->actionIndent->setChecked(mustIndentAndCompact); + + ui->buttonAutoSwitchMode->setChecked(Settings::getValue("databrowser", "auto_switch_mode").toBool()); reloadSettings(); } @@ -57,6 +73,7 @@ EditDialog::~EditDialog() { Settings::setValue("databrowser", "indent_compact", mustIndentAndCompact); + Settings::setValue("databrowser", "auto_switch_mode", ui->buttonAutoSwitchMode->isChecked()); delete ui; } @@ -66,7 +83,7 @@ QByteArray data = idx.data(Qt::EditRole).toByteArray(); loadData(data); - updateCellInfo(data); + updateCellInfoAndMode(data); ui->buttonApply->setDisabled(true); } @@ -156,6 +173,7 @@ case Text: case JSON: + case XML: // Can be stored in any widget, except the ImageViewer switch (editMode) { @@ -194,7 +212,8 @@ case TextEditor: // Disable text editing, and use a warning message as the contents ui->editorText->setText(QString("" % - tr("Image data can't be viewed with the text editor") % + tr("Image data can't be viewed in this mode.") % "
" % + tr("Try switching to Image or Binary mode.") % "
")); ui->editorText->setEnabled(false); break; @@ -202,7 +221,8 @@ case XmlEditor: case JsonEditor: // Disable text editing, and use a warning message as the contents - sciEdit->setText(tr("Image data can't be viewed with this editor")); + sciEdit->setText(tr("Image data can't be viewed in this mode.") % '\n' % + tr("Try switching to Image or Binary mode.")); sciEdit->setEnabled(false); break; @@ -258,7 +278,8 @@ case TextEditor: // Disable text editing, and use a warning message as the contents ui->editorText->setText(QString("" % - tr("Binary data can't be viewed with the text editor") % + tr("Binary data can't be viewed in this mode.") % "
" % + tr("Try switching to Binary mode.") % "
")); ui->editorText->setEnabled(false); break; @@ -266,7 +287,8 @@ case JsonEditor: case XmlEditor: // Disable text editing, and use a warning message as the contents - sciEdit->setText(QString(tr("Binary data can't be viewed with this editor"))); + sciEdit->setText(QString(tr("Binary data can't be viewed in this mode.") % '\n' % + tr("Try switching to Binary mode."))); sciEdit->setEnabled(false); break; @@ -285,12 +307,46 @@ QList image_formats_list = QImageReader::supportedImageFormats(); for(int i=0;icomboMode->currentIndex(); + // Set as selected filter the appropriate for the current mode. + switch (mode) { + case TextEditor: + selectedFilter = tr("Text files (*.txt)"); + break; + case HexEditor: + selectedFilter = tr("Binary files (*.bin)"); + break; + case ImageViewer: + selectedFilter = tr("Image files (%1)").arg(image_formats); + break; + case JsonEditor: + selectedFilter = tr("JSON files (*.json)"); + break; + case XmlEditor: + selectedFilter = tr("XML files (*.xml)"); + break; + } QString fileName = FileDialog::getOpenFileName( + OpenDataFile, this, tr("Choose a file to import") #ifndef Q_OS_MAC // Filters on OS X are buggy - , tr("Text files (*.txt);;Image files (%1);;JSON files (*.json);;XML files (*.xml);;All files (*)").arg(image_formats) + , filters.join(";;") + , &selectedFilter #endif ); if(QFile::exists(fileName)) @@ -303,30 +359,62 @@ file.close(); // Update the cell data info in the bottom left of the Edit Cell - updateCellInfo(d); + // and update mode (if required) to the just imported data type. + updateCellInfoAndMode(d); } } } void EditDialog::exportData() { - // Images get special treatment - QString fileExt; - if (dataType == Image) { - // Determine the likely filename extension + QStringList filters; + switch (dataType) { + case Image: { + // Images get special treatment. + // Determine the likely filename extension. QByteArray cellData = hexEdit->data(); QBuffer imageBuffer(&cellData); QImageReader imageReader(&imageBuffer); QString imageFormat = imageReader.format(); - fileExt = imageFormat.toUpper() % " " % tr("Image") % "(*." % imageFormat.toLower() % ");;All files(*)"; - } else { - fileExt = tr("Text files(*.txt);;All files(*)"); + filters << tr("%1 Image").arg(imageFormat.toUpper()) % " (*." % imageFormat.toLower() % ")"; + break; } + case Binary: + filters << tr("Binary files (*.bin)"); + break; + case Text: + // Include the XML case on the text data type, since XML detection is not very sofisticated. + if (ui->comboMode->currentIndex() == XmlEditor) + filters << tr("XML files (*.xml)") << tr("Text files (*.txt)"); + else + filters << tr("Text files (*.txt)") << tr("XML files (*.xml)"); + break; + case JSON: + filters << tr("JSON files (*.json)"); + break; + case SVG: + filters << tr("SVG files (*.svg)"); + break; + case XML: + filters << tr("XML files (*.xml)"); + break; + case Null: + return; + } + + if (dataSource == HexBuffer) + filters << tr("Hex dump files (*.txt)"); + filters << tr("All files (*)"); + + QString selectedFilter = filters.first(); QString fileName = FileDialog::getSaveFileName( + CreateDataFile, this, tr("Choose a filename to export data"), - fileExt); + filters.join(";;"), + /* defaultFileName */ QString(), + &selectedFilter); if(fileName.size() > 0) { QFile file(fileName); @@ -334,17 +422,21 @@ { switch (dataSource) { case HexBuffer: - // Data source is the hex buffer - file.write(hexEdit->data()); - break; + // Data source is the hex buffer + // If text option has been selected, the readable representation of the content is saved to file. + if (selectedFilter == tr("Hex dump files (*.txt)")) + file.write(hexEdit->toReadableString().toUtf8()); + else + file.write(hexEdit->data()); + break; case TextBuffer: - // Data source is the text buffer - file.write(ui->editorText->toPlainText().toUtf8()); - break; + // Data source is the text buffer + file.write(ui->editorText->toPlainText().toUtf8()); + break; case SciBuffer: - // Data source is the JSON buffer - file.write(sciEdit->text().toUtf8()); - break; + // Data source is the Scintilla buffer + file.write(sciEdit->text().toUtf8()); + break; } file.close(); } @@ -369,7 +461,9 @@ sciEdit->setEnabled(true); // Update the cell data info in the bottom left of the Edit Cell - updateCellInfo(hexEdit->data()); + // The mode is also (if required) updated to text since it gives + // the better visual clue of containing a NULL value (placeholder). + updateCellInfoAndMode(hexEdit->data()); ui->editorText->setFocus(); } @@ -405,7 +499,8 @@ { QString oldData = currentIndex.data(Qt::EditRole).toString(); QString newData = removedBom + ui->editorText->toPlainText(); - if (oldData != newData) + // Check first for null case, otherwise empty strings cannot overwrite NULL values + if ((currentIndex.data(Qt::EditRole).isNull() && dataType != Null) || oldData != newData) // The data is different, so commit it back to the database emit recordTextUpdated(currentIndex, removedBom + newData.toUtf8(), false); break; @@ -570,7 +665,7 @@ // Called when the user manually changes the "Mode" drop down combobox void EditDialog::editModeChanged(int newMode) { - ui->buttonIndent->setEnabled(newMode == JsonEditor || newMode == XmlEditor); + ui->actionIndent->setEnabled(newMode == JsonEditor || newMode == XmlEditor); setStackCurrentIndex(newMode); // * If the dataSource is the text buffer, the data is always text * @@ -651,22 +746,30 @@ void EditDialog::editTextChanged() { if (dataSource == TextBuffer || dataSource == SciBuffer) { - // Data has been changed in the text editor, so it can't be a NULL - // any more. It hasn't been validated yet, so it cannot be JSON nor XML. - if (dataType == Null) { - dataType = Text; - ui->labelType->setText(tr("Type of data currently in cell: Text / Numeric")); - } + // Update the cell info in the bottom left manually. This is because - // updateCellInfo() only works with QByteArray's (for now) + // updateCellInfoAndMode() only works with QByteArray's (for now) int dataLength; - switch (dataSource) { - case TextBuffer: + bool isModified; + + if(dataSource == TextBuffer) { + // TextBuffer dataLength = ui->editorText->toPlainText().length(); - break; - case SciBuffer: + isModified = ui->editorText->document()->isModified(); + } else { + // SciBuffer dataLength = sciEdit->text().length(); - break; + isModified = sciEdit->isModified(); + } + // Data has been changed in the text editor, so it can't be a NULL + // any more. It hasn't been validated yet, so it cannot be JSON nor XML. + if (dataType == Null && isModified) + dataType = Text; + + if (dataType != Null) { + ui->editorText->setStyleSheet(""); + ui->editorText->setPlaceholderText(""); + ui->labelType->setText(tr("Type of data currently in cell: Text / Numeric")); } ui->labelSize->setText(tr("%n char(s)", "", dataLength)); } @@ -704,6 +807,8 @@ // Check if it's text only if(isTextOnly(cellData)) { + if (cellData.startsWith("editorText->palette(); ui->buttonApply->setEnabled(!ro); - ui->buttonNull->setEnabled(!ro); - ui->buttonImport->setEnabled(!ro); + ui->actionNull->setEnabled(!ro); + ui->actionImport->setEnabled(!ro); ui->editorText->setReadOnly(ro); sciEdit->setReadOnly(ro); - // We disable the entire hex editor here instead of setting it to read only because it doesn't have a setReadOnly() method - ui->editorBinary->setEnabled(!ro); + hexEdit->setReadOnly(ro); // This makes the caret being visible for selection, although the editor is read-only. Qt::TextInteractionFlags textFlags = ro? Qt::TextSelectableByMouse | Qt::TextSelectableByKeyboard : Qt::TextEditorInteraction; @@ -790,11 +894,40 @@ } } +void EditDialog::switchEditorMode(bool autoSwitchForType) +{ + if (autoSwitchForType) { + // Switch automatically the editing mode according to the detected data. + switch (dataType) { + case Image: + ui->comboMode->setCurrentIndex(ImageViewer); + break; + case Binary: + ui->comboMode->setCurrentIndex(HexEditor); + break; + case Null: + case Text: + ui->comboMode->setCurrentIndex(TextEditor); + break; + case JSON: + ui->comboMode->setCurrentIndex(JsonEditor); + break; + case SVG: + case XML: + ui->comboMode->setCurrentIndex(XmlEditor); + break; + } + } +} + // Update the information labels in the bottom left corner of the dialog -void EditDialog::updateCellInfo(const QByteArray& data) +// and switches the editor mode, if required, according to the detected data type. +void EditDialog::updateCellInfoAndMode(const QByteArray& data) { QByteArray cellData = data; + switchEditorMode(ui->buttonAutoSwitchMode->isChecked()); + // Image data needs special treatment if (dataType == Image || dataType == SVG) { QBuffer imageBuffer(&cellData); @@ -822,8 +955,11 @@ // NULL data type ui->labelType->setText(tr("Type of data currently in cell: NULL")); ui->labelSize->setText(tr("%n byte(s)", "", 0)); + ui->editorText->setStyleSheet("QTextEdit{ font-style: italic; }"); + ui->editorText->setPlaceholderText(Settings::getValue("databrowser", "null_text").toString()); break; + case XML: case Text: { // Text only // Determine the length of the cell text in characters (possibly different to number of bytes). @@ -886,6 +1022,9 @@ hexFont.setPointSize(Settings::getValue("databrowser", "fontsize").toInt()); hexEdit->setFont(hexFont); + ui->editCellToolbar->setToolButtonStyle(static_cast + (Settings::getValue("General", "toolbarStyleEditCell").toInt())); + sciEdit->reloadSettings(); } @@ -910,3 +1049,64 @@ break; } } + +void EditDialog::openPrintDialog() +{ + int editMode = ui->editorStack->currentIndex(); + if (editMode == ImageViewer) { + openPrintImageDialog(); + return; + } + + QPrinter printer; + QPrintPreviewDialog *dialog = new QPrintPreviewDialog(&printer); + + QTextDocument *document = new QTextDocument(); + switch (dataSource) { + case TextBuffer: + document->setPlainText(ui->editorText->toPlainText()); + break; + case SciBuffer: + // This case isn't really expected because the Scintilla widget has it's own printing slot + document->setPlainText(sciEdit->text()); + break; + case HexBuffer: + document->setPlainText(hexEdit->toReadableString()); + document->setDefaultFont(hexEdit->font()); + break; + } + + connect(dialog, &QPrintPreviewDialog::paintRequested, [&](QPrinter *previewPrinter) { + document->print(previewPrinter); + }); + + dialog->exec(); + + delete dialog; + delete document; +} + +void EditDialog::openPrintImageDialog() +{ + QPrinter printer; + QPrintPreviewDialog *dialog = new QPrintPreviewDialog(&printer); + + connect(dialog, &QPrintPreviewDialog::paintRequested, [&](QPrinter *previewPrinter) { + QPainter painter(previewPrinter); + QRect rect = painter.viewport(); + QSize size = ui->editorImage->pixmap()->size(); + size.scale(rect.size(), Qt::KeepAspectRatio); + painter.setViewport(rect.x(), rect.y(), size.width(), size.height()); + painter.setWindow(ui->editorImage->pixmap()->rect()); + painter.drawPixmap(0, 0, *ui->editorImage->pixmap()); + }); + + dialog->exec(); + + delete dialog; +} + +void EditDialog::copyHexAscii() +{ + QApplication::clipboard()->setText(hexEdit->selectionToReadableString()); +} diff -Nru sqlitebrowser-3.10.100ubuntu1/src/EditDialog.h sqlitebrowser-3.11.1/src/EditDialog.h --- sqlitebrowser-3.10.100ubuntu1/src/EditDialog.h 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/src/EditDialog.h 2019-02-19 23:51:34.000000000 +0000 @@ -17,31 +17,35 @@ public: explicit EditDialog(QWidget* parent = nullptr); - ~EditDialog(); + ~EditDialog() override; void setCurrentIndex(const QModelIndex& idx); public slots: - virtual void setFocus(); - virtual void reject(); + void setFocus(); + void reject() override; void setReadOnly(bool ro); void reloadSettings(); protected: - virtual void showEvent(QShowEvent* ev); + void showEvent(QShowEvent* ev) override; private slots: void importData(); void exportData(); void setNull(); void updateApplyButton(); - virtual void accept(); + void accept() override; void loadData(const QByteArray& data); void toggleOverwriteMode(); void editModeChanged(int newMode); void editTextChanged(); - void updateCellInfo(const QByteArray& data); + void switchEditorMode(bool autoSwitchForType); + void updateCellInfoAndMode(const QByteArray& data); void setMustIndentAndCompact(bool enable); + void openPrintDialog(); + void openPrintImageDialog(); + void copyHexAscii(); signals: void recordTextUpdated(const QPersistentModelIndex& idx, const QByteArray& data, bool isBlob); @@ -70,7 +74,8 @@ Null, Text, JSON, - SVG + SVG, + XML }; // Edit modes and editor stack (this must be aligned with the UI) diff -Nru sqlitebrowser-3.10.100ubuntu1/src/EditDialog.ui sqlitebrowser-3.11.1/src/EditDialog.ui --- sqlitebrowser-3.10.100ubuntu1/src/EditDialog.ui 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/src/EditDialog.ui 2019-02-19 23:51:34.000000000 +0000 @@ -27,6 +27,9 @@ Mode: + + comboMode + @@ -68,99 +71,52 @@ - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - false - + - Auto-format: pretty print on loading, compact on saving. + Automatically adjust the editor mode to the loaded data type - Auto-format: pretty print on loading, compact on saving. + Automatically adjust the editor mode to the loaded data type - When enabled, the auto-format feature formats the data on loading, breaking the text in lines and indenting it for maximum readability. On data saving, the auto-format feature compacts the data removing end of lines, and unnecessary whitespace. + This checkable button enables or disables the automatic switching of the editor mode. When a new cell is selected or new data is imported and the automatic switching is enabled, the mode adjusts to the detected data type. You can then change the editor mode manually. If you want to keep this manually switched mode while moving through the cells, switch the button off. - Autoformat + Auto-switch - :/icons/text_indent:/icons/text_indent + :/icons/keyword + :/icons/cog_go.png:/icons/keyword true - - - - - - - 0 - 0 - - - - Import from file - - - Opens a file dialog used to import any kind of data to this database cell. - - - &Import + + true - - + + + Qt::Horizontal + + 0 0 - - Export to file - - - Opens a file dialog used to export the contents of this database cell to a file. - - - &Export - - + - - - - 0 - 0 - - - - Set this cell to NULL - - - Erases the contents of the cell - - - Set as &NULL - + + + + + + @@ -189,7 +145,11 @@ - + + + Qt::ActionsContextMenu + + true @@ -199,13 +159,16 @@ 0 0 - 98 + 84 35 + + Qt::ActionsContextMenu + @@ -229,37 +192,63 @@ + + + 0 + 0 + + + + + 100 + 0 + + Type of data currently in cell + + true + + + + 0 + 0 + + + + + 100 + 0 + + Size of data currently in table + + Qt::PlainText + + + true + - - - Qt::Horizontal - - - - 40 - 20 - - - - - + + + 0 + 0 + + - Apply data to cell [Ctrl+Return] + Apply data to cell This button saves the changes performed in the cell editor to the database cell. @@ -275,120 +264,297 @@ + + + + :/icons/print:/icons/print + + + Print... + + + Open preview dialog for printing displayed image + + + Ctrl+P + + + + + + :/icons/print:/icons/print + + + Print... + + + Open preview dialog for printing displayed text + + + Open preview dialog for printing the data currently stored in the cell + + + Ctrl+P + + + Qt::WidgetShortcut + + + + + + :/icons/special_copy:/icons/special_copy + + + Copy Hex and ASCII + + + Copy selected hexadecimal and ASCII columns to the clipboard + + + Ctrl+Shift+C + + + + + true + + + + :/icons/text_indent:/icons/text_indent + + + Autoformat + + + Auto-format: pretty print on loading, compact on saving. + + + When enabled, the auto-format feature formats the data on loading, breaking the text in lines and indenting it for maximum readability. On data saving, the auto-format feature compacts the data removing end of lines, and unnecessary whitespace. + + + + + + :/icons/save_sql:/icons/save_sql + + + &Export... + + + Export to file + + + Opens a file dialog used to export the contents of this database cell to a file. + + + + + + :/icons/document_open:/icons/document_open + + + &Import... + + + Import from file + + + Opens a file dialog used to import any kind of data to this database cell. + + + + + + :/icons/set_to_null:/icons/set_to_null + + + Set as &NULL + + + Erases the contents of the cell + + - buttonExport - buttonNull + comboMode + buttonAutoSwitchMode + editorText + buttonApply - buttonImport + buttonApply clicked() EditDialog - importData() + accept() - 400 - 28 + 605 + 358 - 60 - 0 + 241 + 406 - buttonExport - clicked() + comboMode + currentIndexChanged(int) EditDialog - exportData() + editModeChanged(int) + + + 71 + 27 + + + 201 + 431 + + + + + editorText + textChanged() + EditDialog + editTextChanged() - 488 - 51 + 279 + 191 + 339 + 335 + + + + + actionIndent + toggled(bool) + EditDialog + setMustIndentAndCompact(bool) + + + -1 + -1 + + + 308 + 190 + + + + + buttonAutoSwitchMode + toggled(bool) + EditDialog + switchEditorMode(bool) + + 162 - 17 + 33 + + + 308 + 190 - buttonApply - clicked() + actionPrintImage + triggered() EditDialog - accept() + openPrintImageDialog() - 605 - 358 + -1 + -1 - 241 - 406 + 308 + 190 - comboMode - currentIndexChanged(int) + actionPrint + triggered() EditDialog - editModeChanged(int) + openPrintDialog() - 71 - 27 + -1 + -1 - 201 - 431 + 308 + 190 - buttonNull - clicked() + actionCopyHexAscii + triggered() + EditDialog + copyHexAscii() + + + -1 + -1 + + + 308 + 190 + + + + + actionNull + triggered() EditDialog setNull() - 528 - 28 + -1 + -1 - 723 - 58 + 308 + 190 - editorText - textChanged() + actionImport + triggered() EditDialog - editTextChanged() + importData() - 279 - 191 + -1 + -1 - 339 - 335 + 308 + 190 - buttonIndent - toggled(bool) + actionExport + triggered() EditDialog - setMustIndentAndCompact(bool) + exportData() - 309 - 22 + -1 + -1 308 diff -Nru sqlitebrowser-3.10.100ubuntu1/src/EditIndexDialog.cpp sqlitebrowser-3.11.1/src/EditIndexDialog.cpp --- sqlitebrowser-3.10.100ubuntu1/src/EditIndexDialog.cpp 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/src/EditIndexDialog.cpp 2019-02-19 23:51:34.000000000 +0000 @@ -16,6 +16,7 @@ { // Create UI ui->setupUi(this); + ui->sqlTextEdit->setReadOnly(true); // Get list of tables, sort it alphabetically and fill the combobox QMap dbobjs; // Map from display name to full object identifier @@ -33,10 +34,10 @@ } } else { // If this is an existing index, only offer tables of the current database schema QList tables = pdb.schemata[curIndex.schema()].values("table"); - for(auto it=tables.constBegin();it!=tables.constEnd();++it) + for(auto it : tables) { // Only show the schema name for non-main schemata - sqlb::ObjectIdentifier obj(curIndex.schema(), (*it)->name()); + sqlb::ObjectIdentifier obj(curIndex.schema(), it->name()); dbobjs.insert(obj.toDisplayString(), obj); } } @@ -52,7 +53,7 @@ if(!newIndex) { // Load the current layout and fill in the dialog fields - index = *(pdb.getObjectByName(curIndex).dynamicCast()); + index = *(pdb.getObjectByName(curIndex)); ui->editIndexName->blockSignals(true); ui->editIndexName->setText(index.name()); @@ -73,10 +74,10 @@ } // Add event handler for index column name changes. These are only allowed for expression columns, though. - connect(ui->tableIndexColumns, static_cast(&QTableWidget::itemChanged), + connect(ui->tableIndexColumns, &QTableWidget::itemChanged, [=](QTableWidgetItem* item) { - index.columns().at(item->row())->setName(item->text()); + index.fields[item->row()].setName(item->text()); updateSqlText(); }); @@ -95,7 +96,7 @@ if(!initialLoad) { index.setTable(sqlb::ObjectIdentifier(ui->comboTableName->currentData()).name()); - index.clearColumns(); + index.fields.clear(); } // Stop here if table name is empty @@ -112,18 +113,18 @@ void EditIndexDialog::updateColumnLists() { // Fill the table column list - sqlb::TablePtr table = pdb.getObjectByName(sqlb::ObjectIdentifier(ui->comboTableName->currentData())).dynamicCast(); + sqlb::TablePtr table = pdb.getObjectByName(sqlb::ObjectIdentifier(ui->comboTableName->currentData())); if(!table) return; sqlb::FieldInfoList tableFields = table->fieldInformation(); ui->tableTableColumns->setRowCount(tableFields.size()); int tableRows = 0; - for(int i=0;itableIndexColumns->blockSignals(true); ui->tableIndexColumns->setRowCount(indexFields.size()); - for(int i=0;iname()); + QTableWidgetItem* name = new QTableWidgetItem(indexFields.at(i).name()); Qt::ItemFlags flags = Qt::ItemIsSelectable | Qt::ItemIsEnabled; - if(indexFields.at(i)->expression()) + if(indexFields.at(i).expression()) flags |= Qt::ItemIsEditable; name->setFlags(flags); ui->tableIndexColumns->setItem(i, 0, name); @@ -162,15 +163,15 @@ order->addItem(""); order->addItem("ASC"); order->addItem("DESC"); - order->setCurrentText(indexFields.at(i)->order().toUpper()); + order->setCurrentText(indexFields.at(i).order().toUpper()); ui->tableIndexColumns->setCellWidget(i, 1, order); - connect(order, static_cast(&QComboBox::currentTextChanged), + connect(order, &QComboBox::currentTextChanged, [=](QString new_order) { - int colnum = index.findColumn(indexFields.at(i)->name()); - if(colnum != -1) + auto colnum = sqlb::findField(index, indexFields.at(i).name()); + if(colnum != index.fields.end()) { - index.column(colnum)->setOrder(new_order); + colnum->setOrder(new_order); updateSqlText(); } }); @@ -194,10 +195,10 @@ return; // Add field to index - index.addColumn(sqlb::IndexedColumnPtr(new sqlb::IndexedColumn( - ui->tableTableColumns->item(row, 0)->text(), // Column name - false, // Is expression - ""))); // Order + index.fields.emplace_back( + ui->tableTableColumns->item(row, 0)->text(), // Column name + false, // Is expression + ""); // Order // Update UI updateColumnLists(); @@ -219,14 +220,14 @@ // If this is an expression column and the action was triggered by a double click event instead of a button click, // we won't remove the expression column because it's too likely that this was only done by accident by the user. // Instead just open the expression column for editing. - if(index.column(row)->expression() && sender() != ui->buttonFromIndex) + if(index.fields[row].expression() && sender() != ui->buttonFromIndex) { ui->tableIndexColumns->editItem(ui->tableIndexColumns->item(row, 0)); return; } // Remove column from index - index.removeColumn(ui->tableIndexColumns->item(row, 0)->text()); + sqlb::removeField(index, ui->tableIndexColumns->item(row, 0)->text()); // Update UI updateColumnLists(); @@ -244,7 +245,7 @@ valid = false; // Check if index has any columns - if(index.columns().size() == 0) + if(index.fields.size() == 0) valid = false; // Only activate OK button if index data is valid @@ -311,10 +312,8 @@ if(newRow >= ui->tableIndexColumns->rowCount()) return; - // Get the column information, swap the columns, and save the new column list back in the index - auto columns = index.columns(); - std::swap(columns[currentRow], columns[newRow]); - index.setColumns(columns); + // Swap the columns + std::swap(index.fields[currentRow], index.fields[newRow]); // Update UI updateColumnLists(); @@ -326,16 +325,17 @@ void EditIndexDialog::addExpressionColumn() { // Check if there already is an empty expression column - int row = index.findColumn(""); - if(row == -1) + auto field_it = sqlb::findField(index, ""); + int row = std::distance(index.fields.begin(), field_it); + if(field_it == index.fields.end()) { // There is no empty expression column yet, so add one. // Add new expression column to the index - index.addColumn(sqlb::IndexedColumnPtr(new sqlb::IndexedColumn( - "", // Column name - true, // Is expression - ""))); // Order + index.fields.emplace_back( + "", // Column name + true, // Is expression + ""); // Order // Update UI updateColumnLists(); diff -Nru sqlitebrowser-3.10.100ubuntu1/src/EditIndexDialog.h sqlitebrowser-3.11.1/src/EditIndexDialog.h --- sqlitebrowser-3.10.100ubuntu1/src/EditIndexDialog.h 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/src/EditIndexDialog.h 2019-02-19 23:51:34.000000000 +0000 @@ -1,7 +1,7 @@ #ifndef EDITINDEXDIALOG_H #define EDITINDEXDIALOG_H -#include "sqlitetypes.h" +#include "sql/sqlitetypes.h" #include #include @@ -18,11 +18,11 @@ public: explicit EditIndexDialog(DBBrowserDB& db, const sqlb::ObjectIdentifier& indexName, bool createIndex, QWidget* parent = nullptr); - ~EditIndexDialog(); + ~EditIndexDialog() override; private slots: - void accept(); - void reject(); + void accept() override; + void reject() override; void tableChanged(const QString& new_table, bool initialLoad = false); void checkInput(); diff -Nru sqlitebrowser-3.10.100ubuntu1/src/EditTableDialog.cpp sqlitebrowser-3.11.1/src/EditTableDialog.cpp --- sqlitebrowser-3.10.100ubuntu1/src/EditTableDialog.cpp 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/src/EditTableDialog.cpp 2019-02-19 23:51:34.000000000 +0000 @@ -10,6 +10,7 @@ #include #include #include +#include EditTableDialog::EditTableDialog(DBBrowserDB& db, const sqlb::ObjectIdentifier& tableName, bool createTable, QWidget* parent) : QDialog(parent), @@ -33,9 +34,13 @@ if(m_bNewTable == false) { // Existing table, so load and set the current layout - m_table = *(pdb.getObjectByName(curTable).dynamicCast()); + m_table = *(pdb.getObjectByName(curTable)); ui->labelEditWarning->setVisible(!m_table.fullyParsed()); + // Initialise the list of tracked columns for table layout changes + for(const auto& field : m_table.fields) + trackColumns[field.name()] = field.name(); + // Set without rowid checkbox and schema dropdown. No need to trigger any events here as we're only loading a table exactly as it is stored by SQLite, so no need // for error checking etc. ui->checkWithoutRowid->blockSignals(true); @@ -56,9 +61,6 @@ // And create a savepoint pdb.setSavepoint(m_sRestorePointName); - // Check now if foreign keys are enabled so we don't have to query this later again and again - m_bForeignKeysEnabled = (pdb.getPragma("foreign_keys") == "1"); - // Update UI ui->editTableName->setText(curTable.name()); updateColumnWidth(); @@ -103,22 +105,22 @@ this,SLOT(itemChanged(QTreeWidgetItem*,int))); ui->treeWidget->clear(); - sqlb::FieldVector fields = m_table.fields(); - sqlb::FieldVector pk = m_table.primaryKey(); - for(const sqlb::FieldPtr& f : fields) + const auto& fields = m_table.fields; + QStringList pk = m_table.primaryKey(); + for(const sqlb::Field& f : fields) { QTreeWidgetItem *tbitem = new QTreeWidgetItem(ui->treeWidget); tbitem->setFlags(tbitem->flags() | Qt::ItemIsEditable); - tbitem->setText(kName, f->name()); + tbitem->setText(kName, f.name()); QComboBox* typeBox = new QComboBox(ui->treeWidget); - typeBox->setProperty("column", f->name()); + typeBox->setProperty("column", f.name()); typeBox->setEditable(true); - typeBox->addItems(sqlb::Field::Datatypes); - int index = typeBox->findText(f->type(), Qt::MatchExactly); + typeBox->addItems(DBBrowserDB::Datatypes); + int index = typeBox->findText(f.type(), Qt::MatchExactly); if(index == -1) { // non standard named type - typeBox->addItem(f->type()); + typeBox->addItem(f.type()); index = typeBox->count() - 1; } typeBox->setCurrentIndex(index); @@ -126,22 +128,22 @@ connect(typeBox, SIGNAL(currentIndexChanged(int)), this, SLOT(updateTypes())); ui->treeWidget->setItemWidget(tbitem, kType, typeBox); - tbitem->setCheckState(kNotNull, f->notnull() ? Qt::Checked : Qt::Unchecked); - tbitem->setCheckState(kPrimaryKey, pk.contains(f) ? Qt::Checked : Qt::Unchecked); - tbitem->setCheckState(kAutoIncrement, f->autoIncrement() ? Qt::Checked : Qt::Unchecked); - tbitem->setCheckState(kUnique, f->unique() ? Qt::Checked : Qt::Unchecked); + tbitem->setCheckState(kNotNull, f.notnull() ? Qt::Checked : Qt::Unchecked); + tbitem->setCheckState(kPrimaryKey, contains(pk, f.name()) ? Qt::Checked : Qt::Unchecked); + tbitem->setCheckState(kAutoIncrement, f.autoIncrement() ? Qt::Checked : Qt::Unchecked); + tbitem->setCheckState(kUnique, f.unique() ? Qt::Checked : Qt::Unchecked); // For the default value check if it is surrounded by parentheses and if that's the case // add a '=' character before the entire string to match the input format we're expecting // from the user when using functions in the default value field. - if(f->defaultValue().startsWith('(') && f->defaultValue().endsWith(')')) - tbitem->setText(kDefault, "=" + f->defaultValue()); + if(f.defaultValue().startsWith('(') && f.defaultValue().endsWith(')')) + tbitem->setText(kDefault, "=" + f.defaultValue()); else - tbitem->setText(kDefault, f->defaultValue()); + tbitem->setText(kDefault, f.defaultValue()); - tbitem->setText(kCheck, f->check()); + tbitem->setText(kCheck, f.check()); - QSharedPointer fk = m_table.constraint({f}, sqlb::Constraint::ForeignKeyConstraintType).dynamicCast(); + auto fk = std::dynamic_pointer_cast(m_table.constraint({f.name()}, sqlb::Constraint::ForeignKeyConstraintType)); if(fk) tbitem->setText(kForeignKey, fk->toString()); ui->treeWidget->addTopLevelItem(tbitem); @@ -169,14 +171,11 @@ } else { // Editing of old table - // Rename table if necessary - if(ui->editTableName->text() != curTable.name()) + // Apply all changes to the actual table in the database + if(!pdb.alterTable(curTable, m_table, trackColumns, ui->comboSchema->currentText())) { - if(!pdb.renameTable(ui->comboSchema->currentText(), curTable.name(), ui->editTableName->text())) - { - QMessageBox::warning(this, QApplication::applicationName(), pdb.lastError()); - return; - } + QMessageBox::warning(this, QApplication::applicationName(), pdb.lastError()); + return; } } @@ -210,16 +209,11 @@ m_fkEditorDelegate->updateTablesList(oldTableName); // update fk's that refer to table itself recursively - sqlb::FieldVector fields = m_table.fields(); - for(const sqlb::FieldPtr& f : fields) { - QSharedPointer fk = m_table.constraint({f}, sqlb::Constraint::ForeignKeyConstraintType).dynamicCast(); - if(!fk.isNull()) { - if (oldTableName == fk->table()) { - fk->setTable(normTableName); - if(!m_bForeignKeysEnabled) - pdb.alterTable(curTable, m_table, f->name(), f, 0); - } - } + const auto& fields = m_table.fields; + for(const sqlb::Field& f : fields) { + auto fk = std::dynamic_pointer_cast(m_table.constraint({f.name()}, sqlb::Constraint::ForeignKeyConstraintType)); + if(fk && oldTableName == fk->table()) + fk->setTable(normTableName); } populateFields(); @@ -237,16 +231,15 @@ QString type = typeBox->currentText(); QString column = typeBox->property("column").toString(); - int index; - for(index=0; index < m_table.fields().size(); ++index) + for(size_t index=0; index < m_table.fields.size(); ++index) { - if(m_table.fields().at(index)->name() == column) + if(m_table.fields.at(index).name() == column) + { + m_table.fields.at(index).setType(type); break; + } } - m_table.fields().at(index)->setType(type); - if(!m_bNewTable) - pdb.alterTable(curTable, m_table, column, m_table.fields().at(index)); checkInput(); } } @@ -268,11 +261,10 @@ void EditTableDialog::itemChanged(QTreeWidgetItem *item, int column) { int index = ui->treeWidget->indexOfTopLevelItem(item); - if(index < m_table.fields().count()) + if(index < static_cast(m_table.fields.size())) { - sqlb::FieldPtr field = m_table.fields().at(index); - bool callRenameColumn = false; - QString oldFieldName = field->name(); + sqlb::Field& field = m_table.fields.at(index); + QString oldFieldName = field.name(); switch(column) { @@ -284,8 +276,8 @@ // with different case. Example: if I rename column 'COLUMN' to 'column', findField() is going to return the current field number // because it's doing a case-independent search and it can't return another field number because SQLite prohibits duplicate field // names (no matter the case). So when this happens we just allow the renaming because there's no harm to be expected from it. - int foundField = m_table.findField(item->text(column)); - if(foundField != -1 && foundField != index) + auto foundField = sqlb::findField(m_table, item->text(column)); + if(foundField != m_table.fields.end() && foundField-m_table.fields.begin() != index) { QMessageBox::warning(this, qApp->applicationName(), tr("There already is a field with that name. Please rename it first or choose a different " "name for this field.")); @@ -299,16 +291,16 @@ // When editing an exiting table, check if any foreign keys would cause trouble in case this name is edited if(!m_bNewTable) { - sqlb::FieldVector pk = m_table.primaryKey(); + QStringList pk = m_table.primaryKey(); for(const sqlb::ObjectPtr& fkobj : pdb.schemata[curTable.schema()].values("table")) { - QList fks = fkobj.dynamicCast()->constraints(sqlb::FieldVector(), sqlb::Constraint::ForeignKeyConstraintType); + auto fks = std::dynamic_pointer_cast(fkobj)->constraints(QStringList(), sqlb::Constraint::ForeignKeyConstraintType); for(const sqlb::ConstraintPtr& fkptr : fks) { - QSharedPointer fk = fkptr.dynamicCast(); + auto fk = std::dynamic_pointer_cast(fkptr); if(fk->table() == m_table.name()) { - if(fk->columns().contains(field->name()) || pk.contains(field)) + if(fk->columns().contains(field.name()) || contains(pk, field.name())) { QMessageBox::warning(this, qApp->applicationName(), tr("This column is referenced in a foreign key in table %1 and thus " "its name cannot be changed.") @@ -324,10 +316,19 @@ } } - field->setName(item->text(column)); + field.setName(item->text(column)); + m_table.renameKeyInAllConstraints(oldFieldName, item->text(column)); qobject_cast(ui->treeWidget->itemWidget(item, kType))->setProperty("column", item->text(column)); + + // Update the field name in the map of old column names to new column names if(!m_bNewTable) - callRenameColumn = true; + { + for(const auto& key : trackColumns.keys()) + { + if(trackColumns[key] == oldFieldName) + trackColumns[key] = field.name(); + } + } } break; case kType: // see updateTypes() SLOT @@ -335,17 +336,17 @@ case kPrimaryKey: { // Check if there already is a primary key - if(m_table.constraint(sqlb::FieldVector(), sqlb::Constraint::PrimaryKeyConstraintType)) + if(m_table.constraint(QStringList(), sqlb::Constraint::PrimaryKeyConstraintType)) { // There already is a primary key for this table. So edit that one as there always can only be one primary key anyway. - sqlb::FieldVector& pk = m_table.primaryKeyRef(); + QStringList& pk = m_table.primaryKeyRef(); if(item->checkState(column) == Qt::Checked) - pk.push_back(field); + pk.push_back(field.name()); else - pk.removeAll(field); + pk.erase(std::remove(pk.begin(), pk.end(), field.name()), pk.end()); } else if(item->checkState(column) == Qt::Checked) { // There is no primary key in the table yet. This means we need to add a default one. - m_table.addConstraint({field}, sqlb::ConstraintPtr(new sqlb::PrimaryKeyConstraint())); + m_table.addConstraint({field.name()}, sqlb::ConstraintPtr(new sqlb::PrimaryKeyConstraint())); } if(item->checkState(column) == Qt::Checked) @@ -360,8 +361,6 @@ } else { item->setCheckState(kAutoIncrement, Qt::Unchecked); } - if(!m_bNewTable) - callRenameColumn = true; } break; case kNotNull: @@ -374,10 +373,15 @@ // to at least replace all troublesome NULL values by the default value SqliteTableModel m(pdb, this); m.setQuery(QString("SELECT COUNT(%1) FROM %2 WHERE %3 IS NULL;") - .arg(sqlb::escapeIdentifier(pdb.getObjectByName(curTable).dynamicCast()->rowidColumn())) + .arg(sqlb::escapeIdentifier(pdb.getObjectByName(curTable)->rowidColumn())) .arg(curTable.toString()) - .arg(sqlb::escapeIdentifier(field->name()))); - m.waitForFetchingFinished(); + .arg(sqlb::escapeIdentifier(field.name()))); + if(!m.completeCache()) + { + // If we couldn't load all data because the cancel button was clicked, just unset the checkbox again and stop. + item->setCheckState(column, Qt::Unchecked); + return; + } if(m.data(m.index(0, 0)).toInt() > 0) { // There is a NULL value, so print an error message, uncheck the combobox, and return here @@ -387,9 +391,7 @@ return; } } - field->setNotNull(item->checkState(column) == Qt::Checked); - if(!m_bNewTable) - callRenameColumn = true; + field.setNotNull(item->checkState(column) == Qt::Checked); } break; case kAutoIncrement: @@ -403,9 +405,14 @@ SqliteTableModel m(pdb, this); m.setQuery(QString("SELECT COUNT(*) FROM %1 WHERE %2 <> CAST(%3 AS INTEGER);") .arg(curTable.toString()) - .arg(sqlb::escapeIdentifier(field->name())) - .arg(sqlb::escapeIdentifier(field->name()))); - m.waitForFetchingFinished(); + .arg(sqlb::escapeIdentifier(field.name())) + .arg(sqlb::escapeIdentifier(field.name()))); + if(!m.completeCache()) + { + // If we couldn't load all data because the cancel button was clicked, just unset the checkbox again and stop. + item->setCheckState(column, Qt::Unchecked); + return; + } if(m.data(m.index(0, 0)).toInt() > 0) { // There is a non-integer value, so print an error message, uncheck the combobox, and return here @@ -433,10 +440,7 @@ } } } - field->setAutoIncrement(ischecked); - - if(!m_bNewTable) - callRenameColumn = true; + field.setAutoIncrement(ischecked); } break; case kUnique: @@ -446,25 +450,32 @@ { // Because our renameColumn() function fails when setting a column to unique when it already contains the same values SqliteTableModel m(pdb, this); - m.setQuery(QString("SELECT COUNT(%2) FROM %1;").arg(curTable.toString()).arg(sqlb::escapeIdentifier(field->name()))); - m.waitForFetchingFinished(); + m.setQuery(QString("SELECT COUNT(%2) FROM %1;").arg(curTable.toString()).arg(sqlb::escapeIdentifier(field.name()))); + if(!m.completeCache()) + { + // If we couldn't load all data because the cancel button was clicked, just unset the checkbox again and stop. + item->setCheckState(column, Qt::Unchecked); + return; + } int rowcount = m.data(m.index(0, 0)).toInt(); - m.setQuery(QString("SELECT COUNT(DISTINCT %2) FROM %1;").arg(curTable.toString()).arg(sqlb::escapeIdentifier(field->name()))); - m.waitForFetchingFinished(); + m.setQuery(QString("SELECT COUNT(DISTINCT %2) FROM %1;").arg(curTable.toString()).arg(sqlb::escapeIdentifier(field.name()))); + if(!m.completeCache()) + { + // If we couldn't load all data because the cancel button was clicked, just unset the checkbox again and stop. + item->setCheckState(column, Qt::Unchecked); + return; + } int uniquecount = m.data(m.index(0, 0)).toInt(); if(rowcount != uniquecount) { // There is a NULL value, so print an error message, uncheck the combobox, and return here - QMessageBox::information(this, qApp->applicationName(), tr("Column '%1' has no unique data.\n").arg(field->name()) - + tr("This makes it impossible to set this flag. Please change the table data first.")); + QMessageBox::information(this, qApp->applicationName(), tr("Column '%1' has duplicate data.\n").arg(field.name()) + + tr("This makes it impossible to enable the 'Unique' flag. Please remove the duplicate data, which will allow the 'Unique' flag to then be enabled.")); item->setCheckState(column, Qt::Unchecked); return; } } - field->setUnique(item->checkState(column) == Qt::Checked); - - if(!m_bNewTable) - callRenameColumn = true; + field.setUnique(item->checkState(column) == Qt::Checked); } break; case kDefault: @@ -494,29 +505,16 @@ } } } - field->setDefaultValue(new_value); - if(!m_bNewTable) - callRenameColumn = true; + field.setDefaultValue(new_value); } break; case kCheck: - field->setCheck(item->text(column)); - if(!m_bNewTable) - callRenameColumn = true; + field.setCheck(item->text(column)); break; case kForeignKey: // handled in delegate - - if(!m_bNewTable) - callRenameColumn = true; break; } - - if(callRenameColumn) - { - if(!pdb.alterTable(curTable, m_table, oldFieldName, field)) - QMessageBox::warning(this, qApp->applicationName(), tr("Modifying this column failed. Error returned from database:\n%1").arg(pdb.lastError())); - } } checkInput(); @@ -536,18 +534,18 @@ { field_name = "Field" + QString::number(field_number); field_number++; - } while(m_table.findField(field_name) != -1); + } while(sqlb::findField(m_table, field_name) != m_table.fields.end()); tbitem->setText(kName, field_name); } QComboBox* typeBox = new QComboBox(ui->treeWidget); typeBox->setProperty("column", tbitem->text(kName)); typeBox->setEditable(true); - typeBox->addItems(sqlb::Field::Datatypes); + typeBox->addItems(DBBrowserDB::Datatypes); int defaultFieldTypeIndex = Settings::getValue("db", "defaultfieldtype").toInt(); - if (defaultFieldTypeIndex < sqlb::Field::Datatypes.count()) + if (defaultFieldTypeIndex < DBBrowserDB::Datatypes.count()) { typeBox->setCurrentIndex(defaultFieldTypeIndex); } @@ -566,15 +564,11 @@ ui->treeWidget->editItem(tbitem, 0); // add field to table object - sqlb::FieldPtr f(new sqlb::Field( - tbitem->text(kName), - typeBox->currentText() - )); - m_table.addField(f); + m_table.fields.emplace_back(tbitem->text(kName), typeBox->currentText()); - // Actually add the new column to the table if we're editing an existing table + // Add the new column to the list of tracked columns to indicate it has been added if(!m_bNewTable) - pdb.addColumn(curTable, f); + trackColumns.insert(QString(), tbitem->text(kName)); checkInput(); } @@ -585,34 +579,27 @@ if(!ui->treeWidget->currentItem()) return; - // Are we creating a new table or editing an old one? - if(m_bNewTable) + // If we are editing an existing table, ask the user for confirmation + if(!m_bNewTable) { - // Creating a new one - - // Just delete that item. At this point there is no DB table to edit or data to be lost anyway - sqlb::FieldVector fields = m_table.fields(); - fields.remove(ui->treeWidget->indexOfTopLevelItem(ui->treeWidget->currentItem())); - m_table.setFields(fields); - delete ui->treeWidget->currentItem(); - } else { - // Editing an old one - - // Ask user whether he really wants to delete that column QString msg = tr("Are you sure you want to delete the field '%1'?\nAll data currently stored in this field will be lost.").arg(ui->treeWidget->currentItem()->text(0)); - if(QMessageBox::warning(this, QApplication::applicationName(), msg, QMessageBox::Yes | QMessageBox::No, QMessageBox::No) == QMessageBox::Yes) + if(QMessageBox::warning(this, QApplication::applicationName(), msg, QMessageBox::Yes | QMessageBox::No, QMessageBox::No) == QMessageBox::No) + return; + + // Update the map of tracked columns to indicate the column is deleted + QString name = ui->treeWidget->currentItem()->text(0); + for(const auto& key : trackColumns.keys()) { - if(!pdb.alterTable(curTable, m_table, ui->treeWidget->currentItem()->text(0), sqlb::FieldPtr())) - { - QMessageBox::warning(nullptr, QApplication::applicationName(), pdb.lastError()); - } else { - //relayout - m_table = *(pdb.getObjectByName(curTable).dynamicCast()); - populateFields(); - } + if(trackColumns[key] == name) + trackColumns[key] = QString(); } } + // Just delete that item. At this point there is no DB table to edit or data to be lost anyway + m_table.fields.erase(m_table.fields.begin() + ui->treeWidget->indexOfTopLevelItem(ui->treeWidget->currentItem())); + m_table.removeKeyFromAllConstraints(ui->treeWidget->currentItem()->text(kName)); + delete ui->treeWidget->currentItem(); + checkInput(); } @@ -648,56 +635,27 @@ int currentRow = ui->treeWidget->currentIndex().row(); int newRow = currentRow + (down ? 1 : -1); - // Are we creating a new table or editing an old one? - if(m_bNewTable) - { - // Creating a new one + // Save the combobox first by making a copy + QComboBox* oldCombo = qobject_cast(ui->treeWidget->itemWidget(ui->treeWidget->topLevelItem(currentRow), kType)); + QComboBox* newCombo = new QComboBox(ui->treeWidget); + newCombo->setProperty("column", oldCombo->property("column")); + newCombo->installEventFilter(this); + connect(newCombo, SIGNAL(currentIndexChanged(int)), this, SLOT(updateTypes())); + newCombo->setEditable(true); + for(int i=0; i < oldCombo->count(); ++i) + newCombo->addItem(oldCombo->itemText(i)); + newCombo->setCurrentIndex(oldCombo->currentIndex()); + + // Now, just remove the item and insert it at it's new position, then restore the combobox + QTreeWidgetItem* item = ui->treeWidget->takeTopLevelItem(currentRow); + ui->treeWidget->insertTopLevelItem(newRow, item); + ui->treeWidget->setItemWidget(item, kType, newCombo); - // Save the combobox first by making a copy - QComboBox* oldCombo = qobject_cast(ui->treeWidget->itemWidget(ui->treeWidget->topLevelItem(currentRow), kType)); - QComboBox* newCombo = new QComboBox(ui->treeWidget); - newCombo->setProperty("column", oldCombo->property("column")); - newCombo->installEventFilter(this); - connect(newCombo, SIGNAL(currentIndexChanged(int)), this, SLOT(updateTypes())); - newCombo->setEditable(true); - for(int i=0; i < oldCombo->count(); ++i) - newCombo->addItem(oldCombo->itemText(i)); - newCombo->setCurrentIndex(oldCombo->currentIndex()); - - // Now, just remove the item and insert it at it's new position, then restore the combobox - QTreeWidgetItem* item = ui->treeWidget->takeTopLevelItem(currentRow); - ui->treeWidget->insertTopLevelItem(newRow, item); - ui->treeWidget->setItemWidget(item, kType, newCombo); - - // Select the old item at its new position - ui->treeWidget->setCurrentIndex(ui->treeWidget->currentIndex().sibling(newRow, 0)); - - // Finally update the table SQL - sqlb::FieldVector fields = m_table.fields(); - std::swap(fields[newRow], fields[currentRow]); - m_table.setFields(fields); - } else { - // Editing an old one + // Select the old item at its new position + ui->treeWidget->setCurrentIndex(ui->treeWidget->currentIndex().sibling(newRow, 0)); - // Move the actual column - if(!pdb.alterTable( - curTable, - m_table, - ui->treeWidget->currentItem()->text(0), - m_table.fields().at(ui->treeWidget->indexOfTopLevelItem(ui->treeWidget->currentItem())), - (down ? 1 : -1) - )) - { - QMessageBox::warning(nullptr, QApplication::applicationName(), pdb.lastError()); - } else { - // Reload table SQL - m_table = *(pdb.getObjectByName(curTable).dynamicCast()); - populateFields(); - - // Select old item at new position - ui->treeWidget->setCurrentIndex(ui->treeWidget->indexAt(QPoint(1, 1)).sibling(newRow, 0)); - } - } + // Finally update the table SQL + std::swap(m_table.fields[newRow], m_table.fields[currentRow]); // Update the SQL preview updateSqlText(); @@ -708,8 +666,8 @@ if(without_rowid) { // Before setting the without rowid flag, first perform a check to see if the table meets all the required criteria for without rowid tables - int pk = m_table.findPk(); - if(pk == -1 || m_table.fields().at(pk)->autoIncrement()) + auto pk = m_table.findPk(); + if(pk == m_table.fields.end() || pk->autoIncrement()) { QMessageBox::information(this, QApplication::applicationName(), tr("Please add a field which meets the following criteria before setting the without rowid flag:\n" @@ -725,7 +683,7 @@ } // If it does, override the the rowid column name of the table object with the name of the primary key. - m_table.setRowidColumn(m_table.fields().at(pk)->name()); + m_table.setRowidColumn(pk->name()); } else { // If the without rowid flag is unset no further checks are required. Just set the rowid column name back to "_rowid_" m_table.setRowidColumn("_rowid_"); @@ -733,33 +691,10 @@ // Update the SQL preview updateSqlText(); - - // Update table if we're editing an existing table - if(!m_bNewTable) - { - if(!pdb.alterTable(curTable, m_table, QString(), sqlb::FieldPtr(), 0)) - { - QMessageBox::warning(this, QApplication::applicationName(), - tr("Setting the rowid column for the table failed. Error message:\n%1").arg(pdb.lastError())); - } - } } -void EditTableDialog::changeSchema(const QString& schema) +void EditTableDialog::changeSchema(const QString& /*schema*/) { // Update the SQL preview updateSqlText(); - - // Update table if we're editing an existing table - if(!m_bNewTable) - { - if(pdb.alterTable(curTable, m_table, QString(), sqlb::FieldPtr(), 0, schema)) - { - // Save the new schema name to use it from now on - curTable.setSchema(schema); - } else { - QMessageBox::warning(this, QApplication::applicationName(), tr("Changing the table schema failed. Error message:\n%1").arg(pdb.lastError())); - ui->comboSchema->setCurrentText(curTable.schema()); // Set it back to the original schema - } - } } diff -Nru sqlitebrowser-3.10.100ubuntu1/src/EditTableDialog.h sqlitebrowser-3.11.1/src/EditTableDialog.h --- sqlitebrowser-3.10.100ubuntu1/src/EditTableDialog.h 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/src/EditTableDialog.h 2019-02-19 23:51:34.000000000 +0000 @@ -1,7 +1,7 @@ #ifndef EDITTABLEDIALOG_H #define EDITTABLEDIALOG_H -#include "sqlitetypes.h" +#include "sql/sqlitetypes.h" #include @@ -19,10 +19,10 @@ public: explicit EditTableDialog(DBBrowserDB& pdb, const sqlb::ObjectIdentifier& tableName, bool createTable, QWidget* parent = nullptr); - ~EditTableDialog(); + ~EditTableDialog() override; protected: - void keyPressEvent(QKeyEvent *evt); + void keyPressEvent(QKeyEvent *evt) override; private: enum Columns { @@ -47,12 +47,12 @@ void addField(); void removeField(); void fieldSelectionChanged(); - virtual void accept(); - virtual void reject(); + void accept() override; + void reject() override; void checkInput(); void itemChanged(QTreeWidgetItem* item, int column); void updateTypes(QObject *object); - bool eventFilter(QObject *object, QEvent *event); + bool eventFilter(QObject *object, QEvent *event) override; void updateTypes(); void moveUp(); void moveDown(); @@ -64,12 +64,10 @@ DBBrowserDB& pdb; ForeignKeyEditorDelegate* m_fkEditorDelegate; sqlb::ObjectIdentifier curTable; + QMap trackColumns; sqlb::Table m_table; - QStringList types; - QStringList fields; bool m_bNewTable; QString m_sRestorePointName; - bool m_bForeignKeysEnabled; }; #endif diff -Nru sqlitebrowser-3.10.100ubuntu1/src/ExportDataDialog.cpp sqlitebrowser-3.11.1/src/ExportDataDialog.cpp --- sqlitebrowser-3.10.100ubuntu1/src/ExportDataDialog.cpp 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/src/ExportDataDialog.cpp 2019-02-19 23:51:34.000000000 +0000 @@ -11,6 +11,7 @@ #include #include #include +#include ExportDataDialog::ExportDataDialog(DBBrowserDB& db, ExportFormats format, QWidget* parent, const QString& query, const sqlb::ObjectIdentifier& selection) : QDialog(parent), @@ -116,7 +117,8 @@ QByteArray utf8Query = sQuery.toUtf8(); sqlite3_stmt *stmt; - int status = sqlite3_prepare_v2(pdb._db, utf8Query.data(), utf8Query.size(), &stmt, NULL); + auto pDb = pdb.get(tr("exporting CSV")); + int status = sqlite3_prepare_v2(pDb.get(), utf8Query.data(), utf8Query.size(), &stmt, nullptr); if(SQLITE_OK == status) { if(ui->checkHeader->isChecked()) @@ -147,7 +149,7 @@ for (int i = 0; i < columns; ++i) { QString content = QString::fromUtf8( - (const char*)sqlite3_column_blob(stmt, i), + reinterpret_cast(sqlite3_column_blob(stmt, i)), sqlite3_column_bytes(stmt, i)); // If no quote char is set but the content contains a line break, we enforce some quote characters. This probably isn't entirely correct @@ -198,7 +200,9 @@ { QByteArray utf8Query = sQuery.toUtf8(); sqlite3_stmt *stmt; - int status = sqlite3_prepare_v2(pdb._db, utf8Query.data(), utf8Query.size(), &stmt, NULL); + + auto pDb = pdb.get(tr("exporting JSON")); + int status = sqlite3_prepare_v2(pDb.get(), utf8Query.data(), utf8Query.size(), &stmt, nullptr); QJsonArray json_table; @@ -237,14 +241,21 @@ json_row.insert(column_names[i], QJsonValue()); break; } - case SQLITE_TEXT: - case SQLITE_BLOB: { + case SQLITE_TEXT: { QString content = QString::fromUtf8( - (const char*)sqlite3_column_blob(stmt, i), + reinterpret_cast(sqlite3_column_text(stmt, i)), sqlite3_column_bytes(stmt, i)); json_row.insert(column_names[i], content); break; } + case SQLITE_BLOB: { + QByteArray content(reinterpret_cast(sqlite3_column_blob(stmt, i)), + sqlite3_column_bytes(stmt, i)); + QTextCodec *codec = QTextCodec::codecForName("UTF-8"); + QString string = codec->toUnicode(content.toBase64(QByteArray::Base64Encoding)); + json_row.insert(column_names[i], string); + break; + } } } json_table.push_back(json_row); @@ -296,6 +307,7 @@ { // called from sqlexecute query tab QString sFilename = FileDialog::getSaveFileName( + CreateDataFile, this, tr("Choose a filename to export data"), file_dialog_filter); @@ -322,6 +334,7 @@ if(selectedItems.size() == 1) { QString fileName = FileDialog::getSaveFileName( + CreateDataFile, this, tr("Choose a filename to export data"), file_dialog_filter, @@ -336,6 +349,7 @@ } else { // ask for folder QString exportfolder = FileDialog::getExistingDirectory( + CreateDataFile, this, tr("Choose a directory"), QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks); diff -Nru sqlitebrowser-3.10.100ubuntu1/src/ExportDataDialog.h sqlitebrowser-3.11.1/src/ExportDataDialog.h --- sqlitebrowser-3.10.100ubuntu1/src/ExportDataDialog.h 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/src/ExportDataDialog.h 2019-02-19 23:51:34.000000000 +0000 @@ -3,7 +3,7 @@ #include -#include "sqlitetypes.h" +#include "sql/sqlitetypes.h" class DBBrowserDB; @@ -24,10 +24,10 @@ explicit ExportDataDialog(DBBrowserDB& db, ExportFormats format, QWidget* parent = nullptr, const QString& query = "", const sqlb::ObjectIdentifier& selection = sqlb::ObjectIdentifier()); - ~ExportDataDialog(); + ~ExportDataDialog() override; private slots: - virtual void accept(); + void accept() override; void showCustomCharEdits(); private: diff -Nru sqlitebrowser-3.10.100ubuntu1/src/ExportSqlDialog.cpp sqlitebrowser-3.11.1/src/ExportSqlDialog.cpp --- sqlitebrowser-3.10.100ubuntu1/src/ExportSqlDialog.cpp 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/src/ExportSqlDialog.cpp 2019-02-19 23:51:34.000000000 +0000 @@ -28,9 +28,9 @@ ui->comboOldSchema->setCurrentIndex(Settings::getValue("exportsql", "oldschema").toInt()); // Get list of tables to export - objectMap objects = pdb->getBrowsableObjects("main"); - for(auto it=objects.constBegin();it!=objects.constEnd();++it) - ui->listTables->addItem(new QListWidgetItem(QIcon(QString(":icons/%1").arg((*it)->type())), (*it)->name())); + QList objects = pdb->schemata["main"].values("table"); + for(const sqlb::ObjectPtr& it : objects) + ui->listTables->addItem(new QListWidgetItem(QIcon(QString(":icons/%1").arg(sqlb::Object::typeToString(it->type()))), it->name())); // Sort list of tables and select the table specified in the // selection parameter or all tables if table not specified @@ -71,7 +71,7 @@ if(selectedItems.isEmpty()) { QMessageBox::warning(this, QApplication::applicationName(), - tr("Please select at least 1 table.")); + tr("Please select at least one table.")); return; } @@ -83,6 +83,7 @@ defaultFileName = pdb->currentFile() + ".sql";; QString fileName = FileDialog::getSaveFileName( + CreateSQLFile, this, tr("Choose a filename to export"), tr("Text files(*.sql *.txt)"), diff -Nru sqlitebrowser-3.10.100ubuntu1/src/ExportSqlDialog.h sqlitebrowser-3.11.1/src/ExportSqlDialog.h --- sqlitebrowser-3.10.100ubuntu1/src/ExportSqlDialog.h 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/src/ExportSqlDialog.h 2019-02-19 23:51:34.000000000 +0000 @@ -15,10 +15,10 @@ public: explicit ExportSqlDialog(DBBrowserDB* db, QWidget* parent = nullptr, const QString& selection = ""); - ~ExportSqlDialog(); + ~ExportSqlDialog() override; private slots: - virtual void accept(); + void accept() override; void doSelectAll(); void doDeselectAll(); void whatChanged(int index); diff -Nru sqlitebrowser-3.10.100ubuntu1/src/ExtendedScintilla.cpp sqlitebrowser-3.11.1/src/ExtendedScintilla.cpp --- sqlitebrowser-3.10.100ubuntu1/src/ExtendedScintilla.cpp 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/src/ExtendedScintilla.cpp 2019-02-19 23:51:34.000000000 +0000 @@ -1,7 +1,13 @@ #include "ExtendedScintilla.h" #include "FindReplaceDialog.h" #include "Settings.h" + #include "Qsci/qscilexer.h" +#include "Qsci/qsciprinter.h" +#ifdef Q_OS_MACX +#include +#include +#endif #include #include @@ -11,9 +17,9 @@ #include #include #include +#include #include - ExtendedScintilla::ExtendedScintilla(QWidget* parent) : QsciScintilla(parent), findReplaceDialog(new FindReplaceDialog(this)) @@ -51,10 +57,23 @@ // Connect signals connect(this, SIGNAL(linesChanged()), this, SLOT(updateLineNumberAreaWidth())); - // The shortcut is constrained to the Widget context so it does not conflict with other SqlTextEdit widgets in the Main Window. + // The shortcuts are constrained to the Widget context so they do not conflict with other SqlTextEdit widgets in the Main Window. QShortcut* shortcutFindReplace = new QShortcut(QKeySequence(tr("Ctrl+H")), this, nullptr, nullptr, Qt::WidgetShortcut); connect(shortcutFindReplace, SIGNAL(activated()), this, SLOT(openFindReplaceDialog())); +#ifdef Q_OS_MACX + // Alt+Backspace on Mac is expected to delete one word to the left, + // instead of undoing (default Scintilla binding). + QsciCommand * command = standardCommands()->find(QsciCommand::DeleteWordLeft); + command->setKey(Qt::AltModifier+Qt::Key_Backspace); + // And Cmd+Backspace should delete from cursor to the beginning of line + command = standardCommands()->find(QsciCommand::DeleteLineLeft); + command->setKey(Qt::ControlModifier+Qt::Key_Backspace); +#endif + + QShortcut* shortcutPrint = new QShortcut(QKeySequence(tr("Ctrl+P")), this, nullptr, nullptr, Qt::WidgetShortcut); + connect(shortcutPrint, &QShortcut::activated, this, &ExtendedScintilla::openPrintDialog); + // Prepare for adding the find/replace option to the QScintilla context menu setContextMenuPolicy(Qt::CustomContextMenu); connect(this, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(showContextMenu(const QPoint &))); @@ -123,6 +142,7 @@ void ExtendedScintilla::reloadSettings() { reloadLexerSettings(lexer()); + reloadKeywords(); } void ExtendedScintilla::reloadLexerSettings(QsciLexer *lexer) { @@ -204,7 +224,8 @@ setCursorPosition(lineFrom, indexFrom); } - return findFirst(text, regexp, caseSensitive, words, wrap, forward); + return findFirst(text, regexp, caseSensitive, words, wrap, forward, + /* line */ -1, /* index */ -1, /* show */ true, /* posix */ true); } void ExtendedScintilla::clearSelection() @@ -223,14 +244,32 @@ QAction* findReplaceAction = new QAction(QIcon(":/icons/text_replace"), tr("Find and Replace..."), this); findReplaceAction->setShortcut(QKeySequence(tr("Ctrl+H"))); - connect(findReplaceAction, &QAction::triggered, [&]() { - openFindReplaceDialog(); - }); + connect(findReplaceAction, &QAction::triggered, this, &ExtendedScintilla::openFindReplaceDialog); + + QAction* printAction = new QAction(QIcon(":/icons/print"), tr("Print..."), this); + printAction->setShortcut(QKeySequence(tr("Ctrl+P"))); + connect(printAction, &QAction::triggered, this, &ExtendedScintilla::openPrintDialog); // This has to be created here, otherwise the set of enabled options would not update accordingly. QMenu* editContextMenu = createStandardContextMenu(); editContextMenu->addSeparator(); editContextMenu->addAction(findReplaceAction); + editContextMenu->addAction(printAction); editContextMenu->exec(mapToGlobal(pos)); } + +void ExtendedScintilla::openPrintDialog() +{ + QsciPrinter printer; + QPrintPreviewDialog *dialog = new QPrintPreviewDialog(&printer); + + connect(dialog, &QPrintPreviewDialog::paintRequested, [&](QPrinter *previewPrinter) { + QsciPrinter* sciPrinter = static_cast(previewPrinter); + sciPrinter->printRange(this); + }); + + dialog->exec(); + + delete dialog; +} diff -Nru sqlitebrowser-3.10.100ubuntu1/src/ExtendedScintilla.h sqlitebrowser-3.11.1/src/ExtendedScintilla.h --- sqlitebrowser-3.10.100ubuntu1/src/ExtendedScintilla.h 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/src/ExtendedScintilla.h 2019-02-19 23:51:34.000000000 +0000 @@ -15,12 +15,12 @@ public: explicit ExtendedScintilla(QWidget *parent = nullptr); - virtual ~ExtendedScintilla(); + ~ExtendedScintilla() override; bool findText(QString text, bool regexp, bool caseSensitive, bool words, bool wrap, bool forward); void clearSelection(); // Override parent setLexer - void setLexer(QsciLexer *lexer); + void setLexer(QsciLexer *lexer) override; public slots: void reloadKeywords(); @@ -30,9 +30,10 @@ // Set error indicator from position to end of line void setErrorIndicator(int position); void openFindReplaceDialog(); + void openPrintDialog(); protected: - void dropEvent(QDropEvent* e); + void dropEvent(QDropEvent* e) override; void setupSyntaxHighlightingFormat(QsciLexer *lexer, const QString& settings_name, int style); void reloadLexerSettings(QsciLexer *lexer); diff -Nru sqlitebrowser-3.10.100ubuntu1/src/ExtendedTableWidget.cpp sqlitebrowser-3.11.1/src/ExtendedTableWidget.cpp --- sqlitebrowser-3.10.100ubuntu1/src/ExtendedTableWidget.cpp 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/src/ExtendedTableWidget.cpp 2019-02-19 23:51:34.000000000 +0000 @@ -1,8 +1,9 @@ #include "ExtendedTableWidget.h" #include "sqlitetablemodel.h" #include "FilterTableHeader.h" -#include "sqlitetypes.h" +#include "sql/sqlitetypes.h" #include "Settings.h" +#include "sqlitedb.h" #include #include @@ -16,8 +17,18 @@ #include #include #include +#include +#include +#include +#include +#include + #include +#if QT_VERSION < QT_VERSION_CHECK(5, 4, 0) + typedef QList QByteArrayList; +#endif + QList ExtendedTableWidget::m_buffer; QString ExtendedTableWidget::m_generatorStamp; @@ -91,38 +102,119 @@ } +UniqueFilterModel::UniqueFilterModel(QObject* parent) + : QSortFilterProxyModel(parent) +{ +} + +bool UniqueFilterModel::filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const +{ + QModelIndex index = sourceModel()->index(sourceRow, filterKeyColumn(), sourceParent); + const QString& value = index.data(Qt::EditRole).toString(); + + if (!value.isEmpty() && !m_uniqueValues.contains(value)) { + const_cast(this)->m_uniqueValues.insert(value); + return true; + } + else + return false; + +} ExtendedTableWidgetEditorDelegate::ExtendedTableWidgetEditorDelegate(QObject* parent) : QStyledItemDelegate(parent) { } -QWidget* ExtendedTableWidgetEditorDelegate::createEditor(QWidget* parent, const QStyleOptionViewItem& /*option*/, const QModelIndex& /*index*/) const +QWidget* ExtendedTableWidgetEditorDelegate::createEditor(QWidget* parent, const QStyleOptionViewItem& /*option*/, const QModelIndex& index) const { - // Just create a normal line editor but set the maximum length to the highest possible value instead of the default 32768. - QLineEdit* editor = new QLineEdit(parent); - editor->setMaxLength(std::numeric_limits::max()); - return editor; + + SqliteTableModel* m = qobject_cast(const_cast(index.model())); + sqlb::ForeignKeyClause fk = m->getForeignKeyClause(index.column()-1); + + if(fk.isSet()) { + + sqlb::ObjectIdentifier foreignTable = sqlb::ObjectIdentifier(m->currentTableName().schema(), fk.table()); + + QString column; + // If no column name is set, assume the primary key is meant + if(fk.columns().isEmpty()) { + sqlb::TablePtr obj = m->db().getObjectByName(foreignTable); + column = obj->findPk()->name(); + } else + column = fk.columns().at(0); + + sqlb::TablePtr currentTable = m->db().getObjectByName(m->currentTableName()); + QString query = QString("SELECT %1 FROM %2").arg(sqlb::escapeIdentifier(column)).arg(foreignTable.toString()); + + // if the current column of the current table does NOT have not-null constraint, + // the NULL is united to the query to get the possible values in the combo-box. + if (!currentTable->fields.at(index.column()-1).notnull()) + query.append (" UNION SELECT NULL"); + + SqliteTableModel* fkModel = new SqliteTableModel(m->db(), parent, m->chunkSize(), m->encoding()); + fkModel->setQuery(query); + + QComboBox* combo = new QComboBox(parent); + + // Complete cache so it is ready when setEditorData is invoked. + fkModel->completeCache(); + combo->setModel(fkModel); + + return combo; + } else { + + QLineEdit* editor = new QLineEdit(parent); + // If the row count is not greater than the complete threshold setting, set a completer of values based on current values in the column. + if (index.model()->rowCount() <= Settings::getValue("databrowser", "complete_threshold").toInt()) { + QCompleter* completer = new QCompleter(editor); + UniqueFilterModel* completerFilter = new UniqueFilterModel(completer); + // Provide a filter for the source model, so only unique and non-empty values are accepted. + completerFilter->setSourceModel(const_cast(index.model())); + completerFilter->setFilterKeyColumn(index.column()); + completer->setModel(completerFilter); + // Complete on this column, using a popup and case-insensitively. + completer->setCompletionColumn(index.column()); + completer->setCompletionMode(QCompleter::PopupCompletion); + completer->setCaseSensitivity(Qt::CaseInsensitive); + editor->setCompleter(completer); + } + // Set the maximum length to the highest possible value instead of the default 32768. + editor->setMaxLength(std::numeric_limits::max()); + return editor; + } } void ExtendedTableWidgetEditorDelegate::setEditorData(QWidget* editor, const QModelIndex& index) const { - QLineEdit* lineedit = static_cast(editor); - - // Set the data for the line editor + QLineEdit* lineedit = dynamic_cast(editor); + // Set the data for the editor QString data = index.data(Qt::EditRole).toString(); - lineedit->setText(data); - // Put the editor in read only mode if the actual data is larger than the maximum length to avoid accidental truncation of the data - lineedit->setReadOnly(data.size() > lineedit->maxLength()); + if(!lineedit) { + QComboBox* combo = static_cast(editor); + int comboIndex = combo->findText(data); + if (comboIndex >= 0) + // if it is valid, adjust the combobox + combo->setCurrentIndex(comboIndex); + } else { + lineedit->setText(data); + + // Put the editor in read only mode if the actual data is larger than the maximum length to avoid accidental truncation of the data + lineedit->setReadOnly(data.size() > lineedit->maxLength()); + } } void ExtendedTableWidgetEditorDelegate::setModelData(QWidget* editor, QAbstractItemModel* model, const QModelIndex& index) const { // Only apply the data back to the model if the editor is not in read only mode to avoid accidental truncation of the data - QLineEdit* lineedit = static_cast(editor); - if(!lineedit->isReadOnly()) - model->setData(index, lineedit->text()); + QLineEdit* lineedit = dynamic_cast(editor); + if(!lineedit) { + QComboBox* combo = static_cast(editor); + model->setData(index, combo->currentData(Qt::EditRole), Qt::EditRole); + } else + if(!lineedit->isReadOnly()) + model->setData(index, lineedit->text()); } void ExtendedTableWidgetEditorDelegate::updateEditorGeometry(QWidget* editor, const QStyleOptionViewItem& option, const QModelIndex& /*index*/) const @@ -150,18 +242,46 @@ // Set up table view context menu m_contextMenu = new QMenu(this); - QAction* nullAction = new QAction(tr("Set to NULL"), m_contextMenu); + + QAction* filterAction = new QAction(QIcon(":/icons/filter"), tr("Use as Exact Filter"), m_contextMenu); + QAction* containingAction = new QAction(tr("Containing"), m_contextMenu); + QAction* notContainingAction = new QAction(tr("Not containing"), m_contextMenu); + QAction* notEqualToAction = new QAction(tr("Not equal to"), m_contextMenu); + QAction* greaterThanAction = new QAction(tr("Greater than"), m_contextMenu); + QAction* lessThanAction = new QAction(tr("Less than"), m_contextMenu); + QAction* greaterEqualAction = new QAction(tr("Greater or equal"), m_contextMenu); + QAction* lessEqualAction = new QAction(tr("Less or equal"), m_contextMenu); + QAction* inRangeAction = new QAction(tr("Between this and..."), m_contextMenu); + QAction* regexpAction = new QAction(tr("Regular expression"), m_contextMenu); + + QAction* nullAction = new QAction(QIcon(":/icons/set_to_null"), tr("Set to NULL"), m_contextMenu); QAction* copyAction = new QAction(QIcon(":/icons/copy"), tr("Copy"), m_contextMenu); QAction* copyWithHeadersAction = new QAction(QIcon(":/icons/special_copy"), tr("Copy with Headers"), m_contextMenu); + QAction* copyAsSQLAction = new QAction(QIcon(":/icons/sql_copy"), tr("Copy as SQL"), m_contextMenu); QAction* pasteAction = new QAction(QIcon(":/icons/paste"), tr("Paste"), m_contextMenu); - QAction* filterAction = new QAction(tr("Use as Filter"), m_contextMenu); + QAction* printAction = new QAction(QIcon(":/icons/print"), tr("Print..."), m_contextMenu); + m_contextMenu->addAction(filterAction); + QMenu* filterMenu = m_contextMenu->addMenu(tr("Use in Filter Expression")); + filterMenu->addAction(containingAction); + filterMenu->addAction(notContainingAction); + filterMenu->addAction(notEqualToAction); + filterMenu->addAction(greaterThanAction); + filterMenu->addAction(lessThanAction); + filterMenu->addAction(greaterEqualAction); + filterMenu->addAction(lessEqualAction); + filterMenu->addAction(inRangeAction); + filterMenu->addAction(regexpAction); + m_contextMenu->addSeparator(); m_contextMenu->addAction(nullAction); m_contextMenu->addSeparator(); m_contextMenu->addAction(copyAction); m_contextMenu->addAction(copyWithHeadersAction); + m_contextMenu->addAction(copyAsSQLAction); m_contextMenu->addAction(pasteAction); + m_contextMenu->addSeparator(); + m_contextMenu->addAction(printAction); setContextMenuPolicy(Qt::CustomContextMenu); // Create and set up delegate @@ -173,7 +293,9 @@ nullAction->setShortcut(QKeySequence(tr("Alt+Del"))); copyAction->setShortcut(QKeySequence::Copy); copyWithHeadersAction->setShortcut(QKeySequence(tr("Ctrl+Shift+C"))); + copyAsSQLAction->setShortcut(QKeySequence(tr("Ctrl+Alt+C"))); pasteAction->setShortcut(QKeySequence::Paste); + printAction->setShortcut(QKeySequence::Print); // Set up context menu actions connect(this, &QTableView::customContextMenuRequested, @@ -182,8 +304,16 @@ // Deactivate context menu options if there is no model set bool enabled = model(); filterAction->setEnabled(enabled); + filterMenu->setEnabled(enabled); copyAction->setEnabled(enabled); copyWithHeadersAction->setEnabled(enabled); + copyAsSQLAction->setEnabled(enabled); + printAction->setEnabled(enabled); + + // Hide filter actions when there isn't any filters + bool hasFilters = m_tableHeader->hasFilters(); + filterAction->setVisible(hasFilters); + filterMenu->menuAction()->setVisible(hasFilters); // Try to find out whether the current view is editable and (de)activate menu options according to that bool editable = editTriggers() != QAbstractItemView::NoEditTriggers; @@ -194,21 +324,56 @@ m_contextMenu->popup(viewport()->mapToGlobal(pos)); }); connect(filterAction, &QAction::triggered, [&]() { - useAsFilter(); + useAsFilter(QString ("=")); }); + connect(containingAction, &QAction::triggered, [&]() { + useAsFilter(QString ("")); + }); + // Use a regular expression for the not containing filter. Simplify this if we ever support the NOT LIKE filter. + connect(notContainingAction, &QAction::triggered, [&]() { + useAsFilter(QString ("/^((?!"), /* binary */ false, QString (").)*$/")); + }); + connect(notEqualToAction, &QAction::triggered, [&]() { + useAsFilter(QString ("<>")); + }); + connect(greaterThanAction, &QAction::triggered, [&]() { + useAsFilter(QString (">")); + }); + connect(lessThanAction, &QAction::triggered, [&]() { + useAsFilter(QString ("<")); + }); + connect(greaterEqualAction, &QAction::triggered, [&]() { + useAsFilter(QString (">=")); + }); + connect(lessEqualAction, &QAction::triggered, [&]() { + useAsFilter(QString ("<=")); + }); + connect(inRangeAction, &QAction::triggered, [&]() { + useAsFilter(QString ("~"), /* binary */ true); + }); + connect(regexpAction, &QAction::triggered, [&]() { + useAsFilter(QString ("/"), /* binary */ false, QString ("/")); + }); + connect(nullAction, &QAction::triggered, [&]() { for(const QModelIndex& index : selectedIndexes()) model()->setData(index, QVariant()); }); connect(copyAction, &QAction::triggered, [&]() { - copy(false); + copy(false, false); }); connect(copyWithHeadersAction, &QAction::triggered, [&]() { - copy(true); + copy(true, false); + }); + connect(copyAsSQLAction, &QAction::triggered, [&]() { + copy(false, true); }); connect(pasteAction, &QAction::triggered, [&]() { paste(); }); + connect(printAction, &QAction::triggered, [&]() { + openPrintDialog(); + }); } void ExtendedTableWidget::reloadSettings() @@ -222,17 +387,17 @@ verticalHeader()->setDefaultSectionSize(verticalHeader()->fontMetrics().height()+10); } -void ExtendedTableWidget::copy(const bool withHeaders) +void ExtendedTableWidget::copyMimeData(const QModelIndexList& fromIndices, QMimeData* mimeData, const bool withHeaders, const bool inSQL) { - QModelIndexList indices = selectionModel()->selectedIndexes(); + QModelIndexList indices = fromIndices; // Remove all indices from hidden columns, because if we don't we might copy data from hidden columns as well which is very // unintuitive; especially copying the rowid column when selecting all columns of a table is a problem because pasting the data // won't work as expected. - QMutableListIterator i(indices); - while (i.hasNext()) { - if (isColumnHidden(i.next().column())) - i.remove(); + QMutableListIterator it(indices); + while (it.hasNext()) { + if (isColumnHidden(it.next().column())) + it.remove(); } // Abort if there's nothing to copy @@ -244,34 +409,20 @@ // Clear internal copy-paste buffer m_buffer.clear(); - // If a single cell is selected, copy it to clipboard - if (!withHeaders && indices.size() == 1) { + // If a single cell is selected which contains an image, copy it to the clipboard + if (!inSQL && !withHeaders && indices.size() == 1) { QImage img; QVariant data = m->data(indices.first(), Qt::EditRole); if (img.loadFromData(data.toByteArray())) { // If it's an image, copy the image data to the clipboard - qApp->clipboard()->setImage(img); - return; - } else { - // It it's not an image, check if it's an empty field - if (data.toByteArray().isEmpty()) - { - // The field is either NULL or empty. Those are are handled via the internal copy-paste buffer - qApp->clipboard()->setText(QString()); // Calling clear() alone doesn't seem to work on all systems - qApp->clipboard()->clear(); - m_buffer.push_back(QByteArrayList{data.toByteArray()}); - return; - } - - // The field isn't empty. Copy the text to the clipboard without quoting (for general plain text clipboard) - qApp->clipboard()->setText(data.toByteArray()); + mimeData->setImageData(img); return; } } - // If we got here, there are multiple selected cells, or copy with headers was requested. + // If we got here, a non-image cell was or multiple cells were selected, or copy with headers was requested. // In this case, we copy selected data into internal copy-paste buffer and then // we write a table both in HTML and text formats to the system clipboard. @@ -290,6 +441,7 @@ } m_buffer.push_back(lst); + QString sqlResult; QString result; QString htmlResult = ""; htmlResult.append(""); @@ -301,17 +453,23 @@ m_generatorStamp = QString("").arg(QApplication::applicationName().toHtmlEscaped(), now); htmlResult.append(m_generatorStamp); // TODO: is this really needed by Excel, since we use
 for multi-line cells?
-    htmlResult.append("");
+    htmlResult.append(""
+                      "
"); int currentRow = indices.first().row(); const QString fieldSepHtml = ""); + sqlInsertStatement.append(") VALUES ("); } // Table data rows for(const QModelIndex& index : indices) { // Separators. For first cell, only opening table row tags must be added for the HTML and nothing for the text version. - if (indices.first() == index) + if (indices.first() == index) { htmlResult.append("
"; const QString rowSepHtml = "
"; const QString fieldSepText = "\t"; +#ifdef Q_OS_WIN const QString rowSepText = "\r\n"; +#else + const QString rowSepText = "\n"; +#endif + QString sqlInsertStatement = QString("INSERT INTO %1 (").arg(m->currentTableName().toString()); // Table headers - if (withHeaders) { + if (withHeaders || inSQL) { htmlResult.append("
"); int firstColumn = indices.front().column(); for(int i = firstColumn; i <= indices.back().column(); i++) { @@ -319,34 +477,40 @@ if (i != firstColumn) { result.append(fieldSepText); htmlResult.append(""); + sqlInsertStatement.append(", "); } - result.append(escapeCopiedData(headerText)); + result.append(headerText); htmlResult.append(headerText); + sqlInsertStatement.append(sqlb::escapeIdentifier(headerText)); } result.append(rowSepText); htmlResult.append("
"); - else if (index.row() != currentRow) { + sqlResult.append(sqlInsertStatement); + } else if (index.row() != currentRow) { result.append(rowSepText); htmlResult.append(rowSepHtml); + sqlResult.append(");" + rowSepText + sqlInsertStatement); } else { result.append(fieldSepText); htmlResult.append(fieldSepHtml); + sqlResult.append(", "); } currentRow = index.row(); QImage img; QVariant data = index.data(Qt::EditRole); - // Table cell data: image? Store it as an embedded image in HTML and as base 64 in text version - if (img.loadFromData(data.toByteArray())) + // Table cell data: image? Store it as an embedded image in HTML + if (!inSQL && img.loadFromData(data.toByteArray())) { QByteArray ba; QBuffer buffer(&ba); @@ -361,45 +525,41 @@ htmlResult.append("\" alt=\"Image\">"); } else { QByteArray text; - if (!m->isBinary(index)) + if (!m->isBinary(index)) { text = data.toByteArray(); - // Table cell data: text - if (text.contains('\n') || text.contains('\t')) - htmlResult.append("
" + QString(text).toHtmlEscaped() + "
"); - else - htmlResult.append(QString(text).toHtmlEscaped()); + // Table cell data: text + if (text.contains('\n') || text.contains('\t')) + htmlResult.append("
" + QString(text).toHtmlEscaped() + "
"); + else + htmlResult.append(QString(text).toHtmlEscaped()); + + result.append(text); + sqlResult.append("'" + text.replace("'", "''") + "'"); + } else + // Table cell data: binary. Save as BLOB literal in SQL + sqlResult.append( "X'" + data.toByteArray().toHex() + "'" ); - result.append(escapeCopiedData(text)); } } + sqlResult.append(");"); - QMimeData *mimeData = new QMimeData; - mimeData->setHtml(htmlResult + "
"); - mimeData->setText(result); - qApp->clipboard()->setMimeData(mimeData); -} - -QString ExtendedTableWidget::escapeCopiedData(const QByteArray& data) const -{ - // Empty string is enquoted in plain text format, whilst NULL isn't - // We also quote the data when there are line breaks in the text, again for spreadsheet compatability. - // We also need to quote when there are tabs in the string (another option would be to replace the tabs by spaces, that's what - // LibreOffice seems to be doing here). - - if(data.isNull()) - return data; - - QString text = data; - if(text.isEmpty() || text.contains('\n') || text.contains('\t') || text.contains('"')) + if ( inSQL ) { - text.replace("\"", "\"\""); - return QString("\"%1\"").arg(text); + mimeData->setText(sqlResult); } else { - return text; + mimeData->setHtml(htmlResult + ""); + mimeData->setText(result); } } +void ExtendedTableWidget::copy(const bool withHeaders, const bool inSQL ) +{ + QMimeData *mimeData = new QMimeData; + copyMimeData(selectionModel()->selectedIndexes(), mimeData, withHeaders, inSQL); + qApp->clipboard()->setMimeData(mimeData); +} + void ExtendedTableWidget::paste() { // Get list of selected items @@ -513,7 +673,7 @@ } } -void ExtendedTableWidget::useAsFilter() +void ExtendedTableWidget::useAsFilter(const QString& filterOperator, bool binary, const QString& operatorSuffix) { QModelIndex index = selectionModel()->currentIndex(); SqliteTableModel* m = qobject_cast(model()); @@ -523,13 +683,43 @@ return; QVariant data = model()->data(index, Qt::EditRole); - + QString value; if (data.isNull()) - m_tableHeader->setFilter(index.column(), "=NULL"); + value = "NULL"; else if (data.toString().isEmpty()) - m_tableHeader->setFilter(index.column(), "=''"); + value = "''"; else - m_tableHeader->setFilter(index.column(), "=" + data.toString()); + value = data.toString(); + + // When Containing filter is requested (empty operator) and the value starts with + // an operator character, the character is escaped. + if (filterOperator.isEmpty()) + value.replace(QRegExp("^(<|>|=|/)"), Settings::getValue("databrowser", "filter_escape").toString() + QString("\\1")); + + // If binary operator, the cell data is used as first value and + // the second value must be added by the user. + if (binary) + m_tableHeader->setFilter(index.column(), value + filterOperator); + else + m_tableHeader->setFilter(index.column(), filterOperator + value + operatorSuffix); +} + +void ExtendedTableWidget::duplicateUpperCell() +{ + const QModelIndex& currentIndex = selectionModel()->currentIndex(); + QModelIndex upperIndex = currentIndex.sibling(currentIndex.row() - 1, currentIndex.column()); + if (upperIndex.isValid()) { + SqliteTableModel* m = qobject_cast(model()); + // When the data is binary, just copy it, since it cannot be edited inline. + if (m->isBinary(upperIndex)) + m->setData(currentIndex, m->data(upperIndex, Qt::EditRole), Qt::EditRole); + else { + // Open the inline editor and set the value (this mimics the behaviour of LibreOffice Calc) + edit(currentIndex); + QLineEdit* editor = qobject_cast(indexWidget(currentIndex)); + editor->setText(upperIndex.data().toString()); + } + } } void ExtendedTableWidget::keyPressEvent(QKeyEvent* event) @@ -537,29 +727,52 @@ // Call a custom copy method when Ctrl-C is pressed if(event->matches(QKeySequence::Copy)) { - copy(false); + copy(false, false); return; } else if(event->matches(QKeySequence::Paste)) { // Call a custom paste method when Ctrl-V is pressed paste(); + } else if(event->matches(QKeySequence::Print)) { + openPrintDialog(); } else if(event->modifiers().testFlag(Qt::ControlModifier) && event->modifiers().testFlag(Qt::ShiftModifier) && (event->key() == Qt::Key_C)) { // Call copy with headers when Ctrl-Shift-C is pressed - copy(true); + copy(true, false); + } else if(event->modifiers().testFlag(Qt::ControlModifier) && event->modifiers().testFlag(Qt::AltModifier) && (event->key() == Qt::Key_C)) { + // Call copy in SQL format when Ctrl-Alt-C is pressed + copy(false, true); + } else if(event->modifiers().testFlag(Qt::ControlModifier) && (event->key() == Qt::Key_Apostrophe)) { + // Call duplicateUpperCell when Ctrl-' is pressed (this is used by spreadsheets for "Copy Formula from Cell Above") + duplicateUpperCell(); } else if(event->key() == Qt::Key_Tab && hasFocus() && selectedIndexes().count() == 1 && selectedIndexes().at(0).row() == model()->rowCount()-1 && selectedIndexes().at(0).column() == model()->columnCount()-1) { // If the Tab key was pressed while the focus was on the last cell of the last row insert a new row automatically model()->insertRow(model()->rowCount()); } else if ((event->key() == Qt::Key_Delete) || (event->key() == Qt::Key_Backspace)) { - if(event->modifiers().testFlag(Qt::AltModifier)) + // Check if entire rows are selected. We call the selectedRows() method here not only for simplicity reasons but also because it distinguishes between + // "an entire row is selected" and "all cells of a row are selected", the former is e.g. the case when the row number is clicked, the latter when all cells + // are selected manually. This is an important distinction (especially when a table has only one column!) to match the users' expectations. Also never + // delete records when the backspace key was pressed. + if(event->key() == Qt::Key_Delete && selectionModel()->selectedRows().size()) { - // When pressing Alt+Delete set the value to NULL - for(const QModelIndex& index : selectedIndexes()) - model()->setData(index, QVariant()); + // At least on entire row is selected. Because we don't allow completely arbitrary selections (at least at the moment) but only block selections, + // this means that only entire entire rows are selected. If an entire row is (or multiple entire rows are) selected, we delete that record instead + // of deleting only the cell contents. + + emit selectedRowsToBeDeleted(); } else { - // When pressing Delete only set the value to empty string - for(const QModelIndex& index : selectedIndexes()) - model()->setData(index, ""); + // No entire row is selected. So just set the selected cells to null or empty string depending on the modifier keys + + if(event->modifiers().testFlag(Qt::AltModifier)) + { + // When pressing Alt+Delete set the value to NULL + for(const QModelIndex& index : selectedIndexes()) + model()->setData(index, QVariant()); + } else { + // When pressing Delete only set the value to empty string + for(const QModelIndex& index : selectedIndexes()) + model()->setData(index, ""); + } } } else if(event->modifiers().testFlag(Qt::ControlModifier) && (event->key() == Qt::Key_PageUp || event->key() == Qt::Key_PageDown)) { // When pressing Ctrl + Page up/down send a signal indicating the user wants to change the current table @@ -585,7 +798,7 @@ // If so and if it is a SqliteTableModel and if the parent implementation of this method decided that a scrollbar is needed, update its maximum value SqliteTableModel* m = qobject_cast(model()); if(m && verticalScrollBar()->maximum()) - verticalScrollBar()->setMaximum(m->totalRowCount() - numVisibleRows() + 1); + verticalScrollBar()->setMaximum(m->rowCount() - numVisibleRows() + 1); } } @@ -596,8 +809,16 @@ return; // Fetch more data from the DB if necessary - if((value + numVisibleRows()) >= model()->rowCount() && model()->canFetchMore(QModelIndex())) - model()->fetchMore(QModelIndex()); + const auto nrows = model()->rowCount(); + if(nrows == 0) + return; + + if(auto * m = dynamic_cast(model())) + { + int row_begin = std::min(value, nrows - 1); + int row_end = std::min(value + numVisibleRows(), nrows); + m->triggerCacheLoad(row_begin, row_end); + } } int ExtendedTableWidget::numVisibleRows() @@ -663,13 +884,11 @@ SqliteTableModel* m = qobject_cast(model()); // Are there even that many lines? - if(lineToSelect >= m->totalRowCount()) + if(lineToSelect >= m->rowCount()) return; QApplication::setOverrideCursor( Qt::WaitCursor ); - // Make sure this line has already been fetched - while(lineToSelect >= m->rowCount() && m->canFetchMore()) - m->fetchMore(); + m->triggerCacheLoad(lineToSelect); // Select it clearSelection(); @@ -684,7 +903,7 @@ int lastLine = firstLine+count-1; // Are there even that many lines? - if(lastLine >= m->totalRowCount()) + if(lastLine >= m->rowCount()) return; selectTableLine(firstLine); @@ -694,3 +913,63 @@ selectionModel()->select(QItemSelection(topLeft, bottomRight), QItemSelectionModel::Select | QItemSelectionModel::Rows); } + +void ExtendedTableWidget::selectAll() +{ + SqliteTableModel* m = qobject_cast(model()); + + // Fetch all the data if needed and user accepts, then call parent's selectAll() + + QMessageBox::StandardButton answer = QMessageBox::Yes; + + // If we can fetch more data, ask user if they are sure about it. + if (!m->isCacheComplete()) { + + answer = QMessageBox::question(this, QApplication::applicationName(), + tr("

Not all data has been loaded. Do you want to load all data before selecting all the rows?

" + "

Answering No means that no more data will be loaded and the selection will not be performed.
" + "Answering Yes might take some time while the data is loaded but the selection will be complete.

" + "Warning: Loading all the data might require a great amount of memory for big tables."), + QMessageBox::Yes | QMessageBox::No); + + if (answer == QMessageBox::Yes) + m->completeCache(); + } + if (answer == QMessageBox::Yes) + QTableView::selectAll(); +} + +void ExtendedTableWidget::openPrintDialog() +{ + QMimeData *mimeData = new QMimeData; + QModelIndexList indices; + + // Print the selection, if active, or the entire table otherwise. + // Given that simply clicking over a cell, selects it, one-cell selections are ignored. + if (selectionModel()->hasSelection() && selectionModel()->selectedIndexes().count() > 1) + indices = selectionModel()->selectedIndexes(); + else + for (int row=0; row < model()->rowCount(); row++) + for (int column=0; column < model()->columnCount(); column++) + indices << model()->index(row, column); + + // Copy the specified indices content to mimeData for getting the HTML representation of + // the table with headers. We can then print it using an HTML text document. + copyMimeData(indices, mimeData, true, false); + + QTextDocument *document = new QTextDocument(); + document->setHtml(mimeData->html()); + + QPrinter printer; + QPrintPreviewDialog *dialog = new QPrintPreviewDialog(&printer); + + connect(dialog, &QPrintPreviewDialog::paintRequested, [&](QPrinter *previewPrinter) { + document->print(previewPrinter); + }); + + dialog->exec(); + + delete dialog; + delete document; + delete mimeData; +} diff -Nru sqlitebrowser-3.10.100ubuntu1/src/ExtendedTableWidget.h sqlitebrowser-3.11.1/src/ExtendedTableWidget.h --- sqlitebrowser-3.10.100ubuntu1/src/ExtendedTableWidget.h 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/src/ExtendedTableWidget.h 2019-02-19 23:51:34.000000000 +0000 @@ -6,11 +6,25 @@ #include #include #include +#include class QMenu; +class QMimeData; class FilterTableHeader; namespace sqlb { class ObjectIdentifier; } +// Filter proxy model that only accepts distinct non-empty values. +class UniqueFilterModel : public QSortFilterProxyModel +{ + Q_OBJECT + +public: + explicit UniqueFilterModel(QObject* parent = nullptr); + bool filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const override; + private: + QSet m_uniqueValues; +}; + // We use this class to provide editor widgets for the ExtendedTableWidget. It's used for every cell in the table view. class ExtendedTableWidgetEditorDelegate : public QStyledItemDelegate { @@ -42,18 +56,22 @@ void reloadSettings(); void selectTableLine(int lineToSelect); void selectTableLines(int firstLine, int count); + void selectAll() override; + void openPrintDialog(); signals: void foreignKeyClicked(const sqlb::ObjectIdentifier& table, const QString& column, const QByteArray& value); void switchTable(bool next); // 'next' parameter is set to true if next table should be selected and to false if previous table should be selected void openFileFromDropEvent(QString); + void selectedRowsToBeDeleted(); private: - void copy(const bool withHeaders = false); + void copyMimeData(const QModelIndexList& fromIndices, QMimeData* mimeData, const bool withHeaders, const bool inSQL); + void copy(const bool withHeaders, const bool inSQL); void paste(); - QString escapeCopiedData(const QByteArray& data) const; - void useAsFilter(); + void useAsFilter(const QString& filterOperator, bool binary = false, const QString& operatorSuffix = ""); + void duplicateUpperCell(); typedef QList QByteArrayList; static QList m_buffer; @@ -64,11 +82,11 @@ void cellClicked(const QModelIndex& index); protected: - virtual void keyPressEvent(QKeyEvent* event); - virtual void updateGeometries(); - virtual void dragEnterEvent(QDragEnterEvent* event); - virtual void dragMoveEvent(QDragMoveEvent* event); - virtual void dropEvent(QDropEvent* event); + void keyPressEvent(QKeyEvent* event) override; + void updateGeometries() override; + void dragEnterEvent(QDragEnterEvent* event) override; + void dragMoveEvent(QDragMoveEvent* event) override; + void dropEvent(QDropEvent* event) override; FilterTableHeader* m_tableHeader; QMenu* m_contextMenu; diff -Nru sqlitebrowser-3.10.100ubuntu1/src/extensions/extension-functions.c sqlitebrowser-3.11.1/src/extensions/extension-functions.c --- sqlitebrowser-3.10.100ubuntu1/src/extensions/extension-functions.c 1970-01-01 00:00:00.000000000 +0000 +++ sqlitebrowser-3.11.1/src/extensions/extension-functions.c 2019-02-19 23:51:34.000000000 +0000 @@ -0,0 +1,1947 @@ +/* +This library will provide common mathematical and string functions in +SQL queries using the operating system libraries or provided +definitions. It includes the following functions: + +Math: acos, asin, atan, atn2, atan2, acosh, asinh, atanh, difference, +degrees, radians, cos, sin, tan, cot, cosh, sinh, tanh, coth, exp, +log, log10, power, sign, sqrt, square, ceil, floor, pi. + +String: replicate, charindex, leftstr, rightstr, ltrim, rtrim, trim, +replace, reverse, proper, padl, padr, padc, strfilter. + +Aggregate: stdev, variance, mode, median, lower_quartile, +upper_quartile. + +The string functions ltrim, rtrim, trim, replace are included in +recent versions of SQLite and so by default do not build. + +Compilation instructions: + Compile this C source file into a dynamic library as follows: + * Linux: + gcc -fPIC -lm -shared extension-functions.c -o libsqlitefunctions.so + * Mac OS X: + gcc -fno-common -dynamiclib extension-functions.c -o libsqlitefunctions.dylib + (You may need to add flags + -I /opt/local/include/ -L/opt/local/lib -lsqlite3 + if your sqlite3 is installed from Mac ports, or + -I /sw/include/ -L/sw/lib -lsqlite3 + if installed with Fink.) + * Windows: + 1. Install MinGW (http://www.mingw.org/) and you will get the gcc + (gnu compiler collection) + 2. add the path to your path variable (isn't done during the + installation!) + 3. compile: + gcc -shared -I "path" -o libsqlitefunctions.so extension-functions.c + (path = path of sqlite3ext.h; i.e. C:\programs\sqlite) + +Usage instructions for applications calling the sqlite3 API functions: + In your application, call sqlite3_enable_load_extension(db,1) to + allow loading external libraries. Then load the library libsqlitefunctions + using sqlite3_load_extension; the third argument should be 0. + See http://www.sqlite.org/cvstrac/wiki?p=LoadableExtensions. + Select statements may now use these functions, as in + SELECT cos(radians(inclination)) FROM satsum WHERE satnum = 25544; + +Usage instructions for the sqlite3 program: + If the program is built so that loading extensions is permitted, + the following will work: + sqlite> SELECT load_extension('./libsqlitefunctions.so'); + sqlite> select cos(radians(45)); + 0.707106781186548 + Note: Loading extensions is by default prohibited as a + security measure; see "Security Considerations" in + http://www.sqlite.org/cvstrac/wiki?p=LoadableExtensions. + If the sqlite3 program and library are built this + way, you cannot use these functions from the program, you + must write your own program using the sqlite3 API, and call + sqlite3_enable_load_extension as described above, or else + rebuilt the sqlite3 program to allow loadable extensions. + +Alterations: +The instructions are for Linux, Mac OS X, and Windows; users of other +OSes may need to modify this procedure. In particular, if your math +library lacks one or more of the needed trig or log functions, comment +out the appropriate HAVE_ #define at the top of file. If you do not +wish to make a loadable module, comment out the define for +COMPILE_SQLITE_EXTENSIONS_AS_LOADABLE_MODULE. If you are using a +version of SQLite without the trim functions and replace, comment out +the HAVE_TRIM #define. + +Liam Healy + +History: +2010-01-06 Correct check for argc in squareFunc, and add Windows +compilation instructions. +2009-06-24 Correct check for argc in properFunc. +2008-09-14 Add check that memory was actually allocated after +sqlite3_malloc or sqlite3StrDup, call sqlite3_result_error_nomem if +not. Thanks to Robert Simpson. +2008-06-13 Change to instructions to indicate use of the math library +and that program might work. +2007-10-01 Minor clarification to instructions. +2007-09-29 Compilation as loadable module is optional with +COMPILE_SQLITE_EXTENSIONS_AS_LOADABLE_MODULE. +2007-09-28 Use sqlite3_extension_init and macros +SQLITE_EXTENSION_INIT1, SQLITE_EXTENSION_INIT2, so that it works with +sqlite3_load_extension. Thanks to Eric Higashino and Joe Wilson. +New instructions for Mac compilation. +2007-09-17 With help from Joe Wilson and Nuno Luca, made use of +external interfaces so that compilation is no longer dependent on +SQLite source code. Merged source, header, and README into a single +file. Added casts so that Mac will compile without warnings (unsigned +and signed char). +2007-09-05 Included some definitions from sqlite 3.3.13 so that this +will continue to work in newer versions of sqlite. Completed +description of functions available. +2007-03-27 Revised description. +2007-03-23 Small cleanup and a bug fix on the code. This was mainly +letting errno flag errors encountered in the math library and checking +the result, rather than pre-checking. This fixes a bug in power that +would cause an error if any non-positive number was raised to any +power. +2007-02-07 posted by Mikey C to sqlite mailing list. +Original code 2006 June 05 by relicoder. + +*/ + +//#include "config.h" + +#define COMPILE_SQLITE_EXTENSIONS_AS_LOADABLE_MODULE 1 +#define HAVE_ACOSH 1 +#define HAVE_ASINH 1 +#define HAVE_ATANH 1 +#define HAVE_SINH 1 +#define HAVE_COSH 1 +#define HAVE_TANH 1 +#define HAVE_LOG10 1 +#define HAVE_ISBLANK 1 +#define SQLITE_SOUNDEX 1 +#define HAVE_TRIM 1 /* LMH 2007-03-25 if sqlite has trim functions */ + +#ifdef COMPILE_SQLITE_EXTENSIONS_AS_LOADABLE_MODULE +#include "sqlite3ext.h" +SQLITE_EXTENSION_INIT1 +#else +#include "sqlite3.h" +#endif + +#include +/* relicoder */ +#include +#include +#include +#include /* LMH 2007-03-25 */ + +#include +#include + +#ifndef _MAP_H_ +#define _MAP_H_ + +#include + +/* +** Simple binary tree implementation to use in median, mode and quartile calculations +** Tree is not necessarily balanced. That would require something like red&black trees of AVL +*/ + +typedef int(*cmp_func)(const void *, const void *); +typedef void(*map_iterator)(void*, int64_t, void*); + +typedef struct node{ + struct node *l; + struct node *r; + void* data; + int64_t count; +} node; + +typedef struct map{ + node *base; + cmp_func cmp; + short free; +} map; + +/* +** creates a map given a comparison function +*/ +map map_make(cmp_func cmp); + +/* +** inserts the element e into map m +*/ +void map_insert(map *m, void *e); + +/* +** executes function iter over all elements in the map, in key increasing order +*/ +void map_iterate(map *m, map_iterator iter, void* p); + +/* +** frees all memory used by a map +*/ +void map_destroy(map *m); + +/* +** compares 2 integers +** to use with map_make +*/ +int int_cmp(const void *a, const void *b); + +/* +** compares 2 doubles +** to use with map_make +*/ +int double_cmp(const void *a, const void *b); + +#endif /* _MAP_H_ */ + +typedef uint8_t u8; +typedef uint16_t u16; +typedef int64_t i64; + +static char *sqlite3StrDup( const char *z ) { + char *res = sqlite3_malloc( strlen(z)+1 ); + return strcpy( res, z ); +} + +/* +** These are copied verbatim from fun.c so as to not have the names exported +*/ + +/* LMH from sqlite3 3.3.13 */ +/* +** This table maps from the first byte of a UTF-8 character to the number +** of trailing bytes expected. A value '4' indicates that the table key +** is not a legal first byte for a UTF-8 character. +*/ +static const u8 xtra_utf8_bytes[256] = { +/* 0xxxxxxx */ +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + +/* 10wwwwww */ +4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, +4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, +4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, +4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + +/* 110yyyyy */ +1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + +/* 1110zzzz */ +2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + +/* 11110yyy */ +3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, +}; + + +/* +** This table maps from the number of trailing bytes in a UTF-8 character +** to an integer constant that is effectively calculated for each character +** read by a naive implementation of a UTF-8 character reader. The code +** in the READ_UTF8 macro explains things best. +*/ +static const int xtra_utf8_bits[] = { + 0, + 12416, /* (0xC0 << 6) + (0x80) */ + 925824, /* (0xE0 << 12) + (0x80 << 6) + (0x80) */ + 63447168 /* (0xF0 << 18) + (0x80 << 12) + (0x80 << 6) + 0x80 */ +}; + +/* +** If a UTF-8 character contains N bytes extra bytes (N bytes follow +** the initial byte so that the total character length is N+1) then +** masking the character with utf8_mask[N] must produce a non-zero +** result. Otherwise, we have an (illegal) overlong encoding. +*/ +static const int utf_mask[] = { + 0x00000000, + 0xffffff80, + 0xfffff800, + 0xffff0000, +}; + +/* LMH salvaged from sqlite3 3.3.13 source code src/utf.c */ +#define READ_UTF8(zIn, c) { \ + int xtra; \ + c = *(zIn)++; \ + xtra = xtra_utf8_bytes[c]; \ + switch( xtra ){ \ + case 4: c = (int)0xFFFD; break; \ + case 3: c = (c<<6) + *(zIn)++; \ + case 2: c = (c<<6) + *(zIn)++; \ + case 1: c = (c<<6) + *(zIn)++; \ + c -= xtra_utf8_bits[xtra]; \ + if( (utf_mask[xtra]&c)==0 \ + || (c&0xFFFFF800)==0xD800 \ + || (c&0xFFFFFFFE)==0xFFFE ){ c = 0xFFFD; } \ + } \ +} + +static int sqlite3ReadUtf8(const unsigned char *z){ + int c; + READ_UTF8(z, c); + return c; +} + +#define SKIP_UTF8(zIn) { \ + zIn += (xtra_utf8_bytes[*(u8 *)zIn] + 1); \ +} + +/* +** pZ is a UTF-8 encoded unicode string. If nByte is less than zero, +** return the number of unicode characters in pZ up to (but not including) +** the first 0x00 byte. If nByte is not less than zero, return the +** number of unicode characters in the first nByte of pZ (or up to +** the first 0x00, whichever comes first). +*/ +static int sqlite3Utf8CharLen(const char *z, int nByte){ + int r = 0; + const char *zTerm; + if( nByte>=0 ){ + zTerm = &z[nByte]; + }else{ + zTerm = (const char *)(-1); + } + assert( z<=zTerm ); + while( *z!=0 && z 0) ? 1: ( iVal < 0 ) ? -1: 0; + sqlite3_result_int64(context, iVal); + break; + } + case SQLITE_NULL: { + sqlite3_result_null(context); + break; + } + default: { + /* 2nd change below. Line for abs was: if( rVal<0 ) rVal = rVal * -1.0; */ + + rVal = sqlite3_value_double(argv[0]); + rVal = ( rVal > 0) ? 1: ( rVal < 0 ) ? -1: 0; + sqlite3_result_double(context, rVal); + break; + } + } +} + + +/* +** smallest integer value not less than argument +*/ +static void ceilFunc(sqlite3_context *context, int argc, sqlite3_value **argv){ + double rVal=0.0; + i64 iVal=0; + assert( argc==1 ); + switch( sqlite3_value_type(argv[0]) ){ + case SQLITE_INTEGER: { + i64 iVal = sqlite3_value_int64(argv[0]); + sqlite3_result_int64(context, iVal); + break; + } + case SQLITE_NULL: { + sqlite3_result_null(context); + break; + } + default: { + rVal = sqlite3_value_double(argv[0]); + sqlite3_result_int64(context, (i64) ceil(rVal)); + break; + } + } +} + +/* +** largest integer value not greater than argument +*/ +static void floorFunc(sqlite3_context *context, int argc, sqlite3_value **argv){ + double rVal=0.0; + i64 iVal=0; + assert( argc==1 ); + switch( sqlite3_value_type(argv[0]) ){ + case SQLITE_INTEGER: { + i64 iVal = sqlite3_value_int64(argv[0]); + sqlite3_result_int64(context, iVal); + break; + } + case SQLITE_NULL: { + sqlite3_result_null(context); + break; + } + default: { + rVal = sqlite3_value_double(argv[0]); + sqlite3_result_int64(context, (i64) floor(rVal)); + break; + } + } +} + +/* +** Given a string (s) in the first argument and an integer (n) in the second returns the +** string that constains s contatenated n times +*/ +static void replicateFunc(sqlite3_context *context, int argc, sqlite3_value **argv){ + unsigned char *z; /* input string */ + unsigned char *zo; /* result string */ + i64 iCount; /* times to repeat */ + i64 nLen; /* length of the input string (no multibyte considerations) */ + i64 nTLen; /* length of the result string (no multibyte considerations) */ + i64 i=0; + + if( argc!=2 || SQLITE_NULL==sqlite3_value_type(argv[0]) ) + return; + + iCount = sqlite3_value_int64(argv[1]); + + if( iCount<0 ){ + sqlite3_result_error(context, "domain error", -1); + }else{ + + nLen = sqlite3_value_bytes(argv[0]); + nTLen = nLen*iCount; + z=sqlite3_malloc(nTLen+1); + zo=sqlite3_malloc(nLen+1); + if (!z || !zo){ + sqlite3_result_error_nomem(context); + if (z) sqlite3_free(z); + if (zo) sqlite3_free(zo); + return; + } + strcpy((char*)zo, (char*)sqlite3_value_text(argv[0])); + + for(i=0; i=n it's a NOP +** padl(NULL) = NULL +*/ +static void padlFunc(sqlite3_context *context, int argc, sqlite3_value **argv){ + i64 ilen; /* length to pad to */ + i64 zl; /* length of the input string (UTF-8 chars) */ + int i = 0; + const char *zi; /* input string */ + char *zo; /* output string */ + char *zt; + + assert( argc==2 ); + + if( sqlite3_value_type(argv[0]) == SQLITE_NULL ){ + sqlite3_result_null(context); + }else{ + zi = (char *)sqlite3_value_text(argv[0]); + ilen = sqlite3_value_int64(argv[1]); + /* check domain */ + if(ilen<0){ + sqlite3_result_error(context, "domain error", -1); + return; + } + zl = sqlite3Utf8CharLen(zi, -1); + if( zl>=ilen ){ + /* string is longer than the requested pad length, return the same string (dup it) */ + zo = sqlite3StrDup(zi); + if (!zo){ + sqlite3_result_error_nomem(context); + return; + } + sqlite3_result_text(context, zo, -1, SQLITE_TRANSIENT); + }else{ + zo = sqlite3_malloc(strlen(zi)+ilen-zl+1); + if (!zo){ + sqlite3_result_error_nomem(context); + return; + } + zt = zo; + for(i=1; i+zl<=ilen; ++i){ + *(zt++)=' '; + } + /* no need to take UTF-8 into consideration here */ + strcpy(zt,zi); + } + sqlite3_result_text(context, zo, -1, SQLITE_TRANSIENT); + sqlite3_free(zo); + } +} + +/* +** given an input string (s) and an integer (n) appends spaces at the end of s +** until it has a length of n characters. +** When s has a length >=n it's a NOP +** padl(NULL) = NULL +*/ +static void padrFunc(sqlite3_context *context, int argc, sqlite3_value **argv){ + i64 ilen; /* length to pad to */ + i64 zl; /* length of the input string (UTF-8 chars) */ + i64 zll; /* length of the input string (bytes) */ + int i = 0; + const char *zi; /* input string */ + char *zo; /* output string */ + char *zt; + + assert( argc==2 ); + + if( sqlite3_value_type(argv[0]) == SQLITE_NULL ){ + sqlite3_result_null(context); + }else{ + zi = (char *)sqlite3_value_text(argv[0]); + ilen = sqlite3_value_int64(argv[1]); + /* check domain */ + if(ilen<0){ + sqlite3_result_error(context, "domain error", -1); + return; + } + zl = sqlite3Utf8CharLen(zi, -1); + if( zl>=ilen ){ + /* string is longer than the requested pad length, return the same string (dup it) */ + zo = sqlite3StrDup(zi); + if (!zo){ + sqlite3_result_error_nomem(context); + return; + } + sqlite3_result_text(context, zo, -1, SQLITE_TRANSIENT); + }else{ + zll = strlen(zi); + zo = sqlite3_malloc(zll+ilen-zl+1); + if (!zo){ + sqlite3_result_error_nomem(context); + return; + } + zt = strcpy(zo,zi)+zll; + for(i=1; i+zl<=ilen; ++i){ + *(zt++) = ' '; + } + *zt = '\0'; + } + sqlite3_result_text(context, zo, -1, SQLITE_TRANSIENT); + sqlite3_free(zo); + } +} + +/* +** given an input string (s) and an integer (n) appends spaces at the end of s +** and adds spaces at the begining of s until it has a length of n characters. +** Tries to add has many characters at the left as at the right. +** When s has a length >=n it's a NOP +** padl(NULL) = NULL +*/ +static void padcFunc(sqlite3_context *context, int argc, sqlite3_value **argv){ + i64 ilen; /* length to pad to */ + i64 zl; /* length of the input string (UTF-8 chars) */ + i64 zll; /* length of the input string (bytes) */ + int i = 0; + const char *zi; /* input string */ + char *zo; /* output string */ + char *zt; + + assert( argc==2 ); + + if( sqlite3_value_type(argv[0]) == SQLITE_NULL ){ + sqlite3_result_null(context); + }else{ + zi = (char *)sqlite3_value_text(argv[0]); + ilen = sqlite3_value_int64(argv[1]); + /* check domain */ + if(ilen<0){ + sqlite3_result_error(context, "domain error", -1); + return; + } + zl = sqlite3Utf8CharLen(zi, -1); + if( zl>=ilen ){ + /* string is longer than the requested pad length, return the same string (dup it) */ + zo = sqlite3StrDup(zi); + if (!zo){ + sqlite3_result_error_nomem(context); + return; + } + sqlite3_result_text(context, zo, -1, SQLITE_TRANSIENT); + }else{ + zll = strlen(zi); + zo = sqlite3_malloc(zll+ilen-zl+1); + if (!zo){ + sqlite3_result_error_nomem(context); + return; + } + zt = zo; + for(i=1; 2*i+zl<=ilen; ++i){ + *(zt++) = ' '; + } + strcpy(zt, zi); + zt+=zll; + for(; i+zl<=ilen; ++i){ + *(zt++) = ' '; + } + *zt = '\0'; + } + sqlite3_result_text(context, zo, -1, SQLITE_TRANSIENT); + sqlite3_free(zo); + } +} + +/* +** given 2 string (s1,s2) returns the string s1 with the characters NOT in s2 removed +** assumes strings are UTF-8 encoded +*/ +static void strfilterFunc(sqlite3_context *context, int argc, sqlite3_value **argv){ + const char *zi1; /* first parameter string (searched string) */ + const char *zi2; /* second parameter string (vcontains valid characters) */ + const char *z1; + const char *z21; + const char *z22; + char *zo; /* output string */ + char *zot; + int c1 = 0; + int c2 = 0; + + assert( argc==2 ); + + if( sqlite3_value_type(argv[0]) == SQLITE_NULL || sqlite3_value_type(argv[1]) == SQLITE_NULL ){ + sqlite3_result_null(context); + }else{ + zi1 = (char *)sqlite3_value_text(argv[0]); + zi2 = (char *)sqlite3_value_text(argv[1]); + /* + ** maybe I could allocate less, but that would imply 2 passes, rather waste + ** (possibly) some memory + */ + zo = sqlite3_malloc(strlen(zi1)+1); + if (!zo){ + sqlite3_result_error_nomem(context); + return; + } + zot = zo; + z1 = zi1; + while( (c1=sqliteCharVal((unsigned char *)z1))!=0 ){ + z21=zi2; + while( (c2=sqliteCharVal((unsigned char *)z21))!=0 && c2!=c1 ){ + sqliteNextChar(z21); + } + if( c2!=0){ + z22=z21; + sqliteNextChar(z22); + strncpy(zot, z21, z22-z21); + zot+=z22-z21; + } + sqliteNextChar(z1); + } + *zot = '\0'; + + sqlite3_result_text(context, zo, -1, SQLITE_TRANSIENT); + sqlite3_free(zo); + } +} + +/* +** Given a string z1, retutns the (0 based) index of it's first occurence +** in z2 after the first s characters. +** Returns -1 when there isn't a match. +** updates p to point to the character where the match occured. +** This is an auxiliary function. +*/ +static int _substr(const char* z1, const char* z2, int s, const char** p){ + int c = 0; + int rVal=-1; + const char* zt1; + const char* zt2; + int c1,c2; + + if( '\0'==*z1 ){ + return -1; + } + + while( (sqliteCharVal((unsigned char *)z2) != 0) && (c++)=0 ? rVal+s : rVal; +} + +/* +** given 2 input strings (s1,s2) and an integer (n) searches from the nth character +** for the string s1. Returns the position where the match occured. +** Characters are counted from 1. +** 0 is returned when no match occurs. +*/ + +static void charindexFunc(sqlite3_context *context, int argc, sqlite3_value **argv){ + const u8 *z1; /* s1 string */ + u8 *z2; /* s2 string */ + int s=0; + int rVal=0; + + assert( argc==3 ||argc==2); + + if( SQLITE_NULL==sqlite3_value_type(argv[0]) || SQLITE_NULL==sqlite3_value_type(argv[1])){ + sqlite3_result_null(context); + return; + } + + z1 = sqlite3_value_text(argv[0]); + if( z1==0 ) return; + z2 = (u8*) sqlite3_value_text(argv[1]); + if(argc==3){ + s = sqlite3_value_int(argv[2])-1; + if(s<0){ + s=0; + } + }else{ + s = 0; + } + + rVal = _substr((char *)z1,(char *)z2,s,NULL); + sqlite3_result_int(context, rVal+1); +} + +/* +** given a string (s) and an integer (n) returns the n leftmost (UTF-8) characters +** if the string has a length<=n or is NULL this function is NOP +*/ +static void leftFunc(sqlite3_context *context, int argc, sqlite3_value **argv){ + int c=0; + int cc=0; + int l=0; + const unsigned char *z; /* input string */ + const unsigned char *zt; + unsigned char *rz; /* output string */ + + assert( argc==2); + + if( SQLITE_NULL==sqlite3_value_type(argv[0]) || SQLITE_NULL==sqlite3_value_type(argv[1])){ + sqlite3_result_null(context); + return; + } + + z = sqlite3_value_text(argv[0]); + l = sqlite3_value_int(argv[1]); + zt = z; + + while( sqliteCharVal(zt) && c++ 0 ){ + sqliteNextChar(zt); + } + + rz = sqlite3_malloc(ze-zt+1); + if (!rz){ + sqlite3_result_error_nomem(context); + return; + } + strcpy((char*) rz, (char*) (zt)); + sqlite3_result_text(context, (char*)rz, -1, SQLITE_TRANSIENT); + sqlite3_free(rz); +} + +#ifndef HAVE_TRIM +/* +** removes the whitespaces at the begining of a string. +*/ +const char* ltrim(const char* s){ + while( *s==' ' ) + ++s; + return s; +} + +/* +** removes the whitespaces at the end of a string. +** !mutates the input string! +*/ +void rtrim(char* s){ + char* ss = s+strlen(s)-1; + while( ss>=s && *ss==' ' ) + --ss; + *(ss+1)='\0'; +} + +/* +** Removes the whitespace at the begining of a string +*/ +static void ltrimFunc(sqlite3_context *context, int argc, sqlite3_value **argv){ + const char *z; + + assert( argc==1); + + if( SQLITE_NULL==sqlite3_value_type(argv[0]) ){ + sqlite3_result_null(context); + return; + } + z = sqlite3_value_text(argv[0]); + sqlite3_result_text(context, ltrim(z), -1, SQLITE_TRANSIENT); +} + +/* +** Removes the whitespace at the end of a string +*/ +static void rtrimFunc(sqlite3_context *context, int argc, sqlite3_value **argv){ + const char *z; + char *rz; + /* try not to change data in argv */ + + assert( argc==1); + + if( SQLITE_NULL==sqlite3_value_type(argv[0]) ){ + sqlite3_result_null(context); + return; + } + z = sqlite3_value_text(argv[0]); + rz = sqlite3StrDup(z); + rtrim(rz); + sqlite3_result_text(context, rz, -1, SQLITE_TRANSIENT); + sqlite3_free(rz); +} + +/* +** Removes the whitespace at the begining and end of a string +*/ +static void trimFunc(sqlite3_context *context, int argc, sqlite3_value **argv){ + const char *z; + char *rz; + /* try not to change data in argv */ + + assert( argc==1); + + if( SQLITE_NULL==sqlite3_value_type(argv[0]) ){ + sqlite3_result_null(context); + return; + } + z = sqlite3_value_text(argv[0]); + rz = sqlite3StrDup(z); + rtrim(rz); + sqlite3_result_text(context, ltrim(rz), -1, SQLITE_TRANSIENT); + sqlite3_free(rz); +} +#endif + +/* +** given a pointer to a string s1, the length of that string (l1), a new string (s2) +** and it's length (l2) appends s2 to s1. +** All lengths in bytes. +** This is just an auxiliary function +*/ +// static void _append(char **s1, int l1, const char *s2, int l2){ +// *s1 = realloc(*s1, (l1+l2+1)*sizeof(char)); +// strncpy((*s1)+l1, s2, l2); +// *(*(s1)+l1+l2) = '\0'; +// } + +#ifndef HAVE_TRIM + +/* +** given strings s, s1 and s2 replaces occurrences of s1 in s by s2 +*/ +static void replaceFunc(sqlite3_context *context, int argc, sqlite3_value **argv){ + const char *z1; /* string s (first parameter) */ + const char *z2; /* string s1 (second parameter) string to look for */ + const char *z3; /* string s2 (third parameter) string to replace occurrences of s1 with */ + int lz1; + int lz2; + int lz3; + int lzo=0; + char *zo=0; + int ret=0; + const char *zt1; + const char *zt2; + + assert( 3==argc ); + + if( SQLITE_NULL==sqlite3_value_type(argv[0]) ){ + sqlite3_result_null(context); + return; + } + + z1 = sqlite3_value_text(argv[0]); + z2 = sqlite3_value_text(argv[1]); + z3 = sqlite3_value_text(argv[2]); + /* handle possible null values */ + if( 0==z2 ){ + z2=""; + } + if( 0==z3 ){ + z3=""; + } + + lz1 = strlen(z1); + lz2 = strlen(z2); + lz3 = strlen(z3); + +#if 0 + /* special case when z2 is empty (or null) nothing will be changed */ + if( 0==lz2 ){ + sqlite3_result_text(context, z1, -1, SQLITE_TRANSIENT); + return; + } +#endif + + zt1=z1; + zt2=z1; + + while(1){ + ret=_substr(z2,zt1 , 0, &zt2); + + if( ret<0 ) + break; + + _append(&zo, lzo, zt1, zt2-zt1); + lzo+=zt2-zt1; + _append(&zo, lzo, z3, lz3); + lzo+=lz3; + + zt1=zt2+lz2; + } + _append(&zo, lzo, zt1, lz1-(zt1-z1)); + sqlite3_result_text(context, zo, -1, SQLITE_TRANSIENT); + sqlite3_free(zo); +} +#endif + +/* +** given a string returns the same string but with the characters in reverse order +*/ +static void reverseFunc(sqlite3_context *context, int argc, sqlite3_value **argv){ + const char *z; + const char *zt; + char *rz; + char *rzt; + int l = 0; + int i = 0; + + assert( 1==argc ); + + if( SQLITE_NULL==sqlite3_value_type(argv[0]) ){ + sqlite3_result_null(context); + return; + } + z = (char *)sqlite3_value_text(argv[0]); + l = strlen(z); + rz = sqlite3_malloc(l+1); + if (!rz){ + sqlite3_result_error_nomem(context); + return; + } + rzt = rz+l; + *(rzt--) = '\0'; + + zt=z; + while( sqliteCharVal((unsigned char *)zt)!=0 ){ + z=zt; + sqliteNextChar(zt); + for(i=1; zt-i>=z; ++i){ + *(rzt--)=*(zt-i); + } + } + + sqlite3_result_text(context, rz, -1, SQLITE_TRANSIENT); + sqlite3_free(rz); +} + +/* +** An instance of the following structure holds the context of a +** stdev() or variance() aggregate computation. +** implementaion of http://en.wikipedia.org/wiki/Algorithms_for_calculating_variance#Algorithm_II +** less prone to rounding errors +*/ +typedef struct StdevCtx StdevCtx; +struct StdevCtx { + double rM; + double rS; + i64 cnt; /* number of elements */ +}; + +/* +** An instance of the following structure holds the context of a +** mode() or median() aggregate computation. +** Depends on structures defined in map.c (see map & map) +** These aggregate functions only work for integers and floats although +** they could be made to work for strings. This is usually considered meaningless. +** Only usuall order (for median), no use of collation functions (would this even make sense?) +*/ +typedef struct ModeCtx ModeCtx; +struct ModeCtx { + i64 riM; /* integer value found so far */ + double rdM; /* double value found so far */ + i64 cnt; /* number of elements so far */ + double pcnt; /* number of elements smaller than a percentile */ + i64 mcnt; /* maximum number of occurrences (for mode) */ + i64 mn; /* number of occurrences (for mode and percentiles) */ + i64 is_double; /* whether the computation is being done for doubles (>0) or integers (=0) */ + map* m; /* map structure used for the computation */ + int done; /* whether the answer has been found */ +}; + +/* +** called for each value received during a calculation of stdev or variance +*/ +static void varianceStep(sqlite3_context *context, int argc, sqlite3_value **argv){ + StdevCtx *p; + + double delta; + double x; + + assert( argc==1 ); + p = sqlite3_aggregate_context(context, sizeof(*p)); + /* only consider non-null values */ + if( SQLITE_NULL != sqlite3_value_numeric_type(argv[0]) ){ + p->cnt++; + x = sqlite3_value_double(argv[0]); + delta = (x-p->rM); + p->rM += delta/p->cnt; + p->rS += delta*(x-p->rM); + } +} + +/* +** called for each value received during a calculation of mode of median +*/ +static void modeStep(sqlite3_context *context, int argc, sqlite3_value **argv){ + ModeCtx *p; + i64 xi=0; + double xd=0.0; + i64 *iptr; + double *dptr; + int type; + + assert( argc==1 ); + type = sqlite3_value_numeric_type(argv[0]); + + if( type == SQLITE_NULL) + return; + + p = sqlite3_aggregate_context(context, sizeof(*p)); + + if( 0==(p->m) ){ + p->m = calloc(1, sizeof(map)); + if( type==SQLITE_INTEGER ){ + /* map will be used for integers */ + *(p->m) = map_make(int_cmp); + p->is_double = 0; + }else{ + p->is_double = 1; + /* map will be used for doubles */ + *(p->m) = map_make(double_cmp); + } + } + + ++(p->cnt); + + if( 0==p->is_double ){ + xi = sqlite3_value_int64(argv[0]); + iptr = (i64*)calloc(1,sizeof(i64)); + *iptr = xi; + map_insert(p->m, iptr); + }else{ + xd = sqlite3_value_double(argv[0]); + dptr = (double*)calloc(1,sizeof(double)); + *dptr = xd; + map_insert(p->m, dptr); + } +} + +/* +** Auxiliary function that iterates all elements in a map and finds the mode +** (most frequent value) +*/ +static void modeIterate(void* e, i64 c, void* pp){ + i64 ei; + double ed; + ModeCtx *p = (ModeCtx*)pp; + + if( 0==p->is_double ){ + ei = *(int*)(e); + + if( p->mcnt==c ){ + ++p->mn; + }else if( p->mcntriM = ei; + p->mcnt = c; + p->mn=1; + } + }else{ + ed = *(double*)(e); + + if( p->mcnt==c ){ + ++p->mn; + }else if(p->mcntrdM = ed; + p->mcnt = c; + p->mn=1; + } + } +} + +/* +** Auxiliary function that iterates all elements in a map and finds the median +** (the value such that the number of elements smaller is equal the the number of +** elements larger) +*/ +static void medianIterate(void* e, i64 c, void* pp){ + i64 ei; + double ed; + double iL; + double iR; + int il; + int ir; + ModeCtx *p = (ModeCtx*)pp; + + if(p->done>0) + return; + + iL = p->pcnt; + iR = p->cnt - p->pcnt; + il = p->mcnt + c; + ir = p->cnt - p->mcnt; + + if( il >= iL ){ + if( ir >= iR ){ + ++p->mn; + if( 0==p->is_double ){ + ei = *(int*)(e); + p->riM += ei; + }else{ + ed = *(double*)(e); + p->rdM += ed; + } + }else{ + p->done=1; + } + } + p->mcnt+=c; +} + +/* +** Returns the mode value +*/ +static void modeFinalize(sqlite3_context *context){ + ModeCtx *p; + p = sqlite3_aggregate_context(context, 0); + if( p && p->m ){ + map_iterate(p->m, modeIterate, p); + map_destroy(p->m); + free(p->m); + + if( 1==p->mn ){ + if( 0==p->is_double ) + sqlite3_result_int64(context, p->riM); + else + sqlite3_result_double(context, p->rdM); + } + } +} + +/* +** auxiliary function for percentiles +*/ +static void _medianFinalize(sqlite3_context *context){ + ModeCtx *p; + p = (ModeCtx*) sqlite3_aggregate_context(context, 0); + if( p && p->m ){ + p->done=0; + map_iterate(p->m, medianIterate, p); + map_destroy(p->m); + free(p->m); + + if( 0==p->is_double ) + if( 1==p->mn ) + sqlite3_result_int64(context, p->riM); + else + sqlite3_result_double(context, p->riM*1.0/p->mn); + else + sqlite3_result_double(context, p->rdM/p->mn); + } +} + +/* +** Returns the median value +*/ +static void medianFinalize(sqlite3_context *context){ + ModeCtx *p; + p = (ModeCtx*) sqlite3_aggregate_context(context, 0); + if( p!=0 ){ + p->pcnt = (p->cnt)/2.0; + _medianFinalize(context); + } +} + +/* +** Returns the lower_quartile value +*/ +static void lower_quartileFinalize(sqlite3_context *context){ + ModeCtx *p; + p = (ModeCtx*) sqlite3_aggregate_context(context, 0); + if( p!=0 ){ + p->pcnt = (p->cnt)/4.0; + _medianFinalize(context); + } +} + +/* +** Returns the upper_quartile value +*/ +static void upper_quartileFinalize(sqlite3_context *context){ + ModeCtx *p; + p = (ModeCtx*) sqlite3_aggregate_context(context, 0); + if( p!=0 ){ + p->pcnt = (p->cnt)*3/4.0; + _medianFinalize(context); + } +} + +/* +** Returns the stdev value +*/ +static void stdevFinalize(sqlite3_context *context){ + StdevCtx *p; + p = sqlite3_aggregate_context(context, 0); + if( p && p->cnt>1 ){ + sqlite3_result_double(context, sqrt(p->rS/(p->cnt-1))); + }else{ + sqlite3_result_double(context, 0.0); + } +} + +/* +** Returns the variance value +*/ +static void varianceFinalize(sqlite3_context *context){ + StdevCtx *p; + p = sqlite3_aggregate_context(context, 0); + if( p && p->cnt>1 ){ + sqlite3_result_double(context, p->rS/(p->cnt-1)); + }else{ + sqlite3_result_double(context, 0.0); + } +} + +#ifdef SQLITE_SOUNDEX + +/* relicoder factored code */ +/* +** Calculates the soundex value of a string +*/ + +static void soundex(const u8 *zIn, char *zResult){ + int i, j; + static const unsigned char iCode[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 2, 3, 0, 1, 2, 0, 0, 2, 2, 4, 5, 5, 0, + 1, 2, 6, 2, 3, 0, 1, 0, 2, 0, 2, 0, 0, 0, 0, 0, + 0, 0, 1, 2, 3, 0, 1, 2, 0, 0, 2, 2, 4, 5, 5, 0, + 1, 2, 6, 2, 3, 0, 1, 0, 2, 0, 2, 0, 0, 0, 0, 0, + }; + + for(i=0; zIn[i] && !isalpha(zIn[i]); i++){} + if( zIn[i] ){ + zResult[0] = toupper(zIn[i]); + for(j=1; j<4 && zIn[i]; i++){ + int code = iCode[zIn[i]&0x7f]; + if( code>0 ){ + zResult[j++] = code + '0'; + } + } + while( j<4 ){ + zResult[j++] = '0'; + } + zResult[j] = 0; + }else{ + strcpy(zResult, "?000"); + } +} + +/* +** computes the number of different characters between the soundex value fo 2 strings +*/ +static void differenceFunc(sqlite3_context *context, int argc, sqlite3_value **argv){ + char zResult1[8]; + char zResult2[8]; + char *zR1 = zResult1; + char *zR2 = zResult2; + int rVal = 0; + int i = 0; + const u8 *zIn1; + const u8 *zIn2; + + assert( argc==2 ); + + if( sqlite3_value_type(argv[0])==SQLITE_NULL || sqlite3_value_type(argv[1])==SQLITE_NULL ){ + sqlite3_result_null(context); + return; + } + + zIn1 = (u8*)sqlite3_value_text(argv[0]); + zIn2 = (u8*)sqlite3_value_text(argv[1]); + + soundex(zIn1, zR1); + soundex(zIn2, zR2); + + for(i=0; i<4; ++i){ + if( sqliteCharVal((unsigned char *)zR1)==sqliteCharVal((unsigned char *)zR2) ) + ++rVal; + sqliteNextChar(zR1); + sqliteNextChar(zR2); + } + sqlite3_result_int(context, rVal); +} +#endif + +/* +** This function registered all of the above C functions as SQL +** functions. This should be the only routine in this file with +** external linkage. +*/ +int RegisterExtensionFunctions(sqlite3 *db){ + static const struct FuncDef { + char *zName; + signed char nArg; + u8 argType; /* 0: none. 1: db 2: (-1) */ + u8 eTextRep; /* 1: UTF-16. 0: UTF-8 */ + u8 needCollSeq; + void (*xFunc)(sqlite3_context*,int,sqlite3_value **); + } aFuncs[] = { + /* math.h */ + { "acos", 1, 0, SQLITE_UTF8, 0, acosFunc }, + { "asin", 1, 0, SQLITE_UTF8, 0, asinFunc }, + { "atan", 1, 0, SQLITE_UTF8, 0, atanFunc }, + { "atn2", 2, 0, SQLITE_UTF8, 0, atn2Func }, + /* XXX alias */ + { "atan2", 2, 0, SQLITE_UTF8, 0, atn2Func }, + { "acosh", 1, 0, SQLITE_UTF8, 0, acoshFunc }, + { "asinh", 1, 0, SQLITE_UTF8, 0, asinhFunc }, + { "atanh", 1, 0, SQLITE_UTF8, 0, atanhFunc }, + + { "difference", 2, 0, SQLITE_UTF8, 0, differenceFunc}, + { "degrees", 1, 0, SQLITE_UTF8, 0, rad2degFunc }, + { "radians", 1, 0, SQLITE_UTF8, 0, deg2radFunc }, + + { "cos", 1, 0, SQLITE_UTF8, 0, cosFunc }, + { "sin", 1, 0, SQLITE_UTF8, 0, sinFunc }, + { "tan", 1, 0, SQLITE_UTF8, 0, tanFunc }, + { "cot", 1, 0, SQLITE_UTF8, 0, cotFunc }, + { "cosh", 1, 0, SQLITE_UTF8, 0, coshFunc }, + { "sinh", 1, 0, SQLITE_UTF8, 0, sinhFunc }, + { "tanh", 1, 0, SQLITE_UTF8, 0, tanhFunc }, + { "coth", 1, 0, SQLITE_UTF8, 0, cothFunc }, + + { "exp", 1, 0, SQLITE_UTF8, 0, expFunc }, + { "log", 1, 0, SQLITE_UTF8, 0, logFunc }, + { "log10", 1, 0, SQLITE_UTF8, 0, log10Func }, + { "power", 2, 0, SQLITE_UTF8, 0, powerFunc }, + { "sign", 1, 0, SQLITE_UTF8, 0, signFunc }, + { "sqrt", 1, 0, SQLITE_UTF8, 0, sqrtFunc }, + { "square", 1, 0, SQLITE_UTF8, 0, squareFunc }, + + { "ceil", 1, 0, SQLITE_UTF8, 0, ceilFunc }, + { "floor", 1, 0, SQLITE_UTF8, 0, floorFunc }, + + { "pi", 0, 0, SQLITE_UTF8, 1, piFunc }, + + + /* string */ + { "replicate", 2, 0, SQLITE_UTF8, 0, replicateFunc }, + { "charindex", 2, 0, SQLITE_UTF8, 0, charindexFunc }, + { "charindex", 3, 0, SQLITE_UTF8, 0, charindexFunc }, + { "leftstr", 2, 0, SQLITE_UTF8, 0, leftFunc }, + { "rightstr", 2, 0, SQLITE_UTF8, 0, rightFunc }, +#ifndef HAVE_TRIM + { "ltrim", 1, 0, SQLITE_UTF8, 0, ltrimFunc }, + { "rtrim", 1, 0, SQLITE_UTF8, 0, rtrimFunc }, + { "trim", 1, 0, SQLITE_UTF8, 0, trimFunc }, + { "replace", 3, 0, SQLITE_UTF8, 0, replaceFunc }, +#endif + { "reverse", 1, 0, SQLITE_UTF8, 0, reverseFunc }, + { "proper", 1, 0, SQLITE_UTF8, 0, properFunc }, + { "padl", 2, 0, SQLITE_UTF8, 0, padlFunc }, + { "padr", 2, 0, SQLITE_UTF8, 0, padrFunc }, + { "padc", 2, 0, SQLITE_UTF8, 0, padcFunc }, + { "strfilter", 2, 0, SQLITE_UTF8, 0, strfilterFunc }, + + }; + /* Aggregate functions */ + static const struct FuncDefAgg { + char *zName; + signed char nArg; + u8 argType; + u8 needCollSeq; + void (*xStep)(sqlite3_context*,int,sqlite3_value**); + void (*xFinalize)(sqlite3_context*); + } aAggs[] = { + { "stdev", 1, 0, 0, varianceStep, stdevFinalize }, + { "variance", 1, 0, 0, varianceStep, varianceFinalize }, + { "mode", 1, 0, 0, modeStep, modeFinalize }, + { "median", 1, 0, 0, modeStep, medianFinalize }, + { "lower_quartile", 1, 0, 0, modeStep, lower_quartileFinalize }, + { "upper_quartile", 1, 0, 0, modeStep, upper_quartileFinalize }, + }; + int i; + + for(i=0; ineedCollSeq = 1; + } + } +#endif + } + + for(i=0; ineedCollSeq = 1; + } + } +#endif + } + return 0; +} + +#ifdef COMPILE_SQLITE_EXTENSIONS_AS_LOADABLE_MODULE +int sqlite3_extension_init( + sqlite3 *db, char **pzErrMsg, const sqlite3_api_routines *pApi){ + SQLITE_EXTENSION_INIT2(pApi); + RegisterExtensionFunctions(db); + return 0; +} +#endif /* COMPILE_SQLITE_EXTENSIONS_AS_LOADABLE_MODULE */ + +map map_make(cmp_func cmp){ + map r; + r.cmp=cmp; + r.base = 0; + + return r; +} + +void* xcalloc(size_t nmemb, size_t size, char* s){ + void* ret = calloc(nmemb, size); + return ret; +} + +void xfree(void* p){ + free(p); +} + +void node_insert(node** n, cmp_func cmp, void *e){ + int c; + node* nn; + if(*n==0){ + nn = (node*)xcalloc(1,sizeof(node), "for node"); + nn->data = e; + nn->count = 1; + *n=nn; + }else{ + c=cmp((*n)->data,e); + if(0==c){ + ++((*n)->count); + xfree(e); + }else if(c>0){ + /* put it right here */ + node_insert(&((*n)->l), cmp, e); + }else{ + node_insert(&((*n)->r), cmp, e); + } + } +} + +void map_insert(map *m, void *e){ + node_insert(&(m->base), m->cmp, e); +} + +void node_iterate(node *n, map_iterator iter, void* p){ + if(n){ + if(n->l) + node_iterate(n->l, iter, p); + iter(n->data, n->count, p); + if(n->r) + node_iterate(n->r, iter, p); + } +} + +void map_iterate(map *m, map_iterator iter, void* p){ + node_iterate(m->base, iter, p); +} + +void node_destroy(node *n){ + if(0!=n){ + xfree(n->data); + if(n->l) + node_destroy(n->l); + if(n->r) + node_destroy(n->r); + + xfree(n); + } +} + +void map_destroy(map *m){ + node_destroy(m->base); +} + +int int_cmp(const void *a, const void *b){ + int64_t aa = *(int64_t *)(a); + int64_t bb = *(int64_t *)(b); + /* printf("cmp %d <=> %d\n",aa,bb); */ + if(aa==bb) + return 0; + else if(aa %d\n",aa,bb); */ + if(aa==bb) + return 0; + else if(aa %lld\n", ee,c); +} + diff -Nru sqlitebrowser-3.10.100ubuntu1/src/extensions/extension-functions.def sqlitebrowser-3.11.1/src/extensions/extension-functions.def --- sqlitebrowser-3.10.100ubuntu1/src/extensions/extension-functions.def 1970-01-01 00:00:00.000000000 +0000 +++ sqlitebrowser-3.11.1/src/extensions/extension-functions.def 2019-02-19 23:51:34.000000000 +0000 @@ -0,0 +1,16 @@ +EXPORTS + RegisterExtensionFunctions + double_cmp + int_cmp + map_destroy + map_insert + map_iterate + map_make + node_destroy + node_insert + node_iterate + print_elem + sqlite3_api + sqlite3_extension_init + xcalloc + xfree diff -Nru sqlitebrowser-3.10.100ubuntu1/src/FileDialog.cpp sqlitebrowser-3.11.1/src/FileDialog.cpp --- sqlitebrowser-3.10.100ubuntu1/src/FileDialog.cpp 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/src/FileDialog.cpp 2019-02-19 23:51:34.000000000 +0000 @@ -1,52 +1,55 @@ #include "FileDialog.h" #include "Settings.h" -QString FileDialog::getOpenFileName(QWidget* parent, const QString& caption, const QString &filter, QString *selectedFilter, Options options) +QString FileDialog::getOpenFileName(const FileDialogTypes dialogType, QWidget* parent, const QString& caption, const QString &filter, QString *selectedFilter, Options options) { - QString result = QFileDialog::getOpenFileName(parent, caption, getFileDialogPath(), filter, selectedFilter, options); + QString result = QFileDialog::getOpenFileName(parent, caption, getFileDialogPath(dialogType), filter, selectedFilter, options); if(!result.isEmpty()) - setFileDialogPath(result); + setFileDialogPath(dialogType, result); return result; } -QStringList FileDialog::getOpenFileNames(QWidget *parent, const QString &caption, const QString &filter, QString *selectedFilter, QFileDialog::Options options) +QStringList FileDialog::getOpenFileNames(const FileDialogTypes dialogType, QWidget *parent, const QString &caption, const QString &filter, QString *selectedFilter, QFileDialog::Options options) { - QStringList result = QFileDialog::getOpenFileNames(parent, caption, getFileDialogPath(), filter, selectedFilter, options); + QStringList result = QFileDialog::getOpenFileNames(parent, caption, getFileDialogPath(dialogType), filter, selectedFilter, options); if(!result.isEmpty()) { QFileInfo path = QFileInfo(result.first()); - setFileDialogPath(path.absolutePath()); + setFileDialogPath(dialogType, path.absolutePath()); } return result; } -QString FileDialog::getSaveFileName(QWidget* parent, const QString& caption, const QString& filter, const QString& defaultFileName, QString* selectedFilter, Options options) +QString FileDialog::getSaveFileName(const FileDialogTypes dialogType, QWidget* parent, const QString& caption, const QString& filter, const QString& defaultFileName, QString* selectedFilter, Options options) { - QString dir = getFileDialogPath(); + QString dir = getFileDialogPath(dialogType); if(!defaultFileName.isEmpty()) dir += "/" + defaultFileName; QString result = QFileDialog::getSaveFileName(parent, caption, dir, filter, selectedFilter, options); if(!result.isEmpty()) - setFileDialogPath(result); + setFileDialogPath(dialogType, result); return result; } -QString FileDialog::getExistingDirectory(QWidget* parent, const QString& caption, Options options) +QString FileDialog::getExistingDirectory(const FileDialogTypes dialogType, QWidget* parent, const QString& caption, Options options) { - QString result = QFileDialog::getExistingDirectory(parent, caption, getFileDialogPath(), options); + QString result = QFileDialog::getExistingDirectory(parent, caption, getFileDialogPath(dialogType), options); if(!result.isEmpty()) - setFileDialogPath(result); + setFileDialogPath(dialogType, result); return result; } -QString FileDialog::getFileDialogPath() +QString FileDialog::getFileDialogPath(const FileDialogTypes dialogType) { switch(Settings::getValue("db", "savedefaultlocation").toInt()) { case 0: // Remember last location - case 2: // Remember last location for current session only - return Settings::getValue("db", "lastlocation").toString(); + case 2: { // Remember last location for current session only + QHash lastLocations = Settings::getValue("db", "lastlocations").toHash(); + + return lastLocations[QString(dialogType)].toString(); + } case 1: // Always use this locations return Settings::getValue("db", "defaultlocation").toString(); default: @@ -54,17 +57,20 @@ } } -void FileDialog::setFileDialogPath(const QString& new_path) +void FileDialog::setFileDialogPath(const FileDialogTypes dialogType, const QString& new_path) { QString dir = QFileInfo(new_path).absolutePath(); + QHash lastLocations = Settings::getValue("db", "lastlocations").toHash(); + + lastLocations[QString(dialogType)] = dir; switch(Settings::getValue("db", "savedefaultlocation").toInt()) { case 0: // Remember last location - Settings::setValue("db", "lastlocation", dir); + Settings::setValue("db", "lastlocations", lastLocations); break; case 2: // Remember last location for current session only - Settings::setValue("db", "lastlocation", dir, true); + Settings::setValue("db", "lastlocations", lastLocations, true); break; case 1: // Always use this locations break; // Do nothing diff -Nru sqlitebrowser-3.10.100ubuntu1/src/FileDialog.h sqlitebrowser-3.11.1/src/FileDialog.h --- sqlitebrowser-3.10.100ubuntu1/src/FileDialog.h 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/src/FileDialog.h 2019-02-19 23:51:34.000000000 +0000 @@ -3,28 +3,49 @@ #include +enum FileDialogTypes { + NoSpecificType, + + CreateProjectFile, + OpenProjectFile, + + CreateDatabaseFile, + OpenDatabaseFile, + + CreateSQLFile, + OpenSQLFile, + + OpenCSVFile, + + CreateDataFile, + OpenDataFile, + + OpenExtensionFile, + OpenCertificateFile +}; + class FileDialog : public QFileDialog { Q_OBJECT public: - static QString getOpenFileName(QWidget* parent = nullptr, const QString& caption = QString(), + static QString getOpenFileName(const FileDialogTypes dialogType, QWidget* parent = nullptr, const QString& caption = QString(), const QString& filter = QString(), QString* selectedFilter = nullptr, Options options = 0); - static QStringList getOpenFileNames(QWidget* parent = nullptr, const QString& caption = QString(), + static QStringList getOpenFileNames(const FileDialogTypes dialogType, QWidget* parent = nullptr, const QString& caption = QString(), const QString& filter = QString(), QString* selectedFilter = nullptr, Options options = 0); - static QString getSaveFileName(QWidget* parent = nullptr, const QString& caption = QString(), + static QString getSaveFileName(const FileDialogTypes dialogType, QWidget* parent = nullptr, const QString& caption = QString(), const QString& filter = QString(), const QString& defaultFileName = QString(), QString* selectedFilter = nullptr, Options options = 0); - static QString getExistingDirectory(QWidget* parent = nullptr, const QString& caption = QString(), + static QString getExistingDirectory(const FileDialogTypes dialogType, QWidget* parent = nullptr, const QString& caption = QString(), Options options = 0); static QString getSqlDatabaseFileFilter(); private: - static QString getFileDialogPath(); - static void setFileDialogPath(const QString& new_path); + static QString getFileDialogPath(const FileDialogTypes dialogType); + static void setFileDialogPath(const FileDialogTypes dialogType, const QString& new_path); }; #endif diff -Nru sqlitebrowser-3.10.100ubuntu1/src/FileExtensionManager.cpp sqlitebrowser-3.11.1/src/FileExtensionManager.cpp --- sqlitebrowser-3.10.100ubuntu1/src/FileExtensionManager.cpp 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/src/FileExtensionManager.cpp 2019-02-19 23:51:34.000000000 +0000 @@ -8,20 +8,18 @@ ui->setupUi(this); int i = 0; - foreach(QString itemString, init) + for(const QString& itemString : init) { QString description = itemString.left(itemString.indexOf('(')).trimmed(); QString extension = itemString; extension = extension.remove (0, itemString.indexOf('(')+1).remove(')').simplified().trimmed(); - if ( extension.compare("*") != 0 ) //We exclude "All files" from the table - { - QTableWidgetItem *newItemDescription = new QTableWidgetItem(description); - QTableWidgetItem *newItemExtension = new QTableWidgetItem(extension); - ui->tableExtensions->insertRow(i); - ui->tableExtensions->setItem(i, 0, newItemDescription); - ui->tableExtensions->setItem(i, 1, newItemExtension); - i++; - } + + QTableWidgetItem *newItemDescription = new QTableWidgetItem(description); + QTableWidgetItem *newItemExtension = new QTableWidgetItem(extension); + ui->tableExtensions->insertRow(i); + ui->tableExtensions->setItem(i, 0, newItemDescription); + ui->tableExtensions->setItem(i, 1, newItemExtension); + i++; } connect(ui->buttonAdd, SIGNAL(clicked(bool)), this, SLOT(addItem())); @@ -49,7 +47,7 @@ void FileExtensionManager::removeItem() { QList selectedRows; - foreach (QTableWidgetItem *item, ui->tableExtensions->selectedItems()) + for (const QTableWidgetItem* item : ui->tableExtensions->selectedItems()) { if (selectedRows.contains(item->row()) == false) { diff -Nru sqlitebrowser-3.10.100ubuntu1/src/FileExtensionManager.h sqlitebrowser-3.11.1/src/FileExtensionManager.h --- sqlitebrowser-3.10.100ubuntu1/src/FileExtensionManager.h 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/src/FileExtensionManager.h 2019-02-19 23:51:34.000000000 +0000 @@ -13,7 +13,7 @@ public: explicit FileExtensionManager(QStringList init, QWidget *parent = nullptr); - ~FileExtensionManager(); + ~FileExtensionManager() override; QStringList getDBFileExtensions(); diff -Nru sqlitebrowser-3.10.100ubuntu1/src/FileExtensionManager.ui sqlitebrowser-3.11.1/src/FileExtensionManager.ui --- sqlitebrowser-3.10.100ubuntu1/src/FileExtensionManager.ui 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/src/FileExtensionManager.ui 2019-02-19 23:51:34.000000000 +0000 @@ -11,7 +11,7 @@ - Dialog + File Extension Manager diff -Nru sqlitebrowser-3.10.100ubuntu1/src/FilterLineEdit.cpp sqlitebrowser-3.11.1/src/FilterLineEdit.cpp --- sqlitebrowser-3.10.100ubuntu1/src/FilterLineEdit.cpp 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/src/FilterLineEdit.cpp 2019-02-19 23:51:34.000000000 +0000 @@ -3,6 +3,8 @@ #include #include +#include +#include FilterLineEdit::FilterLineEdit(QWidget* parent, QList* filters, int columnnum) : QLineEdit(parent), filterList(filters), columnNumber(columnnum) { @@ -30,11 +32,16 @@ "<=\tEqual to or less\n" "=\tEqual to: exact match\n" "<>\tUnequal: exact inverse match\n" - "x~y\tRange: values between x and y")); + "x~y\tRange: values between x and y\n" + "/regexp/\tValues matching the regular expression")); // Immediately emit the delayed filter value changed signal if the user presses the enter or the return key or // the line edit widget loses focus connect(this, SIGNAL(editingFinished()), this, SLOT(delayedSignalTimerTriggered())); + + // Prepare for adding the What's This information and filter helper actions to the context menu + setContextMenuPolicy(Qt::CustomContextMenu); + connect(this, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(showContextMenu(const QPoint &))); } void FilterLineEdit::delayedSignalTimerTriggered() @@ -87,3 +94,112 @@ QLineEdit::setText(text); delayedSignalTimerTriggered(); } + +void FilterLineEdit::setFilterHelper(const QString& filterOperator, const QString& operatorSuffix) +{ + setText(filterOperator + "?" + operatorSuffix); + // Select the value for easy editing of the expression + setSelection(filterOperator.length(), 1); +} + +void FilterLineEdit::showContextMenu(const QPoint &pos) +{ + + // This has to be created here, otherwise the set of enabled options would not update accordingly. + QMenu* editContextMenu = createStandardContextMenu(); + editContextMenu->addSeparator(); + QString conditionalFormatLabel = text().isEmpty() ? tr("Clear All Conditional Formats") : tr("Use for Conditional Format"); + QAction* conditionalFormatAction = new QAction(conditionalFormatLabel, editContextMenu); + connect(conditionalFormatAction, &QAction::triggered, [&]() { + if (text().isEmpty()) + emit clearAllCondFormats(); + else + emit addFilterAsCondFormat(text()); + }); + editContextMenu->addSeparator(); + + QMenu* filterMenu = editContextMenu->addMenu(tr("Set Filter Expression")); + + QAction* whatsThisAction = new QAction(QIcon(":/icons/whatis"), tr("What's This?"), editContextMenu); + connect(whatsThisAction, &QAction::triggered, [&]() { + QWhatsThis::showText(pos, whatsThis(), this); + }); + + QAction* isNullAction = new QAction(tr("Is NULL"), editContextMenu); + connect(isNullAction, &QAction::triggered, [&]() { + setText("=NULL"); + }); + + QAction* isNotNullAction = new QAction(tr("Is not NULL"), editContextMenu); + connect(isNotNullAction, &QAction::triggered, [&]() { + setText("<>NULL"); + }); + + QAction* isEmptyAction = new QAction(tr("Is empty"), editContextMenu); + connect(isEmptyAction, &QAction::triggered, [&]() { + setText("=''"); + }); + + QAction* isNotEmptyAction = new QAction(tr("Is not empty"), editContextMenu); + connect(isNotEmptyAction, &QAction::triggered, [&]() { + setText("<>''"); + }); + // Simplify this if we ever support a NOT LIKE filter + QAction* notContainingAction = new QAction(tr("Not containing..."), editContextMenu); + connect(notContainingAction, &QAction::triggered, [&]() { + setFilterHelper(QString ("/^((?!"), QString(").)*$/")); + }); + QAction* equalToAction = new QAction(tr("Equal to..."), editContextMenu); + connect(equalToAction, &QAction::triggered, [&]() { + setFilterHelper(QString ("=")); + }); + QAction* notEqualToAction = new QAction(tr("Not equal to..."), editContextMenu); + connect(notEqualToAction, &QAction::triggered, [&]() { + setFilterHelper(QString ("<>")); + }); + QAction* greaterThanAction = new QAction(tr("Greater than..."), editContextMenu); + connect(greaterThanAction, &QAction::triggered, [&]() { + setFilterHelper(QString (">")); + }); + QAction* lessThanAction = new QAction(tr("Less than..."), editContextMenu); + connect(lessThanAction, &QAction::triggered, [&]() { + setFilterHelper(QString ("<")); + }); + QAction* greaterEqualAction = new QAction(tr("Greater or equal..."), editContextMenu); + connect(greaterEqualAction, &QAction::triggered, [&]() { + setFilterHelper(QString (">=")); + }); + QAction* lessEqualAction = new QAction(tr("Less or equal..."), editContextMenu); + connect(lessEqualAction, &QAction::triggered, [&]() { + setFilterHelper(QString ("<=")); + }); + QAction* inRangeAction = new QAction(tr("In range..."), editContextMenu); + connect(inRangeAction, &QAction::triggered, [&]() { + setFilterHelper(QString ("?~")); + }); + + QAction* regexpAction = new QAction(tr("Regular expression..."), editContextMenu); + connect(regexpAction, &QAction::triggered, [&]() { + setFilterHelper(QString ("/"), QString ("/")); + }); + + editContextMenu->addAction(conditionalFormatAction); + + filterMenu->addAction(whatsThisAction); + filterMenu->addSeparator(); + filterMenu->addAction(isNullAction); + filterMenu->addAction(isNotNullAction); + filterMenu->addAction(isEmptyAction); + filterMenu->addAction(isNotEmptyAction); + filterMenu->addSeparator(); + filterMenu->addAction(notContainingAction); + filterMenu->addAction(equalToAction); + filterMenu->addAction(notEqualToAction); + filterMenu->addAction(greaterThanAction); + filterMenu->addAction(lessThanAction); + filterMenu->addAction(greaterEqualAction); + filterMenu->addAction(lessEqualAction); + filterMenu->addAction(inRangeAction); + filterMenu->addAction(regexpAction); + editContextMenu->exec(mapToGlobal(pos)); +} diff -Nru sqlitebrowser-3.10.100ubuntu1/src/FilterLineEdit.h sqlitebrowser-3.11.1/src/FilterLineEdit.h --- sqlitebrowser-3.10.100ubuntu1/src/FilterLineEdit.h 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/src/FilterLineEdit.h 2019-02-19 23:51:34.000000000 +0000 @@ -23,15 +23,21 @@ signals: void delayedTextChanged(QString text); + void addFilterAsCondFormat(QString text); + void clearAllCondFormats(); protected: - void keyReleaseEvent(QKeyEvent* event); + void keyReleaseEvent(QKeyEvent* event) override; + void setFilterHelper(const QString& filterOperator, const QString& operatorSuffix = ""); private: QList* filterList; int columnNumber; QTimer* delaySignalTimer; QString lastValue; + +private slots: + void showContextMenu(const QPoint &pos); }; #endif diff -Nru sqlitebrowser-3.10.100ubuntu1/src/FilterTableHeader.cpp sqlitebrowser-3.11.1/src/FilterTableHeader.cpp --- sqlitebrowser-3.10.100ubuntu1/src/FilterTableHeader.cpp 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/src/FilterTableHeader.cpp 2019-02-19 23:51:34.000000000 +0000 @@ -36,6 +36,8 @@ else l->setVisible(true); connect(l, SIGNAL(delayedTextChanged(QString)), this, SLOT(inputChanged(QString))); + connect(l, SIGNAL(addFilterAsCondFormat(QString)), this, SLOT(addFilterAsCondFormat(QString))); + connect(l, SIGNAL(clearAllCondFormats()), this, SLOT(clearAllCondFormats())); filterWidgets.push_back(l); } @@ -86,6 +88,18 @@ emit filterChanged(sender()->property("column").toInt(), new_value); } +void FilterTableHeader::addFilterAsCondFormat(const QString& filter) +{ + // Just get the column number and the new value and send them to anybody interested in new conditional formatting + emit addCondFormat(sender()->property("column").toInt(), filter); +} + +void FilterTableHeader::clearAllCondFormats() +{ + // Just get the column number and send it to anybody responsible or interested in clearing conditional formatting + emit clearAllCondFormats(sender()->property("column").toInt()); +} + void FilterTableHeader::clearFilters() { for(FilterLineEdit* filterLineEdit : filterWidgets) diff -Nru sqlitebrowser-3.10.100ubuntu1/src/FilterTableHeader.h sqlitebrowser-3.11.1/src/FilterTableHeader.h --- sqlitebrowser-3.10.100ubuntu1/src/FilterTableHeader.h 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/src/FilterTableHeader.h 2019-02-19 23:51:34.000000000 +0000 @@ -14,7 +14,8 @@ public: explicit FilterTableHeader(QTableView* parent = nullptr); - virtual QSize sizeHint() const; + QSize sizeHint() const override; + bool hasFilters() const {return (filterWidgets.count() > 0);} public slots: void generateFilters(int number, bool showFirst = false); @@ -24,12 +25,16 @@ signals: void filterChanged(int column, QString value); + void addCondFormat(int column, QString filter); + void clearAllCondFormats(int column); protected: - virtual void updateGeometries(); + void updateGeometries() override; private slots: void inputChanged(const QString& new_value); + void addFilterAsCondFormat(const QString& filter); + void clearAllCondFormats(); private: QList filterWidgets; diff -Nru sqlitebrowser-3.10.100ubuntu1/src/FindReplaceDialog.cpp sqlitebrowser-3.11.1/src/FindReplaceDialog.cpp --- sqlitebrowser-3.10.100ubuntu1/src/FindReplaceDialog.cpp 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/src/FindReplaceDialog.cpp 2019-02-19 23:51:34.000000000 +0000 @@ -1,11 +1,13 @@ #include "FindReplaceDialog.h" #include "ui_FindReplaceDialog.h" +#include "ExtendedScintilla.h" #include FindReplaceDialog::FindReplaceDialog(QWidget* parent) : QDialog(parent), - ui(new Ui::FindReplaceDialog) + ui(new Ui::FindReplaceDialog), + findInProgress(false) { // Create UI ui->setupUi(this); @@ -32,36 +34,82 @@ ui->replaceAllButton->setEnabled(isWriteable); connect(m_scintilla, SIGNAL(destroyed()), this, SLOT(hide())); + connect(ui->findText, SIGNAL(editingFinished()), this, SLOT(cancelFind())); + connect(ui->regexpCheckBox, &QCheckBox::toggled, this, &FindReplaceDialog::cancelFind); + connect(ui->caseCheckBox, &QCheckBox::toggled, this, &FindReplaceDialog::cancelFind); + connect(ui->wholeWordsCheckBox, &QCheckBox::toggled, this, &FindReplaceDialog::cancelFind); + connect(ui->wrapCheckBox, &QCheckBox::toggled, this, &FindReplaceDialog::cancelFind); + connect(ui->backwardsCheckBox, &QCheckBox::toggled, this, &FindReplaceDialog::cancelFind); + connect(ui->selectionCheckBox, &QCheckBox::toggled, this, &FindReplaceDialog::cancelFind); + connect(ui->selectionCheckBox, &QCheckBox::toggled, ui->wrapCheckBox, &QCheckBox::setDisabled); } -bool FindReplaceDialog::findNext() +bool FindReplaceDialog::findFirst(bool wrap, bool forward) { - clearIndicators(); - - bool found = m_scintilla->findText + if (ui->selectionCheckBox->isChecked()) + return m_scintilla->findFirstInSelection + (ui->findText->text(), + ui->regexpCheckBox->isChecked(), + ui->caseCheckBox->isChecked(), + ui->wholeWordsCheckBox->isChecked(), + forward, + /* show */ true, + /* posix */ true); + else + return m_scintilla->findFirst (ui->findText->text(), ui->regexpCheckBox->isChecked(), ui->caseCheckBox->isChecked(), ui->wholeWordsCheckBox->isChecked(), - ui->wrapCheckBox->isChecked(), - !ui->backwardsCheckBox->isChecked()); - if (!found) + wrap, + forward, + /* line */ -1, + /* index */ -1, + /* show */ true, + /* posix */ true); +} + +bool FindReplaceDialog::findNext() +{ + clearIndicators(); + + if (findInProgress) + findInProgress = m_scintilla->findNext(); + else + findInProgress = findFirst(ui->wrapCheckBox->isChecked(), + !ui->backwardsCheckBox->isChecked()); + + if (!findInProgress) ui->messageLabel->setText(tr("The searched text was not found")); - return found; + return findInProgress; } void FindReplaceDialog::show() { ui->findText->setFocus(); + + // If there is multi-line selected text set automatically the selection + // check box. If it's only part of a line, use it as text to find. + if (m_scintilla->hasSelectedText()) + if (m_scintilla->selectedText().contains("\n")) + ui->selectionCheckBox->setChecked(true); + else { + ui->findText->setText(m_scintilla->selectedText()); + ui->selectionCheckBox->setChecked(false); + } + else + ui->selectionCheckBox->setChecked(false); + ui->findText->selectAll(); QDialog::show(); } void FindReplaceDialog::replace() { - m_scintilla->replace(ui->replaceWithText->text()); + if (m_scintilla->hasSelectedText()) + m_scintilla->replace(ui->replaceWithText->text()); findNext(); } @@ -70,24 +118,27 @@ int fromRow, fromIndex, toRow, toIndex; m_scintilla->getSelection(&fromRow, &fromIndex, &toRow, &toIndex); m_scintilla->fillIndicatorRange(fromRow, fromIndex, toRow, toIndex, foundIndicatorNumber); - } -void FindReplaceDialog::findAll() + +void FindReplaceDialog::searchAll(bool replace) { clearIndicators(); + if (!ui->selectionCheckBox->isChecked()) + m_scintilla->setCursorPosition(0, 0); + + bool found = findFirst(/* wrap */ false, /* fordward */ true); + int occurrences = 0; - m_scintilla->setCursorPosition(0, 0); - while (m_scintilla->findText - (ui->findText->text(), - ui->regexpCheckBox->isChecked(), - ui->caseCheckBox->isChecked(), - ui->wholeWordsCheckBox->isChecked(), - false, - true)) { + while (found) { + if (replace) + m_scintilla->replace(ui->replaceWithText->text()); indicateSelection(); ++occurrences; + found = m_scintilla->findNext(); } - m_scintilla->clearSelection(); + + if (!ui->selectionCheckBox->isChecked()) + m_scintilla->clearSelection(); QString message; switch (occurrences) { @@ -95,51 +146,40 @@ message = tr("The searched text was not found."); break; case 1: - message = tr("The searched text was found one time."); + if (replace) + message = tr("The searched text was replaced one time."); + else + message = tr("The searched text was found one time."); break; default: - message = tr("The searched text was found %1 times.").arg(occurrences); + if (replace) + message = tr("The searched text was replaced %1 times.").arg(occurrences); + else + message = tr("The searched text was found %1 times.").arg(occurrences); + break; } ui->messageLabel->setText(message); } -void FindReplaceDialog::replaceAll() +void FindReplaceDialog::findAll() { - clearIndicators(); - int occurrences = 0; - m_scintilla->setCursorPosition(0, 0); - while (m_scintilla->findText - (ui->findText->text(), - ui->regexpCheckBox->isChecked(), - ui->caseCheckBox->isChecked(), - ui->wholeWordsCheckBox->isChecked(), - false, - true)) { - m_scintilla->replace(ui->replaceWithText->text()); - indicateSelection(); - ++occurrences; - } - m_scintilla->clearSelection(); - - QString message; - switch (occurrences) { - case 0: - message = tr("The searched text was not found."); - break; - case 1: - message = tr("The searched text was replaced one time."); - break; - default: - message = tr("The searched text was replaced %1 times.").arg(occurrences); - break; - } - - ui->messageLabel->setText(message); + searchAll(/* replace */ false); +} +void FindReplaceDialog::replaceAll() +{ + searchAll(/* replace */ true); } +void FindReplaceDialog::cancelFind() +{ + m_scintilla->findFirst(QString(), false, false, false, false); + clearIndicators(); + findInProgress = false; + ui->messageLabel->setText(""); +} void FindReplaceDialog::help() { QWhatsThis::enterWhatsThisMode(); @@ -154,7 +194,9 @@ void FindReplaceDialog::close() { m_scintilla->clearSelection(); - clearIndicators(); + // Reset any previous find so it does not interfere with the next time + // the dialog is open. + cancelFind(); QDialog::close(); } diff -Nru sqlitebrowser-3.10.100ubuntu1/src/FindReplaceDialog.h sqlitebrowser-3.11.1/src/FindReplaceDialog.h --- sqlitebrowser-3.10.100ubuntu1/src/FindReplaceDialog.h 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/src/FindReplaceDialog.h 2019-02-19 23:51:34.000000000 +0000 @@ -1,11 +1,11 @@ #ifndef FindReplaceDialog_H #define FindReplaceDialog_H -#include - #include #include +class ExtendedScintilla; + namespace Ui { class FindReplaceDialog; } @@ -17,7 +17,7 @@ public: explicit FindReplaceDialog(QWidget* parent = nullptr); - ~FindReplaceDialog(); + ~FindReplaceDialog() override; void setExtendedScintilla(ExtendedScintilla* scintilla); void show(); @@ -26,17 +26,21 @@ void replace(); void findAll(); void replaceAll(); + void cancelFind(); void help(); void close(); - void reject(); + void reject() override; void buttonBox_clicked(QAbstractButton* button); private: + bool findFirst(bool wrap, bool forward); + void searchAll(bool replace); void indicateSelection(); void clearIndicators(); Ui::FindReplaceDialog* ui; ExtendedScintilla* m_scintilla; int foundIndicatorNumber; + bool findInProgress; }; #endif diff -Nru sqlitebrowser-3.10.100ubuntu1/src/FindReplaceDialog.ui sqlitebrowser-3.11.1/src/FindReplaceDialog.ui --- sqlitebrowser-3.10.100ubuntu1/src/FindReplaceDialog.ui 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/src/FindReplaceDialog.ui 2019-02-19 23:51:34.000000000 +0000 @@ -101,6 +101,16 @@ + + + <html><head/><body><p>When checked, the pattern to find is searched only in the current selection.</p></body></html> + + + &Selection only + + + + <html><head/><body><p>When checked, the pattern to find is interpreted as a UNIX regular expression. See <a href="https://en.wikibooks.org/wiki/Regular_Expressions">Regular Expression in Wikibooks</a>.</p></body></html> @@ -210,6 +220,7 @@ wholeWordsCheckBox wrapCheckBox backwardsCheckBox + selectionCheckBox regexpCheckBox findNextButton replaceButton diff -Nru sqlitebrowser-3.10.100ubuntu1/src/ForeignKeyEditorDelegate.cpp sqlitebrowser-3.11.1/src/ForeignKeyEditorDelegate.cpp --- sqlitebrowser-3.10.100ubuntu1/src/ForeignKeyEditorDelegate.cpp 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/src/ForeignKeyEditorDelegate.cpp 2019-02-19 23:51:34.000000000 +0000 @@ -88,7 +88,7 @@ if((*jt)->type() == sqlb::Object::Types::Table) { QString tableName = (*jt)->name(); - m_tablesIds.insert(tableName, (*jt).dynamicCast()->fieldNames()); + m_tablesIds.insert(tableName, std::dynamic_pointer_cast(*jt)->fieldNames()); } } } @@ -123,9 +123,9 @@ ForeignKeyEditor* fkEditor = static_cast(editor); int column = index.row(); // weird? I know right - sqlb::FieldPtr field = m_table.fields().at(column); - QSharedPointer fk = m_table.constraint({field}, sqlb::Constraint::ForeignKeyConstraintType).dynamicCast(); - if (!fk.isNull()) { + const sqlb::Field& field = m_table.fields.at(column); + auto fk = std::dynamic_pointer_cast(m_table.constraint({field.name()}, sqlb::Constraint::ForeignKeyConstraintType)); + if (fk) { fkEditor->tablesComboBox->setCurrentText(fk->table()); fkEditor->clauseEdit->setText(fk->constraint()); if (!fk->columns().isEmpty()) @@ -141,10 +141,10 @@ QString sql = fkEditor->getSql(); int column = index.row(); - sqlb::FieldPtr field = m_table.fields().at(column); + const sqlb::Field& field = m_table.fields.at(column); if (sql.isEmpty()) { // Remove the foreign key - m_table.removeConstraints({field}, sqlb::Constraint::ConstraintTypes::ForeignKeyConstraintType); + m_table.removeConstraints({field.name()}, sqlb::Constraint::ConstraintTypes::ForeignKeyConstraintType); } else { // Set the foreign key sqlb::ForeignKeyClause* fk = new sqlb::ForeignKeyClause; @@ -162,7 +162,7 @@ fk->setConstraint(clause); } - m_table.setConstraint({field}, sqlb::ConstraintPtr(fk)); + m_table.setConstraint({field.name()}, sqlb::ConstraintPtr(fk)); } model->setData(index, sql); diff -Nru sqlitebrowser-3.10.100ubuntu1/src/ForeignKeyEditorDelegate.h sqlitebrowser-3.11.1/src/ForeignKeyEditorDelegate.h --- sqlitebrowser-3.10.100ubuntu1/src/ForeignKeyEditorDelegate.h 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/src/ForeignKeyEditorDelegate.h 2019-02-19 23:51:34.000000000 +0000 @@ -20,10 +20,10 @@ public: explicit ForeignKeyEditorDelegate(const DBBrowserDB& db, sqlb::Table& table, QObject* parent = nullptr); - QWidget* createEditor(QWidget* parent, const QStyleOptionViewItem& option, const QModelIndex& index) const Q_DECL_OVERRIDE; - void setEditorData(QWidget* editor, const QModelIndex& index) const Q_DECL_OVERRIDE; - void setModelData(QWidget* editor, QAbstractItemModel* model, const QModelIndex& index) const Q_DECL_OVERRIDE; - void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const Q_DECL_OVERRIDE; + QWidget* createEditor(QWidget* parent, const QStyleOptionViewItem& option, const QModelIndex& index) const override; + void setEditorData(QWidget* editor, const QModelIndex& index) const override; + void setModelData(QWidget* editor, QAbstractItemModel* model, const QModelIndex& index) const override; + void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const override; void updateTablesList(const QString& oldTableName); diff -Nru sqlitebrowser-3.10.100ubuntu1/src/grammar/sqlite3.g sqlitebrowser-3.11.1/src/grammar/sqlite3.g --- sqlitebrowser-3.10.100ubuntu1/src/grammar/sqlite3.g 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/src/grammar/sqlite3.g 2019-02-19 23:51:34.000000000 +0000 @@ -41,6 +41,8 @@ END="END"; ESCAPE="ESCAPE"; FAIL="FAIL"; + FILTER="FILTER"; + FOLLOWING="FOLLOWING"; FOREIGN="FOREIGN"; GLOB="GLOB"; KEY="KEY"; @@ -60,18 +62,24 @@ MATCH="MATCH"; EXISTS="EXISTS"; ON="ON"; + OVER="OVER"; + PARTITION="PARTITION"; + PRECEDING="PRECEDING"; PRIMARY="PRIMARY"; RAISE="RAISE"; + RANGE="RANGE"; REFERENCES="REFERENCES"; REGEXP="REGEXP"; REPLACE="REPLACE"; RESTRICT="RESTRICT"; ROLLBACK="ROLLBACK"; ROWID="ROWID"; + ROWS="ROWS"; SET="SET"; TEMPORARY="TEMPORARY"; TEMP="TEMP"; THEN="THEN"; + UNBOUNDED="UNBOUNDED"; UNIQUE="UNIQUE"; UPDATE="UPDATE"; USING="USING"; @@ -431,7 +439,7 @@ expr : - ( LPAREN subexpr (COMMA subexpr)+ RPAREN binaryoperator LPAREN subexpr (COMMA subexpr)+ RPAREN ) + ( LPAREN (((subexpr (COMMA subexpr)+ RPAREN binaryoperator LPAREN subexpr (COMMA subexpr)+) | (expr)) RPAREN) ((AND | OR) expr)* ) | ( subexpr ((binaryoperator | AND | OR) subexpr )* ) ; @@ -443,9 +451,10 @@ | ((databasename DOT)? tablename DOT)? columnname | functionname LPAREN (expr (COMMA expr)* )? RPAREN //TODO | castexpr - | (EXISTS)? LPAREN (expr | selectstmt) RPAREN + | EXISTS LPAREN (expr | selectstmt) RPAREN | caseexpr | raisefunction +// | windowfunc ) (suffixexpr)? ; @@ -460,6 +469,56 @@ CASE_T (expr)? (WHEN expr THEN expr)+ (ELSE_T expr)? END ; +/* +windowfunc + : + functionname LPAREN (STAR | (expr (COMMA expr)*))? RPAREN (FILTER LPAREN WHERE expr RPAREN)? OVER + ( + (LPAREN windowdefn RPAREN) + | id + ) + ; + +windowdefn + : + (PARTITION BY expr (COMMA expr)*)? + (ORDER BY orderingterm (COMMA orderingterm)*)? + (framespec)? + ; + +orderingterm + : + expr (COLLATE collationname)? (ASC | DESC)? + ; + +framespec + : + (RANGE | ROWS) + (BETWEEN + ( + (UNBOUNDED PRECEDING) + | (expr PRECEDING) + | (CURRENT ROW) + | (expr FOLLOWING) + ) + AND + ( + (expr PRECEDING) + | (CURRENT ROW) + | (expr FOLLOWING) + | (UNBOUNDED FOLLOWING) + ) + ) + | + ( + (UNBOUNDED PRECEDING) + | (expr PRECEDING) + | (CURRENT ROW) + | (expr FOLLOWING) + ) + ; +*/ + like_operator : LIKE diff -Nru sqlitebrowser-3.10.100ubuntu1/src/grammar/Sqlite3Lexer.cpp sqlitebrowser-3.11.1/src/grammar/Sqlite3Lexer.cpp --- sqlitebrowser-3.10.100ubuntu1/src/grammar/Sqlite3Lexer.cpp 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/src/grammar/Sqlite3Lexer.cpp 2019-02-19 23:51:34.000000000 +0000 @@ -1,4 +1,4 @@ -/* $ANTLR 2.7.7 (20160127): "sqlite3.g" -> "Sqlite3Lexer.cpp"$ */ +/* $ANTLR 2.7.7 (20171109): "sqlite3.g" -> "Sqlite3Lexer.cpp"$ */ #include "Sqlite3Lexer.hpp" #include #include @@ -33,67 +33,75 @@ literals["CASE"] = 13; literals["END"] = 29; literals["CASCADE"] = 12; - literals["TEMPORARY"] = 60; + literals["TEMPORARY"] = 67; + literals["RANGE"] = 58; literals["DEFERRABLE"] = 24; - literals["IMMEDIATE"] = 43; + literals["IMMEDIATE"] = 45; literals["AUTOINCREMENT"] = 6; - literals["ROWID"] = 58; - literals["EXISTS"] = 49; - literals["NO"] = 45; - literals["THEN"] = 62; + literals["ROWID"] = 64; + literals["EXISTS"] = 51; + literals["NO"] = 47; + literals["THEN"] = 69; literals["AND"] = 9; literals["CURRENT_DATE"] = 21; - literals["NOT"] = 46; - literals["KEY"] = 34; + literals["NOT"] = 48; + literals["KEY"] = 36; literals["COLLATE"] = 17; - literals["NULL"] = 47; - literals["TEMP"] = 61; - literals["INITIALLY"] = 41; - literals["RESTRICT"] = 56; - literals["LIKE"] = 35; - literals["WHEN"] = 67; - literals["FOREIGN"] = 32; - literals["SET"] = 59; - literals["IS"] = 44; + literals["NULL"] = 49; + literals["TEMP"] = 68; + literals["OVER"] = 53; + literals["INITIALLY"] = 43; + literals["RESTRICT"] = 62; + literals["LIKE"] = 37; + literals["WHEN"] = 75; + literals["FOREIGN"] = 34; + literals["SET"] = 66; + literals["IS"] = 46; + literals["FILTER"] = 32; literals["OR"] = 10; - literals["INDEX"] = 40; - literals["PRIMARY"] = 51; + literals["INDEX"] = 42; + literals["PRIMARY"] = 56; literals["DEFERRED"] = 25; - literals["UPDATE"] = 64; - literals["IF"] = 37; - literals["UNIQUE"] = 63; + literals["UPDATE"] = 72; + literals["IF"] = 39; + literals["PRECEDING"] = 55; + literals["UNIQUE"] = 71; literals["AS"] = 7; - literals["TABLE"] = 36; + literals["TABLE"] = 38; + literals["UNBOUNDED"] = 70; literals["DEFAULT"] = 23; literals["ACTION"] = 5; literals["DELETE"] = 26; - literals["GLOB"] = 33; - literals["IGNORE"] = 38; - literals["INSERT"] = 42; + literals["GLOB"] = 35; + literals["FOLLOWING"] = 33; + literals["IGNORE"] = 40; + literals["INSERT"] = 44; literals["CURRENT_TIMESTAMP"] = 22; literals["CONFLICT"] = 18; - literals["REPLACE"] = 55; + literals["ROWS"] = 65; + literals["REPLACE"] = 61; literals["ASC"] = 8; literals["FAIL"] = 31; - literals["REGEXP"] = 54; - literals["REFERENCES"] = 53; - literals["ON"] = 50; + literals["REGEXP"] = 60; + literals["REFERENCES"] = 59; + literals["ON"] = 52; literals["DESC"] = 27; - literals["IN"] = 39; + literals["IN"] = 41; literals["CAST"] = 14; literals["ESCAPE"] = 30; - literals["VIRTUAL"] = 66; - literals["WHERE"] = 68; + literals["VIRTUAL"] = 74; + literals["WHERE"] = 76; literals["ELSE"] = 28; - literals["WITHOUT"] = 69; - literals["MATCH"] = 48; - literals["RAISE"] = 52; + literals["PARTITION"] = 54; + literals["WITHOUT"] = 77; + literals["MATCH"] = 50; + literals["RAISE"] = 57; literals["ABORT"] = 4; literals["BETWEEN"] = 11; literals["CHECK"] = 15; - literals["ROLLBACK"] = 57; + literals["ROLLBACK"] = 63; literals["CURRENT_TIME"] = 20; - literals["USING"] = 65; + literals["USING"] = 73; } ANTLR_USE_NAMESPACE(antlr)RefToken Sqlite3Lexer::nextToken() @@ -1191,34 +1199,34 @@ // 0x11 0x12 0x13 0x14 0x15 0x16 0x17 0x18 0x19 0x1a 0x1b 0x1c 0x1d 0x1e // 0x1f ! \" # $ % & \' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > // ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ 0x5c ] ^ _ -// a b c d e f g h i j k l m n o p +// a b c d e f g h i j k l m n o p q r s t u v w x const ANTLR_USE_NAMESPACE(antlr)BitSet Sqlite3Lexer::_tokenSet_0(_tokenSet_0_data_,4096); const unsigned long Sqlite3Lexer::_tokenSet_1_data_[] = { 4294967295UL, 4294967295UL, 3758096383UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 2147483647UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL }; // 0x0 0x1 0x2 0x3 0x4 0x5 0x6 0x7 0x8 0x9 0xa 0xb 0xc 0xd 0xe 0xf 0x10 // 0x11 0x12 0x13 0x14 0x15 0x16 0x17 0x18 0x19 0x1a 0x1b 0x1c 0x1d 0x1e // 0x1f ! \" # $ % & \' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > // ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ 0x5c ^ _ ` -// a b c d e f g h i j k l m n o p +// a b c d e f g h i j k l m n o p q r s t u v w x const ANTLR_USE_NAMESPACE(antlr)BitSet Sqlite3Lexer::_tokenSet_1(_tokenSet_1_data_,4096); const unsigned long Sqlite3Lexer::_tokenSet_2_data_[] = { 4294967295UL, 4294967291UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 2147483647UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL }; // 0x0 0x1 0x2 0x3 0x4 0x5 0x6 0x7 0x8 0x9 0xa 0xb 0xc 0xd 0xe 0xf 0x10 // 0x11 0x12 0x13 0x14 0x15 0x16 0x17 0x18 0x19 0x1a 0x1b 0x1c 0x1d 0x1e // 0x1f ! # $ % & \' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? // @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ 0x5c ] ^ _ ` -// a b c d e f g h i j k l m n o p +// a b c d e f g h i j k l m n o p q r s t u v w x const ANTLR_USE_NAMESPACE(antlr)BitSet Sqlite3Lexer::_tokenSet_2(_tokenSet_2_data_,4096); const unsigned long Sqlite3Lexer::_tokenSet_3_data_[] = { 4294958079UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 2147483647UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL }; // 0x0 0x1 0x2 0x3 0x4 0x5 0x6 0x7 0x8 0x9 0xb 0xc 0xe 0xf 0x10 0x11 0x12 // 0x13 0x14 0x15 0x16 0x17 0x18 0x19 0x1a 0x1b 0x1c 0x1d 0x1e 0x1f ! // \" # $ % & \' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B // C D E F G H I J K L M N O P Q R S T U V W X Y Z [ 0x5c ] ^ _ ` a b c -// d e f g h i j k l m n o p +// d e f g h i j k l m n o p q r s t u v w x const ANTLR_USE_NAMESPACE(antlr)BitSet Sqlite3Lexer::_tokenSet_3(_tokenSet_3_data_,4096); const unsigned long Sqlite3Lexer::_tokenSet_4_data_[] = { 4294967295UL, 4294967167UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 2147483647UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL }; // 0x0 0x1 0x2 0x3 0x4 0x5 0x6 0x7 0x8 0x9 0xa 0xb 0xc 0xd 0xe 0xf 0x10 // 0x11 0x12 0x13 0x14 0x15 0x16 0x17 0x18 0x19 0x1a 0x1b 0x1c 0x1d 0x1e // 0x1f ! \" # $ % & ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? // @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ 0x5c ] ^ _ ` -// a b c d e f g h i j k l m n o p +// a b c d e f g h i j k l m n o p q r s t u v w x const ANTLR_USE_NAMESPACE(antlr)BitSet Sqlite3Lexer::_tokenSet_4(_tokenSet_4_data_,4096); diff -Nru sqlitebrowser-3.10.100ubuntu1/src/grammar/Sqlite3Lexer.hpp sqlitebrowser-3.11.1/src/grammar/Sqlite3Lexer.hpp --- sqlitebrowser-3.10.100ubuntu1/src/grammar/Sqlite3Lexer.hpp 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/src/grammar/Sqlite3Lexer.hpp 2019-02-19 23:51:34.000000000 +0000 @@ -2,7 +2,7 @@ #define INC_Sqlite3Lexer_hpp_ #include -/* $ANTLR 2.7.7 (20160127): "sqlite3.g" -> "Sqlite3Lexer.hpp"$ */ +/* $ANTLR 2.7.7 (20171109): "sqlite3.g" -> "Sqlite3Lexer.hpp"$ */ #include #include #include diff -Nru sqlitebrowser-3.10.100ubuntu1/src/grammar/Sqlite3Parser.cpp sqlitebrowser-3.11.1/src/grammar/Sqlite3Parser.cpp --- sqlitebrowser-3.10.100ubuntu1/src/grammar/Sqlite3Parser.cpp 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/src/grammar/Sqlite3Parser.cpp 2019-02-19 23:51:34.000000000 +0000 @@ -1,4 +1,4 @@ -/* $ANTLR 2.7.7 (20160127): "sqlite3.g" -> "Sqlite3Parser.cpp"$ */ +/* $ANTLR 2.7.7 (20171109): "sqlite3.g" -> "Sqlite3Parser.cpp"$ */ #include "Sqlite3Parser.hpp" #include #include @@ -2027,7 +2027,9 @@ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST; ANTLR_USE_NAMESPACE(antlr)RefAST expr_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; - if ((LA(1) == LPAREN) && (_tokenSet_7.member(LA(2)))) { + switch ( LA(1)) { + case LPAREN: + { { ANTLR_USE_NAMESPACE(antlr)RefAST tmp97_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { @@ -2035,86 +2037,211 @@ astFactory->addASTChild(currentAST, tmp97_AST); } match(LPAREN); - subexpr(); - if (inputState->guessing==0) { - astFactory->addASTChild( currentAST, returnAST ); - } - { // ( ... )+ - int _cnt177=0; - for (;;) { - if ((LA(1) == COMMA)) { - ANTLR_USE_NAMESPACE(antlr)RefAST tmp98_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; - if ( inputState->guessing == 0 ) { - tmp98_AST = astFactory->create(LT(1)); - astFactory->addASTChild(currentAST, tmp98_AST); + { + { + if ((_tokenSet_7.member(LA(1))) && (_tokenSet_8.member(LA(2)))) { + { + subexpr(); + if (inputState->guessing==0) { + astFactory->addASTChild( currentAST, returnAST ); + } + { // ( ... )+ + int _cnt180=0; + for (;;) { + if ((LA(1) == COMMA)) { + ANTLR_USE_NAMESPACE(antlr)RefAST tmp98_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; + if ( inputState->guessing == 0 ) { + tmp98_AST = astFactory->create(LT(1)); + astFactory->addASTChild(currentAST, tmp98_AST); + } + match(COMMA); + subexpr(); + if (inputState->guessing==0) { + astFactory->addASTChild( currentAST, returnAST ); + } } - match(COMMA); - subexpr(); - if (inputState->guessing==0) { - astFactory->addASTChild( currentAST, returnAST ); + else { + if ( _cnt180>=1 ) { goto _loop180; } else {throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());} } + + _cnt180++; } - else { - if ( _cnt177>=1 ) { goto _loop177; } else {throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());} + _loop180:; + } // ( ... )+ + ANTLR_USE_NAMESPACE(antlr)RefAST tmp99_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; + if ( inputState->guessing == 0 ) { + tmp99_AST = astFactory->create(LT(1)); + astFactory->addASTChild(currentAST, tmp99_AST); + } + match(RPAREN); + binaryoperator(); + if (inputState->guessing==0) { + astFactory->addASTChild( currentAST, returnAST ); + } + ANTLR_USE_NAMESPACE(antlr)RefAST tmp100_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; + if ( inputState->guessing == 0 ) { + tmp100_AST = astFactory->create(LT(1)); + astFactory->addASTChild(currentAST, tmp100_AST); + } + match(LPAREN); + subexpr(); + if (inputState->guessing==0) { + astFactory->addASTChild( currentAST, returnAST ); + } + { // ( ... )+ + int _cnt182=0; + for (;;) { + if ((LA(1) == COMMA)) { + ANTLR_USE_NAMESPACE(antlr)RefAST tmp101_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; + if ( inputState->guessing == 0 ) { + tmp101_AST = astFactory->create(LT(1)); + astFactory->addASTChild(currentAST, tmp101_AST); + } + match(COMMA); + subexpr(); + if (inputState->guessing==0) { + astFactory->addASTChild( currentAST, returnAST ); + } + } + else { + if ( _cnt182>=1 ) { goto _loop182; } else {throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());} + } + + _cnt182++; + } + _loop182:; + } // ( ... )+ } - - _cnt177++; } - _loop177:; - } // ( ... )+ - ANTLR_USE_NAMESPACE(antlr)RefAST tmp99_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; - if ( inputState->guessing == 0 ) { - tmp99_AST = astFactory->create(LT(1)); - astFactory->addASTChild(currentAST, tmp99_AST); + else if ((_tokenSet_9.member(LA(1))) && (_tokenSet_10.member(LA(2)))) { + { + expr(); + if (inputState->guessing==0) { + astFactory->addASTChild( currentAST, returnAST ); + } + } } - match(RPAREN); - binaryoperator(); - if (inputState->guessing==0) { - astFactory->addASTChild( currentAST, returnAST ); + else { + throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename()); + } + } - ANTLR_USE_NAMESPACE(antlr)RefAST tmp100_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; + ANTLR_USE_NAMESPACE(antlr)RefAST tmp102_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { - tmp100_AST = astFactory->create(LT(1)); - astFactory->addASTChild(currentAST, tmp100_AST); + tmp102_AST = astFactory->create(LT(1)); + astFactory->addASTChild(currentAST, tmp102_AST); } - match(LPAREN); - subexpr(); - if (inputState->guessing==0) { - astFactory->addASTChild( currentAST, returnAST ); + match(RPAREN); } - { // ( ... )+ - int _cnt179=0; + { // ( ... )* for (;;) { - if ((LA(1) == COMMA)) { - ANTLR_USE_NAMESPACE(antlr)RefAST tmp101_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; - if ( inputState->guessing == 0 ) { - tmp101_AST = astFactory->create(LT(1)); - astFactory->addASTChild(currentAST, tmp101_AST); + if ((LA(1) == AND || LA(1) == OR) && (_tokenSet_9.member(LA(2)))) { + { + switch ( LA(1)) { + case AND: + { + ANTLR_USE_NAMESPACE(antlr)RefAST tmp103_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; + if ( inputState->guessing == 0 ) { + tmp103_AST = astFactory->create(LT(1)); + astFactory->addASTChild(currentAST, tmp103_AST); + } + match(AND); + break; } - match(COMMA); - subexpr(); + case OR: + { + ANTLR_USE_NAMESPACE(antlr)RefAST tmp104_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; + if ( inputState->guessing == 0 ) { + tmp104_AST = astFactory->create(LT(1)); + astFactory->addASTChild(currentAST, tmp104_AST); + } + match(OR); + break; + } + default: + { + throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename()); + } + } + } + expr(); if (inputState->guessing==0) { astFactory->addASTChild( currentAST, returnAST ); } } else { - if ( _cnt179>=1 ) { goto _loop179; } else {throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());} + goto _loop186; } - _cnt179++; } - _loop179:; - } // ( ... )+ - ANTLR_USE_NAMESPACE(antlr)RefAST tmp102_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; - if ( inputState->guessing == 0 ) { - tmp102_AST = astFactory->create(LT(1)); - astFactory->addASTChild(currentAST, tmp102_AST); - } - match(RPAREN); + _loop186:; + } // ( ... )* } expr_AST = currentAST.root; + break; } - else if ((_tokenSet_7.member(LA(1))) && (_tokenSet_8.member(LA(2)))) { + case ABORT: + case ACTION: + case AUTOINCREMENT: + case AS: + case ASC: + case AND: + case OR: + case CASCADE: + case CASE_T: + case CAST: + case CREATE: + case COLLATE: + case CONFLICT: + case CURRENT_TIME: + case CURRENT_DATE: + case CURRENT_TIMESTAMP: + case DEFAULT: + case DEFERRABLE: + case DEFERRED: + case DELETE: + case DESC: + case ELSE_T: + case END: + case ESCAPE: + case FAIL: + case GLOB: + case KEY: + case LIKE: + case TABLE: + case IF_T: + case IGNORE: + case INITIALLY: + case IMMEDIATE: + case IS: + case NO: + case NOT: + case NULL_T: + case MATCH: + case EXISTS: + case ON: + case RAISE: + case REFERENCES: + case REGEXP: + case REPLACE: + case RESTRICT: + case ROLLBACK: + case ROWID: + case SET: + case TEMPORARY: + case TEMP: + case THEN: + case UPDATE: + case WHEN: + case ID: + case QUOTEDID: + case QUOTEDLITERAL: + case NUMERIC: + case STRINGLITERAL: + case PLUS: + case MINUS: + case TILDE: + { { subexpr(); if (inputState->guessing==0) { @@ -2122,7 +2249,7 @@ } { // ( ... )* for (;;) { - if ((_tokenSet_9.member(LA(1))) && (_tokenSet_7.member(LA(2)))) { + if ((_tokenSet_11.member(LA(1))) && (_tokenSet_7.member(LA(2)))) { { switch ( LA(1)) { case GLOB: @@ -2157,20 +2284,20 @@ } case AND: { - ANTLR_USE_NAMESPACE(antlr)RefAST tmp103_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; + ANTLR_USE_NAMESPACE(antlr)RefAST tmp105_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { - tmp103_AST = astFactory->create(LT(1)); - astFactory->addASTChild(currentAST, tmp103_AST); + tmp105_AST = astFactory->create(LT(1)); + astFactory->addASTChild(currentAST, tmp105_AST); } match(AND); break; } case OR: { - ANTLR_USE_NAMESPACE(antlr)RefAST tmp104_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; + ANTLR_USE_NAMESPACE(antlr)RefAST tmp106_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { - tmp104_AST = astFactory->create(LT(1)); - astFactory->addASTChild(currentAST, tmp104_AST); + tmp106_AST = astFactory->create(LT(1)); + astFactory->addASTChild(currentAST, tmp106_AST); } match(OR); break; @@ -2187,19 +2314,21 @@ } } else { - goto _loop183; + goto _loop190; } } - _loop183:; + _loop190:; } // ( ... )* } expr_AST = currentAST.root; + break; } - else { + default: + { throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename()); } - + } returnAST = expr_AST; } @@ -2216,10 +2345,10 @@ switch ( LA(1)) { case COLLATE: { - ANTLR_USE_NAMESPACE(antlr)RefAST tmp105_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; + ANTLR_USE_NAMESPACE(antlr)RefAST tmp107_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { - tmp105_AST = astFactory->create(LT(1)); - astFactory->addASTChild(currentAST, tmp105_AST); + tmp107_AST = astFactory->create(LT(1)); + astFactory->addASTChild(currentAST, tmp107_AST); } match(COLLATE); collationname(); @@ -2246,20 +2375,20 @@ switch ( LA(1)) { case ASC: { - ANTLR_USE_NAMESPACE(antlr)RefAST tmp106_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; + ANTLR_USE_NAMESPACE(antlr)RefAST tmp108_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { - tmp106_AST = astFactory->create(LT(1)); - astFactory->addASTChild(currentAST, tmp106_AST); + tmp108_AST = astFactory->create(LT(1)); + astFactory->addASTChild(currentAST, tmp108_AST); } match(ASC); break; } case DESC: { - ANTLR_USE_NAMESPACE(antlr)RefAST tmp107_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; + ANTLR_USE_NAMESPACE(antlr)RefAST tmp109_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { - tmp107_AST = astFactory->create(LT(1)); - astFactory->addASTChild(currentAST, tmp107_AST); + tmp109_AST = astFactory->create(LT(1)); + astFactory->addASTChild(currentAST, tmp109_AST); } match(DESC); break; @@ -2280,10 +2409,10 @@ switch ( LA(1)) { case AUTOINCREMENT: { - ANTLR_USE_NAMESPACE(antlr)RefAST tmp108_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; + ANTLR_USE_NAMESPACE(antlr)RefAST tmp110_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { - tmp108_AST = astFactory->create(LT(1)); - astFactory->addASTChild(currentAST, tmp108_AST); + tmp110_AST = astFactory->create(LT(1)); + astFactory->addASTChild(currentAST, tmp110_AST); } match(AUTOINCREMENT); break; @@ -2323,521 +2452,521 @@ switch ( LA(1)) { case ABORT: { - ANTLR_USE_NAMESPACE(antlr)RefAST tmp109_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; - if ( inputState->guessing == 0 ) { - tmp109_AST = astFactory->create(LT(1)); - astFactory->addASTChild(currentAST, tmp109_AST); - } - match(ABORT); - break; - } - case ACTION: - { - ANTLR_USE_NAMESPACE(antlr)RefAST tmp110_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; - if ( inputState->guessing == 0 ) { - tmp110_AST = astFactory->create(LT(1)); - astFactory->addASTChild(currentAST, tmp110_AST); - } - match(ACTION); - break; - } - case AUTOINCREMENT: - { ANTLR_USE_NAMESPACE(antlr)RefAST tmp111_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { tmp111_AST = astFactory->create(LT(1)); astFactory->addASTChild(currentAST, tmp111_AST); } - match(AUTOINCREMENT); + match(ABORT); break; } - case AS: + case ACTION: { ANTLR_USE_NAMESPACE(antlr)RefAST tmp112_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { tmp112_AST = astFactory->create(LT(1)); astFactory->addASTChild(currentAST, tmp112_AST); } - match(AS); + match(ACTION); break; } - case ASC: + case AUTOINCREMENT: { ANTLR_USE_NAMESPACE(antlr)RefAST tmp113_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { tmp113_AST = astFactory->create(LT(1)); astFactory->addASTChild(currentAST, tmp113_AST); } - match(ASC); + match(AUTOINCREMENT); break; } - case AND: + case AS: { ANTLR_USE_NAMESPACE(antlr)RefAST tmp114_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { tmp114_AST = astFactory->create(LT(1)); astFactory->addASTChild(currentAST, tmp114_AST); } - match(AND); + match(AS); break; } - case OR: + case ASC: { ANTLR_USE_NAMESPACE(antlr)RefAST tmp115_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { tmp115_AST = astFactory->create(LT(1)); astFactory->addASTChild(currentAST, tmp115_AST); } - match(OR); + match(ASC); break; } - case CASCADE: + case AND: { ANTLR_USE_NAMESPACE(antlr)RefAST tmp116_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { tmp116_AST = astFactory->create(LT(1)); astFactory->addASTChild(currentAST, tmp116_AST); } - match(CASCADE); + match(AND); break; } - case CASE_T: + case OR: { ANTLR_USE_NAMESPACE(antlr)RefAST tmp117_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { tmp117_AST = astFactory->create(LT(1)); astFactory->addASTChild(currentAST, tmp117_AST); } - match(CASE_T); + match(OR); break; } - case CAST: + case CASCADE: { ANTLR_USE_NAMESPACE(antlr)RefAST tmp118_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { tmp118_AST = astFactory->create(LT(1)); astFactory->addASTChild(currentAST, tmp118_AST); } - match(CAST); + match(CASCADE); break; } - case CREATE: + case CASE_T: { ANTLR_USE_NAMESPACE(antlr)RefAST tmp119_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { tmp119_AST = astFactory->create(LT(1)); astFactory->addASTChild(currentAST, tmp119_AST); } - match(CREATE); + match(CASE_T); break; } - case COLLATE: + case CAST: { ANTLR_USE_NAMESPACE(antlr)RefAST tmp120_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { tmp120_AST = astFactory->create(LT(1)); astFactory->addASTChild(currentAST, tmp120_AST); } - match(COLLATE); + match(CAST); break; } - case CONFLICT: + case CREATE: { ANTLR_USE_NAMESPACE(antlr)RefAST tmp121_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { tmp121_AST = astFactory->create(LT(1)); astFactory->addASTChild(currentAST, tmp121_AST); } - match(CONFLICT); + match(CREATE); break; } - case CURRENT_TIME: + case COLLATE: { ANTLR_USE_NAMESPACE(antlr)RefAST tmp122_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { tmp122_AST = astFactory->create(LT(1)); astFactory->addASTChild(currentAST, tmp122_AST); } - match(CURRENT_TIME); + match(COLLATE); break; } - case CURRENT_DATE: + case CONFLICT: { ANTLR_USE_NAMESPACE(antlr)RefAST tmp123_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { tmp123_AST = astFactory->create(LT(1)); astFactory->addASTChild(currentAST, tmp123_AST); } - match(CURRENT_DATE); + match(CONFLICT); break; } - case CURRENT_TIMESTAMP: + case CURRENT_TIME: { ANTLR_USE_NAMESPACE(antlr)RefAST tmp124_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { tmp124_AST = astFactory->create(LT(1)); astFactory->addASTChild(currentAST, tmp124_AST); } - match(CURRENT_TIMESTAMP); + match(CURRENT_TIME); break; } - case DEFAULT: + case CURRENT_DATE: { ANTLR_USE_NAMESPACE(antlr)RefAST tmp125_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { tmp125_AST = astFactory->create(LT(1)); astFactory->addASTChild(currentAST, tmp125_AST); } - match(DEFAULT); + match(CURRENT_DATE); break; } - case DEFERRABLE: + case CURRENT_TIMESTAMP: { ANTLR_USE_NAMESPACE(antlr)RefAST tmp126_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { tmp126_AST = astFactory->create(LT(1)); astFactory->addASTChild(currentAST, tmp126_AST); } - match(DEFERRABLE); + match(CURRENT_TIMESTAMP); break; } - case DEFERRED: + case DEFAULT: { ANTLR_USE_NAMESPACE(antlr)RefAST tmp127_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { tmp127_AST = astFactory->create(LT(1)); astFactory->addASTChild(currentAST, tmp127_AST); } - match(DEFERRED); + match(DEFAULT); break; } - case DELETE: + case DEFERRABLE: { ANTLR_USE_NAMESPACE(antlr)RefAST tmp128_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { tmp128_AST = astFactory->create(LT(1)); astFactory->addASTChild(currentAST, tmp128_AST); } - match(DELETE); + match(DEFERRABLE); break; } - case DESC: + case DEFERRED: { ANTLR_USE_NAMESPACE(antlr)RefAST tmp129_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { tmp129_AST = astFactory->create(LT(1)); astFactory->addASTChild(currentAST, tmp129_AST); } - match(DESC); + match(DEFERRED); break; } - case ELSE_T: + case DELETE: { ANTLR_USE_NAMESPACE(antlr)RefAST tmp130_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { tmp130_AST = astFactory->create(LT(1)); astFactory->addASTChild(currentAST, tmp130_AST); } - match(ELSE_T); + match(DELETE); break; } - case END: + case DESC: { ANTLR_USE_NAMESPACE(antlr)RefAST tmp131_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { tmp131_AST = astFactory->create(LT(1)); astFactory->addASTChild(currentAST, tmp131_AST); } - match(END); + match(DESC); break; } - case ESCAPE: + case ELSE_T: { ANTLR_USE_NAMESPACE(antlr)RefAST tmp132_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { tmp132_AST = astFactory->create(LT(1)); astFactory->addASTChild(currentAST, tmp132_AST); } - match(ESCAPE); + match(ELSE_T); break; } - case FAIL: + case END: { ANTLR_USE_NAMESPACE(antlr)RefAST tmp133_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { tmp133_AST = astFactory->create(LT(1)); astFactory->addASTChild(currentAST, tmp133_AST); } - match(FAIL); + match(END); break; } - case GLOB: + case ESCAPE: { ANTLR_USE_NAMESPACE(antlr)RefAST tmp134_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { tmp134_AST = astFactory->create(LT(1)); astFactory->addASTChild(currentAST, tmp134_AST); } - match(GLOB); + match(ESCAPE); break; } - case KEY: + case FAIL: { ANTLR_USE_NAMESPACE(antlr)RefAST tmp135_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { tmp135_AST = astFactory->create(LT(1)); astFactory->addASTChild(currentAST, tmp135_AST); } - match(KEY); + match(FAIL); break; } - case LIKE: + case GLOB: { ANTLR_USE_NAMESPACE(antlr)RefAST tmp136_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { tmp136_AST = astFactory->create(LT(1)); astFactory->addASTChild(currentAST, tmp136_AST); } - match(LIKE); + match(GLOB); break; } - case TABLE: + case KEY: { ANTLR_USE_NAMESPACE(antlr)RefAST tmp137_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { tmp137_AST = astFactory->create(LT(1)); astFactory->addASTChild(currentAST, tmp137_AST); } - match(TABLE); + match(KEY); break; } - case IF_T: + case LIKE: { ANTLR_USE_NAMESPACE(antlr)RefAST tmp138_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { tmp138_AST = astFactory->create(LT(1)); astFactory->addASTChild(currentAST, tmp138_AST); } - match(IF_T); + match(LIKE); break; } - case IGNORE: + case TABLE: { ANTLR_USE_NAMESPACE(antlr)RefAST tmp139_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { tmp139_AST = astFactory->create(LT(1)); astFactory->addASTChild(currentAST, tmp139_AST); } - match(IGNORE); + match(TABLE); break; } - case INITIALLY: + case IF_T: { ANTLR_USE_NAMESPACE(antlr)RefAST tmp140_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { tmp140_AST = astFactory->create(LT(1)); astFactory->addASTChild(currentAST, tmp140_AST); } - match(INITIALLY); + match(IF_T); break; } - case IMMEDIATE: + case IGNORE: { ANTLR_USE_NAMESPACE(antlr)RefAST tmp141_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { tmp141_AST = astFactory->create(LT(1)); astFactory->addASTChild(currentAST, tmp141_AST); } - match(IMMEDIATE); + match(IGNORE); break; } - case IS: + case INITIALLY: { ANTLR_USE_NAMESPACE(antlr)RefAST tmp142_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { tmp142_AST = astFactory->create(LT(1)); astFactory->addASTChild(currentAST, tmp142_AST); } - match(IS); + match(INITIALLY); break; } - case NULL_T: + case IMMEDIATE: { ANTLR_USE_NAMESPACE(antlr)RefAST tmp143_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { tmp143_AST = astFactory->create(LT(1)); astFactory->addASTChild(currentAST, tmp143_AST); } - match(NULL_T); + match(IMMEDIATE); break; } - case MATCH: + case IS: { ANTLR_USE_NAMESPACE(antlr)RefAST tmp144_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { tmp144_AST = astFactory->create(LT(1)); astFactory->addASTChild(currentAST, tmp144_AST); } - match(MATCH); + match(IS); break; } - case EXISTS: + case NULL_T: { ANTLR_USE_NAMESPACE(antlr)RefAST tmp145_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { tmp145_AST = astFactory->create(LT(1)); astFactory->addASTChild(currentAST, tmp145_AST); } - match(EXISTS); + match(NULL_T); break; } - case NO: + case MATCH: { ANTLR_USE_NAMESPACE(antlr)RefAST tmp146_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { tmp146_AST = astFactory->create(LT(1)); astFactory->addASTChild(currentAST, tmp146_AST); } - match(NO); + match(MATCH); break; } - case ON: + case EXISTS: { ANTLR_USE_NAMESPACE(antlr)RefAST tmp147_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { tmp147_AST = astFactory->create(LT(1)); astFactory->addASTChild(currentAST, tmp147_AST); } - match(ON); + match(EXISTS); break; } - case RAISE: + case NO: { ANTLR_USE_NAMESPACE(antlr)RefAST tmp148_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { tmp148_AST = astFactory->create(LT(1)); astFactory->addASTChild(currentAST, tmp148_AST); } - match(RAISE); + match(NO); break; } - case REFERENCES: + case ON: { ANTLR_USE_NAMESPACE(antlr)RefAST tmp149_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { tmp149_AST = astFactory->create(LT(1)); astFactory->addASTChild(currentAST, tmp149_AST); } - match(REFERENCES); + match(ON); break; } - case REGEXP: + case RAISE: { ANTLR_USE_NAMESPACE(antlr)RefAST tmp150_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { tmp150_AST = astFactory->create(LT(1)); astFactory->addASTChild(currentAST, tmp150_AST); } - match(REGEXP); + match(RAISE); break; } - case REPLACE: + case REFERENCES: { ANTLR_USE_NAMESPACE(antlr)RefAST tmp151_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { tmp151_AST = astFactory->create(LT(1)); astFactory->addASTChild(currentAST, tmp151_AST); } - match(REPLACE); + match(REFERENCES); break; } - case RESTRICT: + case REGEXP: { ANTLR_USE_NAMESPACE(antlr)RefAST tmp152_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { tmp152_AST = astFactory->create(LT(1)); astFactory->addASTChild(currentAST, tmp152_AST); } - match(RESTRICT); + match(REGEXP); break; } - case ROLLBACK: + case REPLACE: { ANTLR_USE_NAMESPACE(antlr)RefAST tmp153_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { tmp153_AST = astFactory->create(LT(1)); astFactory->addASTChild(currentAST, tmp153_AST); } - match(ROLLBACK); + match(REPLACE); break; } - case ROWID: + case RESTRICT: { ANTLR_USE_NAMESPACE(antlr)RefAST tmp154_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { tmp154_AST = astFactory->create(LT(1)); astFactory->addASTChild(currentAST, tmp154_AST); } - match(ROWID); + match(RESTRICT); break; } - case SET: + case ROLLBACK: { ANTLR_USE_NAMESPACE(antlr)RefAST tmp155_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { tmp155_AST = astFactory->create(LT(1)); astFactory->addASTChild(currentAST, tmp155_AST); } - match(SET); + match(ROLLBACK); break; } - case TEMPORARY: + case ROWID: { ANTLR_USE_NAMESPACE(antlr)RefAST tmp156_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { tmp156_AST = astFactory->create(LT(1)); astFactory->addASTChild(currentAST, tmp156_AST); } - match(TEMPORARY); + match(ROWID); break; } - case TEMP: + case SET: { ANTLR_USE_NAMESPACE(antlr)RefAST tmp157_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { tmp157_AST = astFactory->create(LT(1)); astFactory->addASTChild(currentAST, tmp157_AST); } - match(TEMP); + match(SET); break; } - case THEN: + case TEMPORARY: { ANTLR_USE_NAMESPACE(antlr)RefAST tmp158_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { tmp158_AST = astFactory->create(LT(1)); astFactory->addASTChild(currentAST, tmp158_AST); } - match(THEN); + match(TEMPORARY); break; } - case UPDATE: + case TEMP: { ANTLR_USE_NAMESPACE(antlr)RefAST tmp159_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { tmp159_AST = astFactory->create(LT(1)); astFactory->addASTChild(currentAST, tmp159_AST); } - match(UPDATE); + match(TEMP); break; } - case WHEN: + case THEN: { ANTLR_USE_NAMESPACE(antlr)RefAST tmp160_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { tmp160_AST = astFactory->create(LT(1)); astFactory->addASTChild(currentAST, tmp160_AST); } + match(THEN); + break; + } + case UPDATE: + { + ANTLR_USE_NAMESPACE(antlr)RefAST tmp161_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; + if ( inputState->guessing == 0 ) { + tmp161_AST = astFactory->create(LT(1)); + astFactory->addASTChild(currentAST, tmp161_AST); + } + match(UPDATE); + break; + } + case WHEN: + { + ANTLR_USE_NAMESPACE(antlr)RefAST tmp162_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; + if ( inputState->guessing == 0 ) { + tmp162_AST = astFactory->create(LT(1)); + astFactory->addASTChild(currentAST, tmp162_AST); + } match(WHEN); break; } @@ -3019,10 +3148,10 @@ switch ( LA(1)) { case LPAREN: { - ANTLR_USE_NAMESPACE(antlr)RefAST tmp161_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; + ANTLR_USE_NAMESPACE(antlr)RefAST tmp163_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { - tmp161_AST = astFactory->create(LT(1)); - astFactory->addASTChild(currentAST, tmp161_AST); + tmp163_AST = astFactory->create(LT(1)); + astFactory->addASTChild(currentAST, tmp163_AST); } match(LPAREN); signednumber(); @@ -3033,10 +3162,10 @@ switch ( LA(1)) { case COMMA: { - ANTLR_USE_NAMESPACE(antlr)RefAST tmp162_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; + ANTLR_USE_NAMESPACE(antlr)RefAST tmp164_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { - tmp162_AST = astFactory->create(LT(1)); - astFactory->addASTChild(currentAST, tmp162_AST); + tmp164_AST = astFactory->create(LT(1)); + astFactory->addASTChild(currentAST, tmp164_AST); } match(COMMA); signednumber(); @@ -3055,10 +3184,10 @@ } } } - ANTLR_USE_NAMESPACE(antlr)RefAST tmp163_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; + ANTLR_USE_NAMESPACE(antlr)RefAST tmp165_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { - tmp163_AST = astFactory->create(LT(1)); - astFactory->addASTChild(currentAST, tmp163_AST); + tmp165_AST = astFactory->create(LT(1)); + astFactory->addASTChild(currentAST, tmp165_AST); } match(RPAREN); break; @@ -3108,10 +3237,10 @@ switch ( LA(1)) { case CONSTRAINT: { - ANTLR_USE_NAMESPACE(antlr)RefAST tmp164_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; + ANTLR_USE_NAMESPACE(antlr)RefAST tmp166_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { - tmp164_AST = astFactory->create(LT(1)); - astFactory->addASTChild(currentAST, tmp164_AST); + tmp166_AST = astFactory->create(LT(1)); + astFactory->addASTChild(currentAST, tmp166_AST); } match(CONSTRAINT); name(); @@ -3141,36 +3270,36 @@ switch ( LA(1)) { case PRIMARY: { - ANTLR_USE_NAMESPACE(antlr)RefAST tmp165_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; + ANTLR_USE_NAMESPACE(antlr)RefAST tmp167_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { - tmp165_AST = astFactory->create(LT(1)); - astFactory->addASTChild(currentAST, tmp165_AST); + tmp167_AST = astFactory->create(LT(1)); + astFactory->addASTChild(currentAST, tmp167_AST); } match(PRIMARY); - ANTLR_USE_NAMESPACE(antlr)RefAST tmp166_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; + ANTLR_USE_NAMESPACE(antlr)RefAST tmp168_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { - tmp166_AST = astFactory->create(LT(1)); - astFactory->addASTChild(currentAST, tmp166_AST); + tmp168_AST = astFactory->create(LT(1)); + astFactory->addASTChild(currentAST, tmp168_AST); } match(KEY); { switch ( LA(1)) { case ASC: { - ANTLR_USE_NAMESPACE(antlr)RefAST tmp167_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; + ANTLR_USE_NAMESPACE(antlr)RefAST tmp169_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { - tmp167_AST = astFactory->create(LT(1)); - astFactory->addASTChild(currentAST, tmp167_AST); + tmp169_AST = astFactory->create(LT(1)); + astFactory->addASTChild(currentAST, tmp169_AST); } match(ASC); break; } case DESC: { - ANTLR_USE_NAMESPACE(antlr)RefAST tmp168_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; + ANTLR_USE_NAMESPACE(antlr)RefAST tmp170_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { - tmp168_AST = astFactory->create(LT(1)); - astFactory->addASTChild(currentAST, tmp168_AST); + tmp170_AST = astFactory->create(LT(1)); + astFactory->addASTChild(currentAST, tmp170_AST); } match(DESC); break; @@ -3234,10 +3363,10 @@ switch ( LA(1)) { case AUTOINCREMENT: { - ANTLR_USE_NAMESPACE(antlr)RefAST tmp169_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; + ANTLR_USE_NAMESPACE(antlr)RefAST tmp171_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { - tmp169_AST = astFactory->create(LT(1)); - astFactory->addASTChild(currentAST, tmp169_AST); + tmp171_AST = astFactory->create(LT(1)); + astFactory->addASTChild(currentAST, tmp171_AST); } match(AUTOINCREMENT); break; @@ -3272,10 +3401,10 @@ switch ( LA(1)) { case NOT: { - ANTLR_USE_NAMESPACE(antlr)RefAST tmp170_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; + ANTLR_USE_NAMESPACE(antlr)RefAST tmp172_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { - tmp170_AST = astFactory->create(LT(1)); - astFactory->addASTChild(currentAST, tmp170_AST); + tmp172_AST = astFactory->create(LT(1)); + astFactory->addASTChild(currentAST, tmp172_AST); } match(NOT); break; @@ -3290,10 +3419,10 @@ } } } - ANTLR_USE_NAMESPACE(antlr)RefAST tmp171_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; + ANTLR_USE_NAMESPACE(antlr)RefAST tmp173_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { - tmp171_AST = astFactory->create(LT(1)); - astFactory->addASTChild(currentAST, tmp171_AST); + tmp173_AST = astFactory->create(LT(1)); + astFactory->addASTChild(currentAST, tmp173_AST); } match(NULL_T); { @@ -3331,10 +3460,10 @@ } case UNIQUE: { - ANTLR_USE_NAMESPACE(antlr)RefAST tmp172_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; + ANTLR_USE_NAMESPACE(antlr)RefAST tmp174_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { - tmp172_AST = astFactory->create(LT(1)); - astFactory->addASTChild(currentAST, tmp172_AST); + tmp174_AST = astFactory->create(LT(1)); + astFactory->addASTChild(currentAST, tmp174_AST); } match(UNIQUE); { @@ -3372,94 +3501,94 @@ } case CHECK: { - ANTLR_USE_NAMESPACE(antlr)RefAST tmp173_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; + ANTLR_USE_NAMESPACE(antlr)RefAST tmp175_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { - tmp173_AST = astFactory->create(LT(1)); - astFactory->addASTChild(currentAST, tmp173_AST); + tmp175_AST = astFactory->create(LT(1)); + astFactory->addASTChild(currentAST, tmp175_AST); } match(CHECK); - ANTLR_USE_NAMESPACE(antlr)RefAST tmp174_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; + ANTLR_USE_NAMESPACE(antlr)RefAST tmp176_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { - tmp174_AST = astFactory->create(LT(1)); - astFactory->addASTChild(currentAST, tmp174_AST); + tmp176_AST = astFactory->create(LT(1)); + astFactory->addASTChild(currentAST, tmp176_AST); } match(LPAREN); expr(); if (inputState->guessing==0) { astFactory->addASTChild( currentAST, returnAST ); } - ANTLR_USE_NAMESPACE(antlr)RefAST tmp175_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; + ANTLR_USE_NAMESPACE(antlr)RefAST tmp177_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { - tmp175_AST = astFactory->create(LT(1)); - astFactory->addASTChild(currentAST, tmp175_AST); + tmp177_AST = astFactory->create(LT(1)); + astFactory->addASTChild(currentAST, tmp177_AST); } match(RPAREN); break; } case DEFAULT: { - ANTLR_USE_NAMESPACE(antlr)RefAST tmp176_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; + ANTLR_USE_NAMESPACE(antlr)RefAST tmp178_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { - tmp176_AST = astFactory->create(LT(1)); - astFactory->addASTChild(currentAST, tmp176_AST); + tmp178_AST = astFactory->create(LT(1)); + astFactory->addASTChild(currentAST, tmp178_AST); } match(DEFAULT); { switch ( LA(1)) { case QUOTEDLITERAL: { - ANTLR_USE_NAMESPACE(antlr)RefAST tmp177_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; + ANTLR_USE_NAMESPACE(antlr)RefAST tmp179_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { - tmp177_AST = astFactory->create(LT(1)); - astFactory->addASTChild(currentAST, tmp177_AST); + tmp179_AST = astFactory->create(LT(1)); + astFactory->addASTChild(currentAST, tmp179_AST); } match(QUOTEDLITERAL); break; } case LPAREN: { - ANTLR_USE_NAMESPACE(antlr)RefAST tmp178_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; + ANTLR_USE_NAMESPACE(antlr)RefAST tmp180_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { - tmp178_AST = astFactory->create(LT(1)); - astFactory->addASTChild(currentAST, tmp178_AST); + tmp180_AST = astFactory->create(LT(1)); + astFactory->addASTChild(currentAST, tmp180_AST); } match(LPAREN); expr(); if (inputState->guessing==0) { astFactory->addASTChild( currentAST, returnAST ); } - ANTLR_USE_NAMESPACE(antlr)RefAST tmp179_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; + ANTLR_USE_NAMESPACE(antlr)RefAST tmp181_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { - tmp179_AST = astFactory->create(LT(1)); - astFactory->addASTChild(currentAST, tmp179_AST); + tmp181_AST = astFactory->create(LT(1)); + astFactory->addASTChild(currentAST, tmp181_AST); } match(RPAREN); break; } case ID: { - ANTLR_USE_NAMESPACE(antlr)RefAST tmp180_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; + ANTLR_USE_NAMESPACE(antlr)RefAST tmp182_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { - tmp180_AST = astFactory->create(LT(1)); - astFactory->addASTChild(currentAST, tmp180_AST); + tmp182_AST = astFactory->create(LT(1)); + astFactory->addASTChild(currentAST, tmp182_AST); } match(ID); break; } default: - if ((_tokenSet_10.member(LA(1))) && (_tokenSet_11.member(LA(2)))) { + if ((_tokenSet_12.member(LA(1))) && (_tokenSet_13.member(LA(2)))) { literalvalue(); if (inputState->guessing==0) { astFactory->addASTChild( currentAST, returnAST ); } } - else if ((_tokenSet_12.member(LA(1))) && (_tokenSet_11.member(LA(2)))) { + else if ((_tokenSet_14.member(LA(1))) && (_tokenSet_13.member(LA(2)))) { keywordastablename(); if (inputState->guessing==0) { astFactory->addASTChild( currentAST, returnAST ); } } - else if ((LA(1) == NUMERIC || LA(1) == PLUS || LA(1) == MINUS) && (_tokenSet_13.member(LA(2)))) { + else if ((LA(1) == NUMERIC || LA(1) == PLUS || LA(1) == MINUS) && (_tokenSet_15.member(LA(2)))) { signednumber(); if (inputState->guessing==0) { astFactory->addASTChild( currentAST, returnAST ); @@ -3474,10 +3603,10 @@ } case COLLATE: { - ANTLR_USE_NAMESPACE(antlr)RefAST tmp181_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; + ANTLR_USE_NAMESPACE(antlr)RefAST tmp183_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { - tmp181_AST = astFactory->create(LT(1)); - astFactory->addASTChild(currentAST, tmp181_AST); + tmp183_AST = astFactory->create(LT(1)); + astFactory->addASTChild(currentAST, tmp183_AST); } match(COLLATE); collationname(); @@ -3520,66 +3649,66 @@ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST; ANTLR_USE_NAMESPACE(antlr)RefAST conflictclause_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; - ANTLR_USE_NAMESPACE(antlr)RefAST tmp182_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; + ANTLR_USE_NAMESPACE(antlr)RefAST tmp184_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { - tmp182_AST = astFactory->create(LT(1)); - astFactory->addASTChild(currentAST, tmp182_AST); + tmp184_AST = astFactory->create(LT(1)); + astFactory->addASTChild(currentAST, tmp184_AST); } match(ON); - ANTLR_USE_NAMESPACE(antlr)RefAST tmp183_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; + ANTLR_USE_NAMESPACE(antlr)RefAST tmp185_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { - tmp183_AST = astFactory->create(LT(1)); - astFactory->addASTChild(currentAST, tmp183_AST); + tmp185_AST = astFactory->create(LT(1)); + astFactory->addASTChild(currentAST, tmp185_AST); } match(CONFLICT); { switch ( LA(1)) { case ROLLBACK: { - ANTLR_USE_NAMESPACE(antlr)RefAST tmp184_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; + ANTLR_USE_NAMESPACE(antlr)RefAST tmp186_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { - tmp184_AST = astFactory->create(LT(1)); - astFactory->addASTChild(currentAST, tmp184_AST); + tmp186_AST = astFactory->create(LT(1)); + astFactory->addASTChild(currentAST, tmp186_AST); } match(ROLLBACK); break; } case ABORT: { - ANTLR_USE_NAMESPACE(antlr)RefAST tmp185_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; + ANTLR_USE_NAMESPACE(antlr)RefAST tmp187_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { - tmp185_AST = astFactory->create(LT(1)); - astFactory->addASTChild(currentAST, tmp185_AST); + tmp187_AST = astFactory->create(LT(1)); + astFactory->addASTChild(currentAST, tmp187_AST); } match(ABORT); break; } case FAIL: { - ANTLR_USE_NAMESPACE(antlr)RefAST tmp186_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; + ANTLR_USE_NAMESPACE(antlr)RefAST tmp188_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { - tmp186_AST = astFactory->create(LT(1)); - astFactory->addASTChild(currentAST, tmp186_AST); + tmp188_AST = astFactory->create(LT(1)); + astFactory->addASTChild(currentAST, tmp188_AST); } match(FAIL); break; } case IGNORE: { - ANTLR_USE_NAMESPACE(antlr)RefAST tmp187_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; + ANTLR_USE_NAMESPACE(antlr)RefAST tmp189_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { - tmp187_AST = astFactory->create(LT(1)); - astFactory->addASTChild(currentAST, tmp187_AST); + tmp189_AST = astFactory->create(LT(1)); + astFactory->addASTChild(currentAST, tmp189_AST); } match(IGNORE); break; } case REPLACE: { - ANTLR_USE_NAMESPACE(antlr)RefAST tmp188_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; + ANTLR_USE_NAMESPACE(antlr)RefAST tmp190_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { - tmp188_AST = astFactory->create(LT(1)); - astFactory->addASTChild(currentAST, tmp188_AST); + tmp190_AST = astFactory->create(LT(1)); + astFactory->addASTChild(currentAST, tmp190_AST); } match(REPLACE); break; @@ -3602,10 +3731,10 @@ switch ( LA(1)) { case NUMERIC: { - ANTLR_USE_NAMESPACE(antlr)RefAST tmp189_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; + ANTLR_USE_NAMESPACE(antlr)RefAST tmp191_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { - tmp189_AST = astFactory->create(LT(1)); - astFactory->addASTChild(currentAST, tmp189_AST); + tmp191_AST = astFactory->create(LT(1)); + astFactory->addASTChild(currentAST, tmp191_AST); } match(NUMERIC); literalvalue_AST = currentAST.root; @@ -3613,10 +3742,10 @@ } case STRINGLITERAL: { - ANTLR_USE_NAMESPACE(antlr)RefAST tmp190_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; + ANTLR_USE_NAMESPACE(antlr)RefAST tmp192_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { - tmp190_AST = astFactory->create(LT(1)); - astFactory->addASTChild(currentAST, tmp190_AST); + tmp192_AST = astFactory->create(LT(1)); + astFactory->addASTChild(currentAST, tmp192_AST); } match(STRINGLITERAL); literalvalue_AST = currentAST.root; @@ -3624,10 +3753,10 @@ } case NULL_T: { - ANTLR_USE_NAMESPACE(antlr)RefAST tmp191_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; + ANTLR_USE_NAMESPACE(antlr)RefAST tmp193_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { - tmp191_AST = astFactory->create(LT(1)); - astFactory->addASTChild(currentAST, tmp191_AST); + tmp193_AST = astFactory->create(LT(1)); + astFactory->addASTChild(currentAST, tmp193_AST); } match(NULL_T); literalvalue_AST = currentAST.root; @@ -3635,10 +3764,10 @@ } case CURRENT_TIME: { - ANTLR_USE_NAMESPACE(antlr)RefAST tmp192_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; + ANTLR_USE_NAMESPACE(antlr)RefAST tmp194_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { - tmp192_AST = astFactory->create(LT(1)); - astFactory->addASTChild(currentAST, tmp192_AST); + tmp194_AST = astFactory->create(LT(1)); + astFactory->addASTChild(currentAST, tmp194_AST); } match(CURRENT_TIME); literalvalue_AST = currentAST.root; @@ -3646,10 +3775,10 @@ } case CURRENT_DATE: { - ANTLR_USE_NAMESPACE(antlr)RefAST tmp193_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; + ANTLR_USE_NAMESPACE(antlr)RefAST tmp195_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { - tmp193_AST = astFactory->create(LT(1)); - astFactory->addASTChild(currentAST, tmp193_AST); + tmp195_AST = astFactory->create(LT(1)); + astFactory->addASTChild(currentAST, tmp195_AST); } match(CURRENT_DATE); literalvalue_AST = currentAST.root; @@ -3657,10 +3786,10 @@ } case CURRENT_TIMESTAMP: { - ANTLR_USE_NAMESPACE(antlr)RefAST tmp194_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; + ANTLR_USE_NAMESPACE(antlr)RefAST tmp196_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { - tmp194_AST = astFactory->create(LT(1)); - astFactory->addASTChild(currentAST, tmp194_AST); + tmp196_AST = astFactory->create(LT(1)); + astFactory->addASTChild(currentAST, tmp196_AST); } match(CURRENT_TIMESTAMP); literalvalue_AST = currentAST.root; @@ -3679,10 +3808,10 @@ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST; ANTLR_USE_NAMESPACE(antlr)RefAST foreignkeyclause_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; - ANTLR_USE_NAMESPACE(antlr)RefAST tmp195_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; + ANTLR_USE_NAMESPACE(antlr)RefAST tmp197_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { - tmp195_AST = astFactory->create(LT(1)); - astFactory->addASTChild(currentAST, tmp195_AST); + tmp197_AST = astFactory->create(LT(1)); + astFactory->addASTChild(currentAST, tmp197_AST); } match(REFERENCES); tablename(); @@ -3693,10 +3822,10 @@ switch ( LA(1)) { case LPAREN: { - ANTLR_USE_NAMESPACE(antlr)RefAST tmp196_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; + ANTLR_USE_NAMESPACE(antlr)RefAST tmp198_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { - tmp196_AST = astFactory->create(LT(1)); - astFactory->addASTChild(currentAST, tmp196_AST); + tmp198_AST = astFactory->create(LT(1)); + astFactory->addASTChild(currentAST, tmp198_AST); } match(LPAREN); columnname(); @@ -3706,10 +3835,10 @@ { // ( ... )* for (;;) { if ((LA(1) == COMMA)) { - ANTLR_USE_NAMESPACE(antlr)RefAST tmp197_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; + ANTLR_USE_NAMESPACE(antlr)RefAST tmp199_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { - tmp197_AST = astFactory->create(LT(1)); - astFactory->addASTChild(currentAST, tmp197_AST); + tmp199_AST = astFactory->create(LT(1)); + astFactory->addASTChild(currentAST, tmp199_AST); } match(COMMA); columnname(); @@ -3724,10 +3853,10 @@ } _loop159:; } // ( ... )* - ANTLR_USE_NAMESPACE(antlr)RefAST tmp198_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; + ANTLR_USE_NAMESPACE(antlr)RefAST tmp200_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { - tmp198_AST = astFactory->create(LT(1)); - astFactory->addASTChild(currentAST, tmp198_AST); + tmp200_AST = astFactory->create(LT(1)); + astFactory->addASTChild(currentAST, tmp200_AST); } match(RPAREN); break; @@ -3761,40 +3890,40 @@ switch ( LA(1)) { case ON: { - ANTLR_USE_NAMESPACE(antlr)RefAST tmp199_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; + ANTLR_USE_NAMESPACE(antlr)RefAST tmp201_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { - tmp199_AST = astFactory->create(LT(1)); - astFactory->addASTChild(currentAST, tmp199_AST); + tmp201_AST = astFactory->create(LT(1)); + astFactory->addASTChild(currentAST, tmp201_AST); } match(ON); { switch ( LA(1)) { case DELETE: { - ANTLR_USE_NAMESPACE(antlr)RefAST tmp200_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; + ANTLR_USE_NAMESPACE(antlr)RefAST tmp202_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { - tmp200_AST = astFactory->create(LT(1)); - astFactory->addASTChild(currentAST, tmp200_AST); + tmp202_AST = astFactory->create(LT(1)); + astFactory->addASTChild(currentAST, tmp202_AST); } match(DELETE); break; } case UPDATE: { - ANTLR_USE_NAMESPACE(antlr)RefAST tmp201_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; + ANTLR_USE_NAMESPACE(antlr)RefAST tmp203_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { - tmp201_AST = astFactory->create(LT(1)); - astFactory->addASTChild(currentAST, tmp201_AST); + tmp203_AST = astFactory->create(LT(1)); + astFactory->addASTChild(currentAST, tmp203_AST); } match(UPDATE); break; } case INSERT: { - ANTLR_USE_NAMESPACE(antlr)RefAST tmp202_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; + ANTLR_USE_NAMESPACE(antlr)RefAST tmp204_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { - tmp202_AST = astFactory->create(LT(1)); - astFactory->addASTChild(currentAST, tmp202_AST); + tmp204_AST = astFactory->create(LT(1)); + astFactory->addASTChild(currentAST, tmp204_AST); } match(INSERT); break; @@ -3809,30 +3938,30 @@ switch ( LA(1)) { case SET: { - ANTLR_USE_NAMESPACE(antlr)RefAST tmp203_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; + ANTLR_USE_NAMESPACE(antlr)RefAST tmp205_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { - tmp203_AST = astFactory->create(LT(1)); - astFactory->addASTChild(currentAST, tmp203_AST); + tmp205_AST = astFactory->create(LT(1)); + astFactory->addASTChild(currentAST, tmp205_AST); } match(SET); { switch ( LA(1)) { case NULL_T: { - ANTLR_USE_NAMESPACE(antlr)RefAST tmp204_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; + ANTLR_USE_NAMESPACE(antlr)RefAST tmp206_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { - tmp204_AST = astFactory->create(LT(1)); - astFactory->addASTChild(currentAST, tmp204_AST); + tmp206_AST = astFactory->create(LT(1)); + astFactory->addASTChild(currentAST, tmp206_AST); } match(NULL_T); break; } case DEFAULT: { - ANTLR_USE_NAMESPACE(antlr)RefAST tmp205_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; + ANTLR_USE_NAMESPACE(antlr)RefAST tmp207_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { - tmp205_AST = astFactory->create(LT(1)); - astFactory->addASTChild(currentAST, tmp205_AST); + tmp207_AST = astFactory->create(LT(1)); + astFactory->addASTChild(currentAST, tmp207_AST); } match(DEFAULT); break; @@ -3847,36 +3976,36 @@ } case CASCADE: { - ANTLR_USE_NAMESPACE(antlr)RefAST tmp206_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; + ANTLR_USE_NAMESPACE(antlr)RefAST tmp208_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { - tmp206_AST = astFactory->create(LT(1)); - astFactory->addASTChild(currentAST, tmp206_AST); + tmp208_AST = astFactory->create(LT(1)); + astFactory->addASTChild(currentAST, tmp208_AST); } match(CASCADE); break; } case RESTRICT: { - ANTLR_USE_NAMESPACE(antlr)RefAST tmp207_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; + ANTLR_USE_NAMESPACE(antlr)RefAST tmp209_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { - tmp207_AST = astFactory->create(LT(1)); - astFactory->addASTChild(currentAST, tmp207_AST); + tmp209_AST = astFactory->create(LT(1)); + astFactory->addASTChild(currentAST, tmp209_AST); } match(RESTRICT); break; } case NO: { - ANTLR_USE_NAMESPACE(antlr)RefAST tmp208_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; + ANTLR_USE_NAMESPACE(antlr)RefAST tmp210_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { - tmp208_AST = astFactory->create(LT(1)); - astFactory->addASTChild(currentAST, tmp208_AST); + tmp210_AST = astFactory->create(LT(1)); + astFactory->addASTChild(currentAST, tmp210_AST); } match(NO); - ANTLR_USE_NAMESPACE(antlr)RefAST tmp209_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; + ANTLR_USE_NAMESPACE(antlr)RefAST tmp211_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { - tmp209_AST = astFactory->create(LT(1)); - astFactory->addASTChild(currentAST, tmp209_AST); + tmp211_AST = astFactory->create(LT(1)); + astFactory->addASTChild(currentAST, tmp211_AST); } match(ACTION); break; @@ -3891,10 +4020,10 @@ } case MATCH: { - ANTLR_USE_NAMESPACE(antlr)RefAST tmp210_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; + ANTLR_USE_NAMESPACE(antlr)RefAST tmp212_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { - tmp210_AST = astFactory->create(LT(1)); - astFactory->addASTChild(currentAST, tmp210_AST); + tmp212_AST = astFactory->create(LT(1)); + astFactory->addASTChild(currentAST, tmp212_AST); } match(MATCH); name(); @@ -3930,46 +4059,46 @@ inputState->guessing--; } if ( synPredMatched167 ) { - ANTLR_USE_NAMESPACE(antlr)RefAST tmp211_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; + ANTLR_USE_NAMESPACE(antlr)RefAST tmp213_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { - tmp211_AST = astFactory->create(LT(1)); - astFactory->addASTChild(currentAST, tmp211_AST); + tmp213_AST = astFactory->create(LT(1)); + astFactory->addASTChild(currentAST, tmp213_AST); } match(NOT); - ANTLR_USE_NAMESPACE(antlr)RefAST tmp212_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; + ANTLR_USE_NAMESPACE(antlr)RefAST tmp214_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { - tmp212_AST = astFactory->create(LT(1)); - astFactory->addASTChild(currentAST, tmp212_AST); + tmp214_AST = astFactory->create(LT(1)); + astFactory->addASTChild(currentAST, tmp214_AST); } match(DEFERRABLE); { switch ( LA(1)) { case INITIALLY: { - ANTLR_USE_NAMESPACE(antlr)RefAST tmp213_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; + ANTLR_USE_NAMESPACE(antlr)RefAST tmp215_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { - tmp213_AST = astFactory->create(LT(1)); - astFactory->addASTChild(currentAST, tmp213_AST); + tmp215_AST = astFactory->create(LT(1)); + astFactory->addASTChild(currentAST, tmp215_AST); } match(INITIALLY); { switch ( LA(1)) { case DEFERRED: { - ANTLR_USE_NAMESPACE(antlr)RefAST tmp214_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; + ANTLR_USE_NAMESPACE(antlr)RefAST tmp216_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { - tmp214_AST = astFactory->create(LT(1)); - astFactory->addASTChild(currentAST, tmp214_AST); + tmp216_AST = astFactory->create(LT(1)); + astFactory->addASTChild(currentAST, tmp216_AST); } match(DEFERRED); break; } case IMMEDIATE: { - ANTLR_USE_NAMESPACE(antlr)RefAST tmp215_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; + ANTLR_USE_NAMESPACE(antlr)RefAST tmp217_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { - tmp215_AST = astFactory->create(LT(1)); - astFactory->addASTChild(currentAST, tmp215_AST); + tmp217_AST = astFactory->create(LT(1)); + astFactory->addASTChild(currentAST, tmp217_AST); } match(IMMEDIATE); break; @@ -4005,37 +4134,37 @@ } } else if ((LA(1) == DEFERRABLE)) { - ANTLR_USE_NAMESPACE(antlr)RefAST tmp216_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; + ANTLR_USE_NAMESPACE(antlr)RefAST tmp218_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { - tmp216_AST = astFactory->create(LT(1)); - astFactory->addASTChild(currentAST, tmp216_AST); + tmp218_AST = astFactory->create(LT(1)); + astFactory->addASTChild(currentAST, tmp218_AST); } match(DEFERRABLE); { - ANTLR_USE_NAMESPACE(antlr)RefAST tmp217_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; + ANTLR_USE_NAMESPACE(antlr)RefAST tmp219_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { - tmp217_AST = astFactory->create(LT(1)); - astFactory->addASTChild(currentAST, tmp217_AST); + tmp219_AST = astFactory->create(LT(1)); + astFactory->addASTChild(currentAST, tmp219_AST); } match(INITIALLY); { switch ( LA(1)) { case DEFERRED: { - ANTLR_USE_NAMESPACE(antlr)RefAST tmp218_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; + ANTLR_USE_NAMESPACE(antlr)RefAST tmp220_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { - tmp218_AST = astFactory->create(LT(1)); - astFactory->addASTChild(currentAST, tmp218_AST); + tmp220_AST = astFactory->create(LT(1)); + astFactory->addASTChild(currentAST, tmp220_AST); } match(DEFERRED); break; } case IMMEDIATE: { - ANTLR_USE_NAMESPACE(antlr)RefAST tmp219_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; + ANTLR_USE_NAMESPACE(antlr)RefAST tmp221_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { - tmp219_AST = astFactory->create(LT(1)); - astFactory->addASTChild(currentAST, tmp219_AST); + tmp221_AST = astFactory->create(LT(1)); + astFactory->addASTChild(currentAST, tmp221_AST); } match(IMMEDIATE); break; @@ -4048,7 +4177,7 @@ } } } - else if ((_tokenSet_11.member(LA(1))) && (_tokenSet_14.member(LA(2)))) { + else if ((_tokenSet_13.member(LA(1))) && (_tokenSet_16.member(LA(2)))) { } else { throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename()); @@ -4081,40 +4210,40 @@ switch ( LA(1)) { case MINUS: { - ANTLR_USE_NAMESPACE(antlr)RefAST tmp220_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; + ANTLR_USE_NAMESPACE(antlr)RefAST tmp222_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { - tmp220_AST = astFactory->create(LT(1)); - astFactory->addASTChild(currentAST, tmp220_AST); + tmp222_AST = astFactory->create(LT(1)); + astFactory->addASTChild(currentAST, tmp222_AST); } match(MINUS); break; } case PLUS: { - ANTLR_USE_NAMESPACE(antlr)RefAST tmp221_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; + ANTLR_USE_NAMESPACE(antlr)RefAST tmp223_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { - tmp221_AST = astFactory->create(LT(1)); - astFactory->addASTChild(currentAST, tmp221_AST); + tmp223_AST = astFactory->create(LT(1)); + astFactory->addASTChild(currentAST, tmp223_AST); } match(PLUS); break; } case TILDE: { - ANTLR_USE_NAMESPACE(antlr)RefAST tmp222_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; + ANTLR_USE_NAMESPACE(antlr)RefAST tmp224_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { - tmp222_AST = astFactory->create(LT(1)); - astFactory->addASTChild(currentAST, tmp222_AST); + tmp224_AST = astFactory->create(LT(1)); + astFactory->addASTChild(currentAST, tmp224_AST); } match(TILDE); break; } case NOT: { - ANTLR_USE_NAMESPACE(antlr)RefAST tmp223_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; + ANTLR_USE_NAMESPACE(antlr)RefAST tmp225_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { - tmp223_AST = astFactory->create(LT(1)); - astFactory->addASTChild(currentAST, tmp223_AST); + tmp225_AST = astFactory->create(LT(1)); + astFactory->addASTChild(currentAST, tmp225_AST); } match(NOT); break; @@ -4176,7 +4305,6 @@ case QUOTEDLITERAL: case NUMERIC: case STRINGLITERAL: - case LPAREN: { break; } @@ -4187,13 +4315,13 @@ } } { - if ((_tokenSet_10.member(LA(1))) && (_tokenSet_15.member(LA(2)))) { + if ((_tokenSet_12.member(LA(1))) && (_tokenSet_17.member(LA(2)))) { literalvalue(); if (inputState->guessing==0) { astFactory->addASTChild( currentAST, returnAST ); } } - else if ((_tokenSet_3.member(LA(1))) && (_tokenSet_16.member(LA(2)))) { + else if ((_tokenSet_3.member(LA(1))) && (_tokenSet_18.member(LA(2)))) { { if ((_tokenSet_1.member(LA(1))) && (LA(2) == DOT)) { { @@ -4202,10 +4330,10 @@ if (inputState->guessing==0) { astFactory->addASTChild( currentAST, returnAST ); } - ANTLR_USE_NAMESPACE(antlr)RefAST tmp224_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; + ANTLR_USE_NAMESPACE(antlr)RefAST tmp226_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { - tmp224_AST = astFactory->create(LT(1)); - astFactory->addASTChild(currentAST, tmp224_AST); + tmp226_AST = astFactory->create(LT(1)); + astFactory->addASTChild(currentAST, tmp226_AST); } match(DOT); } @@ -4220,14 +4348,14 @@ if (inputState->guessing==0) { astFactory->addASTChild( currentAST, returnAST ); } - ANTLR_USE_NAMESPACE(antlr)RefAST tmp225_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; + ANTLR_USE_NAMESPACE(antlr)RefAST tmp227_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { - tmp225_AST = astFactory->create(LT(1)); - astFactory->addASTChild(currentAST, tmp225_AST); + tmp227_AST = astFactory->create(LT(1)); + astFactory->addASTChild(currentAST, tmp227_AST); } match(DOT); } - else if ((_tokenSet_3.member(LA(1))) && (_tokenSet_15.member(LA(2)))) { + else if ((_tokenSet_3.member(LA(1))) && (_tokenSet_17.member(LA(2)))) { } else { throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename()); @@ -4244,10 +4372,10 @@ if (inputState->guessing==0) { astFactory->addASTChild( currentAST, returnAST ); } - ANTLR_USE_NAMESPACE(antlr)RefAST tmp226_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; + ANTLR_USE_NAMESPACE(antlr)RefAST tmp228_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { - tmp226_AST = astFactory->create(LT(1)); - astFactory->addASTChild(currentAST, tmp226_AST); + tmp228_AST = astFactory->create(LT(1)); + astFactory->addASTChild(currentAST, tmp228_AST); } match(LPAREN); { @@ -4322,63 +4450,27 @@ { // ( ... )* for (;;) { if ((LA(1) == COMMA)) { - ANTLR_USE_NAMESPACE(antlr)RefAST tmp227_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; + ANTLR_USE_NAMESPACE(antlr)RefAST tmp229_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { - tmp227_AST = astFactory->create(LT(1)); - astFactory->addASTChild(currentAST, tmp227_AST); + tmp229_AST = astFactory->create(LT(1)); + astFactory->addASTChild(currentAST, tmp229_AST); } match(COMMA); expr(); if (inputState->guessing==0) { astFactory->addASTChild( currentAST, returnAST ); - } - } - else { - goto _loop191; - } - - } - _loop191:; - } // ( ... )* - break; - } - case RPAREN: - { - break; - } - default: - { - throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename()); - } - } - } - ANTLR_USE_NAMESPACE(antlr)RefAST tmp228_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; - if ( inputState->guessing == 0 ) { - tmp228_AST = astFactory->create(LT(1)); - astFactory->addASTChild(currentAST, tmp228_AST); - } - match(RPAREN); - } - else if ((LA(1) == CAST) && (LA(2) == LPAREN)) { - castexpr(); - if (inputState->guessing==0) { - astFactory->addASTChild( currentAST, returnAST ); - } - } - else if ((LA(1) == EXISTS || LA(1) == LPAREN) && (_tokenSet_17.member(LA(2)))) { - { - switch ( LA(1)) { - case EXISTS: - { - ANTLR_USE_NAMESPACE(antlr)RefAST tmp229_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; - if ( inputState->guessing == 0 ) { - tmp229_AST = astFactory->create(LT(1)); - astFactory->addASTChild(currentAST, tmp229_AST); + } + } + else { + goto _loop198; + } + } - match(EXISTS); + _loop198:; + } // ( ... )* break; } - case LPAREN: + case RPAREN: { break; } @@ -4393,6 +4485,26 @@ tmp230_AST = astFactory->create(LT(1)); astFactory->addASTChild(currentAST, tmp230_AST); } + match(RPAREN); + } + else if ((LA(1) == CAST) && (LA(2) == LPAREN)) { + castexpr(); + if (inputState->guessing==0) { + astFactory->addASTChild( currentAST, returnAST ); + } + } + else if ((LA(1) == EXISTS) && (LA(2) == LPAREN)) { + ANTLR_USE_NAMESPACE(antlr)RefAST tmp231_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; + if ( inputState->guessing == 0 ) { + tmp231_AST = astFactory->create(LT(1)); + astFactory->addASTChild(currentAST, tmp231_AST); + } + match(EXISTS); + ANTLR_USE_NAMESPACE(antlr)RefAST tmp232_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; + if ( inputState->guessing == 0 ) { + tmp232_AST = astFactory->create(LT(1)); + astFactory->addASTChild(currentAST, tmp232_AST); + } match(LPAREN); { switch ( LA(1)) { @@ -4479,14 +4591,14 @@ } } } - ANTLR_USE_NAMESPACE(antlr)RefAST tmp231_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; + ANTLR_USE_NAMESPACE(antlr)RefAST tmp233_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { - tmp231_AST = astFactory->create(LT(1)); - astFactory->addASTChild(currentAST, tmp231_AST); + tmp233_AST = astFactory->create(LT(1)); + astFactory->addASTChild(currentAST, tmp233_AST); } match(RPAREN); } - else if ((LA(1) == CASE_T) && (_tokenSet_7.member(LA(2)))) { + else if ((LA(1) == CASE_T) && (_tokenSet_9.member(LA(2)))) { caseexpr(); if (inputState->guessing==0) { astFactory->addASTChild( currentAST, returnAST ); @@ -4504,13 +4616,13 @@ } { - if ((_tokenSet_18.member(LA(1))) && (_tokenSet_19.member(LA(2)))) { + if ((_tokenSet_19.member(LA(1))) && (_tokenSet_20.member(LA(2)))) { suffixexpr(); if (inputState->guessing==0) { astFactory->addASTChild( currentAST, returnAST ); } } - else if ((_tokenSet_20.member(LA(1))) && (_tokenSet_21.member(LA(2)))) { + else if ((_tokenSet_21.member(LA(1))) && (_tokenSet_22.member(LA(2)))) { } else { throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename()); @@ -4529,209 +4641,209 @@ switch ( LA(1)) { case OROP: { - ANTLR_USE_NAMESPACE(antlr)RefAST tmp232_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; - if ( inputState->guessing == 0 ) { - tmp232_AST = astFactory->create(LT(1)); - astFactory->addASTChild(currentAST, tmp232_AST); - } - match(OROP); - binaryoperator_AST = currentAST.root; - break; - } - case STAR: - { - ANTLR_USE_NAMESPACE(antlr)RefAST tmp233_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; - if ( inputState->guessing == 0 ) { - tmp233_AST = astFactory->create(LT(1)); - astFactory->addASTChild(currentAST, tmp233_AST); - } - match(STAR); - binaryoperator_AST = currentAST.root; - break; - } - case SLASH: - { ANTLR_USE_NAMESPACE(antlr)RefAST tmp234_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { tmp234_AST = astFactory->create(LT(1)); astFactory->addASTChild(currentAST, tmp234_AST); } - match(SLASH); + match(OROP); binaryoperator_AST = currentAST.root; break; } - case PERCENT: + case STAR: { ANTLR_USE_NAMESPACE(antlr)RefAST tmp235_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { tmp235_AST = astFactory->create(LT(1)); astFactory->addASTChild(currentAST, tmp235_AST); } - match(PERCENT); + match(STAR); binaryoperator_AST = currentAST.root; break; } - case PLUS: + case SLASH: { ANTLR_USE_NAMESPACE(antlr)RefAST tmp236_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { tmp236_AST = astFactory->create(LT(1)); astFactory->addASTChild(currentAST, tmp236_AST); } - match(PLUS); + match(SLASH); binaryoperator_AST = currentAST.root; break; } - case MINUS: + case PERCENT: { ANTLR_USE_NAMESPACE(antlr)RefAST tmp237_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { tmp237_AST = astFactory->create(LT(1)); astFactory->addASTChild(currentAST, tmp237_AST); } - match(MINUS); + match(PERCENT); binaryoperator_AST = currentAST.root; break; } - case BITWISELEFT: + case PLUS: { ANTLR_USE_NAMESPACE(antlr)RefAST tmp238_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { tmp238_AST = astFactory->create(LT(1)); astFactory->addASTChild(currentAST, tmp238_AST); } - match(BITWISELEFT); + match(PLUS); binaryoperator_AST = currentAST.root; break; } - case BITWISERIGHT: + case MINUS: { ANTLR_USE_NAMESPACE(antlr)RefAST tmp239_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { tmp239_AST = astFactory->create(LT(1)); astFactory->addASTChild(currentAST, tmp239_AST); } - match(BITWISERIGHT); + match(MINUS); binaryoperator_AST = currentAST.root; break; } - case AMPERSAND: + case BITWISELEFT: { ANTLR_USE_NAMESPACE(antlr)RefAST tmp240_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { tmp240_AST = astFactory->create(LT(1)); astFactory->addASTChild(currentAST, tmp240_AST); } - match(AMPERSAND); + match(BITWISELEFT); binaryoperator_AST = currentAST.root; break; } - case BITOR: + case BITWISERIGHT: { ANTLR_USE_NAMESPACE(antlr)RefAST tmp241_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { tmp241_AST = astFactory->create(LT(1)); astFactory->addASTChild(currentAST, tmp241_AST); } - match(BITOR); + match(BITWISERIGHT); binaryoperator_AST = currentAST.root; break; } - case LOWER: + case AMPERSAND: { ANTLR_USE_NAMESPACE(antlr)RefAST tmp242_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { tmp242_AST = astFactory->create(LT(1)); astFactory->addASTChild(currentAST, tmp242_AST); } - match(LOWER); + match(AMPERSAND); binaryoperator_AST = currentAST.root; break; } - case LOWEREQUAL: + case BITOR: { ANTLR_USE_NAMESPACE(antlr)RefAST tmp243_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { tmp243_AST = astFactory->create(LT(1)); astFactory->addASTChild(currentAST, tmp243_AST); } - match(LOWEREQUAL); + match(BITOR); binaryoperator_AST = currentAST.root; break; } - case GREATER: + case LOWER: { ANTLR_USE_NAMESPACE(antlr)RefAST tmp244_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { tmp244_AST = astFactory->create(LT(1)); astFactory->addASTChild(currentAST, tmp244_AST); } - match(GREATER); + match(LOWER); binaryoperator_AST = currentAST.root; break; } - case GREATEREQUAL: + case LOWEREQUAL: { ANTLR_USE_NAMESPACE(antlr)RefAST tmp245_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { tmp245_AST = astFactory->create(LT(1)); astFactory->addASTChild(currentAST, tmp245_AST); } - match(GREATEREQUAL); + match(LOWEREQUAL); binaryoperator_AST = currentAST.root; break; } - case EQUAL: + case GREATER: { ANTLR_USE_NAMESPACE(antlr)RefAST tmp246_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { tmp246_AST = astFactory->create(LT(1)); astFactory->addASTChild(currentAST, tmp246_AST); } - match(EQUAL); + match(GREATER); binaryoperator_AST = currentAST.root; break; } - case EQUAL2: + case GREATEREQUAL: { ANTLR_USE_NAMESPACE(antlr)RefAST tmp247_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { tmp247_AST = astFactory->create(LT(1)); astFactory->addASTChild(currentAST, tmp247_AST); } - match(EQUAL2); + match(GREATEREQUAL); binaryoperator_AST = currentAST.root; break; } - case UNEQUAL: + case EQUAL: { ANTLR_USE_NAMESPACE(antlr)RefAST tmp248_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { tmp248_AST = astFactory->create(LT(1)); astFactory->addASTChild(currentAST, tmp248_AST); } - match(UNEQUAL); + match(EQUAL); binaryoperator_AST = currentAST.root; break; } - case UNEQUAL2: + case EQUAL2: { ANTLR_USE_NAMESPACE(antlr)RefAST tmp249_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { tmp249_AST = astFactory->create(LT(1)); astFactory->addASTChild(currentAST, tmp249_AST); } - match(UNEQUAL2); + match(EQUAL2); binaryoperator_AST = currentAST.root; break; } - case IS: + case UNEQUAL: { ANTLR_USE_NAMESPACE(antlr)RefAST tmp250_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { tmp250_AST = astFactory->create(LT(1)); astFactory->addASTChild(currentAST, tmp250_AST); } + match(UNEQUAL); + binaryoperator_AST = currentAST.root; + break; + } + case UNEQUAL2: + { + ANTLR_USE_NAMESPACE(antlr)RefAST tmp251_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; + if ( inputState->guessing == 0 ) { + tmp251_AST = astFactory->create(LT(1)); + astFactory->addASTChild(currentAST, tmp251_AST); + } + match(UNEQUAL2); + binaryoperator_AST = currentAST.root; + break; + } + case IS: + { + ANTLR_USE_NAMESPACE(antlr)RefAST tmp252_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; + if ( inputState->guessing == 0 ) { + tmp252_AST = astFactory->create(LT(1)); + astFactory->addASTChild(currentAST, tmp252_AST); + } match(IS); binaryoperator_AST = currentAST.root; break; @@ -4761,36 +4873,36 @@ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST; ANTLR_USE_NAMESPACE(antlr)RefAST castexpr_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; - ANTLR_USE_NAMESPACE(antlr)RefAST tmp251_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; + ANTLR_USE_NAMESPACE(antlr)RefAST tmp253_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { - tmp251_AST = astFactory->create(LT(1)); - astFactory->addASTChild(currentAST, tmp251_AST); + tmp253_AST = astFactory->create(LT(1)); + astFactory->addASTChild(currentAST, tmp253_AST); } match(CAST); - ANTLR_USE_NAMESPACE(antlr)RefAST tmp252_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; + ANTLR_USE_NAMESPACE(antlr)RefAST tmp254_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { - tmp252_AST = astFactory->create(LT(1)); - astFactory->addASTChild(currentAST, tmp252_AST); + tmp254_AST = astFactory->create(LT(1)); + astFactory->addASTChild(currentAST, tmp254_AST); } match(LPAREN); expr(); if (inputState->guessing==0) { astFactory->addASTChild( currentAST, returnAST ); } - ANTLR_USE_NAMESPACE(antlr)RefAST tmp253_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; + ANTLR_USE_NAMESPACE(antlr)RefAST tmp255_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { - tmp253_AST = astFactory->create(LT(1)); - astFactory->addASTChild(currentAST, tmp253_AST); + tmp255_AST = astFactory->create(LT(1)); + astFactory->addASTChild(currentAST, tmp255_AST); } match(AS); type_name(); if (inputState->guessing==0) { astFactory->addASTChild( currentAST, returnAST ); } - ANTLR_USE_NAMESPACE(antlr)RefAST tmp254_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; + ANTLR_USE_NAMESPACE(antlr)RefAST tmp256_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { - tmp254_AST = astFactory->create(LT(1)); - astFactory->addASTChild(currentAST, tmp254_AST); + tmp256_AST = astFactory->create(LT(1)); + astFactory->addASTChild(currentAST, tmp256_AST); } match(RPAREN); castexpr_AST = currentAST.root; @@ -4802,20 +4914,20 @@ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST; ANTLR_USE_NAMESPACE(antlr)RefAST caseexpr_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; - ANTLR_USE_NAMESPACE(antlr)RefAST tmp255_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; + ANTLR_USE_NAMESPACE(antlr)RefAST tmp257_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { - tmp255_AST = astFactory->create(LT(1)); - astFactory->addASTChild(currentAST, tmp255_AST); + tmp257_AST = astFactory->create(LT(1)); + astFactory->addASTChild(currentAST, tmp257_AST); } match(CASE_T); { - if ((_tokenSet_7.member(LA(1))) && (_tokenSet_22.member(LA(2)))) { + if ((_tokenSet_9.member(LA(1))) && (_tokenSet_23.member(LA(2)))) { expr(); if (inputState->guessing==0) { astFactory->addASTChild( currentAST, returnAST ); } } - else if ((LA(1) == WHEN) && (_tokenSet_7.member(LA(2)))) { + else if ((LA(1) == WHEN) && (_tokenSet_9.member(LA(2)))) { } else { throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename()); @@ -4823,23 +4935,23 @@ } { // ( ... )+ - int _cnt199=0; + int _cnt205=0; for (;;) { if ((LA(1) == WHEN)) { - ANTLR_USE_NAMESPACE(antlr)RefAST tmp256_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; + ANTLR_USE_NAMESPACE(antlr)RefAST tmp258_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { - tmp256_AST = astFactory->create(LT(1)); - astFactory->addASTChild(currentAST, tmp256_AST); + tmp258_AST = astFactory->create(LT(1)); + astFactory->addASTChild(currentAST, tmp258_AST); } match(WHEN); expr(); if (inputState->guessing==0) { astFactory->addASTChild( currentAST, returnAST ); } - ANTLR_USE_NAMESPACE(antlr)RefAST tmp257_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; + ANTLR_USE_NAMESPACE(antlr)RefAST tmp259_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { - tmp257_AST = astFactory->create(LT(1)); - astFactory->addASTChild(currentAST, tmp257_AST); + tmp259_AST = astFactory->create(LT(1)); + astFactory->addASTChild(currentAST, tmp259_AST); } match(THEN); expr(); @@ -4848,21 +4960,21 @@ } } else { - if ( _cnt199>=1 ) { goto _loop199; } else {throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());} + if ( _cnt205>=1 ) { goto _loop205; } else {throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());} } - _cnt199++; + _cnt205++; } - _loop199:; + _loop205:; } // ( ... )+ { switch ( LA(1)) { case ELSE_T: { - ANTLR_USE_NAMESPACE(antlr)RefAST tmp258_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; + ANTLR_USE_NAMESPACE(antlr)RefAST tmp260_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { - tmp258_AST = astFactory->create(LT(1)); - astFactory->addASTChild(currentAST, tmp258_AST); + tmp260_AST = astFactory->create(LT(1)); + astFactory->addASTChild(currentAST, tmp260_AST); } match(ELSE_T); expr(); @@ -4881,10 +4993,10 @@ } } } - ANTLR_USE_NAMESPACE(antlr)RefAST tmp259_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; + ANTLR_USE_NAMESPACE(antlr)RefAST tmp261_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { - tmp259_AST = astFactory->create(LT(1)); - astFactory->addASTChild(currentAST, tmp259_AST); + tmp261_AST = astFactory->create(LT(1)); + astFactory->addASTChild(currentAST, tmp261_AST); } match(END); caseexpr_AST = currentAST.root; @@ -4896,26 +5008,26 @@ ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST; ANTLR_USE_NAMESPACE(antlr)RefAST raisefunction_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; - ANTLR_USE_NAMESPACE(antlr)RefAST tmp260_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; + ANTLR_USE_NAMESPACE(antlr)RefAST tmp262_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { - tmp260_AST = astFactory->create(LT(1)); - astFactory->addASTChild(currentAST, tmp260_AST); + tmp262_AST = astFactory->create(LT(1)); + astFactory->addASTChild(currentAST, tmp262_AST); } match(RAISE); - ANTLR_USE_NAMESPACE(antlr)RefAST tmp261_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; + ANTLR_USE_NAMESPACE(antlr)RefAST tmp263_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { - tmp261_AST = astFactory->create(LT(1)); - astFactory->addASTChild(currentAST, tmp261_AST); + tmp263_AST = astFactory->create(LT(1)); + astFactory->addASTChild(currentAST, tmp263_AST); } match(LPAREN); { switch ( LA(1)) { case IGNORE: { - ANTLR_USE_NAMESPACE(antlr)RefAST tmp262_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; + ANTLR_USE_NAMESPACE(antlr)RefAST tmp264_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { - tmp262_AST = astFactory->create(LT(1)); - astFactory->addASTChild(currentAST, tmp262_AST); + tmp264_AST = astFactory->create(LT(1)); + astFactory->addASTChild(currentAST, tmp264_AST); } match(IGNORE); break; @@ -4928,30 +5040,30 @@ switch ( LA(1)) { case ROLLBACK: { - ANTLR_USE_NAMESPACE(antlr)RefAST tmp263_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; + ANTLR_USE_NAMESPACE(antlr)RefAST tmp265_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { - tmp263_AST = astFactory->create(LT(1)); - astFactory->addASTChild(currentAST, tmp263_AST); + tmp265_AST = astFactory->create(LT(1)); + astFactory->addASTChild(currentAST, tmp265_AST); } match(ROLLBACK); break; } case ABORT: { - ANTLR_USE_NAMESPACE(antlr)RefAST tmp264_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; + ANTLR_USE_NAMESPACE(antlr)RefAST tmp266_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { - tmp264_AST = astFactory->create(LT(1)); - astFactory->addASTChild(currentAST, tmp264_AST); + tmp266_AST = astFactory->create(LT(1)); + astFactory->addASTChild(currentAST, tmp266_AST); } match(ABORT); break; } case FAIL: { - ANTLR_USE_NAMESPACE(antlr)RefAST tmp265_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; + ANTLR_USE_NAMESPACE(antlr)RefAST tmp267_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { - tmp265_AST = astFactory->create(LT(1)); - astFactory->addASTChild(currentAST, tmp265_AST); + tmp267_AST = astFactory->create(LT(1)); + astFactory->addASTChild(currentAST, tmp267_AST); } match(FAIL); break; @@ -4962,16 +5074,16 @@ } } } - ANTLR_USE_NAMESPACE(antlr)RefAST tmp266_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; + ANTLR_USE_NAMESPACE(antlr)RefAST tmp268_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { - tmp266_AST = astFactory->create(LT(1)); - astFactory->addASTChild(currentAST, tmp266_AST); + tmp268_AST = astFactory->create(LT(1)); + astFactory->addASTChild(currentAST, tmp268_AST); } match(COMMA); - ANTLR_USE_NAMESPACE(antlr)RefAST tmp267_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; + ANTLR_USE_NAMESPACE(antlr)RefAST tmp269_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { - tmp267_AST = astFactory->create(LT(1)); - astFactory->addASTChild(currentAST, tmp267_AST); + tmp269_AST = astFactory->create(LT(1)); + astFactory->addASTChild(currentAST, tmp269_AST); } match(STRINGLITERAL); break; @@ -4982,10 +5094,10 @@ } } } - ANTLR_USE_NAMESPACE(antlr)RefAST tmp268_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; + ANTLR_USE_NAMESPACE(antlr)RefAST tmp270_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { - tmp268_AST = astFactory->create(LT(1)); - astFactory->addASTChild(currentAST, tmp268_AST); + tmp270_AST = astFactory->create(LT(1)); + astFactory->addASTChild(currentAST, tmp270_AST); } match(RPAREN); raisefunction_AST = currentAST.root; @@ -5000,10 +5112,10 @@ switch ( LA(1)) { case COLLATE: { - ANTLR_USE_NAMESPACE(antlr)RefAST tmp269_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; + ANTLR_USE_NAMESPACE(antlr)RefAST tmp271_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { - tmp269_AST = astFactory->create(LT(1)); - astFactory->addASTChild(currentAST, tmp269_AST); + tmp271_AST = astFactory->create(LT(1)); + astFactory->addASTChild(currentAST, tmp271_AST); } match(COLLATE); collationname(); @@ -5025,10 +5137,10 @@ switch ( LA(1)) { case NOT: { - ANTLR_USE_NAMESPACE(antlr)RefAST tmp270_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; + ANTLR_USE_NAMESPACE(antlr)RefAST tmp272_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { - tmp270_AST = astFactory->create(LT(1)); - astFactory->addASTChild(currentAST, tmp270_AST); + tmp272_AST = astFactory->create(LT(1)); + astFactory->addASTChild(currentAST, tmp272_AST); } match(NOT); break; @@ -5052,10 +5164,10 @@ switch ( LA(1)) { case BETWEEN: { - ANTLR_USE_NAMESPACE(antlr)RefAST tmp271_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; + ANTLR_USE_NAMESPACE(antlr)RefAST tmp273_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { - tmp271_AST = astFactory->create(LT(1)); - astFactory->addASTChild(currentAST, tmp271_AST); + tmp273_AST = astFactory->create(LT(1)); + astFactory->addASTChild(currentAST, tmp273_AST); } match(BETWEEN); subexpr(); @@ -5064,7 +5176,7 @@ } { // ( ... )* for (;;) { - if ((_tokenSet_23.member(LA(1)))) { + if ((_tokenSet_24.member(LA(1)))) { { switch ( LA(1)) { case GLOB: @@ -5099,10 +5211,10 @@ } case OR: { - ANTLR_USE_NAMESPACE(antlr)RefAST tmp272_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; + ANTLR_USE_NAMESPACE(antlr)RefAST tmp274_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { - tmp272_AST = astFactory->create(LT(1)); - astFactory->addASTChild(currentAST, tmp272_AST); + tmp274_AST = astFactory->create(LT(1)); + astFactory->addASTChild(currentAST, tmp274_AST); } match(OR); break; @@ -5119,16 +5231,16 @@ } } else { - goto _loop210; + goto _loop216; } } - _loop210:; + _loop216:; } // ( ... )* - ANTLR_USE_NAMESPACE(antlr)RefAST tmp273_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; + ANTLR_USE_NAMESPACE(antlr)RefAST tmp275_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { - tmp273_AST = astFactory->create(LT(1)); - astFactory->addASTChild(currentAST, tmp273_AST); + tmp275_AST = astFactory->create(LT(1)); + astFactory->addASTChild(currentAST, tmp275_AST); } match(AND); expr(); @@ -5139,20 +5251,20 @@ } case IN: { - ANTLR_USE_NAMESPACE(antlr)RefAST tmp274_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; + ANTLR_USE_NAMESPACE(antlr)RefAST tmp276_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { - tmp274_AST = astFactory->create(LT(1)); - astFactory->addASTChild(currentAST, tmp274_AST); + tmp276_AST = astFactory->create(LT(1)); + astFactory->addASTChild(currentAST, tmp276_AST); } match(IN); { switch ( LA(1)) { case LPAREN: { - ANTLR_USE_NAMESPACE(antlr)RefAST tmp275_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; + ANTLR_USE_NAMESPACE(antlr)RefAST tmp277_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { - tmp275_AST = astFactory->create(LT(1)); - astFactory->addASTChild(currentAST, tmp275_AST); + tmp277_AST = astFactory->create(LT(1)); + astFactory->addASTChild(currentAST, tmp277_AST); } match(LPAREN); { @@ -5235,10 +5347,10 @@ { // ( ... )* for (;;) { if ((LA(1) == COMMA)) { - ANTLR_USE_NAMESPACE(antlr)RefAST tmp276_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; + ANTLR_USE_NAMESPACE(antlr)RefAST tmp278_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { - tmp276_AST = astFactory->create(LT(1)); - astFactory->addASTChild(currentAST, tmp276_AST); + tmp278_AST = astFactory->create(LT(1)); + astFactory->addASTChild(currentAST, tmp278_AST); } match(COMMA); expr(); @@ -5247,11 +5359,11 @@ } } else { - goto _loop214; + goto _loop220; } } - _loop214:; + _loop220:; } // ( ... )* break; } @@ -5265,10 +5377,10 @@ } } } - ANTLR_USE_NAMESPACE(antlr)RefAST tmp277_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; + ANTLR_USE_NAMESPACE(antlr)RefAST tmp279_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { - tmp277_AST = astFactory->create(LT(1)); - astFactory->addASTChild(currentAST, tmp277_AST); + tmp279_AST = astFactory->create(LT(1)); + astFactory->addASTChild(currentAST, tmp279_AST); } match(RPAREN); break; @@ -5307,10 +5419,10 @@ } { if ((LA(1) == ESCAPE) && (_tokenSet_7.member(LA(2)))) { - ANTLR_USE_NAMESPACE(antlr)RefAST tmp278_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; + ANTLR_USE_NAMESPACE(antlr)RefAST tmp280_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { - tmp278_AST = astFactory->create(LT(1)); - astFactory->addASTChild(currentAST, tmp278_AST); + tmp280_AST = astFactory->create(LT(1)); + astFactory->addASTChild(currentAST, tmp280_AST); } match(ESCAPE); subexpr(); @@ -5318,7 +5430,7 @@ astFactory->addASTChild( currentAST, returnAST ); } } - else if ((_tokenSet_20.member(LA(1))) && (_tokenSet_21.member(LA(2)))) { + else if ((_tokenSet_21.member(LA(1))) && (_tokenSet_22.member(LA(2)))) { } else { throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename()); @@ -5352,10 +5464,10 @@ switch ( LA(1)) { case LIKE: { - ANTLR_USE_NAMESPACE(antlr)RefAST tmp279_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; + ANTLR_USE_NAMESPACE(antlr)RefAST tmp281_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { - tmp279_AST = astFactory->create(LT(1)); - astFactory->addASTChild(currentAST, tmp279_AST); + tmp281_AST = astFactory->create(LT(1)); + astFactory->addASTChild(currentAST, tmp281_AST); } match(LIKE); like_operator_AST = currentAST.root; @@ -5363,10 +5475,10 @@ } case GLOB: { - ANTLR_USE_NAMESPACE(antlr)RefAST tmp280_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; + ANTLR_USE_NAMESPACE(antlr)RefAST tmp282_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { - tmp280_AST = astFactory->create(LT(1)); - astFactory->addASTChild(currentAST, tmp280_AST); + tmp282_AST = astFactory->create(LT(1)); + astFactory->addASTChild(currentAST, tmp282_AST); } match(GLOB); like_operator_AST = currentAST.root; @@ -5374,10 +5486,10 @@ } case REGEXP: { - ANTLR_USE_NAMESPACE(antlr)RefAST tmp281_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; + ANTLR_USE_NAMESPACE(antlr)RefAST tmp283_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { - tmp281_AST = astFactory->create(LT(1)); - astFactory->addASTChild(currentAST, tmp281_AST); + tmp283_AST = astFactory->create(LT(1)); + astFactory->addASTChild(currentAST, tmp283_AST); } match(REGEXP); like_operator_AST = currentAST.root; @@ -5385,10 +5497,10 @@ } case MATCH: { - ANTLR_USE_NAMESPACE(antlr)RefAST tmp282_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; + ANTLR_USE_NAMESPACE(antlr)RefAST tmp284_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { - tmp282_AST = astFactory->create(LT(1)); - astFactory->addASTChild(currentAST, tmp282_AST); + tmp284_AST = astFactory->create(LT(1)); + astFactory->addASTChild(currentAST, tmp284_AST); } match(MATCH); like_operator_AST = currentAST.root; @@ -5412,13 +5524,13 @@ astFactory->addASTChild( currentAST, returnAST ); } { // ( ... )+ - int _cnt204=0; + int _cnt210=0; for (;;) { if ((LA(1) == AND)) { - ANTLR_USE_NAMESPACE(antlr)RefAST tmp283_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; + ANTLR_USE_NAMESPACE(antlr)RefAST tmp285_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; if ( inputState->guessing == 0 ) { - tmp283_AST = astFactory->create(LT(1)); - astFactory->addASTChild(currentAST, tmp283_AST); + tmp285_AST = astFactory->create(LT(1)); + astFactory->addASTChild(currentAST, tmp285_AST); } match(AND); subexpr(); @@ -5427,12 +5539,12 @@ } } else { - if ( _cnt204>=1 ) { goto _loop204; } else {throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());} + if ( _cnt210>=1 ) { goto _loop210; } else {throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());} } - _cnt204++; + _cnt210++; } - _loop204:; + _loop210:; } // ( ... )+ between_subexpr_AST = currentAST.root; returnAST = between_subexpr_AST; @@ -5440,7 +5552,7 @@ void Sqlite3Parser::initializeASTFactory( ANTLR_USE_NAMESPACE(antlr)ASTFactory& factory ) { - factory.setMaxNodeType(112); + factory.setMaxNodeType(120); } const char* Sqlite3Parser::tokenNames[] = { "<0>", @@ -5475,6 +5587,8 @@ "\"END\"", "\"ESCAPE\"", "\"FAIL\"", + "\"FILTER\"", + "\"FOLLOWING\"", "\"FOREIGN\"", "\"GLOB\"", "\"KEY\"", @@ -5494,18 +5608,24 @@ "\"MATCH\"", "\"EXISTS\"", "\"ON\"", + "\"OVER\"", + "\"PARTITION\"", + "\"PRECEDING\"", "\"PRIMARY\"", "\"RAISE\"", + "\"RANGE\"", "\"REFERENCES\"", "\"REGEXP\"", "\"REPLACE\"", "\"RESTRICT\"", "\"ROLLBACK\"", "\"ROWID\"", + "\"ROWS\"", "\"SET\"", "\"TEMPORARY\"", "\"TEMP\"", "\"THEN\"", + "\"UNBOUNDED\"", "\"UNIQUE\"", "\"UPDATE\"", "\"USING\"", @@ -5559,16 +5679,16 @@ 0 }; -const unsigned long Sqlite3Parser::_tokenSet_0_data_[] = { 0UL, 0UL, 17760256UL, 0UL, 0UL, 0UL, 0UL, 0UL }; +const unsigned long Sqlite3Parser::_tokenSet_0_data_[] = { 0UL, 0UL, 251658240UL, 1UL, 0UL, 0UL, 0UL, 0UL }; // DOT ID QUOTEDID QUOTEDLITERAL STRINGLITERAL const ANTLR_USE_NAMESPACE(antlr)BitSet Sqlite3Parser::_tokenSet_0(_tokenSet_0_data_,8); -const unsigned long Sqlite3Parser::_tokenSet_1_data_[] = { 0UL, 0UL, 17694720UL, 0UL, 0UL, 0UL, 0UL, 0UL }; +const unsigned long Sqlite3Parser::_tokenSet_1_data_[] = { 0UL, 0UL, 234881024UL, 1UL, 0UL, 0UL, 0UL, 0UL }; // ID QUOTEDID QUOTEDLITERAL STRINGLITERAL const ANTLR_USE_NAMESPACE(antlr)BitSet Sqlite3Parser::_tokenSet_1(_tokenSet_1_data_,8); -const unsigned long Sqlite3Parser::_tokenSet_2_data_[] = { 0UL, 805306384UL, 4UL, 0UL, 0UL, 0UL, 0UL, 0UL }; +const unsigned long Sqlite3Parser::_tokenSet_2_data_[] = { 0UL, 64UL, 1048UL, 0UL, 0UL, 0UL, 0UL, 0UL }; // "TABLE" "TEMPORARY" "TEMP" "VIRTUAL" const ANTLR_USE_NAMESPACE(antlr)BitSet Sqlite3Parser::_tokenSet_2(_tokenSet_2_data_,8); -const unsigned long Sqlite3Parser::_tokenSet_3_data_[] = { 4294408176UL, 2146941566UL, 17694729UL, 0UL, 0UL, 0UL, 0UL, 0UL }; +const unsigned long Sqlite3Parser::_tokenSet_3_data_[] = { 4294408176UL, 4196329976UL, 234883389UL, 1UL, 0UL, 0UL, 0UL, 0UL }; // "ABORT" "ACTION" "AUTOINCREMENT" "AS" "ASC" "AND" "OR" "CASCADE" "CASE" // "CAST" "CREATE" "COLLATE" "CONFLICT" "CURRENT_TIME" "CURRENT_DATE" "CURRENT_TIMESTAMP" // "DEFAULT" "DEFERRABLE" "DEFERRED" "DELETE" "DESC" "ELSE" "END" "ESCAPE" @@ -5577,14 +5697,14 @@ // "REPLACE" "RESTRICT" "ROLLBACK" "ROWID" "SET" "TEMPORARY" "TEMP" "THEN" // "UPDATE" "WHEN" ID QUOTEDID QUOTEDLITERAL STRINGLITERAL const ANTLR_USE_NAMESPACE(antlr)BitSet Sqlite3Parser::_tokenSet_3(_tokenSet_3_data_,8); -const unsigned long Sqlite3Parser::_tokenSet_4_data_[] = { 557056UL, 2148007937UL, 134217728UL, 0UL, 0UL, 0UL, 0UL, 0UL }; +const unsigned long Sqlite3Parser::_tokenSet_4_data_[] = { 557056UL, 16777220UL, 128UL, 8UL, 0UL, 0UL, 0UL, 0UL }; // "CHECK" "CONSTRAINT" "FOREIGN" "PRIMARY" "UNIQUE" COMMA const ANTLR_USE_NAMESPACE(antlr)BitSet Sqlite3Parser::_tokenSet_4(_tokenSet_4_data_,8); -const unsigned long Sqlite3Parser::_tokenSet_5_data_[] = { 9076736UL, 2150154240UL, 0UL, 0UL }; +const unsigned long Sqlite3Parser::_tokenSet_5_data_[] = { 9076736UL, 151191552UL, 128UL, 0UL, 0UL, 0UL, 0UL, 0UL }; // "CHECK" "COLLATE" "CONSTRAINT" "DEFAULT" "NOT" "NULL" "PRIMARY" "REFERENCES" // "UNIQUE" -const ANTLR_USE_NAMESPACE(antlr)BitSet Sqlite3Parser::_tokenSet_5(_tokenSet_5_data_,4); -const unsigned long Sqlite3Parser::_tokenSet_6_data_[] = { 2868826416UL, 3019762255UL, 1864237056UL, 0UL, 0UL, 0UL, 0UL, 0UL }; +const ANTLR_USE_NAMESPACE(antlr)BitSet Sqlite3Parser::_tokenSet_5(_tokenSet_5_data_,8); +const unsigned long Sqlite3Parser::_tokenSet_6_data_[] = { 2868826416UL, 4212631868UL, 503316632UL, 111UL, 0UL, 0UL, 0UL, 0UL }; // "ABORT" "ACTION" "ASC" "CASCADE" "CAST" "CHECK" "COLLATE" "CONFLICT" // "CONSTRAINT" "CURRENT_TIME" "CURRENT_DATE" "CURRENT_TIMESTAMP" "DEFAULT" // "DEFERRED" "DESC" "END" "FAIL" "FOREIGN" "GLOB" "KEY" "LIKE" "IGNORE" @@ -5593,51 +5713,71 @@ // "UNIQUE" ID QUOTEDID QUOTEDLITERAL NUMERIC STRINGLITERAL LPAREN RPAREN // COMMA PLUS MINUS const ANTLR_USE_NAMESPACE(antlr)BitSet Sqlite3Parser::_tokenSet_6(_tokenSet_6_data_,8); -const unsigned long Sqlite3Parser::_tokenSet_7_data_[] = { 4294408176UL, 2146957950UL, 1662910473UL, 1UL, 0UL, 0UL, 0UL, 0UL }; +const unsigned long Sqlite3Parser::_tokenSet_7_data_[] = { 4294408176UL, 4196395512UL, 503318845UL, 353UL, 0UL, 0UL, 0UL, 0UL }; // "ABORT" "ACTION" "AUTOINCREMENT" "AS" "ASC" "AND" "OR" "CASCADE" "CASE" // "CAST" "CREATE" "COLLATE" "CONFLICT" "CURRENT_TIME" "CURRENT_DATE" "CURRENT_TIMESTAMP" // "DEFAULT" "DEFERRABLE" "DEFERRED" "DELETE" "DESC" "ELSE" "END" "ESCAPE" // "FAIL" "GLOB" "KEY" "LIKE" "TABLE" "IF" "IGNORE" "INITIALLY" "IMMEDIATE" // "IS" "NO" "NOT" "NULL" "MATCH" "EXISTS" "ON" "RAISE" "REFERENCES" "REGEXP" // "REPLACE" "RESTRICT" "ROLLBACK" "ROWID" "SET" "TEMPORARY" "TEMP" "THEN" -// "UPDATE" "WHEN" ID QUOTEDID QUOTEDLITERAL NUMERIC STRINGLITERAL LPAREN -// PLUS MINUS TILDE +// "UPDATE" "WHEN" ID QUOTEDID QUOTEDLITERAL NUMERIC STRINGLITERAL PLUS +// MINUS TILDE const ANTLR_USE_NAMESPACE(antlr)BitSet Sqlite3Parser::_tokenSet_7(_tokenSet_7_data_,8); -const unsigned long Sqlite3Parser::_tokenSet_8_data_[] = { 4294410226UL, 2146958078UL, 4280221705UL, 131071UL, 0UL, 0UL, 0UL, 0UL }; -// EOF "ABORT" "ACTION" "AUTOINCREMENT" "AS" "ASC" "AND" "OR" "BETWEEN" -// "CASCADE" "CASE" "CAST" "CREATE" "COLLATE" "CONFLICT" "CURRENT_TIME" -// "CURRENT_DATE" "CURRENT_TIMESTAMP" "DEFAULT" "DEFERRABLE" "DEFERRED" -// "DELETE" "DESC" "ELSE" "END" "ESCAPE" "FAIL" "GLOB" "KEY" "LIKE" "TABLE" -// "IF" "IGNORE" "IN" "INITIALLY" "IMMEDIATE" "IS" "NO" "NOT" "NULL" "MATCH" -// "EXISTS" "ON" "RAISE" "REFERENCES" "REGEXP" "REPLACE" "RESTRICT" "ROLLBACK" -// "ROWID" "SET" "TEMPORARY" "TEMP" "THEN" "UPDATE" "WHEN" DOT ID QUOTEDID -// QUOTEDLITERAL NUMERIC STRINGLITERAL LPAREN RPAREN COMMA SEMI PLUS MINUS -// STAR TILDE AMPERSAND BITOR OROP EQUAL EQUAL2 GREATER GREATEREQUAL LOWER -// LOWEREQUAL UNEQUAL UNEQUAL2 BITWISELEFT BITWISERIGHT SELECT SLASH PERCENT +const unsigned long Sqlite3Parser::_tokenSet_8_data_[] = { 4294410224UL, 4196396024UL, 520096061UL, 363UL, 0UL, 0UL, 0UL, 0UL }; +// "ABORT" "ACTION" "AUTOINCREMENT" "AS" "ASC" "AND" "OR" "BETWEEN" "CASCADE" +// "CASE" "CAST" "CREATE" "COLLATE" "CONFLICT" "CURRENT_TIME" "CURRENT_DATE" +// "CURRENT_TIMESTAMP" "DEFAULT" "DEFERRABLE" "DEFERRED" "DELETE" "DESC" +// "ELSE" "END" "ESCAPE" "FAIL" "GLOB" "KEY" "LIKE" "TABLE" "IF" "IGNORE" +// "IN" "INITIALLY" "IMMEDIATE" "IS" "NO" "NOT" "NULL" "MATCH" "EXISTS" +// "ON" "RAISE" "REFERENCES" "REGEXP" "REPLACE" "RESTRICT" "ROLLBACK" "ROWID" +// "SET" "TEMPORARY" "TEMP" "THEN" "UPDATE" "WHEN" DOT ID QUOTEDID QUOTEDLITERAL +// NUMERIC STRINGLITERAL LPAREN COMMA PLUS MINUS TILDE const ANTLR_USE_NAMESPACE(antlr)BitSet Sqlite3Parser::_tokenSet_8(_tokenSet_8_data_,8); -const unsigned long Sqlite3Parser::_tokenSet_9_data_[] = { 1536UL, 4263946UL, 3758096384UL, 114686UL, 0UL, 0UL, 0UL, 0UL }; +const unsigned long Sqlite3Parser::_tokenSet_9_data_[] = { 4294408176UL, 4196395512UL, 503318845UL, 355UL, 0UL, 0UL, 0UL, 0UL }; +// "ABORT" "ACTION" "AUTOINCREMENT" "AS" "ASC" "AND" "OR" "CASCADE" "CASE" +// "CAST" "CREATE" "COLLATE" "CONFLICT" "CURRENT_TIME" "CURRENT_DATE" "CURRENT_TIMESTAMP" +// "DEFAULT" "DEFERRABLE" "DEFERRED" "DELETE" "DESC" "ELSE" "END" "ESCAPE" +// "FAIL" "GLOB" "KEY" "LIKE" "TABLE" "IF" "IGNORE" "INITIALLY" "IMMEDIATE" +// "IS" "NO" "NOT" "NULL" "MATCH" "EXISTS" "ON" "RAISE" "REFERENCES" "REGEXP" +// "REPLACE" "RESTRICT" "ROLLBACK" "ROWID" "SET" "TEMPORARY" "TEMP" "THEN" +// "UPDATE" "WHEN" ID QUOTEDID QUOTEDLITERAL NUMERIC STRINGLITERAL LPAREN +// PLUS MINUS TILDE +const ANTLR_USE_NAMESPACE(antlr)BitSet Sqlite3Parser::_tokenSet_9(_tokenSet_9_data_,8); +const unsigned long Sqlite3Parser::_tokenSet_10_data_[] = { 4294410224UL, 4196396024UL, 520096061UL, 29360103UL, 0UL, 0UL, 0UL, 0UL }; +// "ABORT" "ACTION" "AUTOINCREMENT" "AS" "ASC" "AND" "OR" "BETWEEN" "CASCADE" +// "CASE" "CAST" "CREATE" "COLLATE" "CONFLICT" "CURRENT_TIME" "CURRENT_DATE" +// "CURRENT_TIMESTAMP" "DEFAULT" "DEFERRABLE" "DEFERRED" "DELETE" "DESC" +// "ELSE" "END" "ESCAPE" "FAIL" "GLOB" "KEY" "LIKE" "TABLE" "IF" "IGNORE" +// "IN" "INITIALLY" "IMMEDIATE" "IS" "NO" "NOT" "NULL" "MATCH" "EXISTS" +// "ON" "RAISE" "REFERENCES" "REGEXP" "REPLACE" "RESTRICT" "ROLLBACK" "ROWID" +// "SET" "TEMPORARY" "TEMP" "THEN" "UPDATE" "WHEN" DOT ID QUOTEDID QUOTEDLITERAL +// NUMERIC STRINGLITERAL LPAREN RPAREN PLUS MINUS STAR TILDE AMPERSAND +// BITOR OROP EQUAL EQUAL2 GREATER GREATEREQUAL LOWER LOWEREQUAL UNEQUAL +// UNEQUAL2 BITWISELEFT BITWISERIGHT SLASH PERCENT +const ANTLR_USE_NAMESPACE(antlr)BitSet Sqlite3Parser::_tokenSet_10(_tokenSet_10_data_,8); +const unsigned long Sqlite3Parser::_tokenSet_11_data_[] = { 1536UL, 268714024UL, 0UL, 29359840UL, 0UL, 0UL, 0UL, 0UL }; // "AND" "OR" "GLOB" "LIKE" "IS" "MATCH" "REGEXP" PLUS MINUS STAR AMPERSAND // BITOR OROP EQUAL EQUAL2 GREATER GREATEREQUAL LOWER LOWEREQUAL UNEQUAL // UNEQUAL2 BITWISELEFT BITWISERIGHT SLASH PERCENT -const ANTLR_USE_NAMESPACE(antlr)BitSet Sqlite3Parser::_tokenSet_9(_tokenSet_9_data_,8); -const unsigned long Sqlite3Parser::_tokenSet_10_data_[] = { 7340032UL, 32768UL, 17825792UL, 0UL, 0UL, 0UL, 0UL, 0UL }; +const ANTLR_USE_NAMESPACE(antlr)BitSet Sqlite3Parser::_tokenSet_11(_tokenSet_11_data_,8); +const unsigned long Sqlite3Parser::_tokenSet_12_data_[] = { 7340032UL, 131072UL, 268435456UL, 1UL, 0UL, 0UL, 0UL, 0UL }; // "CURRENT_TIME" "CURRENT_DATE" "CURRENT_TIMESTAMP" "NULL" NUMERIC STRINGLITERAL -const ANTLR_USE_NAMESPACE(antlr)BitSet Sqlite3Parser::_tokenSet_10(_tokenSet_10_data_,8); -const unsigned long Sqlite3Parser::_tokenSet_11_data_[] = { 9076736UL, 2150154241UL, 201326592UL, 0UL, 0UL, 0UL, 0UL, 0UL }; +const ANTLR_USE_NAMESPACE(antlr)BitSet Sqlite3Parser::_tokenSet_12(_tokenSet_12_data_,8); +const unsigned long Sqlite3Parser::_tokenSet_13_data_[] = { 9076736UL, 151191556UL, 128UL, 12UL, 0UL, 0UL, 0UL, 0UL }; // "CHECK" "COLLATE" "CONSTRAINT" "DEFAULT" "FOREIGN" "NOT" "NULL" "PRIMARY" // "REFERENCES" "UNIQUE" RPAREN COMMA -const ANTLR_USE_NAMESPACE(antlr)BitSet Sqlite3Parser::_tokenSet_11(_tokenSet_11_data_,8); -const unsigned long Sqlite3Parser::_tokenSet_12_data_[] = { 2859749680UL, 869345870UL, 0UL, 0UL }; +const ANTLR_USE_NAMESPACE(antlr)BitSet Sqlite3Parser::_tokenSet_13(_tokenSet_13_data_,8); +const unsigned long Sqlite3Parser::_tokenSet_14_data_[] = { 2859749680UL, 4060391736UL, 24UL, 0UL, 0UL, 0UL, 0UL, 0UL }; // "ABORT" "ACTION" "ASC" "CASCADE" "CAST" "CONFLICT" "CURRENT_TIME" "CURRENT_DATE" // "CURRENT_TIMESTAMP" "DEFERRED" "DESC" "END" "FAIL" "GLOB" "KEY" "LIKE" // "IGNORE" "INITIALLY" "IMMEDIATE" "NO" "MATCH" "RAISE" "REGEXP" "REPLACE" // "RESTRICT" "ROLLBACK" "TEMPORARY" "TEMP" -const ANTLR_USE_NAMESPACE(antlr)BitSet Sqlite3Parser::_tokenSet_12(_tokenSet_12_data_,4); -const unsigned long Sqlite3Parser::_tokenSet_13_data_[] = { 9076736UL, 2150154241UL, 202375168UL, 0UL, 0UL, 0UL, 0UL, 0UL }; +const ANTLR_USE_NAMESPACE(antlr)BitSet Sqlite3Parser::_tokenSet_14(_tokenSet_14_data_,8); +const unsigned long Sqlite3Parser::_tokenSet_15_data_[] = { 9076736UL, 151191556UL, 268435584UL, 12UL, 0UL, 0UL, 0UL, 0UL }; // "CHECK" "COLLATE" "CONSTRAINT" "DEFAULT" "FOREIGN" "NOT" "NULL" "PRIMARY" // "REFERENCES" "UNIQUE" NUMERIC RPAREN COMMA -const ANTLR_USE_NAMESPACE(antlr)BitSet Sqlite3Parser::_tokenSet_13(_tokenSet_13_data_,8); -const unsigned long Sqlite3Parser::_tokenSet_14_data_[] = { 4294965234UL, 4294965887UL, 2132672553UL, 0UL, 0UL, 0UL, 0UL, 0UL }; +const ANTLR_USE_NAMESPACE(antlr)BitSet Sqlite3Parser::_tokenSet_15(_tokenSet_15_data_,8); +const unsigned long Sqlite3Parser::_tokenSet_16_data_[] = { 4294965234UL, 4213172732UL, 503327165UL, 127UL, 0UL, 0UL, 0UL, 0UL }; // EOF "ABORT" "ACTION" "AUTOINCREMENT" "AS" "ASC" "AND" "OR" "CASCADE" // "CASE" "CAST" "CHECK" "CREATE" "COLLATE" "CONFLICT" "CONSTRAINT" "CURRENT_TIME" // "CURRENT_DATE" "CURRENT_TIMESTAMP" "DEFAULT" "DEFERRABLE" "DEFERRED" @@ -5647,35 +5787,25 @@ // "REPLACE" "RESTRICT" "ROLLBACK" "ROWID" "SET" "TEMPORARY" "TEMP" "THEN" // "UNIQUE" "UPDATE" "WHEN" "WITHOUT" ID QUOTEDID QUOTEDLITERAL NUMERIC // STRINGLITERAL LPAREN RPAREN COMMA SEMI PLUS MINUS -const ANTLR_USE_NAMESPACE(antlr)BitSet Sqlite3Parser::_tokenSet_14(_tokenSet_14_data_,8); -const unsigned long Sqlite3Parser::_tokenSet_15_data_[] = { 2013401026UL, 1078022282UL, 4227858440UL, 114686UL, 0UL, 0UL, 0UL, 0UL }; +const ANTLR_USE_NAMESPACE(antlr)BitSet Sqlite3Parser::_tokenSet_16(_tokenSet_16_data_,8); +const unsigned long Sqlite3Parser::_tokenSet_17_data_[] = { 2013401026UL, 268780072UL, 2080UL, 29359868UL, 0UL, 0UL, 0UL, 0UL }; // EOF "AUTOINCREMENT" "AS" "ASC" "AND" "OR" "BETWEEN" "COLLATE" "DESC" // "ELSE" "END" "ESCAPE" "GLOB" "LIKE" "IN" "IS" "NOT" "MATCH" "REGEXP" // "THEN" "WHEN" RPAREN COMMA SEMI PLUS MINUS STAR AMPERSAND BITOR OROP // EQUAL EQUAL2 GREATER GREATEREQUAL LOWER LOWEREQUAL UNEQUAL UNEQUAL2 // BITWISELEFT BITWISERIGHT SLASH PERCENT -const ANTLR_USE_NAMESPACE(antlr)BitSet Sqlite3Parser::_tokenSet_15(_tokenSet_15_data_,8); -const unsigned long Sqlite3Parser::_tokenSet_16_data_[] = { 2013401026UL, 1078022282UL, 4227923976UL, 114686UL, 0UL, 0UL, 0UL, 0UL }; +const ANTLR_USE_NAMESPACE(antlr)BitSet Sqlite3Parser::_tokenSet_17(_tokenSet_17_data_,8); +const unsigned long Sqlite3Parser::_tokenSet_18_data_[] = { 2013401026UL, 268780072UL, 16779296UL, 29359868UL, 0UL, 0UL, 0UL, 0UL }; // EOF "AUTOINCREMENT" "AS" "ASC" "AND" "OR" "BETWEEN" "COLLATE" "DESC" // "ELSE" "END" "ESCAPE" "GLOB" "LIKE" "IN" "IS" "NOT" "MATCH" "REGEXP" // "THEN" "WHEN" DOT RPAREN COMMA SEMI PLUS MINUS STAR AMPERSAND BITOR // OROP EQUAL EQUAL2 GREATER GREATEREQUAL LOWER LOWEREQUAL UNEQUAL UNEQUAL2 // BITWISELEFT BITWISERIGHT SLASH PERCENT -const ANTLR_USE_NAMESPACE(antlr)BitSet Sqlite3Parser::_tokenSet_16(_tokenSet_16_data_,8); -const unsigned long Sqlite3Parser::_tokenSet_17_data_[] = { 4294408176UL, 2146957950UL, 1662910473UL, 16385UL, 0UL, 0UL, 0UL, 0UL }; -// "ABORT" "ACTION" "AUTOINCREMENT" "AS" "ASC" "AND" "OR" "CASCADE" "CASE" -// "CAST" "CREATE" "COLLATE" "CONFLICT" "CURRENT_TIME" "CURRENT_DATE" "CURRENT_TIMESTAMP" -// "DEFAULT" "DEFERRABLE" "DEFERRED" "DELETE" "DESC" "ELSE" "END" "ESCAPE" -// "FAIL" "GLOB" "KEY" "LIKE" "TABLE" "IF" "IGNORE" "INITIALLY" "IMMEDIATE" -// "IS" "NO" "NOT" "NULL" "MATCH" "EXISTS" "ON" "RAISE" "REFERENCES" "REGEXP" -// "REPLACE" "RESTRICT" "ROLLBACK" "ROWID" "SET" "TEMPORARY" "TEMP" "THEN" -// "UPDATE" "WHEN" ID QUOTEDID QUOTEDLITERAL NUMERIC STRINGLITERAL LPAREN -// PLUS MINUS TILDE SELECT -const ANTLR_USE_NAMESPACE(antlr)BitSet Sqlite3Parser::_tokenSet_17(_tokenSet_17_data_,8); -const unsigned long Sqlite3Parser::_tokenSet_18_data_[] = { 133120UL, 4276362UL, 0UL, 0UL }; +const ANTLR_USE_NAMESPACE(antlr)BitSet Sqlite3Parser::_tokenSet_18(_tokenSet_18_data_,8); +const unsigned long Sqlite3Parser::_tokenSet_19_data_[] = { 133120UL, 268763688UL, 0UL, 0UL }; // "BETWEEN" "COLLATE" "GLOB" "LIKE" "IN" "NOT" "MATCH" "REGEXP" -const ANTLR_USE_NAMESPACE(antlr)BitSet Sqlite3Parser::_tokenSet_18(_tokenSet_18_data_,4); -const unsigned long Sqlite3Parser::_tokenSet_19_data_[] = { 4294410224UL, 2146958078UL, 1662910473UL, 1UL, 0UL, 0UL, 0UL, 0UL }; +const ANTLR_USE_NAMESPACE(antlr)BitSet Sqlite3Parser::_tokenSet_19(_tokenSet_19_data_,4); +const unsigned long Sqlite3Parser::_tokenSet_20_data_[] = { 4294410224UL, 4196396024UL, 503318845UL, 355UL, 0UL, 0UL, 0UL, 0UL }; // "ABORT" "ACTION" "AUTOINCREMENT" "AS" "ASC" "AND" "OR" "BETWEEN" "CASCADE" // "CASE" "CAST" "CREATE" "COLLATE" "CONFLICT" "CURRENT_TIME" "CURRENT_DATE" // "CURRENT_TIMESTAMP" "DEFAULT" "DEFERRABLE" "DEFERRED" "DELETE" "DESC" @@ -5684,14 +5814,14 @@ // "ON" "RAISE" "REFERENCES" "REGEXP" "REPLACE" "RESTRICT" "ROLLBACK" "ROWID" // "SET" "TEMPORARY" "TEMP" "THEN" "UPDATE" "WHEN" ID QUOTEDID QUOTEDLITERAL // NUMERIC STRINGLITERAL LPAREN PLUS MINUS TILDE -const ANTLR_USE_NAMESPACE(antlr)BitSet Sqlite3Parser::_tokenSet_19(_tokenSet_19_data_,8); -const unsigned long Sqlite3Parser::_tokenSet_20_data_[] = { 2013398978UL, 1078005770UL, 4227858440UL, 114686UL, 0UL, 0UL, 0UL, 0UL }; +const ANTLR_USE_NAMESPACE(antlr)BitSet Sqlite3Parser::_tokenSet_20(_tokenSet_20_data_,8); +const unsigned long Sqlite3Parser::_tokenSet_21_data_[] = { 2013398978UL, 268714024UL, 2080UL, 29359868UL, 0UL, 0UL, 0UL, 0UL }; // EOF "AUTOINCREMENT" "AS" "ASC" "AND" "OR" "COLLATE" "DESC" "ELSE" "END" // "ESCAPE" "GLOB" "LIKE" "IS" "MATCH" "REGEXP" "THEN" "WHEN" RPAREN COMMA // SEMI PLUS MINUS STAR AMPERSAND BITOR OROP EQUAL EQUAL2 GREATER GREATEREQUAL // LOWER LOWEREQUAL UNEQUAL UNEQUAL2 BITWISELEFT BITWISERIGHT SLASH PERCENT -const ANTLR_USE_NAMESPACE(antlr)BitSet Sqlite3Parser::_tokenSet_20(_tokenSet_20_data_,8); -const unsigned long Sqlite3Parser::_tokenSet_21_data_[] = { 4294967282UL, 4294966015UL, 4280156185UL, 114687UL, 0UL, 0UL, 0UL, 0UL }; +const ANTLR_USE_NAMESPACE(antlr)BitSet Sqlite3Parser::_tokenSet_21(_tokenSet_21_data_,8); +const unsigned long Sqlite3Parser::_tokenSet_22_data_[] = { 4294967282UL, 4213173244UL, 503323069UL, 29360127UL, 0UL, 0UL, 0UL, 0UL }; // EOF "ABORT" "ACTION" "AUTOINCREMENT" "AS" "ASC" "AND" "OR" "BETWEEN" // "CASCADE" "CASE" "CAST" "CHECK" "CREATE" "COLLATE" "CONFLICT" "CONSTRAINT" // "CURRENT_TIME" "CURRENT_DATE" "CURRENT_TIMESTAMP" "DEFAULT" "DEFERRABLE" @@ -5703,8 +5833,8 @@ // STRINGLITERAL LPAREN RPAREN COMMA SEMI PLUS MINUS STAR TILDE AMPERSAND // BITOR OROP EQUAL EQUAL2 GREATER GREATEREQUAL LOWER LOWEREQUAL UNEQUAL // UNEQUAL2 BITWISELEFT BITWISERIGHT SLASH PERCENT -const ANTLR_USE_NAMESPACE(antlr)BitSet Sqlite3Parser::_tokenSet_21(_tokenSet_21_data_,8); -const unsigned long Sqlite3Parser::_tokenSet_22_data_[] = { 4294410224UL, 2146958078UL, 3810459657UL, 131071UL, 0UL, 0UL, 0UL, 0UL }; +const ANTLR_USE_NAMESPACE(antlr)BitSet Sqlite3Parser::_tokenSet_22(_tokenSet_22_data_,8); +const unsigned long Sqlite3Parser::_tokenSet_23_data_[] = { 4294410224UL, 4196396024UL, 520096061UL, 29360099UL, 0UL, 0UL, 0UL, 0UL }; // "ABORT" "ACTION" "AUTOINCREMENT" "AS" "ASC" "AND" "OR" "BETWEEN" "CASCADE" // "CASE" "CAST" "CREATE" "COLLATE" "CONFLICT" "CURRENT_TIME" "CURRENT_DATE" // "CURRENT_TIMESTAMP" "DEFAULT" "DEFERRABLE" "DEFERRED" "DELETE" "DESC" @@ -5714,12 +5844,12 @@ // "SET" "TEMPORARY" "TEMP" "THEN" "UPDATE" "WHEN" DOT ID QUOTEDID QUOTEDLITERAL // NUMERIC STRINGLITERAL LPAREN PLUS MINUS STAR TILDE AMPERSAND BITOR OROP // EQUAL EQUAL2 GREATER GREATEREQUAL LOWER LOWEREQUAL UNEQUAL UNEQUAL2 -// BITWISELEFT BITWISERIGHT SELECT SLASH PERCENT -const ANTLR_USE_NAMESPACE(antlr)BitSet Sqlite3Parser::_tokenSet_22(_tokenSet_22_data_,8); -const unsigned long Sqlite3Parser::_tokenSet_23_data_[] = { 1024UL, 4263946UL, 3758096384UL, 114686UL, 0UL, 0UL, 0UL, 0UL }; +// BITWISELEFT BITWISERIGHT SLASH PERCENT +const ANTLR_USE_NAMESPACE(antlr)BitSet Sqlite3Parser::_tokenSet_23(_tokenSet_23_data_,8); +const unsigned long Sqlite3Parser::_tokenSet_24_data_[] = { 1024UL, 268714024UL, 0UL, 29359840UL, 0UL, 0UL, 0UL, 0UL }; // "OR" "GLOB" "LIKE" "IS" "MATCH" "REGEXP" PLUS MINUS STAR AMPERSAND BITOR // OROP EQUAL EQUAL2 GREATER GREATEREQUAL LOWER LOWEREQUAL UNEQUAL UNEQUAL2 // BITWISELEFT BITWISERIGHT SLASH PERCENT -const ANTLR_USE_NAMESPACE(antlr)BitSet Sqlite3Parser::_tokenSet_23(_tokenSet_23_data_,8); +const ANTLR_USE_NAMESPACE(antlr)BitSet Sqlite3Parser::_tokenSet_24(_tokenSet_24_data_,8); diff -Nru sqlitebrowser-3.10.100ubuntu1/src/grammar/Sqlite3Parser.hpp sqlitebrowser-3.11.1/src/grammar/Sqlite3Parser.hpp --- sqlitebrowser-3.10.100ubuntu1/src/grammar/Sqlite3Parser.hpp 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/src/grammar/Sqlite3Parser.hpp 2019-02-19 23:51:34.000000000 +0000 @@ -2,7 +2,7 @@ #define INC_Sqlite3Parser_hpp_ #include -/* $ANTLR 2.7.7 (20160127): "sqlite3.g" -> "Sqlite3Parser.hpp"$ */ +/* $ANTLR 2.7.7 (20171109): "sqlite3.g" -> "Sqlite3Parser.hpp"$ */ #include #include #include "sqlite3TokenTypes.hpp" @@ -80,10 +80,10 @@ private: static const char* tokenNames[]; #ifndef NO_STATIC_CONSTS - static const int NUM_TOKENS = 113; + static const int NUM_TOKENS = 121; #else enum { - NUM_TOKENS = 113 + NUM_TOKENS = 121 }; #endif @@ -135,6 +135,8 @@ static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_22; static const unsigned long _tokenSet_23_data_[]; static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_23; + static const unsigned long _tokenSet_24_data_[]; + static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_24; }; #endif /*INC_Sqlite3Parser_hpp_*/ diff -Nru sqlitebrowser-3.10.100ubuntu1/src/grammar/sqlite3TokenTypes.hpp sqlitebrowser-3.11.1/src/grammar/sqlite3TokenTypes.hpp --- sqlitebrowser-3.10.100ubuntu1/src/grammar/sqlite3TokenTypes.hpp 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/src/grammar/sqlite3TokenTypes.hpp 2019-02-19 23:51:34.000000000 +0000 @@ -1,7 +1,7 @@ #ifndef INC_sqlite3TokenTypes_hpp_ #define INC_sqlite3TokenTypes_hpp_ -/* $ANTLR 2.7.7 (20160127): "sqlite3.g" -> "sqlite3TokenTypes.hpp"$ */ +/* $ANTLR 2.7.7 (20171109): "sqlite3.g" -> "sqlite3TokenTypes.hpp"$ */ #ifndef CUSTOM_API # define CUSTOM_API @@ -40,87 +40,95 @@ END = 29, ESCAPE = 30, FAIL = 31, - FOREIGN = 32, - GLOB = 33, - KEY = 34, - LIKE = 35, - TABLE = 36, - IF_T = 37, - IGNORE = 38, - IN = 39, - INDEX = 40, - INITIALLY = 41, - INSERT = 42, - IMMEDIATE = 43, - IS = 44, - NO = 45, - NOT = 46, - NULL_T = 47, - MATCH = 48, - EXISTS = 49, - ON = 50, - PRIMARY = 51, - RAISE = 52, - REFERENCES = 53, - REGEXP = 54, - REPLACE = 55, - RESTRICT = 56, - ROLLBACK = 57, - ROWID = 58, - SET = 59, - TEMPORARY = 60, - TEMP = 61, - THEN = 62, - UNIQUE = 63, - UPDATE = 64, - USING = 65, - VIRTUAL = 66, - WHEN = 67, - WHERE = 68, - WITHOUT = 69, - TYPE_NAME = 70, - COLUMNDEF = 71, - COLUMNCONSTRAINT = 72, - TABLECONSTRAINT = 73, - CREATETABLE = 74, - CREATEINDEX = 75, - INDEXEDCOLUMN = 76, - KEYWORDASTABLENAME = 77, - KEYWORDASCOLUMNNAME = 78, - DIGIT = 79, - DOT = 80, - ID = 81, - QUOTEDID = 82, - QUOTEDLITERAL = 83, - NUMERIC = 84, - NL = 85, - COMMENT = 86, - WS = 87, - STRINGLITERAL = 88, - LPAREN = 89, - RPAREN = 90, - COMMA = 91, - SEMI = 92, - PLUS = 93, - MINUS = 94, - STAR = 95, - TILDE = 96, - AMPERSAND = 97, - BITOR = 98, - OROP = 99, - EQUAL = 100, - EQUAL2 = 101, - GREATER = 102, - GREATEREQUAL = 103, - LOWER = 104, - LOWEREQUAL = 105, - UNEQUAL = 106, - UNEQUAL2 = 107, - BITWISELEFT = 108, - BITWISERIGHT = 109, - SELECT = 110, - SLASH = 111, - PERCENT = 112, + FILTER = 32, + FOLLOWING = 33, + FOREIGN = 34, + GLOB = 35, + KEY = 36, + LIKE = 37, + TABLE = 38, + IF_T = 39, + IGNORE = 40, + IN = 41, + INDEX = 42, + INITIALLY = 43, + INSERT = 44, + IMMEDIATE = 45, + IS = 46, + NO = 47, + NOT = 48, + NULL_T = 49, + MATCH = 50, + EXISTS = 51, + ON = 52, + OVER = 53, + PARTITION = 54, + PRECEDING = 55, + PRIMARY = 56, + RAISE = 57, + RANGE = 58, + REFERENCES = 59, + REGEXP = 60, + REPLACE = 61, + RESTRICT = 62, + ROLLBACK = 63, + ROWID = 64, + ROWS = 65, + SET = 66, + TEMPORARY = 67, + TEMP = 68, + THEN = 69, + UNBOUNDED = 70, + UNIQUE = 71, + UPDATE = 72, + USING = 73, + VIRTUAL = 74, + WHEN = 75, + WHERE = 76, + WITHOUT = 77, + TYPE_NAME = 78, + COLUMNDEF = 79, + COLUMNCONSTRAINT = 80, + TABLECONSTRAINT = 81, + CREATETABLE = 82, + CREATEINDEX = 83, + INDEXEDCOLUMN = 84, + KEYWORDASTABLENAME = 85, + KEYWORDASCOLUMNNAME = 86, + DIGIT = 87, + DOT = 88, + ID = 89, + QUOTEDID = 90, + QUOTEDLITERAL = 91, + NUMERIC = 92, + NL = 93, + COMMENT = 94, + WS = 95, + STRINGLITERAL = 96, + LPAREN = 97, + RPAREN = 98, + COMMA = 99, + SEMI = 100, + PLUS = 101, + MINUS = 102, + STAR = 103, + TILDE = 104, + AMPERSAND = 105, + BITOR = 106, + OROP = 107, + EQUAL = 108, + EQUAL2 = 109, + GREATER = 110, + GREATEREQUAL = 111, + LOWER = 112, + LOWEREQUAL = 113, + UNEQUAL = 114, + UNEQUAL2 = 115, + BITWISELEFT = 116, + BITWISERIGHT = 117, + SELECT = 118, + SLASH = 119, + PERCENT = 120, NULL_TREE_LOOKAHEAD = 3 }; #ifdef __cplusplus Binary files /tmp/tmp6Z6cU5/j7Ppk8t7g0/sqlitebrowser-3.10.100ubuntu1/src/icons/application_side_list.png and /tmp/tmp6Z6cU5/0KfjjA5oc3/sqlitebrowser-3.11.1/src/icons/application_side_list.png differ Binary files /tmp/tmp6Z6cU5/j7Ppk8t7g0/sqlitebrowser-3.10.100ubuntu1/src/icons/cancel.png and /tmp/tmp6Z6cU5/0KfjjA5oc3/sqlitebrowser-3.11.1/src/icons/cancel.png differ Binary files /tmp/tmp6Z6cU5/j7Ppk8t7g0/sqlitebrowser-3.10.100ubuntu1/src/icons/clear_filters.png and /tmp/tmp6Z6cU5/0KfjjA5oc3/sqlitebrowser-3.11.1/src/icons/clear_filters.png differ Binary files /tmp/tmp6Z6cU5/j7Ppk8t7g0/sqlitebrowser-3.10.100ubuntu1/src/icons/comment_block.png and /tmp/tmp6Z6cU5/0KfjjA5oc3/sqlitebrowser-3.11.1/src/icons/comment_block.png differ Binary files /tmp/tmp6Z6cU5/j7Ppk8t7g0/sqlitebrowser-3.10.100ubuntu1/src/icons/filter.png and /tmp/tmp6Z6cU5/0KfjjA5oc3/sqlitebrowser-3.11.1/src/icons/filter.png differ Binary files /tmp/tmp6Z6cU5/j7Ppk8t7g0/sqlitebrowser-3.10.100ubuntu1/src/icons/hourglass.png and /tmp/tmp6Z6cU5/0KfjjA5oc3/sqlitebrowser-3.11.1/src/icons/hourglass.png differ diff -Nru sqlitebrowser-3.10.100ubuntu1/src/icons/icons.qrc sqlitebrowser-3.11.1/src/icons/icons.qrc --- sqlitebrowser-3.10.100ubuntu1/src/icons/icons.qrc 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/src/icons/icons.qrc 2019-02-19 23:51:34.000000000 +0000 @@ -37,7 +37,7 @@ bullet_arrow_up.png sqlitebrowser.png internet-web-browser.png - package.png + package.png package_go.png page_key.png key.png @@ -60,10 +60,24 @@ page_find.png cross.png page_white_copy.png + page_copy_sql.png text_replace.png picture_save.png application_side_list.png database_link.png text_indent.png + printer.png + package_save.png + cancel.png + comment_block.png + hourglass.png + table_row_delete.png + table_row_insert.png + textfield_delete.png + filter.png + tab.png + package_rename.png + page_foreign_key.png + save_all.png Binary files /tmp/tmp6Z6cU5/j7Ppk8t7g0/sqlitebrowser-3.10.100ubuntu1/src/icons/package_rename.png and /tmp/tmp6Z6cU5/0KfjjA5oc3/sqlitebrowser-3.11.1/src/icons/package_rename.png differ Binary files /tmp/tmp6Z6cU5/j7Ppk8t7g0/sqlitebrowser-3.10.100ubuntu1/src/icons/package_save.png and /tmp/tmp6Z6cU5/0KfjjA5oc3/sqlitebrowser-3.11.1/src/icons/package_save.png differ Binary files /tmp/tmp6Z6cU5/j7Ppk8t7g0/sqlitebrowser-3.10.100ubuntu1/src/icons/page_copy_sql.png and /tmp/tmp6Z6cU5/0KfjjA5oc3/sqlitebrowser-3.11.1/src/icons/page_copy_sql.png differ Binary files /tmp/tmp6Z6cU5/j7Ppk8t7g0/sqlitebrowser-3.10.100ubuntu1/src/icons/page_foreign_key.png and /tmp/tmp6Z6cU5/0KfjjA5oc3/sqlitebrowser-3.11.1/src/icons/page_foreign_key.png differ Binary files /tmp/tmp6Z6cU5/j7Ppk8t7g0/sqlitebrowser-3.10.100ubuntu1/src/icons/printer.png and /tmp/tmp6Z6cU5/0KfjjA5oc3/sqlitebrowser-3.11.1/src/icons/printer.png differ Binary files /tmp/tmp6Z6cU5/j7Ppk8t7g0/sqlitebrowser-3.10.100ubuntu1/src/icons/save_all.png and /tmp/tmp6Z6cU5/0KfjjA5oc3/sqlitebrowser-3.11.1/src/icons/save_all.png differ Binary files /tmp/tmp6Z6cU5/j7Ppk8t7g0/sqlitebrowser-3.10.100ubuntu1/src/icons/table_row_delete.png and /tmp/tmp6Z6cU5/0KfjjA5oc3/sqlitebrowser-3.11.1/src/icons/table_row_delete.png differ Binary files /tmp/tmp6Z6cU5/j7Ppk8t7g0/sqlitebrowser-3.10.100ubuntu1/src/icons/table_row_insert.png and /tmp/tmp6Z6cU5/0KfjjA5oc3/sqlitebrowser-3.11.1/src/icons/table_row_insert.png differ Binary files /tmp/tmp6Z6cU5/j7Ppk8t7g0/sqlitebrowser-3.10.100ubuntu1/src/icons/tab.png and /tmp/tmp6Z6cU5/0KfjjA5oc3/sqlitebrowser-3.11.1/src/icons/tab.png differ Binary files /tmp/tmp6Z6cU5/j7Ppk8t7g0/sqlitebrowser-3.10.100ubuntu1/src/icons/textfield_delete.png and /tmp/tmp6Z6cU5/0KfjjA5oc3/sqlitebrowser-3.11.1/src/icons/textfield_delete.png differ diff -Nru sqlitebrowser-3.10.100ubuntu1/src/ImportCsvDialog.cpp sqlitebrowser-3.11.1/src/ImportCsvDialog.cpp --- sqlitebrowser-3.10.100ubuntu1/src/ImportCsvDialog.cpp 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/src/ImportCsvDialog.cpp 2019-02-19 23:51:34.000000000 +0000 @@ -33,6 +33,9 @@ { ui->setupUi(this); + // Hide "Advanced" section of the settings + toggleAdvancedSection(false); + // Get the actual file name out of the provided path and use it as the default table name for import // For importing several files at once, the fields have to be the same so we can safely use the first QFileInfo file(filenames.first()); @@ -97,10 +100,15 @@ void rollback( ImportCsvDialog* dialog, DBBrowserDB* pdb, + DBBrowserDB::db_pointer_type* db_ptr, const QString& savepointName, size_t nRecord, const QString& message) { + // Release DB handle. This needs to be done before calling revertToSavepoint as that function needs to be able to acquire its own handle. + if(db_ptr) + *db_ptr = nullptr; + QApplication::restoreOverrideCursor(); // restore original cursor if(!message.isEmpty()) { @@ -236,8 +244,8 @@ // Set horizontal header data QStringList horizontalHeader; - for(const sqlb::FieldPtr& field : fieldList) - horizontalHeader.push_back(field->name()); + for(const sqlb::Field& field : fieldList) + horizontalHeader.push_back(field.name()); ui->tablePreview->setHorizontalHeaderLabels(horizontalHeader); // Parse file @@ -332,19 +340,18 @@ void ImportCsvDialog::matchSimilar() { - auto item = ui->filePicker->currentItem(); - auto selectedHeader = generateFieldList(item->data(Qt::DisplayRole).toString()); + auto selectedHeader = generateFieldList(ui->filePicker->currentItem()->data(Qt::DisplayRole).toString()); for (int i = 0; i < ui->filePicker->count(); i++) { auto item = ui->filePicker->item(i); auto header = generateFieldList(item->data(Qt::DisplayRole).toString()); - if (selectedHeader.count() == header.count()) + if (selectedHeader.size() == header.size()) { bool matchingHeader = std::equal(selectedHeader.begin(), selectedHeader.end(), header.begin(), - [](const sqlb::FieldPtr& item1, const sqlb::FieldPtr& item2) -> bool { - return (item1->name() == item2->name()); + [](const sqlb::Field& item1, const sqlb::Field& item2) -> bool { + return (item1.name() == item2.name()); }); if (matchingHeader) { item->setCheckState(Qt::Checked); @@ -409,17 +416,17 @@ // Add field to the column list. For now we set the data type to nothing but this might be overwritten later in the automatic // type detection code. - fieldList.push_back(sqlb::FieldPtr(new sqlb::Field(fieldname, ""))); + fieldList.emplace_back(fieldname, ""); } - // Try to find out a data type for each column - if(!(rowNum == 0 && ui->checkboxHeader->isChecked())) + // Try to find out a data type for each column. Skip the header row if there is one. + if(!ui->checkNoTypeDetection->isChecked() && !(rowNum == 0 && ui->checkboxHeader->isChecked())) { for(size_t i=0;itype(); + QString old_type = fieldList.at(i).type(); if(old_type != "TEXT") { QString content = QString::fromUtf8(data.fields[i].data, data.fields[i].data_length); @@ -442,7 +449,7 @@ else if(old_type == "INTEGER" && convert_to_int) // It was integer so far and still is new_type = "INTEGER"; - fieldList.at(i)->setType(new_type); + fieldList.at(i).setType(new_type); } } } @@ -493,7 +500,7 @@ const sqlb::ObjectPtr obj = pdb->getObjectByName(sqlb::ObjectIdentifier("main", tableName)); if(obj && obj->type() == sqlb::Object::Types::Table) { - if(obj.dynamicCast()->fields().size() != fieldList.size()) + if(std::dynamic_pointer_cast(obj)->fields.size() != fieldList.size()) { QMessageBox::warning(this, QApplication::applicationName(), tr("There is already a table named '%1' and an import into an existing table is only possible if the number of columns match.").arg(tableName)); @@ -530,17 +537,20 @@ QString restorepointName = pdb->generateSavepointName("csvimport"); if(!pdb->setSavepoint(restorepointName)) { - rollback(this, pdb, restorepointName, 0, tr("Creating restore point failed: %1").arg(pdb->lastError())); + rollback(this, pdb, nullptr, restorepointName, 0, tr("Creating restore point failed: %1").arg(pdb->lastError())); return false; } // Create table QVector nullValues; + std::vector failOnMissingFieldList; + bool ignoreDefaults = ui->checkIgnoreDefaults->isChecked(); + bool failOnMissing = ui->checkFailOnMissing->isChecked(); if(!importToExistingTable) { if(!pdb->createTable(sqlb::ObjectIdentifier("main", tableName), fieldList)) { - rollback(this, pdb, restorepointName, 0, tr("Creating the table failed: %1").arg(pdb->lastError())); + rollback(this, pdb, nullptr, restorepointName, 0, tr("Creating the table failed: %1").arg(pdb->lastError())); return false; } @@ -552,29 +562,57 @@ // Prepare the values for each table column that are to be inserted if the field in the CSV file is empty. Depending on the data type // and the constraints of a field, we need to handle this case differently. - sqlb::TablePtr tbl = pdb->getObjectByName(sqlb::ObjectIdentifier("main", tableName)).dynamicCast(); + sqlb::TablePtr tbl = pdb->getObjectByName(sqlb::ObjectIdentifier("main", tableName)); if(tbl) { - for(const sqlb::FieldPtr& f : tbl->fields()) + for(const sqlb::Field& f : tbl->fields) { - if(f->isInteger() && f->notnull()) // If this is an integer column but NULL isn't allowed, insert 0 - nullValues << "0"; - else if(f->isInteger() && !f->notnull()) // If this is an integer column and NULL is allowed, insert NULL - nullValues << QByteArray(); - else // Otherwise (i.e. if this isn't an integer column), insert an empty string - nullValues << ""; + // For determining the value for empty fields we follow a set of rules + + // Normally we don't have to fail the import when importing an empty field. This last value of the vector + // is changed to true later if we actually do want to fail the import for this field. + failOnMissingFieldList.push_back(false); + + // If a field has a default value, that gets priority over everything else. + // Exception: if the user wants to ignore default values we never use them. + if(!ignoreDefaults && !f.defaultValue().isNull()) + { + nullValues << f.defaultValue().toUtf8(); + } else { + // If it has no default value, check if the field is NOT NULL + if(f.notnull()) + { + // The field is NOT NULL + + // If this is an integer column insert 0. Otherwise insert an empty string. + if(f.isInteger()) + nullValues << "0"; + else + nullValues << ""; + + // If the user wants to fail the import, remember this field + if(failOnMissing) + failOnMissingFieldList.back() = true; + } else { + // The field is not NOT NULL (stupid double negation here! NULL values are allowed in this case) + + // Just insert a NULL value + nullValues << QByteArray(); + } + } } } } // Prepare the INSERT statement. The prepared statement can then be reused for each row to insert - QString sQuery = QString("INSERT INTO %1 VALUES(").arg(sqlb::escapeIdentifier(tableName)); - for(int i=1;i<=fieldList.size();i++) + QString sQuery = QString("INSERT %1 INTO %2 VALUES(").arg(currentOnConflictStrategy()).arg(sqlb::escapeIdentifier(tableName)); + for(size_t i=1;i<=fieldList.size();i++) sQuery.append(QString("?%1,").arg(i)); sQuery.chop(1); // Remove last comma sQuery.append(")"); sqlite3_stmt* stmt; - sqlite3_prepare_v2(pdb->_db, sQuery.toUtf8(), sQuery.toUtf8().length(), &stmt, nullptr); + auto pDb = pdb->get(tr("importing CSV")); + sqlite3_prepare_v2(pDb.get(), sQuery.toUtf8(), sQuery.toUtf8().length(), &stmt, nullptr); // Parse entire file size_t lastRowNum = 0; @@ -595,16 +633,23 @@ // Bind all values for(size_t i=0;i(nullValues.size()) > i) { + // Do we want to fail when trying to import an empty value into this field? Then exit with an error. + if(failOnMissingFieldList.at(i)) + return false; + // This is an empty value. We'll need to look up how to handle it depending on the field to be inserted into. const QByteArray& val = nullValues.at(i); if(!val.isNull()) // No need to bind NULL values here as that is the default bound value in SQLite sqlite3_bind_text(stmt, i+1, val, val.size(), SQLITE_STATIC); + // When importing into a new table, use the missing values setting directly + } else if(!importToExistingTable && data.fields[i].data_length == 0) { + // No need to bind NULL values here as that is the default bound value in SQLite } else { - // This is a non-empty value. Just add it to the statement + // This is a non-empty value, or we want to insert the empty string. Just add it to the statement sqlite3_bind_text(stmt, i+1, data.fields[i].data, data.fields[i].data_length, SQLITE_STATIC); } } @@ -631,13 +676,15 @@ // Some error occurred or the user cancelled the action // Rollback the entire import. If the action was cancelled, don't show an error message. If it errored, show an error message. - sqlite3_finalize(stmt); if(result == CSVParser::ParserResult::ParserResultCancelled) { - rollback(this, pdb, restorepointName, 0, QString()); + sqlite3_finalize(stmt); + rollback(this, pdb, &pDb, restorepointName, 0, QString()); return false; } else { - rollback(this, pdb, restorepointName, lastRowNum, tr("Inserting row failed: %1").arg(pdb->lastError())); + QString error(sqlite3_errmsg(pDb.get())); + sqlite3_finalize(stmt); + rollback(this, pdb, &pDb, restorepointName, lastRowNum, tr("Inserting row failed: %1").arg(error)); return false; } } @@ -731,3 +778,28 @@ else return ui->comboEncoding->currentText(); } + +QString ImportCsvDialog::currentOnConflictStrategy() const +{ + switch(ui->comboOnConflictStrategy->currentIndex()) + { + case 1: + return "OR IGNORE"; + case 2: + return "OR REPLACE"; + default: + return QString(); + } +} + +void ImportCsvDialog::toggleAdvancedSection(bool show) +{ + ui->labelNoTypeDetection->setVisible(show); + ui->checkNoTypeDetection->setVisible(show); + ui->labelFailOnMissing->setVisible(show); + ui->checkFailOnMissing->setVisible(show); + ui->labelIgnoreDefaults->setVisible(show); + ui->checkIgnoreDefaults->setVisible(show); + ui->labelOnConflictStrategy->setVisible(show); + ui->comboOnConflictStrategy->setVisible(show); +} diff -Nru sqlitebrowser-3.10.100ubuntu1/src/ImportCsvDialog.h sqlitebrowser-3.11.1/src/ImportCsvDialog.h --- sqlitebrowser-3.10.100ubuntu1/src/ImportCsvDialog.h 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/src/ImportCsvDialog.h 2019-02-19 23:51:34.000000000 +0000 @@ -2,14 +2,13 @@ #define IMPORTCSVDIALOG_H #include "csvparser.h" -#include "sqlitetypes.h" +#include "sql/sqlitetypes.h" #include #include class DBBrowserDB; class QCompleter; -class QListWidgetItem; namespace Ui { class ImportCsvDialog; @@ -21,16 +20,17 @@ public: explicit ImportCsvDialog(const QStringList& filenames, DBBrowserDB* db, QWidget* parent = nullptr); - ~ImportCsvDialog(); + ~ImportCsvDialog() override; private slots: - virtual void accept(); + void accept() override; void updatePreview(); void checkInput(); void selectFiles(); void updateSelectedFilePreview(); void updateSelection(bool); void matchSimilar(); + void toggleAdvancedSection(bool show); private: Ui::ImportCsvDialog* ui; @@ -53,6 +53,8 @@ void setEncoding(const QString& sEnc); QString currentEncoding() const; + + QString currentOnConflictStrategy() const; }; #endif diff -Nru sqlitebrowser-3.10.100ubuntu1/src/ImportCsvDialog.ui sqlitebrowser-3.11.1/src/ImportCsvDialog.ui --- sqlitebrowser-3.10.100ubuntu1/src/ImportCsvDialog.ui 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/src/ImportCsvDialog.ui 2019-02-19 23:51:34.000000000 +0000 @@ -6,14 +6,14 @@ 0 0 - 738 - 490 + 788 + 717 Import CSV file - + @@ -22,7 +22,7 @@ - &Table name + Table na&me editName @@ -49,7 +49,7 @@ - + Field &separator @@ -59,7 +59,7 @@ - + @@ -112,7 +112,7 @@ - + &Quote character @@ -122,7 +122,7 @@ - + @@ -170,7 +170,7 @@ - + &Encoding @@ -180,7 +180,7 @@ - + @@ -224,14 +224,17 @@ - + Trim fields? + + checkBoxTrimFields + - + @@ -241,23 +244,120 @@ - - - - + Separate tables + + checkBoxSeparateTables + - + + + + + Advanced + + + + :/icons/down:/icons/down + + + true + + + + + + + When importing an empty value from the CSV file into an existing table with a default value for this column, that default value is inserted. Activate this option to insert an empty value instead. + + + + + + + Ignore default &values + + + checkIgnoreDefaults + + + + + + + Activate this option to stop the import when trying to import an empty value into a NOT NULL column without a default value. + + + + + + + Fail on missing values + + + checkFailOnMissing + + + + + + + Disable data type detection + + + checkNoTypeDetection + + + + + + + Disable the automatic data type detection when creating a new table. + + + + + + + When importing into an existing table with a primary key, unique constraints or a unique index there is a chance for a conflict. This option allows you to select a strategy for that case: By default the import is aborted and rolled back but you can also choose to ignore and not import conflicting rows or to replace the existing row in the table. + + + + Abort import + + + + + Ignore row + + + + + Replace existing row + + + + + + + + Conflict strategy + + + comboOnConflictStrategy + + + @@ -365,12 +465,19 @@ editCustomEncoding checkBoxTrimFields checkBoxSeparateTables + buttonAdvanced + checkIgnoreDefaults + checkNoTypeDetection + checkFailOnMissing + comboOnConflictStrategy filePicker toggleSelected matchSimilar tablePreview - + + + comboSeparator @@ -379,8 +486,8 @@ updatePreview() - 232 - 99 + 245 + 92 445 @@ -411,8 +518,8 @@ updatePreview() - 478 - 99 + 511 + 92 577 @@ -427,8 +534,8 @@ updatePreview() - 478 - 132 + 511 + 126 530 @@ -443,8 +550,8 @@ updatePreview() - 495 - 165 + 524 + 160 540 @@ -459,8 +566,8 @@ updatePreview() - 184 - 191 + 192 + 182 368 @@ -475,8 +582,8 @@ updatePreview() - 266 - 165 + 271 + 160 572 @@ -491,8 +598,8 @@ updatePreview() - 184 - 60 + 192 + 56 354 @@ -507,8 +614,8 @@ updateSelection(bool) - 674 - 258 + 777 + 385 368 @@ -523,8 +630,8 @@ updatePreview() - 232 - 132 + 245 + 126 350 @@ -539,8 +646,8 @@ accept() - 272 - 478 + 281 + 707 157 @@ -555,8 +662,8 @@ reject() - 340 - 478 + 349 + 707 286 @@ -571,8 +678,8 @@ checkInput() - 176 - 216 + 192 + 206 368 @@ -587,8 +694,8 @@ matchSimilar() - 682 - 279 + 777 + 418 368 @@ -596,11 +703,28 @@ + + buttonAdvanced + toggled(bool) + ImportCsvDialog + toggleAdvancedSection(bool) + + + 265 + 241 + + + 393 + 358 + + + updatePreview() checkInput() updateSelection(bool) matchSimilar() + toggleAdvancedSection(bool) diff -Nru sqlitebrowser-3.10.100ubuntu1/src/MainWindow.cpp sqlitebrowser-3.11.1/src/MainWindow.cpp --- sqlitebrowser-3.10.100ubuntu1/src/MainWindow.cpp 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/src/MainWindow.cpp 2019-02-19 23:51:34.000000000 +0000 @@ -1,9 +1,11 @@ #include "MainWindow.h" #include "ui_MainWindow.h" +#include "Application.h" #include "EditIndexDialog.h" #include "AboutDialog.h" #include "EditTableDialog.h" +#include "AddRecordDialog.h" #include "ImportCsvDialog.h" #include "ExportDataDialog.h" #include "Settings.h" @@ -24,7 +26,11 @@ #include "RemoteDock.h" #include "RemoteDatabase.h" #include "FindReplaceDialog.h" +#include "Data.h" +#include "CondFormat.h" +#include "RunSql.h" +#include #include #include #include @@ -35,7 +41,6 @@ #include #include #include -#include #include #include #include @@ -47,11 +52,60 @@ #include #include #include -#include +#include +#include // This include seems to only be necessary for the Windows build +#include +#include + +#ifdef Q_OS_MACX //Needed only on macOS + #include +#endif + +const int MainWindow::MaxRecentFiles; + +// These are needed for reading and writing object files +QDataStream& operator>>(QDataStream& ds, sqlb::ObjectIdentifier& objid) +{ + // Read in the item + QVariant v; + ds >> v; + + // If it is a string list, we can treat it as an object identifier. If it isn't, we assume it's just a + // single string and use interpret it as the table name in the main schema. This is done for backwards + // compatability with old project file formats. + if(v.toStringList().isEmpty()) + objid = sqlb::ObjectIdentifier("main", v.toString()); + else + objid = sqlb::ObjectIdentifier(v); + return ds; +} + +// These are temporary helper functions to turn a vector of sorted columns into a single column to sort and vice verse. This is done by just taking the +// first sort column there is and ignoring all the others or creating a single item vector respectively. These functions can be removed once all parts +// of the application have been converted to deal with vectors of sorted columns. +static void fromSortOrderVector(const std::vector& vector, int& index, Qt::SortOrder& mode) +{ + if(vector.size()) + { + index = vector.at(0).column; + mode = vector.at(0).direction == sqlb::Ascending ? Qt::AscendingOrder : Qt::DescendingOrder; + } else { + index = 0; + mode = Qt::AscendingOrder; + } +} +static std::vector toSortOrderVector(int index, Qt::SortOrder mode) +{ + std::vector vector; + vector.emplace_back(index, mode == Qt::AscendingOrder ? sqlb::Ascending : sqlb::Descending); + return vector; +} + MainWindow::MainWindow(QWidget* parent) : QMainWindow(parent), ui(new Ui::MainWindow), + db(), m_browseTableModel(new SqliteTableModel(db, this, Settings::getValue("db", "prefetchsize").toInt())), m_currentTabTableModel(m_browseTableModel), m_remoteDb(new RemoteDatabase), @@ -59,7 +113,8 @@ plotDock(new PlotDock(this)), remoteDock(new RemoteDock(this)), findReplaceDialog(new FindReplaceDialog(this)), - gotoValidator(new QIntValidator(0, 0, this)) + gotoValidator(new QIntValidator(0, 0, this)), + execute_sql_worker(nullptr) { ui->setupUi(this); init(); @@ -75,6 +130,29 @@ delete ui; } +// Functions for documenting the shortcuts in the user interface using native names +static QString shortcutsTip(const QList& keys) +{ + QString tip(""); + + if (!keys.isEmpty()) { + tip = " ["; + + for (auto shortcut : keys) + tip.append(shortcut.toString(QKeySequence::NativeText) + ", "); + tip.chop(2); + + tip.append("]"); + } + return tip; +} + +static void addShortcutsTooltip(QAction* action, const QList& extraKeys = QList()) +{ + if (!action->shortcuts().isEmpty() || !extraKeys.isEmpty()) + action->setToolTip(action->toolTip() + shortcutsTip(action->shortcuts() + extraKeys)); +} + void MainWindow::init() { // Load window settings @@ -82,16 +160,25 @@ tabifyDockWidget(ui->dockLog, ui->dockSchema); tabifyDockWidget(ui->dockLog, ui->dockRemote); - // Add OpenGL Context for macOS #ifdef Q_OS_MACX + // Add OpenGL Context for macOS QOpenGLWidget *ogl = new QOpenGLWidget(this); ui->horizontalLayout->addWidget(ogl); ogl->setHidden(true); #endif + // Automatic update check +#ifdef CHECKNEWVERSION + connect(m_remoteDb, &RemoteDatabase::networkReady, [this]() { + // Check for a new version if automatic update check aren't disabled in the settings dialog + if(Settings::getValue("checkversion", "enabled").toBool()) + m_remoteDb->fetch("https://download.sqlitebrowser.org/currentrelease", RemoteDatabase::RequestTypeNewVersionCheck); + }); +#endif + // Connect SQL logging and database state setting to main window - connect(&db, SIGNAL(dbChanged(bool)), this, SLOT(dbState(bool))); - connect(&db, SIGNAL(sqlExecuted(QString, int)), this, SLOT(logSql(QString,int))); + connect(&db, &DBBrowserDB::dbChanged, this, &MainWindow::dbState, Qt::QueuedConnection); + connect(&db, &DBBrowserDB::sqlExecuted, this, &MainWindow::logSql, Qt::QueuedConnection); connect(&db, &DBBrowserDB::requestCollation, this, &MainWindow::requestCollation); // Set the validator for the goto line edit @@ -99,6 +186,8 @@ // Set up filters connect(ui->dataTable->filterHeader(), SIGNAL(filterChanged(int,QString)), this, SLOT(updateFilter(int,QString))); + connect(ui->dataTable->filterHeader(), SIGNAL(addCondFormat(int,QString)), this, SLOT(addCondFormat(int,QString))); + connect(ui->dataTable->filterHeader(), SIGNAL(clearAllCondFormats(int)), this, SLOT(clearAllCondFormats(int))); connect(m_browseTableModel, SIGNAL(dataChanged(QModelIndex,QModelIndex)), this, SLOT(dataTableSelectionChanged(QModelIndex))); // Select in table the rows correspoding to the selected points in plot @@ -106,11 +195,15 @@ // Set up DB structure tab dbStructureModel = new DbStructureModel(db, this); - connect(&db, &DBBrowserDB::structureUpdated, [this]() { + connect(&db, &DBBrowserDB::structureUpdated, this, [this]() { + // TODO This needs to be a queued connection because the schema can be updated from different threads than the main thread. + // However, this makes calling this lambda asynchronous which can lead to unexpected results. One example is that opening a database, + // changing to the Browse Data tab, and then opening another database makes the table browser try to load the old table because the table + // list wasn't updated yet. QString old_table = ui->comboBrowseTable->currentText(); dbStructureModel->reloadData(); populateStructure(old_table); - }); + }, Qt::QueuedConnection); ui->dbTreeWidget->setModel(dbStructureModel); ui->dbTreeWidget->setColumnWidth(DbStructureModel::ColumnName, 300); ui->dbTreeWidget->setColumnHidden(DbStructureModel::ColumnObjectType, true); @@ -118,7 +211,6 @@ // Set up DB schema dock ui->treeSchemaDock->setModel(dbStructureModel); - ui->treeSchemaDock->setColumnWidth(DbStructureModel::ColumnName, 300); ui->treeSchemaDock->setColumnHidden(DbStructureModel::ColumnObjectType, true); ui->treeSchemaDock->setColumnHidden(DbStructureModel::ColumnSchema, true); @@ -135,21 +227,29 @@ // Restore window geometry restoreGeometry(Settings::getValue("MainWindow", "geometry").toByteArray()); + + // Save default and restore window state + defaultWindowState = saveState(); restoreState(Settings::getValue("MainWindow", "windowState").toByteArray()); + // Save default and restore open tab order if the openTabs setting is saved. + defaultOpenTabs = saveOpenTabs(); + restoreOpenTabs(Settings::getValue("MainWindow", "openTabs").toString()); + // Restore dock state settings ui->comboLogSubmittedBy->setCurrentIndex(ui->comboLogSubmittedBy->findText(Settings::getValue("SQLLogDock", "Log").toString())); // Add keyboard shortcuts - QList shortcuts = ui->actionExecuteSql->shortcuts(); - shortcuts.push_back(QKeySequence(tr("Ctrl+Return"))); - ui->actionExecuteSql->setShortcuts(shortcuts); QShortcut* shortcutBrowseRefreshF5 = new QShortcut(QKeySequence("F5"), this); connect(shortcutBrowseRefreshF5, SIGNAL(activated()), this, SLOT(refresh())); QShortcut* shortcutBrowseRefreshCtrlR = new QShortcut(QKeySequence("Ctrl+R"), this); connect(shortcutBrowseRefreshCtrlR, SIGNAL(activated()), this, SLOT(refresh())); + // Add print shortcut for the DB Structure tab (dbTreeWidget) with context to the widget, so other print shortcuts aren't eclipsed. + QShortcut* shortcutPrint = new QShortcut(QKeySequence(QKeySequence::Print), ui->dbTreeWidget, nullptr, nullptr, Qt::WidgetShortcut); + connect(shortcutPrint, &QShortcut::activated, this, &MainWindow::printDbStructure); + // Create the actions for the recently opened dbs list for(int i = 0; i < MaxRecentFiles; ++i) { recentFileActs[i] = new QAction(this); @@ -169,6 +269,20 @@ popupTableMenu->addAction(ui->actionEditCopyCreateStatement); popupTableMenu->addAction(ui->actionExportCsvPopup); + popupSchemaDockMenu = new QMenu(this); + popupSchemaDockMenu->addAction(ui->actionDropQualifiedCheck); + popupSchemaDockMenu->addAction(ui->actionEnquoteNamesCheck); + + popupOpenDbMenu = new QMenu(this); + popupOpenDbMenu->addAction(ui->fileOpenAction); + popupOpenDbMenu->addAction(ui->fileOpenReadOnlyAction); + ui->fileOpenActionPopup->setMenu(popupOpenDbMenu); + + popupNewRecordMenu = new QMenu(this); + popupNewRecordMenu->addAction(ui->newRecordAction); + popupNewRecordMenu->addAction(ui->insertValuesAction); + ui->actionNewRecord->setMenu(popupNewRecordMenu); + popupSaveSqlFileMenu = new QMenu(this); popupSaveSqlFileMenu->addAction(ui->actionSqlSaveFile); popupSaveSqlFileMenu->addAction(ui->actionSqlSaveFileAs); @@ -180,15 +294,22 @@ ui->actionSqlResultsSave->setMenu(popupSaveSqlResultsMenu); qobject_cast(ui->toolbarSql->widgetForAction(ui->actionSqlResultsSave))->setPopupMode(QToolButton::InstantPopup); + popupSaveFilterAsMenu = new QMenu(this); + popupSaveFilterAsMenu->addAction(ui->actionFilteredTableExportCsv); + popupSaveFilterAsMenu->addAction(ui->actionFilterSaveAsView); + ui->actionSaveFilterAsPopup->setMenu(popupSaveFilterAsMenu); + qobject_cast(ui->browseToolbar->widgetForAction(ui->actionSaveFilterAsPopup))->setPopupMode(QToolButton::InstantPopup); + popupBrowseDataHeaderMenu = new QMenu(this); popupBrowseDataHeaderMenu->addAction(ui->actionShowRowidColumn); + popupBrowseDataHeaderMenu->addAction(ui->actionHideColumns); + popupBrowseDataHeaderMenu->addAction(ui->actionShowAllColumns); + popupBrowseDataHeaderMenu->addSeparator(); popupBrowseDataHeaderMenu->addAction(ui->actionUnlockViewEditing); popupBrowseDataHeaderMenu->addAction(ui->actionBrowseTableEditDisplayFormat); - popupBrowseDataHeaderMenu->addAction(ui->actionSetTableEncoding); popupBrowseDataHeaderMenu->addSeparator(); + popupBrowseDataHeaderMenu->addAction(ui->actionSetTableEncoding); popupBrowseDataHeaderMenu->addAction(ui->actionSetAllTablesEncoding); - popupBrowseDataHeaderMenu->addAction(ui->actionHideColumns); - popupBrowseDataHeaderMenu->addAction(ui->actionShowAllColumns); QShortcut* dittoRecordShortcut = new QShortcut(QKeySequence("Ctrl+\""), this); connect(dittoRecordShortcut, &QShortcut::activated, [this]() { @@ -203,9 +324,7 @@ // Add menu item for plot dock ui->viewMenu->insertAction(ui->viewDBToolbarAction, ui->dockPlot->toggleViewAction()); - QList plotkeyseqlist; - plotkeyseqlist << QKeySequence(tr("Ctrl+P")) << QKeySequence(tr("Ctrl+D")); - ui->viewMenu->actions().at(1)->setShortcuts(plotkeyseqlist); + ui->viewMenu->actions().at(1)->setShortcut(QKeySequence(tr("Ctrl+D"))); ui->viewMenu->actions().at(1)->setIcon(QIcon(":/icons/log_dock")); // Add menu item for schema dock @@ -230,12 +349,65 @@ // Add separator between docks and toolbars ui->viewMenu->insertSeparator(ui->viewDBToolbarAction); + // Connect the tabCloseRequested to the actual closeTab function. + // This must be done before the connections for checking the actions in the View menu so + // they are updated accordingly. + connect(ui->mainTab, &QTabWidget::tabCloseRequested, this, &MainWindow::closeTab); + + // Add entries for toggling the visibility of main tabs + for (QWidget* widget : {ui->structure, ui->browser, ui->pragmas, ui->query}) { + QAction* action = ui->viewMenu->addAction(QIcon(":/icons/tab"), widget->accessibleName()); + action->setCheckable(true); + action->setChecked(ui->mainTab->indexOf(widget) != -1); + connect(action, &QAction::toggled, [=](bool show) { toggleTabVisible(widget, show); }); + // Connect tabCloseRequested for setting checked the appropiate menu entry. + // Note these are called after the actual tab is closed only because they are connected + // after connecting closeTab. + connect(ui->mainTab, &QTabWidget::tabCloseRequested, [=](int /*index*/) { + action->setChecked(ui->mainTab->indexOf(widget) != -1); + }); + } + + ui->viewMenu->addSeparator(); + QAction* resetLayoutAction = ui->viewMenu->addAction(tr("Reset Window Layout")); + resetLayoutAction->setShortcut(QKeySequence(tr("Alt+0"))); + connect(resetLayoutAction, &QAction::triggered, [=]() { + restoreState(defaultWindowState); + restoreOpenTabs(defaultOpenTabs); + }); + + // Set Alt+[1-4] shortcuts for opening the corresponding tab in that position. + // Note that it is safe to call setCurrentIndex with a tab that is currently closed, + // since setCurrentIndex does nothing in that case. + QShortcut* setTab1Shortcut = new QShortcut(QKeySequence("Alt+1"), this); + connect(setTab1Shortcut, &QShortcut::activated, [this]() { ui->mainTab->setCurrentIndex(0); }); + QShortcut* setTab2Shortcut = new QShortcut(QKeySequence("Alt+2"), this); + connect(setTab2Shortcut, &QShortcut::activated, [this]() { ui->mainTab->setCurrentIndex(1); }); + QShortcut* setTab3Shortcut = new QShortcut(QKeySequence("Alt+3"), this); + connect(setTab3Shortcut, &QShortcut::activated, [this]() { ui->mainTab->setCurrentIndex(2); }); + QShortcut* setTab4Shortcut = new QShortcut(QKeySequence("Alt+4"), this); + connect(setTab4Shortcut, &QShortcut::activated, [this]() { ui->mainTab->setCurrentIndex(3); }); + // If we're not compiling in SQLCipher, hide its FAQ link in the help menu #ifndef ENABLE_SQLCIPHER ui->actionSqlCipherFaq->setVisible(false); #endif // Set statusbar fields + statusBusyLabel = new QLabel(ui->statusbar); + statusBusyLabel->setEnabled(false); + statusBusyLabel->setVisible(false); + statusBusyLabel->setToolTip(tr("The database is currenctly busy.")); + ui->statusbar->addPermanentWidget(statusBusyLabel); + + statusStopButton = new QToolButton(ui->statusbar); + statusStopButton->setVisible(false); + statusStopButton->setIcon(QIcon(":icons/cancel")); + statusStopButton->setToolTip(tr("Click here to interrupt the currently running query.")); + statusStopButton->setMaximumSize(ui->statusbar->geometry().height() - 6, ui->statusbar->geometry().height() - 6); + statusStopButton->setAutoRaise(true); + ui->statusbar->addPermanentWidget(statusStopButton); + statusEncryptionLabel = new QLabel(ui->statusbar); statusEncryptionLabel->setEnabled(false); statusEncryptionLabel->setVisible(false); @@ -256,8 +428,24 @@ statusEncodingLabel->setToolTip(tr("Database encoding")); ui->statusbar->addPermanentWidget(statusEncodingLabel); + // When changing the text of the toolbar actions, also automatically change their icon text and their tooltip text + connect(ui->editModifyObjectAction, &QAction::changed, [=]() { + ui->editModifyObjectAction->setIconText(ui->editModifyObjectAction->text()); + ui->editModifyObjectAction->setToolTip(ui->editModifyObjectAction->text()); + }); + connect(ui->editDeleteObjectAction, &QAction::changed, [=]() { + ui->editDeleteObjectAction->setIconText(ui->editDeleteObjectAction->text()); + ui->editDeleteObjectAction->setToolTip(ui->editDeleteObjectAction->text()); + }); + + // When clicking the interrupt query button in the status bar, ask SQLite to interrupt the current query + connect(statusStopButton, &QToolButton::clicked, [this]() { + db.interruptQuery(); + }); + // Connect some more signals and slots connect(ui->dataTable->filterHeader(), SIGNAL(sectionClicked(int)), this, SLOT(browseTableHeaderClicked(int))); + connect(ui->dataTable->filterHeader(), &QHeaderView::sectionDoubleClicked, ui->dataTable, &QTableView::selectColumn); connect(ui->dataTable->verticalScrollBar(), SIGNAL(valueChanged(int)), this, SLOT(setRecordsetLabel())); connect(ui->dataTable->horizontalHeader(), SIGNAL(sectionResized(int,int,int)), this, SLOT(updateBrowseDataColumnWidth(int,int,int))); connect(editDock, SIGNAL(recordTextUpdated(QPersistentModelIndex, QByteArray, bool)), this, SLOT(updateRecordText(QPersistentModelIndex, QByteArray, bool))); @@ -269,6 +457,23 @@ connect(m_remoteDb, SIGNAL(openFile(QString)), this, SLOT(fileOpen(QString))); connect(m_remoteDb, &RemoteDatabase::gotCurrentVersion, this, &MainWindow::checkNewVersion); connect(m_browseTableModel, &SqliteTableModel::finishedFetch, this, &MainWindow::setRecordsetLabel); + connect(ui->dataTable, &ExtendedTableWidget::selectedRowsToBeDeleted, this, &MainWindow::deleteRecord); + connect(ui->actionDropQualifiedCheck, &QAction::toggled, dbStructureModel, &DbStructureModel::setDropQualifiedNames); + connect(ui->actionEnquoteNamesCheck, &QAction::toggled, dbStructureModel, &DbStructureModel::setDropEnquotedNames); + connect(&db, &DBBrowserDB::databaseInUseChanged, this, &MainWindow::updateDatabaseBusyStatus); + + ui->actionDropQualifiedCheck->setChecked(Settings::getValue("SchemaDock", "dropQualifiedNames").toBool()); + ui->actionEnquoteNamesCheck->setChecked(Settings::getValue("SchemaDock", "dropEnquotedNames").toBool()); + + connect(m_browseTableModel, &SqliteTableModel::finishedFetch, [this](){ + auto & settings = browseTableSettings[currentlyBrowsedTableName()]; + plotDock->updatePlot(m_browseTableModel, &settings, true, false); + }); + + connect(ui->actionSqlStop, &QAction::triggered, [this]() { + if(execute_sql_worker && execute_sql_worker->isRunning()) + execute_sql_worker->stop(); + }); // Lambda function for keyboard shortcuts for selecting next/previous table in Browse Data tab connect(ui->dataTable, &ExtendedTableWidget::switchTable, [this](bool next) { @@ -286,22 +491,42 @@ populateTable(); }); + // Connect tool pragmas + connect(ui->actionIntegrityCheck, &QAction::triggered, [this]() { + runSqlNewTab("PRAGMA integrity_check;", ui->actionIntegrityCheck->text()); + }); + connect(ui->actionQuickCheck, &QAction::triggered, [this]() { + runSqlNewTab("PRAGMA quick_check;", ui->actionQuickCheck->text()); + }); + connect(ui->actionForeignKeyCheck, &QAction::triggered, [this]() { + runSqlNewTab("PRAGMA foreign_key_check;", ui->actionForeignKeyCheck->text()); + }); + connect(ui->actionOptimize, &QAction::triggered, [this]() { + runSqlNewTab("PRAGMA optimize;", ui->actionOptimize->text()); + }); + // Set other window settings setAcceptDrops(true); setWindowTitle(QApplication::applicationName()); + // Add the documentation of shortcuts, which aren't otherwise visible in the user interface, to some buttons. + + addShortcutsTooltip(ui->actionDbPrint); + + addShortcutsTooltip(ui->actionRefresh, {shortcutBrowseRefreshCtrlR->key()}); + addShortcutsTooltip(ui->actionPrintTable); + + addShortcutsTooltip(ui->actionSqlOpenTab); + addShortcutsTooltip(ui->actionSqlPrint); + addShortcutsTooltip(ui->actionExecuteSql, {shortcutBrowseRefreshF5->key(), shortcutBrowseRefreshCtrlR->key()}); + addShortcutsTooltip(ui->actionSqlExecuteLine); + addShortcutsTooltip(ui->actionSqlFind); + addShortcutsTooltip(ui->actionSqlFindReplace); + addShortcutsTooltip(ui->actionSqlToggleComment); + // Load all settings reloadSettings(); -#ifdef CHECKNEWVERSION - // Check for a new version if automatic update check aren't disabled in the settings dialog - if(Settings::getValue("checkversion", "enabled").toBool()) - { - m_remoteDb->fetch("https://raw.githubusercontent.com/sqlitebrowser/sqlitebrowser/master/currentrelease", - RemoteDatabase::RequestTypeNewVersionCheck); - } -#endif - #ifndef ENABLE_SQLCIPHER // Only show encryption menu action when SQLCipher support is enabled ui->actionEncryption->setVisible(false); @@ -326,6 +551,7 @@ if (!QFile::exists(wFile)) { wFile = FileDialog::getOpenFileName( + OpenDatabaseFile, this, tr("Choose a database file") #ifndef Q_OS_MAC // Filters on OS X are buggy @@ -359,13 +585,13 @@ statusEncryptionLabel->setVisible(db.encrypted()); statusReadOnlyLabel->setVisible(db.readOnly()); setCurrentFile(wFile); + currentProjectFilename.clear(); if(!dontAddToRecentFiles) addToRecentFilesMenu(wFile); openSqlTab(true); - loadExtensionsFromSettings(); - if(ui->mainTab->currentIndex() == BrowseTab) + if(ui->mainTab->currentWidget() == ui->browser) populateTable(); - else if(ui->mainTab->currentIndex() == PragmaTab) + else if(ui->mainTab->currentWidget() == ui->pragmas) loadPragmas(); retval = true; } else { @@ -380,9 +606,11 @@ void MainWindow::fileNew() { - QString fileName = FileDialog::getSaveFileName(this, - tr("Choose a filename to save under"), - FileDialog::getSqlDatabaseFileFilter()); + QString fileName = FileDialog::getSaveFileName( + CreateDatabaseFile, + this, + tr("Choose a filename to save under"), + FileDialog::getSqlDatabaseFileFilter()); if(!fileName.isEmpty()) { if(QFile::exists(fileName)) @@ -393,13 +621,24 @@ statusEncodingLabel->setText(db.getPragma("encoding")); statusEncryptionLabel->setVisible(false); statusReadOnlyLabel->setVisible(false); - loadExtensionsFromSettings(); populateTable(); openSqlTab(true); createTable(); } } +void MainWindow::fileNewInMemoryDatabase() +{ + db.create(":memory:"); + setCurrentFile(tr("In-Memory database")); + statusEncodingLabel->setText(db.getPragma("encoding")); + statusEncryptionLabel->setVisible(false); + statusReadOnlyLabel->setVisible(false); + populateTable(); + openSqlTab(true); + createTable(); +} + void MainWindow::populateStructure(const QString& old_table) { // Refresh the structure tab @@ -423,27 +662,35 @@ return; // Update table and column names for syntax highlighting - SqlUiLexer::TablesAndColumnsMap tablesToColumnsMap; + SqlUiLexer::QualifiedTablesMap qualifiedTablesMap; for(auto it=db.schemata.constBegin();it!=db.schemata.constEnd();++it) { + SqlUiLexer::TablesAndColumnsMap tablesToColumnsMap; objectMap tab = db.getBrowsableObjects(it.key()); - for(auto it=tab.constBegin();it!=tab.constEnd();++it) + for(auto jt : tab) { - QString objectname = (*it)->name(); + QString objectname = jt->name(); - sqlb::FieldInfoList fi = (*it)->fieldInformation(); + sqlb::FieldInfoList fi = jt->fieldInformation(); for(const sqlb::FieldInfo& f : fi) tablesToColumnsMap[objectname].append(f.name); } + qualifiedTablesMap[it.key()] = tablesToColumnsMap; } - SqlTextEdit::sqlLexer->setTableNames(tablesToColumnsMap); + SqlTextEdit::sqlLexer->setTableNames(qualifiedTablesMap); ui->editLogApplication->reloadKeywords(); ui->editLogUser->reloadKeywords(); for(int i=0;itabSqlAreas->count();i++) qobject_cast(ui->tabSqlAreas->widget(i))->getEditor()->reloadKeywords(); // Resize SQL column to fit contents - ui->dbTreeWidget->resizeColumnToContents(3); + ui->dbTreeWidget->resizeColumnToContents(DbStructureModel::ColumnSQL); + ui->treeSchemaDock->resizeColumnToContents(DbStructureModel::ColumnSQL); + // Resize also the Name column in the Dock since it has usually + // short content and there is little space there. + ui->treeSchemaDock->resizeColumnToContents(DbStructureModel::ColumnName); + + } void MainWindow::clearTableBrowser() @@ -459,7 +706,7 @@ void MainWindow::populateTable() { // Early exit if the Browse Data tab isn't visible as there is no need to update it in this case - if(ui->mainTab->currentIndex() != BrowseTab) + if(ui->mainTab->currentWidget() != ui->browser) return; // Remove the model-view link if the table name is empty in order to remove any data from the view @@ -482,22 +729,10 @@ if(reconnectSelectionSignals) { connect(ui->dataTable->selectionModel(), SIGNAL(currentChanged(QModelIndex,QModelIndex)), this, SLOT(dataTableSelectionChanged(QModelIndex))); - - // Lambda function for updating the delete record button to reflect number of selected records connect(ui->dataTable->selectionModel(), &QItemSelectionModel::selectionChanged, [this](const QItemSelection&, const QItemSelection&) { - // NOTE: We're assuming here that the selection is always contiguous, i.e. that there are never two selected rows with a non-selected - // row in between. - int rows = 0; - if(ui->dataTable->selectionModel()->selectedIndexes().count()) - rows = ui->dataTable->selectionModel()->selectedIndexes().last().row() - ui->dataTable->selectionModel()->selectedIndexes().first().row() + 1; - - if(rows > 1) - ui->buttonDeleteRecord->setText(tr("Delete records")); - else - ui->buttonDeleteRecord->setText(tr("Delete record")); + updateInsertDeleteRecordButton(); }); } - // Search stored table settings for this table bool storedDataFound = browseTableSettings.contains(tablename); @@ -507,7 +742,7 @@ // No stored settings found. // Set table name and apply default display format settings - m_browseTableModel->setTable(tablename, 0, Qt::AscendingOrder); + m_browseTableModel->setQuery(sqlb::Query(tablename)); // There aren't any information stored for this table yet, so use some default values @@ -530,72 +765,68 @@ // Encoding m_browseTableModel->setEncoding(defaultBrowseTableEncoding); + setRecordsetLabel(); + // Plot attachPlot(ui->dataTable, m_browseTableModel, &browseTableSettings[tablename]); // The filters can be left empty as they are } else { - // Stored settings found. Retrieve them. + // Stored settings found. Retrieve them and assemble a query from them. BrowseDataTableSettings storedData = browseTableSettings[tablename]; + sqlb::Query query(tablename); + + // Sorting + int sortOrderIndex; + Qt::SortOrder sortOrderMode; + fromSortOrderVector(storedData.query.orderBy(), sortOrderIndex, sortOrderMode); + query.orderBy().emplace_back(sortOrderIndex, sortOrderMode == Qt::AscendingOrder ? sqlb::Ascending : sqlb::Descending); - // Load display formats and set them along with the table name + // Filters + for(auto it=storedData.filterValues.constBegin();it!=storedData.filterValues.constEnd();++it) + query.where().insert({it.key(), CondFormat::filterToSqlCondition(it.value(), m_browseTableModel->encoding()).toStdString()}); + + // Display formats QVector v; bool only_defaults = true; - const sqlb::FieldInfoList& tablefields = db.getObjectByName(tablename)->fieldInformation(); - for(int i=0; ifieldInformation(); + for(size_t i=0; isetTable(tablename, storedData.sortOrderIndex, storedData.sortOrderMode); - else - m_browseTableModel->setTable(tablename, storedData.sortOrderIndex, storedData.sortOrderMode, v); + query.selectedColumns().clear(); - // There is information stored for this table, so extract it and apply it - - // Show rowid column. Needs to be done before the column widths setting because of the workaround in there and before the filter setting - // because of the filter row generation. - showRowidColumn(storedData.showRowid); - - // Enable editing in general and (un)lock view editing depending on the settings - unlockViewEditing(!storedData.unlockViewPk.isEmpty(), storedData.unlockViewPk); - - // Column hidden status - on_actionShowAllColumns_triggered(); - for(auto hiddenIt=storedData.hiddenColumns.constBegin();hiddenIt!=storedData.hiddenColumns.constEnd();++hiddenIt) - hideColumns(hiddenIt.key(), hiddenIt.value()); - - // Column widths - for(auto widthIt=storedData.columnWidths.constBegin();widthIt!=storedData.columnWidths.constEnd();++widthIt) - ui->dataTable->setColumnWidth(widthIt.key(), widthIt.value()); + // Unlock view editing + query.setRowIdColumn(storedData.unlockViewPk.toStdString()); - // Sorting - ui->dataTable->filterHeader()->setSortIndicator(storedData.sortOrderIndex, storedData.sortOrderMode); + // Apply query + m_browseTableModel->setQuery(query); - // Filters - FilterTableHeader* filterHeader = qobject_cast(ui->dataTable->horizontalHeader()); - for(auto filterIt=storedData.filterValues.constBegin();filterIt!=storedData.filterValues.constEnd();++filterIt) - filterHeader->setFilter(filterIt.key(), filterIt.value()); + // There is information stored for this table, so extract it and apply it + applyBrowseTableSettings(storedData); - // Encoding - m_browseTableModel->setEncoding(storedData.encoding); + setRecordsetLabel(); // Plot attachPlot(ui->dataTable, m_browseTableModel, &browseTableSettings[tablename], false); } // Show/hide menu options depending on whether this is a table or a view - if(db.getObjectByName(currentlyBrowsedTableName())->type() == sqlb::Object::Table) + if(db.getObjectByName(currentlyBrowsedTableName()) && db.getObjectByName(currentlyBrowsedTableName())->type() == sqlb::Object::Table) { // Table - sqlb::TablePtr table = db.getObjectByName(currentlyBrowsedTableName()).dynamicCast(); + sqlb::TablePtr table = db.getObjectByName(currentlyBrowsedTableName()); ui->actionUnlockViewEditing->setVisible(false); ui->actionShowRowidColumn->setVisible(!table->isWithoutRowidTable()); } else { @@ -604,11 +835,74 @@ ui->actionShowRowidColumn->setVisible(false); } + updateInsertDeleteRecordButton(); + QApplication::restoreOverrideCursor(); } +void MainWindow::applyBrowseTableSettings(BrowseDataTableSettings storedData, bool skipFilters) +{ + // We don't want to pass storedData by reference because the functions below would change the referenced data in their original + // place, thus modifiying the data this function can use. To have a static description of what the view should look like we want + // a copy here. + + // Show rowid column. Needs to be done before the column widths setting because of the workaround in there and before the filter setting + // because of the filter row generation. + showRowidColumn(storedData.showRowid, skipFilters); + + // Enable editing in general and (un)lock view editing depending on the settings + unlockViewEditing(!storedData.unlockViewPk.isEmpty(), storedData.unlockViewPk); + + // Column hidden status + on_actionShowAllColumns_triggered(); + for(auto hiddenIt=storedData.hiddenColumns.constBegin();hiddenIt!=storedData.hiddenColumns.constEnd();++hiddenIt) + hideColumns(hiddenIt.key(), hiddenIt.value()); + + // Column widths + for(auto widthIt=storedData.columnWidths.constBegin();widthIt!=storedData.columnWidths.constEnd();++widthIt) + ui->dataTable->setColumnWidth(widthIt.key(), widthIt.value()); + + // Sorting + int sortOrderIndex; + Qt::SortOrder sortOrderMode; + fromSortOrderVector(storedData.query.orderBy(), sortOrderIndex, sortOrderMode); + ui->dataTable->filterHeader()->setSortIndicator(sortOrderIndex, sortOrderMode); + + // Filters + if(!skipFilters) + { + // Set filters blocking signals, since the filter is already applied to the browse table model + FilterTableHeader* filterHeader = qobject_cast(ui->dataTable->horizontalHeader()); + bool oldState = filterHeader->blockSignals(true); + for(auto filterIt=storedData.filterValues.constBegin();filterIt!=storedData.filterValues.constEnd();++filterIt) + filterHeader->setFilter(filterIt.key(), filterIt.value()); + + // Conditional formats + for(auto formatIt=storedData.condFormats.constBegin(); formatIt!=storedData.condFormats.constEnd(); ++formatIt) + m_browseTableModel->setCondFormats(formatIt.key(), formatIt.value()); + + filterHeader->blockSignals(oldState); + } + + // Encoding + m_browseTableModel->setEncoding(storedData.encoding); +} + bool MainWindow::fileClose() { + // Stop any running SQL statements before closing the database + if(execute_sql_worker && execute_sql_worker->isRunning()) + { + if(QMessageBox::warning(this, qApp->applicationName(), + tr("You are still executing SQL statements. When closing the database now the execution will be stopped. maybe " + "leaving the database in an incosistent state. Are you sure you want to close the database?"), + QMessageBox::Yes, QMessageBox::Cancel | QMessageBox::Default | QMessageBox::Escape) == QMessageBox::Cancel) + return false; + + execute_sql_worker->stop(); + execute_sql_worker->wait(); + } + // Close the database but stop the closing process here if the user pressed the cancel button in there if(!db.close()) return false; @@ -645,28 +939,54 @@ void MainWindow::closeEvent( QCloseEvent* event ) { - if(db.close()) + if(closeFiles()) { Settings::setValue("MainWindow", "geometry", saveGeometry()); Settings::setValue("MainWindow", "windowState", saveState()); + Settings::setValue("MainWindow", "openTabs", saveOpenTabs()); + Settings::setValue("SQLLogDock", "Log", ui->comboLogSubmittedBy->currentText()); + Settings::setValue("SchemaDock", "dropQualifiedNames", ui->actionDropQualifiedCheck->isChecked()); + Settings::setValue("SchemaDock", "dropEnquotedNames", ui->actionEnquoteNamesCheck->isChecked()); + QMainWindow::closeEvent(event); } else { event->ignore(); } } +bool MainWindow::closeFiles() +{ + bool ignoreUnattachedBuffers = false; + // Ask for saving all modified open SQL files in their files and all the unattached tabs in a project file. + for(int i=0; itabSqlAreas->count(); i++) + // Ask for saving and comply with cancel answer. + if(!askSaveSqlTab(i, ignoreUnattachedBuffers)) + return false; + return db.close(); +} + void MainWindow::addRecord() { int row = m_browseTableModel->rowCount(); + if(m_browseTableModel->insertRow(row)) { selectTableLine(row); } else { - QMessageBox::warning(this, QApplication::applicationName(), tr("Error adding record:\n") + db.lastError()); + // Error inserting empty row. + // User has to provide values acomplishing the constraints. Open Add Record Dialog. + insertValues(); } } +void MainWindow::insertValues() +{ + AddRecordDialog dialog(db, currentlyBrowsedTableName(), this); + if (dialog.exec()) + populateTable(); +} + void MainWindow::deleteRecord() { if(ui->dataTable->selectionModel()->hasSelection()) @@ -688,8 +1008,8 @@ } } - if(old_row > m_browseTableModel->totalRowCount()) - old_row = m_browseTableModel->totalRowCount(); + if(old_row > m_browseTableModel->rowCount()) + old_row = m_browseTableModel->rowCount(); selectTableLine(old_row); } else { QMessageBox::information( this, QApplication::applicationName(), tr("Please select a record first")); @@ -728,8 +1048,8 @@ { int curRow = ui->dataTable->currentIndex().row(); curRow += ui->dataTable->numVisibleRows() - 1; - if(curRow >= m_browseTableModel->totalRowCount()) - curRow = m_browseTableModel->totalRowCount() - 1; + if(curRow >= m_browseTableModel->rowCount()) + curRow = m_browseTableModel->rowCount() - 1; selectTableLine(curRow); } @@ -740,7 +1060,7 @@ void MainWindow::navigateEnd() { - selectTableLine(m_browseTableModel->totalRowCount()-1); + selectTableLine(m_browseTableModel->rowCount()-1); } @@ -749,8 +1069,8 @@ int row = ui->editGoto->text().toInt(); if(row <= 0) row = 1; - if(row > m_browseTableModel->totalRowCount()) - row = m_browseTableModel->totalRowCount(); + if(row > m_browseTableModel->rowCount()) + row = m_browseTableModel->rowCount(); selectTableLine(row - 1); ui->editGoto->setText(QString::number(row)); @@ -760,7 +1080,7 @@ { // Get all the numbers, i.e. the number of the first row and the last row as well as the total number of rows int from = ui->dataTable->verticalHeader()->visualIndexAt(0) + 1; - int total = m_browseTableModel->totalRowCount(); + int total = m_browseTableModel->rowCount(); int to = ui->dataTable->verticalHeader()->visualIndexAt(ui->dataTable->height()) - 1; if (to == -2) to = total; @@ -768,33 +1088,51 @@ // Update the validator of the goto row field gotoValidator->setRange(0, total); + // When there is no query for this table (i.e. no table is selected), there is no row count query either which in turn means + // that the row count query will never finish. And because of this the row count will be forever unknown. To avoid always showing + // a misleading "determining row count" text in the UI we set the row count status to complete here for empty queries. + auto row_count_available = m_browseTableModel->rowCountAvailable(); + if(m_browseTableModel->query().isEmpty()) + row_count_available = SqliteTableModel::RowCount::Complete; + // Update the label showing the current position - ui->labelRecordset->setText(tr("%1 - %2 of %3").arg(from).arg(to).arg(total)); + QString txt; + switch(row_count_available) + { + case SqliteTableModel::RowCount::Unknown: + txt = tr("determining row count..."); + break; + case SqliteTableModel::RowCount::Partial: + txt = tr("%1 - %2 of >= %3").arg(from).arg(to).arg(total); + break; + case SqliteTableModel::RowCount::Complete: + default: + txt = tr("%1 - %2 of %3").arg(from).arg(to).arg(total); + break; + } + ui->labelRecordset->setText(txt); + + enableEditing(m_browseTableModel->rowCountAvailable() != SqliteTableModel::RowCount::Unknown); } void MainWindow::refresh() { // What the Refresh function does depends on the currently active tab. This way the keyboard shortcuts (F5 and Ctrl+R) // always perform some meaningful task; they just happen to be context dependent in the function they trigger. - switch(ui->mainTab->currentIndex()) - { - case StructureTab: + QWidget* currentTab = ui->mainTab->currentWidget(); + if (currentTab == ui->structure) { // Refresh the schema db.updateSchema(); - break; - case BrowseTab: + } else if (currentTab == ui->browser) { // Refresh the schema and reload the current table db.updateSchema(); populateTable(); - break; - case PragmaTab: + } else if (currentTab == ui->pragmas) { // Reload pragma values loadPragmas(); - break; - case ExecuteTab: + } else if (currentTab == ui->query) { // (Re-)Run the current SQL query executeQuery(); - break; } } @@ -837,16 +1175,36 @@ ui->dbTreeWidget->model()->data(ui->dbTreeWidget->currentIndex().sibling(ui->dbTreeWidget->currentIndex().row(), DbStructureModel::ColumnName), Qt::EditRole).toString()); QString type = ui->dbTreeWidget->model()->data(ui->dbTreeWidget->currentIndex().sibling(ui->dbTreeWidget->currentIndex().row(), DbStructureModel::ColumnObjectType), Qt::EditRole).toString(); + // Due to different grammar in languages (e.g. gender or declension), each message must be given separately to translation. + QString message; + if (type == "table") + message = tr("Are you sure you want to delete the table '%1'?\nAll data associated with the table will be lost."); + else if (type == "view") + message = tr("Are you sure you want to delete the view '%1'?"); + else if (type == "trigger") + message = tr("Are you sure you want to delete the trigger '%1'?"); + else if (type == "index") + message = tr("Are you sure you want to delete the index '%1'?"); + // Ask user if he really wants to delete that table - if(QMessageBox::warning(this, QApplication::applicationName(), tr("Are you sure you want to delete the %1 '%2'?\nAll data associated with the %1 will be lost.").arg(type).arg(name.name()), + if(QMessageBox::warning(this, QApplication::applicationName(), message.arg(name.name()), QMessageBox::Yes | QMessageBox::No, QMessageBox::No) == QMessageBox::Yes) { // Delete the table QString statement = QString("DROP %1 %2;").arg(type.toUpper()).arg(name.toString()); if(!db.executeSQL(statement)) { - QString error = tr("Error: could not delete the %1. Message from database engine:\n%2").arg(type).arg(db.lastError()); - QMessageBox::warning(this, QApplication::applicationName(), error); + if (type == "table") + message = tr("Error: could not delete the table."); + else if (type == "view") + message = tr("Error: could not delete the view."); + else if (type == "trigger") + message = tr("Error: could not delete the trigger."); + else if (type == "index") + message = tr("Error: could not delete the index."); + + QString error = tr("Message from database engine:\n%1").arg(db.lastError()); + QMessageBox::warning(this, QApplication::applicationName(), message + " " + error); } else { populateTable(); changeTreeSelection(); @@ -866,8 +1224,46 @@ if(type == "table") { + // For a safe and possibly complex table modification we must follow the steps documented in + // https://www.sqlite.org/lang_altertable.html + // Paragraph (first procedure): Making Other Kinds Of Table Schema Changes + + QString foreign_keys = db.getPragma("foreign_keys"); + if (foreign_keys == "1") { + if(db.getDirty() && QMessageBox::question(this, + QApplication::applicationName(), + tr("Editing the table requires to save all pending changes now.\nAre you sure you want to save the database?"), + QMessageBox::Save | QMessageBox::Default, + QMessageBox::Cancel | QMessageBox::Escape) != QMessageBox::Save) + return; + // Commit all changes so the foreign_keys can be effective. + fileSave(); + db.setPragma("foreign_keys", "0"); + } + EditTableDialog dialog(db, name, false, this); - if(dialog.exec()) { + bool ok = dialog.exec(); + + // If foreign_keys were enabled, we must commit or rollback the transaction so the foreign_keys pragma can be restored. + if (foreign_keys == "1") { + if (!db.querySingleValueFromDb(QString("PRAGMA %1.foreign_key_check").arg(sqlb::escapeIdentifier(name.schema()))).isNull()) { + // Raise warning for accepted modification. When rejected, warn user also since we know now that the table has problems, + // but it wasn't our fault. + if (ok) + QMessageBox::warning(this, QApplication::applicationName(), + tr("Error checking foreign keys after table modification. The changes will be reverted.")); + else + QMessageBox::warning(this, QApplication::applicationName(), + tr("This table did not pass a foreign-key check.
" + "You should run 'Tools | Foreign-Key Check' and fix the reported issues.")); + db.revertAll(); + } else { + // Commit all changes so the foreign_keys can be effective. + fileSave(); + } + db.setPragma("foreign_keys", foreign_keys); + } + if(ok) { ui->dataTable->filterHeader()->clearFilters(); populateTable(); } @@ -949,33 +1345,11 @@ } } -MainWindow::StatementType MainWindow::getQueryType(const QString& query) const -{ - // Helper function for getting the type of a given query - - if(query.startsWith("SELECT", Qt::CaseInsensitive)) return SelectStatement; - if(query.startsWith("ALTER", Qt::CaseInsensitive)) return AlterStatement; - if(query.startsWith("DROP", Qt::CaseInsensitive)) return DropStatement; - if(query.startsWith("ROLLBACK", Qt::CaseInsensitive)) return RollbackStatement; - if(query.startsWith("PRAGMA", Qt::CaseInsensitive)) return PragmaStatement; - if(query.startsWith("VACUUM", Qt::CaseInsensitive)) return VacuumStatement; - if(query.startsWith("INSERT", Qt::CaseInsensitive)) return InsertStatement; - if(query.startsWith("UPDATE", Qt::CaseInsensitive)) return UpdateStatement; - if(query.startsWith("DELETE", Qt::CaseInsensitive)) return DeleteStatement; - if(query.startsWith("CREATE", Qt::CaseInsensitive)) return CreateStatement; - if(query.startsWith("ATTACH", Qt::CaseInsensitive)) return AttachStatement; - if(query.startsWith("DETACH", Qt::CaseInsensitive)) return DetachStatement; - - return OtherStatement; -} - /* * I'm still not happy how the results are represented to the user * right now you only see the result of the last executed statement. * A better experience would be tabs on the bottom with query results * for all the executed statements. - * Or at least a some way the use could see results/status message - * per executed statement. */ void MainWindow::executeQuery() { @@ -984,237 +1358,230 @@ if(!db.isOpen()) return; - SqlExecutionArea* sqlWidget = qobject_cast(ui->tabSqlAreas->currentWidget()); - - // Get SQL code to execute. This depends on the button that's been pressed - QString query; - int execution_start_line = 0; - int execution_start_index = 0; - if(sender()->objectName() == "actionSqlExecuteLine") + // Check if other task is still running and stop it if necessary + if(execute_sql_worker && execute_sql_worker->isRunning()) { - int cursor_line, cursor_index; - SqlTextEdit *editor = sqlWidget->getEditor(); + // Ask the user and do nothing if he/she doesn't want to interrupt the running query + if(QMessageBox::warning(this, qApp->applicationName(), + tr("You are already executing SQL statements. Do you want to stop them in order to execute the current " + "statements instead? Note that this might leave the database in an inconsistent state."), + QMessageBox::Yes, QMessageBox::Cancel | QMessageBox::Default | QMessageBox::Escape) == QMessageBox::Cancel) + return; - editor->getCursorPosition(&cursor_line, &cursor_index); + // Stop the running query + execute_sql_worker->stop(); + execute_sql_worker->wait(); + } - execution_start_line = cursor_line; + // Get current SQL tab and editor + SqlExecutionArea* sqlWidget = qobject_cast(ui->tabSqlAreas->currentWidget()); + SqlTextEdit* editor = sqlWidget->getEditor(); + auto* current_tab = ui->tabSqlAreas->currentWidget(); + const QString tabName = ui->tabSqlAreas->tabText(ui->tabSqlAreas->currentIndex()).remove('&'); - int lineStartCursorPosition = editor->positionFromLineIndex(cursor_line, 0); + // Remove any error indicators + editor->clearErrorIndicators(); - QString entireSQL = editor->text(); - QString firstPartEntireSQL = entireSQL.left(lineStartCursorPosition); - QString secondPartEntireSQL = entireSQL.right(entireSQL.length() - lineStartCursorPosition); + // Determine execution mode: execute all, execute selection or execute current line + enum executionMode + { + All, + Selection, + Line + } mode; + if(sender() && sender()->objectName() == "actionSqlExecuteLine") + mode = Line; + else if(!sqlWidget->getSelectedSql().isEmpty()) + mode = Selection; + else + mode = All; - QString firstPartSQL = firstPartEntireSQL.split(";").last(); - QString lastPartSQL = secondPartEntireSQL.split(";").first(); + // Get SQL code to execute. This depends on the execution mode. + int execute_from_position = 0; // Where we want to start the execution in the query string + int execute_to_position = 0; // Where we roughly want to end the execution in the query string - query = firstPartSQL + lastPartSQL; - } else { - // if a part of the query is selected, we will only execute this part - query = sqlWidget->getSelectedSql(); - int dummy; - if(query.isEmpty()) - query = sqlWidget->getSql(); - else - sqlWidget->getEditor()->getSelection(&execution_start_line, &execution_start_index, &dummy, &dummy); - } + switch(mode) + { + case Selection: + { + // Start and end positions are start and end positions from the selection + int execute_from_line, execute_from_index, execute_to_line, execute_to_index; + editor->getSelection(&execute_from_line, &execute_from_index, &execute_to_line, &execute_to_index); + execute_from_position = editor->positionFromLineIndex(execute_from_line, execute_from_index); + execute_to_position = editor->positionFromLineIndex(execute_to_line, execute_to_index); - SqliteTableModel::removeCommentsFromQuery(query); + db.logSQL(tr("-- EXECUTING SELECTION IN '%1'\n--").arg(tabName), kLogMsg_User); + } break; + case Line: + { + // Start position is the first character of the current line, except for those cases where we're in the middle of a + // statement which started on one the previous line. In that case the start position is actually a bit earlier. For + // the end position we set the last character of the current line. If the statement(s) continue(s) into the next line, + // SQLite will execute it/them anyway and we'll stop afterwards. + int execute_from_line, dummy; + editor->getCursorPosition(&execute_from_line, &dummy); + execute_from_position = editor->positionFromLineIndex(execute_from_line, 0); - if (query.trimmed().isEmpty() || query.trimmed() == ";") - return; + // Need to set the end position here before adjusting the start line + int execute_to_line = execute_from_line; + int execute_to_index = editor->text(execute_to_line).length() - 1; // The -1 compensates for the line break at the end of the line + execute_to_position = editor->positionFromLineIndex(execute_to_line, execute_to_index); - query = query.remove(QRegExp("^\\s*BEGIN TRANSACTION;|COMMIT;\\s*$")).trimmed(); + QByteArray firstPartEntireSQL = sqlWidget->getSql().toUtf8().left(execute_from_position); + if(firstPartEntireSQL.lastIndexOf(';') != -1) + execute_from_position -= firstPartEntireSQL.length() - firstPartEntireSQL.lastIndexOf(';') - 1; - //log the query - db.logSQL(query, kLogMsg_User); - sqlite3_stmt *vm; - QByteArray utf8Query = query.toUtf8(); - const char *tail = utf8Query.data(); - int sql3status = SQLITE_OK; - int tail_length = utf8Query.length(); - QString statusMessage; - bool ok = false; - bool modified = false; - bool wasdirty = db.getDirty(); - bool structure_updated = false; - bool savepoint_created = false; + db.logSQL(tr("-- EXECUTING LINE IN '%1'\n--").arg(tabName), kLogMsg_User); + } break; + case All: + { + // Start position is the first byte, end position the last. + // Note that we use byte positions that might differ from character positions. + execute_to_position = editor->length(); - // Remove any error indicators - sqlWidget->getEditor()->clearErrorIndicators(); + db.logSQL(tr("-- EXECUTING ALL IN '%1'\n--").arg(tabName), kLogMsg_User); + } break; + } - // Accept multi-line queries, by looping until the tail is empty - QElapsedTimer timer; - timer.start(); - while( tail && *tail != 0 && (sql3status == SQLITE_OK || sql3status == SQLITE_DONE)) - { - // What type of query is this? - QString qtail = QString(tail).trimmed(); - StatementType query_type = getQueryType(qtail); - - // Check whether the DB structure is changed by this statement - if(!structure_updated && (query_type == AlterStatement || - query_type == CreateStatement || - query_type == DropStatement || - query_type == RollbackStatement)) - structure_updated = true; - - // Check whether this is trying to set a pragma or to vacuum the database - if((query_type == PragmaStatement && qtail.contains('=')) || query_type == VacuumStatement) - { - // We're trying to set a pragma. If the database has been modified it needs to be committed first. We'll need to ask the - // user about that - if(db.getDirty()) - { - if(QMessageBox::question(this, - QApplication::applicationName(), - tr("Setting PRAGMA values or vacuuming will commit your current transaction.\nAre you sure?"), - QMessageBox::Yes | QMessageBox::Default, - QMessageBox::No | QMessageBox::Escape) == QMessageBox::Yes) - { - // Commit all changes - db.releaseAllSavepoints(); - } else { - // Abort - statusMessage = tr("Execution aborted by user"); - break; - } - } - } else { - // We're not trying to set a pragma or to vacuum the database. In this case make sure a savepoint has been created in order to avoid committing - // all changes to the database immediately. Don't set more than one savepoint. + // Prepare a lambda function for logging the results of a query + auto query_logger = [this, sqlWidget, editor](bool ok, const QString& status_message, int from_position, int to_position) { + int execute_from_line, execute_from_index; + editor->lineIndexFromPosition(from_position, &execute_from_line, &execute_from_index); - if(!savepoint_created) - { - // there is no choice, we have to start a transaction before we create the prepared statement, - // otherwise every executed statement will get committed after the prepared statement gets finalized, - // see http://www.sqlite.org/lang_transaction.html - db.setSavepoint(); - savepoint_created = true; - } + // Special case: if the start position is at the end of a line, then move to the beggining of next line. + // Otherwise for the typical case, the line reference is one less than expected. + // Note that execute_from_index uses character positions and not byte positions, so text().length() must be used. + if (editor->text(execute_from_line).length() == execute_from_index+1) { + execute_from_line++; + execute_from_index = 0; } - // Execute next statement - int tail_length_before = tail_length; - const char* qbegin = tail; - sql3status = sqlite3_prepare_v2(db._db,tail, tail_length, &vm, &tail); - QString queryPart = QString::fromUtf8(qbegin, tail - qbegin); - tail_length -= (tail - qbegin); - int execution_end_index = execution_start_index + tail_length_before - tail_length; - - if (sql3status == SQLITE_OK) - { - sql3status = sqlite3_step(vm); - sqlite3_finalize(vm); - - // Get type - StatementType query_part_type = getQueryType(queryPart.trimmed()); - - // SQLite returns SQLITE_DONE when a valid SELECT statement was executed but returned no results. To run into the branch that updates - // the status message and the table view anyway manipulate the status value here. This is also done for PRAGMA statements as they (sometimes) - // return rows just like SELECT statements, too. - if((query_part_type == SelectStatement || query_part_type == PragmaStatement) && sql3status == SQLITE_DONE) - sql3status = SQLITE_ROW; + // If there was an error highlight the erroneous SQL statement + if(!ok) + { + int end_of_current_statement_line, end_of_current_statement_index; + editor->lineIndexFromPosition(to_position, &end_of_current_statement_line, &end_of_current_statement_index); + editor->setErrorIndicator(execute_from_line, execute_from_index, end_of_current_statement_line, end_of_current_statement_index); - switch(sql3status) - { - case SQLITE_ROW: - { - // If we get here, the SQL statement returns some sort of data. So hand it over to the model for display. Don't set the modified flag - // because statements that display data don't change data as well. + editor->setCursorPosition(execute_from_line, execute_from_index); + } - sqlWidget->getModel()->setQuery(queryPart); + // Log the query and the result message. + // The query takes the last placeholder as it may itself contain the sequence '%' + number. + QString query = editor->text(from_position, to_position); + QString log_message = tr("-- At line %1:\n%3\n-- Result: %2").arg(execute_from_line+1).arg(status_message).arg(query.trimmed()); + db.logSQL(log_message, kLogMsg_User); - // The query takes the last placeholder as it may itself contain the sequence '%' + number - statusMessage = tr("%1 rows returned in %2ms from: %3").arg( - sqlWidget->getModel()->totalRowCount()).arg(timer.elapsed()).arg(queryPart.trimmed()); - ok = true; - ui->actionSqlResultsSave->setEnabled(true); - ui->actionSqlResultsSaveAsView->setEnabled(!db.readOnly()); + // Update the execution area + sqlWidget->finishExecution(log_message, ok); + }; - sql3status = SQLITE_OK; - break; - } - case SQLITE_DONE: - case SQLITE_OK: - { - // If we get here, the SQL statement doesn't return data and just executes. Don't run it again because it has already been executed. - // But do set the modified flag because statements that don't return data, often modify the database. + // Get the statement(s) to execute. When in selection mode crop the query string at exactly the end of the selection to make sure SQLite has + // no chance to execute any further. + QString sql = sqlWidget->getSql(); + if(mode == Selection) + sql = sql.left(execute_to_position); - QString stmtHasChangedDatabase; - if(query_part_type == InsertStatement || query_part_type == UpdateStatement || query_part_type == DeleteStatement) - stmtHasChangedDatabase = tr(", %1 rows affected").arg(sqlite3_changes(db._db)); - - // Attach/Detach statements don't modify the original database - if(query_part_type != StatementType::AttachStatement && query_part_type != StatementType::DetachStatement) - modified = true; + // Prepare the SQL worker to run the query. We set the context of each signal-slot connection to the current SQL execution area. + // This means that if the tab is closed all these signals are automatically disconnected so the lambdas won't be called for a not + // existing execution area. + execute_sql_worker.reset(new RunSql(db, sql, execute_from_position, execute_to_position, true)); - statusMessage = tr("Query executed successfully: %1 (took %2ms%3)").arg(queryPart.trimmed()).arg(timer.elapsed()).arg(stmtHasChangedDatabase); - ok = true; - break; - } - case SQLITE_MISUSE: - continue; - default: - statusMessage = QString::fromUtf8(sqlite3_errmsg(db._db)) + ": " + queryPart; - ok = true; - break; - } - timer.restart(); - } else { - statusMessage = QString::fromUtf8(sqlite3_errmsg(db._db)) + ": " + queryPart; - sqlWidget->getEditor()->setErrorIndicator(execution_start_line, execution_start_index, execution_start_line, execution_end_index); - ok = false; + connect(execute_sql_worker.get(), &RunSql::statementErrored, sqlWidget, [query_logger, this, sqlWidget](const QString& status_message, int from_position, int to_position) { + sqlWidget->getModel()->reset(); + ui->actionSqlResultsSave->setEnabled(false); + ui->actionSqlResultsSaveAsView->setEnabled(false); + attachPlot(sqlWidget->getTableResult(), sqlWidget->getModel()); - } + query_logger(false, status_message, from_position, to_position); + }, Qt::QueuedConnection); + connect(execute_sql_worker.get(), &RunSql::statementExecuted, sqlWidget, [query_logger, this, sqlWidget](const QString& status_message, int from_position, int to_position) { + sqlWidget->getModel()->reset(); + ui->actionSqlResultsSave->setEnabled(false); + ui->actionSqlResultsSaveAsView->setEnabled(false); + attachPlot(sqlWidget->getTableResult(), sqlWidget->getModel()); - execution_start_index = execution_end_index; + query_logger(true, status_message, from_position, to_position); + execute_sql_worker->startNextStatement(); + }, Qt::QueuedConnection); + connect(execute_sql_worker.get(), &RunSql::statementReturnsRows, sqlWidget, [query_logger, this, sqlWidget](const QString& query, int from_position, int to_position, qint64 time_in_ms_so_far) { + auto time_start = std::chrono::high_resolution_clock::now(); + + ui->actionSqlResultsSave->setEnabled(true); + ui->actionSqlResultsSaveAsView->setEnabled(!db.readOnly()); + + auto * model = sqlWidget->getModel(); + model->setQuery(query); + + // Wait until the initial loading of data (= first chunk and row count) has been performed + auto conn = std::make_shared(); + *conn = connect(model, &SqliteTableModel::finishedFetch, [=]() { + // Disconnect this connection right now. This avoids calling this slot multiple times + disconnect(*conn); + + attachPlot(sqlWidget->getTableResult(), sqlWidget->getModel()); + connect(sqlWidget->getTableResult()->selectionModel(), SIGNAL(currentChanged(QModelIndex,QModelIndex)), this, SLOT(dataTableSelectionChanged(QModelIndex))); + connect(sqlWidget->getTableResult(), &QTableView::doubleClicked, this, &MainWindow::doubleClickTable); + + auto time_end = std::chrono::high_resolution_clock::now(); + auto time_in_ms = std::chrono::duration_cast(time_end-time_start); + query_logger(true, tr("%1 rows returned in %2ms").arg(model->rowCount()).arg(time_in_ms.count()+time_in_ms_so_far), from_position, to_position); + execute_sql_worker->startNextStatement(); + }); + }, Qt::QueuedConnection); + connect(execute_sql_worker.get(), &RunSql::confirmSaveBeforePragmaOrVacuum, sqlWidget, [this]() { + if(QMessageBox::question(nullptr, QApplication::applicationName(), + tr("Setting PRAGMA values or vacuuming will commit your current transaction.\nAre you sure?"), + QMessageBox::Yes | QMessageBox::Default, + QMessageBox::No | QMessageBox::Escape) == QMessageBox::No) + execute_sql_worker->stop(); + + }, Qt::BlockingQueuedConnection); + connect(execute_sql_worker.get(), &RunSql::finished, sqlWidget, [this, current_tab, sqlWidget]() { + // We work with a pointer to the current tab here instead of its index because the user might reorder the tabs in the meantime + ui->tabSqlAreas->setTabIcon(ui->tabSqlAreas->indexOf(current_tab), QIcon()); + + // We don't need to check for the current SQL tab here because two concurrently running queries are not allowed + ui->actionSqlExecuteLine->setEnabled(true); + ui->actionExecuteSql->setEnabled(true); + ui->actionSqlStop->setEnabled(false); + sqlWidget->getEditor()->setReadOnly(false); + + // Show Done message + if(sqlWidget->inErrorState()) + sqlWidget->getStatusEdit()->setPlainText(tr("Execution finished with errors.") + "\n\n" + sqlWidget->getStatusEdit()->toPlainText()); + else + sqlWidget->getStatusEdit()->setPlainText(tr("Execution finished without errors.") + "\n\n" + sqlWidget->getStatusEdit()->toPlainText()); + }); - // Revert to save point now if it wasn't needed. We need to do this here because there are some rare cases where the next statement might - // be affected by what is only a temporary and unnecessary savepoint. For example in this case: - // ATTACH 'xxx' AS 'db2' - // SELECT * FROM db2.xy; -- Savepoint created here - // DETACH db2; -- Savepoint makes this statement fail - if(!modified && !wasdirty && savepoint_created) - { - db.revertToSavepoint(); // better rollback, if the logic is not enough we can tune it. - savepoint_created = false; - } + // Add an hourglass icon to the current tab to indicate that there's a running execution in there. + // NOTE It's a bit hack-ish but we don't use this icon just as a signal to the user but also check for it in various places to check whether a + // specific SQL tab is currently running a query or not. + ui->tabSqlAreas->setTabIcon(ui->tabSqlAreas->currentIndex(), QIcon(":icons/hourglass")); - // Process events to keep the UI responsive - qApp->processEvents(); - } - sqlWidget->finishExecution(statusMessage, ok); - attachPlot(sqlWidget->getTableResult(), sqlWidget->getModel()); + // Deactivate the buttons to start a query and activate the button to stop the query + ui->actionSqlExecuteLine->setEnabled(false); + ui->actionExecuteSql->setEnabled(false); + ui->actionSqlStop->setEnabled(true); - connect(sqlWidget->getTableResult(), &ExtendedTableWidget::activated, this, &MainWindow::dataTableSelectionChanged); - connect(sqlWidget->getTableResult(), SIGNAL(doubleClicked(QModelIndex)), this, SLOT(doubleClickTable(QModelIndex))); + // Make the SQL editor widget read-only. We do this because the error indicators would be misplaced if the user changed the SQL text during execution + sqlWidget->getEditor()->setReadOnly(true); - // If the DB structure was changed by some command in this SQL script, update our schema representations - if(structure_updated) - db.updateSchema(); + // Start the execution + execute_sql_worker->start(); } -void MainWindow::mainTabSelected(int tabindex) +void MainWindow::mainTabSelected(int /*tabindex*/) { editDock->setReadOnly(true); - switch (tabindex) + if(ui->mainTab->currentWidget() == ui->browser) { - case StructureTab: - break; - - case BrowseTab: m_currentTabTableModel = m_browseTableModel; populateTable(); - break; - - case PragmaTab: + } else if(ui->mainTab->currentWidget() == ui->pragmas) { loadPragmas(); - break; - - case ExecuteTab: - { + } else if(ui->mainTab->currentWidget() == ui->query) { SqlExecutionArea* sqlWidget = qobject_cast(ui->tabSqlAreas->currentWidget()); if (sqlWidget) { @@ -1222,19 +1589,16 @@ dataTableSelectionChanged(sqlWidget->getTableResult()->currentIndex()); } - break; - } - - default: break; } } void MainWindow::importTableFromCSV() { QStringList wFiles = FileDialog::getOpenFileNames( - this, - tr("Choose text files"), - tr("Text files(*.csv *.txt);;All files(*)")); + OpenCSVFile, + this, + tr("Choose text files"), + tr("Text files(*.csv *.txt);;All files(*)")); QStringList validFiles; for(const auto& file : wFiles) { @@ -1254,7 +1618,7 @@ { // Get the current table name if we are in the Browse Data tab sqlb::ObjectIdentifier current_table; - if(ui->mainTab->currentIndex() == StructureTab) + if(ui->mainTab->currentWidget() == ui->structure) { QString type = ui->dbTreeWidget->model()->data(ui->dbTreeWidget->currentIndex().sibling(ui->dbTreeWidget->currentIndex().row(), DbStructureModel::ColumnObjectType)).toString(); if(type == "table" || type == "view") @@ -1263,7 +1627,7 @@ QString name = ui->dbTreeWidget->model()->data(ui->dbTreeWidget->currentIndex().sibling(ui->dbTreeWidget->currentIndex().row(), DbStructureModel::ColumnName)).toString(); current_table = sqlb::ObjectIdentifier(schema, name); } - } else if(ui->mainTab->currentIndex() == BrowseTab) { + } else if(ui->mainTab->currentWidget() == ui->browser) { current_table = currentlyBrowsedTableName(); } @@ -1276,7 +1640,7 @@ { // Get the current table name if we are in the Browse Data tab sqlb::ObjectIdentifier current_table; - if(ui->mainTab->currentIndex() == StructureTab) + if(ui->mainTab->currentWidget() == ui->structure) { QString type = ui->dbTreeWidget->model()->data(ui->dbTreeWidget->currentIndex().sibling(ui->dbTreeWidget->currentIndex().row(), DbStructureModel::ColumnObjectType)).toString(); if(type == "table" || type == "view") @@ -1285,7 +1649,7 @@ QString name = ui->dbTreeWidget->model()->data(ui->dbTreeWidget->currentIndex().sibling(ui->dbTreeWidget->currentIndex().row(), DbStructureModel::ColumnName)).toString(); current_table = sqlb::ObjectIdentifier(schema, name); } - } else if(ui->mainTab->currentIndex() == BrowseTab) { + } else if(ui->mainTab->currentWidget() == ui->browser) { current_table = currentlyBrowsedTableName(); } @@ -1329,7 +1693,7 @@ void MainWindow::exportDatabaseToSQL() { QString current_table; - if(ui->mainTab->currentIndex() == BrowseTab) + if(ui->mainTab->currentWidget() == ui->browser) current_table = ui->comboBrowseTable->currentText(); ExportSqlDialog dialog(&db, this, current_table); @@ -1340,6 +1704,7 @@ { // Get file name to import QString fileName = FileDialog::getOpenFileName( + OpenSQLFile, this, tr("Choose a file to import"), tr("Text files(*.sql *.txt);;All files(*)")); @@ -1357,6 +1722,7 @@ QMessageBox::Yes, QMessageBox::No) == QMessageBox::Yes) || !db.isOpen()) { newDbFile = FileDialog::getSaveFileName( + CreateDatabaseFile, this, tr("Choose a filename to save under"), FileDialog::getSqlDatabaseFileFilter()); @@ -1368,29 +1734,38 @@ return; } + // Create the new file and open it in the browser db.create(newDbFile); - loadExtensionsFromSettings(); + db.close(); + fileOpen(newDbFile); } + // Defer foreign keys. Just deferring them instead of disabling them should work fine because in the import we only expect CREATE and INSERT + // statements which unlike in the Edit Table dialog shouldn't trigger any problems. + QString foreignKeysOldSettings = db.getPragma("defer_foreign_keys"); + db.setPragma("defer_foreign_keys", "1"); + // Open, read, execute and close file QApplication::setOverrideCursor(Qt::WaitCursor); QFile f(fileName); f.open(QIODevice::ReadOnly); - if(!db.executeMultiSQL(f.readAll(), newDbFile.size() == 0)) + bool ok = db.executeMultiSQL(f.readAll(), newDbFile.size() == 0); + // Restore cursor before asking the user to accept the message + QApplication::restoreOverrideCursor(); + if(!ok) QMessageBox::warning(this, QApplication::applicationName(), tr("Error importing data: %1").arg(db.lastError())); + else if(db.getPragma("foreign_keys") == "1" && !db.querySingleValueFromDb(QString("PRAGMA foreign_key_check")).isNull()) + QMessageBox::warning(this, QApplication::applicationName(), tr("Import completed. Some foreign key constraints are violated. Please fix them before saving.")); else QMessageBox::information(this, QApplication::applicationName(), tr("Import completed.")); f.close(); - QApplication::restoreOverrideCursor(); - // Refresh window when importing into an existing DB or - when creating a new file - just open it correctly - if(newDbFile.size()) - { - fileOpen(newDbFile); - } else { - db.updateSchema(); - populateTable(); - } + // Restore the former foreign key settings + db.setPragma("defer_foreign_keys", foreignKeysOldSettings); + + // Refresh views + db.updateSchema(); + populateTable(); } void MainWindow::openPreferences() @@ -1411,7 +1786,13 @@ if(type == "table" || type == "view" || type == "trigger" || type == "index") popupTableMenu->exec(ui->dbTreeWidget->mapToGlobal(qPoint)); } -//** Tree selection changed + +//** DB Schema Dock Context Menu +void MainWindow::createSchemaDockContextMenu(const QPoint &qPoint) +{ + popupSchemaDockMenu->exec(ui->treeSchemaDock->mapToGlobal(qPoint)); +} + void MainWindow::changeTreeSelection() { // Just assume first that something's selected that can not be edited at all @@ -1436,26 +1817,26 @@ if (type == "view") { ui->editDeleteObjectAction->setText(tr("Delete View")); - ui->editDeleteObjectAction->setToolTip(tr("Delete View")); ui->editModifyObjectAction->setText(tr("Modify View")); - ui->editModifyObjectAction->setToolTip(tr("Modify View")); } else if(type == "trigger") { ui->editDeleteObjectAction->setText(tr("Delete Trigger")); - ui->editDeleteObjectAction->setToolTip(tr("Delete Trigger")); ui->editModifyObjectAction->setText(tr("Modify Trigger")); - ui->editModifyObjectAction->setToolTip(tr("Modify Trigger")); } else if(type == "index") { ui->editDeleteObjectAction->setText(tr("Delete Index")); - ui->editDeleteObjectAction->setToolTip(tr("Delete Index")); ui->editModifyObjectAction->setText(tr("Modify Index")); - ui->editModifyObjectAction->setToolTip(tr("Modify Index")); - } else { + } else if(type == "table") { ui->editDeleteObjectAction->setText(tr("Delete Table")); - ui->editDeleteObjectAction->setToolTip(tr("Delete Table")); ui->editModifyObjectAction->setText(tr("Modify Table")); - ui->editModifyObjectAction->setToolTip(tr("Modify Table")); + } else { + // Nothing to do for other types. Set the buttons not visible and return. + ui->editDeleteObjectAction->setVisible(false); + ui->editModifyObjectAction->setVisible(false); + return; } + ui->editDeleteObjectAction->setVisible(true); + ui->editModifyObjectAction->setVisible(true); + // Activate actions if(type == "table" || type == "index") { @@ -1497,7 +1878,7 @@ // Store updated list Settings::setValue("General", "recentFileList", files); - int numRecentFiles = qMin(files.size(), (int)MaxRecentFiles); + int numRecentFiles = qMin(files.size(), MaxRecentFiles); for (int i = 0; i < numRecentFiles; ++i) { QString text = tr("&%1 %2").arg(i + 1).arg(QDir::toNativeSeparators(files[i])); @@ -1565,6 +1946,7 @@ void MainWindow::activateFields(bool enable) { bool write = !db.readOnly(); + bool tempDb = db.currentFile() == ":memory:"; ui->fileCloseAction->setEnabled(enable); ui->fileAttachAction->setEnabled(enable); @@ -1575,6 +1957,7 @@ ui->fileImportCSVAction->setEnabled(enable && write); ui->editCreateTableAction->setEnabled(enable && write); ui->editCreateIndexAction->setEnabled(enable && write); + ui->actionDbPrint->setEnabled(enable); ui->buttonNext->setEnabled(enable); ui->buttonPrevious->setEnabled(enable); ui->buttonBegin->setEnabled(enable); @@ -1583,55 +1966,67 @@ ui->buttonBoxPragmas->setEnabled(enable && write); ui->buttonGoto->setEnabled(enable); ui->editGoto->setEnabled(enable); - ui->buttonRefresh->setEnabled(enable); - ui->buttonDeleteRecord->setEnabled(enable && write); - ui->buttonNewRecord->setEnabled(enable && write); + ui->actionRefresh->setEnabled(enable); + ui->actionPrintTable->setEnabled(enable); ui->actionExecuteSql->setEnabled(enable); ui->actionLoadExtension->setEnabled(enable); ui->actionSqlExecuteLine->setEnabled(enable); - ui->actionSaveProject->setEnabled(enable); - ui->actionEncryption->setEnabled(enable && write); - ui->buttonClearFilters->setEnabled(enable); - ui->buttonSaveFilterAsView->setEnabled(enable); + ui->actionSaveProject->setEnabled(enable && !tempDb); + ui->actionSaveProjectAs->setEnabled(enable && !tempDb); + ui->actionSaveAll->setEnabled(enable && !tempDb); + ui->actionEncryption->setEnabled(enable && write && !tempDb); + ui->actionIntegrityCheck->setEnabled(enable); + ui->actionQuickCheck->setEnabled(enable); + ui->actionForeignKeyCheck->setEnabled(enable); + ui->actionOptimize->setEnabled(enable); + ui->actionClearFilters->setEnabled(enable); + ui->actionSaveFilterAsPopup->setEnabled(enable); ui->dockEdit->setEnabled(enable); ui->dockPlot->setEnabled(enable); if(!enable) ui->actionSqlResultsSave->setEnabled(false); + updateInsertDeleteRecordButton(); remoteDock->enableButtons(); } -void MainWindow::enableEditing(bool enable_edit, bool enable_insertdelete) +void MainWindow::enableEditing(bool enable_edit) { // Don't enable anything if this is a read only database bool edit = enable_edit && !db.readOnly(); - bool insertdelete = enable_insertdelete && !db.readOnly(); // Apply settings - ui->buttonNewRecord->setEnabled(insertdelete); - ui->buttonDeleteRecord->setEnabled(insertdelete); ui->dataTable->setEditTriggers(edit ? QAbstractItemView::SelectedClicked | QAbstractItemView::AnyKeyPressed | QAbstractItemView::EditKeyPressed : QAbstractItemView::NoEditTriggers); - + updateInsertDeleteRecordButton(); } void MainWindow::browseTableHeaderClicked(int logicalindex) { - // Abort if there is more than one column selected because this tells us that the user pretty sure wants to do a range selection instead of sorting data - if(ui->dataTable->selectionModel()->selectedColumns().count() > 1) - return; - - // instead of the column name we just use the column index, +2 because 'rowid, *' is the projection BrowseDataTableSettings& settings = browseTableSettings[currentlyBrowsedTableName()]; - settings.sortOrderIndex = logicalindex; - settings.sortOrderMode = settings.sortOrderMode == Qt::AscendingOrder ? Qt::DescendingOrder : Qt::AscendingOrder; - ui->dataTable->sortByColumn(settings.sortOrderIndex, settings.sortOrderMode); + + // Abort if there is more than one column selected because this tells us that the user pretty sure wants to do a range selection + // instead of sorting data. But restore before the sort indicator automatically changed by Qt so it still indicates the last + // use sort action. + if(ui->dataTable->selectionModel()->selectedColumns().count() > 1) { + applyBrowseTableSettings(settings); + return; + } + int dummy; + Qt::SortOrder order; + fromSortOrderVector(settings.query.orderBy(), dummy, order); + order = order == Qt::AscendingOrder ? Qt::DescendingOrder : Qt::AscendingOrder; + settings.query.orderBy() = toSortOrderVector(logicalindex, order); + ui->dataTable->sortByColumn(logicalindex, order); // select the first item in the column so the header is bold // we might try to select the last selected item ui->dataTable->setCurrentIndex(ui->dataTable->currentIndex().sibling(0, logicalindex)); attachPlot(ui->dataTable, m_browseTableModel, &browseTableSettings[currentlyBrowsedTableName()]); + + // Reapply the view settings. This seems to be necessary as a workaround for newer Qt versions. + applyBrowseTableSettings(settings); } void MainWindow::resizeEvent(QResizeEvent*) @@ -1639,34 +2034,6 @@ setRecordsetLabel(); } -void MainWindow::keyPressEvent(QKeyEvent* event) -{ - int tab = -1; - - switch (event->key()) - { - case Qt::Key_1: - tab = Tabs::StructureTab; - break; - case Qt::Key_2: - tab = Tabs::BrowseTab; - break; - case Qt::Key_3: - tab = Tabs::PragmaTab; - break; - case Qt::Key_4: - tab = Tabs::ExecuteTab; - break; - default: - break; - } - - if (event->modifiers() & Qt::AltModifier && tab != -1) - ui->mainTab->setCurrentIndex(tab); - - QMainWindow::keyPressEvent(event); -} - void MainWindow::loadPragmas() { pragmaValues.autovacuum = db.getPragma("auto_vacuum").toInt(); @@ -1686,6 +2053,7 @@ pragmaValues.temp_store = db.getPragma("temp_store").toInt(); pragmaValues.user_version = db.getPragma("user_version").toInt(); pragmaValues.wal_autocheckpoint = db.getPragma("wal_autocheckpoint").toInt(); + pragmaValues.case_sensitive_like = db.getPragma("case_sensitive_like").toInt(); updatePragmaUi(); } @@ -1702,13 +2070,14 @@ ui->spinPragmaJournalSizeLimit->setValue(pragmaValues.journal_size_limit); ui->comboboxPragmaLockingMode->setCurrentIndex(ui->comboboxPragmaLockingMode->findText(pragmaValues.locking_mode, Qt::MatchFixedString)); ui->spinPragmaMaxPageCount->setValue(pragmaValues.max_page_count); - ui->spinPragmaPageSize->setValue(pragmaValues.page_size); + ui->comboPragmaPageSize->setCurrentIndex(ui->comboPragmaPageSize->findText(QString::number(pragmaValues.page_size), Qt::MatchFixedString)); ui->checkboxPragmaRecursiveTriggers->setChecked(pragmaValues.recursive_triggers); ui->checkboxPragmaSecureDelete->setChecked(pragmaValues.secure_delete); ui->comboboxPragmaSynchronous->setCurrentIndex(pragmaValues.synchronous); ui->comboboxPragmaTempStore->setCurrentIndex(pragmaValues.temp_store); ui->spinPragmaUserVersion->setValue(pragmaValues.user_version); ui->spinPragmaWalAutoCheckpoint->setValue(pragmaValues.wal_autocheckpoint); + ui->checkboxPragmaCaseSensitiveLike->setChecked(pragmaValues.case_sensitive_like); } void MainWindow::savePragmas() @@ -1731,13 +2100,14 @@ db.setPragma("journal_size_limit", ui->spinPragmaJournalSizeLimit->value(), pragmaValues.journal_size_limit); db.setPragma("locking_mode", ui->comboboxPragmaLockingMode->currentText().toUpper(), pragmaValues.locking_mode); db.setPragma("max_page_count", ui->spinPragmaMaxPageCount->value(), pragmaValues.max_page_count); - db.setPragma("page_size", ui->spinPragmaPageSize->value(), pragmaValues.page_size); + db.setPragma("page_size", ui->comboPragmaPageSize->currentText().toInt(), pragmaValues.page_size); db.setPragma("recursive_triggers", ui->checkboxPragmaRecursiveTriggers->isChecked(), pragmaValues.recursive_triggers); db.setPragma("secure_delete", ui->checkboxPragmaSecureDelete->isChecked(), pragmaValues.secure_delete); db.setPragma("synchronous", ui->comboboxPragmaSynchronous->currentIndex(), pragmaValues.synchronous); db.setPragma("temp_store", ui->comboboxPragmaTempStore->currentIndex(), pragmaValues.temp_store); db.setPragma("user_version", ui->spinPragmaUserVersion->value(), pragmaValues.user_version); db.setPragma("wal_autocheckpoint", ui->spinPragmaWalAutoCheckpoint->value(), pragmaValues.wal_autocheckpoint); + db.setPragma("case_sensitive_like", ui->checkboxPragmaCaseSensitiveLike->isChecked(), pragmaValues.case_sensitive_like); updatePragmaUi(); } @@ -1754,12 +2124,78 @@ } } +// Ask user to save the buffer in the specified tab index. +// ignoreUnattachedBuffers is used to store answer about buffers not linked to files, so user is only asked once about them. +// Return true unless user wants to cancel the invoking action. +bool MainWindow::askSaveSqlTab(int index, bool& ignoreUnattachedBuffers) +{ + SqlExecutionArea* sqlExecArea = qobject_cast(ui->tabSqlAreas->widget(index)); + + if(sqlExecArea->getEditor()->isModified()) { + if(sqlExecArea->fileName().isEmpty() && !ignoreUnattachedBuffers) { + // Once the project is saved, remaining SQL tabs will not be modified, so this is only expected to be asked once. + QString message = currentProjectFilename.isEmpty() ? + tr("Do you want to save the changes made to SQL tabs in a new project file?") : + tr("Do you want to save the changes made to SQL tabs in the project file %1?"). + arg(QFileInfo(currentProjectFilename).fileName()); + QMessageBox::StandardButton reply = QMessageBox::question(nullptr, + QApplication::applicationName(), + message, + QMessageBox::Save | QMessageBox::No | QMessageBox::Cancel); + switch(reply) { + case QMessageBox::Save: + saveProject(); + break; + case QMessageBox::Cancel: + return false; + default: + ignoreUnattachedBuffers = true; + break; + } + } else if(!sqlExecArea->fileName().isEmpty()) { + QMessageBox::StandardButton reply = + QMessageBox::question(nullptr, + QApplication::applicationName(), + tr("Do you want to save the changes made to the SQL file %1?"). + arg(QFileInfo(sqlExecArea->fileName()).fileName()), + QMessageBox::Save | QMessageBox::No | QMessageBox::Cancel); + switch(reply) { + case QMessageBox::Save: + saveSqlFile(index); + break; + case QMessageBox::Cancel: + return false; + default: + break; + } + } + } + return true; +} + void MainWindow::closeSqlTab(int index, bool force) { // Don't close last tab if(ui->tabSqlAreas->count() == 1 && !force) return; + // Check if we're still executing statements from this tab and stop them before proceeding + if(!ui->tabSqlAreas->tabIcon(index).isNull()) + { + if(QMessageBox::warning(this, qApp->applicationName(), tr("The statements in this tab are still executing. Closing the tab will stop the " + "execution. This might leave the database in an inconsistent state. Are you sure " + "you want to close the tab?"), + QMessageBox::Yes, + QMessageBox::Cancel | QMessageBox::Default | QMessageBox::Escape) == QMessageBox::Cancel) + return; + + execute_sql_worker->stop(); + execute_sql_worker->wait(); + } + // Ask for saving and comply with cancel answer. + bool ignoreUnattachedBuffers = false; + if (!askSaveSqlTab(index, ignoreUnattachedBuffers)) + return; // Remove the tab and delete the widget QWidget* w = ui->tabSqlAreas->widget(index); ui->tabSqlAreas->removeTab(index); @@ -1784,16 +2220,33 @@ return index; } -void MainWindow::changeSqlTab(int /*index*/) +void MainWindow::changeSqlTab(int index) { // Instead of figuring out if there are some execution results in the new tab and which statement was used to generate them, // we just disable the export buttons in the toolbar. ui->actionSqlResultsSave->setEnabled(false); + + // Check if the new tab is currently running a query or not + if(ui->tabSqlAreas->tabIcon(index).isNull()) + { + // Not running a query + + ui->actionSqlExecuteLine->setEnabled(true); + ui->actionExecuteSql->setEnabled(true); + ui->actionSqlStop->setEnabled(false); + } else { + // Running a query + + ui->actionSqlExecuteLine->setEnabled(false); + ui->actionExecuteSql->setEnabled(false); + ui->actionSqlStop->setEnabled(true); + } } void MainWindow::openSqlFile() { QString file = FileDialog::getOpenFileName( + OpenSQLFile, this, tr("Select SQL file to open"), tr("Text files(*.sql *.txt);;All files(*)")); @@ -1818,15 +2271,16 @@ SqlExecutionArea* sqlarea = qobject_cast(ui->tabSqlAreas->widget(index)); sqlarea->getEditor()->setText(f.readAll()); + sqlarea->getEditor()->setModified(false); sqlarea->setFileName(file); QFileInfo fileinfo(file); ui->tabSqlAreas->setTabText(index, fileinfo.fileName()); } } -void MainWindow::saveSqlFile() +void MainWindow::saveSqlFile(int tabIndex) { - SqlExecutionArea* sqlarea = qobject_cast(ui->tabSqlAreas->currentWidget()); + SqlExecutionArea* sqlarea = qobject_cast(ui->tabSqlAreas->widget(tabIndex)); if(!sqlarea) return; @@ -1841,12 +2295,19 @@ { QFileInfo fileinfo(sqlarea->fileName()); ui->tabSqlAreas->setTabText(ui->tabSqlAreas->currentIndex(), fileinfo.fileName()); + // Set modified to false so we can get control of unsaved changes when closing. + sqlarea->getEditor()->setModified(false); } else { QMessageBox::warning(this, qApp->applicationName(), tr("Couldn't save file: %1.").arg(f.errorString())); } } } +void MainWindow::saveSqlFile() +{ + saveSqlFile(ui->tabSqlAreas->currentIndex()); +} + void MainWindow::saveSqlFileAs() { SqlExecutionArea* sqlarea = qobject_cast(ui->tabSqlAreas->currentWidget()); @@ -1854,6 +2315,7 @@ return; QString file = FileDialog::getSaveFileName( + CreateSQLFile, this, tr("Select file name"), tr("Text files(*.sql *.txt);;All files(*)")); @@ -1879,9 +2341,10 @@ void MainWindow::loadExtension() { QString file = FileDialog::getOpenFileName( + OpenExtensionFile, this, tr("Select extension file"), - tr("Extensions(*.so *.dll);;All files(*)")); + tr("Extensions(*.so *.dylib *.dll);;All files(*)")); if(file.isEmpty()) return; @@ -1892,25 +2355,15 @@ QMessageBox::warning(this, QApplication::applicationName(), tr("Error loading extension: %1").arg(db.lastError())); } -void MainWindow::loadExtensionsFromSettings() -{ - if(!db.isOpen()) - return; - - QStringList list = Settings::getValue("extensions", "list").toStringList(); - for(const QString& ext : list) - { - if(db.loadExtension(ext) == false) - QMessageBox::warning(this, QApplication::applicationName(), tr("Error loading extension: %1").arg(db.lastError())); - } -} - void MainWindow::reloadSettings() { // Set data browser font ui->dataTable->reloadSettings(); setToolButtonStyle(static_cast(Settings::getValue("General", "toolbarStyle").toInt())); + ui->dbToolbar->setToolButtonStyle(static_cast(Settings::getValue("General", "toolbarStyleStructure").toInt())); + ui->browseToolbar->setToolButtonStyle(static_cast(Settings::getValue("General", "toolbarStyleBrowse").toInt())); + ui->toolbarSql->setToolButtonStyle(static_cast(Settings::getValue("General", "toolbarStyleSql").toInt())); // Set prefetch sizes for lazy population of table models m_browseTableModel->setChunkSize(Settings::getValue("db", "prefetchsize").toInt()); @@ -1930,7 +2383,7 @@ editDock->reloadSettings(); // Load extensions - loadExtensionsFromSettings(); + db.loadExtensionsFromSettings(); // Refresh view dbStructureModel->reloadData(); @@ -1948,6 +2401,8 @@ // Reload remote dock settings remoteDock->reloadSettings(); + + sqlb::setIdentifierQuoting(static_cast(Settings::getValue("editor", "identifier_quotes").toInt())); } void MainWindow::checkNewVersion(const QString& versionstring, const QString& url) @@ -2010,9 +2465,58 @@ QDesktopServices::openUrl(QUrl("https://github.com/sqlitebrowser/sqlitebrowser/wiki")); } +// 'Help | Bug Report...' link will set an appropiate body, add the system information and set the label 'bug' automatically to the issue void MainWindow::on_actionBug_report_triggered() { - QDesktopServices::openUrl(QUrl("https://github.com/sqlitebrowser/sqlitebrowser/issues/new")); + const QString version = Application::versionString(); + const QString os = QSysInfo::prettyProductName(); + const QString kernelType = QSysInfo::kernelType(); + const QString kernelVersion = QSysInfo::kernelVersion(); + const QString arch = QSysInfo::currentCpuArchitecture(); + const QString built_for = QSysInfo::buildAbi(); + + QString sqlite_version, sqlcipher_version; + DBBrowserDB::getSqliteVersion(sqlite_version, sqlcipher_version); + if(sqlcipher_version.isNull()) + sqlite_version = QString("SQLite Version ") + sqlite_version; + else + sqlite_version = QString("SQLCipher Version ") + sqlcipher_version + QString(" (based on SQLite %1)").arg(sqlite_version); + + const QString body = + QString("Details for the issue\n" + "--------------------\n\n" + "#### What did you do?\n\n\n" + "#### What did you expect to see?\n\n\n" + "#### What did you see instead?\n\n\n" + "Useful extra information\n" + "-------------------------\n" + "> DB4S v%1 [built for %2] on %3 (%4/%5) [%6]\n" + "> using %7\n" + "> and Qt %8") + .arg(version, built_for, os, kernelType, kernelVersion, arch, sqlite_version, QT_VERSION_STR); + + QUrlQuery query; + query.addQueryItem("labels", "bug"); + query.addQueryItem("body", body); + + QUrl url("https://github.com/sqlitebrowser/sqlitebrowser/issues/new"); + url.setQuery(query); + QDesktopServices::openUrl(url); +} + +// 'Help | Feature Request...' link will set an appropiate body and add the label 'enhancement' automatically to the issue +void MainWindow::on_actionFeature_Request_triggered() +{ + QUrlQuery query; + + // Add the label enhancement and use the Feature request template that + // we have in GitHub. + query.addQueryItem("labels", "enhancement"); + query.addQueryItem("template", "Feature_request.md"); + + QUrl url("https://github.com/sqlitebrowser/sqlitebrowser/issues/new"); + url.setQuery(query); + QDesktopServices::openUrl(url); } void MainWindow::on_actionSqlCipherFaq_triggered() @@ -2022,7 +2526,12 @@ void MainWindow::on_actionWebsite_triggered() { - QDesktopServices::openUrl(QUrl("http://sqlitebrowser.org")); + QDesktopServices::openUrl(QUrl("https://sqlitebrowser.org")); +} + +void MainWindow::on_actionDonatePatreon_triggered() +{ + QDesktopServices::openUrl(QUrl("https://www.patreon.com/bePatron?u=11578749")); } void MainWindow::updateBrowseDataColumnWidth(int section, int /*old_size*/, int new_size) @@ -2048,15 +2557,33 @@ static void loadBrowseDataTableSettings(BrowseDataTableSettings& settings, QXmlStreamReader& xml) { - settings.sortOrderIndex = xml.attributes().value("sort_order_index").toInt(); - settings.sortOrderMode = static_cast(xml.attributes().value("sort_order_mode").toInt()); + // TODO Remove this in the near future. This file format was only created temporarily by the nightlies from the late 3.11 development period. + if(xml.attributes().hasAttribute("sort_order_index")) + { + int sortOrderIndex = xml.attributes().value("sort_order_index").toInt(); + Qt::SortOrder sortOrderMode = static_cast(xml.attributes().value("sort_order_mode").toInt()); + settings.query.orderBy() = toSortOrderVector(sortOrderIndex, sortOrderMode); + } + settings.showRowid = xml.attributes().value("show_row_id").toInt(); settings.encoding = xml.attributes().value("encoding").toString(); settings.plotXAxis = xml.attributes().value("plot_x_axis").toString(); settings.unlockViewPk = xml.attributes().value("unlock_view_pk").toString(); while(xml.readNext() != QXmlStreamReader::EndElement && xml.name() != "table") { - if(xml.name() == "column_widths") { + if(xml.name() == "sort") + { + while(xml.readNext() != QXmlStreamReader::EndElement && xml.name() != "sort") + { + if(xml.name() == "column") + { + int index = xml.attributes().value("index").toInt(); + int mode = xml.attributes().value("mode").toInt(); + settings.query.orderBy().emplace_back(index, mode == Qt::AscendingOrder ? sqlb::Ascending : sqlb::Descending); + xml.skipCurrentElement(); + } + } + } else if(xml.name() == "column_widths") { while(xml.readNext() != QXmlStreamReader::EndElement && xml.name() != "column_widths") { if (xml.name() == "column") { int index = xml.attributes().value("index").toInt(); @@ -2072,6 +2599,21 @@ xml.skipCurrentElement(); } } + } else if(xml.name() == "conditional_formats") { + while(xml.readNext() != QXmlStreamReader::EndElement && xml.name() != "conditional_formats") { + if (xml.name() == "column") { + int index = xml.attributes().value("index").toInt(); + while(xml.readNext() != QXmlStreamReader::EndElement && xml.name() != "column") { + if(xml.name() == "format") { + CondFormat newCondFormat(xml.attributes().value("condition").toString(), + QColor(xml.attributes().value("color").toString()), + settings.encoding); + settings.condFormats[index].append(newCondFormat); + xml.skipCurrentElement(); + } + } + } + } } else if(xml.name() == "display_formats") { while(xml.readNext() != QXmlStreamReader::EndElement && xml.name() != "display_formats") { if (xml.name() == "column") { @@ -2110,9 +2652,11 @@ // Show the open file dialog when no filename was passed as parameter if(filename.isEmpty()) { - filename = FileDialog::getOpenFileName(this, - tr("Choose a project file to open"), - tr("DB Browser for SQLite project file (*.sqbpro)")); + filename = FileDialog::getOpenFileName( + OpenProjectFile, + this, + tr("Choose a project file to open"), + tr("DB Browser for SQLite project file (*.sqbpro)")); } if(!filename.isEmpty()) @@ -2138,6 +2682,10 @@ { if(xml.name() == "db") { + // Read only? + if(xml.attributes().hasAttribute("readonly") && xml.attributes().value("readonly").toInt()) + readOnly = true; + // DB file QString dbfilename = xml.attributes().value("path").toString(); if(!QFile::exists(dbfilename)) @@ -2148,13 +2696,40 @@ // PRAGMAs if(xml.attributes().hasAttribute("foreign_keys")) db.setPragma("foreign_keys", xml.attributes().value("foreign_keys").toString()); + if(xml.attributes().hasAttribute("case_sensitive_like")) + db.setPragma("case_sensitive_like", xml.attributes().value("case_sensitive_like").toString()); + if(xml.attributes().hasAttribute("temp_store")) + db.setPragma("temp_store", xml.attributes().value("temp_store").toString()); + if(xml.attributes().hasAttribute("wal_autocheckpoint")) + db.setPragma("wal_autocheckpoint", xml.attributes().value("wal_autocheckpoint").toString()); + if(xml.attributes().hasAttribute("synchronous")) + db.setPragma("synchronous", xml.attributes().value("synchronous").toString()); + loadPragmas(); + } else if(xml.name() == "attached") { + while(xml.readNext() != QXmlStreamReader::EndElement && xml.name() != "attached") + { + if(xml.name() == "db") + { + db.attach(xml.attributes().value("path").toString(), xml.attributes().value("schema").toString()); + xml.skipCurrentElement(); + } + } } else if(xml.name() == "window") { // Window settings while(xml.readNext() != QXmlStreamReader::EndElement && xml.name() != "window") { - // Currently selected tab - if(xml.name() == "current_tab") + if(xml.name() == "main_tabs") { + // Currently open tabs + restoreOpenTabs(xml.attributes().value("open").toString()); + // Currently selected open tab + ui->mainTab->setCurrentIndex(xml.attributes().value("current").toString().toInt()); + xml.skipCurrentElement(); + } else if(xml.name() == "current_tab") { + // Currently selected tab (3.11 or older format, first restore default open tabs) + restoreOpenTabs(defaultOpenTabs); ui->mainTab->setCurrentIndex(xml.attributes().value("id").toString().toInt()); + xml.skipCurrentElement(); + } } } else if(xml.name() == "tab_structure") { // Database Structure tab settings @@ -2192,6 +2767,25 @@ defaultBrowseTableEncoding = xml.attributes().value("codec").toString(); xml.skipCurrentElement(); } else if(xml.name() == "browsetable_info") { + // This tag is only found in old project files. In newer versions (>= 3.11) it is replaced by a new implementation. + // We still support loading it though we might decide to drop that support later. But for now we show a warning to the + // user when loading an old file. + if(!Settings::getValue("idontcare", "projectBrowseTable").toBool()) + { + QMessageBox msgBox; + QPushButton* idontcarebutton = msgBox.addButton(tr("Don't show again"), QMessageBox::ActionRole); + msgBox.addButton(QMessageBox::Ok); + msgBox.setTextFormat(Qt::RichText); + msgBox.setWindowTitle(qApp->applicationName()); + msgBox.setText(tr("This project file is using an old file format because it was created using DB Browser for SQLite " + "version 3.10 or lower. Loading this file format is still fully supported but we advice you to convert " + "all your project files to the new file format because support for older formats might be dropped " + "at some point in the future. You can convert your files by simply opening and re-saving them.")); + msgBox.exec(); + if(msgBox.clickedButton() == idontcarebutton) + Settings::setValue("idontcare", "projectBrowseTable", true); + } + QString attrData = xml.attributes().value("data").toString(); QByteArray temp = QByteArray::fromBase64(attrData.toUtf8()); QDataStream stream(temp); @@ -2210,15 +2804,17 @@ browseTableSettings[tableIdentifier] = settings; } } - xml.skipCurrentElement(); } - if(ui->mainTab->currentIndex() == BrowseTab) + if(ui->mainTab->currentWidget() == ui->browser) { populateTable(); // Refresh view sqlb::ObjectIdentifier current_table = currentlyBrowsedTableName(); - ui->dataTable->sortByColumn(browseTableSettings[current_table].sortOrderIndex, - browseTableSettings[current_table].sortOrderMode); + + int sortIndex; + Qt::SortOrder sortMode; + fromSortOrderVector(browseTableSettings[current_table].query.orderBy(), sortIndex, sortMode); + ui->dataTable->sortByColumn(sortIndex, sortMode); showRowidColumn(browseTableSettings[current_table].showRowid); unlockViewEditing(!browseTableSettings[current_table].unlockViewPk.isEmpty(), browseTableSettings[current_table].unlockViewPk); } @@ -2237,7 +2833,9 @@ // SQL editor tab unsigned int index = openSqlTab(); ui->tabSqlAreas->setTabText(index, xml.attributes().value("name").toString()); - qobject_cast(ui->tabSqlAreas->widget(index))->getEditor()->setText(xml.readElementText()); + SqlTextEdit* sqlEditor = qobject_cast(ui->tabSqlAreas->widget(index))->getEditor(); + sqlEditor->setText(xml.readElementText()); + sqlEditor->setModified(false); } else if(xml.name() == "current_tab") { // Currently selected tab ui->tabSqlAreas->setCurrentIndex(xml.attributes().value("id").toString().toInt()); @@ -2249,6 +2847,8 @@ } file.close(); + currentProjectFilename = filename; + return !xml.hasError(); } else { // No project was opened @@ -2274,12 +2874,21 @@ static void saveBrowseDataTableSettings(const BrowseDataTableSettings& object, QXmlStreamWriter& xml) { - xml.writeAttribute("sort_order_index", QString::number(object.sortOrderIndex)); - xml.writeAttribute("sort_order_mode", QString::number(object.sortOrderMode)); xml.writeAttribute("show_row_id", QString::number(object.showRowid)); xml.writeAttribute("encoding", object.encoding); xml.writeAttribute("plot_x_axis", object.plotXAxis); xml.writeAttribute("unlock_view_pk", object.unlockViewPk); + + xml.writeStartElement("sort"); + for(const auto& column : object.query.orderBy()) + { + xml.writeStartElement("column"); + xml.writeAttribute("index", QString::number(column.column)); + xml.writeAttribute("mode", QString::number(column.direction)); + xml.writeEndElement(); + } + xml.writeEndElement(); + xml.writeStartElement("column_widths"); for(auto iter=object.columnWidths.constBegin(); iter!=object.columnWidths.constEnd(); ++iter) { xml.writeStartElement("column"); @@ -2296,6 +2905,19 @@ xml.writeEndElement(); } xml.writeEndElement(); + xml.writeStartElement("conditional_formats"); + for(auto iter=object.condFormats.constBegin(); iter!=object.condFormats.constEnd(); ++iter) { + xml.writeStartElement("column"); + xml.writeAttribute("index", QString::number(iter.key())); + for(auto format : iter.value()) { + xml.writeStartElement("format"); + xml.writeAttribute("condition", format.filter()); + xml.writeAttribute("color", format.color().name()); + xml.writeEndElement(); + } + xml.writeEndElement(); + } + xml.writeEndElement(); xml.writeStartElement("display_formats"); for(auto iter=object.displayFormats.constBegin(); iter!=object.displayFormats.constEnd(); ++iter) { xml.writeStartElement("column"); @@ -2326,12 +2948,22 @@ xml.writeEndElement(); } -void MainWindow::saveProject() +QString MainWindow::saveProject(const QString& currentFilename) { - QString filename = FileDialog::getSaveFileName(this, - tr("Choose a filename to save under"), - tr("DB Browser for SQLite project file (*.sqbpro)"), - db.currentFile()); + QString filename; + if(currentFilename.isEmpty()) { + QString basePathName = db.currentFile(); + // Remove database suffix + basePathName.chop(QFileInfo(basePathName).suffix().size()+1); + filename = FileDialog::getSaveFileName( + CreateProjectFile, + this, + tr("Choose a filename to save under"), + tr("DB Browser for SQLite project file (*.sqbpro)"), + basePathName); + } else + filename = currentFilename; + if(!filename.isEmpty()) { // Make sure the file has got a .sqbpro ending @@ -2339,7 +2971,14 @@ filename.append(".sqbpro"); QFile file(filename); - file.open(QFile::WriteOnly | QFile::Text); + bool opened = file.open(QFile::WriteOnly | QFile::Text); + if(!opened) { + QMessageBox::warning(this, qApp->applicationName(), + tr("Could not open project file for writing.\nReason: %1").arg(file.errorString())); + return QString(); + } + QApplication::setOverrideCursor(Qt::WaitCursor); + QXmlStreamWriter xml(&file); xml.writeStartDocument(); xml.writeStartElement("sqlb_project"); @@ -2347,13 +2986,42 @@ // Database file name xml.writeStartElement("db"); xml.writeAttribute("path", db.currentFile()); + xml.writeAttribute("readonly", QString::number(db.readOnly())); xml.writeAttribute("foreign_keys", db.getPragma("foreign_keys")); + xml.writeAttribute("case_sensitive_like", db.getPragma("case_sensitive_like")); + xml.writeAttribute("temp_store", db.getPragma("temp_store")); + xml.writeAttribute("wal_autocheckpoint", db.getPragma("wal_autocheckpoint")); + xml.writeAttribute("synchronous", db.getPragma("synchronous")); + xml.writeEndElement(); + + // Attached databases + xml.writeStartElement("attached"); + QString sql("PRAGMA database_list;"); + db.logSQL(sql, kLogMsg_App); + sqlite3_stmt* db_vm; + if(sqlite3_prepare_v2(db.get("project").get(), sql.toUtf8(), sql.toUtf8().length(), &db_vm, nullptr) == SQLITE_OK) + { + while(sqlite3_step(db_vm) == SQLITE_ROW) + { + QString schema(QString::fromUtf8(reinterpret_cast(sqlite3_column_text(db_vm, 1)))); + if(schema != "main" && schema != "temp") + { + QString path(QString::fromUtf8(reinterpret_cast(sqlite3_column_text(db_vm, 2)))); + xml.writeStartElement("db"); + xml.writeAttribute("schema", schema); + xml.writeAttribute("path", path); + xml.writeEndElement(); + } + } + sqlite3_finalize(db_vm); + } xml.writeEndElement(); // Window settings xml.writeStartElement("window"); - xml.writeStartElement("current_tab"); // Currently selected tab - xml.writeAttribute("id", QString::number(ui->mainTab->currentIndex())); + xml.writeStartElement("main_tabs"); // Currently open tabs + xml.writeAttribute("open", saveOpenTabs()); + xml.writeAttribute("current", QString::number(ui->mainTab->currentIndex())); xml.writeEndElement(); xml.writeEndElement(); @@ -2387,15 +3055,20 @@ saveBrowseDataTableSettings(tableIt.value(), xml); xml.writeEndElement(); } + // + xml.writeEndElement(); + // xml.writeEndElement(); // Execute SQL tab data xml.writeStartElement("tab_sql"); for(int i=0;itabSqlAreas->count();i++) // All SQL tabs content { + SqlExecutionArea* sqlArea = qobject_cast(ui->tabSqlAreas->widget(i)); xml.writeStartElement("sql"); xml.writeAttribute("name", ui->tabSqlAreas->tabText(i)); - xml.writeCharacters(qobject_cast(ui->tabSqlAreas->widget(i))->getSql()); + xml.writeCharacters(sqlArea->getSql()); + sqlArea->getEditor()->setModified(false); xml.writeEndElement(); } xml.writeStartElement("current_tab"); // Currently selected tab @@ -2406,14 +3079,28 @@ xml.writeEndElement(); xml.writeEndDocument(); file.close(); + addToRecentFilesMenu(filename); + QApplication::restoreOverrideCursor(); } + return filename; +} + +void MainWindow::saveProject() +{ + currentProjectFilename = saveProject(currentProjectFilename); +} + +void MainWindow::saveProjectAs() +{ + currentProjectFilename = saveProject(QString()); } void MainWindow::fileAttach() { // Get file name of database to attach QString file = FileDialog::getOpenFileName( + OpenDatabaseFile, this, tr("Choose a database file"), FileDialog::getSqlDatabaseFileFilter()); @@ -2427,15 +3114,36 @@ void MainWindow::updateFilter(int column, const QString& value) { m_browseTableModel->updateFilter(column, value); - browseTableSettings[currentlyBrowsedTableName()].filterValues[column] = value; + BrowseDataTableSettings& settings = browseTableSettings[currentlyBrowsedTableName()]; + if(value.isEmpty()) + settings.filterValues.remove(column); + else + settings.filterValues[column] = value; setRecordsetLabel(); + + // Reapply the view settings. This seems to be necessary as a workaround for newer Qt versions. + applyBrowseTableSettings(settings, true); +} + +void MainWindow::addCondFormat(int column, const QString& value) +{ + CondFormat newCondFormat(value, m_condFormatPalette.nextSerialColor(Palette::appHasDarkTheme()), m_browseTableModel->encoding()); + m_browseTableModel->addCondFormat(column, newCondFormat); + browseTableSettings[currentlyBrowsedTableName()].condFormats[column].append(newCondFormat); +} + +void MainWindow::clearAllCondFormats(int column) +{ + QVector emptyCondFormatVector = QVector(); + m_browseTableModel->setCondFormats(column, emptyCondFormatVector); + browseTableSettings[currentlyBrowsedTableName()].condFormats[column].clear(); } void MainWindow::editEncryption() { #ifdef ENABLE_SQLCIPHER - CipherDialog dialog(this, true); - if(dialog.exec()) + CipherDialog cipherDialog(this, true); + if(cipherDialog.exec()) { // Show progress dialog even though we can't provide any detailed progress information but this // process might take some time. @@ -2457,14 +3165,22 @@ file.close(); } + CipherSettings cipherSettings = cipherDialog.getCipherSettings(); + // Attach a new database using the new settings qApp->processEvents(); if(ok) - ok = db.executeSQL(QString("ATTACH DATABASE '%1' AS sqlitebrowser_edit_encryption KEY %2;").arg(db.currentFile() + ".enctemp").arg(dialog.password()), + ok = db.executeSQL(QString("ATTACH DATABASE '%1' AS sqlitebrowser_edit_encryption KEY %2;").arg(db.currentFile() + ".enctemp").arg(cipherSettings.getPassword()), false, false); qApp->processEvents(); if(ok) - ok = db.executeSQL(QString("PRAGMA sqlitebrowser_edit_encryption.cipher_page_size = %1").arg(dialog.pageSize()), false, false); + ok = db.executeSQL(QString("PRAGMA sqlitebrowser_edit_encryption.cipher_page_size = %1").arg(cipherSettings.getPageSize()), false, false); + if(ok) + ok = db.executeSQL(QString("PRAGMA sqlitebrowser_edit_encryption.cipher_hmac_algorithm = %1").arg(cipherSettings.getHmacAlgorithm()), false, false); + if(ok) + ok = db.executeSQL(QString("PRAGMA sqlitebrowser_edit_encryption.cipher_kdf_algorithm = %1").arg(cipherSettings.getKdfAlgorithm()), false, false); + if(ok) + ok = db.executeSQL(QString("PRAGMA sqlitebrowser_edit_encryption.kdf_iter = %1").arg(cipherSettings.getKdfIterations()), false, false); // Export the current database to the new one qApp->processEvents(); @@ -2509,10 +3225,12 @@ } ui->comboBrowseTable->setCurrentIndex(ui->comboBrowseTable->findText(tableToBrowse)); - ui->mainTab->setCurrentIndex(BrowseTab); + if (ui->mainTab->indexOf(ui->browser) == -1) + ui->mainTab->addTab(ui->browser, ui->browser->accessibleName()); + ui->mainTab->setCurrentWidget(ui->browser); } -void MainWindow::on_buttonClearFilters_clicked() +void MainWindow::on_actionClearFilters_triggered() { ui->dataTable->filterHeader()->clearFilters(); } @@ -2533,17 +3251,17 @@ void MainWindow::jumpToRow(const sqlb::ObjectIdentifier& table, QString column, const QByteArray& value) { // First check if table exists - sqlb::TablePtr obj = db.getObjectByName(table).dynamicCast(); + sqlb::TablePtr obj = db.getObjectByName(table); if(!obj) return; // If no column name is set, assume the primary key is meant if(!column.size()) - column = obj->fields().at(obj->findPk())->name(); + column = obj->findPk()->name(); // If column doesn't exist don't do anything - int column_index = obj->findField(column); - if(column_index == -1) + auto column_index = sqlb::findField(obj, column); + if(column_index == obj->fields.end()) return; // Jump to table @@ -2551,7 +3269,7 @@ populateTable(); // Set filter - ui->dataTable->filterHeader()->setFilter(column_index+1, value); + ui->dataTable->filterHeader()->setFilter(column_index-obj->fields.begin()+1, QString("=") + value); } void MainWindow::showDataColumnPopupMenu(const QPoint& pos) @@ -2604,7 +3322,7 @@ } }); - QAction* deleteRecordAction = new QAction(ui->buttonDeleteRecord->text(), &popupRecordMenu); + QAction* deleteRecordAction = new QAction(QIcon(":icons/delete_record"), ui->actionDeleteRecord->text(), &popupRecordMenu); popupRecordMenu.addAction(deleteRecordAction); connect(deleteRecordAction, &QAction::triggered, [&]() { @@ -2623,14 +3341,14 @@ int field_number = sender()->property("clicked_column").toInt(); QString field_name; if (db.getObjectByName(current_table)->type() == sqlb::Object::Table) - field_name = db.getObjectByName(current_table).dynamicCast()->fields().at(field_number-1)->name(); + field_name = db.getObjectByName(current_table)->fields.at(field_number-1).name(); else - field_name = db.getObjectByName(current_table).dynamicCast()->fieldNames().at(field_number-1); + field_name = db.getObjectByName(current_table)->fieldNames().at(field_number-1); // Get the current display format of the field QString current_displayformat = browseTableSettings[current_table].displayFormats[field_number]; // Open the dialog - ColumnDisplayFormatDialog dialog(field_name, current_displayformat, this); + ColumnDisplayFormatDialog dialog(db, current_table, field_name, current_displayformat, this); if(dialog.exec()) { // Set the newly selected display format @@ -2645,7 +3363,7 @@ } } -void MainWindow::showRowidColumn(bool show) +void MainWindow::showRowidColumn(bool show, bool skipFilters) { // Block all signals from the horizontal header. Otherwise the QHeaderView::sectionResized signal causes us trouble ui->dataTable->horizontalHeader()->blockSignals(true); @@ -2670,7 +3388,8 @@ browseTableSettings[current_table].showRowid = show; // Update the filter row - qobject_cast(ui->dataTable->horizontalHeader())->generateFilters(m_browseTableModel->columnCount(), show); + if(!skipFilters) + qobject_cast(ui->dataTable->horizontalHeader())->generateFilters(m_browseTableModel->columnCount(), show); // Re-enable signals ui->dataTable->horizontalHeader()->blockSignals(false); @@ -2686,15 +3405,20 @@ // Ask the user for a new encoding bool ok; QString question; + QStringList availableCodecs = toStringList(QTextCodec::availableCodecs()); + availableCodecs.removeDuplicates(); + int currentItem = availableCodecs.indexOf(encoding); + if(forAllTables) question = tr("Please choose a new encoding for all tables."); else question = tr("Please choose a new encoding for this table."); - encoding = QInputDialog::getText(this, + encoding = QInputDialog::getItem(this, tr("Set encoding"), tr("%1\nLeave the field empty for using the database encoding.").arg(question), - QLineEdit::Normal, - encoding, + availableCodecs, + currentItem, + true, // editable &ok); // Only set the new encoding if the user clicked the OK button @@ -2740,25 +3464,37 @@ sqlb::ObjectIdentifier currentTable = currentlyBrowsedTableName(); // If this isn't a view just unlock editing and return - if(db.getObjectByName(currentTable)->type() != sqlb::Object::View) + if(db.getObjectByName(currentTable) && db.getObjectByName(currentTable)->type() != sqlb::Object::View) { m_browseTableModel->setPseudoPk(QString()); - enableEditing(true, true); + enableEditing(true); return; } + sqlb::ViewPtr obj = db.getObjectByName(currentTable); + // If the view gets unlocked for editing and we don't have a 'primary key' for this view yet, then ask for one if(unlock && pk.isEmpty()) { while(true) { + bool ok; + // Ask for a PK - pk = QInputDialog::getText(this, qApp->applicationName(), tr("Please enter a pseudo-primary key in order to enable editing on this view. " - "This should be the name of a unique column in the view.")); + pk = QInputDialog::getItem(this, + qApp->applicationName(), + tr("Please enter a pseudo-primary key in order to enable editing on this view. " + "This should be the name of a unique column in the view."), + obj->fieldNames(), + 0, + false, + &ok); // Cancelled? - if(pk.isEmpty()) + if(!ok || pk.isEmpty()) { + ui->actionUnlockViewEditing->setChecked(false); return; + } // Do some basic testing of the input and if the input appears to be good, go on if(db.executeSQL(QString("SELECT %1 FROM %2 LIMIT 1;").arg(sqlb::escapeIdentifier(pk)).arg(currentTable.toString()), false, true)) @@ -2770,14 +3506,24 @@ } // (De)activate editing - enableEditing(unlock, false); + enableEditing(unlock); m_browseTableModel->setPseudoPk(pk); // Update checked status of the popup menu action + ui->actionUnlockViewEditing->blockSignals(true); ui->actionUnlockViewEditing->setChecked(unlock); + ui->actionUnlockViewEditing->blockSignals(false); - // Save settings for this table - browseTableSettings[currentTable].unlockViewPk = pk; + // If the settings didn't change, do not try to reapply them. + // This avoids an infinite mutual recursion. + BrowseDataTableSettings& settings = browseTableSettings[currentTable]; + + if(settings.unlockViewPk != pk) { + // Save settings for this table + settings.unlockViewPk = pk; + // Reapply the view settings. This seems to be necessary as a workaround for newer Qt versions. + applyBrowseTableSettings(settings); + } } sqlb::ObjectIdentifier MainWindow::currentlyBrowsedTableName() const @@ -2847,8 +3593,10 @@ "that this application can't provide without further knowledge.\n" "If you choose to proceed, be aware bad things can happen to your database.\n" "Create a backup!").arg(name), QMessageBox::Yes | QMessageBox::No); - if(reply == QMessageBox::Yes) - sqlite3_create_collation(db._db, name.toUtf8(), eTextRep, nullptr, collCompare); + if(reply == QMessageBox::Yes) { + auto pDb = db.get(tr("creating collation")); + sqlite3_create_collation(pDb.get(), name.toUtf8(), eTextRep, nullptr, collCompare); + } } void MainWindow::renameSqlTab(int index) @@ -2883,6 +3631,24 @@ sqlWidget->getEditor()->openFindReplaceDialog(); } +void MainWindow::toggleSqlBlockComment() +{ + // The slot for the shortcut must discover which sqltexedit widget has the focus + SqlExecutionArea* sqlWidget = qobject_cast(ui->tabSqlAreas->currentWidget()); + + if (sqlWidget) + sqlWidget->getEditor()->toggleBlockComment(); +} + +void MainWindow::openSqlPrintDialog() +{ + // The slot for the shortcut must discover which sqltexedit widget has the focus and then open its dialog. + SqlExecutionArea* sqlWidget = qobject_cast(ui->tabSqlAreas->currentWidget()); + + if (sqlWidget) + sqlWidget->getEditor()->openPrintDialog(); +} + void MainWindow::saveAsView(QString query) { // Let the user select a name for the new view and make sure it doesn't already exist @@ -2905,6 +3671,11 @@ QMessageBox::warning(this, qApp->applicationName(), tr("Error creating view: %1").arg(db.lastError())); } +void MainWindow::exportFilteredTable() +{ + ExportDataDialog dialog(db, ExportDataDialog::ExportFormatCsv, this, m_browseTableModel->customQuery(false)); + dialog.exec(); +} void MainWindow::saveFilterAsView() { @@ -2923,3 +3694,224 @@ else QMessageBox::warning(this, qApp->applicationName(), db.lastError()); } + +void MainWindow::updateInsertDeleteRecordButton() +{ + // Update the delete record button to reflect number of selected records + + // NOTE: We're assuming here that the selection is always contiguous, i.e. that there are never two selected + // rows with a non-selected row in between. + int rows = 0; + + // If there is no model yet (because e.g. no database file is opened) there is no selection model either. So we need to check for that here + // in order to avoid null pointer dereferences. If no selection model exists we will just continue as if no row is selected because without a + // model you could argue there actually is no row to be selected. + if(ui->dataTable->selectionModel()) + { + const auto & sel = ui->dataTable->selectionModel()->selectedIndexes(); + if(sel.count()) + rows = sel.last().row() - sel.first().row() + 1; + } + + // Enable the insert and delete buttons only if the currently browsed table or view is editable. For the delete button we additionally require + // at least one row to be selected. For the insert button there is an extra rule to disable it when we are browsing a view because inserting + // into a view isn't supported yet. + bool isEditable = m_browseTableModel->isEditable() && !db.readOnly(); + ui->actionNewRecord->setEnabled(isEditable && !m_browseTableModel->hasPseudoPk()); + ui->actionDeleteRecord->setEnabled(isEditable && rows != 0); + + if(rows > 1) + ui->actionDeleteRecord->setText(tr("Delete Records")); + else + ui->actionDeleteRecord->setText(tr("Delete Record")); +} + +void MainWindow::runSqlNewTab(const QString& query, const QString& title) +{ + QString message = tr("This action will open a new SQL tab for running:") + + QString("
%1

").arg(query) + + tr("Press Help for opening the corresponding SQLite reference page."); + QString windowTitle = title; + windowTitle.remove('&'); + + switch (QMessageBox::information(this, windowTitle, message, QMessageBox::Ok | QMessageBox::Default, QMessageBox::Cancel | QMessageBox::Escape, QMessageBox::Help)) + { + case QMessageBox::Ok: { + if (ui->mainTab->indexOf(ui->query) == -1) + ui->mainTab->addTab(ui->query, ui->query->accessibleName()); + ui->mainTab->setCurrentWidget(ui->query); + unsigned int index = openSqlTab(); + ui->tabSqlAreas->setTabText(index, title); + qobject_cast(ui->tabSqlAreas->widget(index))->getEditor()->setText(query); + executeQuery(); + break; + } + case QMessageBox::Help: { + QString anchor = query.toLower(); + anchor.replace(" ", "_").chop(1); + QDesktopServices::openUrl(QUrl(QString("https://www.sqlite.org/pragma.html#") + anchor)); + break; + } + default: + return; + } +} + +void MainWindow::printDbStructure () +{ + const QTreeView* treeView = ui->dbTreeWidget; + const QAbstractItemModel* model = treeView->model(); + + const int rowCount = model->rowCount(treeView->rootIndex()); + const int columnCount = model->columnCount(treeView->rootIndex()); + + QString strStream; + QTextStream out(&strStream); + + out << "" + << QString("%1").arg(treeView->windowTitle()) + << ""; + + for (int row = 0; row < rowCount; row++) { + + QModelIndex headerIndex = model->index(row, 0, treeView->rootIndex()); + QString data = model->data(headerIndex).toString().toHtmlEscaped(); + out << QString("

%1

").arg(data); + + // Open a new table for each group of objects + out << ""; + + for (int column = 0; column < columnCount; column++) { + // Headers + if (!treeView->isColumnHidden(column)) + out << QString("").arg(model->headerData(column, Qt::Horizontal).toString().toHtmlEscaped()); + } + out << ""; + + for (int column = 0; column < columnCount; column++) { + QModelIndex groupIndex = model->index(row, column, treeView->rootIndex()); + + // A row for the object name + for (int rowChild = 0; rowChild < model->rowCount(groupIndex); rowChild++) { + QModelIndex objectIndex = model->index(rowChild, column, groupIndex); + out << ""; + for (int column2 = 0; column2 < columnCount; column2++) { + if (!treeView->isColumnHidden(column2)) { + QModelIndex cellIndex = model->index(rowChild, column2, groupIndex); + QString header_data = model->data(cellIndex).toString().toHtmlEscaped(); + if (column2 != DbStructureModel::ColumnSQL) + out << QString("").arg((!header_data.isEmpty()) ? header_data : QString(" ")); + else + out << QString("").arg((!header_data.isEmpty()) ? header_data : QString(" ")); + } + } + out << ""; + + // One row for each object's fields + for (int rowChild2 = 0; rowChild2 < model->rowCount(objectIndex); rowChild2++) { + out << ""; + for (int column2 = 0; column2 < columnCount; column2++) { + if (!treeView->isColumnHidden(column2)) { + QModelIndex fieldIndex = model->index(rowChild2, column2, objectIndex); + QString field_data = model->data(fieldIndex).toString().toHtmlEscaped(); + out << QString("").arg((!field_data.isEmpty()) ? field_data : QString(" ")); + } + } + out << ""; + } + } + } + out << "
%1

%1

%1
%1
"; + } + out << ""; + + QTextDocument *document = new QTextDocument(); + document->setHtml(strStream); + + QPrinter printer; + printer.setDocName(treeView->windowTitle()); + + QPrintPreviewDialog *dialog = new QPrintPreviewDialog(&printer); + connect(dialog, &QPrintPreviewDialog::paintRequested, [&](QPrinter *previewPrinter) { + document->print(previewPrinter); + }); + + dialog->exec(); + + delete dialog; + delete document; +} + +void MainWindow::updateDatabaseBusyStatus(bool busy, const QString& user) +{ + statusBusyLabel->setText(tr("Busy (%1)").arg(user)); + statusBusyLabel->setVisible(busy); + statusStopButton->setVisible(busy); +} + + +void MainWindow::closeTab(int index) +{ + ui->mainTab->removeTab(index); +} + +void MainWindow::toggleTabVisible(QWidget* tabWidget, bool show) +{ + if (show) + ui->mainTab->addTab(tabWidget, tabWidget->accessibleName()); + else + ui->mainTab->removeTab(ui->mainTab->indexOf(tabWidget)); +} + +void MainWindow::restoreOpenTabs(QString tabs) +{ + // Split the tab list, skiping the empty parts so the empty string turns to an empty list + // and not a list of one empty string. + QStringList tabList = tabs.split(' ', QString::SkipEmptyParts); + + // Clear the tabs and then add them in the order specified by the setting. + // Use the accessibleName attribute for restoring the tab label. + if (!tabList.isEmpty()) { + // Avoid flickering while clearing and adding tabs. + ui->mainTab->setUpdatesEnabled(false); + ui->mainTab->clear(); + for (QString objectName : tabList) { + for (QWidget* widget : {ui->structure, ui->browser, ui->pragmas, ui->query}) + if (widget->objectName() == objectName) { + ui->mainTab->addTab(widget, widget->accessibleName()); + break; + } + } + ui->mainTab->setUpdatesEnabled(true); + // Force the update of the View menu toggable entries + // (it doesn't seem to be a better way) + ui->mainTab->tabCloseRequested(-1); + } +} + +QString MainWindow::saveOpenTabs() +{ + QString openTabs; + for (int i=0; i < ui->mainTab->count(); i++) + openTabs.append(ui->mainTab->widget(i)->objectName() + ' '); + openTabs.chop(1); + return openTabs; +} + +void MainWindow::showStatusMessage5s(QString message) +{ + ui->statusbar->showMessage(message, 5000); +} + +void MainWindow::saveAll() +{ + for(int i=0; itabSqlAreas->count(); i++) { + SqlExecutionArea* sqlExecArea = qobject_cast(ui->tabSqlAreas->widget(i)); + if(sqlExecArea->getEditor()->isModified() && !sqlExecArea->fileName().isEmpty()) + saveSqlFile(i); + } + if(!currentProjectFilename.isEmpty()) + saveProject(); + fileSave(); + +} diff -Nru sqlitebrowser-3.10.100ubuntu1/src/MainWindow.h sqlitebrowser-3.11.1/src/MainWindow.h --- sqlitebrowser-3.10.100ubuntu1/src/MainWindow.h 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/src/MainWindow.h 2019-02-19 23:51:34.000000000 +0000 @@ -3,16 +3,16 @@ #include "sqlitedb.h" #include "PlotDock.h" +#include "Palette.h" +#include "CondFormat.h" +#include "sql/Query.h" +#include "RunSql.h" +#include #include #include -class QDragEnterEvent; class EditDialog; -class QIntValidator; -class QLabel; -class QModelIndex; -class QPersistentModelIndex; class SqliteTableModel; class DbStructureModel; class RemoteDock; @@ -20,16 +20,23 @@ class FindReplaceDialog; class ExtendedTableWidget; +class QDragEnterEvent; +class QIntValidator; +class QModelIndex; +class QLabel; +class QPersistentModelIndex; +class QToolButton; + namespace Ui { class MainWindow; } struct BrowseDataTableSettings { - int sortOrderIndex; - Qt::SortOrder sortOrderMode; + sqlb::Query query; // NOTE: We only store the sort order in here (for now) QMap columnWidths; QMap filterValues; + QMap> condFormats; QMap displayFormats; bool showRowid; QString encoding; @@ -39,18 +46,16 @@ QMap hiddenColumns; BrowseDataTableSettings() : - sortOrderIndex(0), - sortOrderMode(Qt::AscendingOrder), showRowid(false) { } friend QDataStream& operator>>(QDataStream& stream, BrowseDataTableSettings& object) { - stream >> object.sortOrderIndex; - int sortordermode; - stream >> sortordermode; - object.sortOrderMode = static_cast(sortordermode); + int sortOrderIndex, sortOrderMode; + stream >> sortOrderIndex; + stream >> sortOrderMode; + object.query.orderBy().emplace_back(sortOrderIndex, sortOrderMode == Qt::AscendingOrder ? sqlb::Ascending : sqlb::Descending); stream >> object.columnWidths; stream >> object.filterValues; stream >> object.displayFormats; @@ -81,19 +86,11 @@ public: explicit MainWindow(QWidget* parent = nullptr); - ~MainWindow(); + ~MainWindow() override; DBBrowserDB& getDb() { return db; } RemoteDatabase& getRemote() { return *m_remoteDb; } - enum Tabs - { - StructureTab, - BrowseTab, - PragmaTab, - ExecuteTab - }; - private: struct PragmaValues { @@ -114,43 +111,38 @@ int temp_store; int user_version; int wal_autocheckpoint; + int case_sensitive_like; } pragmaValues; - enum StatementType - { - SelectStatement, - AlterStatement, - DropStatement, - RollbackStatement, - PragmaStatement, - VacuumStatement, - InsertStatement, - UpdateStatement, - DeleteStatement, - CreateStatement, - AttachStatement, - DetachStatement, - OtherStatement, - }; - Ui::MainWindow* ui; + DBBrowserDB db; + + /// the table model used in the "Browse Data" page (re-used and + /// re-initialized when switching to another table) SqliteTableModel* m_browseTableModel; + SqliteTableModel* m_currentTabTableModel; QMenu* popupTableMenu; + QMenu* popupSchemaDockMenu; QMenu* recentFilesMenu; + QMenu* popupOpenDbMenu; + QMenu* popupNewRecordMenu; QMenu* popupSaveSqlFileMenu; QMenu* popupSaveSqlResultsMenu; + QMenu* popupSaveFilterAsMenu; QMenu* popupBrowseDataHeaderMenu; QLabel* statusEncodingLabel; QLabel* statusEncryptionLabel; QLabel* statusReadOnlyLabel; + QToolButton* statusStopButton; + QLabel* statusBusyLabel; DbStructureModel* dbStructureModel; - enum { MaxRecentFiles = 5 }; + static const int MaxRecentFiles = 5; QAction *recentFileActs[MaxRecentFiles]; QAction *recentSeparatorAct; @@ -165,9 +157,17 @@ QIntValidator* gotoValidator; - DBBrowserDB db; QString defaultBrowseTableEncoding; + Palette m_condFormatPalette; + + std::unique_ptr execute_sql_worker; + + QString defaultOpenTabs; + QByteArray defaultWindowState; + + QString currentProjectFilename; + void init(); void clearCompleterModelsFields(); @@ -175,8 +175,7 @@ void setCurrentFile(const QString& fileName); void addToRecentFilesMenu(const QString& filename); void activateFields(bool enable = true); - void enableEditing(bool enable_edit, bool enable_insertdelete); - void loadExtensionsFromSettings(); + void enableEditing(bool enable_edit); void saveAsView(QString query); void duplicateRecord(int currentRow); void selectTableLine(int lineToSelect); @@ -184,14 +183,19 @@ sqlb::ObjectIdentifier currentlyBrowsedTableName() const; - StatementType getQueryType(const QString& query) const; + void applyBrowseTableSettings(BrowseDataTableSettings storedData, bool skipFilters = false); + void toggleTabVisible(QWidget* tabWidget, bool show); + void restoreOpenTabs(QString tabs); + QString saveOpenTabs(); + QString saveProject(const QString& currentFilename); + bool closeFiles(); + bool askSaveSqlTab(int index, bool& ignoreUnattachedBuffers); protected: - void closeEvent(QCloseEvent *); - void dragEnterEvent(QDragEnterEvent *event); - void dropEvent(QDropEvent *event); - void resizeEvent(QResizeEvent *event); - void keyPressEvent(QKeyEvent* event); + void closeEvent(QCloseEvent *) override; + void dragEnterEvent(QDragEnterEvent *event) override; + void dropEvent(QDropEvent *event) override; + void resizeEvent(QResizeEvent *event) override; public slots: bool fileOpen(const QString& fileName = QString(), bool dontAddToRecentFiles = false, bool readOnly = false); @@ -201,15 +205,20 @@ void jumpToRow(const sqlb::ObjectIdentifier& table, QString column, const QByteArray& value); void switchToBrowseDataTab(QString tableToBrowse = QString()); void populateStructure(const QString& old_table = QString()); + void reloadSettings(); + private slots: void createTreeContextMenu(const QPoint & qPoint); + void createSchemaDockContextMenu(const QPoint & qPoint); void changeTreeSelection(); void fileNew(); + void fileNewInMemoryDatabase(); void populateTable(); void clearTableBrowser(); bool fileClose(); void addRecord(); + void insertValues(); void deleteRecord(); void navigatePrevious(); void navigateNext(); @@ -236,7 +245,6 @@ void fileRevert(); void exportDatabaseToSQL(); void importDatabaseFromSQL(); - void openPreferences(); void openRecentFile(); void loadPragmas(); void updatePragmaUi(); @@ -252,24 +260,28 @@ void saveSqlResultsAsCsv(); void saveSqlResultsAsView(); void loadExtension(); - void reloadSettings(); void checkNewVersion(const QString& versionstring, const QString& url); void on_actionWiki_triggered(); void on_actionBug_report_triggered(); + void on_actionFeature_Request_triggered(); void on_actionSqlCipherFaq_triggered(); void on_actionWebsite_triggered(); + void on_actionDonatePatreon_triggered(); void updateBrowseDataColumnWidth(int section, int /*old_size*/, int new_size); bool loadProject(QString filename = QString(), bool readOnly = false); void saveProject(); + void saveProjectAs(); void fileAttach(); void updateFilter(int column, const QString& value); + void addCondFormat(int column, const QString& value); + void clearAllCondFormats(int column); void editEncryption(); - void on_buttonClearFilters_clicked(); + void on_actionClearFilters_triggered(); void copyCurrentCreateStatement(); void showDataColumnPopupMenu(const QPoint& pos); void showRecordPopupMenu(const QPoint& pos); void editDataColumnDisplayFormat(); - void showRowidColumn(bool show); + void showRowidColumn(bool show, bool skipFilters = false); void browseDataSetTableEncoding(bool forAllTables = false); void browseDataSetDefaultTableEncoding(); void fileOpenReadOnly(); @@ -280,7 +292,19 @@ void renameSqlTab(int index); void setFindFrameVisibility(bool show); void openFindReplaceDialog(); + void toggleSqlBlockComment(); + void openSqlPrintDialog(); void saveFilterAsView(); + void exportFilteredTable(); + void updateInsertDeleteRecordButton(); + void runSqlNewTab(const QString& query, const QString& title); + void printDbStructure(); + void updateDatabaseBusyStatus(bool busy, const QString& user); + void openPreferences(); + void closeTab(int index); + void showStatusMessage5s(QString message); + void saveSqlFile(int tabIndex); + void saveAll(); }; #endif diff -Nru sqlitebrowser-3.10.100ubuntu1/src/MainWindow.ui sqlitebrowser-3.11.1/src/MainWindow.ui --- sqlitebrowser-3.10.100ubuntu1/src/MainWindow.ui 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/src/MainWindow.ui 2019-02-19 23:51:34.000000000 +0000 @@ -24,7 +24,19 @@ 0 + + true + + + true + + + true + + + Database Structure + Database Structure @@ -47,7 +59,7 @@ - toolBar1 + toolBar1 Qt::ToolButtonTextBesideIcon @@ -56,6 +68,8 @@ + + @@ -88,6 +102,9 @@
+ + Browse Data + Browse Data @@ -106,18 +123,6 @@
- - - 1 - 0 - - - - - 150 - 0 - - Select a table to browse data @@ -133,54 +138,17 @@ - - - Refresh the data in the selected table [F5, Ctrl+R] - - - This button refreshes the data in the currently selected table. - - - - - - - :/icons/refresh:/icons/refresh - - - - - - - Clear all filters - - - This button clears all the filters set in the header input fields for the currently browsed table. - - - - - - - :/icons/clear_filters:/icons/clear_filters - - - - - - - Save the current filter, sort column and display formats as a view - - - This button saves the current setting of the browsed table (filters, display formats and order column) as an SQL view that you can later browse or use in SQL statements. - - - ... - - - - :/icons/save_table:/icons/save_table - + + + Qt::ToolButtonIconOnly + + + + + + + + @@ -188,40 +156,17 @@ Qt::Horizontal + + QSizePolicy::MinimumExpanding + - 200 + 0 20 - - - - Insert a new record in the current table - - - This button creates a new, empty record in the database - - - New Record - - - - - - - Delete the current record - - - This button deletes the record or records currently selected in the table - - - Delete Record - - -
@@ -230,7 +175,13 @@ true - This is the database view. You can double-click any record to edit its contents in the cell editor window. + This is the database table view. You can do the following actions: + - Start writing for editing inline the value. + - Double-click any record to edit its contents in the cell editor window. + - Alt+Del for deleting the cell content to NULL. + - Ctrl+" for duplicating the current record. + - Ctrl+' for copying the value from the cell above. + - Standard selection and copy/paste operations. QAbstractItemView::NoEditTriggers @@ -382,6 +333,9 @@ + + Edit Pragmas + Edit Pragmas @@ -396,8 +350,8 @@ 0 0 - 566 - 531 + 572 + 510 @@ -407,7 +361,7 @@ - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_auto_vacuum">Auto Vacuum</a></p></body></html> + <html><head/><body><p>Auto Vacuum <a href="http://www.sqlite.org/pragma.html#pragma_auto_vacuum"><img src=":/icons/whatis"/></a></p></body></html> true @@ -424,17 +378,17 @@ - None + None - Full + Full - Incremental + Incremental @@ -442,7 +396,7 @@ - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_automatic_index">Automatic Index</a></p></body></html> + <html><head/><body><p>Automatic Index <a href="http://www.sqlite.org/pragma.html#pragma_automatic_index"><img src=":/icons/whatis"/></a></p></body></html> true @@ -460,9 +414,32 @@ + + + <html><head/><body><p>Case Sensitive Like <a href="https://www.sqlite.org/pragma.html#pragma_case_sensitive_like"><img src=":/icons/whatis"/></a></a></p></body></html> + + + true + + + checkboxPragmaCaseSensitiveLike + + + + + + + Warning: this pragma is not readable and this value has been inferred. Writing the pragma might overwrite a redefined LIKE provided by an SQLite extension. + + + + + + + - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_checkpoint_fullfsync">Checkpoint Full FSYNC</a></p></body></html> + <html><head/><body><p>Checkpoint Full FSYNC <a href="https://www.sqlite.org/pragma.html#pragma_checkpoint_fullfsync"><img src=":/icons/whatis"/></a></a></p></body></html> true @@ -472,17 +449,17 @@ - + - + - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_foreign_keys">Foreign Keys</a></p></body></html> + <html><head/><body><p>Foreign Keys <a href="https://www.sqlite.org/pragma.html#pragma_foreign_keys"><img src=":/icons/whatis"/></a></a></p></body></html> true @@ -492,17 +469,17 @@ - + - + - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_fullfsync">Full FSYNC</a></p></body></html> + <html><head/><body><p>Full FSYNC <a href="https://www.sqlite.org/pragma.html#pragma_fullfsync"><img src=":/icons/whatis"/></a></a></p></body></html> true @@ -512,17 +489,17 @@ - + - + - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_ignore_check_constraints">Ignore Check Constraints</a></p></body></html> + <html><head/><body><p>Ignore Check Constraints <a href="https://www.sqlite.org/pragma.html#pragma_ignore_check_constraints"><img src=":/icons/whatis"/></a></a></p></body></html> true @@ -532,17 +509,17 @@ - + - + - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_journal_mode">Journal Mode</a></p></body></html> + <html><head/><body><p>Journal Mode <a href="https://www.sqlite.org/pragma.html#pragma_journal_mode"><img src=":/icons/whatis"/></a></a></p></body></html> true @@ -552,44 +529,44 @@ - + - Delete + Delete - Truncate + Truncate - Persist + Persist - Memory + Memory - WAL + WAL - Off + Off - + - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_journal_size_limit">Journal Size Limit</a></p></body></html> + <html><head/><body><p>Journal Size Limit <a href="https://www.sqlite.org/pragma.html#pragma_journal_size_limit"><img src=":/icons/whatis"/></a></a></p></body></html> true @@ -599,7 +576,7 @@ - + -1 @@ -609,10 +586,10 @@ - + - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_locking_mode">Locking Mode</a></p></body></html> + <html><head/><body><p>Locking Mode <a href="https://www.sqlite.org/pragma.html#pragma_locking_mode"><img src=":/icons/whatis"/></a></a></p></body></html> true @@ -622,24 +599,24 @@ - + - Normal + Normal - Exclusive + Exclusive - + - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_max_page_count">Max Page Count</a></p></body></html> + <html><head/><body><p>Max Page Count <a href="https://www.sqlite.org/pragma.html#pragma_max_page_count"><img src=":/icons/whatis"/></a></a></p></body></html> true @@ -649,40 +626,74 @@ - + 2000000000 - + - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_page_size">Page Size</a></p></body></html> + <html><head/><body><p>Page Size <a href="https://www.sqlite.org/pragma.html#pragma_page_size"><img src=":/icons/whatis"/></a></a></p></body></html> true - spinPragmaPageSize + comboPragmaPageSize - - - - 512 - - - 65536 - + + + + + 512 + + + + + 1024 + + + + + 2048 + + + + + 4096 + + + + + 8192 + + + + + 16384 + + + + + 32768 + + + + + 65536 + + - + - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_recursive_triggers">Recursive Triggers</a></p></body></html> + <html><head/><body><p>Recursive Triggers <a href="https://www.sqlite.org/pragma.html#pragma_recursive_triggers"><img src=":/icons/whatis"/></a></a></p></body></html> true @@ -692,17 +703,17 @@ - + - + - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_secure_delete">Secure Delete</a></p></body></html> + <html><head/><body><p>Secure Delete <a href="https://www.sqlite.org/pragma.html#pragma_secure_delete"><img src=":/icons/whatis"/></a></a></p></body></html> true @@ -712,17 +723,17 @@ - + - + - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_synchronous">Synchronous</a></p></body></html> + <html><head/><body><p>Synchronous <a href="https://www.sqlite.org/pragma.html#pragma_synchronous"><img src=":/icons/whatis"/></a></a></p></body></html> true @@ -732,29 +743,29 @@ - + - Off + Off - Normal + Normal - Full + Full - + - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_temp_store">Temp Store</a></p></body></html> + <html><head/><body><p>Temp Store <a href="https://www.sqlite.org/pragma.html#pragma_temp_store"><img src=":/icons/whatis"/></a></a></p></body></html> true @@ -764,29 +775,29 @@ - + - Default + Default - File + File - Memory + Memory - + - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_user_version">User Version</a></p></body></html> + <html><head/><body><p>User Version <a href="https://www.sqlite.org/pragma.html#pragma_user_version"><img src=":/icons/whatis"/></a></a></p></body></html> true @@ -796,17 +807,17 @@ - + 2147483647 - + - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_wal_autocheckpoint">WAL Auto Checkpoint</a></p></body></html> + <html><head/><body><p>WAL Auto Checkpoint <a href="https://www.sqlite.org/pragma.html#pragma_wal_autocheckpoint"><img src=":/icons/whatis"/></a></a></p></body></html> true @@ -816,7 +827,7 @@ - + 10000 @@ -840,6 +851,9 @@ + + Execute SQL + Execute SQL @@ -852,14 +866,18 @@ + + + + @@ -887,7 +905,7 @@ 0 0 1037 - 25 + 22 @@ -910,23 +928,23 @@ + - - - - + + + @@ -939,6 +957,8 @@ + + @@ -948,22 +968,41 @@ - &Help + + + + + + + + &Tools + + + + + + + + + + + + @@ -972,7 +1011,7 @@ DB Toolbar - Qt::ToolButtonIconOnly + Qt::ToolButtonTextBesideIcon TopToolBarArea @@ -981,7 +1020,7 @@ false - + @@ -1136,9 +1175,12 @@ + + Qt::CustomContextMenu + This is the structure of the opened database. -You can drag multiple object names from the Name column and drop them into the SQL editor. +You can drag multiple object names from the Name column and drop them into the SQL editor and you can adjust the properties of the dropped names using the context menu. This would help you in composing SQL statements. You can drag SQL statements from the Schema column and drop them into the SQL editor or into other applications. @@ -1182,7 +1224,7 @@ Project Toolbar - Qt::ToolButtonIconOnly + Qt::ToolButtonTextBesideIcon TopToolBarArea @@ -1204,7 +1246,7 @@ Close the current database file - Qt::ToolButtonIconOnly + Qt::ToolButtonTextBesideIcon TopToolBarArea @@ -1346,7 +1388,7 @@ false - Compact &Database + Compact &Database... Compact the database file, removing space wasted by deleted records @@ -1535,9 +1577,6 @@ Shows or hides the Database toolbar. - - Ctrl+T - QAction::NoRole @@ -1559,7 +1598,7 @@ - &About... + &About QAction::AboutRole @@ -1594,11 +1633,14 @@ &Execute SQL - Execute all/selected SQL [F5, Ctrl+Return, Ctrl+R] + Execute all/selected SQL This button executes the currently selected SQL statements. If no text is selected, all SQL statements are executed. + + Ctrl+Return + @@ -1630,7 +1672,7 @@ :/icons/load_extension:/icons/load_extension - &Load extension + &Load Extension... QAction::NoRole @@ -1644,8 +1686,11 @@ Execute current line + + Execute line + - Execute current line [Shift+F5] + Execute current line This button executes the SQL statement present in the current editor line @@ -1671,7 +1716,7 @@ :/icons/browser_open:/icons/browser_open - &Wiki... + &Wiki QAction::NoRole @@ -1683,7 +1728,19 @@ :/icons/browser_open:/icons/browser_open - Bug &report... + Bug &Report... + + + QAction::NoRole + + + + + + :/icons/browser_open:/icons/browser_open + + + Feature Re&quest... QAction::NoRole @@ -1695,7 +1752,19 @@ :/icons/browser_open:/icons/browser_open - Web&site... + Web&site + + + QAction::NoRole + + + + + + :/icons/browser_open:/icons/browser_open + + + &Donate on Patreon... QAction::NoRole @@ -1728,7 +1797,7 @@ :/icons/project_open:/icons/project_open - Open &Project + Open &Project... Load a working session from a file @@ -1752,7 +1821,7 @@ :/icons/db_attach:/icons/db_attach - &Attach Database + &Attach Database... Add another database file to the current database connection @@ -1773,7 +1842,7 @@ :/icons/encryption:/icons/encryption - &Set Encryption + &Set Encryption... QAction::NoRole @@ -1803,7 +1872,7 @@ Save SQL file - This button opens a saves the content of the current SQL editor tab to a file + This button saves the content of the current SQL editor tab to a file @@ -1868,7 +1937,7 @@ :/icons/browser_open:/icons/browser_open - SQLCipher &FAQ... + SQLCipher &FAQ Opens the SQLCipher FAQ in a browser window @@ -1886,12 +1955,25 @@ + + + :/icons/refresh:/icons/refresh + Refresh + + Refresh the data in the selected table + + + This button refreshes the data in the currently selected table. + F5 + + Qt::WidgetShortcut + @@ -1951,8 +2033,11 @@ Find text in SQL editor + + Find + - Find text in SQL editor [Ctrl+F] + Find text in SQL editor This button opens the search bar of the editor @@ -1972,12 +2057,21 @@ Find or replace text in SQL editor + + Find or replace + - Find or replace text in SQL editor [Ctrl+H] + Find or replace text in SQL editor This button opens the find/replace dialog for the current editor tab + + Ctrl+H + + + Qt::WidgetShortcut + @@ -2041,35 +2135,402 @@ Extra DB Toolbar - - - - SqlTextEdit - QTextEdit -
sqltextedit.h
- 1 -
- - ExtendedTableWidget - QTableWidget -
ExtendedTableWidget.h
- - foreignKeyClicked(QString,QString,QByteArray) - foreignKeyClicked(sqlb::ObjectIdentifier,QString,QByteArray) - -
-
- + + + Export to &CSV + + + Export the filtered data to CSV + + + Export the filtered data to CSV + + + This button exports the data of the browsed table as currently displayed (after filters, display formats and order column) as a CSV file. + + + + + Save as &view + + + Save the current filter, sort column and display formats as a view + + + Save the current filter, sort column and display formats as a view + + + This button saves the current setting of the browsed table (filters, display formats and order column) as an SQL view that you can later browse or use in SQL statements. + + + + + + :/icons/db_open:/icons/db_open + + + &Open Database... + + + Open an existing database file + + + Open an existing database file + + + This option is used to open an existing database file. + + + QAction::TextHeuristicRole + + + + + Insert Values... + + + Open a dialog for inserting values in a new record + + + Open a dialog for inserting values in a new record + + + + + + :/icons/add_record:/icons/add_record + + + New Record + + + Insert new record using default values in browsed table + + + Insert new record using default values in browsed table + + + + + New In-&Memory Database + + + + + true + + + Drag && Drop Qualified Names + + + Use qualified names (e.g. "Table"."Field") when dragging the objects and dropping them into the editor + + + Use qualified names (e.g. "Table"."Field") when dragging the objects and dropping them into the editor + + + + + true + + + Drag && Drop Enquoted Names + + + Use escaped identifiers (e.g. "Table1") when dragging the objects and dropping them into the editor + + + Use escaped identifiers (e.g. "Table1") when dragging the objects and dropping them into the editor + + + + + &Integrity Check + + + Runs the integrity_check pragma over the opened database and returns the results in the Execute SQL tab. This pragma does an integrity check of the entire database. + + + + + &Foreign-Key Check + + + Runs the foreign_key_check pragma over the opened database and returns the results in the Execute SQL tab + + + + + &Quick Integrity Check + + + Run a quick integrity check over the open DB + + + Runs the quick_check pragma over the opened database and returns the results in the Execute SQL tab. This command does most of the checking of PRAGMA integrity_check but runs much faster. + + + + + &Optimize + + + Attempt to optimize the database + + + Runs the optimize pragma over the opened database. This pragma might perform optimizations that will improve the performance of future queries. + + + + + + :/icons/print:/icons/print + + + Print + + + Print text from current SQL editor tab + + + + + + Open a dialog for printing the text in the current SQL editor tab + + + Ctrl+P + + + Qt::WidgetShortcut + + + + + false + + + + :/icons/print:/icons/print + + + Print + + + Print the structure of the opened database + + + + + + Open a dialog for printing the structure of the opened database + + + Ctrl+P + + + Qt::WidgetShortcut + + + + + + :/icons/comment_block:/icons/comment_block + + + Un/comment block of SQL code + + + Un/comment block + + + Comment or uncomment current line or selected block of code + + + Comment or uncomment the selected lines or the current line, when there is no selection. All the block is toggled according to the first line. + + + Ctrl+/ + + + Qt::WidgetShortcut + + + + + + :/icons/cancel:/icons/cancel + + + Stop SQL execution + + + Stop execution + + + Stop the currently running SQL script + + + + + + :/icons/print:/icons/print + + + Print + + + Print currently browsed table data + + + + + + Print currently browsed table data. Print selection if more than one cell is selected. + + + Ctrl+P + + + Qt::WidgetShortcut + + + + + + :/icons/clear_filters:/icons/clear_filters + + + Clear Filters + + + Clear all filters + + + This button clears all the filters set in the header input fields for the currently browsed table. + + + This button clears all the filters set in the header input fields for the currently browsed table. + + + + + + :/icons/save_table:/icons/save_table + + + Save Table As... + + + Save the table as currently displayed + + + Save the table as currently displayed + + + <html><head/><body><p>This popup menu provides the following options applying to the currently browsed and filtered table:</p><ul style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;"><li style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Export to CSV: this option exports the data of the browsed table as currently displayed (after filters, display formats and order column) to a CSV file.</li><li style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Save as view: this option saves the current setting of the browsed table (filters, display formats and order column) as an SQL view that you can later browse or use in SQL statements.</li></ul></body></html> + + + + + + :/icons/add_record:/icons/add_record + + + New Record + + + Insert a new record in the current table + + + Insert a new record in the current table + + + <html><head/><body><p>This button creates a new record in the database. Hold the mouse button to open a pop-up menu of different options:</p><ul><li><span style=" font-weight:600;">New Record</span>: insert a new record with default values in the database.</li><li><span style=" font-weight:600;">Insert Values...</span>: open a dialog for entering values before they are inserted in the database. This allows to enter values acomplishing the different constraints. This dialog is also open if the <span style=" font-weight:600;">New Record</span> option fails due to these constraints.</li></ul></body></html> + + + + + + :/icons/delete_record:/icons/delete_record + + + Delete Record + + + Delete the current record + + + This button deletes the record or records currently selected in the table + + + This button deletes the record or records currently selected in the table + + + + + + :/icons/project_save_as:/icons/project_save_as + + + &Save Project As... + + + Save the project in a file selected in a dialog + + + Save the project in a file selected in a dialog + + + Save the project in a file selected in a dialog + + + + + + :/icons/save_all:/icons/save_all + + + Save A&ll + + + Save DB file, project file and opened SQL files + + + Save DB file, project file and opened SQL files + + + Save DB file, project file and opened SQL files + + + Ctrl+Shift+S + + +
+ + + SqlTextEdit + QTextEdit +
sqltextedit.h
+ 1 +
+ + ExtendedTableWidget + QTableWidget +
ExtendedTableWidget.h
+ + foreignKeyClicked(QString,QString,QByteArray) + foreignKeyClicked(sqlb::ObjectIdentifier,QString,QByteArray) + +
+
+ mainTab dbTreeWidget comboLogSubmittedBy buttonLogClear treeSchemaDock comboBrowseTable - buttonRefresh - buttonClearFilters - buttonNewRecord - buttonDeleteRecord dataTable buttonBegin buttonPrevious @@ -2080,6 +2541,7 @@ scrollareaPragmas comboboxPragmaAutoVacuum checkboxPragmaAutomaticIndex + checkboxPragmaCaseSensitiveLike checkboxPragmaCheckpointFullFsync checkboxPragmaForeignKeys checkboxPragmaFullFsync @@ -2088,7 +2550,7 @@ spinPragmaJournalSizeLimit comboboxPragmaLockingMode spinPragmaMaxPageCount - spinPragmaPageSize + comboPragmaPageSize checkboxPragmaSecureDelete checkboxPragmaRecursiveTriggers comboboxPragmaSynchronous @@ -2102,10 +2564,426 @@ - fileExitAction - triggered() + fileExitAction + triggered() + MainWindow + close() + + + -1 + -1 + + + 399 + 299 + + + + + fileOpenAction + triggered() + MainWindow + fileOpen() + + + -1 + -1 + + + 399 + 299 + + + + + fileNewAction + triggered() + MainWindow + fileNew() + + + -1 + -1 + + + 399 + 299 + + + + + fileCloseAction + triggered() + MainWindow + fileClose() + + + -1 + -1 + + + 399 + 299 + + + + + comboBrowseTable + activated(QString) + MainWindow + populateTable() + + + 118 + 141 + + + 399 + 299 + + + + + actionDeleteRecord + triggered() + MainWindow + deleteRecord() + + + -1 + -1 + + + 399 + 299 + + + + + buttonPrevious + clicked() + MainWindow + navigatePrevious() + + + 86 + 539 + + + 399 + 299 + + + + + buttonNext + clicked() + MainWindow + navigateNext() + + + 183 + 539 + + + 399 + 299 + + + + + buttonGoto + clicked() + MainWindow + navigateGoto() + + + 365 + 539 + + + 399 + 299 + + + + + editGoto + returnPressed() + MainWindow + navigateGoto() + + + 506 + 538 + + + 399 + 299 + + + + + fileCompactAction + triggered() + MainWindow + compact() + + + -1 + -1 + + + 399 + 299 + + + + + helpWhatsThisAction + triggered() + MainWindow + helpWhatsThis() + + + -1 + -1 + + + 399 + 299 + + + + + helpAboutAction + triggered() + MainWindow + helpAbout() + + + -1 + -1 + + + 399 + 299 + + + + + mainTab + currentChanged(int) + MainWindow + mainTabSelected(int) + + + 399 + 315 + + + 399 + 299 + + + + + fileImportCSVAction + triggered() + MainWindow + importTableFromCSV() + + + -1 + -1 + + + 399 + 299 + + + + + fileExportCSVAction + triggered() + MainWindow + exportTableToCSV() + + + -1 + -1 + + + 399 + 299 + + + + + fileRevertAction + triggered() + MainWindow + fileRevert() + + + -1 + -1 + + + 399 + 299 + + + + + fileSaveAction + triggered() + MainWindow + fileSave() + + + -1 + -1 + + + 399 + 299 + + + + + editCreateIndexAction + triggered() + MainWindow + createIndex() + + + -1 + -1 + + + 399 + 299 + + + + + editDeleteObjectAction + triggered() + MainWindow + deleteObject() + + + -1 + -1 + + + 399 + 299 + + + + + editModifyObjectAction + triggered() + MainWindow + editObject() + + + -1 + -1 + + + 399 + 299 + + + + + fileExportSQLAction + triggered() + MainWindow + exportDatabaseToSQL() + + + -1 + -1 + + + 399 + 299 + + + + + fileImportSQLAction + triggered() + MainWindow + importDatabaseFromSQL() + + + -1 + -1 + + + 399 + 299 + + + + + viewPreferencesAction + triggered() + MainWindow + openPreferences() + + + -1 + -1 + + + 399 + 299 + + + + + dbTreeWidget + customContextMenuRequested(QPoint) + MainWindow + createTreeContextMenu(QPoint) + + + 111 + 261 + + + 399 + 299 + + + + + treeSchemaDock + customContextMenuRequested(QPoint) MainWindow - close() + createSchemaDockContextMenu(QPoint) + + + 111 + 261 + + + 399 + 299 + + + + + viewDBToolbarAction + toggled(bool) + toolbarDB + setVisible(bool) -1 @@ -2113,15 +2991,15 @@ 399 - 299 + 34 - fileOpenAction - triggered() + actionSqlFind + toggled(bool) MainWindow - fileOpen() + setFindFrameVisibility(bool) -1 @@ -2129,15 +3007,15 @@ 399 - 299 + 34 - fileNewAction + actionSqlFindReplace triggered() MainWindow - fileNew() + openFindReplaceDialog() -1 @@ -2145,15 +3023,15 @@ 399 - 299 + 34 - fileCloseAction + editCreateTableAction triggered() MainWindow - fileClose() + createTable() -1 @@ -2166,62 +3044,94 @@ - comboBrowseTable - activated(QString) + buttonBoxPragmas + rejected() MainWindow - populateTable() + loadPragmas() - 118 - 141 + 111 + 540 - 399 - 299 + -1 + 470 - buttonNewRecord - clicked() + buttonBoxPragmas + accepted() MainWindow - addRecord() + savePragmas() - 402 - 143 + 111 + 540 - 399 - 299 + 802 + 522 - buttonDeleteRecord + buttonLogClear clicked() - MainWindow - deleteRecord() + editLogApplication + clear() - 506 - 143 + 989 + 126 - 399 - 299 + 632 + 173 - buttonPrevious + buttonLogClear clicked() + editLogUser + clear() + + + 989 + 126 + + + 1028 + 230 + + + + + comboLogSubmittedBy + currentIndexChanged(int) + stackLog + setCurrentIndex(int) + + + 772 + 135 + + + 1028 + 230 + + + + + dataTable + doubleClicked(QModelIndex) MainWindow - navigatePrevious() + doubleClickTable(QModelIndex) - 86 - 539 + 399 + 211 399 @@ -2230,14 +3140,46 @@ - buttonNext - clicked() + tabSqlAreas + tabCloseRequested(int) MainWindow - navigateNext() + closeSqlTab(int) - 183 - 539 + 91 + 259 + + + -1 + 51 + + + + + tabSqlAreas + currentChanged(int) + MainWindow + changeSqlTab(int) + + + 91 + 259 + + + -1 + 51 + + + + + actionExecuteSql + triggered() + MainWindow + executeQuery() + + + -1 + -1 399 @@ -2246,14 +3188,14 @@ - buttonGoto - clicked() + actionSqlOpenTab + triggered() MainWindow - navigateGoto() + openSqlTab() - 365 - 539 + -1 + -1 399 @@ -2262,14 +3204,14 @@ - editGoto - returnPressed() + actionSqlOpenFile + triggered() MainWindow - navigateGoto() + openSqlFile() - 506 - 538 + -1 + -1 399 @@ -2278,14 +3220,14 @@ - buttonRefresh - clicked() + actionSqlSaveFile + triggered() MainWindow - refresh() + saveSqlFile() - 245 - 139 + -1 + -1 399 @@ -2294,10 +3236,10 @@ - fileCompactAction + actionLoadExtension triggered() MainWindow - compact() + loadExtension() -1 @@ -2310,10 +3252,10 @@ - helpWhatsThisAction + actionSqlExecuteLine triggered() MainWindow - helpWhatsThis() + executeQuery() -1 @@ -2326,10 +3268,10 @@ - helpAboutAction + actionExportCsvPopup triggered() MainWindow - helpAbout() + exportTableToCSV() -1 @@ -2342,14 +3284,14 @@ - mainTab - currentChanged(int) + actionOpenProject + triggered() MainWindow - mainTabSelected(int) + loadProject() - 399 - 315 + -1 + -1 399 @@ -2358,10 +3300,10 @@ - fileImportCSVAction + actionSaveProject triggered() MainWindow - importTableFromCSV() + saveProject() -1 @@ -2374,638 +3316,670 @@ - fileExportCSVAction + fileAttachAction triggered() MainWindow - exportTableToCSV() + fileAttach() + + + -1 + -1 + + + 499 + 314 + + + + + actionEncryption + triggered() + MainWindow + editEncryption() + + + -1 + -1 + + + 499 + 314 + + + + + actionSqlSaveFilePopup + triggered() + MainWindow + saveSqlFile() -1 -1 - 399 - 299 + 499 + 314 - fileRevertAction + actionSqlSaveFileAs triggered() MainWindow - fileRevert() + saveSqlFileAs() -1 -1 - 399 - 299 + 499 + 314 - fileSaveAction - triggered() + buttonEnd + clicked() MainWindow - fileSave() + navigateEnd() - -1 - -1 + 223 + 539 - 399 - 299 + 499 + 314 - editCreateIndexAction - triggered() + buttonBegin + clicked() MainWindow - createIndex() + navigateBegin() - -1 - -1 + 50 + 539 - 399 - 299 + 499 + 314 - editDeleteObjectAction + actionEditBrowseTable triggered() MainWindow - deleteObject() + switchToBrowseDataTab() -1 -1 - 399 - 299 + 499 + 314 - editModifyObjectAction + actionEditCopyCreateStatement triggered() MainWindow - editObject() + copyCurrentCreateStatement() -1 -1 - 399 - 299 + 499 + 314 - fileExportSQLAction - triggered() + dataTable + foreignKeyClicked(sqlb::ObjectIdentifier,QString,QByteArray) MainWindow - exportDatabaseToSQL() + jumpToRow(sqlb::ObjectIdentifier,QString,QByteArray) - -1 - -1 + 70 + 242 - 399 - 299 + 518 + 314 - fileImportSQLAction + actionBrowseTableEditDisplayFormat triggered() MainWindow - importDatabaseFromSQL() + editDataColumnDisplayFormat() -1 -1 - 399 - 299 + 518 + 314 - viewPreferencesAction - triggered() + actionShowRowidColumn + triggered(bool) MainWindow - openPreferences() + showRowidColumn(bool) -1 -1 - 399 - 299 + 518 + 314 - dbTreeWidget - customContextMenuRequested(QPoint) + actionSetTableEncoding + triggered() MainWindow - createTreeContextMenu(QPoint) + browseDataSetTableEncoding() - 111 - 261 + -1 + -1 - 399 - 299 + 518 + 314 - viewDBToolbarAction - toggled(bool) - toolbarDB - setVisible(bool) + actionSetAllTablesEncoding + triggered() + MainWindow + browseDataSetDefaultTableEncoding() -1 -1 - 399 - 34 + 518 + 314 - actionSqlFind - toggled(bool) + fileExportJsonAction + triggered() MainWindow - setFindFrameVisibility(bool) + exportTableToJson() -1 -1 - 399 - 34 + 518 + 314 - actionSqlFindReplace + actionRefresh triggered() MainWindow - openFindReplaceDialog() + refresh() -1 -1 - 399 - 34 + 518 + 314 - editCreateTableAction + fileOpenReadOnlyAction triggered() MainWindow - createTable() + fileOpenReadOnly() -1 -1 - 399 - 299 + 518 + 314 - buttonBoxPragmas - rejected() + actionUnlockViewEditing + toggled(bool) MainWindow - loadPragmas() + unlockViewEditing(bool) - 111 - 540 + -1 + -1 - -1 - 470 + 518 + 314 - buttonBoxPragmas - accepted() + actionSqlResultsExportCsv + triggered() MainWindow - savePragmas() + saveSqlResultsAsCsv() - 111 - 540 + -1 + -1 - 802 - 522 + 518 + 314 - buttonLogClear - clicked() - editLogApplication - clear() + actionSqlResultsSaveAsView + triggered() + MainWindow + saveSqlResultsAsView() - 989 - 126 + -1 + -1 - 632 - 173 + 518 + 314 - buttonLogClear - clicked() - editLogUser - clear() + actionHideColumns + triggered() + MainWindow + hideColumns() - 989 - 126 + -1 + -1 - 1028 - 230 + 518 + 314 - comboLogSubmittedBy - currentIndexChanged(int) - stackLog - setCurrentIndex(int) + tabSqlAreas + tabBarDoubleClicked(int) + MainWindow + renameSqlTab(int) - 772 - 135 + 330 + 372 - 1028 - 230 + 518 + 314 - dataTable - doubleClicked(QModelIndex) - MainWindow - doubleClickTable(QModelIndex) + viewProjectToolbarAction + toggled(bool) + toolbarProject + setVisible(bool) - 399 - 211 + -1 + -1 - 399 - 299 + 887 + 44 - tabSqlAreas - tabCloseRequested(int) - MainWindow - closeSqlTab(int) + viewExtraDBToolbarAction + toggled(bool) + toolbarExtraDB + setVisible(bool) - 91 - 259 + -1 + -1 - -1 - 51 + 737 + 44 - tabSqlAreas - currentChanged(int) - MainWindow - changeSqlTab(int) + MainWindow + toolButtonStyleChanged(Qt::ToolButtonStyle) + toolbarDB + setToolButtonStyle(Qt::ToolButtonStyle) - 91 - 259 + 518 + 314 - -1 - 51 + 296 + 44 - actionExecuteSql - triggered() - MainWindow - executeQuery() + MainWindow + toolButtonStyleChanged(Qt::ToolButtonStyle) + toolbarExtraDB + setToolButtonStyle(Qt::ToolButtonStyle) - -1 - -1 + 518 + 314 - 399 - 299 + 737 + 44 - actionSqlOpenTab - triggered() - MainWindow - openSqlTab() + MainWindow + toolButtonStyleChanged(Qt::ToolButtonStyle) + toolbarProject + setToolButtonStyle(Qt::ToolButtonStyle) - -1 - -1 + 518 + 314 - 399 - 299 + 959 + 44 - actionSqlOpenFile + actionFilteredTableExportCsv triggered() MainWindow - openSqlFile() + exportFilteredTable() -1 -1 - 399 - 299 + 518 + 314 - actionSqlSaveFile + actionFilterSaveAsView triggered() MainWindow - saveSqlFile() + saveFilterAsView() -1 -1 - 399 - 299 + 518 + 314 - actionLoadExtension + fileOpenActionPopup triggered() MainWindow - loadExtension() + fileOpen() -1 -1 - 399 - 299 + 518 + 314 - actionSqlExecuteLine + newRecordAction triggered() MainWindow - executeQuery() + addRecord() -1 -1 - 399 - 299 + 518 + 314 - actionExportCsvPopup + insertValuesAction triggered() MainWindow - exportTableToCSV() + insertValues() -1 -1 - 399 - 299 + 20 + 20 - actionOpenProject + fileNewInMemoryDatabaseAction triggered() MainWindow - loadProject() + fileNewInMemoryDatabase() -1 -1 - 399 - 299 + 20 + 20 - actionSaveProject + actionSqlPrint triggered() MainWindow - saveProject() + openSqlPrintDialog() -1 -1 - 399 - 299 + 518 + 314 - fileAttachAction + actionDbPrint triggered() MainWindow - fileAttach() + printDbStructure() -1 -1 - 499 + 518 314 - actionEncryption + actionPrintTable triggered() - MainWindow - editEncryption() + dataTable + openPrintDialog() -1 -1 - 499 - 314 + 326 + 347 - actionSqlSaveFilePopup + actionSqlToggleComment triggered() MainWindow - saveSqlFile() + toggleSqlBlockComment() -1 -1 - 499 + 518 314 - actionSqlSaveFileAs - triggered() + labelPragmaAutomaticIndex + linkHovered(QString) MainWindow - saveSqlFileAs() + showStatusMessage5s(QString) - -1 - -1 + 85 + 133 - 499 + 518 314 - buttonEnd - clicked() + labelPragmaCaseSensitiveLike + linkHovered(QString) MainWindow - navigateEnd() + showStatusMessage5s(QString) - 223 - 539 + 85 + 133 - 499 + 518 314 - buttonBegin - clicked() + labelPragmaCheckpointFullFsync + linkHovered(QString) MainWindow - navigateBegin() + showStatusMessage5s(QString) - 50 - 539 + 85 + 133 - 499 + 518 314 - actionEditBrowseTable - triggered() + labelPragmaForeignKeys + linkHovered(QString) MainWindow - switchToBrowseDataTab() + showStatusMessage5s(QString) - -1 - -1 + 85 + 133 - 499 + 518 314 - actionEditCopyCreateStatement - triggered() + labelPragmaFullFsync + linkHovered(QString) MainWindow - copyCurrentCreateStatement() + showStatusMessage5s(QString) - -1 - -1 + 85 + 133 - 499 + 518 314 - dataTable - foreignKeyClicked(sqlb::ObjectIdentifier,QString,QByteArray) + labelPragmaIgnoreCheckConstraints + linkHovered(QString) MainWindow - jumpToRow(sqlb::ObjectIdentifier,QString,QByteArray) + showStatusMessage5s(QString) - 70 - 242 + 85 + 133 518 @@ -3014,14 +3988,14 @@ - actionBrowseTableEditDisplayFormat - triggered() + labelPragmaJournalMode + linkHovered(QString) MainWindow - editDataColumnDisplayFormat() + showStatusMessage5s(QString) - -1 - -1 + 85 + 133 518 @@ -3030,14 +4004,14 @@ - actionShowRowidColumn - triggered(bool) + labelPragmaLockingMode + linkHovered(QString) MainWindow - showRowidColumn(bool) + showStatusMessage5s(QString) - -1 - -1 + 85 + 133 518 @@ -3046,14 +4020,14 @@ - actionSetTableEncoding - triggered() + labelPragmaMaxPageCount + linkHovered(QString) MainWindow - browseDataSetTableEncoding() + showStatusMessage5s(QString) - -1 - -1 + 85 + 133 518 @@ -3062,14 +4036,14 @@ - actionSetAllTablesEncoding - triggered() + labelPragmaPageSize + linkHovered(QString) MainWindow - browseDataSetDefaultTableEncoding() + showStatusMessage5s(QString) - -1 - -1 + 85 + 133 518 @@ -3078,14 +4052,14 @@ - fileExportJsonAction - triggered() + labelPragmaRecursiveTriggers + linkHovered(QString) MainWindow - exportTableToJson() + showStatusMessage5s(QString) - -1 - -1 + 85 + 133 518 @@ -3094,14 +4068,14 @@ - actionRefresh - triggered() + labelPragmaSecureDelete + linkHovered(QString) MainWindow - refresh() + showStatusMessage5s(QString) - -1 - -1 + 85 + 133 518 @@ -3110,14 +4084,14 @@ - fileOpenReadOnlyAction - triggered() + labelPragmaSynchronous + linkHovered(QString) MainWindow - fileOpenReadOnly() + showStatusMessage5s(QString) - -1 - -1 + 85 + 133 518 @@ -3126,14 +4100,14 @@ - actionUnlockViewEditing - toggled(bool) + labelPragmaTempStore + linkHovered(QString) MainWindow - unlockViewEditing(bool) + showStatusMessage5s(QString) - -1 - -1 + 85 + 133 518 @@ -3142,14 +4116,14 @@ - actionSqlResultsExportCsv - triggered() + labelPragmaUserVersion + linkHovered(QString) MainWindow - saveSqlResultsAsCsv() + showStatusMessage5s(QString) - -1 - -1 + 85 + 133 518 @@ -3158,14 +4132,14 @@ - actionSqlResultsSaveAsView - triggered() + labelPragmaWalAutoCheckpoint + linkHovered(QString) MainWindow - saveSqlResultsAsView() + showStatusMessage5s(QString) - -1 - -1 + 85 + 133 518 @@ -3174,14 +4148,14 @@ - actionHideColumns - triggered() + labelPragmaAutoVacuum + linkHovered(QString) MainWindow - hideColumns() + showStatusMessage5s(QString) - -1 - -1 + 85 + 133 518 @@ -3190,14 +4164,14 @@ - tabSqlAreas - tabBarDoubleClicked(int) + labelPragmaAutoVacuum + linkHovered(QString) MainWindow - renameSqlTab(int) + showStatusMessage5s(QString) - 330 - 372 + 85 + 133 518 @@ -3206,14 +4180,14 @@ - buttonSaveFilterAsView - clicked() + labelJournalSizeLimit + linkHovered(QString) MainWindow - saveFilterAsView() + showStatusMessage5s(QString) - 290 - 127 + 99 + 345 518 @@ -3222,83 +4196,51 @@ - viewProjectToolbarAction - toggled(bool) - toolbarProject - setVisible(bool) + actionSaveProjectAs + triggered() + MainWindow + saveProjectAs() -1 -1 - 887 - 44 + 518 + 314 - viewExtraDBToolbarAction - toggled(bool) - toolbarExtraDB - setVisible(bool) + actionSaveAll + triggered() + MainWindow + saveAll() -1 -1 - 737 - 44 - - - - - MainWindow - toolButtonStyleChanged(Qt::ToolButtonStyle) - toolbarDB - setToolButtonStyle(Qt::ToolButtonStyle) - - 518 314 - - 296 - 44 - - MainWindow - toolButtonStyleChanged(Qt::ToolButtonStyle) - toolbarExtraDB - setToolButtonStyle(Qt::ToolButtonStyle) + actionNewRecord + triggered() + MainWindow + addRecord() - 518 - 314 + -1 + -1 - 737 - 44 - - - - - MainWindow - toolButtonStyleChanged(Qt::ToolButtonStyle) - toolbarProject - setToolButtonStyle(Qt::ToolButtonStyle) - - 518 314 - - 959 - 44 - @@ -3370,5 +4312,6 @@ changeSqlTab(int) hideColumns() renameSqlTab(int) + fileNewInMemoryDatabase() diff -Nru sqlitebrowser-3.10.100ubuntu1/src/Palette.cpp sqlitebrowser-3.11.1/src/Palette.cpp --- sqlitebrowser-3.10.100ubuntu1/src/Palette.cpp 1970-01-01 00:00:00.000000000 +0000 +++ sqlitebrowser-3.11.1/src/Palette.cpp 2019-02-19 23:51:34.000000000 +0000 @@ -0,0 +1,94 @@ +#include "Palette.h" + +#include + +Palette::Palette() + : m_lastColourIndex(0) +{ +} + +QColor Palette::nextSerialColor(bool dark) +{ + if (dark) { + switch(m_lastColourIndex++) + { + case 0: + return QColor(0, 69, 134); + case 1: + return QColor(255, 66, 14); + case 2: + return QColor(255, 211, 32); + case 3: + return QColor(87, 157, 28); + case 4: + return QColor(126, 0, 33); + case 5: + return QColor(131, 202, 255); + case 6: + return QColor(49, 64, 4); + case 7: + return QColor(174, 207, 0); + case 8: + return QColor(75, 31, 111); + case 9: + return QColor(255, 149, 14); + case 10: + return QColor(197, 00, 11); + case 11: + + // Since this is the last colour in our table, reset the counter back + // to the first colour + m_lastColourIndex = 0; + + return QColor(0, 132, 209); + default: + // NOTE: This shouldn't happen! + m_lastColourIndex = 0; + return QColor(0, 0, 0); + } + } else { + // TODO: review the bright colours + switch(m_lastColourIndex++) + { + case 0: + return QColor(Qt::yellow); + case 1: + return QColor(Qt::cyan); + case 2: + return QColor(Qt::green); + case 3: + return QColor(Qt::magenta); + case 4: + return QColor(Qt::lightGray); + case 5: + return QColor("beige"); + case 6: + return QColor("lightblue"); + case 7: + return QColor("turquoise"); + case 8: + return QColor("mediumspringgreen"); + case 9: + return QColor("lightskyblue"); + case 10: + return QColor("moccasin"); + case 11: + + // Since this is the last colour in our table, reset the counter back + // to the first colour + m_lastColourIndex = 0; + + return QColor("pink"); + default: + // NOTE: This shouldn't happen! + return QColor(0, 0, 0); + } + } +} + +bool Palette::appHasDarkTheme() +{ + QColor backgroundColour = QPalette().color(QPalette::Active, QPalette::Base); + QColor foregroundColour = QPalette().color(QPalette::Active, QPalette::Text); + return backgroundColour.value() < foregroundColour.value(); +} diff -Nru sqlitebrowser-3.10.100ubuntu1/src/Palette.h sqlitebrowser-3.11.1/src/Palette.h --- sqlitebrowser-3.10.100ubuntu1/src/Palette.h 1970-01-01 00:00:00.000000000 +0000 +++ sqlitebrowser-3.11.1/src/Palette.h 2019-02-19 23:51:34.000000000 +0000 @@ -0,0 +1,21 @@ +#ifndef PALETTE_H +#define PALETTE_H + +#include + +// Class providing series of colours in a given dark or light side of +// the spectrum. +class Palette +{ +public: + Palette(); + + QColor nextSerialColor(bool dark = true); + + static bool appHasDarkTheme(); + +private: + int m_lastColourIndex; +}; + +#endif diff -Nru sqlitebrowser-3.10.100ubuntu1/src/PlotDock.cpp sqlitebrowser-3.11.1/src/PlotDock.cpp --- sqlitebrowser-3.10.100ubuntu1/src/PlotDock.cpp 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/src/PlotDock.cpp 2019-02-19 23:51:34.000000000 +0000 @@ -5,6 +5,9 @@ #include "FileDialog.h" #include "MainWindow.h" // Just for BrowseDataTableSettings, not for the actual main window class +#include +#include + PlotDock::PlotDock(QWidget* parent) : QDialog(parent), ui(new Ui::PlotDock), @@ -40,18 +43,28 @@ QShortcut* shortcutCopy = new QShortcut(QKeySequence::Copy, ui->plotWidget, nullptr, nullptr, Qt::WidgetShortcut); connect(shortcutCopy, SIGNAL(activated()), this, SLOT(copy())); + QShortcut* shortcutPrint = new QShortcut(QKeySequence::Print, ui->plotWidget, nullptr, nullptr, Qt::WidgetShortcut); + connect(shortcutPrint, &QShortcut::activated, this, &PlotDock::openPrintDialog); + ui->plotWidget->setContextMenuPolicy(Qt::CustomContextMenu); // Set up context menu m_contextMenu = new QMenu(this); + QAction* copyAction = new QAction(QIcon(":/icons/copy"), tr("Copy"), m_contextMenu); copyAction->setShortcut(shortcutCopy->key()); m_contextMenu->addAction(copyAction); - connect(copyAction, &QAction::triggered, [&]() { copy(); }); + QAction* printAction = new QAction(QIcon(":/icons/print"), tr("Print..."), m_contextMenu); + printAction->setShortcut(shortcutPrint->key()); + m_contextMenu->addAction(printAction); + connect(printAction, &QAction::triggered, [&]() { + openPrintDialog(); + }); + QAction* showLegendAction = new QAction(tr("Show legend"), m_contextMenu); showLegendAction->setCheckable(true); m_contextMenu->addAction(showLegendAction); @@ -127,8 +140,6 @@ if(model) { - model->waitForFetchingFinished(); - // Add each column with a supported data type to the column selection view for(int i=0;icolumnCount();++i) { @@ -292,57 +303,59 @@ // prepare the data vectors for qcustomplot // possible improvement might be a QVector subclass that directly // access the model data, to save memory, we are copying here - QVector xdata(model->rowCount()), ydata(model->rowCount()), tdata(model->rowCount()); + + auto nrows = model->rowCount(); + + QVector xdata(nrows), ydata(nrows), tdata(nrows); QVector labels; - for(int i = 0; i < model->rowCount(); ++i) + for(int j = 0; j < nrows; ++j) { - tdata[i] = i; + tdata[j] = j; // convert x type axis if it's datetime switch (xtype) { case QVariant::DateTime: case QVariant::Date: { - QString s = model->data(model->index(i, x)).toString(); + QString s = model->data(model->index(j, x)).toString(); QDateTime d = QDateTime::fromString(s, Qt::ISODate); - xdata[i] = d.toMSecsSinceEpoch() / 1000.0; + xdata[j] = d.toMSecsSinceEpoch() / 1000.0; break; } case QVariant::Time: { - QString s = model->data(model->index(i, x)).toString(); + QString s = model->data(model->index(j, x)).toString(); QTime t = QTime::fromString(s); - xdata[i] = t.msecsSinceStartOfDay() / 1000.0; + xdata[j] = t.msecsSinceStartOfDay() / 1000.0; break; } case QVariant::String: { - xdata[i] = i+1; - labels << model->data(model->index(i, x)).toString(); + xdata[j] = j+1; + labels << model->data(model->index(j, x)).toString(); break; } default: { // Get the x value for this point. If the selected column is -1, i.e. the row number, just use the current row number from the loop // instead of retrieving some value from the model. if(x == RowNumId) - xdata[i] = i+1; - + xdata[j] = j+1; else - xdata[i] = model->data(model->index(i, x)).toDouble(); + xdata[j] = model->data(model->index(j, x)).toDouble(); } } - if (i != 0) - isSorted &= (xdata[i-1] <= xdata[i]); + if (j != 0) + isSorted &= (xdata[j-1] <= xdata[j]); // Get the y value for this point. If the selected column is -1, i.e. the row number, just use the current row number from the loop // instead of retrieving some value from the model. QVariant pointdata; if(column == RowNumId) - pointdata = i+1; + pointdata = j+1; else - pointdata = model->data(model->index(i, column), Qt::EditRole); + pointdata = model->data(model->index(j, column), Qt::EditRole); if(pointdata.isNull()) - ydata[i] = qQNaN(); + ydata[j] = qQNaN(); else - ydata[i] = pointdata.toDouble(); + ydata[j] = pointdata.toDouble(); } // Line type and point shape are not supported by the String X type (Bars) @@ -379,7 +392,7 @@ plottable = graph; graph->setData(xdata, ydata, /*alreadySorted*/ true); // set some graph styles not supported by the abstract plottable - graph->setLineStyle((QCPGraph::LineStyle) ui->comboLineType->currentIndex()); + graph->setLineStyle(static_cast(ui->comboLineType->currentIndex())); graph->setScatterStyle(scatterStyle); } else { QCPCurve* curve = new QCPCurve(ui->plotWidget->xAxis, ui->plotWidget->yAxis); @@ -423,12 +436,11 @@ ui->plotWidget->replot(); // Warn user if not all data has been fetched and hint about the button for loading all the data - if (ui->plotWidget->plottableCount() > 0 && model->canFetchMore()) { + if (model && (model->rowCountAvailable() != SqliteTableModel::RowCount::Complete || !model->isCacheComplete())) { ui->buttonLoadAllData->setEnabled(true); ui->buttonLoadAllData->setStyleSheet("QToolButton {color: white; background-color: rgb(255, 102, 102)}"); ui->buttonLoadAllData->setToolTip(tr("Load all data and redraw plot.\n" "Warning: not all data has been fetched from the table yet due to the partial fetch mechanism.")); - QToolTip::showText(ui->buttonLoadAllData->mapToGlobal(QPoint(0, 0)), ui->buttonLoadAllData->toolTip()); } else { ui->buttonLoadAllData->setEnabled(false); ui->buttonLoadAllData->setStyleSheet(""); @@ -479,56 +491,7 @@ // Generate a default colour if none isn't set yet QColor colour = changeitem->backgroundColor(column); if(!colour.isValid()) - { - static int last_colour_index = 0; - switch(last_colour_index++) - { - case 0: - colour = QColor(0, 69, 134); - break; - case 1: - colour = QColor(255, 66, 14); - break; - case 2: - colour = QColor(255, 211, 32); - break; - case 3: - colour = QColor(87, 157, 28); - break; - case 4: - colour = QColor(126, 0, 33); - break; - case 5: - colour = QColor(131, 202, 255); - break; - case 6: - colour = QColor(49, 64, 4); - break; - case 7: - colour = QColor(174, 207, 0); - break; - case 8: - colour = QColor(75, 31, 111); - break; - case 9: - colour = QColor(255, 149, 14); - break; - case 10: - colour = QColor(197, 00, 11); - break; - case 11: - colour = QColor(0, 132, 209); - - // Since this is the last colour in our table, reset the counter back - // to the first colour - last_colour_index = 0; - break; - default: - // NOTE: This shouldn't happen! - colour = QColor(0, 0, 0); - break; - } - } + colour = m_graphPalette.nextSerialColor(true); // Set colour changeitem->setBackgroundColor(column, colour); @@ -561,7 +524,7 @@ // On double click open the colordialog QColorDialog colordialog(this); QColor curbkcolor = item->backgroundColor(column); - QColor precolor = !curbkcolor.isValid() ? (Qt::GlobalColor)(qrand() % 13 + 5) : curbkcolor; + QColor precolor = !curbkcolor.isValid() ? static_cast(qrand() % 13 + 5) : curbkcolor; QColor color = colordialog.getColor(precolor, this, tr("Choose an axis color")); if(color.isValid()) { @@ -593,10 +556,11 @@ void PlotDock::on_butSavePlot_clicked() { - QString fileName = FileDialog::getSaveFileName(this, - tr("Choose a filename to save under"), - tr("PNG(*.png);;JPG(*.jpg);;PDF(*.pdf);;BMP(*.bmp);;All Files(*)") - ); + QString fileName = FileDialog::getSaveFileName( + CreateDataFile, + this, + tr("Choose a filename to save under"), + tr("PNG(*.png);;JPG(*.jpg);;PDF(*.pdf);;BMP(*.bmp);;All Files(*)")); if(!fileName.isEmpty()) { if(fileName.endsWith(".png", Qt::CaseInsensitive)) @@ -629,7 +593,7 @@ index <= QCPGraph::lsImpulse); bool hasCurves = (ui->plotWidget->plottableCount() > ui->plotWidget->graphCount()); - QCPGraph::LineStyle lineStyle = (QCPGraph::LineStyle) index; + QCPGraph::LineStyle lineStyle = static_cast(index); if (lineStyle > QCPGraph::lsLine && hasCurves) { QMessageBox::warning(this, qApp->applicationName(), tr("There are curves in this plot and the selected line style can only be applied to graphs sorted by X. " @@ -671,7 +635,7 @@ index < QCPScatterStyle::ssPixmap); bool hasCurves = (ui->plotWidget->plottableCount() > ui->plotWidget->graphCount()); - QCPScatterStyle::ScatterShape shape = (QCPScatterStyle::ScatterShape) index; + QCPScatterStyle::ScatterShape shape = static_cast(index); for (int i = 0, ie = ui->plotWidget->graphCount(); i < ie; ++i) { QCPGraph * graph = ui->plotWidget->graph(i); @@ -733,25 +697,8 @@ { if(m_currentPlotModel) { - // Show progress dialog because fetching all data might take some time - QProgressDialog progress(tr("Fetching all data..."), - tr("Cancel"), m_currentPlotModel->rowCount(), m_currentPlotModel->totalRowCount()); - progress.setWindowModality(Qt::ApplicationModal); - progress.show(); - qApp->processEvents(); - // Make sure all data is loaded - while(m_currentPlotModel->canFetchMore()) - { - // Fetch the next bunch of data - m_currentPlotModel->fetchMore(); - - // Update the progress dialog and stop loading data when the cancel button was pressed - progress.setValue(m_currentPlotModel->rowCount()); - qApp->processEvents(); - if(progress.wasCanceled()) - break; - } + m_currentPlotModel->completeCache(); // Update plot updatePlot(m_currentPlotModel, m_currentTableSettings); @@ -829,10 +776,15 @@ void PlotDock::adjustBars() { const double padding = 0.15; - const double groupedWidth = ui->plotWidget->plottableCount()? 1.0 / ui->plotWidget->plottableCount() : 0.0; + int plottableCount = ui->plotWidget->plottableCount(); + + if (plottableCount == 0) + return; + + const double groupedWidth = 1.0 / plottableCount; QCPBars* previousBar = nullptr; - QCPBarsGroup* barsGroup = m_stackedBars? nullptr : new QCPBarsGroup(ui->plotWidget); - for (int i = 0, ie = ui->plotWidget->plottableCount(); i < ie; ++i) + QCPBarsGroup* barsGroup = m_stackedBars ? nullptr : new QCPBarsGroup(ui->plotWidget); + for (int i = 0, ie = plottableCount; i < ie; ++i) { QCPBars* bar = qobject_cast(ui->plotWidget->plottable(i)); if (bar) { @@ -868,3 +820,27 @@ // dock go away return; } + +void PlotDock::openPrintDialog() +{ + QPrinter printer; + QPrintPreviewDialog previewDialog(&printer, this); + connect(&previewDialog, &QPrintPreviewDialog::paintRequested, this, &PlotDock::renderPlot); + previewDialog.exec(); +} + +void PlotDock::renderPlot(QPrinter* printer) +{ + QCPPainter painter(printer); + QRectF pageRect = printer->pageRect(QPrinter::DevicePixel); + + int plotWidth = ui->plotWidget->viewport().width(); + int plotHeight = ui->plotWidget->viewport().height(); + double scale = pageRect.width()/static_cast(plotWidth); + + painter.setMode(QCPPainter::pmVectorized); + painter.setMode(QCPPainter::pmNoCaching); + + painter.scale(scale, scale); + ui->plotWidget->toPainter(&painter, plotWidth, plotHeight); +} diff -Nru sqlitebrowser-3.10.100ubuntu1/src/PlotDock.h sqlitebrowser-3.11.1/src/PlotDock.h --- sqlitebrowser-3.10.100ubuntu1/src/PlotDock.h 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/src/PlotDock.h 2019-02-19 23:51:34.000000000 +0000 @@ -1,12 +1,15 @@ #ifndef PLOTDOCK_H #define PLOTDOCK_H +#include "Palette.h" + #include #include #include class SqliteTableModel; class QTreeWidgetItem; +class QPrinter; struct BrowseDataTableSettings; namespace Ui { @@ -19,7 +22,7 @@ public: explicit PlotDock(QWidget* parent = nullptr); - ~PlotDock(); + ~PlotDock() override; struct PlotSettings { @@ -67,7 +70,7 @@ void updatePlot(SqliteTableModel* model, BrowseDataTableSettings* settings = nullptr, bool update = true, bool keepOrResetSelection = true); void fetchAllData(); void resetPlot(); - virtual void reject(); + void reject() override; signals: void pointsSelected(int firstIndex, int count); @@ -88,6 +91,7 @@ QMenu* m_contextMenu; bool m_showLegend; bool m_stackedBars; + Palette m_graphPalette; /*! * \brief guessdatatype try to parse the first 10 rows and decide the datatype @@ -110,6 +114,8 @@ void copy(); void toggleLegendVisible(bool visible); void toggleStackedBars(bool stacked); + void openPrintDialog(); + void renderPlot(QPrinter* printer); }; #endif diff -Nru sqlitebrowser-3.10.100ubuntu1/src/PlotDock.ui sqlitebrowser-3.11.1/src/PlotDock.ui --- sqlitebrowser-3.10.100ubuntu1/src/PlotDock.ui 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/src/PlotDock.ui 2019-02-19 23:51:34.000000000 +0000 @@ -110,6 +110,18 @@ + + + 0 + 0 + + + + + 50 + 0 + + 1 @@ -157,6 +169,18 @@ + + + 0 + 0 + + + + + 50 + 0 + + 0 diff -Nru sqlitebrowser-3.10.100ubuntu1/src/PreferencesDialog.cpp sqlitebrowser-3.11.1/src/PreferencesDialog.cpp --- sqlitebrowser-3.10.100ubuntu1/src/PreferencesDialog.cpp 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/src/PreferencesDialog.cpp 2019-02-19 23:51:34.000000000 +0000 @@ -13,10 +13,10 @@ #include #include -PreferencesDialog::PreferencesDialog(QWidget* parent) +PreferencesDialog::PreferencesDialog(QWidget* parent, Tabs tab) : QDialog(parent), ui(new Ui::PreferencesDialog), - m_dbFileExtensions(FileDialog::getSqlDatabaseFileFilter().split(";;")) + m_dbFileExtensions(Settings::getValue("General", "DBFileExtensions").toString().split(";;")) { ui->setupUi(this); ui->treeSyntaxHighlighting->setColumnHidden(0, true); @@ -40,6 +40,12 @@ #endif loadSettings(); + + // Avoid different heights due to having check boxes or not + ui->treeSyntaxHighlighting->setUniformRowHeights(true); + + // Set current tab + ui->tabWidget->setCurrentIndex(tab); } /* @@ -53,6 +59,7 @@ void PreferencesDialog::chooseLocation() { QString s = FileDialog::getExistingDirectory( + NoSpecificType, this, tr("Choose a directory"), QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks); @@ -73,11 +80,11 @@ ui->spinPrefetchSize->setValue(Settings::getValue("db", "prefetchsize").toInt()); ui->editDatabaseDefaultSqlText->setText(Settings::getValue("db", "defaultsqltext").toString()); - ui->defaultFieldTypeComboBox->addItems(sqlb::Field::Datatypes); + ui->defaultFieldTypeComboBox->addItems(DBBrowserDB::Datatypes); int defaultFieldTypeIndex = Settings::getValue("db", "defaultfieldtype").toInt(); - if (defaultFieldTypeIndex < sqlb::Field::Datatypes.count()) + if (defaultFieldTypeIndex < DBBrowserDB::Datatypes.count()) { ui->defaultFieldTypeComboBox->setCurrentIndex(defaultFieldTypeIndex); } @@ -97,6 +104,7 @@ loadColorSetting(ui->fr_reg_bg, "reg_bg"); ui->spinSymbolLimit->setValue(Settings::getValue("databrowser", "symbol_limit").toInt()); + ui->spinCompleteThreshold->setValue(Settings::getValue("databrowser", "complete_threshold").toInt()); ui->txtNull->setText(Settings::getValue("databrowser", "null_text").toString()); ui->txtBlob->setText(Settings::getValue("databrowser", "blob_text").toString()); ui->editFilterEscape->setText(Settings::getValue("databrowser", "filter_escape").toString()); @@ -168,6 +176,7 @@ ui->spinTabSize->setValue(Settings::getValue("editor", "tabsize").toInt()); ui->spinLogFontSize->setValue(Settings::getValue("log", "fontsize").toInt()); ui->wrapComboBox->setCurrentIndex(Settings::getValue("editor", "wrap_lines").toInt()); + ui->quoteComboBox->setCurrentIndex(Settings::getValue("editor", "identifier_quotes").toInt()); ui->checkAutoCompletion->setChecked(Settings::getValue("editor", "auto_completion").toBool()); ui->checkCompleteUpper->setEnabled(Settings::getValue("editor", "auto_completion").toBool()); ui->checkCompleteUpper->setChecked(Settings::getValue("editor", "upper_keywords").toBool()); @@ -176,8 +185,13 @@ ui->listExtensions->addItems(Settings::getValue("extensions", "list").toStringList()); ui->checkRegexDisabled->setChecked(Settings::getValue("extensions", "disableregex").toBool()); + ui->checkAllowLoadExtension->setChecked(Settings::getValue("extensions", "enable_load_extension").toBool()); fillLanguageBox(); - ui->toolbarStyleComboBox->setCurrentIndex(Settings::getValue("General", "toolbarStyle").toInt()); + ui->toolbarStyleComboMain->setCurrentIndex(Settings::getValue("General", "toolbarStyle").toInt()); + ui->toolbarStyleComboStructure->setCurrentIndex(Settings::getValue("General", "toolbarStyleStructure").toInt()); + ui->toolbarStyleComboBrowse->setCurrentIndex(Settings::getValue("General", "toolbarStyleBrowse").toInt()); + ui->toolbarStyleComboSql->setCurrentIndex(Settings::getValue("General", "toolbarStyleSql").toInt()); + ui->toolbarStyleComboEditCell->setCurrentIndex(Settings::getValue("General", "toolbarStyleEditCell").toInt()); } void PreferencesDialog::saveSettings() @@ -205,6 +219,7 @@ saveColorSetting(ui->fr_bin_fg, "bin_fg"); saveColorSetting(ui->fr_bin_bg, "bin_bg"); Settings::setValue("databrowser", "symbol_limit", ui->spinSymbolLimit->value()); + Settings::setValue("databrowser", "complete_threshold", ui->spinCompleteThreshold->value()); Settings::setValue("databrowser", "null_text", ui->txtNull->text()); Settings::setValue("databrowser", "blob_text", ui->txtBlob->text()); Settings::setValue("databrowser", "filter_escape", ui->editFilterEscape->text()); @@ -223,6 +238,7 @@ Settings::setValue("editor", "tabsize", ui->spinTabSize->value()); Settings::setValue("log", "fontsize", ui->spinLogFontSize->value()); Settings::setValue("editor", "wrap_lines", ui->wrapComboBox->currentIndex()); + Settings::setValue("editor", "identifier_quotes", ui->quoteComboBox->currentIndex()); Settings::setValue("editor", "auto_completion", ui->checkAutoCompletion->isChecked()); Settings::setValue("editor", "upper_keywords", ui->checkCompleteUpper->isChecked()); Settings::setValue("editor", "error_indicators", ui->checkErrorIndicators->isChecked()); @@ -233,6 +249,7 @@ extList.append(item->text()); Settings::setValue("extensions", "list", extList); Settings::setValue("extensions", "disableregex", ui->checkRegexDisabled->isChecked()); + Settings::setValue("extensions", "enable_load_extension", ui->checkAllowLoadExtension->isChecked()); // Save remote settings Settings::setValue("remote", "active", ui->checkUseRemotes->isChecked()); @@ -254,7 +271,13 @@ // This is a new certificate. Copy file to a safe place. // Generate unique destination file name - QString copy_to = QStandardPaths::writableLocation(QStandardPaths::AppDataLocation).append("/").append(QFileInfo(path).fileName()); + QString copy_to = QStandardPaths::writableLocation( +#if QT_VERSION >= QT_VERSION_CHECK(5, 4, 0) + QStandardPaths::AppDataLocation +#else + QStandardPaths::GenericDataLocation +#endif + ).append("/").append(QFileInfo(path).fileName()); int suffix = 0; do { @@ -263,7 +286,13 @@ // Copy file copy_to.append(QString::number(suffix)); - QDir().mkpath(QStandardPaths::writableLocation(QStandardPaths::AppDataLocation)); + QDir().mkpath(QStandardPaths::writableLocation( +#if QT_VERSION >= QT_VERSION_CHECK(5, 4, 0) + QStandardPaths::AppDataLocation +#else + QStandardPaths::GenericDataLocation +#endif + )); QFile::copy(path, copy_to); new_client_certs.push_back(copy_to); @@ -284,7 +313,13 @@ tr("The language will change after you restart the application.")); Settings::setValue("General", "language", newLanguage); - Settings::setValue("General", "toolbarStyle", ui->toolbarStyleComboBox->currentIndex()); + + Settings::setValue("General", "toolbarStyle", ui->toolbarStyleComboMain->currentIndex()); + Settings::setValue("General", "toolbarStyleStructure", ui->toolbarStyleComboStructure->currentIndex()); + Settings::setValue("General", "toolbarStyleBrowse", ui->toolbarStyleComboBrowse->currentIndex()); + Settings::setValue("General", "toolbarStyleSql", ui->toolbarStyleComboSql->currentIndex()); + Settings::setValue("General", "toolbarStyleEditCell", ui->toolbarStyleComboEditCell->currentIndex()); + Settings::setValue("General", "DBFileExtensions", m_dbFileExtensions.join(";;") ); accept(); @@ -347,9 +382,10 @@ void PreferencesDialog::addExtension() { QString file = FileDialog::getOpenFileName( + OpenExtensionFile, this, tr("Select extension file"), - tr("Extensions(*.so *.dll);;All files(*)")); + tr("Extensions(*.so *.dylib *.dll);;All files(*)")); if(QFile::exists(file)) ui->listExtensions->addItem(file); @@ -482,7 +518,7 @@ { // Get certificate file to import and abort here if no file gets selected // NOTE: We assume here that this file contains both, certificate and private key! - QString path = FileDialog::getOpenFileName(this, tr("Import certificate file"), "*.pem"); + QString path = FileDialog::getOpenFileName(OpenCertificateFile, this, tr("Import certificate file"), "*.pem"); if(path.isEmpty()) return; @@ -554,6 +590,7 @@ void PreferencesDialog::chooseRemoteCloneDirectory() { QString s = FileDialog::getExistingDirectory( + NoSpecificType, this, tr("Choose a directory"), QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks); diff -Nru sqlitebrowser-3.10.100ubuntu1/src/PreferencesDialog.h sqlitebrowser-3.11.1/src/PreferencesDialog.h --- sqlitebrowser-3.10.100ubuntu1/src/PreferencesDialog.h 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/src/PreferencesDialog.h 2019-02-19 23:51:34.000000000 +0000 @@ -7,7 +7,6 @@ class QTreeWidgetItem; class QFrame; -class QTableWidget; class QSslCertificate; class QAbstractButton; @@ -20,20 +19,30 @@ Q_OBJECT public: - explicit PreferencesDialog(QWidget* parent = nullptr); - ~PreferencesDialog(); + enum Tabs + { + TabGeneral, + TabDatabase, + TabDataBrowser, + TabSql, + TabExtensions, + TabRemote + }; + + explicit PreferencesDialog(QWidget* parent = nullptr, Tabs tab = TabGeneral); + ~PreferencesDialog() override; private slots: - virtual void loadSettings(); - virtual void saveSettings(); + void loadSettings(); + void saveSettings(); - virtual void chooseLocation(); - virtual void showColourDialog(QTreeWidgetItem* item, int column); - virtual void addExtension(); - virtual void removeExtension(); - virtual void activateRemoteTab(bool active); - virtual void addClientCertificate(); - virtual void removeClientCertificate(); + void chooseLocation(); + void showColourDialog(QTreeWidgetItem* item, int column); + void addExtension(); + void removeExtension(); + void activateRemoteTab(bool active); + void addClientCertificate(); + void removeClientCertificate(); void chooseRemoteCloneDirectory(); void updatePreviewFont(); @@ -52,7 +61,7 @@ void addClientCertToTable(const QString& path, const QSslCertificate& cert); protected: - bool eventFilter(QObject *obj, QEvent *event); + bool eventFilter(QObject *obj, QEvent *event) override; }; #endif diff -Nru sqlitebrowser-3.10.100ubuntu1/src/PreferencesDialog.ui sqlitebrowser-3.11.1/src/PreferencesDialog.ui --- sqlitebrowser-3.10.100ubuntu1/src/PreferencesDialog.ui 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/src/PreferencesDialog.ui 2019-02-19 23:51:34.000000000 +0000 @@ -6,8 +6,8 @@ 0 0 - 597 - 614 + 755 + 594 @@ -128,12 +128,12 @@ Toolbar style - languageComboBox + toolbarStyleComboMain - - + + 0 @@ -182,14 +182,167 @@ - + + + + + 0 + 0 + + + + 2 + + + QComboBox::AdjustToContents + + + 35 + + + + 20 + 15 + + + + + Only display the icon + + + + + Only display the text + + + + + The text appears beside the icon + + + + + The text appears under the icon + + + + + Follow the style + + + + + + + + + 0 + 0 + + + + 0 + + + QComboBox::AdjustToContents + + + 35 + + + + 20 + 15 + + + + + Only display the icon + + + + + Only display the text + + + + + The text appears beside the icon + + + + + The text appears under the icon + + + + + Follow the style + + + + + + + + + 0 + 0 + + + + 0 + + + QComboBox::AdjustToContents + + + 35 + + + + 20 + 15 + + + + + Only display the icon + + + + + Only display the text + + + + + The text appears beside the icon + + + + + The text appears under the icon + + + + + Follow the style + + + + + Show remote options + + checkUseRemotes + - + enabled @@ -199,7 +352,7 @@ - + Automatic &updates @@ -209,27 +362,145 @@ - + enabled - + DB file extensions + + buttonManageFileExtension + - + Manage + + + + Main Window + + + 20 + + + toolbarStyleComboMain + + + + + + + Database Structure + + + 20 + + + toolbarStyleComboStructure + + + + + + + Browse Data + + + 20 + + + toolbarStyleComboBrowse + + + + + + + Execute SQL + + + 20 + + + toolbarStyleComboSql + + + + + + + + 0 + 0 + + + + 0 + + + QComboBox::AdjustToContents + + + 35 + + + + 20 + 15 + + + + + Only display the icon + + + + + Only display the text + + + + + The text appears beside the icon + + + + + The text appears under the icon + + + + + Follow the style + + + + + + + + Edit Database Cell + + + 20 + + + toolbarStyleComboEditCell + + + @@ -296,6 +567,9 @@ + + When enabled, the line breaks in the Schema column of the DB Structure tab, dock and printed output are removed. + enabled @@ -382,6 +656,9 @@ Default field type + + defaultFieldTypeComboBox + @@ -460,15 +737,49 @@ - - - - - - - Field display - - + + + + + 0 + 0 + + + + This is the maximum number of rows in a table for enabling the value completion based on current values in the column. +Can be set to 0 for disabling completion. + + + This is the maximum number of rows in a table for enabling the value completion based on current values in the column. +Can be set to 0 for disabling completion. + + + 0 + + + 100000000 + + + + + + + Row count threshold for completion + + + spinCompleteThreshold + + + + + + + + + + Field display + + @@ -660,7 +971,7 @@ - Preview only (N/A) + Preview only (N/A) true @@ -920,24 +1231,44 @@ - - + + - SQL &editor font size + SQL editor &font - spinEditorFontSize + comboEditorFont - - - - 1 - - + + + + + + + + + SQL &editor font size + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + spinEditorFontSize + + + + + + + 1 + + + + - + SQL &results font size @@ -947,14 +1278,14 @@ - + 1 - + Tab size @@ -964,7 +1295,7 @@ - + 1 @@ -977,20 +1308,76 @@ - - + + - SQL editor &font + &Wrap lines - comboEditorFont + wrapComboBox - - + + + + + Never + + + + + At word boundaries + + + + + At character boundaries + + + + + At whitespace boundaries + + + + + + + + &Quotes for identifiers + + + quoteComboBox + + + + + + + Choose the quoting mechanism used by the application for identifiers in SQL code. + + + + + + + "Double quotes" - Standard SQL (recommended) + + + + + `Grave accents` - Traditional MySQL quotes + + + + + [Square brackets] - Traditional MS SQL Server quotes + + + - + Code co&mpletion @@ -1067,40 +1454,6 @@ - - - - - Never - - - - - At word boundaries - - - - - At character boundaries - - - - - At whitespace boundaries - - - - - - - - Wrap lines - - - wrapComboBox - - - @@ -1180,213 +1533,230 @@ + + + + <html><head/><body><p>SQLite provides an SQL function for loading extensions from a shared library file. Activate this if you want to use the <span style=" font-style:italic;">load_extension()</span> function from SQL code.</p><p>For security reasons, extension loading is turned off by default and must be enabled through this setting. You can always load extensions through the GUI, even though this option is disabled.</p></body></html> + + + Allow loading extensions from SQL code + + + Remote - - - - - CA certificates - - - - - - - - 550 - 0 - - - - QAbstractItemView::SingleSelection - - - QAbstractItemView::SelectRows - - - QAbstractItemView::ScrollPerPixel - - - false - - - - Subject CN - - - Common Name - - - - - Subject O - - - Organization - - - - - Valid from - - - - - Valid to - - - - - Serial number - - - - - - - - Your certificates + + + + + 0 - - - - - - - - - 550 - 0 - - - - QAbstractItemView::ExtendedSelection - - - QAbstractItemView::SelectRows - - - QAbstractItemView::ScrollPerPixel - - - false - - - - File - - - - - Subject CN - - - Subject Common Name - - - - - Issuer CN - - - Issuer Common Name - - - - - Valid from - - - - - Valid to - - - - - Serial number - - - - - - + + + Your certificates + + - - - - :/icons/trigger_create:/icons/trigger_create + + + + 550 + 0 + - - - - - - ... + + QAbstractItemView::ExtendedSelection - - - :/icons/trigger_delete:/icons/trigger_delete + + QAbstractItemView::SelectRows + + + QAbstractItemView::ScrollPerPixel + + false + + + + File + + + + + Subject CN + + + Subject Common Name + + + + + Issuer CN + + + Issuer Common Name + + + + + Valid from + + + + + Valid to + + + + + Serial number + + - - - Qt::Vertical - - + + + + + + :/icons/trigger_create:/icons/trigger_create + + + + + + + ... + + + + :/icons/trigger_delete:/icons/trigger_delete + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + + CA certificates + + + + + - 20 - 40 + 550 + 0 - + + QAbstractItemView::SingleSelection + + + QAbstractItemView::SelectRows + + + QAbstractItemView::ScrollPerPixel + + + false + + + + Subject CN + + + Common Name + + + + + Subject O + + + Organization + + + + + Valid from + + + + + Valid to + + + + + Serial number + + + - - - - - - - Clone databases into - + - - - - - - false - - - - 0 - 0 - - - - - 316 - 0 - - - - - - + + + + - ... + Clone databases into + + + + + + false + + + + 0 + 0 + + + + + 316 + 0 + + + + + + + + ... + + + + + @@ -1418,7 +1788,11 @@ locationEdit setLocationButton languageComboBox - toolbarStyleComboBox + toolbarStyleComboMain + toolbarStyleComboStructure + toolbarStyleComboBrowse + toolbarStyleComboSql + toolbarStyleComboEditCell checkUseRemotes checkUpdates encodingComboBox diff -Nru sqlitebrowser-3.10.100ubuntu1/src/RemoteDatabase.cpp sqlitebrowser-3.11.1/src/RemoteDatabase.cpp --- sqlitebrowser-3.10.100ubuntu1/src/RemoteDatabase.cpp 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/src/RemoteDatabase.cpp 2019-02-19 23:51:34.000000000 +0000 @@ -1,9 +1,10 @@ #include -#include +#include +#include #include -#include +#include #include -#include +#include #include #include #include @@ -11,7 +12,7 @@ #include #include #include -#include +#include #include #include "RemoteDatabase.h" @@ -21,9 +22,17 @@ RemoteDatabase::RemoteDatabase() : m_manager(new QNetworkAccessManager), + m_configurationManager(new QNetworkConfigurationManager), m_progress(nullptr), m_dbLocal(nullptr) { + // Update network configurations + connect(m_configurationManager, &QNetworkConfigurationManager::updateCompleted, [this]() { + m_manager->setConfiguration(m_configurationManager->defaultConfiguration()); + + emit networkReady(); + }); + // Set up SSL configuration m_sslConfiguration = QSslConfiguration::defaultConfiguration(); m_sslConfiguration.setPeerVerifyMode(QSslSocket::VerifyPeer); @@ -205,7 +214,15 @@ branches.append(it.key()); // Get default branch +#if QT_VERSION >= QT_VERSION_CHECK(5, 4, 0) QString default_branch = obj["default_branch"].toString("master"); +#else + QString default_branch = obj["default_branch"].toString(); + if ( default_branch.isEmpty () ) + { + default_branch = "master"; + } +#endif // Send branch list to anyone who is interested emit gotBranchList(branches, default_branch); @@ -534,8 +551,14 @@ return; // Open file - QString database_file = QStandardPaths::writableLocation(QStandardPaths::AppDataLocation) + "/remotedbs.db"; - if(sqlite3_open_v2(database_file.toUtf8(), &m_dbLocal, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, NULL) != SQLITE_OK) + QString database_file = QStandardPaths::writableLocation( +#if QT_VERSION >= QT_VERSION_CHECK(5, 4, 0) + QStandardPaths::AppDataLocation +#else + QStandardPaths::GenericDataLocation +#endif + ) + "/remotedbs.db"; + if(sqlite3_open_v2(database_file.toUtf8(), &m_dbLocal, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, nullptr) != SQLITE_OK) { QMessageBox::warning(nullptr, qApp->applicationName(), tr("Error opening local databases list.\n%1").arg(QString::fromUtf8(sqlite3_errmsg(m_dbLocal)))); return; @@ -553,7 +576,7 @@ "\"modified\" INTEGER DEFAULT 0," "\"branch\" TEXT NOT NULL DEFAULT \"master\"" ")"); - if(sqlite3_exec(m_dbLocal, statement.toUtf8(), NULL, NULL, &errmsg) != SQLITE_OK) + if(sqlite3_exec(m_dbLocal, statement.toUtf8(), nullptr, nullptr, &errmsg) != SQLITE_OK) { QMessageBox::warning(nullptr, qApp->applicationName(), tr("Error creating local databases list.\n%1").arg(QString::fromUtf8(errmsg))); sqlite3_free(errmsg); @@ -755,17 +778,17 @@ // Remove the old entry from the local clones database to enforce a redownload. The file column should be unique for the entire table because the // files are all in the same directory and their names need to be unique because of this. - QString sql = QString("DELETE FROM local WHERE file=?"); - sqlite3_stmt* stmt; - if(sqlite3_prepare_v2(m_dbLocal, sql.toUtf8(), -1, &stmt, nullptr) != SQLITE_OK) + QString delete_sql = QString("DELETE FROM local WHERE file=?"); + sqlite3_stmt* delete_stmt; + if(sqlite3_prepare_v2(m_dbLocal, delete_sql.toUtf8(), -1, &delete_stmt, nullptr) != SQLITE_OK) return QString(); - if(sqlite3_bind_text(stmt, 1, local_file.toUtf8(), local_file.toUtf8().length(), SQLITE_TRANSIENT)) + if(sqlite3_bind_text(delete_stmt, 1, local_file.toUtf8(), local_file.toUtf8().length(), SQLITE_TRANSIENT)) { - sqlite3_finalize(stmt); + sqlite3_finalize(delete_stmt); return QString(); } - sqlite3_step(stmt); - sqlite3_finalize(stmt); + sqlite3_step(delete_stmt); + sqlite3_finalize(delete_stmt); // Return an empty string to indicate a redownload request return QString(); @@ -819,7 +842,7 @@ // Query commit id for that file name QString sql = QString("SELECT commit_id FROM local WHERE identity=? AND url=?"); sqlite3_stmt* stmt; - if(sqlite3_prepare_v2(m_dbLocal, sql.toUtf8(), -1, &stmt, NULL) != SQLITE_OK) + if(sqlite3_prepare_v2(m_dbLocal, sql.toUtf8(), -1, &stmt, nullptr) != SQLITE_OK) return QString(); QFileInfo f(identity); // Remove the path diff -Nru sqlitebrowser-3.10.100ubuntu1/src/RemoteDatabase.h sqlitebrowser-3.11.1/src/RemoteDatabase.h --- sqlitebrowser-3.10.100ubuntu1/src/RemoteDatabase.h 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/src/RemoteDatabase.h 2019-02-19 23:51:34.000000000 +0000 @@ -2,9 +2,10 @@ #define REMOTEDATABASE_H #include -#include +#include class QNetworkAccessManager; +class QNetworkConfigurationManager; class QString; class QNetworkReply; class QSslError; @@ -20,7 +21,7 @@ public: RemoteDatabase(); - virtual ~RemoteDatabase(); + ~RemoteDatabase() override; void reloadSettings(); @@ -50,6 +51,10 @@ const QString& branch = QString("master"), bool forcePush = false); signals: + // As soon as you can safely open a network connection, this signal is emitted. This can be used to delay early network requests + // which might otherwise fail. + void networkReady(); + // The openFile signal is emitted whenever a remote database file shall be opened in the main window. This happens when the // fetch() call for a database is finished, either by actually downloading the database or opening the local clone. void openFile(QString path); @@ -88,6 +93,7 @@ void clearAccessCache(const QString& clientCert); QNetworkAccessManager* m_manager; + QNetworkConfigurationManager* m_configurationManager; QProgressDialog* m_progress; QSslConfiguration m_sslConfiguration; QMap m_clientCertFiles; diff -Nru sqlitebrowser-3.10.100ubuntu1/src/RemoteDock.cpp sqlitebrowser-3.11.1/src/RemoteDock.cpp --- sqlitebrowser-3.10.100ubuntu1/src/RemoteDock.cpp 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/src/RemoteDock.cpp 2019-02-19 23:51:34.000000000 +0000 @@ -1,5 +1,6 @@ -#include +#include #include +#include #include "RemoteDock.h" #include "ui_RemoteDock.h" @@ -8,6 +9,7 @@ #include "RemoteModel.h" #include "MainWindow.h" #include "RemotePushDialog.h" +#include "PreferencesDialog.h" RemoteDock::RemoteDock(MainWindow* parent) : QDialog(parent), @@ -27,6 +29,19 @@ // Whenever a new directory listing has been parsed, check if it was a new root dir and, if so, open the user's directory connect(remoteModel, &RemoteModel::directoryListingParsed, this, &RemoteDock::newDirectoryNode); + // When the Preferences link is clicked in the no-certificates-label, open the preferences dialog. For other links than the ones we know, + // just open them in a web browser + connect(ui->labelNoCert, &QLabel::linkActivated, [this](const QString& link) { + if(link == "#preferences") + { + PreferencesDialog dialog(mainWindow, PreferencesDialog::TabRemote); + if(dialog.exec()) + mainWindow->reloadSettings(); + } else { + QDesktopServices::openUrl(QUrl(link)); + } + }); + // Initial setup reloadSettings(); } @@ -47,6 +62,9 @@ for(const QSslCertificate& cert : certs) ui->comboUser->addItem(cert.subjectInfo(QSslCertificate::CommonName).at(0), file); } + + // If there are no client certs, just show a simple message instead of all the unusable widgets + ui->stack->setCurrentIndex(!ui->comboUser->count()); } void RemoteDock::setNewIdentity() diff -Nru sqlitebrowser-3.10.100ubuntu1/src/RemoteDock.h sqlitebrowser-3.11.1/src/RemoteDock.h --- sqlitebrowser-3.10.100ubuntu1/src/RemoteDock.h 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/src/RemoteDock.h 2019-02-19 23:51:34.000000000 +0000 @@ -17,13 +17,13 @@ public: explicit RemoteDock(MainWindow* parent); - ~RemoteDock(); + ~RemoteDock() override; void reloadSettings(); void enableButtons(); public slots: - virtual void reject(); + void reject() override; private slots: void setNewIdentity(); diff -Nru sqlitebrowser-3.10.100ubuntu1/src/RemoteDock.ui sqlitebrowser-3.11.1/src/RemoteDock.ui --- sqlitebrowser-3.10.100ubuntu1/src/RemoteDock.ui 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/src/RemoteDock.ui 2019-02-19 23:51:34.000000000 +0000 @@ -6,78 +6,159 @@ 0 0 - 575 - 310 + 534 + 298 Remote - + - - - - - Identity - - - comboUser - - - - - - - QComboBox::AdjustToContents - - - - - - - Connect to the remote server using the currently selected identity. The correct server is taken from the identity as well. - - - Go - - - - :/icons/cog_go.png:/icons/cog_go.png - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - Push currently opened database to server - - - - :/icons/push_database:/icons/push_database - - - - - - - - - <html><head/><body><p>In this pane, remote databases from dbhub.io website can be added to DB4S. First you need an identity:</p><ol style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;"><li style=" margin-top:12px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Login to the dbhub.io website (use your GitHub credentials or whatever you want)</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Click the button to create a DB4S certificate (that's your identity). That'll give you a certificate file (save it to your local disk).</li><li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Go to the Remote tab in DB4S Preferences. Click the button to add a new certificate to DB4S and choose the just downloaded certificate file.</li></ol><p>Now the Remote panel shows your identity and you can add remote databases.</p></body></html> + + + 0 + + + + + + + + Identity + + + comboUser + + + + + + + QComboBox::AdjustToContents + + + + + + + Connect to the remote server using the currently selected identity. The correct server is taken from the identity as well. + + + Go + + + + :/icons/cog_go.png:/icons/cog_go.png + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Push currently opened database to server + + + + :/icons/push_database:/icons/push_database + + + + + + + + + <html><head/><body><p>In this pane, remote databases from dbhub.io website can be added to DB4S. First you need an identity:</p><ol style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;"><li style=" margin-top:12px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Login to the dbhub.io website (use your GitHub credentials or whatever you want)</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Click the button to create a DB4S certificate (that's your identity). That'll give you a certificate file (save it to your local disk).</li><li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Go to the Remote tab in DB4S Preferences. Click the button to add a new certificate to DB4S and choose the just downloaded certificate file.</li></ol><p>Now the Remote panel shows your identity and you can add remote databases.</p></body></html> + + + + + + + + + + + Qt::Vertical + + + + 20 + 85 + + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + <html><head/><body><p>No DBHub.io account yet? <a href="https://dbhub.io/"><span style=" text-decoration: underline; color:#007af4;">Create one now</span></a> and import your certificate <a href="#preferences"><span style=" text-decoration: underline; color:#007af4;">here</span></a> to share your databases.</p><p>For online help visit <a href="https://dbhub.io/about"><span style=" text-decoration: underline; color:#007af4;">here</span></a>.</p></body></html> + + + true + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + Qt::Vertical + + + + 20 + 85 + + + + + + diff -Nru sqlitebrowser-3.10.100ubuntu1/src/RemoteModel.cpp sqlitebrowser-3.11.1/src/RemoteModel.cpp --- sqlitebrowser-3.10.100ubuntu1/src/RemoteModel.cpp 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/src/RemoteModel.cpp 2019-02-19 23:51:34.000000000 +0000 @@ -241,9 +241,9 @@ while(size >= 1024.0f && it.hasNext()) { unit = it.next(); - size /= 1024.0; + size /= 1024.0f; } - return QString().setNum(size, 'f', 2).remove(".00") + " " + unit; + return QString().setNum(size, 'f', 2).remove(".00") + QString(" ") + unit; } } } diff -Nru sqlitebrowser-3.10.100ubuntu1/src/RemoteModel.h sqlitebrowser-3.11.1/src/RemoteModel.h --- sqlitebrowser-3.10.100ubuntu1/src/RemoteModel.h 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/src/RemoteModel.h 2019-02-19 23:51:34.000000000 +0000 @@ -61,22 +61,22 @@ public: explicit RemoteModel(QObject* parent, RemoteDatabase& remote); - virtual ~RemoteModel(); + ~RemoteModel() override; void setNewRootDir(const QString& url, const QString& cert); - QModelIndex index(int row, int column,const QModelIndex& parent = QModelIndex()) const; - QModelIndex parent(const QModelIndex& index) const; + QModelIndex index(int row, int column,const QModelIndex& parent = QModelIndex()) const override; + QModelIndex parent(const QModelIndex& index) const override; - QVariant data(const QModelIndex& index, int role) const; - QVariant headerData(int section, Qt::Orientation orientation, int role) const; + QVariant data(const QModelIndex& index, int role) const override; + QVariant headerData(int section, Qt::Orientation orientation, int role) const override; - int rowCount(const QModelIndex& parent = QModelIndex()) const; - int columnCount(const QModelIndex& parent = QModelIndex()) const; - bool hasChildren(const QModelIndex& parent) const; + int rowCount(const QModelIndex& parent = QModelIndex()) const override; + int columnCount(const QModelIndex& parent = QModelIndex()) const override; + bool hasChildren(const QModelIndex& parent) const override; - bool canFetchMore(const QModelIndex& parent) const; - void fetchMore(const QModelIndex& parent); + bool canFetchMore(const QModelIndex& parent) const override; + void fetchMore(const QModelIndex& parent) override; // This helper function takes a model index and returns the according model item. An invalid model index is used to indicate the // root item, so if the index is invalid the root item is returned. This means that if you need to check for actual invalid indices diff -Nru sqlitebrowser-3.10.100ubuntu1/src/RemotePushDialog.h sqlitebrowser-3.11.1/src/RemotePushDialog.h --- sqlitebrowser-3.10.100ubuntu1/src/RemotePushDialog.h 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/src/RemotePushDialog.h 2019-02-19 23:51:34.000000000 +0000 @@ -15,8 +15,8 @@ Q_OBJECT public: - RemotePushDialog(QWidget* parent, RemoteDatabase& remote, const QString& host, const QString& clientCert, const QString& name = QString()); - ~RemotePushDialog(); + explicit RemotePushDialog(QWidget* parent, RemoteDatabase& remote, const QString& host, const QString& clientCert, const QString& name = QString()); + ~RemotePushDialog() override; QString name() const; QString commitMessage() const; @@ -41,7 +41,7 @@ protected slots: void checkInput(); - virtual void accept(); + void accept() override; void reloadBranchList(); diff -Nru sqlitebrowser-3.10.100ubuntu1/src/RemotePushDialog.ui sqlitebrowser-3.11.1/src/RemotePushDialog.ui --- sqlitebrowser-3.10.100ubuntu1/src/RemotePushDialog.ui 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/src/RemotePushDialog.ui 2019-02-19 23:51:34.000000000 +0000 @@ -228,7 +228,7 @@ editName - editingFinished() + textChanged(QString) RemotePushDialog reloadBranchList() diff -Nru sqlitebrowser-3.10.100ubuntu1/src/RowCache.h sqlitebrowser-3.11.1/src/RowCache.h --- sqlitebrowser-3.10.100ubuntu1/src/RowCache.h 1970-01-01 00:00:00.000000000 +0000 +++ sqlitebrowser-3.11.1/src/RowCache.h 2019-02-19 23:51:34.000000000 +0000 @@ -0,0 +1,264 @@ +#ifndef ROW_CACHE_H +#define ROW_CACHE_H + +#include +#include +#include +#include + +/** + + cache structure adapted to the existing access patterns in + SqliteTableModel. handles many large segments with gaps in between + well. + + logical structure resembling a std::vector>, but + implementation avoids actually allocating space for the non-empty + optionals, and supports (hopefully) more efficient insertion / + deletion. + + actually, this is not even a "cache" - once set, elements are never + thrown away to make space for new elements. + + TODO introduce maximum segment size? + +**/ +template +class RowCache +{ +public: + typedef T value_type; + + /// constructs an empty cache + explicit RowCache (); + + /// \returns number of cached rows + size_t numSet () const; + + /// \returns number of segments + size_t numSegments () const; + + /// \returns 1 if specified row is loaded, 0 otherwise + size_t count (size_t pos) const; + + /// \returns specified row. \throws if not available + const T & at (size_t pos) const; + T & at (size_t pos); + + /// assigns value to specified row; may increase numSet() by one + void set (size_t pos, T && value); + + /// insert new element; increases numSet() by one + void insert (size_t pos, T && value); + + /// delete element; decreases numSet() by one + void erase (size_t pos); + + /// reset to state after construction + void clear (); + + /// given a range of rows (end is exclusive), narrow it in order + /// to remove already-loaded rows from both ends. + void smallestNonAvailableRange (size_t & row_begin, size_t & row_end) const; + +private: + /// a single segment containing contiguous entries + struct Segment + { + size_t pos_begin; + std::vector entries; + + /// returns past-the-end position of this segment + size_t pos_end () const { return pos_begin + entries.size(); } + }; + + /// collection of non-overlapping segments, in order of increasing + /// position + using Segments = std::vector; + Segments segments; + + // ------------------------------------------------------------------------------ + + /// \returns first segment that definitely cannot contain 'pos', + /// because it starts at some later position. + typename Segments::const_iterator getSegmentBeyond (size_t pos) const { + // first segment whose pos_begin > pos (so can't contain pos itself): + return std::upper_bound(segments.begin(), segments.end(), pos, pred); + } + + typename Segments::iterator getSegmentBeyond (size_t pos) { + return std::upper_bound(segments.begin(), segments.end(), pos, pred); + } + + static bool pred (size_t pos, const Segment & s) { return pos < s.pos_begin; } + + // ------------------------------------------------------------------------------ + + /// \returns segment containing 'pos' + typename Segments::const_iterator getSegmentContaining (size_t pos) const + { + auto it = getSegmentBeyond(pos); + + if(it != segments.begin()) { + auto prev_it = it - 1; + if(pos < prev_it->pos_end()) + return prev_it; + } + + return segments.end(); + } + +}; + +template +RowCache::RowCache () +{ +} + +template +size_t RowCache::numSet () const +{ + return std::accumulate(segments.begin(), segments.end(), size_t(0), + [](size_t r, const Segment & s) { return r + s.entries.size(); }); +} + +template +size_t RowCache::numSegments () const +{ + return segments.size(); +} + +template +size_t RowCache::count (size_t pos) const +{ + return getSegmentContaining(pos) != segments.end(); +} + +template +const T & RowCache::at (size_t pos) const +{ + auto it = getSegmentContaining(pos); + + if(it != segments.end()) + return it->entries[pos - it->pos_begin]; + + throw std::out_of_range("no matching segment found"); +} + +template +T & RowCache::at (size_t pos) +{ + return const_cast(static_cast(*this).at(pos)); +} + +template +void RowCache::set (size_t pos, T && value) +{ + auto it = getSegmentBeyond(pos); + + if(it != segments.begin()) + { + auto prev_it = it - 1; + auto d = pos - prev_it->pos_begin; // distance from segment start (>=0) + + if(d < prev_it->entries.size()) + { + // replace value + prev_it->entries[d] = std::move(value); + return; + } + + if(d == prev_it->entries.size()) + { + // extend existing segment + prev_it->entries.insert(prev_it->entries.end(), std::move(value)); + return; + } + } + + // make new segment + segments.insert(it, { pos, { std::move(value) } }); +} + +template +void RowCache::insert (size_t pos, T && value) +{ + auto it = getSegmentBeyond(pos); + + if(it != segments.begin()) + { + auto prev_it = it - 1; + auto d = pos - prev_it->pos_begin; // distance from segment start (>=0) + + if(d <= prev_it->entries.size()) + { + // can extend existing segment + prev_it->entries.insert(prev_it->entries.begin() + d, std::move(value)); + goto push; + } + } + + // make new segment + it = segments.insert(it, { pos, { std::move(value) } }) + 1; + +push: + // push back all later segments + std::for_each(it, segments.end(), [](Segment &s){ s.pos_begin++; }); +} + +template +void RowCache::erase (size_t pos) +{ + auto it = getSegmentBeyond(pos); + + // if previous segment actually contains pos, shorten it + if(it != segments.begin()) + { + auto prev_it = it - 1; + auto d = pos - prev_it->pos_begin; // distance from segment start (>=0) + + if(d < prev_it->entries.size()) + { + prev_it->entries.erase(prev_it->entries.begin() + d); + if(prev_it->entries.empty()) + { + it = segments.erase(prev_it); + } + } + } + + // pull forward all later segments + std::for_each(it, segments.end(), [](Segment &s){ s.pos_begin--; }); +} + +template +void RowCache::clear () +{ + segments.clear(); +} + +template +void RowCache::smallestNonAvailableRange (size_t & row_begin, size_t & row_end) const +{ + if(row_end < row_begin) + throw std::invalid_argument("end must be >= begin"); + + while(row_begin < row_end) { + auto it = getSegmentContaining(row_begin); + if(it == segments.end()) + break; + row_begin = it->pos_end(); + } + + while(row_end > row_begin) { + auto it = getSegmentContaining(row_end - 1); + if(it == segments.end()) + break; + row_end = it->pos_begin; + } + + if(row_end < row_begin) + row_end = row_begin; +} + +#endif // SEGMENTING_CACHE_H diff -Nru sqlitebrowser-3.10.100ubuntu1/src/RowLoader.cpp sqlitebrowser-3.11.1/src/RowLoader.cpp --- sqlitebrowser-3.10.100ubuntu1/src/RowLoader.cpp 1970-01-01 00:00:00.000000000 +0000 +++ sqlitebrowser-3.11.1/src/RowLoader.cpp 2019-02-19 23:51:34.000000000 +0000 @@ -0,0 +1,260 @@ +#include + +#include "RowLoader.h" +#include "sqlite.h" + +namespace { + + QString rtrimChar(const QString& s, QChar c) + { + QString r = s.trimmed(); + while(r.endsWith(c)) + r.chop(1); + return r; + } + +} // anon ns + + +RowLoader::RowLoader ( + std::function(void)> db_getter_, + std::function statement_logger_, + QStringList & headers_, + QMutex & cache_mutex_, + Cache & cache_data_ + ) + : db_getter(db_getter_), statement_logger(statement_logger_), headers(headers_) + , cache_mutex(cache_mutex_), cache_data(cache_data_) + , query() + , countQuery() + , num_tasks(0) + , pDb(nullptr) + , stop_requested(false) + , current_task(nullptr) + , next_task(nullptr) +{ +} + +void RowLoader::setQuery (QString new_query, QString newCountQuery) +{ + std::lock_guard lk(m); + query = new_query; + if (newCountQuery.isEmpty()) + // If it is a normal query - hopefully starting with SELECT - just do a COUNT on it and return the results + countQuery = QString("SELECT COUNT(*) FROM (%1);").arg(rtrimChar(query, ';')); + else + countQuery = newCountQuery; +} + +void RowLoader::triggerRowCountDetermination(int token) +{ + std::unique_lock lk(m); + + num_tasks++; + nosync_ensureDbAccess(); + + // do a count query to get the full row count in a fast manner + row_counter = std::async(std::launch::async, [this, token]() { + auto nrows = countRows(); + if(nrows >= 0) + emit rowCountComplete(token, nrows); + + std::lock_guard lk(m); + nosync_taskDone(); + }); +} + +void RowLoader::nosync_ensureDbAccess () +{ + if(!pDb) + pDb = db_getter(); +} + +std::shared_ptr RowLoader::getDb () const +{ + std::lock_guard lk(m); + return pDb; +} + +int RowLoader::countRows() +{ + int retval = -1; + + // Use a different approach of determining the row count when a EXPLAIN or a PRAGMA statement is used because a COUNT fails on these queries + if(query.startsWith("EXPLAIN", Qt::CaseInsensitive) || query.startsWith("PRAGMA", Qt::CaseInsensitive)) + { + // So just execute the statement as it is and fetch all results counting the rows + sqlite3_stmt* stmt; + QByteArray utf8Query = query.toUtf8(); + if(sqlite3_prepare_v2(pDb.get(), utf8Query, utf8Query.size(), &stmt, nullptr) == SQLITE_OK) + { + retval = 0; + while(sqlite3_step(stmt) == SQLITE_ROW) + retval++; + sqlite3_finalize(stmt); + return retval; + } + } else { + statement_logger(countQuery); + QByteArray utf8Query = countQuery.toUtf8(); + + sqlite3_stmt* stmt; + int status = sqlite3_prepare_v2(pDb.get(), utf8Query, utf8Query.size(), &stmt, nullptr); + if(status == SQLITE_OK) + { + status = sqlite3_step(stmt); + if(status == SQLITE_ROW) + { + QString sCount = QString::fromUtf8(reinterpret_cast(sqlite3_column_text(stmt, 0))); + retval = sCount.toInt(); + } + sqlite3_finalize(stmt); + } else { + qWarning() << "Count query failed: " << countQuery; + } + } + + return retval; +} + +void RowLoader::triggerFetch (int token, size_t row_begin, size_t row_end) +{ + std::unique_lock lk(m); + + if(pDb) { + if(!row_counter.valid() || row_counter.wait_for(std::chrono::seconds(0)) == std::future_status::ready) { + // only if row count is complete, we can safely interrupt SQLite to speed up cancellation + sqlite3_interrupt(pDb.get()); + } + } + + if(current_task) + current_task->cancel = true; + + nosync_ensureDbAccess(); + + // (forget a possibly already existing "next task") + next_task.reset(new Task{ *this, token, row_begin, row_end }); + + lk.unlock(); + cv.notify_all(); +} + +void RowLoader::nosync_taskDone() +{ + if(--num_tasks == 0) { + pDb = nullptr; + } +} + +void RowLoader::cancel () +{ + std::unique_lock lk(m); + + if(pDb) + sqlite3_interrupt(pDb.get()); + + if(current_task) + current_task->cancel = true; + + next_task = nullptr; + cv.notify_all(); +} + +void RowLoader::stop () +{ + cancel(); + std::unique_lock lk(m); + stop_requested = true; + cv.notify_all(); +} + +bool RowLoader::readingData () const +{ + std::unique_lock lk(m); + return pDb != nullptr; +} + +void RowLoader::waitUntilIdle () const +{ + if(row_counter.valid()) + row_counter.wait(); + std::unique_lock lk(m); + cv.wait(lk, [this](){ return stop_requested || (!current_task && !next_task); }); +} + +void RowLoader::run () +{ + for(;;) + { + std::unique_lock lk(m); + current_task = nullptr; + cv.notify_all(); + + cv.wait(lk, [this](){ return stop_requested || next_task; }); + + if(stop_requested) + return; + + current_task = std::move(next_task); + lk.unlock(); + + process(*current_task); + } +} + +void RowLoader::process (Task & t) +{ + QString sLimitQuery; + if(query.startsWith("PRAGMA", Qt::CaseInsensitive) || query.startsWith("EXPLAIN", Qt::CaseInsensitive)) + { + sLimitQuery = query; + } else { + // Remove trailing trailing semicolon + QString queryTemp = rtrimChar(query, ';'); + + // If the query ends with a LIMIT statement take it as it is, if not append our own LIMIT part for lazy population + if(queryTemp.contains(QRegExp("LIMIT\\s+.+\\s*((,|\\b(OFFSET)\\b)\\s*.+\\s*)?$", Qt::CaseInsensitive))) + sLimitQuery = queryTemp; + else + sLimitQuery = queryTemp + QString(" LIMIT %1, %2;").arg(t.row_begin).arg(t.row_end-t.row_begin); + } + statement_logger(sLimitQuery); + + QByteArray utf8Query = sLimitQuery.toUtf8(); + sqlite3_stmt *stmt; + + int status = sqlite3_prepare_v2(pDb.get(), utf8Query, utf8Query.size(), &stmt, nullptr); + + auto row = t.row_begin; + + if(SQLITE_OK == status) + { + const int num_columns = headers.size(); + + while(!t.cancel && sqlite3_step(stmt) == SQLITE_ROW) + { + Cache::value_type rowdata; + for(int i=0;i(sqlite3_column_blob(stmt, i)), bytes)); + else + rowdata.append(QByteArray("")); + } + } + QMutexLocker lk(&cache_mutex); + cache_data.set(row++, std::move(rowdata)); + } + + sqlite3_finalize(stmt); + } + + if(row != t.row_begin) + emit fetched(t.token, t.row_begin, row); +} diff -Nru sqlitebrowser-3.10.100ubuntu1/src/RowLoader.h sqlitebrowser-3.11.1/src/RowLoader.h --- sqlitebrowser-3.10.100ubuntu1/src/RowLoader.h 1970-01-01 00:00:00.000000000 +0000 +++ sqlitebrowser-3.11.1/src/RowLoader.h 2019-02-19 23:51:34.000000000 +0000 @@ -0,0 +1,122 @@ +#ifndef ROW_LOADER_H +#define ROW_LOADER_H + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include "sqlite.h" +#include "RowCache.h" + +class RowLoader : public QThread +{ + Q_OBJECT + + void run() override; + +public: + typedef RowCache> Cache; + + /// set up worker thread to handle row loading + explicit RowLoader ( + std::function(void)> db_getter, + std::function statement_logger, + QStringList & headers, + QMutex & cache_mutex, + Cache & cache_data + ); + + void setQuery (QString new_query, QString newCountQuery = QString()); + + void triggerRowCountDetermination (int token); + + /// trigger asynchronous reading of specified row range, + /// cancelling previous tasks; 'row_end' is exclusive; \param + /// token is eventually returned through the 'fetched' + /// signal. depending on how and when tasks are cancelled, not + /// every triggerFetch() will result in a 'fetched' signal, or the + /// 'fetched' signal may be for a narrower row range. + void triggerFetch (int token, size_t row_begin, size_t row_end); + + /// cancel everything + void cancel (); + + /// cancel everything and terminate worker thread + void stop (); + + /// currently reading any data, or anything in "queue"? + bool readingData () const; + + /// wait until not reading any data + void waitUntilIdle () const; + + /// get current database - note that the worker thread might be + /// working on it, too... \returns current db, or nullptr. + std::shared_ptr getDb () const; + +signals: + void fetched(int token, size_t row_begin, size_t row_end); + void rowCountComplete(int token, int num_rows); + +private: + const std::function()> db_getter; + const std::function statement_logger; + QStringList & headers; + QMutex & cache_mutex; + Cache & cache_data; + + mutable std::mutex m; + mutable std::condition_variable cv; + + QString query; + QString countQuery; + + mutable std::future row_counter; + + size_t num_tasks; + std::shared_ptr pDb; //< exclusive access while held... + + bool stop_requested; + + struct Task + { + RowLoader & row_loader; + int token; + size_t row_begin; + size_t row_end; //< exclusive + std::atomic cancel; + + Task(RowLoader & row_loader_, int t, size_t a, size_t b) + : row_loader(row_loader_), token(t), row_begin(a), row_end(b), cancel(false) + { + row_loader.num_tasks++; + } + + ~Task() + { + // (... mutex being held ...) + row_loader.nosync_taskDone(); + } + }; + + std::unique_ptr current_task; + std::unique_ptr next_task; + + int countRows (); + + void process (Task &); + + void nosync_ensureDbAccess (); + void nosync_taskDone (); + +}; + +#endif // ROW_LOADER_H diff -Nru sqlitebrowser-3.10.100ubuntu1/src/RunSql.cpp sqlitebrowser-3.11.1/src/RunSql.cpp --- sqlitebrowser-3.10.100ubuntu1/src/RunSql.cpp 1970-01-01 00:00:00.000000000 +0000 +++ sqlitebrowser-3.11.1/src/RunSql.cpp 2019-02-19 23:51:34.000000000 +0000 @@ -0,0 +1,304 @@ +#include "RunSql.h" +#include "sqlite.h" +#include "sqlitedb.h" +#include "sqlitetablemodel.h" + +#include +#include +#include + +RunSql::RunSql(DBBrowserDB& _db, QString query, int execute_from_position, int _execute_to_position, bool _interrupt_after_statements) : + db(_db), + may_continue_with_execution(true), + interrupt_after_statements(_interrupt_after_statements), + execute_current_position(execute_from_position), + execute_to_position(_execute_to_position), + structure_updated(false), + savepoint_created(false), + was_dirty(db.getDirty()), + modified(false) +{ + // Get lock to set up everything + std::unique_lock lk(m); + + // Cancel if there is nothing to execute + if(query.trimmed().isEmpty() || query.trimmed() == ";" || execute_from_position == execute_to_position || + query.mid(execute_from_position, execute_to_position-execute_from_position).trimmed().isEmpty() || + query.mid(execute_from_position, execute_to_position-execute_from_position).trimmed() == ";") + return; + + // All replacements in the query should be made by the same amount of characters, so the positions in the file + // for error indicators and line and column logs are not displaced. + // Whitespace and comments are discarded by SQLite, so it is better to just let it ignore them. + query = query.replace(QRegExp("^(\\s*)BEGIN TRANSACTION;", Qt::CaseInsensitive), "\\1 "); + query = query.replace(QRegExp("COMMIT;(\\s*)$", Qt::CaseInsensitive), " \\1"); + + // Convert query to byte array which we will use from now on, starting from the determined start position and + // until the end of the SQL code. By doing so we go further than the determined end position because in Line + // mode the last statement might go beyond that point. + queries_left_to_execute = query.toUtf8().mid(execute_from_position); +} + +void RunSql::run() +{ + // Execute statement by statement + for(;;) + { + if(!executeNextStatement()) + break; + } + + // Execution finished + + // If the DB structure was changed by some command in this SQL script, update our schema representations + if(structure_updated) + db.updateSchema(); +} + +void RunSql::startNextStatement() +{ + std::unique_lock lk(m); + may_continue_with_execution = true; + cv.notify_one(); +} + +void RunSql::stop() +{ + std::unique_lock lk(m); + + stopExecution(); + if(pDb) + sqlite3_interrupt(pDb.get()); + may_continue_with_execution = true; + cv.notify_all(); +} + +bool RunSql::executeNextStatement() +{ + std::unique_lock lk(m); + + // Is there anything left to do? + if(queries_left_to_execute.isEmpty()) + return false; + + // What type of query is this? + QString qtail = QString(queries_left_to_execute).trimmed(); + // Remove trailing comments so we don't get fooled by some trailing text at the end of the stream. + // Otherwise we'll pass them to SQLite and its execution will trigger a savepoint that wouldn't be + // reverted. + SqliteTableModel::removeCommentsFromQuery(qtail); + if (qtail.isEmpty()) + return false; + + StatementType query_type = getQueryType(qtail); + + // Check whether the DB structure is changed by this statement + if(!structure_updated && (query_type == AlterStatement || + query_type == CreateStatement || + query_type == DropStatement || + query_type == RollbackStatement)) + structure_updated = true; + + // Check whether this is trying to set a pragma or to vacuum the database + // TODO This is wrong. The '=' or the 'defer_foreign_keys' might be in a completely different statement of the queries string. + if((query_type == PragmaStatement && qtail.contains('=') && !qtail.contains("defer_foreign_keys", Qt::CaseInsensitive)) || query_type == VacuumStatement) + { + // We're trying to set a pragma. If the database has been modified it needs to be committed first. We'll need to ask the + // user about that + if(db.getDirty()) + { + lk.unlock(); + // Ask user, then check if we should abort execution or continue with it. We depend on a BlockingQueueConnection here which makes sure to + // block this worker thread until the slot function in the main thread is completed and could tell us about its decision. + emit confirmSaveBeforePragmaOrVacuum(); + if(!queries_left_to_execute.isEmpty()) + { + // Commit all changes + db.releaseAllSavepoints(); + } else { + // Abort + emit statementErrored(tr("Execution aborted by user"), execute_current_position, execute_current_position + (query_type == PragmaStatement ? 5 : 6)); + return false; + } + lk.lock(); + } + } else { + // We're not trying to set a pragma or to vacuum the database. In this case make sure a savepoint has been created in order to avoid committing + // all changes to the database immediately. Don't set more than one savepoint. + + if(!savepoint_created) + { + // We have to start a transaction before we create the prepared statement otherwise every executed + // statement will get committed after the prepared statement gets finalized + db.setSavepoint(); + savepoint_created = true; + } + } + + // Start execution timer. We do that after opening any message boxes and after creating savepoints because both are not part of the actual + // query execution. + auto time_start = std::chrono::high_resolution_clock::now(); + + // Execute next statement + const char* tail = queries_left_to_execute.data(); + int tail_length = queries_left_to_execute.length(); + lk.unlock(); + const char* qbegin = tail; + acquireDbAccess(); + sqlite3_stmt* vm; + int sql3status = sqlite3_prepare_v2(pDb.get(), tail, tail_length, &vm, &tail); + QString queryPart = QString::fromUtf8(qbegin, tail - qbegin); + int tail_length_before = tail_length; + tail_length -= (tail - qbegin); + int end_of_current_statement_position = execute_current_position + tail_length_before - tail_length; + + // Save remaining statements + lk.lock(); + queries_left_to_execute = QByteArray(tail); + lk.unlock(); + + if (sql3status == SQLITE_OK) + { + sql3status = sqlite3_step(vm); + sqlite3_finalize(vm); + + // Get type + StatementType query_part_type = getQueryType(queryPart.trimmed()); + + // SQLite returns SQLITE_DONE when a valid SELECT statement was executed but returned no results. To run into the branch that updates + // the status message and the table view anyway manipulate the status value here. This is also done for PRAGMA statements as they (sometimes) + // return rows just like SELECT statements, too. + if((query_part_type == SelectStatement || query_part_type == PragmaStatement) && sql3status == SQLITE_DONE) + sql3status = SQLITE_ROW; + + switch(sql3status) + { + case SQLITE_ROW: + { + // If we get here, the SQL statement returns some sort of data. So hand it over to the model for display. Don't set the modified flag + // because statements that display data don't change data as well. + + releaseDbAccess(); + + lk.lock(); + may_continue_with_execution = false; + + auto time_end = std::chrono::high_resolution_clock::now(); + auto time_in_ms = std::chrono::duration_cast(time_end - time_start); + emit statementReturnsRows(queryPart, execute_current_position, end_of_current_statement_position, time_in_ms.count()); + + // Make sure the next statement isn't executed until we're told to do so + if(interrupt_after_statements) + cv.wait(lk, [this](){ return may_continue_with_execution; }); + lk.unlock(); + break; + } + case SQLITE_DONE: + case SQLITE_OK: + { + // If we get here, the SQL statement doesn't return data and just executes. Don't run it again because it has already been executed. + // But do set the modified flag because statements that don't return data, often modify the database. + + QString stmtHasChangedDatabase; + if(query_part_type == InsertStatement || query_part_type == UpdateStatement || query_part_type == DeleteStatement) + stmtHasChangedDatabase = tr(", %1 rows affected").arg(sqlite3_changes(pDb.get())); + + releaseDbAccess(); + + lk.lock(); + + // Attach/Detach statements don't modify the original database + if(query_part_type != StatementType::AttachStatement && query_part_type != StatementType::DetachStatement) + modified = true; + + may_continue_with_execution = false; + + auto time_end = std::chrono::high_resolution_clock::now(); + auto time_in_ms = std::chrono::duration_cast(time_end - time_start); + emit statementExecuted(tr("query executed successfully. Took %1ms%2").arg(time_in_ms.count()).arg(stmtHasChangedDatabase), + execute_current_position, end_of_current_statement_position); + + // Make sure the next statement isn't executed until we're told to do so + if(interrupt_after_statements) + cv.wait(lk, [this](){ return may_continue_with_execution; }); + lk.unlock(); + break; + } + case SQLITE_MISUSE: + break; + default: + QString error = QString::fromUtf8(sqlite3_errmsg(pDb.get())); + releaseDbAccess(); + emit statementErrored(error, execute_current_position, end_of_current_statement_position); + stopExecution(); + return false; + } + } else { + QString error = QString::fromUtf8(sqlite3_errmsg(pDb.get())); + releaseDbAccess(); + emit statementErrored(error, execute_current_position, end_of_current_statement_position); + stopExecution(); + return false; + } + + // Release the database + lk.lock(); + releaseDbAccess(); + + // Revert to save point now if it wasn't needed. We need to do this here because there are some rare cases where the next statement might + // be affected by what is only a temporary and unnecessary savepoint. For example in this case: + // ATTACH 'xxx' AS 'db2' + // SELECT * FROM db2.xy; -- Savepoint created here + // DETACH db2; -- Savepoint makes this statement fail + if(!modified && !was_dirty && savepoint_created) + { + db.revertToSavepoint(); + savepoint_created = false; + } + + // Update the start position for the next statement and check if we are at + // the end of the part we want to execute. If so, stop the execution now. + execute_current_position = end_of_current_statement_position; + if(execute_current_position >= execute_to_position) + { + stopExecution(); + return false; + } + + return true; +} + +void RunSql::stopExecution() +{ + queries_left_to_execute.clear(); +} + +RunSql::StatementType RunSql::getQueryType(const QString& query) +{ + // Helper function for getting the type of a given query + + if(query.startsWith("SELECT", Qt::CaseInsensitive)) return SelectStatement; + if(query.startsWith("ALTER", Qt::CaseInsensitive)) return AlterStatement; + if(query.startsWith("DROP", Qt::CaseInsensitive)) return DropStatement; + if(query.startsWith("ROLLBACK", Qt::CaseInsensitive)) return RollbackStatement; + if(query.startsWith("PRAGMA", Qt::CaseInsensitive)) return PragmaStatement; + if(query.startsWith("VACUUM", Qt::CaseInsensitive)) return VacuumStatement; + if(query.startsWith("INSERT", Qt::CaseInsensitive)) return InsertStatement; + if(query.startsWith("UPDATE", Qt::CaseInsensitive)) return UpdateStatement; + if(query.startsWith("DELETE", Qt::CaseInsensitive)) return DeleteStatement; + if(query.startsWith("CREATE", Qt::CaseInsensitive)) return CreateStatement; + if(query.startsWith("ATTACH", Qt::CaseInsensitive)) return AttachStatement; + if(query.startsWith("DETACH", Qt::CaseInsensitive)) return DetachStatement; + + return OtherStatement; +} + +void RunSql::acquireDbAccess() +{ + pDb = db.get(tr("executing query"), true); +} + +void RunSql::releaseDbAccess() +{ + pDb = nullptr; +} diff -Nru sqlitebrowser-3.10.100ubuntu1/src/RunSql.h sqlitebrowser-3.11.1/src/RunSql.h --- sqlitebrowser-3.10.100ubuntu1/src/RunSql.h 1970-01-01 00:00:00.000000000 +0000 +++ sqlitebrowser-3.11.1/src/RunSql.h 2019-02-19 23:51:34.000000000 +0000 @@ -0,0 +1,88 @@ +#ifndef RUNSQL_H +#define RUNSQL_H + +#include +#include +#include +#include + +class DBBrowserDB; +struct sqlite3; + +class RunSql : public QThread +{ + Q_OBJECT + + void run() override; + +public: + /** + * @param db Reference to the database connection to execute the statements with + * @param query The query to execute + * @param execute_from_position The index of the first character to execute in the query parameter + * @param execute_to_position The index of the last character to execute in the query parameter (see exact_execute_to_position) + * @param interrupt_after_statements Set to true to stop execution after each statement until startNextStatement() is called. Set to false to execute all statements + * in one go. + */ + RunSql(DBBrowserDB& db, QString query, int execute_from_position, int execute_to_position, bool interrupt_after_statements = false); + ~RunSql() override = default; + + enum StatementType + { + SelectStatement, + AlterStatement, + DropStatement, + RollbackStatement, + PragmaStatement, + VacuumStatement, + InsertStatement, + UpdateStatement, + DeleteStatement, + CreateStatement, + AttachStatement, + DetachStatement, + OtherStatement, + }; + + static StatementType getQueryType(const QString& query); + + void startNextStatement(); + + void stop(); + +signals: + void statementErrored(QString message, int from_position, int to_position); + void statementExecuted(QString message, int from_position, int to_position); + void statementReturnsRows(QString query, int from_position, int to_position, qint64 time_in_ms); + + /** + * This signal must be connected with a Qt::BlockingQueuedConnection in order to work as expected! + */ + void confirmSaveBeforePragmaOrVacuum(); + +private: + DBBrowserDB& db; + std::shared_ptr pDb; + + mutable std::mutex m; + mutable std::condition_variable cv; + bool may_continue_with_execution; + + bool interrupt_after_statements; + + QByteArray queries_left_to_execute; + int execute_current_position; + int execute_to_position; + bool structure_updated; + bool savepoint_created; + bool was_dirty; + bool modified; + + void stopExecution(); + bool executeNextStatement(); + + void acquireDbAccess(); + void releaseDbAccess(); +}; + +#endif diff -Nru sqlitebrowser-3.10.100ubuntu1/src/Settings.cpp sqlitebrowser-3.11.1/src/Settings.cpp --- sqlitebrowser-3.10.100ubuntu1/src/Settings.cpp 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/src/Settings.cpp 2019-02-19 23:51:34.000000000 +0000 @@ -1,5 +1,6 @@ #include "Settings.h" +#include #include #include #include @@ -137,6 +138,10 @@ if(group == "MainWindow" && name == "windowState") return ""; + // MainWindow/openTabs? + if(group == "MainWindow" && name == "openTabs") + return ""; + // SQLLogDock/Log? if(group == "SQLLogDock" && name == "Log") return "Application"; @@ -153,6 +158,22 @@ if(group == "General" && name == "toolbarStyle") return static_cast(Qt::ToolButtonTextBesideIcon); + // General/toolbarStyleStructure + if(group == "General" && name == "toolbarStyleStructure") + return static_cast(Qt::ToolButtonTextBesideIcon); + + // General/toolbarStyleBrowse + if(group == "General" && name == "toolbarStyleBrowse") + return static_cast(Qt::ToolButtonIconOnly); + + // General/toolbarStyleSql + if(group == "General" && name == "toolbarStyleSql") + return static_cast(Qt::ToolButtonIconOnly); + + // General/toolbarStyleEditCell + if(group == "General" && name == "toolbarStyleEditCell") + return static_cast(Qt::ToolButtonIconOnly); + if(group == "General" && name == "DBFileExtensions") return QObject::tr("SQLite database files (*.db *.sqlite *.sqlite3 *.db3)"); @@ -176,8 +197,12 @@ return 10; if(name == "symbol_limit") return 5000; + if(name == "complete_threshold") + return 1000; if(name == "indent_compact") return false; + if(name == "auto_switch_mode") + return true; if(name == "null_text") return "NULL"; if(name == "blob_text") @@ -276,7 +301,7 @@ // editor/fontsize or log/fontsize? if((group == "editor" || group == "log") && name == "fontsize") #ifdef Q_OS_MAC - // Use 12 pt size as the default on OSX + // Use 12 pt size as the default on OSX return 12; #else return 9; @@ -294,6 +319,10 @@ if(group == "editor" && name == "wrap_lines") return 0; // QsciScintilla::WrapNone + // editor/identifier_quotes + if(group == "editor" && name == "identifier_quotes") + return 0; // sqlb::DoubleQuotes + // editor/auto_completion? if(group == "editor" && name == "auto_completion") return true; @@ -318,6 +347,10 @@ if(group == "extension" && name == "disableregex") return false; + // extensions/enable_load_extension? + if(group == "extension" && name == "enable_load_extension") + return false; + // PlotDock/lineType or pointShape? if(group == "PlotDock") { @@ -330,6 +363,17 @@ return 4; } + + // SchemaDock Drag & drop settings + if(group == "SchemaDock") + { + if(name == "dropQualifiedNames") + return false; + + if(name == "dropEnquotedNames") + return true; + } + // Remote settings? if(group == "remote") { @@ -339,7 +383,11 @@ // Clone directory if(name == "clonedirectory") +#if QT_VERSION >= QT_VERSION_CHECK(5, 4, 0) return QStandardPaths::writableLocation(QStandardPaths::AppDataLocation); +#else + return QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation); +#endif } // Unknown combination of group and name? Return an invalid QVariant! diff -Nru sqlitebrowser-3.10.100ubuntu1/src/Settings.h sqlitebrowser-3.11.1/src/Settings.h --- sqlitebrowser-3.10.100ubuntu1/src/Settings.h 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/src/Settings.h 2019-02-19 23:51:34.000000000 +0000 @@ -1,9 +1,8 @@ #ifndef SETTINGS_H #define SETTINGS_H -#include -#include #include +#include class Settings { diff -Nru sqlitebrowser-3.10.100ubuntu1/src/sql/Query.cpp sqlitebrowser-3.11.1/src/sql/Query.cpp --- sqlitebrowser-3.10.100ubuntu1/src/sql/Query.cpp 1970-01-01 00:00:00.000000000 +0000 +++ sqlitebrowser-3.11.1/src/sql/Query.cpp 2019-02-19 23:51:34.000000000 +0000 @@ -0,0 +1,101 @@ +#include "Query.h" + +#include + +namespace sqlb +{ + +Query::Query() +{ +} + +void Query::clear() +{ + m_table.clear(); + m_rowid_column = "_rowid_"; + m_selected_columns.clear(); + m_where.clear(); + m_sort.clear(); +} + +std::string Query::buildWherePart() const +{ + std::string where; + if(m_where.size()) + { + where = "WHERE "; + + for(auto i=m_where.cbegin();i!=m_where.cend();++i) + { + const auto it = findSelectedColumnByName(m_column_names.at(i->first)); + std::string column = sqlb::escapeIdentifier(m_column_names.at(i->first)); + if(it != m_selected_columns.cend() && it->selector != column) + column = it->selector; + where += column + " " + i->second + " AND "; + } + + // Remove last ' AND ' + where.erase(where.size() - 5); + } + return where; +} + +std::string Query::buildQuery(bool withRowid) const +{ + // Selector and display formats + std::string selector; + if (withRowid) + selector = sqlb::escapeIdentifier(m_rowid_column) + ","; + + if(m_selected_columns.empty()) + { + selector += "*"; + } else { + for(const auto& it : m_selected_columns) + { + if (it.original_column != it.selector) + selector += it.selector + " AS " + sqlb::escapeIdentifier(it.original_column) + ","; + else + selector += sqlb::escapeIdentifier(it.original_column) + ","; + } + selector.pop_back(); + } + + // Filter + std::string where = buildWherePart(); + + // Sorting + std::string order_by; + if(m_sort.size()) + { + order_by = "ORDER BY "; + for(const auto& sorted_column : m_sort) + order_by += sqlb::escapeIdentifier(m_column_names.at(sorted_column.column)) + " " + + (sorted_column.direction == sqlb::Ascending ? "ASC" : "DESC") + ","; + order_by.pop_back(); + } + + return "SELECT " + selector + " FROM " + m_table.toString().toStdString() + " " + where + " " + order_by; +} + +std::string Query::buildCountQuery() const +{ + // Build simplest count query for this (filtered) table + return "SELECT COUNT(*) FROM " + m_table.toString().toStdString() + " " + buildWherePart(); +} + +std::vector::iterator Query::findSelectedColumnByName(const std::string& name) +{ + return std::find_if(m_selected_columns.begin(), m_selected_columns.end(), [name](const SelectedColumn& c) { + return name == c.original_column; + }); +} + +std::vector::const_iterator Query::findSelectedColumnByName(const std::string& name) const +{ + return std::find_if(m_selected_columns.cbegin(), m_selected_columns.cend(), [name](const SelectedColumn& c) { + return name == c.original_column; + }); +} + +} diff -Nru sqlitebrowser-3.10.100ubuntu1/src/sql/Query.h sqlitebrowser-3.11.1/src/sql/Query.h --- sqlitebrowser-3.10.100ubuntu1/src/sql/Query.h 1970-01-01 00:00:00.000000000 +0000 +++ sqlitebrowser-3.11.1/src/sql/Query.h 2019-02-19 23:51:34.000000000 +0000 @@ -0,0 +1,87 @@ +#ifndef QUERY_H +#define QUERY_H + +#include "sqlitetypes.h" + +#include +#include +#include + +namespace sqlb +{ + +enum SortDirection +{ + Ascending, + Descending +}; + +struct SortedColumn +{ + SortedColumn(int column_, SortDirection direction_) : + column(column_), + direction(direction_) + {} + + int column; + SortDirection direction; +}; + +struct SelectedColumn +{ + SelectedColumn(const std::string& original_column_, const std::string& selector_) : + original_column(original_column_), + selector(selector_) + {} + + std::string original_column; + std::string selector; +}; + +class Query +{ +public: + Query(); + Query(const sqlb::ObjectIdentifier& table) : + m_table(table) + {} + + void clear(); + std::string buildQuery(bool withRowid) const; + std::string buildCountQuery() const; + + void setColumNames(const std::vector& column_names) { m_column_names = column_names; } + std::vector columnNames() const { return m_column_names; } + + void setTable(const sqlb::ObjectIdentifier& table) { m_table = table; } + sqlb::ObjectIdentifier table() const { return m_table; } + + void setRowIdColumn(const std::string& rowid) { m_rowid_column = rowid; } + std::string rowIdColumn() const { return m_rowid_column; } + bool hasCustomRowIdColumn() const { return m_rowid_column != "rowid" && m_rowid_column != "_rowid_"; } + + const std::vector& selectedColumns() const { return m_selected_columns; } + std::vector& selectedColumns() { return m_selected_columns; } + + const std::unordered_map& where() const { return m_where; } + std::unordered_map& where() { return m_where; } + + const std::vector& orderBy() const { return m_sort; } + std::vector& orderBy() { return m_sort; } + +private: + std::vector m_column_names; + sqlb::ObjectIdentifier m_table; + std::string m_rowid_column; + std::vector m_selected_columns; + std::unordered_map m_where; + std::vector m_sort; + + std::vector::iterator findSelectedColumnByName(const std::string& name); + std::vector::const_iterator findSelectedColumnByName(const std::string& name) const; + std::string buildWherePart() const; +}; + +} + +#endif diff -Nru sqlitebrowser-3.10.100ubuntu1/src/sql/sqlitetypes.cpp sqlitebrowser-3.11.1/src/sql/sqlitetypes.cpp --- sqlitebrowser-3.10.100ubuntu1/src/sql/sqlitetypes.cpp 1970-01-01 00:00:00.000000000 +0000 +++ sqlitebrowser-3.11.1/src/sql/sqlitetypes.cpp 2019-02-19 23:51:34.000000000 +0000 @@ -0,0 +1,1501 @@ +#include "sqlitetypes.h" +#include "grammar/Sqlite3Lexer.hpp" +#include "grammar/Sqlite3Parser.hpp" + +#include +#include +#include // This include seems to only be necessary for the Windows build + +namespace sqlb { + +static escapeQuoting customQuoting = DoubleQuotes; + +void setIdentifierQuoting(escapeQuoting toQuoting) +{ + customQuoting = toQuoting; +} + +QString escapeIdentifier(QString id) +{ + switch(customQuoting) { + case GraveAccents: + return '`' + id.replace('`', "``") + '`'; + case SquareBrackets: + // There aren't any escaping possibilities for square brackets inside the identifier, + // so we rely on the user to not enter these characters when this kind of quoting is + // selected. + return '[' + id + ']'; + case DoubleQuotes: + default: + // This may produce a 'control reaches end of non-void function' warning if the + // default branch is removed, even though we have covered all possibilities in the + // switch statement. + return '"' + id.replace('"', "\"\"") + '"'; + } +} + +std::string escapeIdentifier(std::string id) +{ + return escapeIdentifier(QString::fromStdString(id)).toStdString(); +} + +QStringList escapeIdentifier(const QStringList& ids) +{ + QStringList ret; + for(const QString& id : ids) + ret.push_back(escapeIdentifier(id)); + return ret; +} + +/** + * @brief The SetLocaleToC class + * This is a stupid helper class which sets the current locale as used by the C++ standard library to the C locale. + * Upon destruction it resets it to whatever the previous locale was. This is used to work around a problem in Antlr's + * string comparison which because it is case-independent relies on the current locale. However, when parsind SQL + * statements we don't want the locale to interfere here. Especially the Turkish locale is problematic here because + * of the dotted I problem. + */ +class SetLocaleToC +{ +public: + SetLocaleToC() + { + // Query current locale and save it + oldLocale = std::setlocale(LC_CTYPE, nullptr); + + // Set locale for standard library functions + std::setlocale(LC_CTYPE, "C.UTF-8"); + } + + ~SetLocaleToC() + { + // Reset old locale + std::setlocale(LC_CTYPE, oldLocale.c_str()); + } + +private: + std::string oldLocale; +}; + +/** + * @brief The CreateTableWalker class + * Goes trough the createtable AST and returns + * Table object. + */ +class CreateTableWalker +{ +public: + explicit CreateTableWalker(antlr::RefAST r) + : m_root(r) + {} + + TablePtr table(); + +private: + void parsecolumn(Table* table, antlr::RefAST c); + QString parseConflictClause(antlr::RefAST c); + +private: + antlr::RefAST m_root; +}; + +/** + * @brief The CreateIndexWalker class + * Goes trough the createtable AST and returns + * Index object. + */ +class CreateIndexWalker +{ +public: + explicit CreateIndexWalker(antlr::RefAST r) + : m_root(r) + {} + + IndexPtr index(); + +private: + void parsecolumn(Index* index, antlr::RefAST c); + +private: + antlr::RefAST m_root; +}; + +bool Object::operator==(const Object& rhs) const +{ + if(m_name != rhs.m_name) + return false; + if(m_fullyParsed != rhs.m_fullyParsed) // We check for the fully parsed flag to make sure not to lose anything in some corner cases + return false; + + // We don't care about the original SQL text + + return true; +} + +QString Object::typeToString(Types type) +{ + switch(type) + { + case Types::Table: return "table"; + case Types::Index: return "index"; + case Types::View: return "view"; + case Types::Trigger: return "trigger"; + } + return QString(); +} + +bool ForeignKeyClause::isSet() const +{ + return m_override.size() || m_table.size(); +} + +QString ForeignKeyClause::toString() const +{ + if(!isSet()) + return QString(); + + if(m_override.size()) + return m_override; + + QString result = escapeIdentifier(m_table); + + if(m_columns.size()) + result += "(" + escapeIdentifier(m_columns).join(",") + ")"; + + if(m_constraint.size()) + result += " " + m_constraint; + + return result; +} + +void ForeignKeyClause::setFromString(const QString& fk) +{ + m_override = fk; +} + +QString ForeignKeyClause::toSql(const QStringList& applyOn) const +{ + QString result; + if(!m_name.isNull()) + result += QString("CONSTRAINT %1 ").arg(escapeIdentifier(m_name)); + result += QString("FOREIGN KEY(%1) REFERENCES %2").arg(escapeIdentifier(applyOn).join(",")).arg(this->toString()); + + return result; +} + +QString UniqueConstraint::toSql(const QStringList& applyOn) const +{ + QString result; + if(!m_name.isNull()) + result += QString("CONSTRAINT %1 ").arg(escapeIdentifier(m_name)); + result += QString("UNIQUE(%1)").arg(escapeIdentifier(applyOn).join(",")); + + return result; +} + +QString PrimaryKeyConstraint::toSql(const QStringList& applyOn) const +{ + QString result; + if(!m_name.isNull()) + result += QString("CONSTRAINT %1 ").arg(escapeIdentifier(m_name)); + result += QString("PRIMARY KEY(%1)").arg(escapeIdentifier(applyOn).join(",")); + + if(!m_conflictAction.isEmpty()) + result += " ON CONFLICT " + m_conflictAction; + + return result; +} + +QString CheckConstraint::toSql(const QStringList&) const +{ + QString result; + if(!m_name.isNull()) + result += QString("CONSTRAINT %1 ").arg(escapeIdentifier(m_name)); + result += QString("CHECK(%1)").arg(m_expression); + + return result; +} + +bool Field::operator==(const Field& rhs) const +{ + if(m_name != rhs.m_name) + return false; + if(m_type != rhs.m_type) + return false; + if(m_notnull != rhs.m_notnull) + return false; + if(m_check != rhs.m_check) + return false; + if(m_defaultvalue != rhs.m_defaultvalue) + return false; + if(m_autoincrement != rhs.m_autoincrement) + return false; + if(m_unique != rhs.m_unique) + return false; + if(m_collation != rhs.m_collation) + return false; + + return true; +} + +QString Field::toString(const QString& indent, const QString& sep) const +{ + QString str = indent + escapeIdentifier(m_name) + sep + m_type; + if(m_notnull) + str += " NOT NULL"; + if(!m_defaultvalue.isEmpty()) + str += QString(" DEFAULT %1").arg(m_defaultvalue); + if(!m_check.isEmpty()) + str += " CHECK(" + m_check + ")"; + if(m_autoincrement) + str += " PRIMARY KEY AUTOINCREMENT"; + if(m_unique) + str += " UNIQUE"; + if(!m_collation.isEmpty()) + str += " COLLATE " + m_collation; + return str; +} + +bool Field::isText() const +{ + QString norm = m_type.trimmed().toLower(); + + return norm.startsWith("character") + || norm.startsWith("varchar") + || norm.startsWith("varying character") + || norm.startsWith("nchar") + || norm.startsWith("native character") + || norm.startsWith("nvarchar") + || norm == "text" + || norm == "clob"; +} + +bool Field::isInteger() const +{ + QString norm = m_type.trimmed().toLower(); + + return norm == "int" + || norm == "integer" + || norm == "tinyint" + || norm == "smallint" + || norm == "mediumint" + || norm == "bigint" + || norm == "unsigned big int" + || norm == "int2" + || norm == "int8"; +} + +bool Field::isReal() const +{ + QString norm = m_type.trimmed().toLower(); + + return norm == "real" + || norm == "double" + || norm == "double precision" + || norm == "float"; +} + +bool Field::isNumeric() const +{ + QString norm = m_type.trimmed().toLower(); + + return norm.startsWith("decimal") + || norm == "numeric" + || norm == "boolean" + || norm == "date" + || norm == "datetime"; +} + +bool Field::isBlob() const +{ + QString norm = m_type.trimmed().toLower(); + + return norm.isEmpty() + || norm == "blob"; +} + +QString Field::affinity() const +{ + if (isInteger()) return "INTEGER"; + + if (isText()) return "TEXT"; + + if (isBlob()) return "BLOB"; + + if (isReal()) return "REAL"; + + return "NUMERIC"; +} + +Table::~Table() +{ +} + +Table& Table::operator=(const Table& rhs) +{ + // Base class + Object::operator=(rhs); + + // Just assign the strings + m_rowidColumn = rhs.m_rowidColumn; + m_virtual = rhs.m_virtual; + + // Clear the fields and the constraints first in order to avoid duplicates and/or old data in the next step + fields.clear(); + m_constraints.clear(); + + // Make copies of the fields and the constraints. This is necessary in order to avoid any unwanted changes to the application's main database + // schema representation just by modifying a reference to the fields or constraints and thinking it operates on a copy. + for(const Field& f : rhs.fields) + fields.push_back(f); + m_constraints = rhs.m_constraints; + + return *this; +} + +bool Table::operator==(const Table& rhs) const +{ + if(!Object::operator==(rhs)) + return false; + + if(m_rowidColumn != rhs.m_rowidColumn) + return false; + if(m_virtual != rhs.m_virtual) + return false; + if(fields != rhs.fields) + return false; + + // We need to compare the constraint maps manually here. The reason is that the values are pointers and the default implementation + // would compare the pointers not the actual objects. + if(m_constraints.size() != rhs.m_constraints.size()) + return false; + for(auto it=m_constraints.cbegin();it!=m_constraints.end();++it) + { + // For each element in this map we get the list of all elements with the same key from the other map. + // Then we loop through that list and check if we find an element of the same type which produces the same SQL substring. We use this + // approach to avoid casting both objects to their actual type, then dereferencing it etc. + auto range = rhs.m_constraints.equal_range(it->first); + bool found_something = false; + for(auto jt=range.first;jt!=range.second;++jt) + { + if(it->second->type() == jt->second->type() && it->second->toSql(it->first) == jt->second->toSql(jt->first)) + { + found_something = true; + break; + } + } + + // If no match was found, the constraint maps aren't equal + if(!found_something) + return false; + } + + return true; +} + +Table::field_iterator Table::findPk() +{ + // TODO This is a stupid function (and always was) which should be fixed/improved + + QStringList pk = primaryKey(); + if(pk.empty()) + return fields.end(); + else + return findField(this, pk.at(0)); +} + +QStringList Table::fieldList() const +{ + QStringList sl; + + for(const Field& f : fields) + sl << f.toString(); + + return sl; +} + +QStringList Table::fieldNames() const +{ + QStringList sl; + + for(const Field& f : fields) + sl << f.name(); + + return sl; +} + +FieldInfoList Table::fieldInformation() const +{ + FieldInfoList result; + for(const Field& f : fields) + result.emplace_back(f.name(), f.type(), f.toString(" ", " ")); + return result; +} + +bool Table::hasAutoIncrement() const +{ + for(const Field& f : fields) { + if(f.autoIncrement()) + return true; + } + return false; +} + +TablePtr Table::parseSQL(const QString& sSQL) +{ + SetLocaleToC locale; + + std::stringstream s; + s << sSQL.toStdString(); + Sqlite3Lexer lex(s); + + Sqlite3Parser parser(lex); + + antlr::ASTFactory ast_factory; + parser.initializeASTFactory(ast_factory); + parser.setASTFactory(&ast_factory); + + try + { + parser.createtable(); + CreateTableWalker ctw(parser.getAST()); + + auto t = ctw.table(); + t->setOriginalSql(sSQL); + return t; + } + catch(antlr::ANTLRException& ex) + { + std::cerr << "Sqlite parse error: " << ex.toString() << "(" << sSQL.toStdString() << ")" << std::endl; + } + catch(...) + { + std::cerr << "Sqlite parse error: " << sSQL.toStdString() << std::endl; //TODO + } + + return TablePtr(new Table("")); +} + +QString Table::sql(const QString& schema, bool ifNotExists) const +{ + // Special handling for virtual tables: just build an easy create statement and copy the using part in there + if(isVirtual()) + return QString("CREATE VIRTUAL TABLE %1 USING %2;").arg(ObjectIdentifier(schema, m_name).toString(true)).arg(m_virtual); + + // This is a normal table, not a virtual one + QString sql = QString("CREATE TABLE%1 %2 (\n") + .arg(ifNotExists ? QString(" IF NOT EXISTS") : QString("")) + .arg(ObjectIdentifier(schema, m_name).toString(true)); + + sql += fieldList().join(",\n"); + + // Constraints + ConstraintMap::const_iterator it = m_constraints.cbegin(); + bool autoincrement = hasAutoIncrement(); + while(it != m_constraints.cend()) + { + // Ignore auto increment primary key constraint + if((!autoincrement || it->second->type() != Constraint::PrimaryKeyConstraintType)) + { + // Ignore all constraints without any fields, except for check constraints which don't rely on a field vector + if(!(it->first.empty() && it->second->type() != Constraint::CheckConstraintType)) + { + sql += QString(",\n\t"); + sql += it->second->toSql(it->first); + } + } + ++it; + } + + sql += "\n)"; + + // without rowid + if(isWithoutRowidTable()) + sql += " WITHOUT ROWID"; + + return sql + ";"; +} + +void Table::addConstraint(QStringList fields, ConstraintPtr constraint) +{ + m_constraints.insert({fields, constraint}); +} + +void Table::setConstraint(QStringList fields, ConstraintPtr constraint) +{ + // Delete any old constraints of this type for these fields + removeConstraints(fields, constraint->type()); + + // Add the new constraint to the table, effectively overwriting all old constraints for that fields/type combination + addConstraint(fields, constraint); +} + +void Table::removeConstraints(QStringList fields, Constraint::ConstraintTypes type) +{ + for(auto it = m_constraints.begin();it!=m_constraints.end();) + { + if(it->first == fields && it->second->type() == type) + m_constraints.erase(it++); + else + ++it; + } +} + +ConstraintPtr Table::constraint(QStringList fields, Constraint::ConstraintTypes type) const +{ + auto list = constraints(fields, type); + if(list.size()) + return list.at(0); + else + return ConstraintPtr(nullptr); +} + +std::vector Table::constraints(QStringList fields, Constraint::ConstraintTypes type) const +{ + ConstraintMap::const_iterator begin, end; + if(fields.empty()) + { + begin = m_constraints.begin(); + end = m_constraints.end(); + } else { + std::tie(begin, end) = m_constraints.equal_range(fields); + } + + std::vector clist; + std::transform(begin, end, std::back_inserter(clist), [](std::pair elem){return elem.second;}); + + if(type == Constraint::NoType) + { + return clist; + } else { + std::vector clist_typed; + for(const ConstraintPtr& ptr : clist) + { + if(ptr->type() == type) + clist_typed.push_back(ptr); + } + return clist_typed; + } +} + +void Table::setConstraints(const ConstraintMap& constraints) +{ + m_constraints = constraints; +} + +QStringList& Table::primaryKeyRef() +{ + return const_cast(static_cast(this)->primaryKey()); +} + +const QStringList& Table::primaryKey() const +{ + auto it = m_constraints.cbegin(); + while(it != m_constraints.cend()) + { + if(it->second->type() == Constraint::PrimaryKeyConstraintType) + return it->first; + ++it; + } + + static QStringList emptyFieldVector; + return emptyFieldVector; +} + +void Table::removeKeyFromAllConstraints(const QString& key) +{ + // First remove all constraints with exactly that one key + m_constraints.erase({key}); + + // Then delete all occurrences of the key in compound columns + for(auto it=m_constraints.begin();it!=m_constraints.end();) + { + if(it->first.contains(key)) + { + QStringList k = it->first; + k.removeAll(key); + m_constraints.insert({k, it->second}); + it = m_constraints.erase(it); + } else { + ++it; + } + } +} + +void Table::renameKeyInAllConstraints(const QString& key, const QString& to) +{ + // Do nothing if the key hasn't really changed + if(key == to) + return; + + // Find all occurrences of the key and change it to the new one + for(auto it=m_constraints.begin();it!=m_constraints.end();) + { + if(it->first.contains(key)) + { + QStringList k = it->first; + k.replaceInStrings(QRegExp("^" + key + "$"), to); + m_constraints.insert({k, it->second}); + it = m_constraints.erase(it); + } else { + ++it; + } + } +} + +namespace +{ +QString identifier(antlr::RefAST ident) +{ + QString sident = ident->getText().c_str(); + if(ident->getType() == sqlite3TokenTypes::QUOTEDID || + ident->getType() == Sqlite3Lexer::QUOTEDLITERAL || + ident->getType() == sqlite3TokenTypes::STRINGLITERAL) + { + // Remember the way the identifier is quoted + QChar quoteChar = sident.at(0); + + // Remove first and final character, i.e. the quotes + sident.remove(0, 1); + sident.chop(1); + + // Replace all remaining occurences of two succeeding quote characters and replace them + // by a single instance. This is done because two quotes can be used as a means of escaping + // the quote character, thus only the visual representation has its two quotes, the actual + // name contains only one. + sident.replace(QString(quoteChar) + quoteChar, quoteChar); + } + + return sident; +} + +QString textAST(antlr::RefAST t) +{ + // When this is called for a KEYWORDASTABLENAME token, we must take the child's content to get the actual value + // instead of 'KEYWORDASTABLENAME' as a string. The same applies for KEYWORDASCOLUMNNAME tokens. + if(t != antlr::nullAST && (t->getType() == sqlite3TokenTypes::KEYWORDASTABLENAME || t->getType() == sqlite3TokenTypes::KEYWORDASCOLUMNNAME)) + return t->getFirstChild()->getText().c_str(); + else + return t->getText().c_str(); +} + +QString concatTextAST(antlr::RefAST t, bool withspace = false) +{ + QStringList stext; + while(t != antlr::nullAST) + { + stext.append(textAST(t)); + t = t->getNextSibling(); + } + return stext.join(withspace ? " " : ""); +} + +QString concatExprAST(antlr::RefAST t) +{ + QString expr; + + int num_paren = 1; + while(t) + { + if(t->getType() == sqlite3TokenTypes::LPAREN) + num_paren++; + else if(t->getType() == sqlite3TokenTypes::RPAREN) + num_paren--; + + if(num_paren == 0) + break; + + switch(t->getType()) + { + case sqlite3TokenTypes::AND: + case sqlite3TokenTypes::OR: + case sqlite3TokenTypes::IN: + case sqlite3TokenTypes::LIKE: + case sqlite3TokenTypes::MATCH: + case sqlite3TokenTypes::REGEXP: + case sqlite3TokenTypes::EXISTS: + case sqlite3TokenTypes::GLOB: + case sqlite3TokenTypes::BETWEEN: + expr.append(" " + textAST(t) + " "); + break; + case sqlite3TokenTypes::NOT: + expr.append(" " + textAST(t)); + break; + default: + expr.append(textAST(t)); + } + + t = t->getNextSibling(); + } + + return expr.trimmed(); +} +} + +namespace { +QString tablename(const antlr::RefAST& n) +{ + if(n->getType() == sqlite3TokenTypes::KEYWORDASTABLENAME) + return concatTextAST(n->getFirstChild()); + else + return identifier(n); +} +QString columnname(const antlr::RefAST& n) +{ + if(n->getType() == sqlite3TokenTypes::KEYWORDASCOLUMNNAME) + return concatTextAST(n->getFirstChild()); + else if(n->getType() == sqlite3TokenTypes::INDEXEDCOLUMN) + return columnname(n->getFirstChild()); + else + return identifier(n); +} +} + +TablePtr CreateTableWalker::table() +{ + Table* tab = new Table(""); + tab->setFullyParsed(true); + + if( m_root ) //CREATE TABLE + { + antlr::RefAST s = m_root->getFirstChild(); + + // If the primary tree isn't filled, this isn't a normal CREATE TABLE statement. Switch to the next alternative tree. + if(s == nullptr) + s = m_root->getNextSibling(); + + // Skip to table name + bool is_virtual_table = false; + while(s->getType() != Sqlite3Lexer::ID && + s->getType() != Sqlite3Lexer::QUOTEDID && + s->getType() != Sqlite3Lexer::QUOTEDLITERAL && + s->getType() != Sqlite3Lexer::STRINGLITERAL && + s->getType() != sqlite3TokenTypes::KEYWORDASTABLENAME) + { + // Is this one of these virtual tables? + if(s->getType() == Sqlite3Lexer::VIRTUAL) + is_virtual_table = true; + + s = s->getNextSibling(); + } + + // Extract and set table name + tab->setName(tablename(s)); + + // Special handling for virtual tables. If this is a virtual table, extract the USING part and skip all the + // rest of this function because virtual tables don't have column definitons + if(is_virtual_table) + { + s = s->getNextSibling(); // USING + s = s->getNextSibling(); // module name + tab->setVirtualUsing(concatTextAST(s, true)); + tab->setFullyParsed(false); + + return TablePtr(tab); + } + + // This is a normal table, not a virtual one + s = s->getNextSibling(); // LPAREN + s = s->getNextSibling(); // first column name + antlr::RefAST column = s; + // loop columndefs + while(column != antlr::nullAST && column->getType() == sqlite3TokenTypes::COLUMNDEF) + { + parsecolumn(tab, column->getFirstChild()); + column = column->getNextSibling(); //COMMA or RPAREN + column = column->getNextSibling(); //null or tableconstraint + + s = s->getNextSibling(); // COLUMNDEF + s = s->getNextSibling(); // COMMA or RPAREN + } + + // now we are finished or it is a tableconstraint + while(s != antlr::nullAST) + { + // Is this a 'without rowid' definiton? + if(s->getType() != sqlite3TokenTypes::WITHOUT) + { + // It's not, so treat this as table constraints + + antlr::RefAST tc = s->getFirstChild(); + + // Extract constraint name, if there is any + QString constraint_name; + if(tc->getType() == sqlite3TokenTypes::CONSTRAINT) + { + tc = tc->getNextSibling(); // CONSTRAINT + constraint_name = identifier(tc); + tc = tc->getNextSibling(); // identifier + } + + switch(tc->getType()) + { + case sqlite3TokenTypes::PRIMARY: + { + PrimaryKeyConstraint* pk = new PrimaryKeyConstraint; + pk->setName(constraint_name); + + tc = tc->getNextSibling()->getNextSibling(); // skip primary and key + tc = tc->getNextSibling(); // skip LPAREN + + QStringList fields; + do + { + antlr::RefAST indexed_column = tc->getFirstChild(); + + QString col = columnname(indexed_column); + fields.push_back(col); + + indexed_column = indexed_column->getNextSibling(); + if(indexed_column != antlr::nullAST + && (indexed_column->getType() == sqlite3TokenTypes::ASC + || indexed_column->getType() == sqlite3TokenTypes::DESC)) + { + // TODO save ASC / DESC information? + tab->setFullyParsed(false); + indexed_column = indexed_column->getNextSibling(); + } + + if(indexed_column != antlr::nullAST && indexed_column->getType() == sqlite3TokenTypes::COLLATE) + { + indexed_column = indexed_column->getNextSibling(); // COLLATE + // TODO save collation name + tab->setFullyParsed(false); + indexed_column = indexed_column->getNextSibling(); // collation name + } + + if(indexed_column != antlr::nullAST && indexed_column->getType() == sqlite3TokenTypes::AUTOINCREMENT) + { + auto field = findField(tab, col); + field->setAutoIncrement(true); + indexed_column = indexed_column->getNextSibling(); + } + + tc = tc->getNextSibling(); // indexed column + + while(tc != antlr::nullAST && tc->getType() == sqlite3TokenTypes::COMMA) + { + tc = tc->getNextSibling(); // skip ident and comma + } + } while(tc != antlr::nullAST && tc->getType() != sqlite3TokenTypes::RPAREN); + + // We're either done now or there is a conflict clause + tc = tc->getNextSibling(); // skip RPAREN + pk->setConflictAction(parseConflictClause(tc)); + + tab->addConstraint(fields, ConstraintPtr(pk)); + } + break; + case sqlite3TokenTypes::UNIQUE: + { + UniqueConstraint* unique = new UniqueConstraint; + unique->setName(constraint_name); + + tc = tc->getNextSibling(); // skip UNIQUE + tc = tc->getNextSibling(); // skip LPAREN + QStringList fields; + do + { + antlr::RefAST indexed_column = tc->getFirstChild(); + + QString col = columnname(indexed_column); + auto field = findField(tab, col); + fields.push_back(field->name()); + + indexed_column = indexed_column->getNextSibling(); + if(indexed_column != antlr::nullAST + && (indexed_column->getType() == sqlite3TokenTypes::ASC + || indexed_column->getType() == sqlite3TokenTypes::DESC)) + { + // TODO save ASC / DESC information? + tab->setFullyParsed(false); + indexed_column = indexed_column->getNextSibling(); + } + + if(indexed_column != antlr::nullAST && indexed_column->getType() == sqlite3TokenTypes::COLLATE) + { + indexed_column = indexed_column->getNextSibling(); // COLLATE + // TODO save collation name + tab->setFullyParsed(false); + indexed_column = indexed_column->getNextSibling(); // collation name + } + + tc = tc->getNextSibling(); // indexed column + + while(tc != antlr::nullAST && tc->getType() == sqlite3TokenTypes::COMMA) + { + tc = tc->getNextSibling(); // skip ident and comma + } + } while(tc != antlr::nullAST && tc->getType() != sqlite3TokenTypes::RPAREN); + + if(fields.size() == 1 && constraint_name.isEmpty()) + { + findField(tab, fields[0])->setUnique(true); + delete unique; + } else { + tab->addConstraint(fields, ConstraintPtr(unique)); + } + } + break; + case sqlite3TokenTypes::FOREIGN: + { + ForeignKeyClause* fk = new ForeignKeyClause; + fk->setName(constraint_name); + + tc = tc->getNextSibling(); // FOREIGN + tc = tc->getNextSibling(); // KEY + tc = tc->getNextSibling(); // LPAREN + + QStringList fields; + do + { + QString col = columnname(tc); + fields.push_back(findField(tab, col)->name()); + + tc = tc->getNextSibling(); + + while(tc != antlr::nullAST && tc->getType() == sqlite3TokenTypes::COMMA) + tc = tc->getNextSibling(); // skip ident and comma + } while(tc != antlr::nullAST && tc->getType() != sqlite3TokenTypes::RPAREN); + + tc = tc->getNextSibling(); + tc = tc->getNextSibling(); // REFERENCES + + fk->setTable(identifier(tc)); + tc = tc->getNextSibling(); // identifier + + if(tc != antlr::nullAST && tc->getType() == sqlite3TokenTypes::LPAREN) + { + tc = tc->getNextSibling(); // LPAREN + + QStringList fk_cols; + while(tc != antlr::nullAST && tc->getType() != sqlite3TokenTypes::RPAREN) + { + if(tc->getType() != sqlite3TokenTypes::COMMA) + fk_cols.push_back(identifier(tc)); + tc = tc->getNextSibling(); + } + fk->setColumns(fk_cols); + + tc = tc->getNextSibling(); // RPAREN + } + + fk->setConstraint(concatTextAST(tc, true)); + tab->addConstraint(fields, ConstraintPtr(fk)); + } + break; + case sqlite3TokenTypes::CHECK: + { + CheckConstraint* check = new CheckConstraint; + check->setName(constraint_name); + + tc = tc->getNextSibling(); // skip CHECK + tc = tc->getNextSibling(); // skip LPAREN + + check->setExpression(concatExprAST(tc)); + tab->addConstraint(QStringList(), ConstraintPtr(check)); + } + break; + default: + { + std::cout << "unknown table constraint in " << tab->name().toStdString() << std::endl; + tab->setFullyParsed(false); + } + break; + } + + s = s->getNextSibling(); //COMMA or RPAREN + if(s->getType() == sqlite3TokenTypes::COMMA || s->getType() == sqlite3TokenTypes::RPAREN) + s = s->getNextSibling(); + } else { + // It is + + s = s->getNextSibling(); // WITHOUT + s = s->getNextSibling(); // ROWID + + tab->setRowidColumn(tab->findPk()->name()); + } + } + } + + return TablePtr(tab); +} + +void CreateTableWalker::parsecolumn(Table* table, antlr::RefAST c) +{ + QString colname; + QString type = "TEXT"; + bool autoincrement = false; + bool notnull = false; + bool unique = false; + QString defaultvalue; + QString check; + QString collation; + sqlb::PrimaryKeyConstraint* primaryKey = nullptr; + std::vector foreignKeys; + + colname = columnname(c); + c = c->getNextSibling(); //type? + if(c != antlr::nullAST && c->getType() == sqlite3TokenTypes::TYPE_NAME) + { + antlr::RefAST t = c->getFirstChild(); + + if(t != antlr::nullAST) + { + type.clear(); + } + + while(t != antlr::nullAST) + { + int thisType = t->getType(); + type.append(textAST(t)); + t = t->getNextSibling(); + if(t != antlr::nullAST) + { + int nextType = t->getType(); + if(nextType != sqlite3TokenTypes::LPAREN && nextType != sqlite3TokenTypes::RPAREN && + thisType != sqlite3TokenTypes::LPAREN) + { + type.append(" "); + } + } + } + c = c->getNextSibling(); + } + + // finished with type parsing + // now columnconstraints + while(c != antlr::nullAST) + { + antlr::RefAST con = c->getFirstChild(); + + // Extract constraint name, if there is any + QString constraint_name; + if(con->getType() == sqlite3TokenTypes::CONSTRAINT) + { + con = con->getNextSibling(); // CONSTRAINT + constraint_name = identifier(con); + con = con->getNextSibling(); // identifier + } + + switch(con->getType()) + { + case sqlite3TokenTypes::PRIMARY: + { + // If we have already allocated a primary key object, delete it first. This should never happen in real world situations because + // SQLite only supports one primary key constraint per field. + if(primaryKey) + delete primaryKey; + + primaryKey = new PrimaryKeyConstraint; + primaryKey->setName(constraint_name); + + con = con->getNextSibling()->getNextSibling(); // skip KEY + if(con != antlr::nullAST && (con->getType() == sqlite3TokenTypes::ASC + || con->getType() == sqlite3TokenTypes::DESC)) + { + table->setFullyParsed(false); + con = con->getNextSibling(); //skip + } + + primaryKey->setConflictAction(parseConflictClause(con)); + + if(con != antlr::nullAST && con->getType() == sqlite3TokenTypes::AUTOINCREMENT) + autoincrement = true; + } + break; + case sqlite3TokenTypes::NOT: + { + // TODO Support constraint names here + if(!constraint_name.isEmpty()) + table->setFullyParsed(false); + + notnull = true; + } + break; + case sqlite3TokenTypes::NULL_T: + { + notnull = false; + } + break; + case sqlite3TokenTypes::CHECK: + { + // TODO Support constraint names here + if(!constraint_name.isEmpty()) + table->setFullyParsed(false); + + con = con->getNextSibling(); //CHECK + con = con->getNextSibling(); //LPAREN + + check = concatExprAST(con); + } + break; + case sqlite3TokenTypes::DEFAULT: + { + // TODO Support constraint names here + if(!constraint_name.isEmpty()) + table->setFullyParsed(false); + + con = con->getNextSibling(); //SIGNEDNUMBER,STRING,LPAREN + defaultvalue = concatTextAST(con); + } + break; + case sqlite3TokenTypes::UNIQUE: + { + // TODO Support constraint names here + if(!constraint_name.isEmpty()) + table->setFullyParsed(false); + + unique = true; + } + break; + case sqlite3TokenTypes::REFERENCES: + { + con = con->getNextSibling(); // REFERENCES + + sqlb::ForeignKeyClause* foreignKey = new ForeignKeyClause; + foreignKey->setTable(identifier(con)); + foreignKey->setName(constraint_name); + con = con->getNextSibling(); // identifier + + if(con != antlr::nullAST && con->getType() == sqlite3TokenTypes::LPAREN) + { + con = con->getNextSibling(); // LPAREN + + QStringList fk_cols; + while(con != antlr::nullAST && con->getType() != sqlite3TokenTypes::RPAREN) + { + if(con->getType() != sqlite3TokenTypes::COMMA) + fk_cols.push_back(identifier(con)); + con = con->getNextSibling(); + } + foreignKey->setColumns(fk_cols); + + con = con->getNextSibling(); // RPAREN + } + + foreignKey->setConstraint(concatTextAST(con, true)); + foreignKeys.push_back(foreignKey); + } + break; + case sqlite3TokenTypes::COLLATE: + { + con = con->getNextSibling(); // COLLATE + collation = identifier(con); + con = con->getNextSibling(); // collation name + } + break; + default: + { + std::cout << "unknown column constraint in " << table->name().toStdString() << "." << colname.toStdString() << std::endl; + table->setFullyParsed(false); + } + break; + } + c = c->getNextSibling(); + } + + Field f(colname, type, notnull, defaultvalue, check, unique, collation); + f.setAutoIncrement(autoincrement); + table->fields.push_back(f); + + for(sqlb::ForeignKeyClause* fk : foreignKeys) + table->addConstraint({f.name()}, ConstraintPtr(fk)); + if(primaryKey) + { + QStringList v; + if(table->constraint(v, Constraint::PrimaryKeyConstraintType)) + { + table->primaryKeyRef().push_back(f.name()); + + // Delete useless primary key constraint. There already is a primary key object for this table, we + // don't need another one. + delete primaryKey; + } else { + table->addConstraint({f.name()}, ConstraintPtr(primaryKey)); + } + } +} + +QString CreateTableWalker::parseConflictClause(antlr::RefAST c) +{ + QString conflictAction; + + if(c != antlr::nullAST && c->getType() == sqlite3TokenTypes::ON && c->getNextSibling()->getType() == sqlite3TokenTypes::CONFLICT) + { + c = c->getNextSibling(); // skip ON + c = c->getNextSibling(); // skip CONFLICT + conflictAction = identifier(c); + c = c->getNextSibling(); // skip action + } + + return conflictAction; +} + + + +QString IndexedColumn::toString(const QString& indent, const QString& sep) const +{ + QString name = m_isExpression ? m_name : escapeIdentifier(m_name); + QString order = (m_order.isEmpty() ? QString("") : (sep + m_order)); + return indent + name + order; +} + +Index::~Index() +{ +} + +Index& Index::operator=(const Index& rhs) +{ + // Base class + Object::operator=(rhs); + + // Just assign the easy stuff + m_unique = rhs.m_unique; + m_table = rhs.m_table; + m_whereExpr = rhs.m_whereExpr; + + // Make copies of the column + for(const IndexedColumn& c : rhs.fields) + fields.push_back(c); + + return *this; +} + +QStringList Index::columnSqlList() const +{ + QStringList sl; + + for(const IndexedColumn& c : fields) + sl << c.toString(); + + return sl; +} + +QString Index::sql(const QString& schema, bool ifNotExists) const +{ + // Start CREATE (UNIQUE) INDEX statement + QString sql = QString("CREATE %1INDEX%2 %3 ON %4 (\n") + .arg(m_unique ? QString("UNIQUE ") : QString("")) + .arg(ifNotExists ? QString(" IF NOT EXISTS") : QString("")) + .arg(ObjectIdentifier(schema, m_name).toString(true)) + .arg(sqlb::escapeIdentifier(m_table)); + + // Add column list + sql += columnSqlList().join(",\n"); + + // Add partial index bit + sql += QString("\n)"); + if(!m_whereExpr.isEmpty()) + sql += QString(" WHERE ") + m_whereExpr; + + return sql + ";"; +} + +FieldInfoList Index::fieldInformation() const +{ + FieldInfoList result; + for(const IndexedColumn& c : fields) + result.emplace_back(c.name(), c.order(), c.toString(" ", " ")); + return result; +} + +IndexPtr Index::parseSQL(const QString& sSQL) +{ + SetLocaleToC locale; + + std::stringstream s; + s << sSQL.toStdString(); + Sqlite3Lexer lex(s); + + Sqlite3Parser parser(lex); + + antlr::ASTFactory ast_factory; + parser.initializeASTFactory(ast_factory); + parser.setASTFactory(&ast_factory); + + try + { + parser.createindex(); + CreateIndexWalker ctw(parser.getAST()); + + auto i = ctw.index(); + i->setOriginalSql(sSQL); + return i; + } + catch(antlr::ANTLRException& ex) + { + std::cerr << "Sqlite parse error: " << ex.toString() << "(" << sSQL.toStdString() << ")" << std::endl; + } + catch(...) + { + std::cerr << "Sqlite parse error: " << sSQL.toStdString() << std::endl; //TODO + } + + return IndexPtr(new Index("")); +} + +IndexPtr CreateIndexWalker::index() +{ + Index* index = new Index(""); + index->setFullyParsed(true); + + if(m_root) // CREATE INDEX + { + antlr::RefAST s = m_root->getFirstChild(); + + // Skip to index name + while(s->getType() != Sqlite3Lexer::ID && + s->getType() != Sqlite3Lexer::QUOTEDID && + s->getType() != Sqlite3Lexer::QUOTEDLITERAL && + s->getType() != Sqlite3Lexer::STRINGLITERAL && + s->getType() != sqlite3TokenTypes::KEYWORDASTABLENAME) + { + // Is this a unique index? + if(s->getType() == Sqlite3Lexer::UNIQUE) + index->setUnique(true); + + s = s->getNextSibling(); + } + + // Extract and set index name + index->setName(tablename(s)); + + // Get table name + s = s->getNextSibling(); // ON + s = s->getNextSibling(); // table name + index->setTable(tablename(s)); + + s = s->getNextSibling(); // LPAREN + s = s->getNextSibling(); // first column name + antlr::RefAST column = s; + // loop columndefs + while(column != antlr::nullAST && column->getType() == sqlite3TokenTypes::INDEXEDCOLUMN) + { + parsecolumn(index, column->getFirstChild()); + column = column->getNextSibling(); // COMMA or RPAREN + column = column->getNextSibling(); // null or WHERE + + s = s->getNextSibling(); // COLUMNDEF + s = s->getNextSibling(); // COMMA or RPAREN + } + + // Now we are finished or it is a partial index + if(s != antlr::nullAST) + { + // This should be a 'where' then + if(s->getType() != sqlite3TokenTypes::WHERE) + { + // It is something else + index->setFullyParsed(false); + } else { + s = s->getNextSibling(); // expr + index->setWhereExpr(concatTextAST(s, true)); + } + } + } + + return IndexPtr(index); +} + +void CreateIndexWalker::parsecolumn(Index* index, antlr::RefAST c) +{ + QString name; + bool isExpression; + QString order; + + // First count the number of nodes used for the name or the expression. We reach the end of the name nodes list when we either + // get to the end of the list, get to a COMMA or a RPAREN, or get to the COLLATE keyword or get to the ASC/DESC keywords. + // Then see how many items there are: if it's one it's a normal index column with only a column name. In this case get the identifier. + // If it's more than one item it's an expression. In this case get all the items as they are. + int number_of_name_items = 0; + antlr::RefAST n = c; + while(n != antlr::nullAST + && n->getType() != sqlite3TokenTypes::COLLATE + && n->getType() != sqlite3TokenTypes::ASC + && n->getType() != sqlite3TokenTypes::DESC + && n->getType() != sqlite3TokenTypes::COMMA + && n->getType() != sqlite3TokenTypes::RPAREN) + { + number_of_name_items++; + n = n->getNextSibling(); + } + if(number_of_name_items == 1) + { + name = identifier(c); + isExpression = false; + c = c->getNextSibling(); + } else { + for(int i=0;igetText().c_str() + QString(" "); + c = c->getNextSibling(); + } + name.chop(1); + isExpression = true; + } + + // Parse the rest of the column definition + while(c != antlr::nullAST) + { + switch(c->getType()) + { + case sqlite3TokenTypes::ASC: + case sqlite3TokenTypes::DESC: + order = c->getText().c_str(); + break; + default: + // TODO Add support for COLLATE + index->setFullyParsed(false); + } + + c = c->getNextSibling(); + } + + index->fields.emplace_back(name, isExpression, order); +} + + + +View::~View() +{ +} + +ViewPtr View::parseSQL(const QString& sSQL) +{ + // TODO + + auto v = ViewPtr(new View("")); + v->setOriginalSql(sSQL); + return v; +} + +QStringList View::fieldNames() const +{ + QStringList sl; + + for(const Field& f : fields) + sl << f.name(); + + return sl; +} + +FieldInfoList View::fieldInformation() const +{ + FieldInfoList result; + for(const Field& f : fields) + result.emplace_back(f.name(), f.type(), f.toString(" ", " ")); + return result; +} + + +TriggerPtr Trigger::parseSQL(const QString& sSQL) +{ + // TODO + + auto t = TriggerPtr(new Trigger("")); + t->setOriginalSql(sSQL); + return t; +} + +} //namespace sqlb diff -Nru sqlitebrowser-3.10.100ubuntu1/src/sql/sqlitetypes.h sqlitebrowser-3.11.1/src/sql/sqlitetypes.h --- sqlitebrowser-3.10.100ubuntu1/src/sql/sqlitetypes.h 1970-01-01 00:00:00.000000000 +0000 +++ sqlitebrowser-3.11.1/src/sql/sqlitetypes.h 2019-02-19 23:51:34.000000000 +0000 @@ -0,0 +1,643 @@ +#pragma once +#ifndef SQLITETYPES_H +#define SQLITETYPES_H + +#include +#include +#include +#include +#include + +template +bool contains(const C& container, E element) +{ + return std::find(container.begin(), container.end(), element) != container.end(); +} + +namespace sqlb { + +#if QT_VERSION < QT_VERSION_CHECK(5, 6, 0) + +#if QT_VERSION < QT_VERSION_CHECK(5, 5, 0) +struct QHashCombine { + typedef uint result_type; + template + Q_DECL_CONSTEXPR result_type operator()(uint seed, const T &t) const Q_DECL_NOEXCEPT_EXPR(noexcept(qHash(t))) + // combiner taken from N3876 / boost::hash_combine + { return seed ^ (qHash(t) + 0x9e3779b9 + (seed << 6) + (seed >> 2)) ; } +}; + +template +inline uint qHashRange(InputIterator first, InputIterator last, uint seed = 0) + Q_DECL_NOEXCEPT_EXPR(noexcept(qHash(*first))) // assume iterator operations don't throw +{ + return std::accumulate(first, last, seed, QHashCombine()); +} +#endif + +template +uint qHash(const QList& key, uint seed = 0) + Q_DECL_NOEXCEPT_EXPR(noexcept(qHashRange(key.cbegin(), key.cend(), seed))) +{ + return qHashRange(key.cbegin(), key.cend(), seed); +} +#endif + +enum escapeQuoting { + DoubleQuotes, + GraveAccents, + SquareBrackets +}; + +// Set quoting style for escapeIdentifier +void setIdentifierQuoting(escapeQuoting toQuoting); + +QString escapeIdentifier(QString id); +std::string escapeIdentifier(std::string id); +QStringList escapeIdentifier(const QStringList& ids); + +class ObjectIdentifier +{ +public: + ObjectIdentifier(const QString& schema, const QString& name) + : m_schema(schema), + m_name(name) + { + } + + ObjectIdentifier() + : m_schema("main"), + m_name(QString()) + { + } + + explicit ObjectIdentifier(QVariant variant) + { + QStringList str = variant.toStringList(); + if(str.size()) + { + m_schema = str.first(); + if(str.size() >= 2) + m_name = str.last(); + } + } + + bool operator==(const ObjectIdentifier& rhs) const + { + return (rhs.m_schema == m_schema && rhs.m_name == m_name); + } + + bool operator<(const ObjectIdentifier& rhs) const + { + return toDisplayString() < rhs.toDisplayString(); + } + + const QString& schema() const { return m_schema; } + const QString& name() const { return m_name; } + void setSchema(const QString& schema) { m_schema = schema; } + void setName(const QString& name) { m_name = name; } + + void clear() + { + m_schema = "main"; + m_name.clear(); + } + + bool isEmpty() const { return m_name.isEmpty(); } + + // This returns a string which can be used in SQL statements + QString toString(bool shortName = false) const + { + if(shortName && m_schema == "main") + return sqlb::escapeIdentifier(m_name); + else + return QString("%1.%2").arg(sqlb::escapeIdentifier(m_schema)).arg(sqlb::escapeIdentifier(m_name)); + } + + // This returns a string which can be used in the user interface + QString toDisplayString() const + { + if(m_schema == "main") + return m_name; + else + return QString("%1.%2").arg(m_schema).arg(m_name); + } + + QVariant toVariant() const + { + QStringList result; + result << m_schema << m_name; + return QVariant(result); + } + +private: + QString m_schema; + QString m_name; +}; + +struct StringListHash +{ + size_t operator()(const QStringList& key) const + { + return qHash(key); + } +}; + +class Object; +class Table; +class Index; +class View; +class Trigger; +class Field; +class Constraint; +class IndexedColumn; +struct FieldInfo; +using ObjectPtr = std::shared_ptr; +using TablePtr = std::shared_ptr; +using IndexPtr = std::shared_ptr; +using ViewPtr = std::shared_ptr; +using TriggerPtr = std::shared_ptr; +using ConstraintPtr = std::shared_ptr; +using FieldVector = std::vector; +using IndexedColumnVector = std::vector; +using ConstraintMap = std::unordered_multimap; +using FieldInfoList = std::vector; + +struct FieldInfo +{ + FieldInfo(const QString& name_, const QString& type_, const QString& sql_) + : name(name_), type(type_), sql(sql_) + {} + + QString name; + QString type; + QString sql; +}; + +class Object +{ +public: + enum Types + { + Table, + Index, + View, + Trigger + }; + + explicit Object(const QString& name): m_name(name), m_fullyParsed(false) {} + virtual ~Object() {} + + bool operator==(const Object& rhs) const; + + virtual Types type() const = 0; + static QString typeToString(Types type); + + void setName(const QString& name) { m_name = name; } + const QString& name() const { return m_name; } + + void setOriginalSql(const QString& original_sql) { m_originalSql = original_sql; } + QString originalSql() const { return m_originalSql; } + + virtual QString baseTable() const { return QString(); } + + void setFullyParsed(bool fully_parsed) { m_fullyParsed = fully_parsed; } + bool fullyParsed() const { return m_fullyParsed; } + + virtual FieldInfoList fieldInformation() const { return FieldInfoList(); } + + /** + * @brief Returns the CREATE statement for this object + * @param schema The schema name of the object + * @param ifNotExists If set to true the "IF NOT EXISTS" qualifier will be added to the create statement + * @return A QString with the CREATE statement. + */ + virtual QString sql(const QString& schema = QString("main"), bool ifNotExists = false) const = 0; + +protected: + QString m_name; + QString m_originalSql; + bool m_fullyParsed; +}; + +class Constraint +{ +public: + enum ConstraintTypes + { + NoType, + PrimaryKeyConstraintType, + UniqueConstraintType, + ForeignKeyConstraintType, + CheckConstraintType, + }; + + explicit Constraint(const QString& name = QString()) + : m_name(name) + { + } + virtual ~Constraint() {} + + virtual ConstraintTypes type() const = 0; + + void setName(const QString& name) { m_name = name; } + const QString& name() const { return m_name; } + + virtual QString toSql(const QStringList& applyOn) const = 0; + +protected: + QString m_name; +}; + +class ForeignKeyClause : public Constraint +{ +public: + ForeignKeyClause(const QString& table = QString(), const QStringList& columns = QStringList(), const QString& constraint = QString()) + : m_table(table), + m_columns(columns), + m_constraint(constraint), + m_override(QString()) + { + } + + bool isSet() const; + QString toString() const; + void setFromString(const QString& fk); + + void setTable(const QString& table) { m_override = QString(); m_table = table; } + const QString& table() const { return m_table; } + + void setColumns(const QStringList& columns) { m_columns = columns; } + const QStringList& columns() const { return m_columns; } + + void setConstraint(const QString& constraint) { m_constraint = constraint; } + const QString& constraint() const { return m_constraint; } + + QString toSql(const QStringList& applyOn) const override; + + ConstraintTypes type() const override { return ForeignKeyConstraintType; } + +private: + QString m_table; + QStringList m_columns; + QString m_constraint; + + QString m_override; +}; + +class UniqueConstraint : public Constraint +{ +public: + UniqueConstraint() {} + + QString toSql(const QStringList& applyOn) const override; + + ConstraintTypes type() const override { return UniqueConstraintType; } +}; + +class PrimaryKeyConstraint : public Constraint +{ +public: + PrimaryKeyConstraint() {} + + void setConflictAction(const QString& conflict) { m_conflictAction = conflict; } + const QString& conflictAction() const { return m_conflictAction; } + + QString toSql(const QStringList& applyOn) const override; + + ConstraintTypes type() const override { return PrimaryKeyConstraintType; } + +private: + QString m_conflictAction; +}; + +class CheckConstraint : public Constraint +{ +public: + explicit CheckConstraint(const QString& expr = QString()) + : m_expression(expr) + { + } + + void setExpression(const QString& expr) { m_expression = expr; } + QString expression() const { return m_expression; } + + QString toSql(const QStringList& applyOn) const override; + + ConstraintTypes type() const override { return CheckConstraintType; } + +private: + QString m_expression; +}; + +class Field +{ +public: + Field() + : m_notnull(false), + m_autoincrement(false), + m_unique(false) + {} + + Field(const QString& name, + const QString& type, + bool notnull = false, + const QString& defaultvalue = "", + const QString& check = "", + bool unique = false, + const QString& collation = QString()) + : m_name(name) + , m_type(type) + , m_notnull(notnull) + , m_check(check) + , m_defaultvalue(defaultvalue) + , m_autoincrement(false) + , m_unique(unique) + , m_collation(collation) + {} + + bool operator==(const Field& rhs) const; + + QString toString(const QString& indent = "\t", const QString& sep = "\t") const; + + void setName(const QString& name) { m_name = name; } + void setType(const QString& type) { m_type = type; } + void setNotNull(bool notnull = true) { m_notnull = notnull; } + void setCheck(const QString& check) { m_check = check; } + void setDefaultValue(const QString& defaultvalue) { m_defaultvalue = defaultvalue; } + void setAutoIncrement(bool autoinc) { m_autoincrement = autoinc; } + void setUnique(bool u) { m_unique = u; } + void setCollation(const QString& collation) { m_collation = collation; } + + bool isText() const; + bool isInteger() const; + bool isBlob() const; + bool isReal() const; + bool isNumeric() const; + + // Type affinity of the column according to SQLite3 rules + QString affinity() const; + + const QString& name() const { return m_name; } + const QString& type() const { return m_type; } + bool notnull() const { return m_notnull; } + const QString& check() const { return m_check; } + const QString& defaultValue() const { return m_defaultvalue; } + bool autoIncrement() const { return m_autoincrement; } + bool unique() const { return m_unique; } + const QString& collation() const { return m_collation; } + +private: + QString m_name; + QString m_type; + bool m_notnull; + QString m_check; + QString m_defaultvalue; + bool m_autoincrement; //! this is stored here for simplification + bool m_unique; + QString m_collation; +}; + +class Table : public Object +{ +public: + explicit Table(const QString& name): Object(name), m_rowidColumn("_rowid_") {} + ~Table() override; + Table& operator=(const Table& rhs); + + bool operator==(const Table& rhs) const; + + Types type() const override { return Object::Table; } + + FieldVector fields; + using field_type = Field; + using field_iterator = FieldVector::iterator; + + /** + * @brief Returns the CREATE TABLE statement for this table object + * @return A QString with the CREATE TABLE object. + */ + QString sql(const QString& schema = QString("main"), bool ifNotExists = false) const override; + + QStringList fieldNames() const; + + void setRowidColumn(const QString& rowid) { m_rowidColumn = rowid; } + const QString& rowidColumn() const { return m_rowidColumn; } + bool isWithoutRowidTable() const { return m_rowidColumn != "_rowid_"; } + + void setVirtualUsing(const QString& virt_using) { m_virtual = virt_using; } + QString virtualUsing() const { return m_virtual; } + bool isVirtual() const { return !m_virtual.isEmpty(); } + + FieldInfoList fieldInformation() const override; + + void addConstraint(QStringList fields, ConstraintPtr constraint); + void setConstraint(QStringList fields, ConstraintPtr constraint); + void removeConstraints(QStringList fields = QStringList(), Constraint::ConstraintTypes type = Constraint::NoType); //! Only removes the first constraint, if any + ConstraintPtr constraint(QStringList fields = QStringList(), Constraint::ConstraintTypes type = Constraint::NoType) const; //! Only returns the first constraint, if any + std::vector constraints(QStringList fields = QStringList(), Constraint::ConstraintTypes type = Constraint::NoType) const; + ConstraintMap allConstraints() const { return m_constraints; } + void setConstraints(const ConstraintMap& constraints); + QStringList& primaryKeyRef(); + const QStringList& primaryKey() const; + void removeKeyFromAllConstraints(const QString& key); + void renameKeyInAllConstraints(const QString& key, const QString& to); + + field_iterator findPk(); + + /** + * @brief parseSQL Parses the create Table statement in sSQL. + * @param sSQL The create table statement. + * @return The table object. The table object may be empty if parsing failed. + */ + static TablePtr parseSQL(const QString& sSQL); +private: + QStringList fieldList() const; + bool hasAutoIncrement() const; + +private: + QString m_rowidColumn; + ConstraintMap m_constraints; + QString m_virtual; +}; + +class IndexedColumn +{ +public: + IndexedColumn(const QString& name, bool expr, const QString& order = QString()) + : m_name(name), + m_isExpression(expr), + m_order(order) + { + } + + void setName(const QString& name) { m_name = name; } + QString name() const { return m_name; } + + void setExpression(bool expr) { m_isExpression = expr; } + bool expression() const { return m_isExpression; } + + void setOrder(const QString& order) { m_order = order.toUpper(); } + QString order() const { return m_order; } + + QString toString(const QString& indent = "\t", const QString& sep = "\t") const; + +private: + QString m_name; + bool m_isExpression; + QString m_order; +}; + +class Index : public Object +{ +public: + explicit Index(const QString& name): Object(name), m_unique(false) {} + ~Index() override; + Index& operator=(const Index& rhs); + + Types type() const override { return Object::Index; } + + IndexedColumnVector fields; + using field_type = IndexedColumn; + using field_iterator = IndexedColumnVector::iterator; + + QString baseTable() const override { return m_table; } + + void setUnique(bool unique) { m_unique = unique; } + bool unique() const { return m_unique; } + + void setTable(const QString& table) { m_table = table; } + const QString& table() const { return m_table; } + + void setWhereExpr(const QString& expr) { m_whereExpr = expr; } + const QString& whereExpr() const { return m_whereExpr; } + + /** + * @brief Returns the CREATE INDEX statement for this index object + * @return A QString with the CREATE INDEX object. + */ + QString sql(const QString& schema = QString("main"), bool ifNotExists = false) const override; + + /** + * @brief parseSQL Parses the CREATE INDEX statement in sSQL. + * @param sSQL The create index statement. + * @return The index object. The index object may be empty if the parsing failed. + */ + static IndexPtr parseSQL(const QString& sSQL); + + FieldInfoList fieldInformation() const override; + +private: + QStringList columnSqlList() const; + + bool m_unique; + QString m_table; + QString m_whereExpr; +}; + +class View : public Object +{ +public: + explicit View(const QString& name): Object(name) {} + ~View() override; + + Types type() const override { return Object::View; } + + FieldVector fields; + + QString sql(const QString& schema = QString("main"), bool ifNotExists = false) const override + { /* TODO */ Q_UNUSED(schema); Q_UNUSED(ifNotExists); return m_originalSql; } + + static ViewPtr parseSQL(const QString& sSQL); + + QStringList fieldNames() const; + + FieldInfoList fieldInformation() const override; +}; + +class Trigger : public Object +{ +public: + explicit Trigger(const QString& name): Object(name) {} + ~Trigger() override {} + + Types type() const override { return Object::Trigger; } + + QString sql(const QString& schema = QString("main"), bool ifNotExists = false) const override + { /* TODO */ Q_UNUSED(schema); Q_UNUSED(ifNotExists); return m_originalSql; } + + static TriggerPtr parseSQL(const QString& sSQL); + + QString baseTable() const override { return m_table; } + + void setTable(const QString& table) { m_table = table; } + QString table() const { return m_table; } + +private: + QString m_table; +}; + +/** + * @brief findField Finds a field in the database object and returns an iterator to it. + * @param object + * @param name + * @return The iterator pointing to the field in the field container of the object if the field was found. + * object.fields.end() if the field couldn't be found. + */ +template +typename T::field_iterator findField(T* object, const QString& name) +{ + return std::find_if(object->fields.begin(), object->fields.end(), [&name](const typename T::field_type& f) { + return f.name().compare(name, Qt::CaseInsensitive) == 0; + }); +} +template +typename T::field_iterator findField(const T* object, const QString& name) +{ + return findField(const_cast(object), name); +} +template +typename std::remove_reference::type::field_iterator findField(std::shared_ptr object, const QString& name) +{ + return findField(object.get(), name); +} +template +typename std::remove_reference::type::field_iterator findField(T& object, const QString& name) +{ + return findField(&object, name); +} + +template struct is_shared_ptr : std::false_type {}; +template struct is_shared_ptr> : std::true_type {}; + +/** + * @brief removeField Finds and removes a field in the database object + * @param object + * @param name + * @return true if sucessful, otherwise false + */ +template +bool removeField(T* object, const QString& name) +{ + auto index = findField(object, name); + if(index != object->fields.end()) + { + object->fields.erase(index); + return true; + } + return false; +} +template::value>::type> +bool removeField(T object, const QString& name) +{ + return removeField(object.get(), name); +} +template::value>::type> +bool removeField(T& object, const QString& name) +{ + return removeField(&object, name); +} + +} //namespace sqlb + +#endif diff -Nru sqlitebrowser-3.10.100ubuntu1/src/SqlExecutionArea.cpp sqlitebrowser-3.11.1/src/SqlExecutionArea.cpp --- sqlitebrowser-3.10.100ubuntu1/src/SqlExecutionArea.cpp 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/src/SqlExecutionArea.cpp 2019-02-19 23:51:34.000000000 +0000 @@ -14,7 +14,8 @@ QWidget(parent), db(_db), ui(new Ui::SqlExecutionArea), - m_columnsResized(false) + m_columnsResized(false), + error_state(false) { // Create UI ui->setupUi(this); @@ -57,6 +58,7 @@ void SqlExecutionArea::finishExecution(const QString& result, const bool ok) { + error_state = !ok; m_columnsResized = false; ui->editErrors->setPlainText(result); // Set reddish background when not ok @@ -97,6 +99,11 @@ return ui->tableResult; } +QTextEdit* SqlExecutionArea::getStatusEdit() +{ + return ui->editErrors; +} + void SqlExecutionArea::saveAsCsv() { ExportDataDialog dialog(db, ExportDataDialog::ExportFormatCsv, this, model->query()); diff -Nru sqlitebrowser-3.10.100ubuntu1/src/SqlExecutionArea.h sqlitebrowser-3.11.1/src/SqlExecutionArea.h --- sqlitebrowser-3.10.100ubuntu1/src/SqlExecutionArea.h 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/src/SqlExecutionArea.h 2019-02-19 23:51:34.000000000 +0000 @@ -8,6 +8,8 @@ class DBBrowserDB; class ExtendedTableWidget; +class QTextEdit; + namespace Ui { class SqlExecutionArea; } @@ -18,7 +20,7 @@ public: explicit SqlExecutionArea(DBBrowserDB& _db, QWidget* parent = nullptr); - ~SqlExecutionArea(); + ~SqlExecutionArea() override; QString getSql() const; QString getSelectedSql() const; @@ -29,11 +31,14 @@ SqliteTableModel* getModel() { return model; } SqlTextEdit* getEditor(); ExtendedTableWidget *getTableResult(); + QTextEdit* getStatusEdit(); + + bool inErrorState() const { return error_state; } public slots: - virtual void finishExecution(const QString& result, const bool ok); - virtual void saveAsCsv(); - virtual void reloadSettings(); + void finishExecution(const QString& result, const bool ok); + void saveAsCsv(); + void reloadSettings(); void fetchedData(); void setFindFrameVisibility(bool show); @@ -54,6 +59,7 @@ Ui::SqlExecutionArea* ui; bool m_columnsResized; // This is set to true if the columns of the table view were already adjusted to fit their contents bool showErrorIndicators; + bool error_state; }; #endif diff -Nru sqlitebrowser-3.10.100ubuntu1/src/SqlExecutionArea.ui sqlitebrowser-3.11.1/src/SqlExecutionArea.ui --- sqlitebrowser-3.10.100ubuntu1/src/SqlExecutionArea.ui 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/src/SqlExecutionArea.ui 2019-02-19 23:51:34.000000000 +0000 @@ -198,11 +198,11 @@ - - - 16777215 - 120 - + + + 0 + 120 + diff -Nru sqlitebrowser-3.10.100ubuntu1/src/sqlitedb.cpp sqlitebrowser-3.11.1/src/sqlitedb.cpp --- sqlitebrowser-3.10.100ubuntu1/src/sqlitedb.cpp 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/src/sqlitedb.cpp 2019-02-19 23:51:34.000000000 +0000 @@ -2,6 +2,8 @@ #include "sqlite.h" #include "sqlitetablemodel.h" #include "CipherDialog.h" +#include "CipherSettings.h" +#include "DotenvFormat.h" #include "Settings.h" #include @@ -12,8 +14,14 @@ #include #include #include +#include +#include #include #include +#include +#include + +QStringList DBBrowserDB::Datatypes = QStringList() << "INTEGER" << "TEXT" << "BLOB" << "REAL" << "NUMERIC"; // Helper template to allow turning member functions into a C-style function pointer // See https://stackoverflow.com/questions/19808054/convert-c-function-pointer-to-c-function-pointer/19809787 @@ -69,8 +77,8 @@ static void regexp(sqlite3_context* ctx, int /*argc*/, sqlite3_value* argv[]) { // Get arguments and check their values - QRegExp arg1((const char*)sqlite3_value_text(argv[0])); - QString arg2((const char*)sqlite3_value_text(argv[1])); + QRegExp arg1(reinterpret_cast(sqlite3_value_text(argv[0]))); + QString arg2(reinterpret_cast(sqlite3_value_text(argv[1]))); if(!arg1.isValid()) return sqlite3_result_error(ctx, "invalid operand", -1); @@ -103,27 +111,29 @@ dontCheckForStructureUpdates = false; // Get encryption settings for database file - CipherDialog* cipher = nullptr; - if(tryEncryptionSettings(db, &isEncrypted, cipher) == false) + CipherSettings* cipherSettings = nullptr; + if(tryEncryptionSettings(db, &isEncrypted, cipherSettings) == false) return false; // Open database file - if(sqlite3_open_v2(db.toUtf8(), &_db, readOnly ? SQLITE_OPEN_READONLY : SQLITE_OPEN_READWRITE, NULL) != SQLITE_OK) + if(sqlite3_open_v2(db.toUtf8(), &_db, readOnly ? SQLITE_OPEN_READONLY : SQLITE_OPEN_READWRITE, nullptr) != SQLITE_OK) { - lastErrorMessage = QString::fromUtf8((const char*)sqlite3_errmsg(_db)); + lastErrorMessage = QString::fromUtf8(sqlite3_errmsg(_db)); return false; } // Set encryption details if database is encrypted #ifdef ENABLE_SQLCIPHER - if(isEncrypted && cipher) + if(isEncrypted && cipherSettings) { - executeSQL(QString("PRAGMA key = %1").arg(cipher->password()), false, false); - if(cipher->pageSize() != 1024) - executeSQL(QString("PRAGMA cipher_page_size = %1;").arg(cipher->pageSize()), false, false); + executeSQL(QString("PRAGMA key = %1").arg(cipherSettings->getPassword()), false, false); + executeSQL(QString("PRAGMA cipher_page_size = %1;").arg(cipherSettings->getPageSize()), false, false); + executeSQL(QString("PRAGMA kdf_iter = %1;").arg(cipherSettings->getKdfIterations()), false, false); + executeSQL(QString("PRAGMA cipher_hmac_algorithm = %1;").arg(cipherSettings->getHmacAlgorithm()), false, false); + executeSQL(QString("PRAGMA cipher_kdf_algorithm = %1;").arg(cipherSettings->getKdfAlgorithm()), false, false); } #endif - delete cipher; + delete cipherSettings; if (_db) { @@ -131,32 +141,32 @@ sqlite3_create_collation(_db, "UTF16", SQLITE_UTF16, nullptr, sqlite_compare_utf16); // add UTF16CI (case insensitive) collation (comparison is performed by QString functions) sqlite3_create_collation(_db, "UTF16CI", SQLITE_UTF16, nullptr, sqlite_compare_utf16ci); - + // register collation callback Callback::func = std::bind(&DBBrowserDB::collationNeeded, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3, std::placeholders::_4); void (*c_callback)(void*, sqlite3*, int, const char*) = static_cast(Callback::callback); - sqlite3_collation_needed(_db, NULL, c_callback); + sqlite3_collation_needed(_db, nullptr, c_callback); // Set foreign key settings as requested in the preferences bool foreignkeys = Settings::getValue("db", "foreignkeys").toBool(); setPragma("foreign_keys", foreignkeys ? "1" : "0"); - // Enable extension loading - sqlite3_enable_load_extension(_db, 1); - // Register REGEXP function if(Settings::getValue("extensions", "disableregex").toBool() == false) - sqlite3_create_function(_db, "REGEXP", 2, SQLITE_UTF8, NULL, regexp, NULL, NULL); + sqlite3_create_function(_db, "REGEXP", 2, SQLITE_UTF8, nullptr, regexp, nullptr, nullptr); // Check if file is read only QFileInfo fi(db); QFileInfo fid(fi.absoluteDir().absolutePath()); isReadOnly = readOnly || !fi.isWritable() || !fid.isWritable(); + // Load extensions + loadExtensionsFromSettings(); + // Execute default SQL if(!isReadOnly) { - QString default_sql = Settings::getValue("db", "defaultsqltext").toString(); + QByteArray default_sql = Settings::getValue("db", "defaultsqltext").toByteArray(); if(!default_sql.isEmpty()) executeMultiSQL(default_sql, false, true); } @@ -171,26 +181,32 @@ } } -bool DBBrowserDB::attach(const QString& filename, QString attach_as) +bool DBBrowserDB::attach(const QString& filePath, QString attach_as) { + if(!_db) + return false; + + waitForDbRelease(); + // Check if this file has already been attached and abort if this is the case QString sql = "PRAGMA database_list;"; logSQL(sql, kLogMsg_App); sqlite3_stmt* db_vm; - if(sqlite3_prepare_v2(_db, sql.toUtf8(), sql.toUtf8().length(), &db_vm, NULL) == SQLITE_OK) + if(sqlite3_prepare_v2(_db, sql.toUtf8(), sql.toUtf8().length(), &db_vm, nullptr) == SQLITE_OK) { // Loop through all the databases - QFileInfo fi(filename); + QFileInfo fi(filePath); while(sqlite3_step(db_vm) == SQLITE_ROW) { - QFileInfo path(QString::fromUtf8((const char*)sqlite3_column_text(db_vm, 2))); + QFileInfo path(QString::fromUtf8(reinterpret_cast(sqlite3_column_text(db_vm, 2)))); if(fi == path) { - QString schema = QString::fromUtf8((const char*)sqlite3_column_text(db_vm, 1)); + QString schema = QString::fromUtf8(reinterpret_cast(sqlite3_column_text(db_vm, 1))); QMessageBox::information(nullptr, qApp->applicationName(), tr("This database has already been attached. Its schema name is '%1'.").arg(schema)); return false; } } + sqlite3_finalize(db_vm); } // Ask for name to be given to the attached database if none was provided @@ -199,38 +215,51 @@ qApp->applicationName(), tr("Please specify the database name under which you want to access the attached database"), QLineEdit::Normal, - QFileInfo(filename).baseName() + QFileInfo(filePath).baseName() ).trimmed(); if(attach_as.isNull()) return false; #ifdef ENABLE_SQLCIPHER // Try encryption settings - CipherDialog* cipher = nullptr; + CipherSettings* cipherSettings = nullptr; bool is_encrypted; - if(tryEncryptionSettings(filename, &is_encrypted, cipher) == false) + if(tryEncryptionSettings(filePath, &is_encrypted, cipherSettings) == false) return false; // Attach database QString key; - if(cipher && is_encrypted) - key = "KEY " + cipher->password(); - if(!executeSQL(QString("ATTACH '%1' AS %2 %3").arg(filename).arg(sqlb::escapeIdentifier(attach_as)).arg(key), false)) + if(cipherSettings && is_encrypted) + key = "KEY " + cipherSettings->getPassword(); + if(!executeSQL(QString("ATTACH '%1' AS %2 %3").arg(filePath).arg(sqlb::escapeIdentifier(attach_as)).arg(key), false)) { QMessageBox::warning(nullptr, qApp->applicationName(), lastErrorMessage); return false; } - if(cipher && cipher->pageSize() != 1024) + if(!executeSQL(QString("PRAGMA %1.cipher_page_size = %2").arg(sqlb::escapeIdentifier(attach_as)).arg(cipherSettings->getPageSize()), false)) { - if(!executeSQL(QString("PRAGMA %1.cipher_page_size = %2").arg(sqlb::escapeIdentifier(attach_as)).arg(cipher->pageSize()), false)) - { - QMessageBox::warning(nullptr, qApp->applicationName(), lastErrorMessage); - return false; - } + QMessageBox::warning(nullptr, qApp->applicationName(), lastErrorMessage); + return false; + } + if(!executeSQL(QString("PRAGMA %1.kdf_iter = %2").arg(sqlb::escapeIdentifier(attach_as)).arg(cipherSettings->getKdfIterations()), false)) + { + QMessageBox::warning(nullptr, qApp->applicationName(), lastErrorMessage); + return false; } + if(!executeSQL(QString("PRAGMA %1.cipher_hmac_algorithm = %2").arg(sqlb::escapeIdentifier(attach_as)).arg(cipherSettings->getHmacAlgorithm()), false)) + { + QMessageBox::warning(nullptr, qApp->applicationName(), lastErrorMessage); + return false; + } + if(!executeSQL(QString("PRAGMA %1.cipher_kdf_algorithm = %2").arg(sqlb::escapeIdentifier(attach_as)).arg(cipherSettings->getKdfAlgorithm()), false)) + { + QMessageBox::warning(nullptr, qApp->applicationName(), lastErrorMessage); + return false; + } + delete cipherSettings; #else // Attach database - if(!executeSQL(QString("ATTACH '%1' AS %2").arg(filename).arg(sqlb::escapeIdentifier(attach_as)), false)) + if(!executeSQL(QString("ATTACH '%1' AS %2").arg(filePath).arg(sqlb::escapeIdentifier(attach_as)), false)) { QMessageBox::warning(nullptr, qApp->applicationName(), lastErrorMessage); return false; @@ -243,16 +272,39 @@ return true; } -bool DBBrowserDB::tryEncryptionSettings(const QString& filename, bool* encrypted, CipherDialog*& cipherSettings) +bool DBBrowserDB::tryEncryptionSettings(const QString& filePath, bool* encrypted, CipherSettings*& cipherSettings) { lastErrorMessage = tr("Invalid file format"); // Open database file sqlite3* dbHandle; - if(sqlite3_open_v2(filename.toUtf8(), &dbHandle, SQLITE_OPEN_READONLY, NULL) != SQLITE_OK) + if(sqlite3_open_v2(filePath.toUtf8(), &dbHandle, SQLITE_OPEN_READONLY, nullptr) != SQLITE_OK) return false; // Try reading from database + +#ifdef ENABLE_SQLCIPHER + bool isDotenvChecked = false; + + // Determine default encryption settings depending on the SQLCipher version we use + QString sqlite_version, sqlcipher_version; + getSqliteVersion(sqlite_version, sqlcipher_version); + int enc_default_page_size, enc_default_kdf_iter; + QString enc_default_hmac_algorithm, enc_default_kdf_algorithm; + if(sqlcipher_version.startsWith('4')) + { + enc_default_page_size = 4096; + enc_default_kdf_iter = 256000; + enc_default_hmac_algorithm = "SHA512"; + enc_default_kdf_algorithm = "SHA512"; + } else { + enc_default_page_size = 1024; + enc_default_kdf_iter = 64000; + enc_default_hmac_algorithm = "SHA1"; + enc_default_kdf_algorithm = "SHA1"; + } +#endif + *encrypted = false; cipherSettings = nullptr; while(true) @@ -264,7 +316,7 @@ int err = sqlite3_prepare_v2(dbHandle, utf8Statement, utf8Statement.length(), &vm, &tail); if(err == SQLITE_BUSY || err == SQLITE_PERM || err == SQLITE_NOMEM || err == SQLITE_IOERR || err == SQLITE_CORRUPT || err == SQLITE_CANTOPEN) { - lastErrorMessage = QString::fromUtf8((const char*)sqlite3_errmsg(dbHandle)); + lastErrorMessage = QString::fromUtf8(sqlite3_errmsg(dbHandle)); sqlite3_close(dbHandle); return false; } @@ -273,34 +325,93 @@ { sqlite3_finalize(vm); #ifdef ENABLE_SQLCIPHER - delete cipherSettings; - cipherSettings = new CipherDialog(nullptr, false); - if(cipherSettings->exec()) - { - // Close and reopen database first to be in a clean state after the failed read attempt from above - sqlite3_close(dbHandle); - if(sqlite3_open_v2(filename.toUtf8(), &dbHandle, SQLITE_OPEN_READONLY, NULL) != SQLITE_OK) + bool foundDotenvPassword = false; + + // Being in a while loop, we don't want to check the same file multiple times + if (!isDotenvChecked) { + QFile databaseFile(filePath); + QFileInfo databaseFileInfo(databaseFile); + + QString databaseDirectoryPath = databaseFileInfo.dir().path(); + QString databaseFileName(databaseFileInfo.fileName()); + + QString dotenvFilePath = databaseDirectoryPath + "/.env"; + static const QSettings::Format dotenvFormat = QSettings::registerFormat("env", &DotenvFormat::readEnvFile, nullptr); + QSettings dotenv(dotenvFilePath, dotenvFormat); + + QVariant passwordValue = dotenv.value(databaseFileName); + + foundDotenvPassword = !passwordValue.isNull(); + + isDotenvChecked = true; + + if (foundDotenvPassword) { + QString password = passwordValue.toString(); + + QVariant keyFormatValue = dotenv.value(databaseFileName + "_keyFormat", QVariant(CipherSettings::KeyFormats::Passphrase)); + CipherSettings::KeyFormats keyFormat = CipherSettings::getKeyFormat(keyFormatValue.toInt()); + + int pageSize = dotenv.value(databaseFileName + "_pageSize", enc_default_page_size).toInt(); + int kdfIterations = dotenv.value(databaseFileName + "_kdfIter", enc_default_kdf_iter).toInt(); + QString hmacAlgorithm = dotenv.value(databaseFileName + "_hmacAlgorithm", enc_default_hmac_algorithm).toString(); + QString kdfAlgorithm = dotenv.value(databaseFileName + "_kdfAlgorithm", enc_default_kdf_algorithm).toString(); + delete cipherSettings; - cipherSettings = nullptr; - return false; - } + cipherSettings = new CipherSettings(); - // Set key and, if it differs from the default value, the page size - sqlite3_exec(dbHandle, QString("PRAGMA key = %1").arg(cipherSettings->password()).toUtf8(), NULL, NULL, NULL); - if(cipherSettings->pageSize() != 1024) - sqlite3_exec(dbHandle, QString("PRAGMA cipher_page_size = %1;").arg(cipherSettings->pageSize()).toUtf8(), NULL, NULL, NULL); + cipherSettings->setKeyFormat(keyFormat); + cipherSettings->setPassword(password); + cipherSettings->setPageSize(pageSize); + cipherSettings->setKdfIterations(kdfIterations); + cipherSettings->setHmacAlgorithm(hmacAlgorithm); + cipherSettings->setKdfAlgorithm(kdfAlgorithm); + } + } - *encrypted = true; + if(foundDotenvPassword) + { + // Skip the CipherDialog prompt for now to test if the dotenv password was correct } else { - sqlite3_close(dbHandle); - *encrypted = false; + CipherDialog *cipherDialog = new CipherDialog(nullptr, false); + if(cipherDialog->exec()) + { + delete cipherSettings; + cipherSettings = new CipherSettings(cipherDialog->getCipherSettings()); + } else { + sqlite3_close(dbHandle); + *encrypted = false; + delete cipherSettings; + cipherSettings = nullptr; + return false; + } + } + + // Close and reopen database first to be in a clean state after the failed read attempt from above + sqlite3_close(dbHandle); + if(sqlite3_open_v2(filePath.toUtf8(), &dbHandle, SQLITE_OPEN_READONLY, nullptr) != SQLITE_OK) + { delete cipherSettings; cipherSettings = nullptr; return false; } + + // Set the key + sqlite3_exec(dbHandle, QString("PRAGMA key = %1").arg(cipherSettings->getPassword()).toUtf8(), nullptr, nullptr, nullptr); + + // Set the page size if it differs from the default value + if(cipherSettings->getPageSize() != enc_default_page_size) + sqlite3_exec(dbHandle, QString("PRAGMA cipher_page_size = %1;").arg(cipherSettings->getPageSize()).toUtf8(), nullptr, nullptr, nullptr); + if(cipherSettings->getKdfIterations() != enc_default_kdf_iter) + sqlite3_exec(dbHandle, QString("PRAGMA kdf_iter = %1;").arg(cipherSettings->getKdfIterations()).toUtf8(), nullptr, nullptr, nullptr); + if(cipherSettings->getHmacAlgorithm() != enc_default_hmac_algorithm) + sqlite3_exec(dbHandle, QString("PRAGMA cipher_hmac_algorithm = %1;").arg(cipherSettings->getHmacAlgorithm()).toUtf8(), nullptr, nullptr, nullptr); + if(cipherSettings->getKdfAlgorithm() != enc_default_kdf_algorithm) + sqlite3_exec(dbHandle, QString("PRAGMA cipher_kdf_algorithm = %1;").arg(cipherSettings->getKdfAlgorithm()).toUtf8(), nullptr, nullptr, nullptr); + + *encrypted = true; #else - lastErrorMessage = QString::fromUtf8((const char*)sqlite3_errmsg(dbHandle)); + lastErrorMessage = QString::fromUtf8(sqlite3_errmsg(dbHandle)); sqlite3_close(dbHandle); return false; #endif @@ -312,6 +423,32 @@ } } +void DBBrowserDB::getSqliteVersion(QString& sqlite, QString& sqlcipher) +{ + sqlite = QString(SQLITE_VERSION); + + // The SQLCipher version must be queried via a pragma and for a pragma we need a database connection. + // Because we want to be able to query the SQLCipher version without opening a database file first, we + // open a separate connection to an in-memory database here. + sqlcipher = QString(); +#ifdef ENABLE_SQLCIPHER + sqlite3* dummy; + if(sqlite3_open(":memory:", &dummy) == SQLITE_OK) + { + sqlite3_stmt* stmt; + if(sqlite3_prepare_v2(dummy, "PRAGMA cipher_version", -1, &stmt, nullptr) == SQLITE_OK) + { + if(sqlite3_step(stmt) == SQLITE_ROW) + sqlcipher = QByteArray(static_cast(sqlite3_column_blob(stmt, 0)), sqlite3_column_bytes(stmt, 0)); + + sqlite3_finalize(stmt); + } + + sqlite3_close(dummy); + } +#endif +} + bool DBBrowserDB::setSavepoint(const QString& pointname) { if(!isOpen()) @@ -371,6 +508,11 @@ bool DBBrowserDB::releaseAllSavepoints() { + if(!_db) + return false; + + waitForDbRelease(); + for(const QString& point : savepointList) { if(!releaseSavepoint(point)) @@ -396,7 +538,8 @@ bool DBBrowserDB::create ( const QString & db) { - if (isOpen()) close(); + if (isOpen()) + close(); // read encoding from settings and open with sqlite3_open for utf8 and sqlite3_open16 for utf16 QString sEncoding = Settings::getValue("db", "defaultencoding").toString(); @@ -409,7 +552,7 @@ openresult = sqlite3_open16(db.utf16(), &_db); if( openresult != SQLITE_OK ){ - lastErrorMessage = QString::fromUtf8((const char*)sqlite3_errmsg(_db)); + lastErrorMessage = QString::fromUtf8(sqlite3_errmsg(_db)); sqlite3_close(_db); _db = nullptr; return false; @@ -421,12 +564,9 @@ bool foreignkeys = Settings::getValue("db", "foreignkeys").toBool(); setPragma("foreign_keys", foreignkeys ? "1" : "0"); - // Enable extension loading - sqlite3_enable_load_extension(_db, 1); - // Register REGEXP function if(Settings::getValue("extensions", "disableregex").toBool() == false) - sqlite3_create_function(_db, "REGEXP", 2, SQLITE_UTF8, NULL, regexp, NULL, NULL); + sqlite3_create_function(_db, "REGEXP", 2, SQLITE_UTF8, nullptr, regexp, nullptr, nullptr); // force sqlite3 do write proper file header // if we don't create and drop the table we might end up @@ -437,8 +577,11 @@ executeSQL("DROP TABLE notempty;", false, false); } + // Load extensions + loadExtensionsFromSettings(); + // Execute default SQL - QString default_sql = Settings::getValue("db", "defaultsqltext").toString(); + QByteArray default_sql = Settings::getValue("db", "defaultsqltext").toByteArray(); if(!default_sql.isEmpty()) executeMultiSQL(default_sql, false, true); @@ -452,18 +595,30 @@ } } - bool DBBrowserDB::close() { + waitForDbRelease(); + if(_db) { if (getDirty()) { - QMessageBox::StandardButton reply = QMessageBox::question(nullptr, - QApplication::applicationName(), - tr("Do you want to save the changes " - "made to the database file %1?").arg(curDBFilename), - QMessageBox::Save | QMessageBox::No | QMessageBox::Cancel); + // In-memory databases can't be saved to disk. So the need another text than regular databases. + // Note that the QMessageBox::Yes option in the :memory: case and the QMessageBox::No option in the regular case are + // doing the same job: proceeding but not saving anything. + QMessageBox::StandardButton reply; + if(curDBFilename == ":memory:") + { + reply = QMessageBox::question(nullptr, + QApplication::applicationName(), + tr("Do you really want to close this temporary database? All data will be lost."), + QMessageBox::Yes | QMessageBox::Cancel); + } else { + reply = QMessageBox::question(nullptr, + QApplication::applicationName(), + tr("Do you want to save the changes made to the database file %1?").arg(curDBFilename), + QMessageBox::Save | QMessageBox::No | QMessageBox::Cancel); + } // If the user clicked the cancel button stop here and return false if(reply == QMessageBox::Cancel) @@ -475,9 +630,11 @@ else revertAll(); //not really necessary, I think... but will not hurt. } - sqlite3_close(_db); + if(sqlite3_close(_db) != SQLITE_OK) + qWarning() << tr("Database didn't close correctly, probably still busy"); + _db = nullptr; } - _db = nullptr; + schemata.clear(); savepointList.clear(); emit dbChanged(getDirty()); @@ -487,37 +644,87 @@ return true; } -bool DBBrowserDB::dump(const QString& filename, - const QStringList & tablesToDump, +DBBrowserDB::db_pointer_type DBBrowserDB::get(QString user, bool force_wait) +{ + if(!_db) + return nullptr; + + waitForDbRelease(force_wait ? Wait : Ask); + + db_user = user; + db_used = true; + emit databaseInUseChanged(true, user); + + return db_pointer_type(_db, DatabaseReleaser(this)); +} + +void DBBrowserDB::waitForDbRelease(ChoiceOnUse choice) +{ + if(!_db) + return; + + // We can't show a message box from another thread than the main thread. So instead of crashing we + // just decide that we don't interrupt any running query in this case. + if(choice == Ask && QThread::currentThread() != QApplication::instance()->thread()) + choice = Wait; + + std::unique_lock lk(m); + while(db_used) { + // notify user, give him the opportunity to cancel that + auto str = db_user; + lk.unlock(); + + bool cancel = choice == CancelOther; + if(choice == Ask) { + QMessageBox msgBox; + msgBox.setText(tr("The database is currently busy: ") + str); + msgBox.setInformativeText(tr("Do you want to abort that other operation?")); + msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No); + msgBox.setDefaultButton(QMessageBox::No); + int ret = msgBox.exec(); + + cancel = ret == QMessageBox::Yes; + } + if(cancel) + sqlite3_interrupt(_db); + + lk.lock(); + cv.wait(lk, [this](){ return !db_used; }); + } +} + +bool DBBrowserDB::dump(const QString& filePath, + const QStringList& tablesToDump, bool insertColNames, bool insertNewSyntx, bool exportSchema, bool exportData, bool keepOldSchema) { + waitForDbRelease(); + // Open file - QFile file(filename); - if(file.open(QIODevice::WriteOnly)) + QFile file(filePath); + if(file.open(QIODevice::WriteOnly|QIODevice::Text)) { QApplication::setOverrideCursor(Qt::WaitCursor); + // Count the total number of all records in all tables for the progress dialog size_t numRecordsTotal = 0, numRecordsCurrent = 0; objectMap objMap = schemata["main"]; // We only always export the main database, not the attached databases QList tables = objMap.values("table"); - QMutableListIterator it(tables); - while(it.hasNext()) + for(QMutableListIterator it(tables);it.hasNext();) { it.next(); - // Remove the sqlite_stat1 table if there is one - if(it.value()->name() == "sqlite_stat1" || it.value()->name() == "sqlite_sequence") + // Remove the sqlite_stat1 and the sqlite_sequence tables if they exist. Also remove any tables which are not selected for export. + if(it.value()->name() == "sqlite_stat1" || it.value()->name() == "sqlite_sequence" || !tablesToDump.contains(it.value()->name())) { it.remove(); } else { // Otherwise get the number of records in this table - SqliteTableModel tableModel(*this); - tableModel.setTable(sqlb::ObjectIdentifier("main", it.value()->name())); - numRecordsTotal += tableModel.totalRowCount(); + numRecordsTotal += querySingleValueFromDb(QString("SELECT COUNT(*) FROM %1;") + .arg(sqlb::ObjectIdentifier("main", it.value()->name()).toString())).toUInt(); } } @@ -533,140 +740,141 @@ // Put the SQL commands in a transaction block stream << "BEGIN TRANSACTION;\n"; - // Loop through all tables first as they are required to generate views, indices etc. later - for(auto it=tables.constBegin();it!=tables.constEnd();++it) + // First export the schema of all selected tables. We need to export the schema of all tables before we export the first INSERT statement to + // make sure foreign keys are working properly. + if(exportSchema) { - if (tablesToDump.indexOf((*it)->name()) == -1) - continue; - - // Write the SQL string used to create this table to the output file - if(exportSchema) + for(auto it : tables) { + // Write the SQL string used to create this table to the output file if(!keepOldSchema) - stream << QString("DROP TABLE IF EXISTS %1;\n").arg(sqlb::escapeIdentifier((*it)->name())); + stream << QString("DROP TABLE IF EXISTS %1;\n").arg(sqlb::escapeIdentifier(it->name())); - if((*it)->fullyParsed()) - stream << (*it)->sql("main", true) << "\n"; + if(it->fullyParsed()) + stream << it->sql("main", true) << "\n"; else - stream << (*it)->originalSql() << ";\n"; - } - - // If the user doesn't want the data to be exported skip the rest of the loop block here - if(!exportData) - continue; - - // get columns - QStringList cols((*it).dynamicCast()->fieldNames()); - - QString sQuery = QString("SELECT * FROM %1;").arg(sqlb::escapeIdentifier((*it)->name())); - QByteArray utf8Query = sQuery.toUtf8(); - sqlite3_stmt *stmt; - QString lineSep(QString(")%1\n").arg(insertNewSyntx?',':';')); + stream << it->originalSql() << ";\n"; + } + } - int status = sqlite3_prepare_v2(this->_db, utf8Query.data(), utf8Query.size(), &stmt, NULL); - if(SQLITE_OK == status) + // Now export the data as well + if(exportData) + { + for(auto it : tables) { - int columns = sqlite3_column_count(stmt); - size_t counter = 0; - qApp->processEvents(); - while(sqlite3_step(stmt) == SQLITE_ROW) - { - if (counter) stream << lineSep; + // get columns + QStringList cols(std::dynamic_pointer_cast(it)->fieldNames()); - if (!insertNewSyntx || !counter) - { - stream << "INSERT INTO " << sqlb::escapeIdentifier((*it)->name()); - if (insertColNames) - stream << " (" << cols.join(",") << ")"; - stream << " VALUES ("; - } - else - { - stream << " ("; - } + QString sQuery = QString("SELECT * FROM %1;").arg(sqlb::escapeIdentifier(it->name())); + QByteArray utf8Query = sQuery.toUtf8(); + sqlite3_stmt *stmt; + QString lineSep(QString(")%1\n").arg(insertNewSyntx?',':';')); - for (int i = 0; i < columns; ++i) + int status = sqlite3_prepare_v2(_db, utf8Query.data(), utf8Query.size(), &stmt, nullptr); + if(SQLITE_OK == status) + { + int columns = sqlite3_column_count(stmt); + size_t counter = 0; + qApp->processEvents(); + while(sqlite3_step(stmt) == SQLITE_ROW) { - int fieldsize = sqlite3_column_bytes(stmt, i); - int fieldtype = sqlite3_column_type(stmt, i); - QByteArray bcontent( - (const char*)sqlite3_column_blob(stmt, i), - fieldsize); + if (counter) stream << lineSep; - if(bcontent.left(2048).contains('\0')) // binary check + if (!insertNewSyntx || !counter) { - stream << QString("X'%1'").arg(QString(bcontent.toHex())); + stream << "INSERT INTO " << sqlb::escapeIdentifier(it->name()); + if (insertColNames) + stream << " (" << sqlb::escapeIdentifier(cols).join(",") << ")"; + stream << " VALUES ("; } else { - switch(fieldtype) + stream << " ("; + } + + for (int i = 0; i < columns; ++i) + { + int fieldsize = sqlite3_column_bytes(stmt, i); + int fieldtype = sqlite3_column_type(stmt, i); + QByteArray bcontent( + reinterpret_cast(sqlite3_column_blob(stmt, i)), + fieldsize); + + if(bcontent.left(2048).contains('\0')) // binary check { - case SQLITE_TEXT: - case SQLITE_BLOB: - stream << "'" << bcontent.replace("'", "''") << "'"; - break; - case SQLITE_NULL: - stream << "NULL"; - break; - case SQLITE_FLOAT: - if(bcontent.indexOf("Inf") != -1) - stream << "'" << bcontent << "'"; - else + stream << QString("X'%1'").arg(QString(bcontent.toHex())); + } + else + { + switch(fieldtype) + { + case SQLITE_TEXT: + case SQLITE_BLOB: + stream << "'" << bcontent.replace("'", "''") << "'"; + break; + case SQLITE_NULL: + stream << "NULL"; + break; + case SQLITE_FLOAT: + if(bcontent.indexOf("Inf") != -1) + stream << "'" << bcontent << "'"; + else + stream << bcontent; + break; + default: stream << bcontent; - break; - default: - stream << bcontent; + } } + if(i != columns - 1) + stream << ','; } - if(i != columns - 1) - stream << ','; - } - progress.setValue(++numRecordsCurrent); - if(counter % 5000 == 0) - qApp->processEvents(); - counter++; + progress.setValue(++numRecordsCurrent); + if(counter % 5000 == 0) + qApp->processEvents(); + counter++; - if(progress.wasCanceled()) - { - sqlite3_finalize(stmt); - file.close(); - file.remove(); - QApplication::restoreOverrideCursor(); - return false; + if(progress.wasCanceled()) + { + sqlite3_finalize(stmt); + file.close(); + file.remove(); + QApplication::restoreOverrideCursor(); + return false; + } } + if (counter > 0) stream << ");\n"; } - if (counter > 0) stream << ");\n"; + sqlite3_finalize(stmt); } - sqlite3_finalize(stmt); } - // Now dump all the other objects (but only if we are exporting the schema) + // Finally export all objects other than tables if(exportSchema) { - for(auto it=objMap.constBegin();it!=objMap.constEnd();++it) + for(auto it : objMap) { // Make sure it's not a table again - if(it.value()->type() == sqlb::Object::Types::Table) + if(it->type() == sqlb::Object::Types::Table) continue; // If this object is based on a table (e.g. is an index for that table) it depends on the existence of this table. // So if we didn't export the base table this depends on, don't export this object either. - if(!(*it)->baseTable().isEmpty() && !tablesToDump.contains((*it)->baseTable())) + if(!it->baseTable().isEmpty() && !tablesToDump.contains(it->baseTable())) continue; // Write the SQL string used to create this object to the output file - if(!(*it)->originalSql().isEmpty()) + if(!it->originalSql().isEmpty()) { if(!keepOldSchema) stream << QString("DROP %1 IF EXISTS %2;\n") - .arg(sqlb::Object::typeToString((*it)->type()).toUpper()) - .arg(sqlb::escapeIdentifier((*it)->name())); + .arg(sqlb::Object::typeToString(it->type()).toUpper()) + .arg(sqlb::escapeIdentifier(it->name())); - if((*it)->fullyParsed()) - stream << (*it)->sql("main", true) << "\n"; + if(it->fullyParsed()) + stream << it->sql("main", true) << "\n"; else - stream << (*it)->originalSql() << ";\n"; + stream << it->originalSql() << ";\n"; } } } @@ -682,9 +890,26 @@ return false; } -bool DBBrowserDB::executeSQL(QString statement, bool dirtyDB, bool logsql) +// Callback for sqlite3_exec. It receives the user callback in the first parameter. Converts parameters +// to C++ classes and calls user callback. +int DBBrowserDB::callbackWrapper (void* callback, int numberColumns, char** values, char** columnNames) +{ + QStringList valuesList; + QStringList namesList; + + for (int i=0; i(callback)); + return userCallback(numberColumns, valuesList, namesList); +} + +bool DBBrowserDB::executeSQL(QString statement, bool dirtyDB, bool logsql, execCallback callback) { - if (!isOpen()) + waitForDbRelease(); + if(!_db) { lastErrorMessage = tr("No database file opened"); return false; @@ -696,7 +921,7 @@ if (dirtyDB) setSavepoint(); char* errmsg; - if (SQLITE_OK == sqlite3_exec(_db, statement.toUtf8(), NULL, NULL, &errmsg)) + if (SQLITE_OK == sqlite3_exec(_db, statement.toUtf8(), callback ? callbackWrapper : nullptr, &callback, &errmsg)) { // Update DB structure after executing an SQL statement. But try to avoid doing unnecessary updates. if(!dontCheckForStructureUpdates && (statement.startsWith("ALTER", Qt::CaseInsensitive) || @@ -710,27 +935,31 @@ lastErrorMessage = QString("%1 (%2)").arg(QString::fromUtf8(errmsg)).arg(statement); qWarning() << "executeSQL: " << statement << "->" << errmsg; sqlite3_free(errmsg); + return false; } } -bool DBBrowserDB::executeMultiSQL(const QString& statement, bool dirty, bool log) +bool DBBrowserDB::executeMultiSQL(QByteArray query, bool dirty, bool log) { - // First check if a DB is opened - if(!isOpen()) + waitForDbRelease(); + if(!_db) { lastErrorMessage = tr("No database file opened"); return false; } - QString query = statement.trimmed(); - - // Check if this SQL containts any transaction statements - QRegExp transactionRegex("^\\s*BEGIN TRANSACTION;|COMMIT;\\s*$"); - if(query.contains(transactionRegex)) + // Check if this SQL containts any transaction statements. If so remove them and create a savepoint instead by overriding the dirty parameter. + // TODO This should check for 'END TRANSACTION' too. It should be case insensitive and it should work with any amounts of whitespace etc. "Good" news + // is that none of this was ever done correctly before. + if(query.contains("BEGIN TRANSACTION;")) { - // If so remove them anc create a savepoint instead by overriding the dirty parameter - query.remove(transactionRegex); + query.replace("BEGIN TRANSACTION;", " "); + dirty = true; + } + if(query.contains("COMMIT;")) + { + query.replace("COMMIT;", " "); dirty = true; } @@ -747,43 +976,63 @@ } // Show progress dialog - int statement_size = query.size(); QProgressDialog progress(tr("Executing SQL..."), - tr("Cancel"), 0, statement_size); + tr("Cancel"), 0, 100); progress.setWindowModality(Qt::ApplicationModal); progress.show(); // Execute the statement by looping until SQLite stops giving back a tail string sqlite3_stmt* vm; - QByteArray utf8Query = query.toUtf8(); - const char *tail = utf8Query.data(); + const char *tail = query.constData(); + const char * const tail_start = tail; + const char * const tail_end = tail + query.size() + 1; + size_t total_tail_length = static_cast(tail_end - tail_start); int res = SQLITE_OK; unsigned int line = 0; bool structure_updated = false; + int last_progress_value = -1; while(tail && *tail != 0 && (res == SQLITE_OK || res == SQLITE_DONE)) { line++; - size_t tail_length = strlen(tail); - // Update progress dialog, keep UI responsive - progress.setValue(statement_size - tail_length); - qApp->processEvents(); - if(progress.wasCanceled()) - { - lastErrorMessage = tr("Action cancelled."); - return false; + // Update progress dialog, keep UI responsive. Make sure to not spend too much time updating the progress dialog in case there are many small statements. + int progress_value = static_cast(static_cast(tail - tail_start) / total_tail_length * 100.0f); + if(progress_value > last_progress_value) + { + progress.setValue(progress_value); + qApp->processEvents(); + if(progress.wasCanceled()) + { + lastErrorMessage = tr("Action cancelled."); + return false; + } + last_progress_value = progress_value; } // Check whether the DB structure is changed by this statement - QString qtail = QString(tail); - if(!dontCheckForStructureUpdates && !structure_updated && (qtail.startsWith("ALTER", Qt::CaseInsensitive) || - qtail.startsWith("CREATE", Qt::CaseInsensitive) || - qtail.startsWith("DROP", Qt::CaseInsensitive) || - qtail.startsWith("ROLLBACK", Qt::CaseInsensitive))) - structure_updated = true; + if(!dontCheckForStructureUpdates && !structure_updated) + { + // Ignore all whitespace at the start of the current tail + const char* tail_ptr = tail; + while(std::isspace(*tail_ptr)) + tail_ptr++; + + // Convert the first couple of bytes of the tail to a C++ string for easier handling. We only need the first 8 bytes (in cae it's a ROLLBACK + // statement), so no need to convert the entire tail. If the tail is less than 8 bytes long, make sure not to read past its end. + size_t length = std::min(static_cast(tail_end - tail + 1), static_cast(8)); + std::string next_statement(tail_ptr, length); + std::transform(next_statement.begin(), next_statement.end(), next_statement.begin(), ::toupper); + + // Check if it's a modifying statement + if(next_statement.compare(0, 5, "ALTER") == 0 || + next_statement.compare(0, 6, "CREATE") == 0 || + next_statement.compare(0, 4, "DROP") == 0 || + next_statement.compare(0, 8, "ROLLBACK") == 0) + structure_updated = true; + } // Execute next statement - res = sqlite3_prepare_v2(_db, tail, tail_length, &vm, &tail); + res = sqlite3_prepare_v2(_db, tail, tail_end - tail + 1, &vm, &tail); if(res == SQLITE_OK) { switch(sqlite3_step(vm)) @@ -797,24 +1046,28 @@ break; default: // In case of *any* error abort the execution and roll back the transaction - sqlite3_finalize(vm); - if(dirty) - revertToSavepoint(savepoint_name); + + // Make sure to save the error message first before any other function can mess around with it lastErrorMessage = tr("Error in statement #%1: %2.\nAborting execution%3.") .arg(line) .arg(sqlite3_errmsg(_db)) .arg(dirty ? tr(" and rolling back") : ""); qWarning() << lastErrorMessage; + + // Clean up + sqlite3_finalize(vm); + if(dirty) + revertToSavepoint(savepoint_name); return false; } } else { - if(dirty) - revertToSavepoint(savepoint_name); lastErrorMessage = tr("Error in statement #%1: %2.\nAborting execution%3.") .arg(line) .arg(sqlite3_errmsg(_db)) .arg(dirty ? tr(" and rolling back") : ""); qWarning() << lastErrorMessage; + if(dirty) + revertToSavepoint(savepoint_name); return false; } } @@ -827,17 +1080,60 @@ return true; } +QByteArray DBBrowserDB::querySingleValueFromDb(const QString& sql, bool log, ChoiceOnUse choice) +{ + waitForDbRelease(choice); + if(!_db) + return QByteArray(); + + if(log) + logSQL(sql, kLogMsg_App); + + QByteArray retval; + + QByteArray utf8Query = sql.toUtf8(); + sqlite3_stmt* stmt; + if(sqlite3_prepare_v2(_db, utf8Query, utf8Query.size(), &stmt, nullptr) == SQLITE_OK) + { + if(sqlite3_step(stmt) == SQLITE_ROW) + { + if(sqlite3_column_count(stmt) > 0 && sqlite3_column_type(stmt, 0) != SQLITE_NULL) + { + int bytes = sqlite3_column_bytes(stmt, 0); + if(bytes) + retval = QByteArray(static_cast(sqlite3_column_blob(stmt, 0)), bytes); + else + retval = ""; + } + } else { + lastErrorMessage = tr("didn't receive any output from %1").arg(sql); + qWarning() << lastErrorMessage; + } + + sqlite3_finalize(stmt); + } else { + lastErrorMessage = tr("could not execute command: %1").arg(sqlite3_errmsg(_db)); + qWarning() << lastErrorMessage; + } + + return retval; +} + bool DBBrowserDB::getRow(const sqlb::ObjectIdentifier& table, const QString& rowid, QVector& rowdata) { + waitForDbRelease(); + if(!_db) + return false; + QString sQuery = QString("SELECT * FROM %1 WHERE %2='%3';") .arg(table.toString()) - .arg(sqlb::escapeIdentifier(getObjectByName(table).dynamicCast()->rowidColumn())) + .arg(sqlb::escapeIdentifier(getObjectByName(table)->rowidColumn())) .arg(rowid); QByteArray utf8Query = sQuery.toUtf8(); sqlite3_stmt *stmt; bool ret = false; - if(sqlite3_prepare_v2(_db, utf8Query, utf8Query.size(), &stmt, NULL) == SQLITE_OK) + if(sqlite3_prepare_v2(_db, utf8Query, utf8Query.size(), &stmt, nullptr) == SQLITE_OK) { // even this is a while loop, the statement should always only return 1 row while(sqlite3_step(stmt) == SQLITE_ROW) @@ -863,14 +1159,14 @@ return ret; } -QString DBBrowserDB::max(const sqlb::ObjectIdentifier& tableName, sqlb::FieldPtr field) const +QString DBBrowserDB::max(const sqlb::ObjectIdentifier& tableName, const sqlb::Field& field) const { - QString sQuery = QString("SELECT MAX(CAST(%2 AS INTEGER)) FROM %1;").arg(tableName.toString()).arg(sqlb::escapeIdentifier(field->name())); + QString sQuery = QString("SELECT MAX(CAST(%2 AS INTEGER)) FROM %1;").arg(tableName.toString()).arg(sqlb::escapeIdentifier(field.name())); QByteArray utf8Query = sQuery.toUtf8(); sqlite3_stmt *stmt; QString ret = "0"; - if(sqlite3_prepare_v2(_db, utf8Query, utf8Query.size(), &stmt, NULL) == SQLITE_OK) + if(sqlite3_prepare_v2(_db, utf8Query, utf8Query.size(), &stmt, nullptr) == SQLITE_OK) { // even this is a while loop, the statement should always only return 1 row while(sqlite3_step(stmt) == SQLITE_ROW) @@ -890,38 +1186,39 @@ QStringList vals; QStringList fields; - for(const sqlb::FieldPtr& f : t.fields()) + for(const sqlb::Field& f : t.fields) { - sqlb::ConstraintPtr pk = t.constraint({f}, sqlb::Constraint::PrimaryKeyConstraintType); + sqlb::ConstraintPtr pk = t.constraint({f.name()}, sqlb::Constraint::PrimaryKeyConstraintType); if(pk) { - fields << f->name(); + fields << f.name(); if(!pk_value.isNull()) { - vals << pk_value; + vals << (f.isText()? "'" + pk_value + "'" : pk_value); } else { - if(f->notnull()) + if(f.notnull()) { QString maxval = this->max(sqlb::ObjectIdentifier(schemaName, t.name()), f); - vals << QString::number(maxval.toLongLong() + 1); + QString newval = QString::number(maxval.toLongLong() + 1); + vals << (f.isText()? "'" + newval + "'" : newval); } else { vals << "NULL"; } } - } else if(f->notnull() && f->defaultValue().length() == 0) { - fields << f->name(); + } else if(f.notnull() && f.defaultValue().length() == 0) { + fields << f.name(); - if(f->isInteger()) + if(f.isInteger()) vals << "0"; else vals << "''"; } else { // don't insert into fields with a default value // or we will never see it. - if(f->defaultValue().length() == 0) + if(f.defaultValue().length() == 0) { - fields << f->name(); + fields << f.name(); vals << "NULL"; } } @@ -932,9 +1229,7 @@ stmt.append(" DEFAULT VALUES;"); } else { stmt.append("("); - for(const QString& f : fields) - stmt.append(sqlb::escapeIdentifier(f) + ","); - stmt.chop(1); + stmt.append(sqlb::escapeIdentifier(fields).join(",")); stmt.append(") VALUES ("); stmt.append(vals.join(",")); stmt.append(");"); @@ -945,9 +1240,11 @@ QString DBBrowserDB::addRecord(const sqlb::ObjectIdentifier& tablename) { - if (!isOpen()) return QString(); + waitForDbRelease(); + if(!_db) + return QString(); - sqlb::TablePtr table = getObjectByName(tablename).dynamicCast(); + sqlb::TablePtr table = getObjectByName(tablename); if(!table) return QString(); @@ -957,7 +1254,7 @@ QString pk_value; if(table->isWithoutRowidTable()) { - pk_value = QString::number(max(tablename, table->fields().at(table->findField(table->rowidColumn()))).toLongLong() + 1); + pk_value = QString::number(max(tablename, *sqlb::findField(table, table->rowidColumn())).toLongLong() + 1); sInsertstmt = emptyInsertStmt(tablename.schema(), *table, pk_value); } else { sInsertstmt = emptyInsertStmt(tablename.schema(), *table); @@ -975,17 +1272,25 @@ } } -bool DBBrowserDB::deleteRecords(const sqlb::ObjectIdentifier& table, const QStringList& rowids) +bool DBBrowserDB::deleteRecords(const sqlb::ObjectIdentifier& table, const QStringList& rowids, const QString& pseudo_pk) { if (!isOpen()) return false; + // Get primary key of the object to edit. + QString pk = primaryKeyForEditing(table, pseudo_pk); + if(pk.isNull()) + { + lastErrorMessage = tr("Cannot delete this object"); + return false; + } + QStringList quoted_rowids; for(QString rowid : rowids) quoted_rowids.append("'" + rowid.replace("'", "''") + "'"); QString statement = QString("DELETE FROM %1 WHERE %2 IN (%3);") .arg(table.toString()) - .arg(sqlb::escapeIdentifier(getObjectByName(table).dynamicCast()->rowidColumn())) + .arg(pk) .arg(quoted_rowids.join(", ")); if(executeSQL(statement)) { @@ -996,32 +1301,24 @@ } } -bool DBBrowserDB::updateRecord(const sqlb::ObjectIdentifier& table, const QString& column, const QString& rowid, const QByteArray& value, bool itsBlob, const QString& pseudo_pk) +bool DBBrowserDB::updateRecord(const sqlb::ObjectIdentifier& table, const QString& column, + const QString& rowid, const QByteArray& value, bool itsBlob, const QString& pseudo_pk) { + waitForDbRelease(); if (!isOpen()) return false; - // Get primary key of the object to edit. For views we support 'pseudo' primary keys which must be specified manually. - // If no pseudo pk is specified we'll take the rowid column of the table. If this isn't a table, however, we'll just assume - // it's a view that hasn't been configured for editing and thus abort here. - QString pk; - if(pseudo_pk.isEmpty()) + // Get primary key of the object to edit. + QString pk = primaryKeyForEditing(table, pseudo_pk); + if(pk.isNull()) { - sqlb::TablePtr tbl = getObjectByName(table).dynamicCast(); - if(tbl) - { - pk = tbl->rowidColumn(); - } else { - lastErrorMessage = tr("Cannot set data on this object"); - return false; - } - } else { - pk = pseudo_pk; + lastErrorMessage = tr("Cannot set data on this object"); + return false; } QString sql = QString("UPDATE %1 SET %2=? WHERE %3='%4';") .arg(table.toString()) .arg(sqlb::escapeIdentifier(column)) - .arg(pk) + .arg(sqlb::escapeIdentifier(pk)) .arg(QString(rowid).replace("'", "''")); logSQL(sql, kLogMsg_App); @@ -1029,7 +1326,7 @@ // If we get a NULL QByteArray we insert a NULL value, and for that // we can pass NULL to sqlite3_bind_text() so that it behaves like sqlite3_bind_null() - const char *rawValue = value.isNull() ? NULL : value.constData(); + const char *rawValue = value.isNull() ? nullptr : value.constData(); sqlite3_stmt* stmt; int success = 1; @@ -1062,140 +1359,265 @@ } } +QString DBBrowserDB::primaryKeyForEditing(const sqlb::ObjectIdentifier& table, const QString& pseudo_pk) const +{ + // This function returns the primary key of the object to edit. For views we support 'pseudo' primary keys which must be specified manually. + // If no pseudo pk is specified we'll take the rowid column of the table instead. If this neither a table nor was a pseudo-PK specified, + // it is most likely a view that hasn't been configured for editing yet. In this case we return a null string to abort. + + if(pseudo_pk.isEmpty()) + { + sqlb::TablePtr tbl = getObjectByName(table); + if(tbl) + return tbl->rowidColumn(); + } else { + return pseudo_pk; + } + + return QString(); +} + bool DBBrowserDB::createTable(const sqlb::ObjectIdentifier& name, const sqlb::FieldVector& structure) { // Build SQL statement sqlb::Table table(name.name()); - for(int i=0;itoString()); + QString sql = QString("ALTER TABLE %1 ADD COLUMN %2").arg(tablename.toString()).arg(field.toString()); // Execute it and update the schema return executeSQL(sql); } -bool DBBrowserDB::alterTable(const sqlb::ObjectIdentifier& tablename, const sqlb::Table& table, const QString& name, sqlb::FieldPtr to, int move, QString newSchemaName) +bool DBBrowserDB::alterTable(const sqlb::ObjectIdentifier& tablename, const sqlb::Table& new_table, AlterTableTrackColumns track_columns, QString newSchemaName) { - /* - * USE CASES: - * 1) Set table; unset name, to and move: Change table constraints only. - * 2) Set table and name; unset to and move: Change table constraints and remove column. - * 3) Set table, name and to; unset move: Change table constraints and rename/edit column. - * 4) Set table, name, to and move: Change table constraints, rename/edit column and move it. - */ - - // NOTE: This function is working around the incomplete ALTER TABLE command in SQLite. - // If SQLite should fully support this command one day, this entire - // function can be changed to executing something like this: - //QString sql; - //if(to.isNull()) - // sql = QString("ALTER TABLE %1 DROP COLUMN %2;").arg(sqlb::escapeIdentifier(table)).arg(sqlb::escapeIdentifier(column)); - //else - // sql = QString("ALTER TABLE %1 MODIFY %2 %3").arg(sqlb::escapeIdentifier(tablename)).arg(sqlb::escapeIdentifier(to)).arg(type); // This is wrong... - //return executeSQL(sql); - - // TODO: This function needs to be cleaned up. It might make sense to split it up in several parts than can be reused - // more easily. Besides that, it might make sense to support some potential use cases in a more sophisticated way. These include: - // 1) Allow modifying multiple columns at once in order to only have to call this function (including all its overhead) once instead of once per change. - // 2) Include the addColumn() use case in here, so the calling side doesn't need to know anything about how this class handles table modifications. + // This function is split into three different parts: + // Part 1 checks the arguments and prepares them for processing. It also prepares the transaction etc. + // Part 2 uses the built-in abilities of SQLite to change as much of the table schema as possible. + // Part 3 does the rest of the changes to the table schema. It also finishes the transaction etc. + + // + // P A R T 1 + // // If no new schema name has been set, we just use the old schema name if(newSchemaName.isNull()) { newSchemaName = tablename.schema(); + + // When renaming the table in the current schema, check if it doesn't exist already in there + if(tablename.name() != new_table.name() && getObjectByName(sqlb::ObjectIdentifier(newSchemaName, new_table.name())) != nullptr) + { + lastErrorMessage = tr("A table with the name '%1' already exists in schema '%2'.").arg(new_table.name()).arg(newSchemaName); + return false; + } } else { // We're moving the table to a different schema. So check first if it doesn't already exist in the new schema. - if(getObjectByName(sqlb::ObjectIdentifier(newSchemaName, tablename.name())) != nullptr && newSchemaName != tablename.schema()) + if(newSchemaName != tablename.schema() && getObjectByName(sqlb::ObjectIdentifier(newSchemaName, new_table.name())) != nullptr) { - lastErrorMessage = tr("A table with the name '%1' already exists in schema '%2'.").arg(tablename.name()).arg(newSchemaName); + lastErrorMessage = tr("A table with the name '%1' already exists in schema '%2'.").arg(new_table.name()).arg(newSchemaName); return false; } } - // Create table schema - const sqlb::TablePtr oldSchema = getObjectByName(tablename).dynamicCast(); - - // Check if field actually exists - if(!name.isNull() && oldSchema->findField(name) == -1) + // Get old table schema + sqlb::TablePtr old_table_ptr = getObjectByName(tablename); + if(old_table_ptr == nullptr) { - lastErrorMessage = tr("renameColumn: cannot find column %1.").arg(name); + lastErrorMessage = tr("No table with name '%1' exists in schema '%2'.").arg(tablename.name()).arg(tablename.schema()); return false; } + sqlb::Table old_table = *old_table_ptr; + + // Check if tracked fields actually exist in the old table + for(const auto& old_name : track_columns.keys()) + { + if(!old_name.isNull() && sqlb::findField(old_table, old_name) == old_table.fields.end()) + { + lastErrorMessage = tr("Cannot find column %1.").arg(old_name); + return false; + } + } + + // Check if there are any columns in the old table which are not mentioned in the tracked columns list. + // We do this before checking if all tracked fields are in the new table to make sure the following check includes them. + for(const auto& field : old_table.fields) + { + if(!track_columns.keys().contains(field.name())) + { + // If a field isn't tracked, add it to the list and indicate explicitly that it has the same name in the new table + track_columns[field.name()] = field.name(); + } + } + + // Check if tracked fields actually exist in the new table + for(const auto& new_name : track_columns.values()) + { + if(!new_name.isNull() && sqlb::findField(new_table, new_name) == new_table.fields.end()) + { + lastErrorMessage = tr("Cannot find column %1.").arg(new_name); + return false; + } + } + + // Check if any changes were made to the table schema + if(old_table == new_table) + return true; // Create savepoint to be able to go back to it in case of any error QString savepointName = generateSavepointName("renamecolumn"); if(!setSavepoint(savepointName)) { - lastErrorMessage = tr("renameColumn: creating savepoint failed. DB says: %1").arg(lastErrorMessage); + lastErrorMessage = tr("Creating savepoint failed. DB says: %1").arg(lastErrorMessage); return false; } - // Create a new table with a name that hopefully doesn't exist yet. - // Its layout is exactly the same as the one of the table to change - except for the column to change - // of course, and the table constraints which are copied from the table parameter. - sqlb::Table newSchema = *oldSchema; - QString temp_table_name = generateTemporaryTableName(newSchemaName); - newSchema.setName(temp_table_name); - newSchema.setConstraints(table.allConstraints()); - newSchema.setRowidColumn(table.rowidColumn()); - QString select_cols; - if(to.isNull()) - { - // We want drop the column - so just remove the field. If the name is set to null, skip this step. This effectively leaves all fields as they are, - // thus only changing the table constraints. - if(!name.isNull()) - newSchema.removeField(name); - - for(int i=0;iname()) + ','); - select_cols.chop(1); // remove last comma - } else { - // We want to modify it + // No automatic schema updates from now on + NoStructureUpdateChecks nup(*this); + + // + // P A R T 2 + // - int index = newSchema.findField(name); + // This variable is used to track whether something was changed by this part of the function + bool changed_something = false; - // Move field - if(move) + // Rename table if necessary + if(newSchemaName == tablename.schema() && tablename.name() != new_table.name()) + { + if(!renameTable(tablename.schema(), old_table.name(), new_table.name())) { - sqlb::FieldPtr temp = newSchema.fields().at(index); - newSchema.setField(index, newSchema.fields().at(index + move)); - newSchema.setField(index + move, temp); + revertToSavepoint(savepointName); + return false; } - // Get names of fields to select from old table now - after the field has been moved and before it might be renamed - for(int i=0;iname()) + ','); - select_cols.chop(1); // remove last comma + changed_something = true; + } - // Modify field - newSchema.setField(index + move, to); + // Add columns if necessary + const auto new_fields = track_columns.values(QString()); + for(const auto& field : new_table.fields) + { + // We loop through all the fields of the new table schema and check for each of them if they are new. + // If so, we add that field. The reason for looping through the new table schema instead of the track_columns + // map is that this way we make sure to preserve their order which increases our chances that we are done after + // this step. + if(new_fields.contains(field.name())) + { + if(!addColumn(sqlb::ObjectIdentifier(tablename.schema(), new_table.name()), field)) + { + revertToSavepoint(savepointName); + return false; + } + } + + changed_something = true; } - // Create the new table - NoStructureUpdateChecks nup(*this); - if(!executeSQL(newSchema.sql(newSchemaName), true, true)) + // Newer versions of SQLite add a better ALTER TABLE support which we can use +#if SQLITE_VERSION_NUMBER >= 3025000 + // If the name of a field should be changed do that by using SQLite's ALTER TABLE feature. We build a new + // map for tracking column names here which uses the update column names as the old names too. This is to + // make sure we are using the new table layout for later updates. + AlterTableTrackColumns new_track_columns; + for(const auto& old_name : track_columns.keys()) + { + QString new_name = track_columns[old_name]; + if(!old_name.isNull() && !new_name.isNull() && new_name != old_name) + { + if(!executeSQL(QString("ALTER TABLE %1 RENAME COLUMN %2 TO %3;") + .arg(sqlb::ObjectIdentifier(tablename.schema(), new_table.name()).toString()) + .arg(sqlb::escapeIdentifier(old_name)) + .arg(sqlb::escapeIdentifier(new_name)))) + { + QString error(tr("Renaming the column failed. DB says:\n%1").arg(lastErrorMessage)); + revertToSavepoint(savepointName); + lastErrorMessage = error; + return false; + } + + changed_something = true; + new_track_columns.insert(new_name, new_name); + } else { + new_track_columns.insert(old_name, new_name); + } + } + track_columns.swap(new_track_columns); +#endif + + // Update our schema representation to get the new table and all the changed triggers, views and indices + if(changed_something) + { + updateSchema(); + old_table = *getObjectByName(sqlb::ObjectIdentifier(tablename.schema(), new_table.name())); + } + + // Check if there's still more work to be done or if we are finished now + if(tablename.schema() == newSchemaName && old_table == new_table) { - QString error(tr("renameColumn: creating new table failed. DB says: %1").arg(lastErrorMessage)); + // Release the savepoint - everything went fine + if(!releaseSavepoint(savepointName)) + { + lastErrorMessage = tr("Releasing savepoint failed. DB says: %1").arg(lastErrorMessage); + return false; + } + + // Success, update the DB schema before returning + updateSchema(); + return true; + } + + // + // P A R T 3 + // + + // Create a new table with the desired schema and a name that doesn't exist yet + QString new_table_name = new_table.name(); + sqlb::Table new_table_with_random_name = new_table; + new_table_with_random_name.setName(generateTemporaryTableName(newSchemaName)); + if(!executeSQL(new_table_with_random_name.sql(newSchemaName), true, true)) + { + QString error(tr("Creating new table failed. DB says: %1").arg(lastErrorMessage)); revertToSavepoint(savepointName); lastErrorMessage = error; return false; } + // Assemble list of column names to copy from in the old table and list of column names to into into in the new table + QStringList copy_values_from; + QStringList copy_values_to; + for(const auto& from : track_columns.keys()) + { + // Ignore new fields + if(from.isNull()) + continue; + + // Ignore deleted fields + QString to = track_columns[from]; + if(to.isNull()) + continue; + + copy_values_from.push_back(from); + copy_values_to.push_back(to); + } + // Copy the data from the old table to the new one - if(!executeSQL(QString("INSERT INTO %1.%2 SELECT %3 FROM %4;") + if(!executeSQL(QString("INSERT INTO %1.%2 (%3) SELECT %4 FROM %5.%6;") .arg(sqlb::escapeIdentifier(newSchemaName)) - .arg(sqlb::escapeIdentifier(temp_table_name)) - .arg(select_cols) - .arg(tablename.toString()))) + .arg(sqlb::escapeIdentifier(new_table_with_random_name.name())) + .arg(sqlb::escapeIdentifier(copy_values_to).join(",")) + .arg(sqlb::escapeIdentifier(copy_values_from).join(",")) + .arg(sqlb::escapeIdentifier(tablename.schema())) + .arg(sqlb::escapeIdentifier(old_table.name())))) { - QString error(tr("renameColumn: copying data to new table failed. DB says:\n%1").arg(lastErrorMessage)); + QString error(tr("Copying data to new table failed. DB says:\n%1").arg(lastErrorMessage)); revertToSavepoint(savepointName); lastErrorMessage = error; return false; @@ -1203,40 +1625,47 @@ // Save all indices, triggers and views associated with this table because SQLite deletes them when we drop the table in the next step QStringList otherObjectsSql; - for(auto it=schemata[tablename.schema()].constBegin();it!=schemata[tablename.schema()].constEnd();++it) + for(auto it : schemata[tablename.schema()]) { // If this object references the table and it's not the table itself save it's SQL string - if((*it)->baseTable() == tablename.name() && (*it)->type() != sqlb::Object::Types::Table) + if(it->baseTable() == old_table.name() && it->type() != sqlb::Object::Types::Table) { // If this is an index, update the fields first. This highly increases the chance that the SQL statement won't throw an // error later on when we try to recreate it. - if((*it)->type() == sqlb::Object::Types::Index) + if(it->type() == sqlb::Object::Types::Index) { - sqlb::IndexPtr idx = (*it).dynamicCast(); + sqlb::IndexPtr idx = std::dynamic_pointer_cast(it); - // Are we updating a field name or are we removing a field entirely? - if(to) + // Loop through all changes to the table schema. For indices only the column names are relevant, so it suffices to look at the + // list of tracked columns + for(const auto& from : track_columns) { - // We're updating a field name. So search for it in the index and replace it whereever it is found - for(int i=0;icolumns().size();i++) + QString to = track_columns[from]; + + // Are we updating the field name or are we removing the field entirely? + if(!to.isNull()) { - if(idx->column(i)->name() == name) - idx->column(i)->setName(to->name()); + // We're updating the field name. So search for it in the index and replace it whereever it is found + for(size_t i=0;ifields.size();i++) + { + if(idx->fields[i].name() == from) + idx->fields[i].setName(to); + } + } else { + // We're removing a field. So remove it from any indices, too. + while(sqlb::removeField(idx, from)) + ; } - } else { - // We're removing a field. So remove it from any indices, too. - while(idx->removeColumn(name)) - ; } // Only try to add the index later if it has any columns remaining. Also use the new schema name here, too, to basically move // any index that references the table to the same new schema as the table. - if(idx->columns().size()) + if(idx->fields.size()) otherObjectsSql << idx->sql(newSchemaName); } else { // If it's a view or a trigger we don't have any chance to corrections yet. Just store the statement as is and // hope for the best. - otherObjectsSql << (*it)->originalSql().trimmed() + ";"; + otherObjectsSql << it->originalSql().trimmed() + ";"; } } } @@ -1250,16 +1679,16 @@ setPragma("defer_foreign_keys", "1"); // Delete the old table - if(!executeSQL(QString("DROP TABLE %1;").arg(tablename.toString()), true, true)) + if(!executeSQL(QString("DROP TABLE %1.%2;").arg(sqlb::escapeIdentifier(tablename.schema())).arg(sqlb::escapeIdentifier(old_table.name())), true, true)) { - QString error(tr("renameColumn: deleting old table failed. DB says: %1").arg(lastErrorMessage)); + QString error(tr("Deleting old table failed. DB says: %1").arg(lastErrorMessage)); revertToSavepoint(savepointName); lastErrorMessage = error; return false; } // Rename the temporary table - if(!renameTable(newSchemaName, temp_table_name, tablename.name())) + if(!renameTable(newSchemaName, new_table_with_random_name.name(), new_table.name())) { revertToSavepoint(savepointName); return false; @@ -1286,7 +1715,7 @@ // Release the savepoint - everything went fine if(!releaseSavepoint(savepointName)) { - lastErrorMessage = tr("renameColumn: releasing savepoint failed. DB says: %1").arg(lastErrorMessage); + lastErrorMessage = tr("Releasing savepoint failed. DB says: %1").arg(lastErrorMessage); return false; } @@ -1348,16 +1777,6 @@ return res; } -const sqlb::ObjectPtr DBBrowserDB::getObjectByName(const sqlb::ObjectIdentifier& name) const -{ - for(auto it=schemata[name.schema()].constBegin();it!=schemata[name.schema()].constEnd();++it) - { - if((*it)->name() == name.name()) - return *it; - } - return sqlb::ObjectPtr(nullptr); -} - void DBBrowserDB::logSQL(QString statement, int msgtype) { // Remove any leading and trailing spaces, tabs, or line breaks first @@ -1383,6 +1802,8 @@ void DBBrowserDB::updateSchema() { + waitForDbRelease(); + schemata.clear(); // Exit here is no DB is opened @@ -1394,13 +1815,13 @@ QByteArray db_utf8Statement = db_statement.toUtf8(); logSQL(db_statement, kLogMsg_App); sqlite3_stmt* db_vm; - if(sqlite3_prepare_v2(_db, db_utf8Statement, db_utf8Statement.length(), &db_vm, NULL) == SQLITE_OK) + if(sqlite3_prepare_v2(_db, db_utf8Statement, db_utf8Statement.length(), &db_vm, nullptr) == SQLITE_OK) { // Loop through all the databases while(sqlite3_step(db_vm) == SQLITE_ROW) { // Get the schema name which is in column 1 (counting starts with 0). 0 contains an ID and 2 the file path. - QString schema_name = QString::fromUtf8((const char*)sqlite3_column_text(db_vm, 1)); + QString schema_name = QString::fromUtf8(reinterpret_cast(sqlite3_column_text(db_vm, 1))); // Always add the schema to the map. This makes sure it's even then added when there are no objects in the database schemata[schema_name] = objectMap(); @@ -1416,55 +1837,53 @@ logSQL(statement, kLogMsg_App); sqlite3_stmt* vm; - int err = sqlite3_prepare_v2(_db, utf8Statement, utf8Statement.length(), &vm, NULL); + int err = sqlite3_prepare_v2(_db, utf8Statement, utf8Statement.length(), &vm, nullptr); if(err == SQLITE_OK) { while(sqlite3_step(vm) == SQLITE_ROW) { - QString val_type = QString::fromUtf8((const char*)sqlite3_column_text(vm, 0)); - QString val_name = QString::fromUtf8((const char*)sqlite3_column_text(vm, 1)); - QString val_sql = QString::fromUtf8((const char*)sqlite3_column_text(vm, 2)); - QString val_tblname = QString::fromUtf8((const char*)sqlite3_column_text(vm, 3)); + QString val_type = QString::fromUtf8(reinterpret_cast(sqlite3_column_text(vm, 0))); + QString val_name = QString::fromUtf8(reinterpret_cast(sqlite3_column_text(vm, 1))); + QString val_sql = QString::fromUtf8(reinterpret_cast(sqlite3_column_text(vm, 2))); + QString val_tblname = QString::fromUtf8(reinterpret_cast(sqlite3_column_text(vm, 3))); val_sql.replace("\r", ""); - sqlb::Object::Types type; - if(val_type == "table") - type = sqlb::Object::Types::Table; - else if(val_type == "index") - type = sqlb::Object::Types::Index; - else if(val_type == "trigger") - type = sqlb::Object::Types::Trigger; - else if(val_type == "view") - type = sqlb::Object::Types::View; - else - continue; - if(!val_sql.isEmpty()) { - sqlb::ObjectPtr object = sqlb::Object::parseSQL(type, val_sql); + sqlb::ObjectPtr object; + if(val_type == "table") + object = sqlb::Table::parseSQL(val_sql); + else if(val_type == "index") + object = sqlb::Index::parseSQL(val_sql); + else if(val_type == "trigger") + object = sqlb::Trigger::parseSQL(val_sql); + else if(val_type == "view") + object = sqlb::View::parseSQL(val_sql); + else + continue; // If parsing wasn't successful set the object name manually, so that at least the name is going to be correct if(!object->fullyParsed()) object->setName(val_name); // For virtual tables and views query the column list using the SQLite pragma because for both we can't yet rely on our grammar parser - if((type == sqlb::Object::Types::Table && object.dynamicCast()->isVirtual()) || type == sqlb::Object::Types::View) + if((object->type() == sqlb::Object::Types::Table && std::dynamic_pointer_cast(object)->isVirtual()) || object->type() == sqlb::Object::Types::View) { auto columns = queryColumnInformation(schema_name, val_name); - if(type == sqlb::Object::Types::Table) + if(object->type() == sqlb::Object::Types::Table) { - sqlb::TablePtr tab = object.dynamicCast(); + sqlb::TablePtr tab = std::dynamic_pointer_cast(object); for(const auto& column : columns) - tab->addField(sqlb::FieldPtr(new sqlb::Field(column.first, column.second))); + tab->fields.emplace_back(column.first, column.second); } else { - sqlb::ViewPtr view = object.dynamicCast(); + sqlb::ViewPtr view = std::dynamic_pointer_cast(object); for(const auto& column : columns) - view->addField(sqlb::FieldPtr(new sqlb::Field(column.first, column.second))); + view->fields.emplace_back(column.first, column.second); } - } else if(type == sqlb::Object::Types::Trigger) { + } else if(object->type() == sqlb::Object::Types::Trigger) { // For triggers set the name of the table the trigger operates on here because we don't have a parser for trigger statements yet. - sqlb::TriggerPtr trg = object.dynamicCast(); + sqlb::TriggerPtr trg = std::dynamic_pointer_cast(object); trg->setTable(val_tblname); } @@ -1487,36 +1906,18 @@ QString DBBrowserDB::getPragma(const QString& pragma) { - if(!isOpen()) - return QString(); - - QString sql = QString("PRAGMA %1").arg(pragma); - sqlite3_stmt* vm; - const char* tail; - QString retval; - - // Get value from DB - int err = sqlite3_prepare_v2(_db, sql.toUtf8(), sql.toUtf8().length(), &vm, &tail); - if(err == SQLITE_OK){ - logSQL(sql, kLogMsg_App); - if(sqlite3_step(vm) == SQLITE_ROW) - retval = QString::fromUtf8((const char *) sqlite3_column_text(vm, 0)); - else - qWarning() << tr("didn't receive any output from pragma %1").arg(pragma); - - sqlite3_finalize(vm); - } else { - qWarning() << tr("could not execute pragma command: %1, %2").arg(err).arg(sqlite3_errmsg(_db)); - } - - // Return it - return retval; + QString sql; + if (pragma=="case_sensitive_like") + sql = "SELECT 'x' NOT LIKE 'X'"; + else + sql = QString("PRAGMA %1").arg(pragma); + return querySingleValueFromDb(sql); } bool DBBrowserDB::setPragma(const QString& pragma, const QString& value) { // Set the pragma value - QString sql = QString("PRAGMA %1 = \"%2\";").arg(pragma).arg(value); + QString sql = QString("PRAGMA %1 = '%2';").arg(pragma).arg(value); // In general, we want to commit changes before running pragmas because most of them can't be rolled back and some of them // even fail when run in a transaction. However, the defer_foreign_keys pragma has neither problem and we need it to be settable @@ -1529,9 +1930,9 @@ if( !res ) qWarning() << tr("Error setting pragma %1 to %2: %3").arg(pragma).arg(value).arg(lastErrorMessage); - // If this is the page_size pragma being set, we need to execute the vacuum command right after the pragma statement or the new - // page size won't be saved. - if(res && pragma == "page_size") + // If this is the page_size or the auto_vacuum pragma being set, we need to execute the vacuum command right after the pragma statement or the new + // settings won't be saved. + if(res && (pragma == "page_size" || pragma == "auto_vacuum")) res = executeSQL("VACUUM;", false, true); return res; @@ -1564,21 +1965,32 @@ return false; } -bool DBBrowserDB::loadExtension(const QString& filename) +bool DBBrowserDB::loadExtension(const QString& filePath) { - if(!isOpen()) + waitForDbRelease(); + if(!_db) return false; // Check if file exists - if(!QFile::exists(filename)) + if(!QFile::exists(filePath)) { lastErrorMessage = tr("File not found."); return false; } + // Enable extension loading + sqlite3_enable_load_extension(_db, 1); + // Try to load extension char* error; - if(sqlite3_load_extension(_db, filename.toUtf8(), nullptr, &error) == SQLITE_OK) + int result = sqlite3_load_extension(_db, filePath.toUtf8(), nullptr, &error); + + // Disable extension loading if so configured + // (we don't want to leave the possibility of calling load_extension() from SQL without user informed permission) + if (!Settings::getValue("extensions", "enable_load_extension").toBool()) + sqlite3_enable_load_extension(_db, 0); + + if (result == SQLITE_OK) { return true; } else { @@ -1588,8 +2000,26 @@ } } + +void DBBrowserDB::loadExtensionsFromSettings() +{ + if(!_db) + return; + + sqlite3_enable_load_extension(_db, Settings::getValue("extensions", "enable_load_extension").toBool()); + + QStringList list = Settings::getValue("extensions", "list").toStringList(); + for(const QString& ext : list) + { + if(loadExtension(ext) == false) + QMessageBox::warning(nullptr, QApplication::applicationName(), tr("Error loading extension: %1").arg(lastError())); + } +} + QVector> DBBrowserDB::queryColumnInformation(const QString& schema_name, const QString& object_name) { + waitForDbRelease(); + QVector> result; QString statement = QString("PRAGMA %1.TABLE_INFO(%2);").arg(sqlb::escapeIdentifier(schema_name)).arg(sqlb::escapeIdentifier(object_name)); logSQL(statement, kLogMsg_App); @@ -1600,8 +2030,8 @@ { while(sqlite3_step(vm) == SQLITE_ROW) { - QString name = QString::fromUtf8((const char *)sqlite3_column_text(vm, 1)); - QString type = QString::fromUtf8((const char *)sqlite3_column_text(vm, 2)); + QString name = QString::fromUtf8(reinterpret_cast(sqlite3_column_text(vm, 1))); + QString type = QString::fromUtf8(reinterpret_cast(sqlite3_column_text(vm, 2))); result.push_back(qMakePair(name, type)); } @@ -1633,3 +2063,11 @@ return table_name; } } + +void DBBrowserDB::interruptQuery() +{ + if(!_db) + return; + + sqlite3_interrupt(_db); +} diff -Nru sqlitebrowser-3.10.100ubuntu1/src/sqlitedb.h sqlitebrowser-3.11.1/src/sqlitedb.h --- sqlitebrowser-3.10.100ubuntu1/src/sqlitedb.h 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/src/sqlitedb.h 2019-02-19 23:51:34.000000000 +0000 @@ -1,14 +1,19 @@ #ifndef SQLITEDB_H #define SQLITEDB_H -#include "sqlitetypes.h" +#include "sql/sqlitetypes.h" + +#include +#include +#include +#include -#include -#include #include +#include +#include struct sqlite3; -class CipherDialog; +class CipherSettings; enum { @@ -21,25 +26,100 @@ int collCompare(void* pArg, int sizeA, const void* sA, int sizeB, const void* sB); +/// represents a single SQLite database. except when noted otherwise, +/// all member functions are to be called from the main UI thread +/// only. class DBBrowserDB : public QObject { Q_OBJECT +private: + /// custom unique_ptr deleter releases database for further use by others + struct DatabaseReleaser + { + DatabaseReleaser(DBBrowserDB * pParent_ = nullptr) : pParent(pParent_) {} + + DBBrowserDB * pParent; + + void operator() (sqlite3 * db) const + { + if(!db || !pParent) + return; + + std::unique_lock lk(pParent->m); + pParent->db_used = false; + lk.unlock(); + emit pParent->databaseInUseChanged(false, QString()); + pParent->cv.notify_one(); + } + }; + public: - explicit DBBrowserDB () : _db(nullptr), isEncrypted(false), isReadOnly(false), dontCheckForStructureUpdates(false) {} - virtual ~DBBrowserDB (){} + + explicit DBBrowserDB () : _db(nullptr), db_used(false), isEncrypted(false), isReadOnly(false), dontCheckForStructureUpdates(false) {} + ~DBBrowserDB () override {} + bool open(const QString& db, bool readOnly = false); bool attach(const QString& filename, QString attach_as = ""); bool create ( const QString & db); bool close(); + + // This returns the SQLite version as well as the SQLCipher if DB4S is compiled with encryption support + static void getSqliteVersion(QString& sqlite, QString& sqlcipher); + + typedef std::unique_ptr db_pointer_type; + + /** + borrow exclusive address to the currently open database, until + releasing the returned unique_ptr. + + the intended use case is that the main UI thread can call this + any time, and then optionally pass the obtained pointer to a + background worker, or release it after doing work immediately. + + if database is currently used by somebody else, opens a dialog + box and gives user the opportunity to sqlite3_interrupt() the + operation of the current owner, then tries again. + + \param user a string that identifies the new user, and which + can be displayed in the dialog box. + + \param force_wait if set to true we won't ask the user to cancel + the running query but just wait until it is done. + + \returns a unique_ptr containing the SQLite database handle, or + nullptr in case no database is open. + **/ + db_pointer_type get (QString user, bool force_wait = false); + bool setSavepoint(const QString& pointname = "RESTOREPOINT"); bool releaseSavepoint(const QString& pointname = "RESTOREPOINT"); bool revertToSavepoint(const QString& pointname = "RESTOREPOINT"); bool releaseAllSavepoints(); bool revertAll(); - bool dump(const QString & filename, const QStringList &tablesToDump, bool insertColNames, bool insertNew, bool exportSchema, bool exportData, bool keepOldSchema); - bool executeSQL(QString statement, bool dirtyDB = true, bool logsql = true); - bool executeMultiSQL(const QString& statement, bool dirty = true, bool log = false); + + bool dump(const QString& filename, const QStringList& tablesToDump, bool insertColNames, bool insertNew, bool exportSchema, bool exportData, bool keepOldSchema); + + enum ChoiceOnUse + { + Ask, + Wait, + CancelOther + }; + // Callback to get results from executeSQL(). It is invoked for + // each result row coming out of the evaluated SQL statements. If + // a callback returns true (abort), the executeSQL() method + // returns false (error) without invoking the callback again and + // without running any subsequent SQL statements. The 1st argument + // is the number of columns in the result. The 2nd argument to the + // callback is the text representation of the values, one for each + // column. The 3rd argument is a list of strings where each entry + // represents the name of corresponding result column. + typedef std::function execCallback; + bool executeSQL(QString statement, bool dirtyDB = true, bool logsql = true, execCallback callback = nullptr); + bool executeMultiSQL(QByteArray query, bool dirty = true, bool log = false); + QByteArray querySingleValueFromDb(const QString& sql, bool log = true, ChoiceOnUse choice = Ask); + const QString& lastError() const { return lastErrorMessage; } /** @@ -54,16 +134,25 @@ bool getRow(const sqlb::ObjectIdentifier& table, const QString& rowid, QVector& rowdata); /** + * @brief Interrupts the currenty running statement as soon as possible. + */ + void interruptQuery(); + +private: + /** * @brief max Queries the table t for the max value of field. * @param tableName Table to query * @param field Field to get the max value * @return the max value of the field or 0 on error */ - QString max(const sqlb::ObjectIdentifier& tableName, sqlb::FieldPtr field) const; + QString max(const sqlb::ObjectIdentifier& tableName, const sqlb::Field& field) const; + static int callbackWrapper (void* callback, int numberColumns, char** values, char** columnNames); + +public: void updateSchema(); - QString addRecord(const sqlb::ObjectIdentifier& tablename); +private: /** * @brief Creates an empty insert statement. * @param schemaName The name of the database schema in which to find the table @@ -71,33 +160,57 @@ * @return An sqlite conform INSERT INTO statement with empty values. (NULL,'',0) */ QString emptyInsertStmt(const QString& schemaName, const sqlb::Table& t, const QString& pk_value = QString()) const; - bool deleteRecords(const sqlb::ObjectIdentifier& table, const QStringList& rowids); + +public: + QString addRecord(const sqlb::ObjectIdentifier& tablename); + bool deleteRecords(const sqlb::ObjectIdentifier& table, const QStringList& rowids, const QString& pseudo_pk = QString()); bool updateRecord(const sqlb::ObjectIdentifier& table, const QString& column, const QString& rowid, const QByteArray& value, bool itsBlob, const QString& pseudo_pk = QString()); bool createTable(const sqlb::ObjectIdentifier& name, const sqlb::FieldVector& structure); bool renameTable(const QString& schema, const QString& from_table, const QString& to_table); - bool addColumn(const sqlb::ObjectIdentifier& tablename, const sqlb::FieldPtr& field); + bool addColumn(const sqlb::ObjectIdentifier& tablename, const sqlb::Field& field); /** - * @brief alterTable Can be used to rename, modify or drop an existing column of a given table - * @param schema Specifies the name of the schema, i.e. the database name, of the table - * @param tablename Specifies the name of the table to edit - * @param table Specifies the table to edit. The table constraints are used from this but not the columns - * @param name Name of the column to edit - * @param to The new field definition with changed name, type or the like. If Null-Pointer is given the column is dropped. - * @param move Set this to a value != 0 to move the new column to a different position + * @brief This type maps from old column names to new column names. Given the old and the new table definition, this suffices to + * track fields between the two. + * USE CASES: + * 1) Don't specify a column at all or specify equal column names: Keep its name as-is. + * 2) Specify different column names: Rename the field. + * 3) Map from an existing column name to a Null string: Delete the column. + * 4) Map from a Null column name to a new column name: Add the column. + */ + using AlterTableTrackColumns = QMap; + + /** + * @brief alterTable Can be used to rename, modify or drop existing columns of a given table + * @param tablename Specifies the schema and name of the table to edit + * @param new_table Specifies the new table schema. This is exactly how the new table is going to look like. + * @param track_columns Maps old column names to new column names. This is used to copy the data from the old table to the new one. * @param newSchema Set this to a non-empty string to move the table to a new schema * @return true if renaming was successful, false if not. In the latter case also lastErrorMessage is set */ - bool alterTable(const sqlb::ObjectIdentifier& tablename, const sqlb::Table& table, const QString& name, sqlb::FieldPtr to, int move = 0, QString newSchemaName = QString()); + bool alterTable(const sqlb::ObjectIdentifier& tablename, const sqlb::Table& new_table, AlterTableTrackColumns track_columns, QString newSchemaName = QString()); objectMap getBrowsableObjects(const QString& schema) const; - const sqlb::ObjectPtr getObjectByName(const sqlb::ObjectIdentifier& name) const; + + template + const std::shared_ptr getObjectByName(const sqlb::ObjectIdentifier& name) const + { + for(auto& it : schemata[name.schema()]) + { + if(it->name() == name.name()) + return std::dynamic_pointer_cast(it); + } + return std::shared_ptr(); + } + bool isOpen() const; bool encrypted() const { return isEncrypted; } bool readOnly() const { return isReadOnly; } bool getDirty() const; QString currentFile() const { return curDBFilename; } + + /// log an SQL statement [thread-safe] void logSQL(QString statement, int msgtype); QString getPragma(const QString& pragma); @@ -106,16 +219,19 @@ bool setPragma(const QString& pragma, int value, int& originalvalue); bool loadExtension(const QString& filename); + void loadExtensionsFromSettings(); + + static QStringList Datatypes; +private: QVector> queryColumnInformation(const QString& schema_name, const QString& object_name); +public: QString generateSavepointName(const QString& identifier = QString()) const; // This function generates the name for a temporary table. It guarantees that there is no table with this name yet QString generateTemporaryTableName(const QString& schema) const; - sqlite3 * _db; - schemaMap schemata; signals: @@ -123,17 +239,32 @@ void dbChanged(bool dirty); void structureUpdated(); void requestCollation(QString name, int eTextRep); + void databaseInUseChanged(bool busy, QString user); private: + /// external code needs to go through get() to obtain access to the database + sqlite3 * _db; + std::mutex m; + std::condition_variable cv; + bool db_used; + QString db_user; + + /// wait for release of the DB locked through a previous get(), + /// giving users the option to discard running task through a + /// message box. + void waitForDbRelease(ChoiceOnUse choice = Ask); + QString curDBFilename; QString lastErrorMessage; QStringList savepointList; bool isEncrypted; bool isReadOnly; + QString primaryKeyForEditing(const sqlb::ObjectIdentifier& table, const QString& pseudo_pk) const; + void collationNeeded(void* pData, sqlite3* db, int eTextRep, const char* sCollationName); - bool tryEncryptionSettings(const QString& filename, bool* encrypted, CipherDialog*& cipherSettings); + bool tryEncryptionSettings(const QString& filename, bool* encrypted, CipherSettings*& cipherSettings); bool dontCheckForStructureUpdates; diff -Nru sqlitebrowser-3.10.100ubuntu1/src/sqlitetablemodel.cpp sqlitebrowser-3.11.1/src/sqlitetablemodel.cpp --- sqlitebrowser-3.10.100ubuntu1/src/sqlitetablemodel.cpp 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/src/sqlitetablemodel.cpp 2019-02-19 23:51:34.000000000 +0000 @@ -11,42 +11,102 @@ #include #include #include +#include + +#include "RowLoader.h" SqliteTableModel::SqliteTableModel(DBBrowserDB& db, QObject* parent, size_t chunkSize, const QString& encoding) : QAbstractTableModel(parent) , m_db(db) - , m_rowCountAdjustment(0) + , m_lifeCounter(0) + , m_currentRowCount(0) , m_chunkSize(chunkSize) , m_encoding(encoding) { + worker = new RowLoader( + [this](){ return m_db.get(tr("reading rows")); }, + [this](QString stmt){ return m_db.logSQL(stmt, kLogMsg_App); }, + m_headers, m_mutexDataCache, m_cache + ); + + worker->start(); + + // any UI updates must be performed in the UI thread, not in the worker thread: + connect(worker, &RowLoader::fetched, this, &SqliteTableModel::handleFinishedFetch, Qt::QueuedConnection); + connect(worker, &RowLoader::rowCountComplete, this, &SqliteTableModel::handleRowCountComplete, Qt::QueuedConnection); + reset(); } SqliteTableModel::~SqliteTableModel() { - m_futureFetch.cancel(); - m_futureFetch.waitForFinished(); + worker->stop(); + worker->wait(); + worker->disconnect(); + delete worker; +} + +SqliteTableModel::RowCount SqliteTableModel::rowCountAvailable () const +{ + return m_rowCountAvailable; +} + +void SqliteTableModel::handleFinishedFetch (int life_id, unsigned int fetched_row_begin, unsigned int fetched_row_end) +{ + if(life_id < m_lifeCounter) + return; + + Q_ASSERT(fetched_row_end >= fetched_row_begin); + + auto old_row_count = m_currentRowCount; + + auto new_row_count = std::max(old_row_count, fetched_row_begin); + new_row_count = std::max(new_row_count, fetched_row_end); + Q_ASSERT(new_row_count >= old_row_count); + + if(new_row_count != old_row_count) + { + beginInsertRows(QModelIndex(), old_row_count, new_row_count - 1); + m_currentRowCount = new_row_count; + endInsertRows(); + } + + if(fetched_row_end != fetched_row_begin) + { + // TODO optimize + int num_columns = m_headers.size(); + emit dataChanged(createIndex(fetched_row_begin, 0), createIndex(fetched_row_end - 1, num_columns - 1)); + } + + if(m_rowCountAvailable != RowCount::Complete) + m_rowCountAvailable = RowCount::Partial; + + emit finishedFetch(fetched_row_begin, fetched_row_end); +} + +void SqliteTableModel::handleRowCountComplete (int life_id, int num_rows) +{ + if(life_id < m_lifeCounter) + return; + + m_rowCountAvailable = RowCount::Complete; + handleFinishedFetch(life_id, num_rows, num_rows); + + emit finishedRowCount(); } void SqliteTableModel::reset() { - m_futureFetch.cancel(); - m_futureFetch.waitForFinished(); - m_rowCount = QtConcurrent::run([=]() { - // Make sure we report 0 rows if anybody asks - return 0; - }); - - m_rowCountAdjustment = 0; - m_sTable.clear(); - m_sRowidColumn.clear(); - m_iSortColumn = 0; - m_sSortOrder = "ASC"; + beginResetModel(); + clearCache(); + + m_sQuery.clear(); + m_query.clear(); m_headers.clear(); - m_mWhere.clear(); m_vDataTypes.clear(); - m_vDisplayFormat.clear(); - m_pseudoPk.clear(); + m_mCondFormats.clear(); + + endResetModel(); } void SqliteTableModel::setChunkSize(size_t chunksize) @@ -54,27 +114,27 @@ m_chunkSize = chunksize; } -void SqliteTableModel::setTable(const sqlb::ObjectIdentifier& table, int sortColumn, Qt::SortOrder sortOrder, const QVector& display_format) +void SqliteTableModel::setQuery(const sqlb::Query& query) { // Unset all previous settings. When setting a table all information on the previously browsed data set is removed first. reset(); - // Save the other parameters - m_sTable = table; - m_vDisplayFormat = display_format; + // Save the query + m_query = query; // The first column is the rowid column and therefore is always of type integer m_vDataTypes.push_back(SQLITE_INTEGER); // Get the data types of all other columns as well as the column names bool allOk = false; - if(m_db.getObjectByName(table)->type() == sqlb::Object::Types::Table) + if(m_db.getObjectByName(query.table()) && m_db.getObjectByName(query.table())->type() == sqlb::Object::Types::Table) { - sqlb::TablePtr t = m_db.getObjectByName(table).dynamicCast(); - if(t && t->fields().size()) // parsing was OK + sqlb::TablePtr t = m_db.getObjectByName(query.table()); + if(t && t->fields.size()) // parsing was OK { - m_sRowidColumn = t->rowidColumn(); - m_headers.push_back(m_sRowidColumn); + QString rowid = t->rowidColumn(); + m_query.setRowIdColumn(rowid.toStdString()); + m_headers.push_back(rowid); m_headers.append(t->fieldNames()); // parse columns types @@ -83,9 +143,9 @@ << "REAL" << "TEXT" << "BLOB"; - for(const sqlb::FieldPtr& fld : t->fields()) + for(const sqlb::Field& fld : t->fields) { - QString name(fld->type().toUpper()); + QString name(fld.type().toUpper()); int colType = dataTypes.indexOf(name); colType = (colType == -1) ? SQLITE_TEXT : colType + 1; m_vDataTypes.push_back(colType); @@ -99,116 +159,52 @@ // NOTE: It would be nice to eventually get rid of this piece here. As soon as the grammar parser is good enough... if(!allOk) { - QString sColumnQuery = QString::fromUtf8("SELECT * FROM %1;").arg(table.toString()); - m_sRowidColumn = "rowid"; - m_headers.push_back("rowid"); - m_headers.append(getColumns(sColumnQuery, m_vDataTypes)); + QString sColumnQuery = QString::fromUtf8("SELECT * FROM %1;").arg(query.table().toString()); + if(m_query.rowIdColumn().empty()) + m_query.setRowIdColumn("_rowid_"); + m_headers.push_back("_rowid_"); + m_headers.append(getColumns(nullptr, sColumnQuery, m_vDataTypes)); } - // Set sort parameters. We're setting the sort column to an invalid value before calling sort() because this way, in sort() the - // current sort order is always changed and thus buildQuery() is always going to be called. - // This is also why we don't need to call buildQuery() here again. - m_iSortColumn = -1; - sort(sortColumn, sortOrder); -} + // Tell the query object about the column names + std::vector column_names; + for(const auto& h : m_headers) + column_names.push_back(h.toStdString()); + m_query.setColumNames(column_names); -namespace { -QString rtrimChar(const QString& s, QChar c) { - QString r = s.trimmed(); - while(r.endsWith(c)) - r.chop(1); - return r; -} + // Apply new query and update view + buildQuery(); } -void SqliteTableModel::setQuery(const QString& sQuery, bool dontClearHeaders) +void SqliteTableModel::setQuery(const QString& sQuery, const QString& sCountQuery, bool dontClearHeaders) { // clear if(!dontClearHeaders) reset(); + else + clearCache(); if(!m_db.isOpen()) return; m_sQuery = sQuery.trimmed(); - removeCommentsFromQuery(m_sQuery); - // do a count query to get the full row count in a fast manner - m_rowCountAdjustment = 0; - m_rowCount = QtConcurrent::run([=]() { - return getQueryRowCount(); - }); + worker->setQuery(m_sQuery, sCountQuery); + worker->triggerRowCountDetermination(m_lifeCounter); - // headers if(!dontClearHeaders) - { - m_headers.append(getColumns(sQuery, m_vDataTypes)); - } + m_headers.append(getColumns(worker->getDb(), sQuery, m_vDataTypes)); // now fetch the first entries - clearCache(); - fetchData(0, m_chunkSize); + triggerCacheLoad(m_chunkSize / 2 - 1); emit layoutChanged(); } -int SqliteTableModel::getQueryRowCount() -{ - // Return -1 if there is an error - int retval = -1; - - // Use a different approach of determining the row count when a EXPLAIN or a PRAGMA statement is used because a COUNT fails on these queries - if(m_sQuery.startsWith("EXPLAIN", Qt::CaseInsensitive) || m_sQuery.startsWith("PRAGMA", Qt::CaseInsensitive)) - { - // So just execute the statement as it is and fetch all results counting the rows - sqlite3_stmt* stmt; - QByteArray utf8Query = m_sQuery.toUtf8(); - if(sqlite3_prepare_v2(m_db._db, utf8Query, utf8Query.size(), &stmt, NULL) == SQLITE_OK) - { - retval = 0; - while(sqlite3_step(stmt) == SQLITE_ROW) - retval++; - sqlite3_finalize(stmt); - - // Return the results but also set the chunk size the number of rows to prevent the lazy population mechanism to kick in as using LIMIT - // fails on this kind of queries as well - m_chunkSize = retval; - return retval; - } - } else { - // If it is a normal query - hopefully starting with SELECT - just do a COUNT on it and return the results - QString sCountQuery = QString("SELECT COUNT(*) FROM (%1);").arg(rtrimChar(m_sQuery, ';')); - m_db.logSQL(sCountQuery, kLogMsg_App); - QByteArray utf8Query = sCountQuery.toUtf8(); - - sqlite3_stmt* stmt; - int status = sqlite3_prepare_v2(m_db._db, utf8Query, utf8Query.size(), &stmt, NULL); - if(status == SQLITE_OK) - { - status = sqlite3_step(stmt); - if(status == SQLITE_ROW) - { - QString sCount = QString::fromUtf8((const char*)sqlite3_column_text(stmt, 0)); - retval = sCount.toInt(); - } - sqlite3_finalize(stmt); - } else { - qWarning() << "Count query failed: " << sCountQuery; - } - } - - return retval; -} - int SqliteTableModel::rowCount(const QModelIndex&) const { - return m_data.size(); // current fetched row count -} - -int SqliteTableModel::totalRowCount() const -{ - return m_rowCount + m_rowCountAdjustment; + return m_currentRowCount; } int SqliteTableModel::columnCount(const QModelIndex&) const @@ -218,7 +214,7 @@ int SqliteTableModel::filterCount() const { - return m_mWhere.size(); + return m_query.where().size(); } QVariant SqliteTableModel::headerData(int section, Qt::Orientation orientation, int role) const @@ -243,25 +239,37 @@ if (!index.isValid()) return QVariant(); - if (index.row() >= (m_rowCount + m_rowCountAdjustment)) + if (index.row() >= rowCount()) return QVariant(); QMutexLocker lock(&m_mutexDataCache); - if(role == Qt::DisplayRole || role == Qt::EditRole) + Row blank_data; + bool row_available; + + const Row * cached_row; + if(m_cache.count(index.row())) { - // If this row is not in the cache yet get it first - while(index.row() >= m_data.size() && canFetchMore()) - const_cast(this)->fetchMore(); // Nothing evil to see here, move along + cached_row = &m_cache.at(index.row()); + row_available = true; + } else { + blank_data = makeDefaultCacheEntry(); + cached_row = &blank_data; + row_available = false; + } - if(role == Qt::DisplayRole && m_data.at(index.row()).at(index.column()).isNull()) + if(role == Qt::DisplayRole || role == Qt::EditRole) + { + if(!row_available) + return tr("loading..."); + if(role == Qt::DisplayRole && cached_row->at(index.column()).isNull()) { return Settings::getValue("databrowser", "null_text").toString(); - } else if(role == Qt::DisplayRole && isBinary(index)) { + } else if(role == Qt::DisplayRole && nosync_isBinary(index)) { return Settings::getValue("databrowser", "blob_text").toString(); } else if(role == Qt::DisplayRole) { int limit = Settings::getValue("databrowser", "symbol_limit").toInt(); - QByteArray displayText = m_data.at(index.row()).at(index.column()); + QByteArray displayText = cached_row->at(index.column()); if (displayText.length() > limit) { // Add "..." to the end of truncated strings return decode(displayText.left(limit).append(" ...")); @@ -269,34 +277,60 @@ return decode(displayText); } } else { - return decode(m_data.at(index.row()).at(index.column())); + return decode(cached_row->at(index.column())); } } else if(role == Qt::FontRole) { QFont font; - if(m_data.at(index.row()).at(index.column()).isNull() || isBinary(index)) + if(!row_available || cached_row->at(index.column()).isNull() || nosync_isBinary(index)) font.setItalic(true); return font; } else if(role == Qt::ForegroundRole) { - if(m_data.at(index.row()).at(index.column()).isNull()) + if(!row_available) + return QColor(100, 100, 100); + if(cached_row->at(index.column()).isNull()) return QColor(Settings::getValue("databrowser", "null_fg_colour").toString()); - else if (isBinary(index)) + else if (nosync_isBinary(index)) return QColor(Settings::getValue("databrowser", "bin_fg_colour").toString()); return QColor(Settings::getValue("databrowser", "reg_fg_colour").toString()); } else if (role == Qt::BackgroundRole) { - if(m_data.at(index.row()).at(index.column()).isNull()) + if(!row_available) + return QColor(255, 200, 200); + if(cached_row->at(index.column()).isNull()) return QColor(Settings::getValue("databrowser", "null_bg_colour").toString()); - else if (isBinary(index)) + else if (nosync_isBinary(index)) return QColor(Settings::getValue("databrowser", "bin_bg_colour").toString()); + else if (m_mCondFormats.contains(index.column())) { + QString value = cached_row->at(index.column()); + bool isNumber; + value.toFloat(&isNumber); + QString sql; + // For each conditional format for this column, + // if the condition matches the current data, return the associated colour. + for (const CondFormat& eachCondFormat : m_mCondFormats.value(index.column())) { + if (isNumber && !eachCondFormat.sqlCondition().contains("'")) + sql = QString("SELECT %1 %2").arg(value, eachCondFormat.sqlCondition()); + else + sql = QString("SELECT '%1' %2").arg(value, eachCondFormat.sqlCondition()); + + // Unlock before querying from DB + lock.unlock(); + // Query the DB for the condition, waiting in case there is a loading in progress. + if (m_db.querySingleValueFromDb(sql, false, DBBrowserDB::Wait) == "1") + return eachCondFormat.color(); + } + } + // Regular case (not null, not binary and no matching conditional format) return QColor(Settings::getValue("databrowser", "reg_bg_colour").toString()); } else if(role == Qt::ToolTipRole) { sqlb::ForeignKeyClause fk = getForeignKeyClause(index.column()-1); if(fk.isSet()) - return tr("References %1(%2)\nHold Ctrl+Shift and click to jump there").arg(fk.table()).arg(fk.columns().join(",")); + return tr("References %1(%2)\nHold %3Shift and click to jump there").arg(fk.table()).arg(fk.columns().join(",")) + .arg(QKeySequence(Qt::CTRL).toString(QKeySequence::NativeText)); else return QString(); - } else { - return QVariant(); } + + return QVariant(); } sqlb::ForeignKeyClause SqliteTableModel::getForeignKeyClause(int column) const @@ -305,26 +339,26 @@ // No foreign keys when not browsing a table. This usually happens when executing custom SQL statements // and browsing the result set instead of browsing an entire table. - if(m_sTable.isEmpty()) + if(m_query.table().isEmpty()) return empty_foreign_key_clause; // Retrieve database object and check if it is a table. If it isn't stop here and don't return a foreign // key. This happens for views which don't have foreign keys (though we might want to think about how we // can check for foreign keys in the underlying tables for some purposes like tool tips). - sqlb::ObjectPtr obj = m_db.getObjectByName(m_sTable); + sqlb::ObjectPtr obj = m_db.getObjectByName(m_query.table()); if(obj->type() != sqlb::Object::Table) return empty_foreign_key_clause; // Convert object to a table and check if the column number is in the valid range - sqlb::TablePtr tbl = obj.dynamicCast(); - if(tbl && tbl->name().size() && (column >= 0 && column < tbl->fields().count())) + sqlb::TablePtr tbl = std::dynamic_pointer_cast(obj); + if(tbl && tbl->name().size() && (column >= 0 && column < static_cast(tbl->fields.size()))) { // Note that the rowid column has number -1 here, it can safely be excluded since there will never be a // foreign key on that column. - sqlb::ConstraintPtr ptr = tbl->constraint({tbl->fields().at(column)}, sqlb::Constraint::ForeignKeyConstraintType); + sqlb::ConstraintPtr ptr = tbl->constraint({tbl->fields.at(column).name()}, sqlb::Constraint::ForeignKeyConstraintType); if(ptr) - return *(ptr.dynamicCast()); + return *(std::dynamic_pointer_cast(ptr)); } return empty_foreign_key_clause; @@ -343,22 +377,29 @@ bool SqliteTableModel::setTypedData(const QModelIndex& index, bool isBlob, const QVariant& value, int role) { + if(readingData()) { + // can't insert rows while reading data in background + return false; + } + if(index.isValid() && role == Qt::EditRole) { QMutexLocker lock(&m_mutexDataCache); + auto & cached_row = m_cache.at(index.row()); + QByteArray newValue = encode(value.toByteArray()); - QByteArray oldValue = m_data.at(index.row()).at(index.column()); + QByteArray oldValue = cached_row.at(index.column()); // Special handling for integer columns: instead of setting an integer column to an empty string, set it to '0' when it is also // used in a primary key. Otherwise SQLite will always output an 'datatype mismatch' error. if(newValue == "" && !newValue.isNull()) { - sqlb::TablePtr table = m_db.getObjectByName(m_sTable).dynamicCast(); + sqlb::TablePtr table = m_db.getObjectByName(m_query.table()); if(table) { - sqlb::FieldPtr field = table->field(table->findField(m_headers.at(index.column()))); - if(table->primaryKey().contains(field) && field->isInteger()) + auto field = sqlb::findField(table, m_headers.at(index.column())); + if(contains(table->primaryKey(), field->name()) && field->isInteger()) newValue = "0"; } } @@ -368,13 +409,17 @@ if(oldValue == newValue && oldValue.isNull() == newValue.isNull()) return true; - if(m_db.updateRecord(m_sTable, m_headers.at(index.column()), m_data[index.row()].at(0), newValue, isBlob, m_pseudoPk)) + if(m_db.updateRecord(m_query.table(), m_headers.at(index.column()), cached_row.at(0), newValue, isBlob, QString::fromStdString(m_query.rowIdColumn()))) { - // Only update the cache if this row has already been read, if not there's no need to do any changes to the cache - if(index.row() < m_data.size()) - m_data[index.row()].replace(index.column(), newValue); - - lock.unlock(); + cached_row.replace(index.column(), newValue); + if(m_headers.at(index.column()).toStdString() == m_query.rowIdColumn()) { + cached_row.replace(0, newValue); + const QModelIndex& rowidIndex = index.sibling(index.row(), 0); + lock.unlock(); + emit dataChanged(rowidIndex, rowidIndex); + } else { + lock.unlock(); + } emit dataChanged(index, index); return true; } else { @@ -387,20 +432,6 @@ return false; } -bool SqliteTableModel::canFetchMore(const QModelIndex&) const -{ - QMutexLocker lock(&m_mutexDataCache); - return m_data.size() < (m_rowCount + m_rowCountAdjustment); -} - -void SqliteTableModel::fetchMore(const QModelIndex&) -{ - m_futureFetch.waitForFinished(); - QMutexLocker lock(&m_mutexDataCache); - int row = m_data.size(); - fetchData(row, row + m_chunkSize); -} - Qt::ItemFlags SqliteTableModel::flags(const QModelIndex& index) const { if(!index.isValid()) @@ -410,11 +441,10 @@ // Custom display format set? bool custom_display_format = false; - if(m_vDisplayFormat.size()) + if(m_query.selectedColumns().size()) { - // NOTE: This assumes that custom display formats never start and end with a backtick if(index.column() > 0) - custom_display_format = !(m_vDisplayFormat.at(index.column()-1).startsWith("`") && m_vDisplayFormat.at(index.column()-1).endsWith("`")); + custom_display_format = QString::fromStdString(m_query.selectedColumns().at(index.column()-1).selector) != sqlb::escapeIdentifier(headerData(index.column(), Qt::Horizontal).toString()); } if(!isBinary(index) && !custom_display_format) @@ -425,58 +455,78 @@ void SqliteTableModel::sort(int column, Qt::SortOrder order) { // Don't do anything when the sort order hasn't changed - if(m_iSortColumn == column && m_sSortOrder == (order == Qt::AscendingOrder ? "ASC" : "DESC")) + if(m_query.orderBy().size() && m_query.orderBy().at(0).column == column && m_query.orderBy().at(0).direction == (order == Qt::AscendingOrder ? sqlb::Ascending : sqlb::Descending)) return; + // Reset sort order + m_query.orderBy().clear(); + // Save sort order if (column >= 0 && column < m_headers.size()) - m_iSortColumn = column; - m_sSortOrder = (order == Qt::AscendingOrder ? "ASC" : "DESC"); + m_query.orderBy().emplace_back(column, (order == Qt::AscendingOrder ? sqlb::Ascending : sqlb::Descending)); // Set the new query (but only if a table has already been set - if(!m_sTable.isEmpty()) + if(!m_query.table().isEmpty()) buildQuery(); } +SqliteTableModel::Row SqliteTableModel::makeDefaultCacheEntry () const +{ + Row blank_data; + + for(int i=0; i < m_headers.size(); ++i) + blank_data.push_back(""); + + return blank_data; +} + +bool SqliteTableModel::readingData() const +{ + return worker->readingData(); +} + bool SqliteTableModel::insertRows(int row, int count, const QModelIndex& parent) { if(!isEditable()) return false; - QByteArrayList blank_data; - for(int i=0; i < m_headers.size(); ++i) - blank_data.push_back(""); + if(readingData()) { + // can't insert rows while reading data in background + return false; + } + + const auto blank_data = makeDefaultCacheEntry(); - DataType tempList; + std::vector tempList; for(int i=row; i < row + count; ++i) { - QString rowid = m_db.addRecord(m_sTable); + QString rowid = m_db.addRecord(m_query.table()); if(rowid.isNull()) { return false; } - m_rowCountAdjustment++; - tempList.append(blank_data); - tempList[i - row].replace(0, rowid.toUtf8()); + tempList.push_back(blank_data); + tempList.back().replace(0, rowid.toUtf8()); // update column with default values - QByteArrayList rowdata; - if(m_db.getRow(m_sTable, rowid, rowdata)) + Row rowdata; + if(m_db.getRow(m_query.table(), rowid, rowdata)) { for(int j=1; j < m_headers.size(); ++j) { - tempList[i - row].replace(j, rowdata[j - 1]); + tempList.back().replace(j, rowdata[j - 1]); } } } beginInsertRows(parent, row, row + count - 1); - QMutexLocker lock(&m_mutexDataCache); - for(int i = 0; i < tempList.size(); ++i) + for(unsigned int i = 0; i < tempList.size(); ++i) { - m_data.insert(i + row, tempList.at(i)); + m_cache.insert(i + row, std::move(tempList.at(i))); + m_currentRowCount++; } endInsertRows(); + return true; } @@ -485,25 +535,32 @@ if(!isEditable()) return false; - beginRemoveRows(parent, row, row + count - 1); - - QMutexLocker lock(&m_mutexDataCache); - - bool ok = true; + if(readingData()) { + // can't delete rows while reading data in background + return false; + } QStringList rowids; for(int i=count-1;i>=0;i--) { - rowids.append(m_data.at(row + i).at(0)); - m_data.removeAt(row + i); - --m_rowCountAdjustment; - } - if(!m_db.deleteRecords(m_sTable, rowids)) - { - ok = false; + if(m_cache.count(row+i)) { + rowids.append(m_cache.at(row + i).at(0)); + } } - endRemoveRows(); + bool ok = m_db.deleteRecords(m_query.table(), rowids, QString::fromStdString(m_query.rowIdColumn())); + + if (ok) { + beginRemoveRows(parent, row, row + count - 1); + + for(int i=count-1;i>=0;i--) + { + m_cache.erase(row + i); + m_currentRowCount--; + } + + endRemoveRows(); + } return ok; } @@ -518,11 +575,11 @@ int firstEditedColumn = 0; int new_row = rowCount() - 1; - sqlb::TablePtr t = m_db.getObjectByName(m_sTable).dynamicCast(); + sqlb::TablePtr t = m_db.getObjectByName(m_query.table()); - sqlb::FieldVector pk = t->primaryKey(); - for (int col = 0; col < t->fields().size(); ++col) { - if(!pk.contains(t->fields().at(col))) { + QStringList pk = t->primaryKey(); + for (size_t col = 0; col < t->fields.size(); ++col) { + if(!contains(pk, t->fields.at(col).name())) { if (!firstEditedColumn) firstEditedColumn = col + 1; @@ -534,124 +591,9 @@ return index(new_row, firstEditedColumn); } -void SqliteTableModel::fetchData(unsigned int from, unsigned to) -{ - // Finish previous loading - m_futureFetch.waitForFinished(); - - // Fetch more data using a separate thread - m_futureFetch = QtConcurrent::run([=]() { - int num_rows_before_insert = m_data.size(); - - QString sLimitQuery; - if(m_sQuery.startsWith("PRAGMA", Qt::CaseInsensitive) || m_sQuery.startsWith("EXPLAIN", Qt::CaseInsensitive)) - { - sLimitQuery = m_sQuery; - } else { - // Remove trailing trailing semicolon - QString queryTemp = rtrimChar(m_sQuery, ';'); - - // If the query ends with a LIMIT statement take it as it is, if not append our own LIMIT part for lazy population - if(queryTemp.contains(QRegExp("LIMIT\\s+.+\\s*((,|\\b(OFFSET)\\b)\\s*.+\\s*)?$", Qt::CaseInsensitive))) - sLimitQuery = queryTemp; - else - sLimitQuery = queryTemp + QString(" LIMIT %1, %2;").arg(from).arg(to-from); - } - m_db.logSQL(sLimitQuery, kLogMsg_App); - QByteArray utf8Query = sLimitQuery.toUtf8(); - sqlite3_stmt *stmt; - int status = sqlite3_prepare_v2(m_db._db, utf8Query, utf8Query.size(), &stmt, NULL); - - if(SQLITE_OK == status) - { - int num_columns = m_headers.size(); - while(!m_futureFetch.isCanceled() && sqlite3_step(stmt) == SQLITE_ROW) - { - QMutexLocker lock(&m_mutexDataCache); - QByteArrayList rowdata; - for(int i=0;i(sqlite3_column_blob(stmt, i)), bytes)); - else - rowdata.append(QByteArray("")); - } - } - m_data.push_back(rowdata); - } - } - sqlite3_finalize(stmt); - - if(m_data.size() > num_rows_before_insert) - { - beginInsertRows(QModelIndex(), num_rows_before_insert, m_data.size()-1); - endInsertRows(); - } - - emit finishedFetch(); - }); -} - -QString SqliteTableModel::customQuery(bool withRowid) -{ - QString where; - - if(m_mWhere.size()) - { - where = "WHERE "; - - for(QMap::const_iterator i=m_mWhere.constBegin();i!=m_mWhere.constEnd();++i) - { - QString columnId = sqlb::escapeIdentifier(m_headers.at(i.key())); - if(m_vDisplayFormat.size() && m_vDisplayFormat.at(i.key()-1) != columnId) - columnId = m_vDisplayFormat.at(i.key()-1); - where.append(QString("%1 %2 AND ").arg(columnId).arg(i.value())); - } - - // Remove last 'AND ' - where.chop(4); - } - - QString selector; - if (withRowid) - selector = sqlb::escapeIdentifier(m_headers.at(0)) + ","; - - if(m_vDisplayFormat.empty()) - { - selector += "*"; - } else { - QString columnId; - for(int i=0;i& fieldsTypes) +QStringList SqliteTableModel::getColumns(std::shared_ptr pDb, const QString& sQuery, QVector& fieldsTypes) { + if(!pDb) + pDb = m_db.get(tr("retrieving list of columns")); + sqlite3_stmt* stmt; QByteArray utf8Query = sQuery.toUtf8(); - int status = sqlite3_prepare_v2(m_db._db, utf8Query, utf8Query.size(), &stmt, NULL); + int status = sqlite3_prepare_v2(pDb.get(), utf8Query, utf8Query.size(), &stmt, nullptr); QStringList listColumns; if(SQLITE_OK == status) { @@ -730,7 +675,7 @@ int columns = sqlite3_data_count(stmt); for(int i = 0; i < columns; ++i) { - listColumns.append(QString::fromUtf8((const char*)sqlite3_column_name(stmt, i))); + listColumns.append(QString::fromUtf8(sqlite3_column_name(stmt, i))); fieldsTypes.push_back(sqlite3_column_type(stmt, i)); } } @@ -739,116 +684,27 @@ return listColumns; } -void SqliteTableModel::updateFilter(int column, const QString& value) +void SqliteTableModel::addCondFormat(int column, const CondFormat& condFormat) { - // Check for any special comparison operators at the beginning of the value string. If there are none default to LIKE. - QString op = "LIKE"; - QString val, val2; - QString escape; - bool numeric = false, ok = false; - - // range/BETWEEN operator - if (value.contains("~")) { - int sepIdx = value.indexOf('~'); - val = value.mid(0, sepIdx); - val2 = value.mid(sepIdx+1); - val.toFloat(&ok); - if (ok) { - val2.toFloat(&ok); - ok = ok && (val.toFloat() < val2.toFloat()); - } - } - if (ok) { - op = "BETWEEN"; - numeric = true; - } else { - val.clear(); - val2.clear(); - if(value.left(2) == ">=" || value.left(2) == "<=" || value.left(2) == "<>") - { - // Check if we're filtering for '<> NULL'. In this case we need a special comparison operator. - if(value.left(2) == "<>" && value.mid(2) == "NULL") - { - // We are filtering for '<>NULL'. Override the comparison operator to search for NULL values in this column. Also treat search value (NULL) as number, - // in order to avoid putting quotes around it. - op = "IS NOT"; - numeric = true; - val = "NULL"; - } else if(value.left(2) == "<>" && value.mid(2) == "''") { - // We are filtering for "<>''", i.e. for everything which is not an empty string - op = "<>"; - numeric = true; - val = "''"; - } else { - bool ok; - value.mid(2).toFloat(&ok); - if(ok) - { - op = value.left(2); - val = value.mid(2); - numeric = true; - } - } - } else if(value.left(1) == ">" || value.left(1) == "<") { - bool ok; - value.mid(1).toFloat(&ok); - if(ok) - { - op = value.left(1); - val = value.mid(1); - numeric = true; - } - } else if(value.left(1) == "=") { - val = value.mid(1); + m_mCondFormats[column].append(condFormat); + emit layoutChanged(); +} - // Check if value to compare with is 'NULL' - if(val != "NULL") - { - // It's not, so just compare normally to the value, whatever it is. - op = "="; - } else { - // It is NULL. Override the comparison operator to search for NULL values in this column. Also treat search value (NULL) as number, - // in order to avoid putting quotes around it. - op = "IS"; - numeric = true; - } - } else { - // Keep the default LIKE operator +void SqliteTableModel::setCondFormats(int column, const QVector& condFormats) +{ + m_mCondFormats[column] = condFormats; + emit layoutChanged(); +} - // Set the escape character if one has been specified in the settings dialog - QString escape_character = Settings::getValue("databrowser", "filter_escape").toString(); - if(escape_character == "'") escape_character = "''"; - if(escape_character.length()) - escape = QString("ESCAPE '%1'").arg(escape_character); - - // Add % wildcards at the start and at the beginning of the filter query, but only if there weren't set any - // wildcards manually. The idea is to assume that a user who's just typing characters expects the wildcards to - // be added but a user who adds them herself knows what she's doing and doesn't want us to mess up her query. - if(!value.contains("%")) - { - val = value; - val.prepend('%'); - val.append('%'); - } - } - } - if(val.isEmpty()) - val = value; +void SqliteTableModel::updateFilter(int column, const QString& value) +{ + QString whereClause = CondFormat::filterToSqlCondition(value, m_encoding); // If the value was set to an empty string remove any filter for this column. Otherwise insert a new filter rule or replace the old one if there is already one - if(val == "" || val == "%" || val == "%%") - m_mWhere.remove(column); - else { - // Quote and escape value, but only if it's not numeric and not the empty string sequence - if(!numeric && val != "''") - val = QString("'%1'").arg(val.replace("'", "''")); - - QString whereClause(op + " " + QString(encode(val.toUtf8()))); - if (!val2.isEmpty()) - whereClause += " AND " + QString(encode(val2.toUtf8())); - whereClause += " " + escape; - m_mWhere.insert(column, whereClause); - } + if(whereClause.isEmpty()) + m_query.where().erase(column); + else + m_query.where()[column] = whereClause.toStdString(); // Build the new query buildQuery(); @@ -856,43 +712,48 @@ void SqliteTableModel::clearCache() { - m_futureFetch.cancel(); - m_futureFetch.waitForFinished(); + m_lifeCounter++; - QMutexLocker lock(&m_mutexDataCache); - int size = m_data.size(); - if(size > 0) - { - lock.unlock(); + if(m_db.isOpen()) { + worker->cancel(); + worker->waitUntilIdle(); + } - beginRemoveRows(QModelIndex(), 0, size - 1); - { - QMutexLocker lock(&m_mutexDataCache); - m_data.clear(); - } + if(m_currentRowCount > 0) + { + beginRemoveRows(QModelIndex(), 0, m_currentRowCount - 1); endRemoveRows(); } + + m_cache.clear(); + m_currentRowCount = 0; + m_rowCountAvailable = RowCount::Unknown; } bool SqliteTableModel::isBinary(const QModelIndex& index) const { - return !isTextOnly(m_data.at(index.row()).at(index.column()), m_encoding, true); + QMutexLocker lock(&m_mutexDataCache); + return nosync_isBinary(index); +} + +bool SqliteTableModel::nosync_isBinary(const QModelIndex& index) const +{ + if(!m_cache.count(index.row())) + return false; + + const auto & cached_row = m_cache.at(index.row()); + + return !isTextOnly(cached_row.at(index.column()), m_encoding, true); } QByteArray SqliteTableModel::encode(const QByteArray& str) const { - if(m_encoding.isEmpty()) - return str; - else - return QTextCodec::codecForName(m_encoding.toUtf8())->fromUnicode(str); + return encodeString(str, m_encoding); } QByteArray SqliteTableModel::decode(const QByteArray& str) const { - if(m_encoding.isEmpty()) - return str; - else - return QTextCodec::codecForName(m_encoding.toUtf8())->toUnicode(str).toUtf8(); + return decodeString(str, m_encoding); } Qt::DropActions SqliteTableModel::supportedDropActions() const @@ -921,48 +782,96 @@ return false; } -void SqliteTableModel::setPseudoPk(const QString& pseudoPk) +void SqliteTableModel::setPseudoPk(QString pseudoPk) { + if(pseudoPk.isNull()) + pseudoPk = QString("_rowid_"); + // Do nothing if the value didn't change - if(m_pseudoPk == pseudoPk) + if(m_query.rowIdColumn() == pseudoPk.toStdString()) return; - if(pseudoPk.isEmpty()) - { - m_pseudoPk.clear(); - if(m_headers.size()) - m_headers[0] = m_sRowidColumn; - } else { - m_pseudoPk = pseudoPk; - if(m_headers.size()) - m_headers[0] = pseudoPk; - } + m_query.setRowIdColumn(pseudoPk.toStdString()); + if(m_headers.size()) + m_headers[0] = pseudoPk; buildQuery(); } +bool SqliteTableModel::hasPseudoPk() const +{ + return m_query.hasCustomRowIdColumn(); +} + bool SqliteTableModel::isEditable() const { - return !m_sTable.isEmpty() && (m_db.getObjectByName(m_sTable)->type() == sqlb::Object::Types::Table || !m_pseudoPk.isEmpty()); + return !m_query.table().isEmpty() && + m_db.isOpen() && + ((m_db.getObjectByName(m_query.table()) && m_db.getObjectByName(m_query.table())->type() == sqlb::Object::Types::Table) || m_query.hasCustomRowIdColumn()); +} + +void SqliteTableModel::triggerCacheLoad (int row) const +{ + size_t row_begin = std::max(0, row - int(m_chunkSize) / 2); + size_t row_end = row + m_chunkSize / 2; + + if(rowCountAvailable() == RowCount::Complete) { + row_end = std::min(row_end, size_t(rowCount())); + } else { + // will be truncated by reader + } + + // avoid re-fetching data + QMutexLocker lk(&m_mutexDataCache); + m_cache.smallestNonAvailableRange(row_begin, row_end); + + if(row_end != row_begin) + worker->triggerFetch(m_lifeCounter, row_begin, row_end); } -void SqliteTableModel::waitForFetchingFinished() +void SqliteTableModel::triggerCacheLoad (int row_begin, int row_end) const { - if(m_futureFetch.isRunning()) - m_futureFetch.waitForFinished(); + if(row_end == row_begin) + return; + + triggerCacheLoad((row_begin + row_end) / 2); } -void SqliteTableModel::cancelQuery() +bool SqliteTableModel::completeCache () const { - if(m_rowCount.isRunning()) + // Show progress dialog because fetching all data might take some time but only show + // cancel button if we allow cancellation here. This isn't + QProgressDialog progress(tr("Fetching data..."), + tr("Cancel"), 0, rowCount()); + progress.setWindowModality(Qt::ApplicationModal); + progress.show(); + + waitUntilIdle(); + + // This loop fetches all data by loading it block by block into the cache + for(int i=0;i(m_chunkSize)/2;i+=m_chunkSize) { - m_rowCount.cancel(); - m_rowCount = QtConcurrent::run([=]() { - // Make sure we report 0 rows if anybody asks - return 0; - }); + progress.setValue(i); + qApp->processEvents(); + if(progress.wasCanceled()) + return false; + + triggerCacheLoad(i); + worker->waitUntilIdle(); } - if(m_futureFetch.isRunning()) - m_futureFetch.cancel(); + return true; +} + +bool SqliteTableModel::isCacheComplete () const +{ + if(readingData()) + return false; + QMutexLocker lock(&m_mutexDataCache); + return m_cache.numSet() == m_currentRowCount; +} + +void SqliteTableModel::waitUntilIdle () const +{ + worker->waitUntilIdle(); } diff -Nru sqlitebrowser-3.10.100ubuntu1/src/sqlitetablemodel.h sqlitebrowser-3.11.1/src/sqlitetablemodel.h --- sqlitebrowser-3.10.100ubuntu1/src/sqlitetablemodel.h 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/src/sqlitetablemodel.h 2019-02-19 23:51:34.000000000 +0000 @@ -4,10 +4,15 @@ #include #include #include -#include - -#include "sqlitetypes.h" +#include +#include +#include + +#include "RowCache.h" +#include "CondFormat.h" +#include "sql/Query.h" +struct sqlite3; class DBBrowserDB; class SqliteTableModel : public QAbstractTableModel @@ -20,34 +25,72 @@ public: explicit SqliteTableModel(DBBrowserDB& db, QObject *parent = nullptr, size_t chunkSize = 50000, const QString& encoding = QString()); - ~SqliteTableModel(); + ~SqliteTableModel() override; + + /// reset to state after construction void reset(); - int rowCount(const QModelIndex &parent = QModelIndex()) const; - int totalRowCount() const; - int columnCount(const QModelIndex &parent = QModelIndex()) const; + /// returns logical amount of rows, whether currently cached or not + int rowCount(const QModelIndex &parent = QModelIndex()) const override; + + int columnCount(const QModelIndex &parent = QModelIndex()) const override; int filterCount() const; - QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const; - QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const; - bool setData(const QModelIndex& index, const QVariant& value, int role = Qt::EditRole); + QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override; + QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override; + bool setData(const QModelIndex& index, const QVariant& value, int role = Qt::EditRole) override; bool setTypedData(const QModelIndex& index, bool isBlob, const QVariant& value, int role = Qt::EditRole); - bool canFetchMore(const QModelIndex &parent = QModelIndex()) const; - void fetchMore(const QModelIndex &parent = QModelIndex()); - bool insertRows(int row, int count, const QModelIndex& parent = QModelIndex()); - bool removeRows(int row, int count, const QModelIndex& parent = QModelIndex()); + enum class RowCount + { + Unknown, //< still finding out in background... + Partial, //< some chunk was read and at least a lower bound is thus known + Complete //< total row count of table known + }; + + /// what kind of information is available through rowCount()? + RowCount rowCountAvailable () const; + + /// trigger asynchronous loading of (at least) the specified row + /// into cache. + void triggerCacheLoad (int single_row) const; + + /// trigger asynchronous loading of (at least) the specified rows + /// into cache. \param row_end is exclusive. + void triggerCacheLoad (int row_begin, int row_end) const; + + /// wait until not reading any data (that does not mean data is + /// complete, just that the background reader is idle) + void waitUntilIdle () const; + + /// load all rows into cache, return when done. Returns true if all data was loaded, false if the loading was cancelled. + bool completeCache() const; + + /// returns true if all rows are currently available in cache + /// [NOTE: potentially unsafe in case we have a limited-size + /// cache, where entries can vanish again -- however we can't do + /// this for the current implementation of the PlotDock] + bool isCacheComplete () const; + + bool insertRows(int row, int count, const QModelIndex& parent = QModelIndex()) override; + bool removeRows(int row, int count, const QModelIndex& parent = QModelIndex()) override; QModelIndex dittoRecord(int old_row); - void setQuery(const QString& sQuery, bool dontClearHeaders = false); + /// configure for browsing results of specified query + void setQuery(const QString& sQuery, const QString& sCountQuery = QString(), bool dontClearHeaders = false); + QString query() const { return m_sQuery; } - QString customQuery(bool withRowid); - void setTable(const sqlb::ObjectIdentifier& table, int sortColumn = 0, Qt::SortOrder sortOrder = Qt::AscendingOrder, const QVector &display_format = QVector()); + QString customQuery(bool withRowid) const { return QString::fromStdString(m_query.buildQuery(withRowid)); } + + /// configure for browsing specified table + void setQuery(const sqlb::Query& query); + void setChunkSize(size_t chunksize); - void sort(int column, Qt::SortOrder order = Qt::AscendingOrder); - const sqlb::ObjectIdentifier& currentTableName() const { return m_sTable; } + size_t chunkSize() { return m_chunkSize; }; + void sort(int column, Qt::SortOrder order = Qt::AscendingOrder) override; + sqlb::ObjectIdentifier currentTableName() const { return m_query.table(); } - Qt::ItemFlags flags(const QModelIndex& index) const; + Qt::ItemFlags flags(const QModelIndex& index) const override; bool isBinary(const QModelIndex& index) const; @@ -55,10 +98,9 @@ QString encoding() const { return m_encoding; } // The pseudo-primary key is exclusively for editing views - void setPseudoPk(const QString& pseudoPk); - QString pseudoPk() const { return m_pseudoPk; } - - typedef QVector QByteArrayList; + void setPseudoPk(QString pseudoPk); + bool hasPseudoPk() const; + QString pseudoPk() const { return QString::fromStdString(m_query.rowIdColumn()); } sqlb::ForeignKeyClause getForeignKeyClause(int column) const; @@ -70,50 +112,73 @@ // Helper function for removing all comments from a SQL query static void removeCommentsFromQuery(QString& query); - // Call this if you want to wait until the thread which is currently fetching more data is finished - void waitForFetchingFinished(); + void addCondFormat(int column, const CondFormat& condFormat); + void setCondFormats(int column, const QVector& condFormats); + + DBBrowserDB& db() { return m_db; }; public slots: void updateFilter(int column, const QString& value); - // This cancels the execution of the current query. It can't guarantee that the query is stopped immediately or after returning but it should - // stop soon afterwards. If some data has already been loaded into the model, that data is not deleted - void cancelQuery(); - signals: - void finishedFetch(); + void finishedFetch(int fetched_row_begin, int fetched_row_end); + void finishedRowCount(); protected: - virtual Qt::DropActions supportedDropActions() const; - virtual bool dropMimeData(const QMimeData* data, Qt::DropAction action, int row, int column, const QModelIndex& parent); + Qt::DropActions supportedDropActions() const override; + bool dropMimeData(const QMimeData* data, Qt::DropAction action, int row, int column, const QModelIndex& parent) override; private: - void fetchData(unsigned int from, unsigned to); + friend class RowLoader; + class RowLoader * worker; + + /// clears the cache, resets row-count to unknown (but keeps table + /// & query info), increase life_counter void clearCache(); + void handleFinishedFetch(int life_id, unsigned int fetched_row_begin, unsigned int fetched_row_end); + void handleRowCountComplete(int life_id, int num_rows); + void buildQuery(); - QStringList getColumns(const QString& sQuery, QVector& fieldsTypes); - int getQueryRowCount(); + + /// \param pDb connection to query; if null, obtains it from 'm_db'. + QStringList getColumns(std::shared_ptr pDb, const QString& sQuery, QVector& fieldsTypes); QByteArray encode(const QByteArray& str) const; QByteArray decode(const QByteArray& str) const; DBBrowserDB& m_db; - QFuture m_rowCount; - int m_rowCountAdjustment; // This needs to be added to the results of the m_rowCount future object to get the actual row count + + /// counts numbers of clearCache() since instantiation; using this + /// to avoid processing of queued signals originating in an era + /// before the most recent reset(). + int m_lifeCounter; + + /// note: the row count can be determined by the row-count query + /// (which yields the "final" row count"), or, if it is faster, by + /// the first chunk reading actual data (in which case the row + /// count will be set to that chunk's size and later updated to + /// the full row count, when the row-count query returns) + RowCount m_rowCountAvailable; + unsigned int m_currentRowCount; + QStringList m_headers; - typedef QList DataType; - DataType m_data; + + /// reading something in background right now? (either counting + /// rows or actually loading data, doesn't matter) + bool readingData() const; + + using Row = QVector; + mutable RowCache m_cache; + + Row makeDefaultCacheEntry () const; + + bool nosync_isBinary(const QModelIndex& index) const; QString m_sQuery; - sqlb::ObjectIdentifier m_sTable; - QString m_sRowidColumn; - QString m_pseudoPk; - int m_iSortColumn; - QString m_sSortOrder; - QMap m_mWhere; - QVector m_vDisplayFormat; QVector m_vDataTypes; + QMap> m_mCondFormats; + sqlb::Query m_query; /** * @brief m_chunkSize Size of the next chunk fetch more will try to fetch. @@ -130,7 +195,6 @@ /** * These are used for multi-threaded population of the table */ - mutable QFuture m_futureFetch; mutable QMutex m_mutexDataCache; }; diff -Nru sqlitebrowser-3.10.100ubuntu1/src/sqlitetypes.cpp sqlitebrowser-3.11.1/src/sqlitetypes.cpp --- sqlitebrowser-3.10.100ubuntu1/src/sqlitetypes.cpp 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/src/sqlitetypes.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,1488 +0,0 @@ -#include "sqlitetypes.h" -#include "grammar/Sqlite3Lexer.hpp" -#include "grammar/Sqlite3Parser.hpp" - -#include -#include -#include // This include seems to only be necessary for the Windows build -#include // This include seems to only be necessary for the Windows build - -namespace sqlb { - -QStringList Field::Datatypes = QStringList() << "INTEGER" << "TEXT" << "BLOB" << "REAL" << "NUMERIC"; - -QString escapeIdentifier(QString id) -{ - return '`' + id.replace('`', "``") + '`'; -} - -QStringList fieldVectorToFieldNames(const FieldVector& vector) -{ - QStringList result; - for(const FieldPtr& field : vector) - result.append(escapeIdentifier(field->name())); - return result; -} - -QDataStream& operator<<(QDataStream& ds, const ObjectIdentifier& objid) -{ - ds << objid.toVariant(); - return ds; -} - -QDataStream& operator>>(QDataStream& ds, ObjectIdentifier& objid) -{ - // Read in the item - QVariant v; - ds >> v; - - // If it is a string list, we can treat it as an object identifier. If it isn't, we assume it's just a - // single string and use interpret it as the table name in the main schema. This is done for backwards - // compatability with old project file formats. - if(v.toStringList().isEmpty()) - objid = sqlb::ObjectIdentifier("main", v.toString()); - else - objid = sqlb::ObjectIdentifier(v); - return ds; -} - -/** - * @brief The SetLocaleToC class - * This is a stupid helper class which sets the current locale as used by the C++ standard library to the C locale. - * Upon destruction it resets it to whatever the previous locale was. This is used to work around a problem in Antlr's - * string comparison which because it is case-independent relies on the current locale. However, when parsind SQL - * statements we don't want the locale to interfere here. Especially the Turkish locale is problematic here because - * of the dotted I problem. - */ -class SetLocaleToC -{ -public: - SetLocaleToC() - { - // Query current locale and save it - oldLocale = std::setlocale(LC_CTYPE, nullptr); - - // Set locale for standard library functions - std::setlocale(LC_CTYPE, "C.UTF-8"); - } - - ~SetLocaleToC() - { - // Reset old locale - std::setlocale(LC_CTYPE, oldLocale.c_str()); - } - -private: - std::string oldLocale; -}; - -/** - * @brief The CreateTableWalker class - * Goes trough the createtable AST and returns - * Table object. - */ -class CreateTableWalker -{ -public: - explicit CreateTableWalker(antlr::RefAST r) - : m_root(r) - {} - - TablePtr table(); - -private: - void parsecolumn(Table* table, antlr::RefAST c); - QString parseConflictClause(antlr::RefAST c); - -private: - antlr::RefAST m_root; -}; - -/** - * @brief The CreateIndexWalker class - * Goes trough the createtable AST and returns - * Index object. - */ -class CreateIndexWalker -{ -public: - explicit CreateIndexWalker(antlr::RefAST r) - : m_root(r) - {} - - IndexPtr index(); - -private: - void parsecolumn(Index* index, antlr::RefAST c); - -private: - antlr::RefAST m_root; -}; - -ObjectPtr Object::parseSQL(Object::Types type, const QString& sSQL) -{ - // Parse SQL statement according to type - ObjectPtr result; - switch(type) - { - case Object::Types::Table: - result = Table::parseSQL(sSQL); - break; - case Object::Types::Index: - result = Index::parseSQL(sSQL); - break; - case Object::Types::View: - result = View::parseSQL(sSQL); - break; - case Object::Types::Trigger: - result = Trigger::parseSQL(sSQL); - break; - default: - return ObjectPtr(nullptr); - } - - // Strore the original SQL statement and return the result - result->setOriginalSql(sSQL); - return result; -} - -QString Object::typeToString(Types type) -{ - switch(type) - { - case Types::Table: return "table"; - case Types::Index: return "index"; - case Types::View: return "view"; - case Types::Trigger: return "trigger"; - } - return QString(); -} - -bool ForeignKeyClause::isSet() const -{ - return m_override.size() || m_table.size(); -} - -QString ForeignKeyClause::toString() const -{ - if(!isSet()) - return QString(); - - if(m_override.size()) - return m_override; - - QString result = escapeIdentifier(m_table); - - if(m_columns.size()) - { - result += "("; - for(const QString& column : m_columns) - result += escapeIdentifier(column) + ','; - result.chop(1); // Remove last comma - result += ")"; - } - - if(m_constraint.size()) - result += " " + m_constraint; - - return result; -} - -void ForeignKeyClause::setFromString(const QString& fk) -{ - m_override = fk; -} - -QString ForeignKeyClause::toSql(const FieldVector& applyOn) const -{ - QString result; - if(!m_name.isNull()) - result += QString("CONSTRAINT %1 ").arg(escapeIdentifier(m_name)); - result += QString("FOREIGN KEY(%1) REFERENCES %2").arg(fieldVectorToFieldNames(applyOn).join(",")).arg(this->toString()); - - return result; -} - -QString UniqueConstraint::toSql(const FieldVector& applyOn) const -{ - QString result; - if(!m_name.isNull()) - result += QString("CONSTRAINT %1 ").arg(escapeIdentifier(m_name)); - result += QString("UNIQUE(%1)").arg(fieldVectorToFieldNames(applyOn).join(",")); - - return result; -} - -QString PrimaryKeyConstraint::toSql(const FieldVector& applyOn) const -{ - QString result; - if(!m_name.isNull()) - result += QString("CONSTRAINT %1 ").arg(escapeIdentifier(m_name)); - result += QString("PRIMARY KEY(%1)").arg(fieldVectorToFieldNames(applyOn).join(",")); - - if(!m_conflictAction.isEmpty()) - result += " ON CONFLICT " + m_conflictAction; - - return result; -} - -QString CheckConstraint::toSql(const FieldVector&) const -{ - QString result; - if(!m_name.isNull()) - result += QString("CONSTRAINT %1 ").arg(escapeIdentifier(m_name)); - result += QString("CHECK(%1)").arg(m_expression); - - return result; -} - -QString Field::toString(const QString& indent, const QString& sep) const -{ - QString str = indent + escapeIdentifier(m_name) + sep + m_type; - if(m_notnull) - str += " NOT NULL"; - if(!m_defaultvalue.isEmpty()) - str += QString(" DEFAULT %1").arg(m_defaultvalue); - if(!m_check.isEmpty()) - str += " CHECK(" + m_check + ")"; - if(m_autoincrement) - str += " PRIMARY KEY AUTOINCREMENT"; - if(m_unique) - str += " UNIQUE"; - if(!m_collation.isEmpty()) - str += " COLLATE " + m_collation; - return str; -} - -bool Field::isText() const -{ - QString norm = m_type.trimmed().toLower(); - - return norm.startsWith("character") - || norm.startsWith("varchar") - || norm.startsWith("varying character") - || norm.startsWith("nchar") - || norm.startsWith("native character") - || norm.startsWith("nvarchar") - || norm == "text" - || norm == "clob"; -} - -bool Field::isInteger() const -{ - QString norm = m_type.trimmed().toLower(); - - return norm == "int" - || norm == "integer" - || norm == "tinyint" - || norm == "smallint" - || norm == "mediumint" - || norm == "bigint" - || norm == "unsigned big int" - || norm == "int2" - || norm == "int8"; -} - -void Table::clear() -{ - m_rowidColumn = "_rowid_"; - m_fields.clear(); - m_constraints.clear(); - m_virtual = QString(); -} -Table::~Table() -{ - clear(); -} - -Table& Table::operator=(const Table& rhs) -{ - // Base class - Object::operator=(rhs); - - // Just assign the strings - m_rowidColumn = rhs.m_rowidColumn; - m_virtual = rhs.m_virtual; - - // Clear the fields and the constraints first in order to avoid duplicates and/or old data in the next step - m_fields.clear(); - m_constraints.clear(); - - // Make copies of the fields and the constraints. This is necessary in order to avoid any unwanted changes to the application's main database - // schema representation just modifying a reference to the fields or constraints and thinking it operates on a copy. - for(const FieldPtr& f : rhs.m_fields) - addField(FieldPtr(new Field(*f))); - for(auto it=rhs.m_constraints.constBegin();it!=rhs.m_constraints.constEnd();++it) // TODO This is so ugly, it should be replaced really by anything else - { - FieldVector key; - ConstraintPtr constraint; - for(const FieldPtr& f : it.key()) - key.push_back(m_fields.at(findField(f->name()))); - if(it.value()->type() == Constraint::ConstraintTypes::PrimaryKeyConstraintType) - constraint = ConstraintPtr(new PrimaryKeyConstraint(*(it.value().dynamicCast()))); - else if(it.value()->type() == Constraint::ConstraintTypes::UniqueConstraintType) - constraint = ConstraintPtr(new UniqueConstraint(*(it.value().dynamicCast()))); - else if(it.value()->type() == Constraint::ConstraintTypes::ForeignKeyConstraintType) - constraint = ConstraintPtr(new ForeignKeyClause(*(it.value().dynamicCast()))); - else if(it.value()->type() == Constraint::ConstraintTypes::CheckConstraintType) - constraint = ConstraintPtr(new CheckConstraint(*(it.value().dynamicCast()))); - else - qWarning() << "Unknown constraint type"; - addConstraint(key, constraint); - } - - return *this; -} - -void Table::addField(const FieldPtr& f) -{ - m_fields.append(FieldPtr(f)); -} - -bool Table::removeField(const QString& sFieldName) -{ - int index = findField(sFieldName); - if( index != -1) - { - m_fields.remove(index); - return true; - } - return false; -} - -void Table::setFields(const FieldVector &fields) -{ - clear(); - m_fields = fields; -} - -void Table::setField(int index, FieldPtr f) -{ - FieldPtr oldField = m_fields[index]; - m_fields[index] = f; - - // Update all constraints. If an existing field is updated but was used in a constraint, the pointers in the constraint key needs to be updated - // to the new field, too. - if(oldField) - { - ConstraintMap::iterator it = m_constraints.begin(); - while(it != m_constraints.end()) - { - // Loop through all fields mentioned in a foreign key - FieldVector fields = it.key(); - bool modified = false; - for(int i=0;iname().compare(sname, Qt::CaseInsensitive) == 0) - return i; - } - return -1; -} - -int Table::findPk() const -{ - // TODO This is a stupid function (and always was) which should be fixed/improved - - FieldVector pk = primaryKey(); - if(pk.empty()) - return -1; - else - return findField(pk.at(0)->name()); -} - -QStringList Table::fieldList() const -{ - QStringList sl; - - for(const FieldPtr& f : m_fields) - sl << f->toString(); - - return sl; -} - -QStringList Table::fieldNames() const -{ - QStringList sl; - - for(const FieldPtr& f : m_fields) - sl << f->name(); - - return sl; -} - -FieldInfoList Table::fieldInformation() const -{ - FieldInfoList result; - for(const FieldPtr& f : m_fields) - result.append({f->name(), f->type(), f->toString(" ", " ")}); - return result; -} - -bool Table::hasAutoIncrement() const -{ - for(const FieldPtr& f : m_fields) { - if(f->autoIncrement()) - return true; - } - return false; -} - -ObjectPtr Table::parseSQL(const QString &sSQL) -{ - SetLocaleToC locale; - - std::stringstream s; - s << sSQL.toStdString(); - Sqlite3Lexer lex(s); - - Sqlite3Parser parser(lex); - - antlr::ASTFactory ast_factory; - parser.initializeASTFactory(ast_factory); - parser.setASTFactory(&ast_factory); - - try - { - parser.createtable(); - CreateTableWalker ctw(parser.getAST()); - - return ctw.table(); - } - catch(antlr::ANTLRException& ex) - { - qCritical() << "Sqlite parse error: " << QString::fromStdString(ex.toString()) << "(" << sSQL << ")"; - } - catch(...) - { - qCritical() << "Sqlite parse error: " << sSQL; //TODO - } - - return TablePtr(new Table("")); -} - -QString Table::sql(const QString& schema, bool ifNotExists) const -{ - // Special handling for virtual tables: just build an easy create statement and copy the using part in there - if(isVirtual()) - return QString("CREATE VIRTUAL TABLE %1 USING %2;").arg(ObjectIdentifier(schema, m_name).toString(true)).arg(m_virtual); - - // This is a normal table, not a virtual one - QString sql = QString("CREATE TABLE%1 %2 (\n") - .arg(ifNotExists ? QString(" IF NOT EXISTS") : QString("")) - .arg(ObjectIdentifier(schema, m_name).toString(true)); - - sql += fieldList().join(",\n"); - - // Constraints - ConstraintMap::const_iterator it = m_constraints.constBegin(); - bool autoincrement = hasAutoIncrement(); - while(it != m_constraints.constEnd()) - { - // Ignore auto increment primary key constraint - if((!autoincrement || it.value()->type() != Constraint::PrimaryKeyConstraintType)) - { - // Ignore all constraints without any fields, except for check constraints which don't rely on a field vector - if(!(it.key().isEmpty() && it.value()->type() != Constraint::CheckConstraintType)) - { - sql += QString(",\n\t"); - sql += it.value()->toSql(it.key()); - } - } - ++it; - } - - sql += "\n)"; - - // without rowid - if(isWithoutRowidTable()) - sql += " WITHOUT ROWID"; - - return sql + ";"; -} - -void Table::addConstraint(FieldVector fields, ConstraintPtr constraint) -{ - m_constraints.insert(fields, constraint); -} - -void Table::setConstraint(FieldVector fields, ConstraintPtr constraint) -{ - // Delete any old constraints of this type for these fields - removeConstraints(fields, constraint->type()); - - // Add the new constraint to the table, effectively overwriting all old constraints for that fields/type combination - addConstraint(fields, constraint); -} - -void Table::removeConstraints(FieldVector fields, Constraint::ConstraintTypes type) -{ - QList list = constraints(fields, type); - - for (ConstraintPtr c : list) { - m_constraints.remove(fields, c); - } -} - -ConstraintPtr Table::constraint(FieldVector fields, Constraint::ConstraintTypes type) const -{ - QList list = constraints(fields, type); - if(list.size()) - return list.at(0); - else - return ConstraintPtr(nullptr); -} - -QList Table::constraints(FieldVector fields, Constraint::ConstraintTypes type) const -{ - QList clist; - if(fields.isEmpty()) - clist = m_constraints.values(); - else - clist = m_constraints.values(fields); - - if(type == Constraint::NoType) - { - return clist; - } else { - QList clist_typed; - for(const ConstraintPtr& ptr : clist) - { - if(ptr->type() == type) - clist_typed.push_back(ptr); - } - return clist_typed; - } -} - -void Table::setConstraints(const ConstraintMap& constraints) -{ - m_constraints = constraints; -} - -FieldVector& Table::primaryKeyRef() -{ - return const_cast(static_cast(this)->primaryKey()); -} - -const FieldVector& Table::primaryKey() const -{ - auto it = m_constraints.constBegin(); - while(it != m_constraints.constEnd()) - { - if(it.value()->type() == Constraint::PrimaryKeyConstraintType) - return it.key(); - ++it; - } - - static FieldVector emptyFieldVector; - return emptyFieldVector; -} - -namespace -{ -QString identifier(antlr::RefAST ident) -{ - QString sident = ident->getText().c_str(); - if(ident->getType() == sqlite3TokenTypes::QUOTEDID || - ident->getType() == Sqlite3Lexer::QUOTEDLITERAL || - ident->getType() == sqlite3TokenTypes::STRINGLITERAL) - { - // Remember the way the identifier is quoted - QChar quoteChar = sident.at(0); - - // Remove first and final character, i.e. the quotes - sident.remove(0, 1); - sident.chop(1); - - // Replace all remaining occurences of two succeeding quote characters and replace them - // by a single instance. This is done because two quotes can be used as a means of escaping - // the quote character, thus only the visual representation has its two quotes, the actual - // name contains only one. - sident.replace(QString(quoteChar) + quoteChar, quoteChar); - } - - return sident; -} - -QString textAST(antlr::RefAST t) -{ - // When this is called for a KEYWORDASTABLENAME token, we must take the child's content to get the actual value - // instead of 'KEYWORDASTABLENAME' as a string. The same applies for KEYWORDASCOLUMNNAME tokens. - if(t != antlr::nullAST && (t->getType() == sqlite3TokenTypes::KEYWORDASTABLENAME || t->getType() == sqlite3TokenTypes::KEYWORDASCOLUMNNAME)) - return t->getFirstChild()->getText().c_str(); - else - return t->getText().c_str(); -} - -QString concatTextAST(antlr::RefAST t, bool withspace = false) -{ - QStringList stext; - while(t != antlr::nullAST) - { - stext.append(textAST(t)); - t = t->getNextSibling(); - } - return stext.join(withspace ? " " : ""); -} -} - -namespace { -QString tablename(const antlr::RefAST& n) -{ - if(n->getType() == sqlite3TokenTypes::KEYWORDASTABLENAME) - return concatTextAST(n->getFirstChild()); - else - return identifier(n); -} -QString columnname(const antlr::RefAST& n) -{ - if(n->getType() == sqlite3TokenTypes::KEYWORDASCOLUMNNAME) - return concatTextAST(n->getFirstChild()); - else if(n->getType() == sqlite3TokenTypes::INDEXEDCOLUMN) - return columnname(n->getFirstChild()); - else - return identifier(n); -} -} - -TablePtr CreateTableWalker::table() -{ - Table* tab = new Table(""); - tab->setFullyParsed(true); - - if( m_root ) //CREATE TABLE - { - antlr::RefAST s = m_root->getFirstChild(); - - // If the primary tree isn't filled, this isn't a normal CREATE TABLE statement. Switch to the next alternative tree. - if(s == 0) - s = m_root->getNextSibling(); - - // Skip to table name - bool is_virtual_table = false; - while(s->getType() != Sqlite3Lexer::ID && - s->getType() != Sqlite3Lexer::QUOTEDID && - s->getType() != Sqlite3Lexer::QUOTEDLITERAL && - s->getType() != Sqlite3Lexer::STRINGLITERAL && - s->getType() != sqlite3TokenTypes::KEYWORDASTABLENAME) - { - // Is this one of these virtual tables? - if(s->getType() == Sqlite3Lexer::VIRTUAL) - is_virtual_table = true; - - s = s->getNextSibling(); - } - - // Extract and set table name - tab->setName(tablename(s)); - - // Special handling for virtual tables. If this is a virtual table, extract the USING part and skip all the - // rest of this function because virtual tables don't have column definitons - if(is_virtual_table) - { - s = s->getNextSibling(); // USING - s = s->getNextSibling(); // module name - tab->setVirtualUsing(concatTextAST(s, true)); - tab->setFullyParsed(false); - - return TablePtr(tab); - } - - // This is a normal table, not a virtual one - s = s->getNextSibling(); // LPAREN - s = s->getNextSibling(); // first column name - antlr::RefAST column = s; - // loop columndefs - while(column != antlr::nullAST && column->getType() == sqlite3TokenTypes::COLUMNDEF) - { - parsecolumn(tab, column->getFirstChild()); - column = column->getNextSibling(); //COMMA or RPAREN - column = column->getNextSibling(); //null or tableconstraint - - s = s->getNextSibling(); // COLUMNDEF - s = s->getNextSibling(); // COMMA or RPAREN - } - - // now we are finished or it is a tableconstraint - while(s != antlr::nullAST) - { - // Is this a 'without rowid' definiton? - if(s->getType() != sqlite3TokenTypes::WITHOUT) - { - // It's not, so treat this as table constraints - - antlr::RefAST tc = s->getFirstChild(); - - // Extract constraint name, if there is any - QString constraint_name; - if(tc->getType() == sqlite3TokenTypes::CONSTRAINT) - { - tc = tc->getNextSibling(); // CONSTRAINT - constraint_name = identifier(tc); - tc = tc->getNextSibling(); // identifier - } - - switch(tc->getType()) - { - case sqlite3TokenTypes::PRIMARY: - { - PrimaryKeyConstraint* pk = new PrimaryKeyConstraint; - pk->setName(constraint_name); - - tc = tc->getNextSibling()->getNextSibling(); // skip primary and key - tc = tc->getNextSibling(); // skip LPAREN - - FieldVector fields; - do - { - antlr::RefAST indexed_column = tc->getFirstChild(); - - QString col = columnname(indexed_column); - FieldPtr field = tab->field(tab->findField(col)); - fields.push_back(field); - - indexed_column = indexed_column->getNextSibling(); - if(indexed_column != antlr::nullAST - && (indexed_column->getType() == sqlite3TokenTypes::ASC - || indexed_column->getType() == sqlite3TokenTypes::DESC)) - { - // TODO save ASC / DESC information? - tab->setFullyParsed(false); - indexed_column = indexed_column->getNextSibling(); - } - - if(indexed_column != antlr::nullAST && indexed_column->getType() == sqlite3TokenTypes::COLLATE) - { - indexed_column = indexed_column->getNextSibling(); // COLLATE - // TODO save collation name - tab->setFullyParsed(false); - indexed_column = indexed_column->getNextSibling(); // collation name - } - - if(indexed_column != antlr::nullAST && indexed_column->getType() == sqlite3TokenTypes::AUTOINCREMENT) - { - field->setAutoIncrement(true); - indexed_column = indexed_column->getNextSibling(); - } - - tc = tc->getNextSibling(); // indexed column - - while(tc != antlr::nullAST && tc->getType() == sqlite3TokenTypes::COMMA) - { - tc = tc->getNextSibling(); // skip ident and comma - } - } while(tc != antlr::nullAST && tc->getType() != sqlite3TokenTypes::RPAREN); - - // We're either done now or there is a conflict clause - tc = tc->getNextSibling(); // skip RPAREN - pk->setConflictAction(parseConflictClause(tc)); - - tab->addConstraint(fields, ConstraintPtr(pk)); - } - break; - case sqlite3TokenTypes::UNIQUE: - { - UniqueConstraint* unique = new UniqueConstraint; - unique->setName(constraint_name); - - tc = tc->getNextSibling(); // skip UNIQUE - tc = tc->getNextSibling(); // skip LPAREN - FieldVector fields; - do - { - antlr::RefAST indexed_column = tc->getFirstChild(); - - QString col = columnname(indexed_column); - FieldPtr field = tab->field(tab->findField(col)); - fields.push_back(field); - - indexed_column = indexed_column->getNextSibling(); - if(indexed_column != antlr::nullAST - && (indexed_column->getType() == sqlite3TokenTypes::ASC - || indexed_column->getType() == sqlite3TokenTypes::DESC)) - { - // TODO save ASC / DESC information? - tab->setFullyParsed(false); - indexed_column = indexed_column->getNextSibling(); - } - - if(indexed_column != antlr::nullAST && indexed_column->getType() == sqlite3TokenTypes::COLLATE) - { - indexed_column = indexed_column->getNextSibling(); // COLLATE - // TODO save collation name - tab->setFullyParsed(false); - indexed_column = indexed_column->getNextSibling(); // collation name - } - - tc = tc->getNextSibling(); // indexed column - - while(tc != antlr::nullAST && tc->getType() == sqlite3TokenTypes::COMMA) - { - tc = tc->getNextSibling(); // skip ident and comma - } - } while(tc != antlr::nullAST && tc->getType() != sqlite3TokenTypes::RPAREN); - - if(fields.size() == 1 && constraint_name.isEmpty()) - { - fields[0]->setUnique(true); - delete unique; - } else { - tab->addConstraint(fields, ConstraintPtr(unique)); - } - } - break; - case sqlite3TokenTypes::FOREIGN: - { - ForeignKeyClause* fk = new ForeignKeyClause; - fk->setName(constraint_name); - - tc = tc->getNextSibling(); // FOREIGN - tc = tc->getNextSibling(); // KEY - tc = tc->getNextSibling(); // LPAREN - - FieldVector fields; - do - { - QString col = columnname(tc); - FieldPtr field = tab->field(tab->findField(col)); - fields.push_back(field); - - tc = tc->getNextSibling(); - - while(tc != antlr::nullAST && tc->getType() == sqlite3TokenTypes::COMMA) - tc = tc->getNextSibling(); // skip ident and comma - } while(tc != antlr::nullAST && tc->getType() != sqlite3TokenTypes::RPAREN); - - tc = tc->getNextSibling(); - tc = tc->getNextSibling(); // REFERENCES - - fk->setTable(identifier(tc)); - tc = tc->getNextSibling(); // identifier - - if(tc != antlr::nullAST && tc->getType() == sqlite3TokenTypes::LPAREN) - { - tc = tc->getNextSibling(); // LPAREN - - QStringList fk_cols; - while(tc != antlr::nullAST && tc->getType() != sqlite3TokenTypes::RPAREN) - { - if(tc->getType() != sqlite3TokenTypes::COMMA) - fk_cols.push_back(identifier(tc)); - tc = tc->getNextSibling(); - } - fk->setColumns(fk_cols); - - tc = tc->getNextSibling(); // RPAREN - } - - fk->setConstraint(concatTextAST(tc, true)); - tab->addConstraint(fields, ConstraintPtr(fk)); - } - break; - case sqlite3TokenTypes::CHECK: - { - CheckConstraint* check = new CheckConstraint; - check->setName(constraint_name); - - tc = tc->getNextSibling(); // skip CHECK - tc = tc->getNextSibling(); // skip LPAREN - - int num_paren = 1; - QString expr; - while(tc) - { - if(tc->getType() == sqlite3TokenTypes::LPAREN) - num_paren++; - else if(tc->getType() == sqlite3TokenTypes::RPAREN) - num_paren--; - - if(num_paren == 0) - break; - - expr.append(textAST(tc)); - - tc = tc->getNextSibling(); - } - - check->setExpression(expr); - tab->addConstraint(FieldVector(), ConstraintPtr(check)); - } - break; - default: - { - qWarning() << "unknown table constraint in " << tab->name(); - tab->setFullyParsed(false); - } - break; - } - - s = s->getNextSibling(); //COMMA or RPAREN - if(s->getType() == sqlite3TokenTypes::COMMA || s->getType() == sqlite3TokenTypes::RPAREN) - s = s->getNextSibling(); - } else { - // It is - - s = s->getNextSibling(); // WITHOUT - s = s->getNextSibling(); // ROWID - - tab->setRowidColumn(tab->fields().at(tab->findPk())->name()); - } - } - } - - return TablePtr(tab); -} - -void CreateTableWalker::parsecolumn(Table* table, antlr::RefAST c) -{ - QString colname; - QString type = "TEXT"; - bool autoincrement = false; - bool notnull = false; - bool unique = false; - QString defaultvalue; - QString check; - QString collation; - sqlb::PrimaryKeyConstraint* primaryKey = nullptr; - QVector foreignKeys; - - colname = columnname(c); - c = c->getNextSibling(); //type? - if(c != antlr::nullAST && c->getType() == sqlite3TokenTypes::TYPE_NAME) - { - antlr::RefAST t = c->getFirstChild(); - - if(t != antlr::nullAST) - { - type.clear(); - } - - while(t != antlr::nullAST) - { - int thisType = t->getType(); - type.append(textAST(t)); - t = t->getNextSibling(); - if(t != antlr::nullAST) - { - int nextType = t->getType(); - if(nextType != sqlite3TokenTypes::LPAREN && nextType != sqlite3TokenTypes::RPAREN && - thisType != sqlite3TokenTypes::LPAREN) - { - type.append(" "); - } - } - } - c = c->getNextSibling(); - } - - // finished with type parsing - // now columnconstraints - while(c != antlr::nullAST) - { - antlr::RefAST con = c->getFirstChild(); - - // Extract constraint name, if there is any - QString constraint_name; - if(con->getType() == sqlite3TokenTypes::CONSTRAINT) - { - con = con->getNextSibling(); // CONSTRAINT - constraint_name = identifier(con); - con = con->getNextSibling(); // identifier - } - - switch(con->getType()) - { - case sqlite3TokenTypes::PRIMARY: - { - // If we have already allocated a primary key object, delete it first. This should never happen in real world situations because - // SQLite only supports one primary key constraint per field. - if(primaryKey) - delete primaryKey; - - primaryKey = new PrimaryKeyConstraint; - primaryKey->setName(constraint_name); - - con = con->getNextSibling()->getNextSibling(); // skip KEY - if(con != antlr::nullAST && (con->getType() == sqlite3TokenTypes::ASC - || con->getType() == sqlite3TokenTypes::DESC)) - { - table->setFullyParsed(false); - con = con->getNextSibling(); //skip - } - - primaryKey->setConflictAction(parseConflictClause(con)); - - if(con != antlr::nullAST && con->getType() == sqlite3TokenTypes::AUTOINCREMENT) - autoincrement = true; - } - break; - case sqlite3TokenTypes::NOT: - { - // TODO Support constraint names here - if(!constraint_name.isEmpty()) - table->setFullyParsed(false); - - notnull = true; - } - break; - case sqlite3TokenTypes::NULL_T: - { - notnull = false; - } - break; - case sqlite3TokenTypes::CHECK: - { - // TODO Support constraint names here - if(!constraint_name.isEmpty()) - table->setFullyParsed(false); - - con = con->getNextSibling(); //LPAREN - check = concatTextAST(con, true); - // remove parenthesis - check.remove(check.length()-1, 1); - check.remove(0,1); - check = check.trimmed(); - } - break; - case sqlite3TokenTypes::DEFAULT: - { - // TODO Support constraint names here - if(!constraint_name.isEmpty()) - table->setFullyParsed(false); - - con = con->getNextSibling(); //SIGNEDNUMBER,STRING,LPAREN - defaultvalue = concatTextAST(con); - } - break; - case sqlite3TokenTypes::UNIQUE: - { - // TODO Support constraint names here - if(!constraint_name.isEmpty()) - table->setFullyParsed(false); - - unique = true; - } - break; - case sqlite3TokenTypes::REFERENCES: - { - con = con->getNextSibling(); // REFERENCES - - sqlb::ForeignKeyClause* foreignKey = new ForeignKeyClause; - foreignKey->setTable(identifier(con)); - foreignKey->setName(constraint_name); - con = con->getNextSibling(); // identifier - - if(con != antlr::nullAST && con->getType() == sqlite3TokenTypes::LPAREN) - { - con = con->getNextSibling(); // LPAREN - - QStringList fk_cols; - while(con != antlr::nullAST && con->getType() != sqlite3TokenTypes::RPAREN) - { - if(con->getType() != sqlite3TokenTypes::COMMA) - fk_cols.push_back(identifier(con)); - con = con->getNextSibling(); - } - foreignKey->setColumns(fk_cols); - - con = con->getNextSibling(); // RPAREN - } - - foreignKey->setConstraint(concatTextAST(con, true)); - foreignKeys.push_back(foreignKey); - } - break; - case sqlite3TokenTypes::COLLATE: - { - con = con->getNextSibling(); // COLLATE - collation = identifier(con); - con = con->getNextSibling(); // collation name - } - break; - default: - { - qWarning() << "unknown column constraint in " << table->name() << "." << colname; - table->setFullyParsed(false); - } - break; - } - c = c->getNextSibling(); - } - - FieldPtr f = FieldPtr(new Field(colname, type, notnull, defaultvalue, check, unique, collation)); - f->setAutoIncrement(autoincrement); - table->addField(f); - - for(sqlb::ForeignKeyClause* fk : foreignKeys) - table->addConstraint({f}, ConstraintPtr(fk)); - if(primaryKey) - { - FieldVector v; - if(table->constraint(v, Constraint::PrimaryKeyConstraintType)) - { - table->primaryKeyRef().push_back(f); - - // Delete useless primary key constraint. There already is a primary key object for this table, we - // don't need another one. - delete primaryKey; - } else { - table->addConstraint({f}, ConstraintPtr(primaryKey)); - } - } -} - -QString CreateTableWalker::parseConflictClause(antlr::RefAST c) -{ - QString conflictAction; - - if(c != antlr::nullAST && c->getType() == sqlite3TokenTypes::ON && c->getNextSibling()->getType() == sqlite3TokenTypes::CONFLICT) - { - c = c->getNextSibling(); // skip ON - c = c->getNextSibling(); // skip CONFLICT - conflictAction = identifier(c); - c = c->getNextSibling(); // skip action - } - - return conflictAction; -} - - - -QString IndexedColumn::toString(const QString& indent, const QString& sep) const -{ - QString name = m_isExpression ? m_name : escapeIdentifier(m_name); - QString order = (m_order.isEmpty() ? "" : (sep + m_order)); - return indent + name + order; -} - -Index::~Index() -{ - clear(); -} - -Index& Index::operator=(const Index& rhs) -{ - // Base class - Object::operator=(rhs); - - // Just assign the easy stuff - m_unique = rhs.m_unique; - m_table = rhs.m_table; - m_whereExpr = rhs.m_whereExpr; - - // Make copies of the column - for(const IndexedColumnPtr& c : rhs.m_columns) - addColumn(IndexedColumnPtr(new IndexedColumn(*c))); - - return *this; -} - -void Index::clear() -{ - m_name.clear(); - m_unique = false; - m_table.clear(); - m_whereExpr.clear(); - m_columns.clear(); -} - -bool Index::removeColumn(const QString& name) -{ - int index = findColumn(name); - if(index != -1) - { - m_columns.remove(index); - return true; - } - return false; -} - -void Index::setColumns(const IndexedColumnVector& columns) -{ - m_columns = columns; -} - -int Index::findColumn(const QString& name) const -{ - for(int i=0;iname().compare(name, Qt::CaseInsensitive) == 0) - return i; - } - return -1; -} - -QStringList Index::columnSqlList() const -{ - QStringList sl; - - for(const IndexedColumnPtr& c : m_columns) - sl << c->toString(); - - return sl; -} - -QString Index::sql(const QString& schema, bool ifNotExists) const -{ - // Start CREATE (UNIQUE) INDEX statement - QString sql = QString("CREATE %1INDEX%2 %3 ON %4 (\n") - .arg(m_unique ? QString("UNIQUE ") : QString("")) - .arg(ifNotExists ? QString(" IF NOT EXISTS") : QString("")) - .arg(ObjectIdentifier(schema, m_name).toString(true)) - .arg(sqlb::escapeIdentifier(m_table)); - - // Add column list - sql += columnSqlList().join(",\n"); - - // Add partial index bit - sql += QString("\n)"); - if(!m_whereExpr.isEmpty()) - sql += QString(" WHERE ") + m_whereExpr; - - return sql + ";"; -} - -FieldInfoList Index::fieldInformation() const -{ - FieldInfoList result; - for(const IndexedColumnPtr& c : m_columns) - result.append({c->name(), c->order(), c->toString(" ", " ")}); - return result; -} - -ObjectPtr Index::parseSQL(const QString& sSQL) -{ - SetLocaleToC locale; - - std::stringstream s; - s << sSQL.toStdString(); - Sqlite3Lexer lex(s); - - Sqlite3Parser parser(lex); - - antlr::ASTFactory ast_factory; - parser.initializeASTFactory(ast_factory); - parser.setASTFactory(&ast_factory); - - try - { - parser.createindex(); - CreateIndexWalker ctw(parser.getAST()); - - return ctw.index(); - } - catch(antlr::ANTLRException& ex) - { - qCritical() << "Sqlite parse error: " << QString::fromStdString(ex.toString()) << "(" << sSQL << ")"; - } - catch(...) - { - qCritical() << "Sqlite parse error: " << sSQL; //TODO - } - - return IndexPtr(new Index("")); -} - -IndexPtr CreateIndexWalker::index() -{ - Index* index = new Index(""); - index->setFullyParsed(true); - - if(m_root) // CREATE INDEX - { - antlr::RefAST s = m_root->getFirstChild(); - - // Skip to index name - while(s->getType() != Sqlite3Lexer::ID && - s->getType() != Sqlite3Lexer::QUOTEDID && - s->getType() != Sqlite3Lexer::QUOTEDLITERAL && - s->getType() != Sqlite3Lexer::STRINGLITERAL && - s->getType() != sqlite3TokenTypes::KEYWORDASTABLENAME) - { - // Is this a unique index? - if(s->getType() == Sqlite3Lexer::UNIQUE) - index->setUnique(true); - - s = s->getNextSibling(); - } - - // Extract and set index name - index->setName(tablename(s)); - - // Get table name - s = s->getNextSibling(); // ON - s = s->getNextSibling(); // table name - index->setTable(tablename(s)); - - s = s->getNextSibling(); // LPAREN - s = s->getNextSibling(); // first column name - antlr::RefAST column = s; - // loop columndefs - while(column != antlr::nullAST && column->getType() == sqlite3TokenTypes::INDEXEDCOLUMN) - { - parsecolumn(index, column->getFirstChild()); - column = column->getNextSibling(); // COMMA or RPAREN - column = column->getNextSibling(); // null or WHERE - - s = s->getNextSibling(); // COLUMNDEF - s = s->getNextSibling(); // COMMA or RPAREN - } - - // Now we are finished or it is a partial index - if(s != antlr::nullAST) - { - // This should be a 'where' then - if(s->getType() != sqlite3TokenTypes::WHERE) - { - // It is something else - index->setFullyParsed(false); - } else { - s = s->getNextSibling(); // expr - index->setWhereExpr(concatTextAST(s, true)); - } - } - } - - return IndexPtr(index); -} - -void CreateIndexWalker::parsecolumn(Index* index, antlr::RefAST c) -{ - QString name; - bool isExpression; - QString order; - - // First count the number of nodes used for the name or the expression. We reach the end of the name nodes list when we either - // get to the end of the list, get to a COMMA or a RPAREN, or get to the COLLATE keyword or get to the ASC/DESC keywords. - // Then see how many items there are: if it's one it's a normal index column with only a column name. In this case get the identifier. - // If it's more than one item it's an expression. In this case get all the items as they are. - int number_of_name_items = 0; - antlr::RefAST n = c; - while(n != antlr::nullAST - && n->getType() != sqlite3TokenTypes::COLLATE - && n->getType() != sqlite3TokenTypes::ASC - && n->getType() != sqlite3TokenTypes::DESC - && n->getType() != sqlite3TokenTypes::COMMA - && n->getType() != sqlite3TokenTypes::RPAREN) - { - number_of_name_items++; - n = n->getNextSibling(); - } - if(number_of_name_items == 1) - { - name = identifier(c); - isExpression = false; - c = c->getNextSibling(); - } else { - for(int i=0;igetText().c_str() + QString(" "); - c = c->getNextSibling(); - } - name.chop(1); - isExpression = true; - } - - // Parse the rest of the column definition - while(c != antlr::nullAST) - { - switch(c->getType()) - { - case sqlite3TokenTypes::ASC: - case sqlite3TokenTypes::DESC: - order = c->getText().c_str(); - break; - default: - // TODO Add support for COLLATE - index->setFullyParsed(false); - } - - c = c->getNextSibling(); - } - - index->addColumn(IndexedColumnPtr(new IndexedColumn(name, isExpression, order))); -} - - - -View::~View() -{ - clear(); -} - -ObjectPtr View::parseSQL(const QString& /*sSQL*/) -{ - // TODO - - return ViewPtr(new View("")); -} - -void View::clear() -{ - m_fields.clear(); -} - -void View::addField(const FieldPtr& f) -{ - m_fields.append(FieldPtr(f)); -} - -void View::setFields(const FieldVector& fields) -{ - clear(); - m_fields = fields; -} - -QStringList View::fieldNames() const -{ - QStringList sl; - - for(const FieldPtr& f : m_fields) - sl << f->name(); - - return sl; -} - -FieldInfoList View::fieldInformation() const -{ - FieldInfoList result; - for(const FieldPtr& f : m_fields) - result.append({f->name(), f->type(), f->toString(" ", " ")}); - return result; -} - - - -ObjectPtr Trigger::parseSQL(const QString& /*sSQL*/) -{ - // TODO - - return TriggerPtr(new Trigger("")); -} - -} //namespace sqlb diff -Nru sqlitebrowser-3.10.100ubuntu1/src/sqlitetypes.h sqlitebrowser-3.11.1/src/sqlitetypes.h --- sqlitebrowser-3.10.100ubuntu1/src/sqlitetypes.h 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/src/sqlitetypes.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,560 +0,0 @@ -#pragma once -#ifndef SQLITETYPES_H -#define SQLITETYPES_H - -#include -#include -#include -#include -#include -#include - -namespace sqlb { - -#if QT_VERSION < QT_VERSION_CHECK(5, 6, 0) -template -uint qHash(const QVector& key, uint seed = 0) - Q_DECL_NOEXCEPT_EXPR(noexcept(qHashRange(key.cbegin(), key.cend(), seed))) -{ - return qHashRange(key.cbegin(), key.cend(), seed); -} -#endif - -QString escapeIdentifier(QString id); - -class ObjectIdentifier -{ -public: - ObjectIdentifier(const QString& schema, const QString& name) - : m_schema(schema), - m_name(name) - { - } - - ObjectIdentifier() - : m_schema("main"), - m_name(QString()) - { - } - - explicit ObjectIdentifier(QVariant variant) - { - QStringList str = variant.toStringList(); - if(str.size()) - { - m_schema = str.first(); - if(str.size() >= 2) - m_name = str.last(); - } - } - - bool operator==(const ObjectIdentifier& rhs) const - { - return (rhs.m_schema == m_schema && rhs.m_name == m_name); - } - - bool operator<(const ObjectIdentifier& rhs) const - { - return toDisplayString() < rhs.toDisplayString(); - } - - const QString& schema() const { return m_schema; } - const QString& name() const { return m_name; } - void setSchema(const QString& schema) { m_schema = schema; } - void setName(const QString& name) { m_name = name; } - - void clear() - { - m_schema = "main"; - m_name.clear(); - } - - bool isEmpty() const { return m_name.isEmpty(); } - - // This returns a string which can be used in SQL statements - QString toString(bool shortName = false) const - { - if(shortName && m_schema == "main") - return sqlb::escapeIdentifier(m_name); - else - return QString("%1.%2").arg(sqlb::escapeIdentifier(m_schema)).arg(sqlb::escapeIdentifier(m_name)); - } - - // This returns a string which can be used in the user interface - QString toDisplayString() const - { - if(m_schema == "main") - return m_name; - else - return QString("%1.%2").arg(m_schema).arg(m_name); - } - - QVariant toVariant() const - { - QStringList result; - result << m_schema << m_name; - return QVariant(result); - } - -private: - QString m_schema; - QString m_name; -}; - -QDataStream& operator<<(QDataStream& ds, const ObjectIdentifier& objid); -QDataStream& operator>>(QDataStream& ds, ObjectIdentifier& objid); - -class Object; -class Table; -class Index; -class View; -class Trigger; -class Field; -class Constraint; -class IndexedColumn; -struct FieldInfo; -typedef QSharedPointer ObjectPtr; -typedef QSharedPointer
TablePtr; -typedef QSharedPointer IndexPtr; -typedef QSharedPointer ViewPtr; -typedef QSharedPointer TriggerPtr; -typedef QSharedPointer FieldPtr; -typedef QSharedPointer ConstraintPtr; -typedef QVector FieldVector; -typedef QSharedPointer IndexedColumnPtr; -typedef QVector IndexedColumnVector; -typedef QMultiHash ConstraintMap; -typedef QList FieldInfoList; - -QStringList fieldVectorToFieldNames(const sqlb::FieldVector& vector); - -struct FieldInfo -{ - QString name; - QString type; - QString sql; -}; - -class Object -{ -public: - enum Types - { - Table, - Index, - View, - Trigger - }; - - explicit Object(const QString& name): m_name(name), m_fullyParsed(false) {} - virtual ~Object() {} - - virtual Types type() const = 0; - static QString typeToString(Types type); - - void setName(const QString& name) { m_name = name; } - const QString& name() const { return m_name; } - - void setOriginalSql(const QString& original_sql) { m_originalSql = original_sql; } - QString originalSql() const { return m_originalSql; } - - virtual QString baseTable() const { return QString(); } - - void setFullyParsed(bool fully_parsed) { m_fullyParsed = fully_parsed; } - bool fullyParsed() const { return m_fullyParsed; } - - virtual FieldInfoList fieldInformation() const { return FieldInfoList(); } - - virtual void clear() {} - - /** - * @brief Returns the CREATE statement for this object - * @param schema The schema name of the object - * @param ifNotExists If set to true the "IF NOT EXISTS" qualifier will be added to the create statement - * @return A QString with the CREATE statement. - */ - virtual QString sql(const QString& schema = QString("main"), bool ifNotExists = false) const = 0; - - /** - * @brief parseSQL Parses the CREATE statement in sSQL. - * @param type The type of the object. - * @param sSQL The create statement. - * @return The parsed database object. The object may be empty if parsing failed. - */ - static ObjectPtr parseSQL(Object::Types type, const QString& sSQL); - -protected: - QString m_name; - QString m_originalSql; - bool m_fullyParsed; -}; - -class Constraint -{ -public: - enum ConstraintTypes - { - NoType, - PrimaryKeyConstraintType, - UniqueConstraintType, - ForeignKeyConstraintType, - CheckConstraintType, - }; - - explicit Constraint(const QString& name = QString()) - : m_name(name) - { - } - virtual ~Constraint() {} - - virtual ConstraintTypes type() const = 0; - - void setName(const QString& name) { m_name = name; } - const QString& name() const { return m_name; } - - virtual QString toSql(const FieldVector& applyOn) const = 0; - -protected: - QString m_name; -}; - -class ForeignKeyClause : public Constraint -{ -public: - ForeignKeyClause(const QString& table = QString(), const QStringList& columns = QStringList(), const QString& constraint = QString()) - : m_table(table), - m_columns(columns), - m_constraint(constraint), - m_override(QString()) - { - } - - bool isSet() const; - QString toString() const; - void setFromString(const QString& fk); - - void setTable(const QString& table) { m_override = QString(); m_table = table; } - const QString& table() const { return m_table; } - - void setColumns(const QStringList& columns) { m_columns = columns; } - const QStringList& columns() const { return m_columns; } - - void setConstraint(const QString& constraint) { m_constraint = constraint; } - const QString& constraint() const { return m_constraint; } - - virtual QString toSql(const FieldVector& applyOn) const; - - virtual ConstraintTypes type() const { return ForeignKeyConstraintType; } - -private: - QString m_table; - QStringList m_columns; - QString m_constraint; - - QString m_override; -}; - -class UniqueConstraint : public Constraint -{ -public: - UniqueConstraint() {} - - virtual QString toSql(const FieldVector& applyOn) const; - - virtual ConstraintTypes type() const { return UniqueConstraintType; } -}; - -class PrimaryKeyConstraint : public Constraint -{ -public: - PrimaryKeyConstraint() {} - - void setConflictAction(const QString& conflict) { m_conflictAction = conflict; } - const QString& conflictAction() const { return m_conflictAction; } - - virtual QString toSql(const FieldVector& applyOn) const; - - virtual ConstraintTypes type() const { return PrimaryKeyConstraintType; } - -private: - QString m_conflictAction; -}; - -class CheckConstraint : public Constraint -{ -public: - explicit CheckConstraint(const QString& expr = QString()) - : m_expression(expr) - { - } - - void setExpression(const QString& expr) { m_expression = expr; } - QString expression() const { return m_expression; } - - virtual QString toSql(const FieldVector& applyOn) const; - - virtual ConstraintTypes type() const { return CheckConstraintType; } - -private: - QString m_expression; -}; - -class Field -{ -public: - Field(const QString& name, - const QString& type, - bool notnull = false, - const QString& defaultvalue = "", - const QString& check = "", - bool unique = false, - const QString& collation = QString()) - : m_name(name) - , m_type(type) - , m_notnull(notnull) - , m_check(check) - , m_defaultvalue(defaultvalue) - , m_autoincrement(false) - , m_unique(unique) - , m_collation(collation) - {} - - QString toString(const QString& indent = "\t", const QString& sep = "\t") const; - - void setName(const QString& name) { m_name = name; } - void setType(const QString& type) { m_type = type; } - void setNotNull(bool notnull = true) { m_notnull = notnull; } - void setCheck(const QString& check) { m_check = check; } - void setDefaultValue(const QString& defaultvalue) { m_defaultvalue = defaultvalue; } - void setAutoIncrement(bool autoinc) { m_autoincrement = autoinc; } - void setUnique(bool u) { m_unique = u; } - void setCollation(const QString& collation) { m_collation = collation; } - - bool isText() const; - bool isInteger() const; - - const QString& name() const { return m_name; } - const QString& type() const { return m_type; } - bool notnull() const { return m_notnull; } - const QString& check() const { return m_check; } - const QString& defaultValue() const { return m_defaultvalue; } - bool autoIncrement() const { return m_autoincrement; } - bool unique() const { return m_unique; } - const QString& collation() const { return m_collation; } - - static QStringList Datatypes; -private: - QString m_name; - QString m_type; - bool m_notnull; - QString m_check; - QString m_defaultvalue; - bool m_autoincrement; //! this is stored here for simplification - bool m_unique; - QString m_collation; -}; - -class Table : public Object -{ -public: - explicit Table(const QString& name): Object(name), m_rowidColumn("_rowid_") {} - virtual ~Table(); - Table& operator=(const Table& rhs); - - virtual Types type() const { return Object::Table; } - - const FieldVector& fields() const { return m_fields; } - - /** - * @brief Returns the CREATE TABLE statement for this table object - * @return A QString with the CREATE TABLE object. - */ - QString sql(const QString& schema = QString("main"), bool ifNotExists = false) const; - - void addField(const FieldPtr& f); - bool removeField(const QString& sFieldName); - void setFields(const FieldVector& fields); - void setField(int index, FieldPtr f); - const FieldPtr& field(int index) const { return m_fields[index]; } - QStringList fieldNames() const; - - void setRowidColumn(const QString& rowid) { m_rowidColumn = rowid; } - const QString& rowidColumn() const { return m_rowidColumn; } - bool isWithoutRowidTable() const { return m_rowidColumn != "_rowid_"; } - - void setVirtualUsing(const QString& virt_using) { m_virtual = virt_using; } - QString virtualUsing() const { return m_virtual; } - bool isVirtual() const { return !m_virtual.isEmpty(); } - - void clear(); - - virtual FieldInfoList fieldInformation() const; - - void addConstraint(FieldVector fields, ConstraintPtr constraint); - void setConstraint(FieldVector fields, ConstraintPtr constraint); - void removeConstraints(FieldVector fields = FieldVector(), Constraint::ConstraintTypes type = Constraint::NoType); //! Only removes the first constraint, if any - ConstraintPtr constraint(FieldVector fields = FieldVector(), Constraint::ConstraintTypes type = Constraint::NoType) const; //! Only returns the first constraint, if any - QList constraints(FieldVector fields = FieldVector(), Constraint::ConstraintTypes type = Constraint::NoType) const; - ConstraintMap allConstraints() const { return m_constraints; } - void setConstraints(const ConstraintMap& constraints); - FieldVector& primaryKeyRef(); - const FieldVector& primaryKey() const; - - /** - * @brief findField Finds a field and returns the index. - * @param sname - * @return The field index if the field was found. - * -1 if field couldn't be found. - */ - int findField(const QString& sname) const; - - int findPk() const; - - /** - * @brief parseSQL Parses the create Table statement in sSQL. - * @param sSQL The create table statement. - * @return The table object. The table object may be empty if parsing failed. - */ - static ObjectPtr parseSQL(const QString& sSQL); -private: - QStringList fieldList() const; - bool hasAutoIncrement() const; - -private: - FieldVector m_fields; - QString m_rowidColumn; - ConstraintMap m_constraints; - QString m_virtual; -}; - -class IndexedColumn -{ -public: - IndexedColumn(const QString& name, bool expr, const QString& order = QString()) - : m_name(name), - m_isExpression(expr), - m_order(order) - { - } - - void setName(const QString& name) { m_name = name; } - QString name() const { return m_name; } - - void setExpression(bool expr) { m_isExpression = expr; } - bool expression() const { return m_isExpression; } - - void setOrder(const QString& order) { m_order = order.toUpper(); } - QString order() const { return m_order; } - - QString toString(const QString& indent = "\t", const QString& sep = "\t") const; - -private: - QString m_name; - bool m_isExpression; - QString m_order; -}; - -class Index : public Object -{ -public: - explicit Index(const QString& name): Object(name), m_unique(false) {} - virtual ~Index(); - Index& operator=(const Index& rhs); - - virtual Types type() const { return Object::Index; } - - virtual QString baseTable() const { return m_table; } - - void setUnique(bool unique) { m_unique = unique; } - bool unique() const { return m_unique; } - - void setTable(const QString& table) { m_table = table; } - const QString& table() const { return m_table; } - - void setWhereExpr(const QString& expr) { m_whereExpr = expr; } - const QString& whereExpr() const { return m_whereExpr; } - - void setColumns(const IndexedColumnVector& columns); - const IndexedColumnVector& columns() const { return m_columns; } - void clearColumns() { m_columns.clear(); } - void addColumn(const IndexedColumnPtr& c) { m_columns.append(c); } - bool removeColumn(const QString& name); - void setColumn(int index, IndexedColumnPtr c) { m_columns[index] = c; } - IndexedColumnPtr& column(int index) { return m_columns[index]; } - int findColumn(const QString& name) const; - - void clear(); - - /** - * @brief Returns the CREATE INDEX statement for this index object - * @return A QString with the CREATE INDEX object. - */ - QString sql(const QString& schema = QString("main"), bool ifNotExists = false) const; - - /** - * @brief parseSQL Parses the CREATE INDEX statement in sSQL. - * @param sSQL The create index statement. - * @return The index object. The index object may be empty if the parsing failed. - */ - static ObjectPtr parseSQL(const QString& sSQL); - - virtual FieldInfoList fieldInformation() const; - -private: - QStringList columnSqlList() const; - - bool m_unique; - QString m_table; - QString m_whereExpr; - IndexedColumnVector m_columns; -}; - -class View : public Object -{ -public: - explicit View(const QString& name): Object(name) {} - virtual ~View(); - - virtual Types type() const { return Object::View; } - - QString sql(const QString& schema = QString("main"), bool ifNotExists = false) const { /* TODO */ Q_UNUSED(schema); Q_UNUSED(ifNotExists); return m_originalSql; } - - static ObjectPtr parseSQL(const QString& sSQL); - - void clear(); - - void addField(const FieldPtr& f); - void setFields(const FieldVector& fields); - const FieldPtr& field(int index) const { return m_fields[index]; } - QStringList fieldNames() const; - - virtual FieldInfoList fieldInformation() const; - -private: - FieldVector m_fields; -}; - -class Trigger : public Object -{ -public: - explicit Trigger(const QString& name): Object(name) {} - virtual ~Trigger() {} - - virtual Types type() const { return Object::Trigger; } - - QString sql(const QString& schema = QString("main"), bool ifNotExists = false) const { /* TODO */ Q_UNUSED(schema); Q_UNUSED(ifNotExists); return m_originalSql; } - - static ObjectPtr parseSQL(const QString& sSQL); - - virtual QString baseTable() const { return m_table; } - - void setTable(const QString& table) { m_table = table; } - QString table() const { return m_table; } - -private: - QString m_table; -}; - -} //namespace sqlb - -#endif diff -Nru sqlitebrowser-3.10.100ubuntu1/src/sqltextedit.cpp sqlitebrowser-3.11.1/src/sqltextedit.cpp --- sqlitebrowser-3.10.100ubuntu1/src/sqltextedit.cpp 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/src/sqltextedit.cpp 2019-02-19 23:51:34.000000000 +0000 @@ -1,7 +1,14 @@ +#include "sql/sqlitetypes.h" #include "sqltextedit.h" #include "Settings.h" #include "SqlUiLexer.h" +#include +#include + +#include +#include + SqlUiLexer* SqlTextEdit::sqlLexer = nullptr; SqlTextEdit::SqlTextEdit(QWidget* parent) : @@ -19,6 +26,20 @@ registerImage(SqlUiLexer::ApiCompleterIconIdFunction, QImage(":/icons/function")); registerImage(SqlUiLexer::ApiCompleterIconIdTable, QImage(":/icons/table")); registerImage(SqlUiLexer::ApiCompleterIconIdColumn, QImage(":/icons/field")); + registerImage(SqlUiLexer::ApiCompleterIconIdSchema, QImage(":/icons/database")); + + // Remove command bindings that would interfere with our shortcutToggleComment + QsciCommand * command = standardCommands()->boundTo(Qt::ControlModifier+Qt::Key_Slash); + command->setKey(0); + command = standardCommands()->boundTo(Qt::ControlModifier+Qt::ShiftModifier+Qt::Key_Slash); + command->setKey(0); + + // Change command binding for Ctrl+T so it doesn't interfere with "Open tab" + command = standardCommands()->boundTo(Qt::ControlModifier+Qt::Key_T); + command->setKey(Qt::ControlModifier+Qt::ShiftModifier+Qt::Key_Up); + + QShortcut* shortcutToggleComment = new QShortcut(QKeySequence(tr("Ctrl+/")), this, nullptr, nullptr, Qt::WidgetShortcut); + connect(shortcutToggleComment, &QShortcut::activated, this, &SqlTextEdit::toggleBlockComment); // Do rest of initialisation reloadSettings(); @@ -49,8 +70,67 @@ setupSyntaxHighlightingFormat(sqlLexer, "keyword", QsciLexerSQL::Keyword); setupSyntaxHighlightingFormat(sqlLexer, "table", QsciLexerSQL::KeywordSet6); setupSyntaxHighlightingFormat(sqlLexer, "function", QsciLexerSQL::KeywordSet7); - setupSyntaxHighlightingFormat(sqlLexer, "string", QsciLexerSQL::DoubleQuotedString); setupSyntaxHighlightingFormat(sqlLexer, "string", QsciLexerSQL::SingleQuotedString); + + // Highlight double quote strings as identifier or as literal string depending on user preference + switch(static_cast(Settings::getValue("editor", "identifier_quotes").toInt())) { + case sqlb::DoubleQuotes: + setupSyntaxHighlightingFormat(sqlLexer, "identifier", QsciLexerSQL::DoubleQuotedString); + sqlLexer->setQuotedIdentifiers(false); + break; + case sqlb::GraveAccents: + sqlLexer->setQuotedIdentifiers(true); + // Fall through, treat quoted string as literal string + case sqlb::SquareBrackets: + setupSyntaxHighlightingFormat(sqlLexer, "string", QsciLexerSQL::DoubleQuotedString); + break; + } setupSyntaxHighlightingFormat(sqlLexer, "identifier", QsciLexerSQL::Identifier); setupSyntaxHighlightingFormat(sqlLexer, "identifier", QsciLexerSQL::QuotedIdentifier); } + + +void SqlTextEdit::toggleBlockComment() +{ + int lineFrom, indexFrom, lineTo, indexTo; + + // If there is no selection, select the current line + if (!hasSelectedText()) { + getCursorPosition(&lineFrom, &indexFrom); + + // Windows lines requires an adjustment, otherwise the selection would + // end in the next line. + indexTo = text(lineFrom).endsWith("\r\n") ? lineLength(lineFrom)-1 : lineLength(lineFrom); + + setSelection(lineFrom, 0, lineFrom, indexTo); + } + + getSelection(&lineFrom, &indexFrom, &lineTo, &indexTo); + + bool uncomment = text(lineFrom).contains(QRegExp("^[ \t]*--")); + + // If the selection ends before the first character of a line, don't + // take this line into account for un/commenting. + if (indexTo==0) + lineTo--; + + beginUndoAction(); + + // Iterate over the selected lines, get line text, make + // replacement depending on whether the first line was commented + // or uncommented, and replace the line text. All in a single undo action. + for (int line=lineFrom; line<=lineTo; line++) { + QString lineText = text(line); + + if (uncomment) + lineText.replace(QRegExp("^([ \t]*)-- ?"), "\\1"); + else + lineText.replace(QRegExp("^"), "-- "); + + indexTo = lineText.endsWith("\r\n") ? lineLength(line)-1 : lineLength(line); + + setSelection(line, 0, line, indexTo); + replaceSelectedText(lineText); + } + endUndoAction(); +} diff -Nru sqlitebrowser-3.10.100ubuntu1/src/sqltextedit.h sqlitebrowser-3.11.1/src/sqltextedit.h --- sqlitebrowser-3.10.100ubuntu1/src/sqltextedit.h 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/src/sqltextedit.h 2019-02-19 23:51:34.000000000 +0000 @@ -16,12 +16,13 @@ public: explicit SqlTextEdit(QWidget *parent = nullptr); - virtual ~SqlTextEdit(); + ~SqlTextEdit() override; static SqlUiLexer* sqlLexer; public slots: void reloadSettings(); + void toggleBlockComment(); }; diff -Nru sqlitebrowser-3.10.100ubuntu1/src/SqlUiLexer.cpp sqlitebrowser-3.11.1/src/SqlUiLexer.cpp --- sqlitebrowser-3.10.100ubuntu1/src/SqlUiLexer.cpp 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/src/SqlUiLexer.cpp 2019-02-19 23:51:34.000000000 +0000 @@ -1,6 +1,9 @@ +#include + #include "SqlUiLexer.h" #include "Qsci/qsciapis.h" #include "Settings.h" +#include "sql/sqlitetypes.h" SqlUiLexer::SqlUiLexer(QObject* parent) : QsciLexerSQL(parent) @@ -30,7 +33,7 @@ << "DATABASE" << "DEFAULT" << "DEFERRABLE" << "DEFERRED" << "DELETE" << "DESC" << "DETACH" << "DISTINCT" << "DROP" << "EACH" << "ELSE" << "END" << "ESCAPE" << "EXCEPT" << "EXCLUSIVE" - << "EXISTS" << "EXPLAIN" << "FAIL" << "FOR" << "FOREIGN" + << "EXISTS" << "EXPLAIN" << "FAIL" << "FILTER" << "FOLLOWING" << "FOR" << "FOREIGN" << "FROM" << "FULL" << "GLOB" << "GROUP" << "HAVING" << "IF" << "IGNORE" << "IMMEDIATE" << "IN" << "INDEX" << "INDEXED" << "INITIALLY" << "INNER" << "INSERT" << "INSTEAD" @@ -38,12 +41,12 @@ << "KEY" << "LEFT" << "LIKE" << "LIMIT" << "MATCH" << "NATURAL" << "NO" << "NOT" << "NOTNULL" << "NULL" << "OF" << "OFFSET" << "ON" << "OR" << "ORDER" - << "OUTER" << "PLAN" << "PRAGMA" << "PRIMARY" << "QUERY" - << "RAISE" << "RECURSIVE" << "REFERENCES" << "REGEXP" << "REINDEX" << "RELEASE" + << "OUTER" << "OVER" << "PARTITION" << "PLAN" << "PRAGMA" << "PRECEDING" << "PRIMARY" << "QUERY" + << "RAISE" << "RANGE" << "RECURSIVE" << "REFERENCES" << "REGEXP" << "REINDEX" << "RELEASE" << "RENAME" << "REPLACE" << "RESTRICT" << "RIGHT" << "ROLLBACK" - << "ROW" << "SAVEPOINT" << "SELECT" << "SET" << "TABLE" + << "ROWID" << "ROWS" << "SAVEPOINT" << "SELECT" << "SET" << "TABLE" << "TEMP" << "TEMPORARY" << "THEN" << "TO" << "TRANSACTION" - << "TRIGGER" << "UNION" << "UNIQUE" << "UPDATE" << "USING" + << "TRIGGER" << "UNBOUNDED" << "UNION" << "UNIQUE" << "UPDATE" << "USING" << "VACUUM" << "VALUES" << "VIEW" << "VIRTUAL" << "WHEN" << "WHERE" << "WITH" << "WITHOUT" // Data types @@ -73,8 +76,8 @@ << "length" + tr("(X) For a string value X, the length(X) function returns the number of characters (not bytes) in X prior to the first NUL character.") << "like" + tr("(X,Y) The like() function is used to implement the \"Y LIKE X\" expression.") << "like" + tr("(X,Y,Z) The like() function is used to implement the \"Y LIKE X ESCAPE Z\" expression.") - << "load_extension" + tr("(X) The load_extension(X) function loads SQLite extensions out of the shared library file named X.") - << "load_extension" + tr("(X,Y) The load_extension(X) function loads SQLite extensions out of the shared library file named X using the entry point Y.") + << "load_extension" + tr("(X) The load_extension(X) function loads SQLite extensions out of the shared library file named X.\nUse of this function must be authorized from Preferences.") + << "load_extension" + tr("(X,Y) The load_extension(X) function loads SQLite extensions out of the shared library file named X using the entry point Y.\nUse of this function must be authorized from Preferences.") << "lower" + tr("(X) The lower(X) function returns a copy of string X with all ASCII characters converted to lower case.") << "ltrim" + tr("(X) ltrim(X) removes spaces from the left side of X.") << "ltrim" + tr("(X,Y) The ltrim(X,Y) function returns a string formed by removing any and all characters that appear in Y from the left side of X.") @@ -114,7 +117,24 @@ << "max" + tr("(X) The max() aggregate function returns the maximum value of all values in the group.") << "min" + tr("(X) The min() aggregate function returns the minimum non-NULL value of all values in the group.") << "sum" + tr("(X) The sum() and total() aggregate functions return sum of all non-NULL values in the group.") - << "total" + tr("(X) The sum() and total() aggregate functions return sum of all non-NULL values in the group."); + << "total" + tr("(X) The sum() and total() aggregate functions return sum of all non-NULL values in the group.") + // Window functions + << "row_number" + tr("() The number of the row within the current partition. Rows are numbered starting from 1 in the order defined by the ORDER BY clause in the window definition, or in arbitrary order otherwise.") + << "rank" + tr("() The row_number() of the first peer in each group - the rank of the current row with gaps. If there is no ORDER BY clause, then all rows are considered peers and this function always returns 1.") + << "dense_rank" + tr("() The number of the current row's peer group within its partition - the rank of the current row without gaps. Partitions are numbered starting from 1 in the order defined by the ORDER BY clause in the window definition. If there is no ORDER BY clause, then all rows are considered peers and this function always returns 1. ") + << "percent_rank" + tr("() Despite the name, this function always returns a value between 0.0 and 1.0 equal to (rank - 1)/(partition-rows - 1), where rank is the value returned by built-in window function rank() and partition-rows is the total number of rows in the partition. If the partition contains only one row, this function returns 0.0. ") + << "cume_dist" + tr("() The cumulative distribution. Calculated as row-number/partition-rows, where row-number is the value returned by row_number() for the last peer in the group and partition-rows the number of rows in the partition.") + << "ntile" + tr("(N) Argument N is handled as an integer. This function divides the partition into N groups as evenly as possible and assigns an integer between 1 and N to each group, in the order defined by the ORDER BY clause, or in arbitrary order otherwise. If necessary, larger groups occur first. This function returns the integer value assigned to the group that the current row is a part of.") + << "lag" + tr("(expr) Returns the result of evaluating expression expr against the previous row in the partition. Or, if there is no previous row (because the current row is the first), NULL.") + << "lag" + tr("(expr,offset) If the offset argument is provided, then it must be a non-negative integer. In this case the value returned is the result of evaluating expr against the row offset rows before the current row within the partition. If offset is 0, then expr is evaluated against the current row. If there is no row offset rows before the current row, NULL is returned.") + << "lag" + tr("(expr,offset,default) If default is also provided, then it is returned instead of NULL if the row identified by offset does not exist.") + << "lead" + tr("(expr) Returns the result of evaluating expression expr against the next row in the partition. Or, if there is no next row (because the current row is the last), NULL.") + << "lead" + tr("(expr,offset) If the offset argument is provided, then it must be a non-negative integer. In this case the value returned is the result of evaluating expr against the row offset rows after the current row within the partition. If offset is 0, then expr is evaluated against the current row. If there is no row offset rows after the current row, NULL is returned.") + << "lead" + tr("(expr,offset,default) If default is also provided, then it is returned instead of NULL if the row identified by offset does not exist.") + << "first_value" + tr("(expr) This built-in window function calculates the window frame for each row in the same way as an aggregate window function. It returns the value of expr evaluated against the first row in the window frame for each row.") + << "last_value" + tr("(expr) This built-in window function calculates the window frame for each row in the same way as an aggregate window function. It returns the value of expr evaluated against the last row in the window frame for each row.") + << "nth_value" + tr("(expr,N) This built-in window function calculates the window frame for each row in the same way as an aggregate window function. It returns the value of expr evaluated against the row N of the window frame. Rows are numbered within the window frame starting from 1 in the order defined by the ORDER BY clause if one is present, or in arbitrary order otherwise. If there is no Nth row in the partition, then NULL is returned.") + ; listFunctions.clear(); for(const QString& keyword : functionPatterns) @@ -130,24 +150,31 @@ } } -void SqlUiLexer::setTableNames(const TablesAndColumnsMap& tables) +void SqlUiLexer::setTableNames(const QualifiedTablesMap& tables) { // Update list for auto completion autocompleteApi->clear(); listTables.clear(); setupAutoCompletion(); - for(auto it=tables.constBegin();it!=tables.constEnd();++it) + for(auto itSchemas=tables.constBegin();itSchemas!=tables.constEnd();++itSchemas) { - for(const QString& field : it.value()) { - // Completion for table.field - autocompleteApi->add(it.key() + "?" + QString::number(SqlUiLexer::ApiCompleterIconIdTable) + "." + - field + "?" + QString::number(SqlUiLexer::ApiCompleterIconIdColumn)); - // Completion for isolated field - autocompleteApi->add(field + "?" + QString::number(SqlUiLexer::ApiCompleterIconIdColumn)); - + for(auto itTables=itSchemas.value().constBegin();itTables!=itSchemas.value().constEnd();++itTables) + { + // Completion for schema.table + autocompleteApi->add(itSchemas.key() + "?" + QString::number(SqlUiLexer::ApiCompleterIconIdSchema) + "." + + itTables.key() + "?" + QString::number(SqlUiLexer::ApiCompleterIconIdTable)); + + for(const QString& field : itTables.value()) { + // Completion for table.field + autocompleteApi->add(itTables.key() + "?" + QString::number(SqlUiLexer::ApiCompleterIconIdTable) + "." + + field + "?" + QString::number(SqlUiLexer::ApiCompleterIconIdColumn)); + + // Completion for isolated field + autocompleteApi->add(field + "?" + QString::number(SqlUiLexer::ApiCompleterIconIdColumn)); + } + // Store the table name list in order to highlight them in a different colour + listTables.append(itTables.key()); } - // Store the table name list in order to highlight them in a different colour - listTables.append(it.key()); } autocompleteApi->prepare(); } @@ -177,9 +204,15 @@ { // The only word separator for auto completion in SQL is "." as in "tablename.columnname". // Because this isn't implemented in the default QScintilla SQL lexer for some reason we add it here. - + // We also need to consider quoted identifiers as in "tablename"."columnname" with whatever quote character + // is configured. QStringList wl; - wl << "."; + + QString escapeSeparator = sqlb::escapeIdentifier(QString(".")); + // Case for non symetric quotes, e.g. "[.]" to "].[" + std::reverse(escapeSeparator.begin(), escapeSeparator.end()); + + wl << "." << escapeSeparator; return wl; } diff -Nru sqlitebrowser-3.10.100ubuntu1/src/SqlUiLexer.h sqlitebrowser-3.11.1/src/SqlUiLexer.h --- sqlitebrowser-3.10.100ubuntu1/src/SqlUiLexer.h 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/src/SqlUiLexer.h 2019-02-19 23:51:34.000000000 +0000 @@ -20,16 +20,19 @@ ApiCompleterIconIdFunction, ApiCompleterIconIdTable, ApiCompleterIconIdColumn, + ApiCompleterIconIdSchema, }; typedef QMap > TablesAndColumnsMap; - void setTableNames(const TablesAndColumnsMap& tables); + typedef QMap QualifiedTablesMap; - virtual const char* keywords(int set) const; + void setTableNames(const QualifiedTablesMap& tables); - virtual QStringList autoCompletionWordSeparators() const; + const char* keywords(int set) const override; - bool caseSensitive() const; + QStringList autoCompletionWordSeparators() const override; + + bool caseSensitive() const override; private: QsciAPIs* autocompleteApi; diff -Nru sqlitebrowser-3.10.100ubuntu1/src/src.pro sqlitebrowser-3.11.1/src/src.pro --- sqlitebrowser-3.10.100ubuntu1/src/src.pro 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/src/src.pro 2019-02-19 23:51:34.000000000 +0000 @@ -15,8 +15,8 @@ CONFIG(unittest) { QT += testlib - HEADERS += tests/testsqlobjects.h tests/TestImport.h tests/TestRegex.h - SOURCES += tests/testsqlobjects.cpp tests/TestImport.cpp tests/TestMain.cpp tests/TestRegex.cpp + HEADERS += tests/testsqlobjects.h tests/TestImport.h tests/TestRegex.h tests/TestRowCache.h + SOURCES += tests/testsqlobjects.cpp tests/TestImport.cpp tests/TestRegex.cpp tests/TestRowCache.cpp } else { SOURCES += main.cpp } @@ -27,19 +27,22 @@ EditIndexDialog.h \ AboutDialog.h \ EditTableDialog.h \ + AddRecordDialog.h \ Settings.h \ PreferencesDialog.h \ EditDialog.h \ ExportDataDialog.h \ ImportCsvDialog.h \ sqltextedit.h \ - sqlitetypes.h \ + sql/sqlitetypes.h \ csvparser.h \ ExtendedTableWidget.h \ grammar/Sqlite3Lexer.hpp \ grammar/Sqlite3Parser.hpp \ grammar/sqlite3TokenTypes.hpp \ sqlitetablemodel.h \ + RowCache.h \ + RowLoader.h \ FilterTableHeader.h \ version.h \ SqlExecutionArea.h \ @@ -63,13 +66,20 @@ FindReplaceDialog.h \ ExtendedScintilla.h \ FileExtensionManager.h \ - Data.h + Data.h \ + CipherSettings.h \ + DotenvFormat.h \ + Palette.h \ + CondFormat.h \ + sql/Query.h \ + RunSql.h SOURCES += \ sqlitedb.cpp \ MainWindow.cpp \ EditIndexDialog.cpp \ EditTableDialog.cpp \ + AddRecordDialog.cpp \ Settings.cpp \ PreferencesDialog.cpp \ AboutDialog.cpp \ @@ -77,12 +87,13 @@ ExportDataDialog.cpp \ ImportCsvDialog.cpp \ sqltextedit.cpp \ - sqlitetypes.cpp \ + sql/sqlitetypes.cpp \ csvparser.cpp \ ExtendedTableWidget.cpp \ grammar/Sqlite3Lexer.cpp \ grammar/Sqlite3Parser.cpp \ sqlitetablemodel.cpp \ + RowLoader.cpp \ FilterTableHeader.cpp \ SqlExecutionArea.cpp \ VacuumDialog.cpp \ @@ -104,7 +115,13 @@ FindReplaceDialog.cpp \ ExtendedScintilla.cpp \ FileExtensionManager.cpp \ - Data.cpp + Data.cpp \ + CipherSettings.cpp \ + DotenvFormat.cpp \ + Palette.cpp \ + CondFormat.cpp \ + sql/Query.cpp \ + RunSql.cpp RESOURCES += icons/icons.qrc \ translations/flags/flags.qrc \ @@ -116,6 +133,7 @@ EditIndexDialog.ui \ AboutDialog.ui \ EditTableDialog.ui \ + AddRecordDialog.ui \ PreferencesDialog.ui \ EditDialog.ui \ ExportDataDialog.ui \ @@ -140,11 +158,13 @@ translations/sqlb_es_ES.ts \ translations/sqlb_fr.ts \ translations/sqlb_ru.ts \ + translations/sqlb_pl.ts \ translations/sqlb_pt_BR.ts \ translations/sqlb_en_GB.ts \ translations/sqlb_ko_KR.ts \ translations/sqlb_tr.ts \ - translations/sqlb_uk_UA.ts + translations/sqlb_uk_UA.ts \ + translations/sqlb_it.ts # SQLite / SQLCipher switch pieces CONFIG(sqlcipher) { @@ -209,26 +229,46 @@ QMAKE_CXXFLAGS += -DCHECKNEWVERSION } +CONFIG(all_warnings) { + QMAKE_CXXFLAGS += -Wall -Wextra -Wshadow -Wnon-virtual-dtor -Wold-style-cast -Wcast-align -Wunused -Woverloaded-virtual -Wpedantic -Wconversion -Wsign-conversion + QMAKE_CXXFLAGS += -Wnull-dereference -Wdouble-promotion -Wformat=2 -Wduplicated-cond -Wduplicated-branches -Wlogical-op -Wuseless-cast +} + UI_DIR = .ui INCLUDEPATH += $$PWD/../libs/antlr-2.7.7 $$PWD/../libs/qhexedit $$PWD/../libs/qcustomplot-source $$PWD/../libs/qscintilla/Qt4Qt5 $$PWD/.. LIBS += -L$$LIBPATH_QHEXEDIT -L$$LIBPATH_ANTLR -L$$LIBPATH_QCUSTOMPLOT -L$$LIBPATH_QSCINTILLA -lantlr -lqhexedit -lqcustomplot -lqscintilla2 DEPENDPATH += $$PWD/../libs/antlr-2.7.7 $$PWD/../libs/qhexedit $$PWD/../libs/qcustomplot-source $$PWD/../libs/qscintilla/Qt4Qt5 unix { + # Below, the user can specify where all generated file can be placed + # through a set of variables, being them: + # + # PREFIX -> the root directory where the files will be placed + # BINDIR -> where executables accessible by the user resides + # DATADIR -> where data files and resources should be placed + # + # The values of each variable changes between supported platforms and are describe as follow + + # Default configuration for package sqlitebrowser. + # The default prefix is /usr/local + !defined(PREFIX, var): PREFIX = /usr/local + !defined(BINDIR, var): BINDIR = $$PREFIX/bin + !defined(DATADIR, var): DATADIR = $$PREFIX/share + # The executable - target.path = /usr/local/bin/ + target.path = $$BINDIR INSTALLS += target # Icon - icon.path = /usr/local/share/icons/hicolor/256x256/apps/ + icon.path = $$DATADIR/icons/hicolor/256x256/apps/ icon.files = icons/sqlitebrowser.png INSTALLS += icon # Desktop metadata - desktop.path = /usr/local/share/applications/ + desktop.path = $$DATADIR/applications/ desktop.files = ../distri/sqlitebrowser.desktop INSTALLS += desktop - appdata.path = /usr/local/share/appdata/ + appdata.path = $$DATADIR/appdata/ appdata.files = ../distri/sqlitebrowser.desktop.appdata.xml INSTALLS += appdata } diff -Nru sqlitebrowser-3.10.100ubuntu1/src/tests/CMakeLists.txt sqlitebrowser-3.11.1/src/tests/CMakeLists.txt --- sqlitebrowser-3.10.100ubuntu1/src/tests/CMakeLists.txt 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/src/tests/CMakeLists.txt 2019-02-19 23:51:34.000000000 +0000 @@ -1,24 +1,34 @@ include_directories("${CMAKE_CURRENT_BINARY_DIR}" ..) +if(NOT WIN32) + set(LPTHREAD pthread) +endif() + # test-sqlobjects set(TESTSQLOBJECTS_SRC ../sqlitedb.cpp ../sqlitetablemodel.cpp - ../sqlitetypes.cpp + ../RowLoader.cpp + ../sql/sqlitetypes.cpp + ../sql/Query.cpp ../csvparser.cpp ../grammar/Sqlite3Lexer.cpp ../grammar/Sqlite3Parser.cpp ../Settings.cpp testsqlobjects.cpp ../Data.cpp + ../CipherSettings.cpp + ../DotenvFormat.cpp + ../CondFormat.cpp ) set(TESTSQLOBJECTS_HDR ../grammar/sqlite3TokenTypes.hpp ../grammar/Sqlite3Lexer.hpp ../grammar/Sqlite3Parser.hpp - ../sqlitetypes.h + ../sql/sqlitetypes.h + ../sql/Query.h ../Data.h ) @@ -27,6 +37,9 @@ ../sqlitetablemodel.h ../Settings.h testsqlobjects.h + ../CipherSettings.h + ../DotenvFormat.h + ../CondFormat.h ) if(sqlcipher) @@ -39,7 +52,9 @@ add_executable(test-sqlobjects ${TESTSQLOBJECTS_MOC} ${TESTSQLOBJECTS_HDR} ${TESTSQLOBJECTS_SRC} ${TESTSQLOBJECTS_FORM_HDR}) -qt5_use_modules(test-sqlobjects Test Widgets Gui) +find_package(Qt5 REQUIRED COMPONENTS Test Widgets Gui) +target_link_libraries(test-sqlobjects Qt5::Test Qt5::Widgets Qt5::Gui) + set(QT_LIBRARIES "") if(NOT ANTLR2_FOUND) @@ -51,9 +66,7 @@ else() target_link_libraries(test-sqlobjects antlr) endif() -link_directories("${CMAKE_CURRENT_BINARY_DIR}/${QSCINTILLA_DIR}") -add_dependencies(test-sqlobjects qscintilla2) -target_link_libraries(test-sqlobjects qscintilla2) +target_link_libraries(test-sqlobjects ${LPTHREAD}) add_test(test-sqlobjects test-sqlobjects) # test-import @@ -69,7 +82,9 @@ add_executable(test-import ${TESTIMPORT_MOC} ${TESTIMPORT_SRC}) -qt5_use_modules(test-import Test Core) +find_package(Qt5 REQUIRED COMPONENTS Core) +target_link_libraries(test-import Qt5::Test Qt5::Core) + set(QT_LIBRARIES "") target_link_libraries(test-import ${QT_LIBRARIES}) @@ -80,19 +95,25 @@ set(TESTREGEX_SRC ../sqlitedb.cpp ../sqlitetablemodel.cpp - ../sqlitetypes.cpp + ../RowLoader.cpp + ../sql/sqlitetypes.cpp + ../sql/Query.cpp ../grammar/Sqlite3Lexer.cpp ../grammar/Sqlite3Parser.cpp ../Settings.cpp TestRegex.cpp ../Data.cpp + ../CipherSettings.cpp + ../DotenvFormat.cpp + ../CondFormat.cpp ) set(TESTREGEX_HDR ../grammar/sqlite3TokenTypes.hpp ../grammar/Sqlite3Lexer.hpp ../grammar/Sqlite3Parser.hpp - ../sqlitetypes.h + ../sql/sqlitetypes.h + ../sql/Query.h ../Data.h ) @@ -101,6 +122,9 @@ ../sqlitetablemodel.h ../Settings.h TestRegex.h + ../CipherSettings.h + ../DotenvFormat.h + ../CondFormat.h ) if(sqlcipher) @@ -110,7 +134,8 @@ add_executable(test-regex ${TESTREGEX_MOC} ${TESTREGEX_HDR} ${TESTREGEX_SRC}) -qt5_use_modules(test-regex Test Core Gui Widgets) +target_link_libraries(test-regex Qt5::Test Qt5::Core Qt5::Gui Qt5::Widgets) + set(QT_LIBRARIES "") if(NOT ANTLR2_FOUND) @@ -122,7 +147,24 @@ else() target_link_libraries(test-regex antlr) endif() -link_directories("${CMAKE_CURRENT_BINARY_DIR}/${QSCINTILLA_DIR}") -add_dependencies(test-regex qscintilla2) -target_link_libraries(test-regex qscintilla2) +target_link_libraries(test-regex ${LPTHREAD}) add_test(test-regex test-regex) + +# test cache + +set(TESTCACHE_SRC + TestRowCache.cpp +) + +set(TESTCACHE_MOC_HDR + TestRowCache.h +) + +add_executable(test-cache ${TESTCACHE_MOC} ${TESTCACHE_SRC}) + +target_link_libraries(test-cache Qt5::Test Qt5::Core) + +set(QT_LIBRARIES "") + +target_link_libraries(test-cache ${QT_LIBRARIES}) +add_test(test-cache test-cache) diff -Nru sqlitebrowser-3.10.100ubuntu1/src/tests/TestRowCache.cpp sqlitebrowser-3.11.1/src/tests/TestRowCache.cpp --- sqlitebrowser-3.10.100ubuntu1/src/tests/TestRowCache.cpp 1970-01-01 00:00:00.000000000 +0000 +++ sqlitebrowser-3.11.1/src/tests/TestRowCache.cpp 2019-02-19 23:51:34.000000000 +0000 @@ -0,0 +1,189 @@ +#include + +#include "TestRowCache.h" +#include "../RowCache.h" + +QTEST_APPLESS_MAIN(TestRowCache) + +TestRowCache::TestRowCache() +{ +} + +TestRowCache::~TestRowCache() +{ +} + +using C = RowCache; + +void TestRowCache::construction() +{ + C c; + + QCOMPARE(c.numSet(), static_cast(0)); + + QVERIFY(c.count(0) == false); + QVERIFY(c.count(1) == false); + QVERIFY(c.count(2) == false); + + QVERIFY_EXCEPTION_THROWN(c.at(0), std::out_of_range); +} + +void TestRowCache::setGet() +{ + C c; + + c.set(1, 10); + c.set(5, 50); + c.set(0, 0); + c.set(6, 60); + c.set(100, 1000); + + QCOMPARE(c.numSet(), static_cast(5)); + QCOMPARE(c.numSegments(), static_cast(4)); // the '0' set after the '1' position does not merge currently + + int cnt = 0; + const C & cc = c; + for(size_t i = 0; i < 200; i++) { + if(c.count(i)) { + QCOMPARE(c.at(i), static_cast(10*i)); + QCOMPARE(cc.at(i), static_cast(10*i)); + cnt++; + } else { + QVERIFY_EXCEPTION_THROWN(c.at(i), std::out_of_range); + QVERIFY_EXCEPTION_THROWN(cc.at(i), std::out_of_range); + } + } + QCOMPARE(cnt, 5); +} + +void TestRowCache::insert() +{ + C c; + + c.insert(3, 30); + QCOMPARE(c.numSet(), static_cast(1)); + QCOMPARE(c.numSegments(), static_cast(1)); + QCOMPARE(c.at(3), 30); + + c.insert(3, 31); + QCOMPARE(c.numSet(), static_cast(2)); + QCOMPARE(c.numSegments(), static_cast(1)); + QCOMPARE(c.at(3), 31); + QCOMPARE(c.at(4), 30); + + c.insert(0, 0); + QCOMPARE(c.numSet(), static_cast(3)); + QCOMPARE(c.numSegments(), static_cast(2)); + QCOMPARE(c.at(0), 0); + QVERIFY_EXCEPTION_THROWN(c.at(3), std::out_of_range); + QCOMPARE(c.at(4), 31); + QCOMPARE(c.at(5), 30); + QVERIFY_EXCEPTION_THROWN(c.at(6), std::out_of_range); + + c.insert(1, 100); + QCOMPARE(c.numSet(), static_cast(4)); + QCOMPARE(c.numSegments(), static_cast(2)); + QCOMPARE(c.at(0), 0); + QCOMPARE(c.at(1), 100); + QCOMPARE(c.at(5), 31); + QCOMPARE(c.at(6), 30); + + c.insert(8, 1); + QCOMPARE(c.numSet(), static_cast(5)); + QCOMPARE(c.numSegments(), static_cast(3)); + QCOMPARE(c.at(0), 0); + QCOMPARE(c.at(1), 100); + QCOMPARE(c.at(5), 31); + QCOMPARE(c.at(6), 30); + QCOMPARE(c.at(8), 1); +} + +void TestRowCache::erase() +{ + C c; + c.insert(3, 30); + c.insert(3, 31); + c.insert(0, 0); + c.insert(8, 1); + QCOMPARE(c.numSet(), static_cast(4)); + QCOMPARE(c.numSegments(), static_cast(3)); + QCOMPARE(c.at(0), 0); + QCOMPARE(c.at(4), 31); + QCOMPARE(c.at(5), 30); + QCOMPARE(c.at(8), 1); + + // erase entire segment + c.erase(0); + QCOMPARE(c.numSet(), static_cast(3)); + QCOMPARE(c.numSegments(), static_cast(2)); + QCOMPARE(c.at(3), 31); + QCOMPARE(c.at(4), 30); + QCOMPARE(c.at(7), 1); + + // erase inside segment + c.erase(4); + QCOMPARE(c.numSet(), static_cast(2)); + QCOMPARE(c.numSegments(), static_cast(2)); + QCOMPARE(c.at(3), 31); + QCOMPARE(c.at(6), 1); + + // erase non-filled row + c.erase(5); + QCOMPARE(c.numSet(), static_cast(2)); + QCOMPARE(c.numSegments(), static_cast(2)); + QCOMPARE(c.at(3), 31); + QCOMPARE(c.at(5), 1); + + c.erase(5); + QCOMPARE(c.numSet(), static_cast(1)); + QCOMPARE(c.numSegments(), static_cast(1)); + QCOMPARE(c.at(3), 31); + + c.erase(3); + QCOMPARE(c.numSet(), static_cast(0)); + QCOMPARE(c.numSegments(), static_cast(0)); +} + +void TestRowCache::smallestNonAvailableRange() +{ + C c; + c.insert(3, 0); + c.insert(3, 0); + c.insert(0, 0); + c.insert(8, 0); + QCOMPARE(c.numSet(), static_cast(4)); + QVERIFY(c.count(0)); + QVERIFY(c.count(4)); + QVERIFY(c.count(5)); + QVERIFY(c.count(8)); + + using P = std::pair; + + auto test = [&](size_t begin, size_t end) { + P p{ begin, end }; + c.smallestNonAvailableRange(p.first, p.second); + return p; + }; + + QCOMPARE(test( 0, 0), P( 0, 0)); + QCOMPARE(test( 0, 1), P( 1, 1)); + QCOMPARE(test( 0, 2), P( 1, 2)); + QCOMPARE(test( 0, 3), P( 1, 3)); + QCOMPARE(test( 0, 4), P( 1, 4)); + QCOMPARE(test( 0, 5), P( 1, 4)); + QCOMPARE(test( 0, 6), P( 1, 4)); + QCOMPARE(test( 0, 7), P( 1, 7)); + QCOMPARE(test( 0, 8), P( 1, 8)); + QCOMPARE(test( 0, 9), P( 1, 8)); + QCOMPARE(test( 0,10), P( 1,10)); + QCOMPARE(test( 1,10), P( 1,10)); + QCOMPARE(test( 2,10), P( 2,10)); + QCOMPARE(test( 3,10), P( 3,10)); + QCOMPARE(test( 4,10), P( 6,10)); + QCOMPARE(test( 5,10), P( 6,10)); + QCOMPARE(test( 6,10), P( 6,10)); + QCOMPARE(test( 7,10), P( 7,10)); + QCOMPARE(test( 8,10), P( 9,10)); + QCOMPARE(test( 9,10), P( 9,10)); + QCOMPARE(test(10,10), P(10,10)); +} diff -Nru sqlitebrowser-3.10.100ubuntu1/src/tests/TestRowCache.h sqlitebrowser-3.11.1/src/tests/TestRowCache.h --- sqlitebrowser-3.10.100ubuntu1/src/tests/TestRowCache.h 1970-01-01 00:00:00.000000000 +0000 +++ sqlitebrowser-3.11.1/src/tests/TestRowCache.h 2019-02-19 23:51:34.000000000 +0000 @@ -0,0 +1,22 @@ +#ifndef TESTROWCACHE_H +#define TESTROWCACHE_H + +#include + +class TestRowCache : public QObject +{ + Q_OBJECT + +public: + TestRowCache(); + ~TestRowCache(); + +private slots: + void construction(); + void setGet(); + void insert(); + void erase(); + void smallestNonAvailableRange(); +}; + +#endif diff -Nru sqlitebrowser-3.10.100ubuntu1/src/tests/testsqlobjects.cpp sqlitebrowser-3.11.1/src/tests/testsqlobjects.cpp --- sqlitebrowser-3.10.100ubuntu1/src/tests/testsqlobjects.cpp 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/src/tests/testsqlobjects.cpp 2019-02-19 23:51:34.000000000 +0000 @@ -1,5 +1,5 @@ #include "testsqlobjects.h" -#include "../sqlitetypes.h" +#include "../sql/sqlitetypes.h" #include @@ -7,15 +7,47 @@ using namespace sqlb; +#if QT_VERSION < QT_VERSION_CHECK(5, 10, 0) +namespace QTest +{ +template +inline bool qCompare(const T1 &t1, const T2 &t2, const char *actual, const char *expected, + const char *file, int line) +{ + return compare_helper(t1 == t2, "Compared values are not the same", + toString(t1), toString(t2), actual, expected, file, line); +} +} +#endif + void TestTable::sqlOutput() { Table tt("testtable"); - FieldPtr f = FieldPtr(new Field("id", "integer")); - FieldPtr fkm = FieldPtr(new Field("km", "integer", false, "", "km > 1000")); - tt.addField(f); - tt.addField(FieldPtr(new Field("car", "text"))); - tt.addField(fkm); - tt.addConstraint({f, fkm}, ConstraintPtr(new PrimaryKeyConstraint())); + Field f("id", "integer"); + Field fkm("km", "integer", false, "", "km > 1000"); + tt.fields.push_back(f); + tt.fields.emplace_back("car", "text"); + tt.fields.push_back(fkm); + tt.addConstraint({f.name(), fkm.name()}, ConstraintPtr(new PrimaryKeyConstraint())); + + QCOMPARE(tt.sql(), QString("CREATE TABLE \"testtable\" (\n" + "\t\"id\"\tinteger,\n" + "\t\"car\"\ttext,\n" + "\t\"km\"\tinteger CHECK(km > 1000),\n" + "\tPRIMARY KEY(\"id\",\"km\")\n" + ");")); +} + +void TestTable::sqlGraveAccentOutput() +{ + Table tt("testtable"); + Field f("id", "integer"); + Field fkm("km", "integer", false, "", "km > 1000"); + tt.fields.push_back(f); + tt.fields.emplace_back("car", "text"); + tt.fields.push_back(fkm); + tt.addConstraint({f.name(), fkm.name()}, ConstraintPtr(new PrimaryKeyConstraint())); + sqlb::setIdentifierQuoting(sqlb::GraveAccents); QCOMPARE(tt.sql(), QString("CREATE TABLE `testtable` (\n" "\t`id`\tinteger,\n" @@ -23,90 +55,114 @@ "\t`km`\tinteger CHECK(km > 1000),\n" "\tPRIMARY KEY(`id`,`km`)\n" ");")); + + sqlb::setIdentifierQuoting(sqlb::DoubleQuotes); } -void TestTable::autoincrement() + +void TestTable::sqlSquareBracketsOutput() { Table tt("testtable"); - FieldPtr f = FieldPtr(new Field("id", "integer")); - f->setAutoIncrement(true); - FieldPtr fkm = FieldPtr(new Field("km", "integer")); - tt.addField(f); - tt.addField(FieldPtr(new Field("car", "text"))); - tt.addField(fkm); - tt.addConstraint({f}, ConstraintPtr(new PrimaryKeyConstraint())); + Field f("id", "integer"); + Field fkm("km", "integer", false, "", "km > 1000"); + tt.fields.push_back(f); + tt.fields.emplace_back("car", "text"); + tt.fields.push_back(fkm); + tt.addConstraint({f.name(), fkm.name()}, ConstraintPtr(new PrimaryKeyConstraint())); + sqlb::setIdentifierQuoting(sqlb::SquareBrackets); + + QCOMPARE(tt.sql(), QString("CREATE TABLE [testtable] (\n" + "\t[id]\tinteger,\n" + "\t[car]\ttext,\n" + "\t[km]\tinteger CHECK(km > 1000),\n" + "\tPRIMARY KEY([id],[km])\n" + ");")); - QCOMPARE(tt.sql(), QString("CREATE TABLE `testtable` (\n" - "\t`id`\tinteger PRIMARY KEY AUTOINCREMENT,\n" - "\t`car`\ttext,\n" - "\t`km`\tinteger\n" + sqlb::setIdentifierQuoting(sqlb::DoubleQuotes); +} + +void TestTable::autoincrement() +{ + Table tt("testtable"); + Field f("id", "integer"); + f.setAutoIncrement(true); + Field fkm("km", "integer"); + tt.fields.push_back(f); + tt.fields.emplace_back("car", "text"); + tt.fields.push_back(fkm); + tt.addConstraint({f.name()}, ConstraintPtr(new PrimaryKeyConstraint())); + + QCOMPARE(tt.sql(), QString("CREATE TABLE \"testtable\" (\n" + "\t\"id\"\tinteger PRIMARY KEY AUTOINCREMENT,\n" + "\t\"car\"\ttext,\n" + "\t\"km\"\tinteger\n" ");")); } void TestTable::notnull() { Table tt("testtable"); - FieldPtr f = FieldPtr(new Field("id", "integer")); - f->setAutoIncrement(true); - FieldPtr fkm = FieldPtr(new Field("km", "integer")); - tt.addField(f); - tt.addField(FieldPtr(new Field("car", "text", true))); - tt.addField(fkm); - tt.addConstraint({f}, ConstraintPtr(new PrimaryKeyConstraint())); - - QCOMPARE(tt.sql(), QString("CREATE TABLE `testtable` (\n" - "\t`id`\tinteger PRIMARY KEY AUTOINCREMENT,\n" - "\t`car`\ttext NOT NULL,\n" - "\t`km`\tinteger\n" + Field f("id", "integer"); + f.setAutoIncrement(true); + Field fkm("km", "integer"); + tt.fields.push_back(f); + tt.fields.emplace_back("car", "text", true); + tt.fields.push_back(fkm); + tt.addConstraint({f.name()}, ConstraintPtr(new PrimaryKeyConstraint())); + + QCOMPARE(tt.sql(), QString("CREATE TABLE \"testtable\" (\n" + "\t\"id\"\tinteger PRIMARY KEY AUTOINCREMENT,\n" + "\t\"car\"\ttext NOT NULL,\n" + "\t\"km\"\tinteger\n" ");")); } void TestTable::withoutRowid() { Table tt("testtable"); - FieldPtr f = FieldPtr(new Field("a", "integer")); - f->setAutoIncrement(true); - tt.addField(f); - tt.addField(FieldPtr(new Field("b", "integer"))); + Field f("a", "integer"); + f.setAutoIncrement(true); + tt.fields.push_back(f); + tt.fields.emplace_back("b", "integer"); tt.setRowidColumn("a"); - tt.addConstraint({f}, ConstraintPtr(new PrimaryKeyConstraint())); + tt.addConstraint({f.name()}, ConstraintPtr(new PrimaryKeyConstraint())); - QCOMPARE(tt.sql(), QString("CREATE TABLE `testtable` (\n" - "\t`a`\tinteger PRIMARY KEY AUTOINCREMENT,\n" - "\t`b`\tinteger\n" + QCOMPARE(tt.sql(), QString("CREATE TABLE \"testtable\" (\n" + "\t\"a\"\tinteger PRIMARY KEY AUTOINCREMENT,\n" + "\t\"b\"\tinteger\n" ") WITHOUT ROWID;")); } void TestTable::foreignKeys() { Table tt("testtable"); - FieldPtr f = FieldPtr(new Field("a", "integer")); - tt.addField(f); - tt.addConstraint({f}, sqlb::ConstraintPtr(new sqlb::ForeignKeyClause("b", QStringList("c")))); - - QCOMPARE(tt.sql(), QString("CREATE TABLE `testtable` (\n" - "\t`a`\tinteger,\n" - "\tFOREIGN KEY(`a`) REFERENCES `b`(`c`)\n" + Field f("a", "integer"); + tt.fields.push_back(f); + tt.addConstraint({f.name()}, sqlb::ConstraintPtr(new sqlb::ForeignKeyClause("b", QStringList("c")))); + + QCOMPARE(tt.sql(), QString("CREATE TABLE \"testtable\" (\n" + "\t\"a\"\tinteger,\n" + "\tFOREIGN KEY(\"a\") REFERENCES \"b\"(\"c\")\n" ");")); } void TestTable::uniqueConstraint() { Table tt("testtable"); - FieldPtr f1 = FieldPtr(new Field("a", "integer")); - FieldPtr f2 = FieldPtr(new Field("b", "integer")); - FieldPtr f3 = FieldPtr(new Field("c", "integer")); - f1->setUnique(true); - tt.addField(f1); - tt.addField(f2); - tt.addField(f3); - tt.addConstraint({f2, f3}, sqlb::ConstraintPtr(new sqlb::UniqueConstraint())); - - QCOMPARE(tt.sql(), QString("CREATE TABLE `testtable` (\n" - "\t`a`\tinteger UNIQUE,\n" - "\t`b`\tinteger,\n" - "\t`c`\tinteger,\n" - "\tUNIQUE(`b`,`c`)\n" + Field f1("a", "integer"); + Field f2("b", "integer"); + Field f3("c", "integer"); + f1.setUnique(true); + tt.fields.push_back(f1); + tt.fields.push_back(f2); + tt.fields.push_back(f3); + tt.addConstraint({f2.name(), f3.name()}, sqlb::ConstraintPtr(new sqlb::UniqueConstraint())); + + QCOMPARE(tt.sql(), QString("CREATE TABLE \"testtable\" (\n" + "\t\"a\"\tinteger UNIQUE,\n" + "\t\"b\"\tinteger,\n" + "\t\"c\"\tinteger,\n" + "\tUNIQUE(\"b\",\"c\")\n" ");")); } @@ -118,25 +174,26 @@ "\tinfo VARCHAR(255) CHECK (info == 'x')\n" ");"; - Table tab = *(Table::parseSQL(sSQL).dynamicCast()); + Table tab = *(std::dynamic_pointer_cast(Table::parseSQL(sSQL))); - QVERIFY(tab.name() == "hero"); - QVERIFY(tab.rowidColumn() == "_rowid_"); - QVERIFY(tab.fields().at(0)->name() == "id"); - QVERIFY(tab.fields().at(1)->name() == "name"); - QVERIFY(tab.fields().at(2)->name() == "info"); - - QVERIFY(tab.fields().at(0)->type() == "integer"); - QVERIFY(tab.fields().at(1)->type() == "text"); - QCOMPARE(tab.fields().at(2)->type(), QString("VARCHAR(255)")); - - FieldVector pk = tab.primaryKey(); - QVERIFY(tab.fields().at(0)->autoIncrement()); - QVERIFY(pk.size() == 1 && pk.at(0) == tab.fields().at(0)); - QVERIFY(tab.fields().at(1)->notnull()); - QCOMPARE(tab.fields().at(1)->defaultValue(), QString("'xxxx'")); - QCOMPARE(tab.fields().at(1)->check(), QString("")); - QCOMPARE(tab.fields().at(2)->check(), QString("info == 'x'")); + QCOMPARE(tab.name(), "hero"); + QCOMPARE(tab.rowidColumn(), "_rowid_"); + QCOMPARE(tab.fields.at(0).name(), "id"); + QCOMPARE(tab.fields.at(1).name(), "name"); + QCOMPARE(tab.fields.at(2).name(), "info"); + + QCOMPARE(tab.fields.at(0).type(), "integer"); + QCOMPARE(tab.fields.at(1).type(), "text"); + QCOMPARE(tab.fields.at(2).type(), QString("VARCHAR(255)")); + + QStringList pk = tab.primaryKey(); + QVERIFY(tab.fields.at(0).autoIncrement()); + QCOMPARE(pk.size(), 1); + QCOMPARE(pk.at(0), tab.fields.at(0).name()); + QVERIFY(tab.fields.at(1).notnull()); + QCOMPARE(tab.fields.at(1).defaultValue(), QString("'xxxx'")); + QCOMPARE(tab.fields.at(1).check(), QString("")); + QCOMPARE(tab.fields.at(2).check(), QString("info=='x'")); } void TestTable::parseSQLdefaultexpr() @@ -147,28 +204,29 @@ "date datetime default CURRENT_TIMESTAMP," "zoi integer)"; - Table tab = *(Table::parseSQL(sSQL).dynamicCast()); + Table tab = *(std::dynamic_pointer_cast(Table::parseSQL(sSQL))); QCOMPARE(tab.name(), QString("chtest")); - QCOMPARE(tab.fields().at(0)->name(), QString("id")); - QCOMPARE(tab.fields().at(1)->name(), QString("dumpytext")); - QCOMPARE(tab.fields().at(2)->name(), QString("date")); - QCOMPARE(tab.fields().at(3)->name(), QString("zoi")); - - QCOMPARE(tab.fields().at(0)->type(), QString("integer")); - QCOMPARE(tab.fields().at(1)->type(), QString("text")); - QCOMPARE(tab.fields().at(2)->type(), QString("datetime")); - QCOMPARE(tab.fields().at(3)->type(), QString("integer")); - - QCOMPARE(tab.fields().at(1)->defaultValue(), QString("('axa')")); - QCOMPARE(tab.fields().at(1)->check(), QString("dumpytext == \"aa\"")); - QCOMPARE(tab.fields().at(2)->defaultValue(), QString("CURRENT_TIMESTAMP")); - QCOMPARE(tab.fields().at(2)->check(), QString("")); - QCOMPARE(tab.fields().at(3)->defaultValue(), QString("")); - QCOMPARE(tab.fields().at(3)->check(), QString("")); - - sqlb::FieldVector pk = tab.primaryKey(); - QVERIFY(pk.size() == 1 && pk.at(0) == tab.fields().at(0)); + QCOMPARE(tab.fields.at(0).name(), QString("id")); + QCOMPARE(tab.fields.at(1).name(), QString("dumpytext")); + QCOMPARE(tab.fields.at(2).name(), QString("date")); + QCOMPARE(tab.fields.at(3).name(), QString("zoi")); + + QCOMPARE(tab.fields.at(0).type(), QString("integer")); + QCOMPARE(tab.fields.at(1).type(), QString("text")); + QCOMPARE(tab.fields.at(2).type(), QString("datetime")); + QCOMPARE(tab.fields.at(3).type(), QString("integer")); + + QCOMPARE(tab.fields.at(1).defaultValue(), QString("('axa')")); + QCOMPARE(tab.fields.at(1).check(), QString("dumpytext==\"aa\"")); + QCOMPARE(tab.fields.at(2).defaultValue(), QString("CURRENT_TIMESTAMP")); + QCOMPARE(tab.fields.at(2).check(), QString("")); + QCOMPARE(tab.fields.at(3).defaultValue(), QString("")); + QCOMPARE(tab.fields.at(3).check(), QString("")); + + QStringList pk = tab.primaryKey(); + QCOMPARE(pk.size(), 1); + QCOMPARE(pk.at(0), tab.fields.at(0).name()); } void TestTable::parseSQLMultiPk() @@ -177,63 +235,91 @@ "\tid1 integer,\n" "\tid2 integer,\n" "\tnonpkfield blob,\n" - "PRIMARY KEY(`id1`,`id2`)\n" + "PRIMARY KEY(\"id1\",\"id2\")\n" ");"; - Table tab = *(Table::parseSQL(sSQL).dynamicCast()); - - QVERIFY(tab.name() == "hero"); - QVERIFY(tab.fields().at(0)->name() == "id1"); - QVERIFY(tab.fields().at(1)->name() == "id2"); + Table tab = *(std::dynamic_pointer_cast(Table::parseSQL(sSQL))); - QVERIFY(tab.fields().at(0)->type() == "integer"); - QVERIFY(tab.fields().at(1)->type() == "integer"); - - sqlb::FieldVector pk = tab.primaryKey(); - QVERIFY(pk.size() == 2 && pk.at(0) == tab.fields().at(0) && pk.at(1) == tab.fields().at(1)); + QCOMPARE(tab.name(), "hero"); + QCOMPARE(tab.fields.at(0).name(), "id1"); + QCOMPARE(tab.fields.at(1).name(), "id2"); + + QCOMPARE(tab.fields.at(0).type(), "integer"); + QCOMPARE(tab.fields.at(1).type(), "integer"); + + QStringList pk = tab.primaryKey(); + QCOMPARE(pk.size(), 2); + QCOMPARE(pk.at(0), tab.fields.at(0).name()); + QCOMPARE(pk.at(1), tab.fields.at(1).name()); } void TestTable::parseSQLForeignKey() { QString sSQL = "CREATE TABLE grammar_test(id, test, FOREIGN KEY(test) REFERENCES other_table);"; - Table tab = *(Table::parseSQL(sSQL).dynamicCast()); + Table tab = *(std::dynamic_pointer_cast(Table::parseSQL(sSQL))); - QVERIFY(tab.name() == "grammar_test"); - QVERIFY(tab.fields().at(0)->name() == "id"); - QVERIFY(tab.fields().at(1)->name() == "test"); + QCOMPARE(tab.name(), "grammar_test"); + QCOMPARE(tab.fields.at(0).name(), "id"); + QCOMPARE(tab.fields.at(1).name(), "test"); } void TestTable::parseSQLSingleQuotes() { QString sSQL = "CREATE TABLE 'test'('id','test');"; - Table tab = *(Table::parseSQL(sSQL).dynamicCast()); + Table tab = *(std::dynamic_pointer_cast(Table::parseSQL(sSQL))); - QVERIFY(tab.name() == "test"); - QVERIFY(tab.fields().at(0)->name() == "id"); - QVERIFY(tab.fields().at(1)->name() == "test"); + QCOMPARE(tab.name(), "test"); + QCOMPARE(tab.fields.at(0).name(), "id"); + QCOMPARE(tab.fields.at(1).name(), "test"); } +void TestTable::parseSQLSquareBrackets() +{ + QString sSQL = "CREATE TABLE [test]([id],[test]);"; + + Table tab = *(std::dynamic_pointer_cast(Table::parseSQL(sSQL))); + + QCOMPARE(tab.name(), "test"); + QCOMPARE(tab.fields.at(0).name(), "id"); + QCOMPARE(tab.fields.at(1).name(), "test"); +} + + void TestTable::parseSQLKeywordInIdentifier() { QString sSQL = "CREATE TABLE deffered(key integer primary key, if text);"; - Table tab = *(Table::parseSQL(sSQL).dynamicCast()); + Table tab = *(std::dynamic_pointer_cast(Table::parseSQL(sSQL))); + + QCOMPARE(tab.name(), "deffered"); + QCOMPARE(tab.fields.at(0).name(), "key"); + QCOMPARE(tab.fields.at(1).name(), "if"); +} + - QVERIFY(tab.name() == "deffered"); - QVERIFY(tab.fields().at(0)->name() == "key"); - QVERIFY(tab.fields().at(1)->name() == "if"); +void TestTable::parseSQLSomeKeywordsInIdentifier() +{ + QString sSQL = "CREATE TABLE \"Average Number of Volunteers by Area of Work\" (" + "`Area of Work` TEXT," + "`Average Number of Volunteers` INTEGER);"; + + Table tab = *(std::dynamic_pointer_cast(Table::parseSQL(sSQL))); + + QCOMPARE(tab.name(), "Average Number of Volunteers by Area of Work"); + QCOMPARE(tab.fields.at(0).name(), "Area of Work"); + QCOMPARE(tab.fields.at(1).name(), "Average Number of Volunteers"); } void TestTable::parseSQLWithoutRowid() { QString sSQL = "CREATE TABLE test(a integer primary key, b integer) WITHOUT ROWID;"; - Table tab = *(Table::parseSQL(sSQL).dynamicCast()); + Table tab = *(std::dynamic_pointer_cast(Table::parseSQL(sSQL))); - QVERIFY(tab.fields().at(tab.findPk())->name() == "a"); - QVERIFY(tab.rowidColumn() == "a"); + QCOMPARE(tab.findPk()->name(), "a"); + QCOMPARE(tab.rowidColumn(), "a"); } void TestTable::parseNonASCIIChars() @@ -243,69 +329,82 @@ "PRIMARY KEY(`Fieldöäüß`)" ");"; - Table tab = *(Table::parseSQL(sSQL).dynamicCast()); + Table tab = *(std::dynamic_pointer_cast(Table::parseSQL(sSQL))); - QVERIFY(tab.name() == "lösung"); - QVERIFY(tab.fields().at(0)->name() == "Fieldöäüß"); + QCOMPARE(tab.name(), "lösung"); + QCOMPARE(tab.fields.at(0).name(), "Fieldöäüß"); +} + +void TestTable::parseNonASCIICharsEs() +{ + QString sSQL = "CREATE TABLE \"Cigüeñas de Alcalá\" (" + "\"Field áéíóúÁÉÍÓÚñÑçÇ\" INTEGER," + "PRIMARY KEY(\"Field áéíóúÁÉÍÓÚñÑçÇ\")" + ");"; + + Table tab = *(std::dynamic_pointer_cast(Table::parseSQL(sSQL))); + + QCOMPARE(tab.name(), "Cigüeñas de Alcalá"); + QCOMPARE(tab.fields.at(0).name(), "Field áéíóúÁÉÍÓÚñÑçÇ"); } void TestTable::parseSQLEscapedQuotes() { QString sSql = "CREATE TABLE double_quotes(a text default 'a''a');"; - Table tab = *(Table::parseSQL(sSql).dynamicCast()); + Table tab = *(std::dynamic_pointer_cast(Table::parseSQL(sSql))); QCOMPARE(tab.name(), QString("double_quotes")); - QCOMPARE(tab.fields().at(0)->name(), QString("a")); - QCOMPARE(tab.fields().at(0)->defaultValue(), QString("'a''a'")); + QCOMPARE(tab.fields.at(0).name(), QString("a")); + QCOMPARE(tab.fields.at(0).defaultValue(), QString("'a''a'")); } void TestTable::parseSQLForeignKeys() { QString sql = "CREATE TABLE foreign_key_test(a int, b int, foreign key (a) references x, foreign key (b) references w(y,z) on delete set null);"; - Table tab = *(Table::parseSQL(sql).dynamicCast()); + Table tab = *(std::dynamic_pointer_cast(Table::parseSQL(sql))); QCOMPARE(tab.name(), QString("foreign_key_test")); - QCOMPARE(tab.fields().at(0)->name(), QString("a")); - QCOMPARE(tab.fields().at(0)->type(), QString("int")); - QCOMPARE(tab.constraint({tab.fields().at(0)}, sqlb::Constraint::ForeignKeyConstraintType).dynamicCast()->table(), QString("x")); - QCOMPARE(tab.fields().at(1)->name(), QString("b")); - QCOMPARE(tab.fields().at(1)->type(), QString("int")); - QCOMPARE(tab.constraint({tab.fields().at(1)}, sqlb::Constraint::ForeignKeyConstraintType).dynamicCast()->toString(), QString("`w`(`y`,`z`) on delete set null")); + QCOMPARE(tab.fields.at(0).name(), QString("a")); + QCOMPARE(tab.fields.at(0).type(), QString("int")); + QCOMPARE(std::dynamic_pointer_cast(tab.constraint({tab.fields.at(0).name()}, sqlb::Constraint::ForeignKeyConstraintType))->table(), QString("x")); + QCOMPARE(tab.fields.at(1).name(), QString("b")); + QCOMPARE(tab.fields.at(1).type(), QString("int")); + QCOMPARE(std::dynamic_pointer_cast(tab.constraint({tab.fields.at(1).name()}, sqlb::Constraint::ForeignKeyConstraintType))->toString(), QString("\"w\"(\"y\",\"z\") on delete set null")); } void TestTable::parseSQLCheckConstraint() { - QString sql = "CREATE TABLE a (`b` text CHECK(`b`='A' or `b`='B'));"; + QString sql = "CREATE TABLE a (\"b\" text CHECK(\"b\"='A' or \"b\"='B'));"; - Table tab = *(Table::parseSQL(sql).dynamicCast()); + Table tab = *(std::dynamic_pointer_cast(Table::parseSQL(sql))); QCOMPARE(tab.name(), QString("a")); - QCOMPARE(tab.fields().at(0)->name(), QString("b")); - QCOMPARE(tab.fields().at(0)->type(), QString("text")); - QCOMPARE(tab.fields().at(0)->check(), QString("`b` = 'A' or `b` = 'B'")); + QCOMPARE(tab.fields.at(0).name(), QString("b")); + QCOMPARE(tab.fields.at(0).type(), QString("text")); + QCOMPARE(tab.fields.at(0).check(), QString("\"b\"='A' or \"b\"='B'")); } void TestTable::parseDefaultValues() { QString sql = "CREATE TABLE test(a int DEFAULT 0, b int DEFAULT -1, c text DEFAULT 'hello', d text DEFAULT '0');"; - Table tab = *(Table::parseSQL(sql).dynamicCast()); + Table tab = *(std::dynamic_pointer_cast(Table::parseSQL(sql))); QCOMPARE(tab.name(), QString("test")); - QCOMPARE(tab.fields().at(0)->name(), QString("a")); - QCOMPARE(tab.fields().at(0)->type(), QString("int")); - QCOMPARE(tab.fields().at(0)->defaultValue(), QString("0")); - QCOMPARE(tab.fields().at(1)->name(), QString("b")); - QCOMPARE(tab.fields().at(1)->type(), QString("int")); - QCOMPARE(tab.fields().at(1)->defaultValue(), QString("-1")); - QCOMPARE(tab.fields().at(2)->name(), QString("c")); - QCOMPARE(tab.fields().at(2)->type(), QString("text")); - QCOMPARE(tab.fields().at(2)->defaultValue(), QString("'hello'")); - QCOMPARE(tab.fields().at(3)->name(), QString("d")); - QCOMPARE(tab.fields().at(3)->type(), QString("text")); - QCOMPARE(tab.fields().at(3)->defaultValue(), QString("'0'")); + QCOMPARE(tab.fields.at(0).name(), QString("a")); + QCOMPARE(tab.fields.at(0).type(), QString("int")); + QCOMPARE(tab.fields.at(0).defaultValue(), QString("0")); + QCOMPARE(tab.fields.at(1).name(), QString("b")); + QCOMPARE(tab.fields.at(1).type(), QString("int")); + QCOMPARE(tab.fields.at(1).defaultValue(), QString("-1")); + QCOMPARE(tab.fields.at(2).name(), QString("c")); + QCOMPARE(tab.fields.at(2).type(), QString("text")); + QCOMPARE(tab.fields.at(2).defaultValue(), QString("'hello'")); + QCOMPARE(tab.fields.at(3).name(), QString("d")); + QCOMPARE(tab.fields.at(3).type(), QString("text")); + QCOMPARE(tab.fields.at(3).defaultValue(), QString("'0'")); } void TestTable::createTableWithIn() @@ -315,10 +414,10 @@ "value NVARCHAR(5) CHECK (value IN ('a', 'b', 'c'))" ");"; - Table tab = *(Table::parseSQL(sSQL).dynamicCast()); - QVERIFY(tab.name() == "not_working"); + Table tab = *(std::dynamic_pointer_cast(Table::parseSQL(sSQL))); + QCOMPARE(tab.name(), "not_working"); - QVERIFY(tab.fields().at(1)->check() == "value IN ( 'a' , 'b' , 'c' )"); + QCOMPARE(tab.fields.at(1).check(), "value IN ('a','b','c')"); } void TestTable::createTableWithNotLikeConstraint() @@ -329,18 +428,62 @@ "value3 TEXT CONSTRAINT 'value' CHECK(value3 NOT REGEXP 'prefix%'),\n" "value4 TEXT CONSTRAINT 'value' CHECK(value4 NOT GLOB 'prefix%'),\n" "value5 INTEGER CONSTRAINT 'value' CHECK(value5 BETWEEN 1+4 AND 100 OR 200),\n" - "value6 INTEGER CONSTRAINT 'value' CHECK(value6 NOT BETWEEN 1 AND 100),\n" - "value7 INTEGER CONSTRAINT 'value' CHECK(NOT EXISTS (1))\n" + "value6 INTEGER CONSTRAINT 'value' CHECK(value6 NOT BETWEEN 1 AND 100)\n" + ");"; + + Table tab = *(std::dynamic_pointer_cast(Table::parseSQL(sSQL))); + QCOMPARE(tab.name(), "hopefully_working"); + + QCOMPARE(tab.fields.at(0).check(), "value NOT LIKE 'prefix%'"); + QCOMPARE(tab.fields.at(1).check(), "value2 NOT MATCH 'prefix%'"); + QCOMPARE(tab.fields.at(2).check(), "value3 NOT REGEXP 'prefix%'"); + QCOMPARE(tab.fields.at(3).check(), "value4 NOT GLOB 'prefix%'"); + QCOMPARE(tab.fields.at(4).check(), "value5 BETWEEN 1+4 AND 100 OR 200"); + QCOMPARE(tab.fields.at(5).check(), "value6 NOT BETWEEN 1 AND 100"); +} + +void TestTable::rowValues() +{ + QString sql = "CREATE TABLE test(\n" + "a INTEGER,\n" + "b INTEGER,\n" + "CHECK((a, b) = (1, 2))\n" ");"; - Table tab = *(Table::parseSQL(sSQL).dynamicCast()); - QVERIFY(tab.name() == "hopefully_working"); + Table tab = *(std::dynamic_pointer_cast(Table::parseSQL(sql))); + QCOMPARE(tab.name(), "test"); + + QCOMPARE(std::dynamic_pointer_cast(tab.constraint({}, sqlb::Constraint::CheckConstraintType))->expression(), QString("(a,b)=(1,2)")); +} + +void TestTable::complexExpressions() +{ + QString sql = "CREATE TABLE test(\n" + "a INTEGER CHECK((a > 0)),\n" + "b INTEGER CHECK((b > 0 and b > 1)),\n" + "c INTEGER CHECK((c = -1) or (c > 0 and c > 1) or (c = 0)),\n" + "d INTEGER CHECK((((d > 0))))\n" + ");"; + + Table tab = *(std::dynamic_pointer_cast(Table::parseSQL(sql))); + QCOMPARE(tab.name(), "test"); + + QCOMPARE(tab.fields.at(0).check(), "(a>0)"); + QCOMPARE(tab.fields.at(1).check(), "(b>0 and b>1)"); + QCOMPARE(tab.fields.at(2).check(), "(c=-1) or (c>0 and c>1) or (c=0)"); + QCOMPARE(tab.fields.at(3).check(), "(((d>0)))"); +} + +void TestTable::datetimeExpression() +{ + QString sql = "CREATE TABLE test(\n" + "entry INTEGER DEFAULT (DATETIME(CURRENT_TIMESTAMP, 'LOCALTIME'))\n" + ");"; + + Table tab = *(std::dynamic_pointer_cast(Table::parseSQL(sql))); + QCOMPARE(tab.name(), "test"); - QVERIFY(tab.fields().at(0)->check() == "value NOT LIKE 'prefix%'"); - QVERIFY(tab.fields().at(1)->check() == "value2 NOT MATCH 'prefix%'"); - QVERIFY(tab.fields().at(2)->check() == "value3 NOT REGEXP 'prefix%'"); - QVERIFY(tab.fields().at(3)->check() == "value4 NOT GLOB 'prefix%'"); - QVERIFY(tab.fields().at(4)->check() == "value5 BETWEEN 1 + 4 AND 100 OR 200"); - QVERIFY(tab.fields().at(5)->check() == "value6 NOT BETWEEN 1 AND 100"); - QVERIFY(tab.fields().at(6)->check() == "NOT EXISTS ( 1 )"); + QCOMPARE(tab.fields.at(0).name(), "entry"); + QCOMPARE(tab.fields.at(0).type(), "INTEGER"); + QCOMPARE(tab.fields.at(0).defaultValue(), "(DATETIME(CURRENT_TIMESTAMP,'LOCALTIME'))"); } diff -Nru sqlitebrowser-3.10.100ubuntu1/src/tests/testsqlobjects.h sqlitebrowser-3.11.1/src/tests/testsqlobjects.h --- sqlitebrowser-3.10.100ubuntu1/src/tests/testsqlobjects.h 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/src/tests/testsqlobjects.h 2019-02-19 23:51:34.000000000 +0000 @@ -8,6 +8,8 @@ Q_OBJECT private slots: void sqlOutput(); + void sqlGraveAccentOutput(); + void sqlSquareBracketsOutput(); void autoincrement(); void notnull(); void withoutRowid(); @@ -15,19 +17,25 @@ void uniqueConstraint(); void parseSQL(); + void parseSQLSquareBrackets(); void parseSQLdefaultexpr(); void parseSQLMultiPk(); void parseSQLForeignKey(); void parseSQLSingleQuotes(); void parseSQLKeywordInIdentifier(); + void parseSQLSomeKeywordsInIdentifier(); void parseSQLWithoutRowid(); void parseNonASCIIChars(); + void parseNonASCIICharsEs(); void parseSQLEscapedQuotes(); void parseSQLForeignKeys(); void parseSQLCheckConstraint(); void parseDefaultValues(); void createTableWithIn(); void createTableWithNotLikeConstraint(); + void rowValues(); + void complexExpressions(); + void datetimeExpression(); }; #endif diff -Nru sqlitebrowser-3.10.100ubuntu1/src/translations/flags/flags.qrc sqlitebrowser-3.11.1/src/translations/flags/flags.qrc --- sqlitebrowser-3.10.100ubuntu1/src/translations/flags/flags.qrc 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/src/translations/flags/flags.qrc 2019-02-19 23:51:34.000000000 +0000 @@ -6,6 +6,7 @@ es.png us.png fr.png + it.png ru.png cn.png br.png @@ -15,5 +16,6 @@ tr.png ua.png eg.png + pl.png Binary files /tmp/tmp6Z6cU5/j7Ppk8t7g0/sqlitebrowser-3.10.100ubuntu1/src/translations/flags/it.png and /tmp/tmp6Z6cU5/0KfjjA5oc3/sqlitebrowser-3.11.1/src/translations/flags/it.png differ Binary files /tmp/tmp6Z6cU5/j7Ppk8t7g0/sqlitebrowser-3.10.100ubuntu1/src/translations/flags/pl.png and /tmp/tmp6Z6cU5/0KfjjA5oc3/sqlitebrowser-3.11.1/src/translations/flags/pl.png differ diff -Nru sqlitebrowser-3.10.100ubuntu1/src/translations/sqlb_ar_SA.ts sqlitebrowser-3.11.1/src/translations/sqlb_ar_SA.ts --- sqlitebrowser-3.10.100ubuntu1/src/translations/sqlb_ar_SA.ts 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/src/translations/sqlb_ar_SA.ts 2019-02-19 23:51:34.000000000 +0000 @@ -15,99 +15,221 @@ + <html><head/><body><p>DB Browser for SQLite is an open source, freeware visual tool used to create, design and edit SQLite database files.</p><p>It is bi-licensed under the Mozilla Public License Version 2, as well as the GNU General Public License Version 3 or later. You can modify or redistribute it under the conditions of these licenses.</p><p>See <a href="http://www.gnu.org/licenses/gpl.html">http://www.gnu.org/licenses/gpl.html</a> and <a href="https://www.mozilla.org/MPL/2.0/index.txt">https://www.mozilla.org/MPL/2.0/index.txt</a> for details.</p><p>For more information on this program please visit our website at: <a href="http://sqlitebrowser.org">http://sqlitebrowser.org</a></p><p><span style=" font-size:small;">This software uses the GPL/LGPL Qt Toolkit from </span><a href="http://qt-project.org/"><span style=" font-size:small;">http://qt-project.org/</span></a><span style=" font-size:small;"><br/>See </span><a href="http://qt-project.org/doc/qt-5/licensing.html"><span style=" font-size:small;">http://qt-project.org/doc/qt-5/licensing.html</span></a><span style=" font-size:small;"> for licensing terms and information.</span></p><p><span style=" font-size:small;">It also uses the Silk icon set by Mark James licensed under a Creative Commons Attribution 2.5 and 3.0 license.<br/>See </span><a href="http://www.famfamfam.com/lab/icons/silk/"><span style=" font-size:small;">http://www.famfamfam.com/lab/icons/silk/</span></a><span style=" font-size:small;"> for details.</span></p></body></html> + <html><head/><body><p>«متصفّح قواعد بيانات SQLite» أداة رسوميّة مفتوحة المصدر ومجانية، تُستخدم لإنشاء ملفّات قواعد بيانات SQLite وتصميمها وتحريرها.</p><p>الأداة مرخّصة برخصتين، الإصدارة الثانية من رخصة موزيلا العمومية، والإصدارة الثالثة وما بعدها من رخصة غنو العمومية. يمكنك تعديل الأداة أو إعادة توزيعها بشروط تلك الرخص.</p><p>طالع <a href="http://www.gnu.org/licenses/gpl.html">http://www.gnu.org/licenses/gpl.html</a> و<a href="https://www.mozilla.org/MPL/2.0/index.txt">https://www.mozilla.org/MPL/2.0/index.txt</a> للتفاصيل.</p><p>من فضلك زُر موقع الوِب هذا لمعلومات أكثر عن البرمجية: <a href="http://sqlitebrowser.org">http://sqlitebrowser.org</a></p><p><span style=" font-size:small;">تستخدم هذه البرمجية عُدّة أدوات كيوت المرخّصة تحت GPL/LGPL وذلك من </span><a href="http://qt-project.org/"><span style=" font-size:small;">http://qt-project.org/</span></a><span style=" font-size:small;"><br/>طالع </span><a href="http://qt-project.org/doc/qt-5/licensing.html"><span style=" font-size:small;">http://qt-project.org/doc/qt-5/licensing.html</span></a><span style=" font-size:small;"> لشروط الترخيص والمعلومات.</span></p><p><span style=" font-size:small;">تستخدم البرمجية أيضًا طقم أيقونات الحرير/Silk للمؤلّف Mark James المرخّصة برخصة المشاع الإبداعي - النسبة ٢٫٥ و٣٫٠.<br/>طالع </span><a href="http://www.famfamfam.com/lab/icons/silk/"><span style=" font-size:small;">http://www.famfamfam.com/lab/icons/silk/</span></a><span style=" font-size:small;"> للتفاصيل.</span></p></body></html> + + <html><head/><body><p>DB Browser for SQLite is an open source, freeware visual tool used to create, design and edit SQLite database files.</p><p>It is bi-licensed under the Mozilla Public License Version 2, as well as the GNU General Public License Version 3 or later. You can modify or redistribute it under the conditions of these licenses.</p><p>See <a href="http://www.gnu.org/licenses/gpl.html"><span style=" text-decoration: underline; color:#0000ff;">http://www.gnu.org/licenses/gpl.html</span></a> and <a href="https://www.mozilla.org/MPL/2.0/index.txt"><span style=" text-decoration: underline; color:#0000ff;">https://www.mozilla.org/MPL/2.0/index.txt</span></a> for details.</p><p>For more information on this program please visit our website at: <a href="http://sqlitebrowser.org"><span style=" text-decoration: underline; color:#0000ff;">http://sqlitebrowser.org</span></a></p><p><span style=" font-size:small;">This software uses the GPL/LGPL Qt Toolkit from </span><a href="http://qt-project.org/"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://qt-project.org/</span></a><span style=" font-size:small;"><br/>See </span><a href="http://qt-project.org/doc/qt-5/licensing.html"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://qt-project.org/doc/qt-5/licensing.html</span></a><span style=" font-size:small;"> for licensing terms and information.</span></p><p><span style=" font-size:small;">It also uses the Silk icon set by Mark James licensed under a Creative Commons Attribution 2.5 and 3.0 license.<br/>See </span><a href="http://www.famfamfam.com/lab/icons/silk/"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://www.famfamfam.com/lab/icons/silk/</span></a><span style=" font-size:small;"> for details.</span></p></body></html> - <html dir="rtl"><head/><body><p>«متصفّح قواعد بيانات SQLite» أداة رسوميّة مفتوحة المصدر ومجّانيّة، تُستخدم لإنشاء ملفّات قواعد بيانات SQLite وتصميمها وتحريرها.</p><p>الأداة مرخّصة برخصتين، الإصدارة الثّانية من رخصة موزيلا العموميّة، والإصدارة الثّالثة وما بعدها من رخصة غنو العموميّة. يمكنك تعديل الأداة أو إعادة توزيعها بشروط تلك الرّخص. -</p><p>طالع <a href="http://www.gnu.org/licenses/gpl.html"><span style=" text-decoration: underline; color:#0000ff;">http://www.gnu.org/licenses/gpl.html</span></a> و<a href="https://www.mozilla.org/MPL/2.0/index.txt"><span style=" text-decoration: underline; color:#0000ff;">https://www.mozilla.org/MPL/2.0/index.txt</span></a> للتّفاصيل.</p><p>لمعلومات أكثر عن البرمجيّة، فضلًا زُر موقع الوبّ هذا: <a href="http://sqlitebrowser.org"><span style=" text-decoration: underline; color:#0000ff;">http://sqlitebrowser.org</span></a></p><p><span style=" font-size:small;">تستخدم هذه البرمجيّة عدّة أدوات كيوت المرخّصة تحت GPL/LGPL وذلك من </span><a href="http://qt-project.org/"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://qt-project.org/</span></a><span style=" font-size:small;"><br/>طالع </span><a href="http://qt-project.org/doc/qt-5/licensing.html"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://qt-project.org/doc/qt-5/licensing.html</span></a><span style=" font-size:small;"> لشروط التّرخيص والمعلومات.</span></p><p><span style=" font-size:small;">تستخدم البرمجيّة أيضًا طقم أيقونات الحرير/Silk ل‍ Mark James المرخّصة برخصة المشاع الإبداعي - النّسبة 2.5 و 3.0.<br/>طالع </span><a href="http://www.famfamfam.com/lab/icons/silk/"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://www.famfamfam.com/lab/icons/silk/</span></a><span style=" font-size:small;"> للتّفاصيل.</span></p></body></html> + <html dir="rtl"><p>«متصفّح قواعد بيانات SQLite» أداة رسوميّة مفتوحة المصدر ومجانية، تُستخدم لإنشاء ملفّات قواعد بيانات SQLite وتصميمها وتحريرها.</p><p>الأداة مرخّصة برخصتين، الإصدارة الثانية من رخصة موزيلا العمومية، والإصدارة الثالثة وما بعدها من رخصة غنو العمومية. يمكنك تعديل الأداة أو إعادة توزيعها بشروط تلك الرخص.</p><p>طالع <a href="http://www.gnu.org/licenses/gpl.html"><span style=" text-decoration: underline; color:#0000ff;">http://www.gnu.org/licenses/gpl.html</span></a> و<a href="https://www.mozilla.org/MPL/2.0/index.txt"><span style=" text-decoration: underline; color:#0000ff;">https://www.mozilla.org/MPL/2.0/index.txt</span></a> للتفاصيل.</p><p>من فضلك زُر موقع الوِب هذا لمعلومات أكثر عن البرمجية: <a href="http://sqlitebrowser.org"><span style=" text-decoration: underline; color:#0000ff;">http://sqlitebrowser.org</span></a></p><p><span style=" font-size:small;">تستخدم هذه البرمجية عُدّة أدوات كيوت المرخّصة تحت GPL/LGPL وذلك من </span><a href="http://qt-project.org/"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://qt-project.org</span></a><span style=" font-size:small;"><br/>طالع </span><a href="http://qt-project.org/doc/qt-5/licensing.html"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://qt-project.org/doc/qt-5/licensing.html</span></a><span style=" font-size:small;"> لشروط الترخيص والمعلومات.</span></p><p><span style=" font-size:small;">تستخدم البرمجية أيضًا طقم أيقونات الحرير/Silk للمؤلّف Mark James المرخّصة برخصة المشاع الإبداعي - النسبة ٢٫٥ و٣٫٠.<br/>طالع </span><a href="http://www.famfamfam.com/lab/icons/silk/"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://www.famfamfam.com/lab/icons/silk/</span></a><span style=" font-size:small;"> للتفاصيل.</span></p></html> + + + + (based on SQLite %1) + (مبنيّ على SQLite %1) - + Version الإصدارة - + Qt Version - إصدارة كيوت + إصدارة كيوت: - + SQLCipher Version - إصدارة SQLCipher ‏ + إصدارة SQLCipher: ‏ - + SQLite Version - إصدارة SQLite ‏ + إصدارة SQLite: ‏ + + + + AddRecordDialog + + + Add New Record + أضِف سجلًا جديدًا + + + + Enter values for the new record considering constraints. Fields in bold are mandatory. + أدخِل القيم للسجلّ الجديد بأخذ القيود بعين الاعتبار. الحقول الثخينة ضرورية. + + + + In the Value column you can specify the value for the field identified in the Name column. The Type column indicates the type of the field. Default values are displayed in the same style as NULL values. + يمكنك تحديد قيمة الحقل المحدّد في عمود ”الاسم“ وذلك في عمود ”القيمة“. يُشير عمود ”النوع“ إلى نوع الحقل. تُعرض القيم المبدئية بنفس نمط قيم NULL. + + + + Name + الاسم + + + + Type + النوع + + + + Value + القيمة + + + + Values to insert. Pre-filled default values are inserted automatically unless they are changed. + القيم التي ستُدرج. تُدرج القيم المبدئية المعبّأة مسبقًا آليًا لو لم تتغيّر. + + + + When you edit the values in the upper frame, the SQL query for inserting this new record is shown here. You can edit manually the query before saving. + عندما تحرّر القيم في الإطار أعلاه، ستظهر هنا إفادة SQL لإدراج هذا السجلّ. يمكنك تحرير الإفادة يدويًا قبل الحفظ. + + + + <html><head/><body><p><span style=" font-weight:600;">Save</span> will submit the shown SQL statement to the database for inserting the new record.</p><p><span style=" font-weight:600;">Restore Defaults</span> will restore the initial values in the <span style=" font-weight:600;">Value</span> column.</p><p><span style=" font-weight:600;">Cancel</span> will close this dialog without executing the query.</p></body></html> + <p>سيُرسل زرّ <span style=" font-weight:600;">احفظ</span> إفادة SQL الظاهرة إلى قاعدة البيانات لإدراج السجلّ الجديد.</p><p>سيستعيد زرّ <span style=" font-weight:600;">استعد المبدئيات</span> القيمة الأولية في عمود ”<span style=" font-weight:600;">القيمة</span>“.</p><p>سيُغلق زرّ <span style=" font-weight:600;">ألغِ</span> هذا الحواريّ دون تنفيذ الاستعلام.</p> + + + + Auto-increment + + زيادة آليّة + + + + Unique constraint + + قيد ”فريد“ + + + + Check constraint: %1 + + قيد الفحص: %L1 + + + + + Foreign key: %1 + + المفتاح الأجنبي: %L1 + + + + + Default value: %1 + + القيمة المبدئية: %L1 + + + + + Error adding record. Message from database engine: + +%1 + خطأ أثناء إضافة السجلّ. الرسالة من محرّك قواعد البيانات: + +%L1 + + + + Are you sure you want to restore all the entered values to their defaults? + أمتأكّد من استعادة كلّ القيم المُدخلة إلى مبدئياتها؟ Application - + Usage: %1 [options] [db] - ‎الاستخدام:‎ %1 [options] [db] + ‎الاستخدام:‎ %L1 [options] [db] - + Possible command line arguments: معطيات سطر الأوامر الممكنة: - + -h, --help Show command line options - -h, --help أظهر خيارات سطر الأوامر + -h, --help اعرض خيارات سطر الأوامر - + -s, --sql [file] Execute this SQL file after opening the DB - -s, --sql [ملفّ]‎ ‫نفّذ ملفّ SQL هذا بعد فتح قاعدة البيانات + -s, --sql [ملف]‎ ‫نفّذ ملف SQL المذكور بعد فتح قاعدة البيانات - + -t, --table [table] Browse this table after opening the DB - -t, --table [جدول]‎ تصفّح هذا الجدول بعد فتح قاعدة البيانات + -t, --table [جدول]‎ تصفّح الجدول المذكور بعد فتح قاعدة البيانات + + + + -o, --option [group/setting=value] Run application with this setting temporarily set to value + + + + + This is DB Browser for SQLite version %1. + هذا «متصفّح قواعد بيانات» للإصدارة %L1 من SQLite. - + -q, --quit Exit application after running scripts - -q, --quit أنهِ التّطبيق بعد تشغيل السّكربتات + -q, --quit أنهِ التطبيق بعد تشغيل السكربتات + + + + -R, --read-only Open database in read-only mode + -R, --read-only افتح قاعدة البيانات بوضع القراءة فقط - + -v, --version Display the current version - + -v, --version اعرض الإصدارة الحالية - + [file] Open this SQLite database - ‎ [ملفّ]‎ ‫افتح قاعدة SQLite هذه + ‎ [ملف]‎ ‫افتح قاعدة بيانات SQLite المذكورة - This is DB Browser for SQLite version %1%2. - + هذا «متصفّح قواعد بيانات» للإصدارة %L1%L2 من SQLite. - + The -s/--sql option requires an argument - يتطلّب الخيار ‎-s/--sql معطى + يتطلّب الخيار ‎-s/--sql معطًى - + The file %1 does not exist - الملفّ %1 غير موجود + الملف %L1 غير موجود - + The -t/--table option requires an argument - يتطلّب الخيار ‎-t/--table معطى + يتطلّب الخيار ‎-t/--table معطًى + + + + The -o/--option option requires an argument in the form group/setting=value + - + Invalid option/non-existant file: %1 - خيار غير صالح/ملف غير موجود: %1 + خيار غير صالح/ملف غير موجود: %L1 @@ -120,49 +242,49 @@ &Password - &كلمة المرور + &كلمة السر &Reenter password - أ&عد إدخال كلمة المرور + أ&عِد إدخال كلمة السر Page si&ze - + م&قاس الصفحة - + Passphrase - + عبارة السر - + Raw key - + المفتاح خام Page &size ح&جم الصّفحة - + Please set a key to encrypt the database. Note that if you change any of the other, optional, settings you'll need to re-enter them as well every time you open the database file. Leave the password fields empty to disable the encryption. The encryption process might take some time and you should have a backup copy of your database! Unsaved changes are applied before modifying the encryption. - فضلًا اضبط مفتاحًا لتعمية قاعدة البيانات. -لاحظ أنّك إن غيّرت أيًّا من الإعدادات الأخرى (الاختياريّة)، سيكون عليك إعادة إدخالها أيضًا كلّ مرّة تفتح فيها ملفّ قاعدة البيانات. -اترك حقول كلمة المرور فارغة لتعطيل التّعمية. -قد تأخذ عمليّة التّعمية وقتًا وعليك الاحتفاظ بنسخة من قاعدة البيانات احتياطًا! ستُطبّق التّعديلات غير المحفوظة قبل تعديل التّعمية. + من فضلك اضبط مفتاحًا لتعمية قاعدة البيانات. +لاحظ أنه إن غيّرت أيًا من الإعدادات الأخرى (الاختيارية)، فسيكون عليك إعادة إدخالها أيضًا في كلّ مرّة تفتح فيها ملف قاعدة البيانات. +اترك حقول كلمة السر فارغة لتعطيل التعمية. +قد تأخذ عملية التعمية وقتًا وعليك الاحتفاظ بنسخة من قاعدة البيانات احتياطًا! ستُطبّق التعديلات غير المحفوظة قبل تعديل التعمية. - + Please enter the key used to encrypt the database. If any of the other settings were altered for this database file you need to provide this information as well. - فضلًا أدخل المفتاح المستخدم المستخدم لتعمية قاعدة البيانات. -إن كانت هناك معلومات أخرى قد تغيّرت في ملفّ قاعدة البيانات هذا، فعليك توفيرها أيضًا. + من فضلك أدخِل المفتاح المستخدم لتعمية قاعدة البيانات. +إن كانت هناك معلومات أخرى قد تغيّرت في ملف قاعدة البيانات هذا، فعليك توفيرها أيضًا. @@ -170,85 +292,100 @@ Choose display format - اختر نسق العرض + اختر تنسيق العرض Display format - نسق العرض + تنسيق العرض Choose a display format for the column '%1' which is applied to each value prior to showing it. - اختر نسق عرض للعمود '%1' ليُطبّق على كلّ قيمة قبل عرضها. + اختر تنسيق عرض العمود ”%L1“ ليُطبّق على كلّ قيمة قبل عرضها. Default - الافتراضيّ + المبدئي - + Decimal number - الأعداد العشريّة + عدد عشري - + Exponent notation - التّدوين الأسسيّ + تدوين أُسّي - + Hex blob - ‏BLOB سداسيّ + ‏BLOB ستّ‌عشري - + Hex number - الأعداد السّداسيّة + عدد ستّ‌عشري - + Apple NSDate to date - + ”تاريخ آبل/Apple NSDate“ إلى تاريخ - + + Java epoch (milliseconds) to date + عَصر جاڤا (ملّي‌ثانية) إلى تاريخ + + + Julian day to date - الأيّام الجوليانيّة إلى تواريخ + يوم جولياني إلى تاريخ - + + Unix epoch to local time + عَصر لينكس إلى الوقت المحلي + + + + Date as dd/mm/yyyy + التاريخ بنسق dd/mm/yyyy + + + Lower case - الحالة الصّغيرة + حالة الأحرف صغيرة - + Octal number - الأعداد الثّمانيّة + عدد ثماني - + Round number - الأعداد التّقريبيّة + عدد تقريبي - + Unix epoch to date - عصر لينكس إلى تواريخ + عَصر لينكس إلى تاريخ - + Upper case - الحالة الكبيرة + حالة الأحرف كبيرة - + Windows DATE to date - تواريخ DATE وندوز إلى تواريخ + ”تاريخ وندوز/Windows DATE“ إلى تاريخ - + Custom مخصّص @@ -256,38 +393,38 @@ DBBrowserDB - + Please specify the database name under which you want to access the attached database - فضلًا اختر اسم قاعدة البيانات حيث تريد أن تصل إلى قاعدة البيانات المرفقة + من فضلك اختر اسم قاعدة البيانات حيث تريد أن تصل إلى قاعدة البيانات المرفقة - + Invalid file format - + تنسيق الملف غير صالح - + Do you want to save the changes made to the database file %1? - أتريد حفظ التّعديلات المُجراة على ملفّ قاعدة البيانات %1؟ + أتريد حفظ التعديلات المُجراة على ملف قاعدة البيانات %L1؟ - + Exporting database to SQL file... - يصدّر قاعدة البيانات إلى ملفّ SQL... + يصدّر قاعدة البيانات إلى ملف SQL... - - + + Cancel ألغِ - + Executing SQL... ينفّذ SQL... - + Action cancelled. أُلغي الإجراء. @@ -302,166 +439,228 @@ ‏renameColumn: تعذّر إيجاد الجدول %1. - - + + This database has already been attached. Its schema name is '%1'. + أُرفقت قاعدة البيانات هذه بالفعل. اسم المخطّط هو ”%L1“. + + + + Do you really want to close this temporary database? All data will be lost. + أمتأكّد من إغلاق قاعدة البيانات المؤقّتة هذه؟ ستفقد كلّ البيانات. + + + + The database is currently busy: + قاعدة البيانات مشغولة حاليًا: + + + + Do you want to abort that other operation? + أتريد إجهاض العملية الأخرى؟ + + + + + No database file opened + لم يُفتح ملف قاعدة بيانات + + + + Error in statement #%1: %2. Aborting execution%3. - + خطأ في الإفادة رقم %L1: %L2. +سأُجهض التنفيذ%L3. - - + + and rolling back - + وأُرجع ما كان موجودًا. + + + + Cannot delete this object + تعذّر حذف هذا الكائن - + Cannot set data on this object - + تعذّر ضبط البيانات على هذا الكائن - + + A table with the name '%1' already exists in schema '%2'. + هناك جدول بنفس الاسم ”%L1“ بالفعل في المخطّط ”%L2“. + + + renameColumn: cannot find column %1. - ‏renameColumn: تعذّر إيجاد العمود %1. + ‏renameColumn: تعذّر العثور على العمود %L1. - + renameColumn: creating savepoint failed. DB says: %1 - ‏renameColumn: فشل إنشاء نقطة الحفظ. تقول قاعدة البيانات: %1 + ‏renameColumn: فشل إنشاء نقطة الحفظ. تقول قاعدة البيانات: %L1 - + renameColumn: creating new table failed. DB says: %1 - ‏renameColumn: فشل إنشاء جدول جديد. تقول قاعدة البيانات: %1 + ‏renameColumn: فشل إنشاء جدول جديد. تقول قاعدة البيانات: %L1 - + renameColumn: copying data to new table failed. DB says: %1 ‏renameColumn: فشل نسخ البيانات إلى جدول جديد. تقول قاعدة البيانات: -%1 +%L1 - + renameColumn: deleting old table failed. DB says: %1 - ‏renameColumn: فشل حذف الجدول القديم. تقول قاعدة البيانات: %1 + ‏renameColumn: فشل حذف الجدول القديم. تقول قاعدة البيانات: %L1 - + Restoring some of the objects associated with this table failed. This is most likely because some column names changed. Here's the SQL statement which you might want to fix and execute manually: - فشلت استعادة بعض الكائنات المرتبطة بهذا الجدول. هذا غالبًا يحصل بسبب تغيّر اسم الأعمدة. هذه إفادة SQL التي قد ترغب بتنفيذها لإصلاح هذا يدويًّا: + فشلت استعادة بعض الكائنات المرتبطة بهذا الجدول. غالبًا ما يحدث هذا بسبب تغيّر اسم الأعمدة. هذه إفادة SQL التي قد ترغب بتنفيذها لإصلاح الأمر يدويًا: - + renameColumn: releasing savepoint failed. DB says: %1 - ‏renameColumn: فشل إطلاق نقطة الحفظ. تقول قاعدة البيانات: %1 + ‏renameColumn: فشل إطلاق نقطة الحفظ. تقول قاعدة البيانات: %L1 - + Error renaming table '%1' to '%2'.Message from database engine: %3 - خطأ في إعادة تسمية الجدول '%1' إلى '%2'. الرّسالة من محرّك قاعدة البيانات: -%3 + خطأ أثناء تغيير اسم الجدول ”%L1“ إلى ”%L2“. الرسالة من محرّك قواعد البيانات: +%L3 - + ... <string can not be logged, contains binary data> ... - ... <لا يمكن تسجيل السّلسلة، فهي تحوي بيانات ثنائيّة> ... + ... <لا يمكن تسجيل السلسلة النصّية، فهي تحتوي على بيانات ثنائيّة> ... + + + + could not get list of databases: %1 + تعذّر جلب قائمة قواعد البيانات: %L1 - + + Error loading extension: %1 + خطأ أثناء تحميل الامتداد: %L1 + + + could not get column information - + تعذّر جلب معلومات العمود unknown object type %1 نوع الكائن %1 مجهول - + could not get list of db objects: %1, %2 - تعذّر جلب قائمة بكائنات قاعدة البيانات: %1، %2 + تعذّر جلب قائمة بكائنات قاعدة البيانات: %L1، ‏%L2 could not get types تعذّر جلب الأنواع - + didn't receive any output from pragma %1 - لم أستقبل أيّ خرج من pragma %1 + حافظ المكان بالإنجليزية ولا يُترجم + لم أستقبل أيّ خرج من pragma %L1 - + could not execute pragma command: %1, %2 - تعذّر تنفيذ أمر pragma:‏ %1، %2 + تعذّر تنفيذ أمر pragma:‏ %L1، ‏%L2 - + Error setting pragma %1 to %2: %3 - تعذّر ضبط pragma‏ %1 إلى %2:‏ %3 + تعذّر ضبط pragma %L1 إلى %L2:‏ %L3 - + File not found. - لم أجد الملفّ. + تعذّر العثور على الملف. DbStructureModel - + Name الاسم - + Object الكائن - + Type - النّوع + النوع - + Schema المخطّط - Browsables (%1) - + ما يمكن تصفّحه (%L1) - - All - + + Database + قاعدة البيانات - Tables (%1) - الجداول (%1) + Browsables + ما يمكن تصفّحه + All + الكلّ + + + + Temporary + مؤقّتة + + + + Tables (%1) + الجداول (%L1) + + + Indices (%1) - الفهارس (%1) + الفهارس (%L1) - + Views (%1) - العروض (%1) + المناظير (%L1) - + Triggers (%1) - المحفّزات (%1) + المحفّزات (%L1) @@ -477,171 +676,387 @@ الوضع: - + + This is the list of supported modes for the cell editor. Choose a mode for viewing or editing the data of the current cell. + هذه قائمة بالنماذج المتوفّرة في محرّر الخلايا. اختر وضعًا لعرض أو تحرير البيانات في الخليّة الحالية. + + + Text نصّيّ - + Binary ثنائيّ - - + Image صوريّ + + JSON + JSON + + + + XML + XML + + + + + Automatically adjust the editor mode to the loaded data type + اضبط وضع المحرّر آليًا على نوع البيانات المحمّل + + - Import text - استورد نصًّا + This checkable button enables or disables the automatic switching of the editor mode. When a new cell is selected or new data is imported and the automatic switching is enabled, the mode adjusts to the detected data type. You can then change the editor mode manually. If you want to keep this manually switched mode while moving through the cells, switch the button off. + هذا الزرّ الذي يمكن تأشيره يُفعّل أو يُعطّل التبديل الآلي لوضع المحرّر. عند تحديد خليّة جديدة أو استيراد بيانات جديدة والتبديل الآلي مفعّل، سيُضبط الوضع على نوع البيانات المكتشف. يمكنك بعدها تغيير وضع المحرّر يدويًا. إن أردت إبقاء الوضع الذي بدّلته يدويًا هذا عند التنقّل بين الخلايا، عطّل هذا الزرّ. + Auto-switch + التبديل الآلي + + + + + Auto-format: pretty print on loading, compact on saving. + التنسيق الآلي: طباعة جميلة عند التحميل، رصّ عند الحفظ. + + + + When enabled, the auto-format feature formats the data on loading, breaking the text in lines and indenting it for maximum readability. On data saving, the auto-format feature compacts the data removing end of lines, and unnecessary whitespace. + إن فُعّل، ستُنسّق ميزة التنسيق الآلي البيانات عند تحميلها، بكسر النصوص في أسطر وإزاحتها لأفضل قراءة. عند حفظ البيانات، سترصّ ميزة التنسيق الآلي البيانات بإزالة الأسطر والمسافات غير الضرورية. + + + + Autoformat + التنسيق الآلي + + + + Import from file + استورِد من ملف + + + + Opens a file dialog used to import any kind of data to this database cell. + يفتح حواريّ ملفات يُستخدم لاستيراد أيّ نوع من البيانات في خليّة قاعدة البيانات هذه. + + + + Export to file + صدّر إلى ملف + + + + Opens a file dialog used to export the contents of this database cell to a file. + يفتح حواريّ ملفات يُستخدم لتصدير محتويات خليّة قاعدة البيانات هذه إلى ملف. + + + + + Print... + اطبع... + + + + Open preview dialog for printing displayed image + يفتح حواريّ المعاينة لطباعة الصورة المعروضة + + + + + Ctrl+P + Ctrl+P + + + + Open preview dialog for printing displayed text + يفتح حواريّ المعاينة لطباعة النص المعروض + + + + Copy Hex and ASCII + انسخ Hex وآسكي + + + + Copy selected hexadecimal and ASCII columns to the clipboard + انسخ الأعمدة الستّ‌عشرية وآسكي المحدّدة إلى الحافظة + + + + Ctrl+Shift+C + Ctrl+Shift+C + + + Import text + استورِد نصًا + + Opens a file dialog used to import text to this database cell. - يفتح حواريّ ملفّات يُستخدم لاستيراد النّصوص إلى خليّة قاعدة البيانات هذه. + يفتح حواريّ ملفات يُستخدم لاستيراد النصوص إلى خليّة قاعدة البيانات هذه. - + &Import - ا&ستورد + ا&ستورِد - Export text - صدّر النّصّ + صدّر النص - Opens a file dialog used to export the contents of this database cell to a text file. - يفتح حواريّ ملفّات يُستخدم لتصدير محتويات خليّة قاعدة البيانات هذه إلى ملفّ نصّيّ. + يفتح حواريّ ملفات يُستخدم لتصدير محتويات خليّة قاعدة البيانات هذه إلى ملف نصّي. - + &Export &صدّر - + Set this cell to NULL - اضبط هذه الخليّة إلى NULL + اضبط هذه الخليّة على NULL - + Erases the contents of the cell - يمحي محتويات هذه الخليّة + يمسح محتويات هذه الخليّة - + Set as &NULL - ا&ضبط إلى NULL + ا&ضبط على NULL <html><head/><body><p><span style=" font-weight:600; color:#c00000;">Warning: Editing binary content in text mode may result in corrupted data!</span></p></body></html> <span style=" font-weight:600; color:#c00000;">تحذير: تحرير المحتوى الثّنائيّ في وضع النّصوص قد يتسبّب بتلف البيانات!</span> - + This area displays information about the data present in this database cell تعرض هذه المنطقة معلومات عن البيانات الموجودة في خليّة قاعدة البيانات هذه - + + This editor mode lets you edit JSON or XML data with syntax highlighting, automatic formatting and validation before saving. + +Errors are indicated with a red squiggle underline. + يتيح لك وضع المحرّر هذا تحرير بيانات JSON وXML مع دعم إبراز الصياغة والتنسيق الآلي والتحقّق قبل الحفظ. + +يُشار إلى الأخطاء بخط مسطّر أحمر مخبرش. + + + Type of data currently in cell - نوع البيانات في الخليّة حاليًّا + نوع البيانات في الخليّة حاليًا - + Size of data currently in table - حجم البيانات في الخليّة حاليًّا + حجم البيانات في الخليّة حاليًا + + + + Apply data to cell + طبّق البيانات على الخليّة + + + + This button saves the changes performed in the cell editor to the database cell. + يحفظ هذا الزرّ التغييرات المُجراة داخل محرّر الخلايا في خليّة قاعدة البيانات. - + Apply طبّق - Choose a file - اختر ملفًّا + اختر ملفًا - Text files(*.txt);;Image files(%1);;All files(*) - الملفّات النّصّيّة(*.txt);;ملفّات الصّور(%1);;كلّ الملفّات(*) + الملفات النصّية(*.txt);;ملفات الصور(%L1);;كلّ الملفات(*) - + Choose a filename to export data - اختر اسمًا للملفّ لتصدير البيانات + اختر اسمًا للملف لتصدير البيانات - Text files(*.txt);;All files(*) - الملفّات النّصّيّة(*.txt);;كلّ الملفّات(*) + الملفات النصّية(*.txt);;كلّ الملفات(*) - Image data can't be viewed with the text editor - لا يمكن عرض البيانات الصّوريّة داخل محرّر النّصوص + لا يمكن عرض البيانات الصوريّة داخل محرّر النصوص - Binary data can't be viewed with the text editor - لا يمكن عرض البيانات الثّنائيّة داخل محرّر النّصوص + لا يمكن عرض البيانات الثنائيّة داخل محرّر النّصوص - + Type of data currently in cell: %1 Image - نوع البيانات في الخليّة حاليًّا: صورة %1 + نوع البيانات في الخليّة حاليًا: صورة %L1 - + %1x%2 pixel(s) - %1×%2 بكسل + %L1×%L2 بكسل - + Type of data currently in cell: NULL - نوع البيانات في الخليّة حاليًّا: NULL + نوع البيانات في الخليّة حاليًا: NULL - - + + %n byte(s) لا بايتات بايت واحد بايتان - %n بايتات - %n بايتًا - %n بايت + %Ln بايتات + %Ln بايتًا + %Ln بايت - - + + Type of data currently in cell: Text / Numeric - نوع البيانات في الخليّة حاليًّا: نصّ / عدد + نوع البيانات في الخليّة حاليًا: نصّ/عدد + + + + + Image data can't be viewed in this mode. + لا يمكن عرض بيانات الصور في هذا الوضع. + + + + + Try switching to Image or Binary mode. + بدّل التبديل إلى وضع ”صورة“ أو ”ثنائيّ“. + + + + + Binary data can't be viewed in this mode. + لا يمكن عرض البيانات الثنائيّة في هذا الوضع. + + + + + Try switching to Binary mode. + بدّل التبديل إلى وضع ”ثنائيّ“. + + + + + + + Text files (*.txt) + الملفات النصّية (*.txt) + + + + + + JSON files (*.json) + ملفات JSON ‏(*.json) + + + + + + + XML files (*.xml) + ملفات XML ‏(*.xml) + + + + + Image files (%1) + ملفات الصور (%L1) + + + + + + Binary files (*.bin) + الملفات الثنائيّة (*.bin) + + + + + All files (*) + كلّ الملفات (*) + + + + Choose a file to import + اختر ملفًا لاستيراده + + + + %1 Image + صورة %L1 + + + + SVG files (*.svg) + ملفات SVG ‏(*.svg) + + + + + Hex dump files (*.txt) + ملفات Hex المفرّغة (*.txt) + + + + Invalid data for this mode + بيانات غير صالحة في هذا الوضع + + + + The cell contains invalid %1 data. Reason: %2. Do you really want to apply it to the cell? + تحتوي الخليّة بيانات %L1 غير صالحة. السبب: %L2. أمتأكّد من تطبيقها على الخليّة؟ - - + + + %n char(s) لا محارف محرف واحد محرفان - %n محارف - %n محرفًا - %n محرف + %Ln محارف + %Ln محرفًا + %Ln محرف - + + Type of data currently in cell: Valid JSON + نوع البيانات في الخليّة حاليًا: JSON صالحة + + + Type of data currently in cell: Binary - نوع البيانات في الخليّة حاليًّا: بيانات ثنائيّة + نوع البيانات في الخليّة حاليًا: بيانات ثنائيّة @@ -670,17 +1085,17 @@ Order - التّرتيب + الترتيب &Table - ال&جدول + الج&دول Edit Index Schema - + تحرير مخطّط الفهرس @@ -690,50 +1105,51 @@ For restricting the index to only a part of the table you can specify a WHERE clause here that selects the part of the table that should be indexed - + إن أردت حصر الفهرس على جزء من الجدول فحسب، يمكنك هنا تحديد بند WHERE والذي سيُحدّد جزء الجدول الذي يجب فهرسته Partial inde&x clause - + بند ف&هرس جزئي Colu&mns - + الأ&عمدة Table column - + عمود الجدول Type - النّوع + النوع Add a new expression column to the index. Expression columns contain SQL expression rather than column names. - + أضِف عمود تعبير جديد إلى الفهرس. تحتوي أعمدة التعابير على تعابير SQL بدل أسماء الأعمدة. Index column - + عمود الفهرس - + Deleting the old index failed: %1 - + فشل حذف الفهرس القديم: +%L1 - + Creating the index failed: %1 فشل إنشاء الفهرس: -%1 +%L1 @@ -755,200 +1171,217 @@ + Database schema + مخطّط قاعدة البيانات + + + Make this a 'WITHOUT rowid' table. Setting this flag requires a field of type INTEGER with the primary key flag set and the auto increment flag unset. - اجعل هذا الجدول بلا معرّف للصّفوف 'WITHOUT rowid'. يتطلّب ضبط هذه الرّاية حقلًا بنوع "أعداد صحيحة/INTEGER" مع ضبط راية المفتاح الأساسيّ ودون ضبط راية الزّيادة الآليّة. + اجعل هذا الجدول بلا معرّف للصفوف ”WITHOUT rowid“. لضبط هذه الراية تحتاج حقلًا بنوع ”أعداد صحيحة/INTEGER“ وأيضا عليك ضبط راية المفتاح الأساسي وألّا تضبط راية الزيادة الآليّة. - + Without Rowid - بلا معرّف للصّفوف + بلا معرّف للصفوف - Set this to create a temporary table that is deleted when closing the database. - + اضبط هذا لإنشاء جدول مؤقّت يُحذف عند إغلاق قاعدة البيانات. - Temporary table - + جدول مؤقّت - + Fields الحقول - + Add field - أضف حقلًا + أضِف حقلًا - + Remove field - أزل الحقل + أزِل الحقل - + Move field up انقل الحقل لأعلى - + Move field down انقل الحقل لأسفل - + Name الاسم - + Type - النّوع + النوع - - + + NN + NN + + + Not null ليس NULL - + PK PK - + Primary key - مفتاح أساسيّ + مفتاح أساسي Primary key - + AI AI - + Autoincrement - زيادة آليّة + زيادة آليّة Auto Increment - + U U - + Unique - فريد + فريد Unique - + Default - الافتراضيّ + المبدئي - + Default value - القيمة الافتراضيّة + القيمة المبدئية - + Check الفحص - + Check constraint - Check constraint + قيد الفحص Check constraint - + Foreign Key - مفتاح أجنبيّ + مفتاح أجنبي - + <html><head/><body><p><span style=" font-weight:600; color:#ff0000;">Warning: </span>There is something with this table definition that our parser doesn't fully understand. Modifying and saving this table might result in problems.</p></body></html> - + <html><span style=" font-weight:600; color:#ff0000;">تحذير: </span>ثمّة خطب بتعريف هذا الجدول تعذّر على المحلّل فهمه تمامًا. يمكن أن يؤدّي تعديل وحفظ هذا الجدول ببعض المشاكل.</html> - + Error creating table. Message from database engine: %1 - خطأ في إنشاء الجدول. الرّسالة من محرّك قاعدة البيانات: -%1 + خطأ أثناء إنشاء الجدول. الرسالة من محرّك قواعد البيانات: +%L1 - + There already is a field with that name. Please rename it first or choose a different name for this field. - هناك حقل بهذا الاسم بالفعل. فضلًا أعد تسميته أو اختر اسمًا مختلفًا لهذا الحقل. + هناك حقل بهذا الاسم بالفعل. من فضلك غيّر اسمه أو اختر اسمًا مختلفًا لهذا الحقل. This column is referenced in a foreign key in table %1, column %2 and thus its name cannot be changed. هذا العمود مذكور في مفتاح أجنبيّ في الجدول %1، العمود %2 ولا يمكن تغيير اسمه. - + This column is referenced in a foreign key in table %1 and thus its name cannot be changed. - + هذا العمود مذكور في مفتاح أجنبي في الجدول %L1 ولا يمكن تغيير اسمه. - + There is at least one row with this field set to NULL. This makes it impossible to set this flag. Please change the table data first. - هناك صفّ واحد على الأقلّ فيه حقل ضُبط إلى NULL. هذا يجعل ضبط هذه الرّاية محال. فضلًا غيّر بيانات الجدول أوّلًا. + ثمّة صفّ واحد على الأقل ضُبط هذا الحقل فيه على NULL. لهذا السبب يستحيل ضبط هذه الراية. من فضلك غيّر بيانات الجدول أوّلًا. - + There is at least one row with a non-integer value in this field. This makes it impossible to set the AI flag. Please change the table data first. - هناك صفّ واحد على الأقلّ فيه حقل ضُبط إلى قيمة ليست عددًا صحيحًا. هذا يجعل ضبط هذه راية AI محال. فضلًا غيّر بيانات الجدول أوّلًا. + ثمّة صفّ واحد على الأقل ضُبط هذا الحقل فيه على قيمة ليست بنوع ”عدد صحيح“. لهذا السبب يستحيل ضبط راية الزيادة الآليّة. من فضلك غيّر بيانات الجدول أوّلًا. - + Column '%1' has no unique data. - ليس للعمود '%1' بيانات فريدة. + ليس للعمود ”%L1“ بيانات فريدة. + - + This makes it impossible to set this flag. Please change the table data first. - هذا يجعل ضبط هذه الرّاية محال. فضلًا غيّر بيانات الجدول أوّلًا. + لهذا السبب يستحيل ضبط هذه الراية. من فضلك غيّر بيانات الجدول أوّلًا. - + Modifying this column failed. Error returned from database: %1 - + فشل تعديل هذا العمود. الخطأ الذي أرجعته قاعدة البيانات: +%L1 - + Are you sure you want to delete the field '%1'? All data currently stored in this field will be lost. - أمتأكّد من حذف الحقل '%1'؟ -ستفقد كلّ البيانات المخزّنة فيه حاليًّا. + أمتأكّد من حذف الحقل ”%L1“؟ +ستفقد كل البيانات المخزّنة فيه حاليًا. - + Please add a field which meets the following criteria before setting the without rowid flag: - Primary key flag set - Auto increment disabled - فضلًا أضف حقلًا يطابق المعايير الآتية قبل ضبط راية بلا معرّف صفوف/without rowid: - - راية "مفتاح أساسيّ" مضبوطة - - الزّيادة الآليّة معطّلة + من فضلك أضِف حقلًا يُطابق المعايير الآتية قبل ضبط راية ”بلا معرّف صفوف/rowid“: + - راية ”مفتاح أساسي“ مضبوطة + - الزيادة الآلية معطّلة - + Setting the rowid column for the table failed. Error message: %1 - + فشل ضبط عمود rowid للجدول. رسالة الخطأ: +%L1 + + + + Changing the table schema failed. Error message: +%1 + فشل تغيير مخطّط الجدول. رسالة الخطأ: +%L1 - Setting the temporary flag for the table failed. Error message: %1 - + فشل ضبط راية ”مؤقّت“ للجدول. رسالة الخطأ: +%L1 @@ -956,7 +1389,7 @@ Export data as CSV - تصدير البيانات كَ‍ CSV + تصدير البيانات بنسق CSV &Table(s) @@ -973,17 +1406,17 @@ Tab&le(s) - الج&دول + الج&داول Colu&mn names in first line - + أسماء الأ&عمدة في أوّل سطر Fie&ld separator - + فاصل الح&قول @@ -1015,7 +1448,7 @@ &Quote character - محرف ال&تّنصيص + محرف ال&تنصيص @@ -1045,49 +1478,59 @@ Pretty print - + طباعة جميلة - - + + Could not open output file: %1 - تعذّر فتح ملفّ الخرج: %1 + تعذّر فتح ملف الخرج: %L1 - - + + Choose a filename to export data - اختر اسمًا للملفّ لتصدير البيانات + اختر اسمًا للملف لتصدير البيانات - + Text files(*.csv *.txt) - الملفّات النّصّيّة(*.csv *.txt) + الملفات النصّية(*.csv *.txt) - + Export data as JSON - + تصدير البيانات بنسق JSON + + + + exporting CSV + يصدّر CSV - + + exporting JSON + يصدّر JSON + + + Text files(*.json *.js *.txt) - + الملفات النصّية(*.json *.js *.txt) - + Please select at least 1 table. - فضلًا حدّد جدولًا واحدًا على الأقل. + من فضلك حدّد جدولًا واحدًا على الأقل. - + Choose a directory اختر دليلًا - + Export completed. - اكتمل التّصدير. + اكتمل التصدير. @@ -1105,12 +1548,12 @@ Select All - حدّد الكلّ + حدّد الكل Deselect All - أزل تحديد الكلّ + ألغِ تحديد الكلّ @@ -1130,7 +1573,7 @@ Export everything - صدّر كلّ شيء + صدّر كل شيء @@ -1145,37 +1588,66 @@ Keep old schema (CREATE TABLE IF NOT EXISTS) - + أبقِ المخطّط القديم (CREATE TABLE IF NOT EXISTS) Overwrite old schema (DROP TABLE, then CREATE TABLE) - + اكتب على المخطّط القديم (DROP TABLE، وبعدها CREATE TABLE) - Please select at least 1 table. - فضلًا حدّد جدولًا واحدًا على الأقل. + من فضلك حدّد جدولًا واحدًا على الأقل. + + + + Please select at least one table. + من فضلك حدّد جدولًا واحدًا على الأقل. - + Choose a filename to export - اختر اسمًا للملفّ للتصدير + اختر اسمًا للملف لتصديره - + Text files(*.sql *.txt) - الملفّات النّصّيّة(*.sql *.txt) + الملفات النصّية(*.sql *.txt) - + Export completed. - اكتمل التّصدير. + اكتمل التصدير. - + Export cancelled or failed. - أُلغي التّصدير أو أنّه فشل. + إمّا أنّ التصدير أُلغي أو أنّه فشل. + + + + ExtendedScintilla + + + + Ctrl+H + Ctrl+H + + + + + Ctrl+P + Ctrl+P + + + + Find and Replace... + ابحث واستبدل... + + + + Print... + اطبع... @@ -1187,25 +1659,101 @@ أتريد إدراجه بأيّ حال؟ - + + Use as Exact Filter + استخدمها كمرشّح كما هي + + + + Containing + تحتوي + + + + Not equal to + لا تساوي + + + + Greater than + أكبر من + + + + Less than + أصغر من + + + + Greater or equal + أكبر من أو تساوي + + + + Less or equal + أصغر من أو تساوي + + + + Between this and... + بين هذه و... + + + Set to NULL - + اضبطها على NULL - + Copy - + انسخ + + + + Copy with Headers + انسخ مع الترويسات - + + Copy as SQL + انسخ كَ‍ SQL + + + Paste - + ألصِق + + + + Print... + اطبع... + + + + Use in Filter Expression + استخدمها في تعبير الترشيح + + + + Alt+Del + Alt+Del + + + + Ctrl+Shift+C + Ctrl+Shift+C + + + + Ctrl+Alt+C + Ctrl+Alt+C - + The content of the clipboard is bigger than the range selected. Do you want to insert it anyway? - + محتوى الحافظة أكبر من المجال المحدّد. +أتريد إدراجه بأي حال؟ @@ -1216,24 +1764,282 @@ + FileExtensionManager + + + File Extension Manager + مدير امتدادات الملفات + + + + &Up + لأ&على + + + + &Down + لأ&سفل + + + + &Add + أ&ضِف + + + + &Remove + أ&زِل + + + + + Description + الوصف + + + + Extensions + الامتدادات + + + + *.extension + ‎*.الامتداد + + + FilterLineEdit - + Filter رشّح + + + These input fields allow you to perform quick filters in the currently selected table. +By default, the rows containing the input text are filtered out. +The following operators are also supported: +% Wildcard +> Greater than +< Less than +>= Equal to or greater +<= Equal to or less += Equal to: exact match +<> Unequal: exact inverse match +x~y Range: values between x and y + تتيح لك حقول الدخل هذه إجراء ترشيح سريع في الجدول المحدّد حاليًا. +مبدئيًا، تُرشّح الصفوف التي تحتوي نص الدخل. +المُعاملات الآتية مدعومة أيضًا: +% حرف بَدل +‏‎>‎ أكبر من +‏‎<‎ أصغر من +‏‎>=‎ أكبر من أو تساوي +‏‎<=‎ أصغر من أو تساوي += تساوي: مطابقة تامة +<> لا تساوي: مطابقة تامة معكوسة +‏x~y المجال: القيم بين x و y + + + + Set Filter Expression + اضبط تعبير الترشيح + + + + What's This? + ما هذا؟ + + + + Is NULL + تساوي NULL + + + + Is not NULL + لا تساوي NULL + + + + Is empty + فارغة + + + + Is not empty + ليست فارغة + + + + Equal to... + تساوي... + + + + Not equal to... + لا تساوي... + + + + Greater than... + أكبر من... + + + + Less than... + أصغر من... + + + + Greater or equal... + أكبر من أو تساوي... + + + + Less or equal... + أصغر من أو تساوي... + + + + In range... + في المدى... + + + + FindReplaceDialog + + + Find and Replace + البحث والاستبدال + + + + Fi&nd text: + ابح&ث عن النص: + + + + Re&place with: + ا&ستبدله بِ‍: + + + + Match &exact case + طابِق &حالة الأحرف + + + + Match &only whole words + طابِق الكلمات الكاملة &فحسب + + + + When enabled, the search continues from the other end when it reaches one end of the page + إن أُشّر عليه، سيتابع البحث من الطرف التالي عندما يصل إلى نهاية الصفحة + + + + &Wrap around + البحث يلت&فّ + + + + When set, the search goes backwards from cursor position, otherwise it goes forward + إن أُشّر إليه، يجري البحث إلى خلف مكان المؤشّر، وإلا فإلى أمامه + + + + Search &backwards + ابحث لل&خلف + + + + <html><head/><body><p>When checked, the pattern to find is interpreted as a UNIX regular expression. See <a href="https://en.wikibooks.org/wiki/Regular_Expressions">Regular Expression in Wikibooks</a>.</p></body></html> + <p>إن أُشّر، سيُتعامل مع نمط البحث على أنّه تعبير يونكس نمطي. طالع <a href="https://en.wikibooks.org/wiki/Regular_Expressions">التعابير النمطية في ويكي‌كتب (بالإنجليزية)</a>.</p> + + + + Use regular e&xpressions + استخدم الت&عابير النمطية + + + + Find the next occurrence from the cursor position and in the direction set by "Search backwards" + ابحث عن الحدوث التالي من موقع المؤشّر حسب الاتجاه الذي حدّده ”البحث للخلف“ + + + + &Find Next + جِد ال&تالي + + + + &Replace + ا&ستبدل + + + + Highlight all the occurrences of the text in the page + أبرِز كلّ الحدوثات في نصّ الصفحة + + + + F&ind All + جِد ال&كل + + + + Replace all the occurrences of the text in the page + استبدل كل الحدوثات في نصّ الصفحة + + + + Replace &All + اس&تبدل الكل + + + + The searched text was not found + لم يُعثر على نصّ البحث + + + + + The searched text was not found. + لم يُعثر على نصّ البحث. + + + + The searched text was found one time. + عُثر على نصّ البحث مرّة واحدة. + + + + The searched text was found %1 times. + عُثر على نصّ البحث %L1 من المرّات. + + + + The searched text was replaced one time. + استُبدل نصّ البحث مرّة واحدة. + + + + The searched text was replaced %1 times. + استُبدل نصّ البحث %L1 من المرّات. + ForeignKeyEditor &Reset - + &صفّر Foreign key clauses (ON UPDATE, ON DELETE etc.) - + بنود المفاتيح الأجنبية (ON UPDATE، أو ON DELETE، إلخ.) @@ -1241,12 +2047,16 @@ Import CSV file - استيراد ملفّ CSV + استيراد ملف CSV - &Table name - اسم ال&جدول + اسم الج&دول + + + + Table na&me + ا&سم الجدول @@ -1270,7 +2080,7 @@ - + Tab الجدولات @@ -1289,7 +2099,7 @@ &Quote character - محرف علامات الا&قتباس + محرف الت&نصيص @@ -1304,7 +2114,7 @@ &Encoding - ال&تّرميز + ال&ترميز @@ -1329,63 +2139,118 @@ Separate tables - + افصل الجداول + + + + Advanced + متقدّم + + + + When importing an empty value from the CSV file into an existing table with a default value for this column, that default value is inserted. Activate this option to insert an empty value instead. + عند استيراد قيمة فارغة من ملف CSV إلى جدول موجود يحمل قيمة مبدئية لهذا العمود، تُضاف تلك القيمة المبدئية. فعّل هذا الخيار لإدراج قيمة فارغة عوضًا عن ذلك. + + + + Ignore default &values + تجاهل ال&قيم المبدئية - + Activate this option to stop the import when trying to import an empty value into a NOT NULL column without a default value. + فعّل هذا الخيار لإيقاف الاستيراد عند محاولة استيراد قيمة فارغة في عمود ”ليس NULL“ ليس له قيمة مبدئية. + + + + Fail on missing values + يفشل الاستيراد إن كانت القيم ناقصة + + + + Disable data type detection + عطّل اكتشاف نوع البيانات + + + + Disable the automatic data type detection when creating a new table. + عطّل الاكتشاف الآلي لنوع البيانات عند إنشاء جدول جديد. + + + + Deselect All - أزل تحديد الكلّ + ألغِ تحديد الكل - + Match Similar - + طابِق المتشابهات - + Select All - حدّد الكلّ + حدّد الكل - Inserting data... - يدرج البيانات... + يدرج البيانات... - Cancel - ألغِ + ألغِ - There is already a table of that name and an import into an existing table is only possible if the number of columns match. - هناك بالفعل جدول بنفس الاسم والاستيراد داخل جدول موجود ممكن فقط إن تطابق عدد الأعمدة. + هناك جدول بنفس الاسم بالفعل ولا يمكن الاستيراد داخل أحد الجداول الموجودة إلّا إن تطابق عدد الأعمدة. - There is already a table of that name. Do you want to import the data into it? - هناك بالفعل جدول بنفس الاسم. أتريد استيراد البيانات داخله؟ + هناك جدول بنفس الاسم بالفعل. أتريد استيراد البيانات داخله؟ + + + + Import completed + اكتمل الاستيراد + + + + There is already a table named '%1' and an import into an existing table is only possible if the number of columns match. + هناك جدول بنفس الاسم ”%L1“ بالفعل ولا يمكن الاستيراد داخل أحد الجداول الموجودة إلّا إن تطابق عدد الأعمدة. + + + + There is already a table named '%1'. Do you want to import the data into it? + هناك جدول بنفس الاسم ”%L1“ بالفعل. أتريد استيراد البيانات داخله؟ - + Creating restore point failed: %1 - فشل إنشاء نقطة استعادة: %1 + فشل إنشاء نقطة استعادة: %L1 - + Creating the table failed: %1 - فشل إنشاء الجدول: %1 + فشل إنشاء الجدول: %L1 + + + + importing CSV + يستورد CSV + + + + Importing the file '%1' took %2ms. Of this %3ms were spent in the row function. + أخذ استيراد الملف ”%L1“ ‏%L2م‌ث. منها %L3م‌ث على دالة الصفّ. - Missing field for record %1 - حقل السّجلّ %1 ناقص + حقل السجلّ %L1 ناقص - + Inserting row failed: %1 - فشل إدراج الصّفّ: %1 + فشل إدراج الصفّ: %L1 @@ -1401,13 +2266,92 @@ بنية قاعدة البيانات - - + + This is the structure of the opened database. +You can drag SQL statements from an object row and drop them into other applications or into another instance of 'DB Browser for SQLite'. + + هذه بنية قاعدة البيانات المفتوحة. +يمكنك سحب إفادات SQL من صفّ في الكائن وإسقاطها في التطبيقات الأخرى أو إلى سيرورة أخرى من ”متصفّح قواعد بيانات SQLite“. + + + + Refresh the data in the selected table + أنعشِ البيانات في الجدول المحدّد + + + + This button clears all the filters set in the header input fields for the currently browsed table. + يمسح هذا الزرّ كلّ المرشّحات المضبوطة في حقول الدخل في الترويسة للجدول المتصفّح حاليًا. + + + + Save the table as currently displayed + احفظ الجدول كما هو معروض حاليًا + + + + <html><head/><body><p>This popup menu provides the following options applying to the currently browsed and filtered table:</p><ul style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;"><li style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Export to CSV: this option exports the data of the browsed table as currently displayed (after filters, display formats and order column) to a CSV file.</li><li style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Save as view: this option saves the current setting of the browsed table (filters, display formats and order column) as an SQL view that you can later browse or use in SQL statements.</li></ul></body></html> + <p>توفّر القائمة المنبثقة هذه الخيارات الآتية والتي تنطبق على الجدول المتصفّح والمرشّح حاليًا:</p><ul style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;"><li style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">صدّر بنسق CSV: يُصدّر هذا الخيار البيانات في الجدول المتصفّح كما هي معروضة حاليًا (بعد المرشّحات وتنسيقات العرض وعمود الفرز) إلى ملف بنسق CSV.</li><li style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">احفظ كمنظور: يحفظ هذا الخيار الإعداد الحالي للجدول المتصفّح (المرشّحات وتنسيقات العرض وعمود الفرز) في منظور SQL يمكنك تصفّحه لاحقًا أو استخدامه في إفادات SQL.</li></ul> + + + + ... + ... + + + + Print currently browsed table data + اطبع بيانات الجدول المتصفّح حاليًا + + + + Print currently browsed table data. Print selection if more than one cell is selected. + اطبع بيانات الجدول المتصفّح حاليًا. اطبع التحديد إن كانت هناك أكثر من خليّة واحدة محدّدة. + + + + <html><head/><body><p>This button creates a new record in the database. Hold the mouse button to open a pop-up menu of different options:</p><ul><li><span style=" font-weight:600;">New Record</span>: insert a new record with default values in the database.</li><li><span style=" font-weight:600;">Insert Values...</span>: open a dialog for entering values before they are inserted in the database. This allows to enter values acomplishing the different constraints. This dialog is also open if the <span style=" font-weight:600;">New Record</span> option fails due to these constraints.</li></ul></body></html> + <p>يُنشئ هذا الزرّ سجلًا جديدًا في قاعدة البيانات. أبقِ زرّ الفأرة مضغوطًا لفتح قائمة منبثقة فيها عدّ’ خيارات:</p><ul><li><span style=" font-weight:600;">سجلّ جديد</span>: لإدراج سجلّ جديد يحمل القيم المبدئية في قاعدة البيانات.</li><li><span style=" font-weight:600;">أدرِج قيم...</span>: لفتح حواريّ لإدخال القيم قبل إدراجها في جدول البيانات. يتيح هذا إدخال القيم حسب القيود المختلفة. يُفتح هذا الحواريّ أيضًا إن فشل الخيار <span style=" font-weight:600;">سجلّ جديد</span> بسبب هذه القيود.</li></ul> + + + + This button deletes the record or records currently selected in the table + يحذف هذا الزرّ السجلّ أو السجلّات المحدّدة حاليًا في الجدول + + + + This is the database table view. You can do the following actions: + - Start writing for editing inline the value. + - Double-click any record to edit its contents in the cell editor window. + - Alt+Del for deleting the cell content to NULL. + - Ctrl+" for duplicating the current record. + - Ctrl+' for copying the value from the cell above. + - Standard selection and copy/paste operations. + هذا هو منظور جدول قاعدة البيانات. يمكنك إجراء الآتي فيه: + - البدء بالكتابة لتحرير القيمة داخل الخط. + - النقر مزدوجًا على أيّ سجلّ لتحرير محتوياته في نافذة محرّر الخلايا. + - ضغط Alt+Del لحذف محتوى الخليّة وضبطه على NULL. + - ضغط Ctrl+"‎ لتكرار السجلّ الحالي. + - ضغط Ctrl+'‎ لنسخ القيمة من الخلية أعلاه. + - التحديد الطبيعي وعمليات النسخ واللصق. + + + + <html><head/><body><p><a href="https://www.sqlite.org/pragma.html#pragma_case_sensitive_like">Case Sensitive Like</a></p></body></html> + <p><a href="https://www.sqlite.org/pragma.html#pragma_case_sensitive_like">Case Sensitive Like</a></p> + + + + Warning: this pragma is not readable and this value has been inferred. Writing the pragma might overwrite a redefined LIKE provided by an SQLite extension. + تحذير: لا يمكن قراءة pragma هذه، ولهذا استُنتجت هذه القيمة. كتابة pragma قد يكتب على LIKE مُعاد تعريفها وفّرها امتداد SQLite. + + + toolBar1 شريط الأدوات1 - + Browse Data تصفّح البيانات @@ -1416,127 +2360,123 @@ الجدول: - + Select a table to browse data اختر جدولًا لتصفّح بياناته - + Use this list to select a table to be displayed in the database view استخدم هذه القائمة لاختيار جدول ليُعرض في منظور قاعدة البيانات - Refresh the data in the selected table. - أنعش البيانات في الجدول المحدّد. + أنعِش البيانات في الجدول المحدّد. - + This button refreshes the data in the currently selected table. - يُنعش هذا الزّرّ البيانات في الجدول المحدّد حاليًّا. + يُنعش هذا الزرّ البيانات في الجدول المحدّد حاليًا. - + Scroll one page upwards - + مرّر صفحة واحدة للأمام - + <html><head/><body><p>Clicking this button navigates one page of records upwards in the table view above.</p></body></html> - + <html>ينقلك هذا الزرّ صفحة واحدة من السجلّات لأعلى في منظور الجدول أعلاه.</html> - + Scroll one page downwards - + مرّر صفحة واحدة للأسفل - + <html><head/><body><p>Clicking this button navigates one page of records downwards in the table view above.</p></body></html> - + <html>ينقلك هذا الزرّ صفحة واحدة من السجلّات لأسفل في منظور الجدول أعلاه.</html> - SQLCipher &FAQ... - + أ&سئلة شائعة عن SQLCipher... - Table(s) to JSON... - + الجدول/الجداول إلى JSON... - + Export one or more table(s) to a JSON file - + صدّر جدولًا أو أكثر إلى ملف JSON - + Refresh - + أنعِش - + F5 F5 - + Clear all filters - امح كلّ المرشّحات + امسح كلّ المرشّحات - + &Table: - + الج&دول: - + Insert a new record in the current table - أدرج سجلًّا جديدًا في الجدول الحاليّ + أدرِج سجلًا جديدًا في الجدول الحالي - This button creates a new, empty record in the database - يُنشئ هذا الزّرّ سجلًّا جديدًا فارغًا في جدول البيانات + يُنشئ هذا الزرّ سجلًا جديدًا فارغًا في جدول البيانات - + + New Record سجلّ جديد - + Delete the current record - احذف السّجلّ الحاليّ + احذف السجلّ الحالي - This button deletes the record currently selected in the database - يحذف هذا الزّرّ السّجلّ المحدّد حاليًّا في قاعدة البيانات + يحذف هذا الزرّ السجلّ المحدّد حاليًا في قاعدة البيانات - + + Delete Record - احذف السّجلّ + احذف السجلّ - This is the database view. You can double-click any record to edit its contents in the cell editor window. - هذا منظور قاعدة البيانات. يمكنك نقر أيّ سجلّ مزدوجًا لتحرير محتوياته في نافذة محرّر الخلايا. + هذا منظور قاعدة البيانات. يمكنك نقر أيّ سجلّ مزدوجًا لتحرير محتوياته في نافذة محرّر الخلايا. - + <html><head/><body><p>Scroll to the beginning</p></body></html> - <html><head/><body><p>مرّر إلى البداية</p></body></html> + <html>مرّر إلى البداية</html> - + <html><head/><body><p>Clicking this button navigates to the beginning in the table view above.</p></body></html> - <html><head/><body><p>نقر هذا الزّرّ سينقلك إلى بداية منظور الجدول أعلاه.</p></body></html> + <html>ينقلك هذا الزرّ إلى بداية منظور الجدول أعلاه.</html> - + |< |< @@ -1549,14 +2489,14 @@ <html><head/><body><p>نقر هذا الزّرّ سينقلك إلى ال‍ 100 سطر التّالية في منظور الجدول أعلاه.</p></body></html> - + < < - + 0 - 0 of 0 - 0 - 0 من 0 + ٠ - ٠ من أصل ٠ <html><head/><body><p>Scroll 100 records downwards</p></body></html> @@ -1567,341 +2507,331 @@ <html><head/><body><p>نقر هذا الزّرّ سينقلك إلى ال‍ 100 سطر السّابقة في منظور الجدول أعلاه.</p></body></html> - + > > - + Scroll to the end - مرّر إلى النّهاية + مرّر إلى النهاية - + <html><head/><body><p>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Clicking this button navigates up to the end in the table view above.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</p></body></html> - <html><head/><body><p>نقر هذا الزّرّ سينقلك إلى نهاية منظور الجدول أعلاه.</p></body></html> + <html>ينقلك هذا الزرّ إلى نهاية منظور الجدول أعلاه.</html> - + >| >| - + <html><head/><body><p>Click here to jump to the specified record</p></body></html> - <html><head/><body><p>انقر هنا للانتقال إلى السّجلّ المحدّد</p></body></html> + <html>انقر هنا للانتقال إلى السجلّ المحدّد</html> - + <html><head/><body><p>This button is used to navigate to the record number specified in the Go to area.</p></body></html> - <html><head/><body><p>يُستخدم هذا الزّرّ في التّنقّل إلى رقم السّطر المحدّد في منطقة "انتقل إلى".</p></body></html> + <html>يُستخدم هذا الزرّ في التنقّل إلى رقم السطر المحدّد في منطقة ”انتقل إلى“.</html> - + Go to: انتقل إلى: - + Enter record number to browse - أدخل رقم السّجلّ لتصفّحه + أدخِل رقم السجلّ لتصفّحه - + Type a record number in this area and click the Go to: button to display the record in the database view - اكتب رقم سجلّ في هذا المربّع وانقر زرّ "انتقل إلى:" لعرض السّجلّ في منظور قاعدة البيانات + اكتب رقم سجلّ في هذا المربّع وانقر زرّ ”انتقل إلى:“ لعرض السجلّ في منظور قاعدة البيانات - + 1 - 1 + ١ - + Edit Pragmas حرّر Pragmas - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_auto_vacuum"><span style=" text-decoration: underline; color:#0000ff;">Auto Vacuum</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_auto_vacuum"><span style=" text-decoration: underline; color:#0000ff;">نظّف آليًّا</span></a></p></body></html> + <html><a href="http://www.sqlite.org/pragma.html#pragma_auto_vacuum"><span style=" text-decoration: underline; color:#0000ff;">نظّف آليًا</span></html> - None - None + None - - Full - Full - - - - Incremental - + Full - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_automatic_index"><span style=" text-decoration: underline; color:#0000ff;">Automatic Index</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_automatic_index"><span style=" text-decoration: underline; color:#0000ff;">فهرس آليّ</span></a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_automatic_index"><span style=" text-decoration: underline; color:#0000ff;">فهرس آلي</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_checkpoint_fullfsync"><span style=" text-decoration: underline; color:#0000ff;">Checkpoint Full FSYNC</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_checkpoint_fullfsync"><span style=" text-decoration: underline; color:#0000ff;">نقطة فحص مزامنة FSYNC كاملة</span></a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_checkpoint_fullfsync"><span style=" text-decoration: underline; color:#0000ff;">نقطة فحص مزامنة FSYNC كاملة</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_foreign_keys"><span style=" text-decoration: underline; color:#0000ff;">Foreign Keys</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_foreign_keys"><span style=" text-decoration: underline; color:#0000ff;">المفاتيح الاجنبيّة</span></a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_foreign_keys"><span style=" text-decoration: underline; color:#0000ff;">المفاتيح الأجنبية</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_fullfsync"><span style=" text-decoration: underline; color:#0000ff;">Full FSYNC</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_fullfsync"><span style=" text-decoration: underline; color:#0000ff;">مزامنة FSYNC كاملة</span></a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_fullfsync"><span style=" text-decoration: underline; color:#0000ff;">مزامنة FSYNC كاملة</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_ignore_check_constraints"><span style=" text-decoration: underline; color:#0000ff;">Ignore Check Constraints</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_ignore_check_constraints"><span style=" text-decoration: underline; color:#0000ff;">تجاهل قيود الفحص</span></a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_ignore_check_constraints"><span style=" text-decoration: underline; color:#0000ff;">تجاهل قيود الفحص</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_journal_mode"><span style=" text-decoration: underline; color:#0000ff;">Journal Mode</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_journal_mode"><span style=" text-decoration: underline; color:#0000ff;">وضع المجلّة</span></a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_journal_mode"><span style=" text-decoration: underline; color:#0000ff;">وضع المجلة</span></a></p></body></html> - Delete - Delete + Delete - Truncate - Truncate + Truncate - Persist - Persist + Persist - - Memory - Memory + Memory - WAL - WAL + WAL - - Off - Off + Off - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_journal_size_limit"><span style=" text-decoration: underline; color:#0000ff;">Journal Size Limit</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_journal_size_limit"><span style=" text-decoration: underline; color:#0000ff;">حدّ مقاس المجلّة</span></a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_journal_size_limit"><span style=" text-decoration: underline; color:#0000ff;">حدّ مقاس المجلة</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_locking_mode"><span style=" text-decoration: underline; color:#0000ff;">Locking Mode</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_locking_mode"><span style=" text-decoration: underline; color:#0000ff;">وضع القفل</span></a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_locking_mode"><span style=" text-decoration: underline; color:#0000ff;">وضع القفل</span></a></p></body></html> - - Normal - Normal + Normal - Exclusive - Exclusive + Exclusive - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_max_page_count"><span style=" text-decoration: underline; color:#0000ff;">Max Page Count</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_max_page_count"><span style=" text-decoration: underline; color:#0000ff;">أقصى عدد للصّفحات</span></a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_max_page_count"><span style=" text-decoration: underline; color:#0000ff;">أقصى عدد للصفحات</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_page_size"><span style=" text-decoration: underline; color:#0000ff;">Page Size</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_page_size"><span style=" text-decoration: underline; color:#0000ff;">حجم الصّفحة</span></a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_page_size"><span style=" text-decoration: underline; color:#0000ff;">مقاس الصفحة</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_recursive_triggers"><span style=" text-decoration: underline; color:#0000ff;">Recursive Triggers</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_recursive_triggers"><span style=" text-decoration: underline; color:#0000ff;">المحفّزات تكراريّة</span></a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_recursive_triggers"><span style=" text-decoration: underline; color:#0000ff;">المحفّزات تكرارية</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_secure_delete"><span style=" text-decoration: underline; color:#0000ff;">Secure Delete</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_secure_delete"><span style=" text-decoration: underline; color:#0000ff;">الحذف الآمن</span></a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_secure_delete"><span style=" text-decoration: underline; color:#0000ff;">الحذف الآمن</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_synchronous"><span style=" text-decoration: underline; color:#0000ff;">Synchronous</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_synchronous"><span style=" text-decoration: underline; color:#0000ff;">التّزامن</span></a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_synchronous"><span style=" text-decoration: underline; color:#0000ff;">التزامن</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_temp_store"><span style=" text-decoration: underline; color:#0000ff;">Temp Store</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_temp_store"><span style=" text-decoration: underline; color:#0000ff;">التّخزين المؤقّت</span></a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_temp_store"><span style=" text-decoration: underline; color:#0000ff;">التخزين المؤقّت</span></a></p></body></html> - Default - Default + Default - File - File + File - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_user_version"><span style=" text-decoration: underline; color:#0000ff;">User Version</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_user_version"><span style=" text-decoration: underline; color:#0000ff;">إصدارة المستخدم</span></a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_user_version"><span style=" text-decoration: underline; color:#0000ff;">إصدارة المستخدم</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_wal_autocheckpoint"><span style=" text-decoration: underline; color:#0000ff;">WAL Auto Checkpoint</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_wal_autocheckpoint"><span style=" text-decoration: underline; color:#0000ff;">نقطة فحص WAL الآليّة</span></a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_wal_autocheckpoint"><span style=" text-decoration: underline; color:#0000ff;">نقطة فحص WAL الآلية</span></a></p></body></html> - + Edit Database &Cell - + تحرير &خليّة قاعدة البيانات - + DB Sche&ma - + م&خطّط قاعدة البيانات - - &Remote - + + This is the structure of the opened database. +You can drag multiple object names from the Name column and drop them into the SQL editor and you can adjust the properties of the dropped names using the context menu. This would help you in composing SQL statements. +You can drag SQL statements from the Schema column and drop them into the SQL editor or into other applications. + + هذه بنية قاعدة البيانات المفتوحة. +يمكنك سحب عدد من أسماء الكائنات من عمود ”الاسم“ وإسقاطها في محرّر SQL ويمكنك ضبط خصائص تلك الأسماء المُسقطة مستخدمًا قائمة السياق. سيساعد هذا في كتابة إفادات SQL. +يمكنك سحب إفادات SQL من عمود ”المخطّط“ وإسقاطها في محرّر SQL أو في أيّ تطبيق آخر. - - Execute SQL [F5, Ctrl+Return, Ctrl+R] - + + &Remote + الب&عيد + + + Execute SQL + نفّذ SQL + + + + Execute current line + نفّذ السطر الحالي - - Execute current line [Shift+F5] - نفّذ السّطر الحاليّ [Shift+F5] + + This button executes the SQL statement present in the current editor line + يُنفّذ هذا الزرّ إفادة SQL الظاهرة في سطر المحرّر الحالي - + Shift+F5 Shift+F5 - &Open Database Read Only... - + ا&فتح قاعدة بيانات للقراءة فقط... - + Open an existing database file in read only mode - + افتح ملف قاعدة بيانات موجود في وضع القراءة فقط - + Unlock view editing - + اسمح بتحرير المنظور - + This unlocks the current view for editing. However, you will need appropriate triggers for editing. - + يسمح هذا بتحرير المنظور الحالي. مع ذلك ستحتاج إلى المحفّزات المناسبة لإجراء التحرير. SQLCipher FAQ... أسئلة شائعة عن SQLCipher... - + Opens the SQLCipher FAQ in a browser window - يفتح الأسئلة الشّائعة عن SQLCipher في نافذة المتصفّح + يفتح الأسئلة الشائعة عن SQLCipher في نافذة المتصفّح E&xecute SQL ن&فّذ SQL - + &File - مل&فّ + مل&ف - + &Import - ا&ستورد + ا&ستورِد - + &Export &صدّر - + &Edit ت&حرير - + &View من&ظور - + &Help م&ساعدة - + + &Tools + أ&دوات + + + DB Toolbar شريط قاعدة البيانات - + SQL &Log س&جلّ SQL - + Show S&QL submitted by - أظهر SQL الذي ن&فّذه + اعرض SQL الذي ن&فّذه - + User المستخدم - + Application - التّطبيق + التطبيق - + + This button clears the contents of the SQL logs + يمسح هذا الزرّ محتويات سجلّات SQL + + + &Clear - ا&مح + ا&مسح - + + This panel lets you examine a log of all SQL commands issued by the application or by yourself + تتيح لك هذه اللوحة فحص كلّ أوامر SQL التي نفّذها التطبيق أو المستخدم + + + &Plot - الرّ&سم البيانيّ + الر&سم البياني Columns @@ -2024,778 +2954,1359 @@ حرّر خليّة قاعدة البيانات - + &New Database... قاعدة بيانات &جديدة... - - + + Create a new database file - أنشئ ملفّ قاعدة بيانات جديد + أنشِئ ملف قاعدة بيانات جديد - + This option is used to create a new database file. - يُستخدم هذا الخيار لإنشاء ملفّ قاعدة بيانات جديد. + يُستخدم هذا الخيار لإنشاء ملف قاعدة بيانات جديد. - + Ctrl+N Ctrl+N - + + &Open Database... ا&فتح قاعدة بيانات... - - - + + + + + Open an existing database file - افتح ملفّ قاعدة بيانات موجود + افتح ملف قاعدة بيانات موجود - - + + + This option is used to open an existing database file. - يُستخدم هذا الخيار لفتح ملفّ قاعدة بيانات موجود. + يُستخدم هذا الخيار لفتح ملف قاعدة بيانات موجود. - + + Ctrl+O Ctrl+O - + &Close Database - أ&غلق قاعدة البيانات + أ&غلِق قاعدة البيانات + + + + This button closes the connection to the currently open database file + يُغلق هذا الزرّ الاتصال بملف قاعدة البيانات المفتوح حاليًا - + Ctrl+W Ctrl+W - + &Revert Changes - أرجِ&ع التّعديلات + أرجِ&ع التعديلات - + + Revert database to last saved state أرجِع قاعدة البيانات إلى آخر حالة محفوظة - + This option is used to revert the current database file to its last saved state. All changes made since the last save operation are lost. - يُستخدم هذا الخيار لإرجاع ملفّ قاعدة البيانات إلى آخر حالة محفوظة له. ستفقد كلّ التّعديلات عليه منذ آخر عمليّة حفظ أُجريت. + يُستخدم هذا الخيار لإرجاع ملف قاعدة البيانات إلى آخر حالة محفوظة له. ستفقد كلّ التعديلات عليه منذ آخر عملية حفظ مُجراة. - + &Write Changes - ا&كتب التّعديلات + ا&كتب التعديلات - + + Write changes to the database file - اكتب التّعديلات إلى ملفّ قاعدة البيانات + اكتب التعديلات في ملف قاعدة البيانات - + This option is used to save changes to the database file. - يُستخدم هذا الخيار لكتابة التّعديلات إلى ملفّ قاعدة البيانات. + يُستخدم هذا الخيار لكتابة التعديلات في ملف قاعدة البيانات. - + Ctrl+S Ctrl+S - - Compact &Database - نظّف &قاعدة البيانات + + Compact &Database... + رُصّ &قاعدة البيانات - + Compact the database file, removing space wasted by deleted records - نظّف ملفّ قاعدة البيانات، مزيلًا المساحة الضّائعة بسبب حذف السّجلّات + رُصّ ملف قاعدة البيانات، مُزيلًا المساحة الضائعة بسبب حذف السجلّات - - + + Compact the database file, removing space wasted by deleted records. - نظّف ملفّ قاعدة البيانات، مزيلًا المساحة الضّائعة بسبب حذف السّجلّات. + رُصّ ملف قاعدة البيانات، مُزيلًا المساحة الضائعة بسبب حذف السجلّات. - + E&xit ا&خرج - + Ctrl+Q Ctrl+Q - + &Database from SQL file... - &قاعدة بيانات من ملفّ SQL... + &قاعدة بيانات من ملف SQL... - + Import data from an .sql dump text file into a new or existing database. - استورد بيانات من ملفّ نصّيّ ‎.sql مفرّغ إلى قاعدة بيانات جديدة أو موجودة. + استورِد بيانات من ملف ‎.sql نصّي مفرّغ إلى قاعدة بيانات جديدة أو موجودة. - + This option lets you import data from an .sql dump text file into a new or existing database. SQL dump files can be created on most database engines, including MySQL and PostgreSQL. - يتيح لك هذا الخيار باستيراد البيانات من ملفّ نصّيّ ‎.sql مفرّغ إلى قاعدة بيانات جديدة أو موجودة. يمكن إنشاء ملفّات SQL المفرّغة في أغلب محرّكات قواعد البيانات، بما فيها MySQL وPostgreSQL. + يتيح لك هذا الخيار استيراد البيانات من ملف ‎.sql نصّي مفرّغ إلى قاعدة بيانات جديدة أو موجودة. يمكن إنشاء ملفات SQL المفرّغة في أغلب محرّكات قواعد البيانات، بما فيها MySQL وPostgreSQL. - + &Table from CSV file... - &جدولًا من ملفّ CSV... + ج&دولًا من ملف CSV... - + Open a wizard that lets you import data from a comma separated text file into a database table. - افتح مرشدًا يساعدك في استيراد البيانات من ملفّ نصّيّ مقسوم بفواصل إلى جدول قاعدة البيانات. + افتح مرشدًا يساعدك في استيراد البيانات من ملف نصّي مقسوم بفواصل إلى جدول قاعدة البيانات. - + Open a wizard that lets you import data from a comma separated text file into a database table. CSV files can be created on most database and spreadsheet applications. - افتح مرشدًا يساعدك في استيراد البيانات من ملفّ نصّيّ مقسوم بفواصل إلى جدول قاعدة البيانات. ملفّات CSV يمكن إنشاءها في أغلب تطبيقات قواعد البيانات والجداول الممتدّة. + افتح مرشدًا يساعدك في استيراد البيانات من ملف نصّي مقسوم بفواصل إلى جدول قاعدة البيانات. يمكن إنشاء ملفات CSV في أغلب تطبيقات قواعد البيانات والجداول الممتدّة. - + &Database to SQL file... - &قاعدة بيانات إلى ملفّ SQL... + &قاعدة بيانات إلى ملف SQL... - + Export a database to a .sql dump text file. - صدّر قاعدة بيانات إلى ملفّ نصّيّ ‎.sql مفرّغ. + صدّر قاعدة بيانات إلى ملف ‎.sql نصّي مفرّغ. - + This option lets you export a database to a .sql dump text file. SQL dump files contain all data necessary to recreate the database on most database engines, including MySQL and PostgreSQL. - يتيح لك هذا الخيار تصدير قاعدة بيانات إلى ملفّ نصّيّ ‎.sql مفرّغ. يمكن لملفّات SQL المفرّغة احتواء كلّ البيانات الضّروريّة لإعادة إنشاء قاعدة البيانات في أغلب محرّكات قواعد البيانات، فما فيها MySQL وPostgreSQL. + يتيح لك هذا الخيار تصدير قاعدة بيانات إلى ملف ‎.sql نصّي مفرّغ. يمكن لملفات SQL المفرّغة احتواء كلّ البيانات الضرورية لإعادة إنشاء قاعدة البيانات في أغلب محرّكات قواعد البيانات، فما فيها MySQL وPostgreSQL. - + &Table(s) as CSV file... - ال&جداول كملفّ CSV... + الج&داول كملف CSV... - + Export a database table as a comma separated text file. - صدّر جدول قاعدة بيانات كملفّ نصّيّ مقسوم بفواصل. + صدّر جدول قاعدة بيانات كملف نصّي مقسوم بفواصل. - + Export a database table as a comma separated text file, ready to be imported into other database or spreadsheet applications. - صدّر جدول قاعدة بيانات كملفّ نصّيّ مقسوم بفواصل، جاهز ليُستورد إلى تطبيقات قواعد البيانات أو الجداول الممتدّة الأخرى. + صدّر جدول قاعدة بيانات كملف نصّي مقسوم بفواصل، جاهز ليُستورد إلى تطبيقات قواعد البيانات أو الجداول الممتدّة الأخرى. - + &Create Table... - أ&نشئ جدولًا... + أ&نشِئ جدولًا... - + Open the Create Table wizard, where it is possible to define the name and fields for a new table in the database افتح مرشد إنشاء الجدول، حيث تستطيع تحديد اسم وحقول للجدول الجديد في قاعدة البيانات - + &Delete Table... ا&حذف الجدول... - - - + + Delete Table احذف الجدول - + Open the Delete Table wizard, where you can select a database table to be dropped. - افتح مرشد حذف الجدول، حيث يمكنك تحديد جدول قاعدة البيانات لإسقاطه. + افتح مرشد حذف الجدول، حيث يمكنك تحديد جدول قاعدة البيانات الذي سيُحذف. - + &Modify Table... &عدّل الجدول... - + Open the Modify Table wizard, where it is possible to rename an existing table. It is also possible to add or delete fields form a table, as well as modify field names and types. - افتح مرشد تعديل الجدول، حيث يمكنك إعادة تسمية جدول موجود. يمكنك أيضًا إضافة حقول أو حذفها إلى ومن الجدول، كما وتعديل أسماء الحقول وأنواعها. + افتح مرشد تعديل الجدول، حيث يمكنك تغيير اسم أحد الجداول الموجودة. يمكنك أيضًا إضافة حقول أو حذفها إلى ومن الجدول، كما وتعديل أسماء الحقول وأنواعها. - + Create &Index... - أنشئ &فهرسًا... + أنشِئ &فهرسًا... - + Open the Create Index wizard, where it is possible to define a new index on an existing database table. افتح جدول إنشاء الفهارس، حيث يمكنك تحديد فهرس جديد في جدول قاعدة بيانات موجود. - + &Preferences... - التّف&ضيلات... + التف&ضيلات... - - + + Open the preferences window. - افتح نافذة التّفضيلات. + افتح نافذة التفضيلات. - + &DB Toolbar شريط &قاعدة البيانات - + Shows or hides the Database toolbar. - يُظهر أو يخفي شريط قاعدة البيانات.. + يعرض أو يُخفي شريط قاعدة البيانات.. - - + + Ctrl+T Ctrl+T - + W&hat's This? ما ه&ذا؟ - + Shift+F1 Shift+F1 - + + Execute all/selected SQL + نفّذ كلّ إفادات SQL أو المحدّد + + + + This button executes the currently selected SQL statements. If no text is selected, all SQL statements are executed. + يُنفّذ هذا الزرّ إفادات SQL المحدّدة حاليًا. إن لم هناك أيّ نصّ محدّد، ستُنفّذ كلّ إفادات SQL. + + + + &Load Extension... + &حمّل امتدادًا... + + + + &Wiki + الوي&كي + + + + Bug &Report... + أبلِغ عن علّ&ة... + + + + Feature Re&quest... + ا&طلب ميزة... + + + + Web&site + موقع الو&بّ + + + + &Donate on Patreon... + تبرّع &عبر باتريون... + + + + Sa&ve Project... + اح&فظ المشروع... + + + + This button lets you save all the settings associated to the open DB to a DB4S project file + يتيح لك هذا الزرّ حفظ كلّ الإعدادات المرتبطة بقاعدة البيانات المفتوحة في ملفّ مشروع DB4S + + + + Open &Project... + افتح م&شروعًا... + + + + This button lets you open a DB4S project file + يتيح لك هذا الزرّ فتح ملف مشروع DB4S + + + + &Attach Database... + أر&فِق قاعدة بيانات... + + + + + Add another database file to the current database connection + أضِف ملف قاعدة بيانات آخر إلى اتصال قاعدة البيانات الحالي + + + + This button lets you add another database file to the current database connection + يتيح لك هذا الزرّ إضافة ملف قاعدة بيانات آخر إلى اتصال قاعدة البيانات الحالي + + + + &Set Encryption... + ا&ضبط التعمية... + + + + SQLCipher &FAQ + أ&سئلة شائعة عن SQLCipher + + + + Table(&s) to JSON... + الج&دول/الجداول إلى JSON... + + + + Open Data&base Read Only... + افتح قاع&دة بيانات للقراءة فقط... + + + + Save results + احفظ النتائج + + + + Save the results view + احفظ منظور النتائج + + + + This button lets you save the results of the last executed query + يتيح لك هذا الزرّ حفظ نتائج آخر استعلام نُفّذ + + + + Find text in SQL editor + ابحث عن النصوص في محرّر SQL + + + + Find text in SQL editor + ابحث عن النصوص في محرّر SQL + + + + This button opens the search bar of the editor + يفتح هذا الزرّ شريط البحث للمحرّر + + + + Ctrl+F + Ctrl+F + + + + Find or replace text in SQL editor + ابحث أو استبدل النصوص في محرّر SQL + + + + Find or replace text in SQL editor + ابحث أو استبدل النصوص في محرّر SQL + + + + This button opens the find/replace dialog for the current editor tab + يفتح هذا الزرّ حواريّ البحث والاستبدال للسان المحرّر الحالي + + + + + Export to &CSV + &صدّر بنسق CSV + + + + + Save as &view + احفظ كمن&ظور + + + + Save as view + احفظ كمنظور + + + + Hide column(s) + أخفِ العمود/الأعمدة + + + + Hide selected column(s) + أخفِ العمود/الأعمدة المحدّدة + + + + Show all columns + أعرض كلّ الأعمدة + + + + Show all columns that were hidden + اعرض كلّ الأعمدة التي أُخفيت + + + + Shows or hides the Project toolbar. + اعرض أو أخفِ شريط أدوات المشروع. + + + + Extra DB Toolbar + شريط أدوات قواعد البيانات الإضافي + + + + + Export the filtered data to CSV + صدّر البيانات المرشّحة إلى CSV + + + + This button exports the data of the browsed table as currently displayed (after filters, display formats and order column) as a CSV file. + يُصدّر هذا الزرّ بيانات الجدول المتصفّح كما هي معروضة حاليًا (بعد المرشّحات وتنسيقات العرض وعمود الفرز) كملف CSV. + + + + + Save the current filter, sort column and display formats as a view + احفظ المرشّح الحالي وعمود الفرز وتنسيقات العرض كمنظور + + + + This button saves the current setting of the browsed table (filters, display formats and order column) as an SQL view that you can later browse or use in SQL statements. + يحفظ هذا الزرّ الإعداد الحالي للجدول المتصفّح (المرشّحات وتنسيقات العرض وعمود الفرز) في منظور SQL يمكنك تصفّحه لاحقًا أو استخدامه في إفادات SQL. + + + + Insert Values... + أدرِج قيم... + + + + + Open a dialog for inserting values in a new record + افتح حواريّ لإدراج القيم في سجلّ جديد + + + + + Insert new record using default values in browsed table + أدرِج سجلًا جديدًا مستخدمًا القيم المبدئية في الجدول المتصفّح + + + + New In-&Memory Database + قاعدة بيانات جديدة في ال&ذاكرة + + + + Drag && Drop Qualified Names + اسحب وأسقِط الأسماء المؤهّلة + + + + + Use qualified names (e.g. "Table"."Field") when dragging the objects and dropping them into the editor + استخدم الأسماء المؤهّلة (مثل ‎"Table"."Field"‎) عند سحب الكائنات وإسقاطها في المحرّر. + + + + Drag && Drop Enquoted Names + اسحب وأسقِط الأسماء مقتبسةً + + + + + Use escaped identifiers (e.g. "Table1") when dragging the objects and dropping them into the editor + استخدم المُعرّفات مهرّبة (مثلًا "Table1") عند سحب الكائنات وإسقاطها في المحرّر + + + + &Integrity Check + فحص ال&سلامة + + + + Runs the integrity_check pragma over the opened database and returns the results in the Execute SQL tab. This pragma does an integrity check of the entire database. + يُشغّل integrity_check pragma على قاعدة البيانات المفتوحة ويُعيد النتائج في لسان ”نفّذ SQL“. يُجري pragma فحص سلامة على قاعدة البيانات كاملةً. + + + + &Foreign-Key Check + فحص الم&فتاح الأجنبي + + + + Runs the foreign_key_check pragma over the opened database and returns the results in the Execute SQL tab + يُشغّل foreign_key_check pragma على قاعدة البيانات المفتوحة ويُعيد النتائج في لسان ”نفّذ SQL“ + + + + &Quick Integrity Check + فحص سلام&ة سريع + + + + Run a quick integrity check over the open DB + يُشغّل فحص سلامة سريع على قاعدة البيانات المفتوحة + + + + Runs the quick_check pragma over the opened database and returns the results in the Execute SQL tab. This command does most of the checking of PRAGMA integrity_check but runs much faster. + يُشغّل quick_check pragma على قاعدة البيانات المفتوحة ويُعيد النتائج في لسان ”نفّذ SQL“. يُجري هذا الأمر أغلب ما تُجريه PRAGMA integrity_check إلّا أنّه أسرع. + + + + &Optimize + ح&سّن + + + + Attempt to optimize the database + حاوِل تحسين قاعدة البيانات + + + + Runs the optimize pragma over the opened database. This pragma might perform optimizations that will improve the performance of future queries. + يُشغّل optimize pragma على قاعدة البيانات المفتوحة. قد تؤدّي pragma تحسينات تُحسّن من أداء الاستعلامات مستقبلًا. + + + + + Print + اطبع + + + + Print text from current SQL editor tab + اطبع النصّ من لسان محرّر SQL الحالي + + + + Open a dialog for printing the text in the current SQL editor tab + افتح حواريّ لطباعة النصّ في لسان محرّر SQL الحالي + + + + Print the structure of the opened database + اطبع بنية قاعدة البيانات المفتوحة + + + + Open a dialog for printing the structure of the opened database + افتح حواريّ لطباعة بنية قاعدة البيانات المفتوحة + + &About... - &عن... + &عن... - + &Recently opened المفتوحة حدي&ثًا - + Open &tab افتح ل&سانًا - + Execute SQL نفّذ SQL - + + + Project Toolbar + شريط أدوات المشروع + + + + Extra DB toolbar + شريط أدوات قواعد البيانات الإضافي + + + + + + Close the current database file + أغلِق ملف قاعدة البيانات الحالي + + + + &About + &عن + + + + This button opens a new tab for the SQL editor + يفتح هذا الزرّ لسانًا جديدًا لمحرّر SQL + + + &Execute SQL ن&فّذ SQL - Execute SQL [F5, Ctrl+Return] - نفّذ SQL ‏[F5, Ctrl+Return] + Execute SQL + نفّذ SQL - + Open SQL file - افتح ملفّ SQL + افتح ملف SQL - - - + + This button opens a file containing SQL statements and loads it in a new editor tab + يفتح هذا الزرّ ملفًا يحتوي إفادات SQL ويحمّله في لسان محرّر جديد + + + + + Save SQL file - احفظ ملفّ SQL + احفظ ملف SQL - &Load extension - &حمّل امتدادًا + &حمّل امتدادًا - + Execute current line - نفّذ السّطر الحاليّ + نفّذ السطر الحالي - Execute current line [Ctrl+E] - نفّذ السّطر الحاليّ [Ctrl+E] + Execute current line + نفّذ السّطر الحاليّ - + Ctrl+E Ctrl+E - + Export as CSV file - يصدّر كملفّ CSV + صدّر كملف بنسق CSV - + Export table as comma separated values file - صدّر الجدول كملفّ نصّيّ مقسوم بفواصل + صدّر الجدول كملف نصّي مقسوم بفواصل - &Wiki... - الوي&كي... + الوي&كي... - Bug &report... - أبلغ عن علّ&ة... + أبلِغ عن علّ&ة... - Web&site... - موقع الو&بّ... + موقع الو&بّ... - Sa&ve Project - احف&ظ المشروع + احف&ظ المشروع - - + + Save the current session to a file - احفظ الجلسة الحاليّة إلى ملفّ + احفظ الجلسة الحالية في ملف - Open &Project - افتح م&شروعًا + افتح م&شروعًا - - + + Load a working session from a file - حمّل جلسة عمل من ملفّ + حمّل جلسة عمل من ملف - &Attach Database - أ&رفق قاعدة بيانات + أ&رفِق قاعدة بيانات - &Set Encryption - ا&ضبط التّعمية + ا&ضبط التعمية - - + + Save SQL file as - احفظ ملفّ SQL ك‍ + احفظ ملف SQL كَ‍ - + + This button saves the content of the current SQL editor tab to a file + يحفظ هذا الزرّ محتويات لسان محرّر SQL الحالي في ملف + + + &Browse Table ت&صفّح الجدول - + Copy Create statement انسخ إفادة الإنشاء - + Copy the CREATE statement of the item to the clipboard - انس إفادة CREAT للعنصر إلى الحافظة + انسخ إفادة CREATE للعنصر إلى الحافظة - + Edit display format - حرّر نسق العرض + حرّر تنسيق العرض - + Edit the display format of the data in this column - حرّر نسق عرض البيانات في هذا العمود + حرّر تنسيق عرض البيانات في هذا العمود - + Show rowid column - أظهر عمود معرّف الصّفوف + اعرض عمود معرّف الصفوف - + Toggle the visibility of the rowid column - بدّل ظهور عمود معرّف الصّفوف/rowid + بدّل ظهور عمود معرّف الصفوف/rowid - - + + Set encoding - اضبط التّرميز + اضبط الترميز - + Change the encoding of the text in the table cells - غيّر ترميز النّصّ في خلايا الجدول + غيّر ترميز النصوص في خلايا الجدول - + Set encoding for all tables اضبط ترميز كلّ الجداول - + Change the default encoding assumed for all tables in the database - غيّر التّرميز الافتراضيّ المفترض في كلّ جداول قاعدة البيانات + غيّر الترميز المبدئي المفترض في كلّ جداول قاعدة البيانات + Duplicate record - كرّر السّجلّ + كرّر السّجلّ - + Ctrl+Return - Ctrl+Return + Ctrl+Enter - + Ctrl+L Ctrl+L - + Ctrl+P Ctrl+P - + Ctrl+D Ctrl+D - + Ctrl+I Ctrl+I - + Encrypted معمّاة - + Database is encrypted using SQLCipher قاعدة البيانات معمّاة باستخدام SQLCipher - + Read only للقراءة فقط - + Database file is read only. Editing the database is disabled. - ملفّ قاعدة البيانات للقراءة فقط. تحرير قاعدة البيانات معطّل. + ملف قاعدة البيانات للقراءة فقط. تحرير قاعدة البيانات معطّل. - + Database encoding ترميز قاعدة البيانات - - + + Choose a database file - اختر ملفّ قاعدة بيانات + اختر ملف قاعدة بيانات Invalid file format. نسق الملفّ غير صالح. - - - + + + Choose a filename to save under - اختر اسمًا للملفّ لحفظه + اختر اسمًا للملف لحفظه به - Error adding record: - خطأ في إضافة السّجلّ: + خطأ أثناء إضافة السجلّ: - + Error deleting record: %1 - خطأ في حذف السّجلّ: -%1 + خطأ أثناء حذف السجلّ: +%L1 - + Please select a record first - فضلًا اختر سجلًّا أوّلًا + من فضلك اختر سجلًا أوّلًا - + %1 - %2 of %3 - %1 - %2 من %3 + ‏%L1 - ‏%L2 من أصل %L3 - - + + There is no database opened. Please open or create a new database file. - لا قواعد بيانات مفتوحة. فضلًا افتح ملفّ قاعدة بيانات أو أنشئ واحدًا جديدًا. + لا قواعد بيانات مفتوحة. من فضلك افتح ملف قاعدة بيانات أو أنشِئ واحدًا جديدًا. - Are you sure you want to delete the %1 '%2'? All data associated with the %1 will be lost. - أمتأكّد من حذف %1 '%2'؟ -ستفقد كلّ البيانات المرتبطة ب‍ %1. + أمتأكّد من حذف %L1 ‏”%L2“؟ +ستفقد كلّ البيانات المرتبطة بالجدول %L1. - Error: could not delete the %1. Message from database engine: %2 - خطأ: تعذّر حذف %1. الرّسالة من محرّك قاعدة البيانات: -%2 + خطأ: تعذّر حذف %L1. الرسالة من محرّك قاعدة البيانات: +%L2 There is no database opened. لا قواعد بيناتا مفتوحة. - %1 rows returned in %2ms from: %3 - أُرجع من الصّفوف %1 في %2م‌ث من: %3 + أُرجع من الصّفوف %L1 خلال %L2م‌ث من: %L3 - Error executing query: %1 - خطأ في تنفيذ الاستعلام: %1 + خطأ أثناء تنفيذ الاستعلام: %L1 - + , %1 rows affected - ، المتأثّر هو %1 من الصّفوف + ، عدد الصفوف المتأثّرة هو %L1 - Query executed successfully: %1 (took %2ms%3) - نُفّذ الاستعلام بنجاح: %1 (أخذ %2م‌ث%3) + نُفّذ الاستعلام بنجاح: %L1 (أخذ %L2م‌ث%L3) Choose a text file اختر ملفًّا نصّيًّا - + Text files(*.csv *.txt);;All files(*) - الملفّات النّصّيّة(*.csv *.txt);;كلّ الملفّات(*) + الملفات النصّية(*.csv *.txt);;كلّ الملفات(*) - Import completed - اكتمل الاستيراد + اكتمل الاستيراد - + Error while saving the database file. This means that not all changes to the database were saved. You need to resolve the following error first. %1 - + خطأ أثناء حفظ ملف قاعدة البيانات. هذا يعني أنّه تعذّر حفظ كلّ التغييرات في قاعدة البيانات. عليك حلّ الخطأ الآتي أوّلًا: + +%L1 - + Are you sure you want to undo all changes made to the database file '%1' since the last save? - أمتأكّد من التّراجع عن كلّ التّعديلات المجراة على ملفّ قاعدة البيانات '%1' منذ آخر حفظ؟ + أمتأكّد من التراجع عن كلّ التعديلات المُجراة على ملف قاعدة البيانات ”%L1“ منذ آخر حفظ؟ - + Choose a file to import - اختر ملفًّا لاستيراده + اختر ملفًا لاستيراده - - - + + + Text files(*.sql *.txt);;All files(*) - الملفّات النّصّيّة(*.sql *.txt);;كلّ الملفّات(*) + الملفات النصّية(*.sql *.txt);;كلّ الملفات(*) - + Do you want to create a new database file to hold the imported data? If you answer no we will attempt to import the data in the SQL file to the current database. - أتريد إنشاء ملفّ قاعدة بيانات جديد ليبقي فيه البيانات المستوردة؟ -إن أجبت بلا سنحاول استيراد البيانات في ملفّ SQL إلى قاعدة البيانات الحاليّة. + أتريد إنشاء ملف قاعدة بيانات جديد ليحتفظ بالبيانات المستوردة؟ +إن كانت إجابتك ”لا“ فسنحاول استيراد البيانات من ملف SQL إلى قاعدة البيانات الحالية. - + File %1 already exists. Please choose a different name. - الملفّ %1 موجود بالفعل. فضلًا اختر اسمًا آخر. + الملف %L1 موجود بالفعل. من فضلك اختر اسمًا آخر. - + Error importing data: %1 - خطأ في استيراد البيانات: %1 + خطأ أثناء استيراد البيانات: %L1 - + Import completed. اكتمل الاستيراد. - - + Delete View - احذف العرض + احذف المنظور - - + Modify View - + عدّل المنظور - - + Delete Trigger احذف المحفّز - - + Modify Trigger - + عدّل المحفّز - - + Delete Index احذف الفهرس - - + Modify Index - + عدّل الفهرس - - + Modify Table - + عدّل الجدول - + &%1 %2 - &%1 %2 + &%L1 %L2 + + + + Choose a project file to open + اختر ملف مشروع لفتحه - + + This project file is using an old file format because it was created using DB Browser for SQLite version 3.10 or lower. Loading this file format is still fully supported but we advice you to convert all your project files to the new file format because support for older formats might be dropped at some point in the future. You can convert your files by simply opening and re-saving them. + يستخدم ملف المشروع هذا نسق ملفات قديم لأنه أُنشأ باستخدام «متصفّح قواعد بيانات SQLite» بإصدارة ٣٫١٠ أو أقل. تحميل نسق الملفات هذا مدعوم بشكل كلي حتى الآن، إلا أننا ننصحك بتحويل كل ملفات المشاريع لديك لتستخدم النسق الجديد لأن دعم النسق القديمة قد ينتهي في المستقبل. يمكنك تحويل ملفاتك بفتحها وإعادة حفظها فحسب. + + + + Duplicate records + كرّر السجلّات + + + + Ctrl+" + Ctrl+" + + + Please enter a pseudo-primary key in order to enable editing on this view. This should be the name of a unique column in the view. - + من فضلك أدخِل مفتاحًا أساسيًا زائفًا (pseudo) لتفعيل التحرير في هذا المنظور. يجب أن يكون المفتاح اسمًا لأحد الأعمدة الفريدة في المنظور. - + Setting PRAGMA values will commit your current transaction. Are you sure? - ضبط قيم PRAGMA ستودع المعاملة الحاليّة. + سيؤّدي ضبط قيم PRAGMA إلى إيداع المعاملة الحالية. أمتأكّد؟ - + Could not open database file. Reason: %1 - + تعذّر فتح ملف قاعدة البيانات. +السبب: %L1 - - Setting PRAGMA values or vacuuming will commit your current transaction. -Are you sure? - + + In-Memory database + قاعدة بيانات في الذاكرة - - Execution aborted by user - + + determining row count... + يحدّد عدد الصفوف... - - Choose text files - + + %1 - %2 of >= %3 + ‏%L1 - ‏%L2 من أصل >= ‏%L3 - - Select SQL file to open - اختر ملفّ SQL لفتحه + + Are you sure you want to delete the table '%1'? +All data associated with the table will be lost. + أمتأكّد من حذف الجدول ”%L1“؟ +ستفقد كلّ البيانات المرتبطة بالجدول. - - Couldn't read file: %1. - + + Are you sure you want to delete the view '%1'? + أمتأكّد من حذف المنظور ”%L1“؟ - - Couldn't save file: %1. - + + Are you sure you want to delete the trigger '%1'? + أمتأكّد من حذف المحفّز ”%L1“؟ - - Select file name - اختر اسم الملفّ + + Are you sure you want to delete the index '%1'? + أمتأكّد من حذف الفهرس ”%L1“؟ - - Select extension file - اختر ملفّ الامتداد + + Error: could not delete the table. + خطأ: تعذّر حذف الجدول. - - Extensions(*.so *.dll);;All files(*) - الامتدادات(*.so *.dll);;كلّ الملفّات(*) + + Error: could not delete the view. + خطأ: تعذّر حذف المنظور. - - Extension successfully loaded. - حُمّل الامتداد بنجاح. + + Error: could not delete the trigger. + خطأ: تعذّر حذف المحفّز. - - - Error loading extension: %1 - خطأ في تحميل الامتداد: %1 + + Error: could not delete the index. + خطأ: تعذّر حذف الفهرس. - - Don't show again - لا تُظهر ثانية + + Message from database engine: +%1 + الرسالة من محرّك قواعد البيانات: +%L1 - - New version available. - إصدارة جديدة متوفّرة. + + Editing the table requires to save all pending changes now. +Are you sure you want to save the database? + تحرير الجدول يطلب حفظ كلّ التغييرات المرجأة الآن. +أمتأكّد من حفظ قاعدة البيانات؟ - + + Error checking foreign keys after table modification. The changes will be reverted. + خطأ أثناء فحص المفاتيح الأجنبية بعد تعديل الجدول. ستُعكس التغييرات. + + + + This table did not pass a foreign-key check.<br/>You should run 'Tools | Foreign-Key Check' and fix the reported issues. + لم يمرّ الجدول من فحص المفتاح الأجنبي.<br/>عليك تشغيل ”أدوات -> فحص المفتاح الأجنبي“ وإصلاح المشاكل المبلّغ عنها. + + + + -- EXECUTING SELECTION IN '%1' +-- + -- ينفّذ التحديد في ”%1“ +-- + + + + -- EXECUTING LINE IN '%1' +-- + -- ينفّذ السطر في ”%1“ +-- + + + + -- EXECUTING ALL IN '%1' +-- + -- ينفّذ الكلّ في ”%1“ +-- + + + + Setting PRAGMA values or vacuuming will commit your current transaction. +Are you sure? + سيؤّدي ضبط قيم PRAGMA أو التنظيف إلى إيداع المعاملة الحالية. +أمتأكّد؟ + + + + Execution aborted by user + أجهض المستخدم التنفيذ + + + + executing query + ينفّذ الاستعلام + + + + %1 rows returned in %2ms + أُرجع من الصّفوف %L1 خلال %L2م‌ث + + + + query executed successfully. Took %1ms%2 + نُفّذ الاستعلام بنجاح: أخذ %L1م‌ث%L2 + + + + -- At line %1: +%4 +-- Result: %3 + -- في السطر %L1: +%L4 +-- النتيجة: %L3 + + + + Choose text files + اختر ملفات نصّية + + + + Import completed. Some foreign key constraints are violated. Please fix them before saving. + اكتمل الاستيراد. انتُهكت بعض قيود المفتاح الأجنبي. من فضلك أصلِحها قبل الحفظ. + + + + Select SQL file to open + اختر ملف SQL لفتحه + + + + Couldn't read file: %1. + تعذّرت قراءة الملف: %L1. + + + + Couldn't save file: %1. + تعذّر حفظ الملف: %L1. + + + + Select file name + اختر اسم الملف + + + + Select extension file + اختر ملف الامتداد + + + + Extensions(*.so *.dll);;All files(*) + الامتدادات(*.so *.dll);;كلّ الملفات(*) + + + + Extension successfully loaded. + نجح تحميل الامتداد. + + + + Error loading extension: %1 + خطأ أثناء تحميل الامتداد: %L1 + + + + + Don't show again + لا تعرض ثانيةً + + + + New version available. + تتوفّر إصدارة جديدة. + + + A new DB Browser for SQLite version is available (%1.%2.%3).<br/><br/>Please download at <a href='%4'>%4</a>. - تتوفّر إصدارة جديدة من «متصفّح قواعد بيانات SQLite» ‏(%1.%2.%3).<br/><br/>فضلًا نزّلها من <a href='%4'>%4</a>. + تتوفّر إصدارة جديدة من «متصفّح قواعد بيانات SQLite» ‏(%L1٫‏%L2٫‏%L3).<br/><br/>من فضلك نزّلها من <a href='%4'>%L4</a>. + + + + Collation needed! Proceed? + التجميع مطلوب! أنتابع؟ + + + + A table in this database requires a special collation function '%1' that this application can't provide without further knowledge. +If you choose to proceed, be aware bad things can happen to your database. +Create a backup! + يحتاج أحد الجداول في قاعدة البيانات هذه دالة التجميع الخاصّة ”%L1“ والتي لا يستطيع البرنامج توفيرها دون معلومات أخرى. +احذر إن اخترت المتابعة، فقد تحدث أمور غير حسنة لقاعدة البيانات. +خُذ نسخة احتياطيّة! + + + + creating collation + يُنشئ تجميعة + + + + Set a new name for the SQL tab. Use the '&&' character to allow using the following character as a keyboard shortcut. + ضع اسمًا جديدًا للسان SQL. استخدم محرف ”&&“ ليُتاح استخدام المحرف الذي يليه كاختصار لوحة مفاتيح. + + + + Please specify the view name + من فضلك حدّد اسم المنظور + + + + There is already an object with that name. Please choose a different name. + هناك كائن بنفس الاسم. من فضلك اختر اسمًا آخر. + + + + View successfully created. + نجح إنشاء المنظور. + + + + Error creating view: %1 + خطأ أثناء إنشاء المنظور: %L1 + + + + There is no filter set for this table. View will not be created. + لا مرشّح مضبوط لهذا الجدول. لن يُنشأ المنظور. + + + + Delete Records + احذف السجلّات + + + + This action will open a new SQL tab for running: + سيفتح هذا الإجراء لسان SQL جديد لتشغيل: + + + + Press Help for opening the corresponding SQLite reference page. + انقر ”مساعدة“ لفتح صفحة SQLite المرجعية المناسبة. Choose a axis color @@ -2806,37 +4317,36 @@ PNG(*.png);;JPG(*.jpg);;PDF(*.pdf);;BMP(*.bmp);;كلّ الملفّات(*) - Choose a file to open - اختر ملفًّا لفتحه + اختر ملفًا لفتحه - - + + DB Browser for SQLite project file (*.sqbpro) - ملفّ مشروع «متصفّح قواعد بيانات SQLite» ‏(*.sqbpro) + ملف مشروع «متصفّح قواعد بيانات SQLite» ‏(*.sqbpro) - + Please choose a new encoding for this table. - فضلًا اختر ترميزًا جديدًا لهذا الجدول. + من فضلك اختر ترميزًا جديدًا لهذا الجدول. - + Please choose a new encoding for all tables. - فضلًا اختر ترميزًا جديدًا لكلّ الجداول. + من فضلك اختر ترميزًا جديدًا لكلّ الجداول. - + %1 Leave the field empty for using the database encoding. - %1 + %L1 اترك الحقل فارغًا لاستخدام ترميز قاعدة البيانات. - + This encoding is either not valid or not supported. - هذا التّرميز غير صالح أو غير مدعوم. + إمّا أنّ هذا الترميز غير صالح أو أنّه غير مدعوم. Cancel @@ -2844,189 +4354,298 @@ + NullLineEdit + + + Set to NULL + اضبطه على NULL + + + + Alt+Del + Alt+Del + + + PlotDock Plot - + رسم بياني + + + + <html><head/><body><p>This pane shows the list of columns of the currently browsed table or the just executed query. You can select the columns that you want to be used as X or Y axis for the plot pane below. The table shows detected axis type that will affect the resulting plot. For the Y axis you can only select numeric columns, but for the X axis you will be able to select:</p><ul style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;"><li style=" margin-top:12px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Date/Time</span>: strings with format &quot;yyyy-MM-dd hh:mm:ss&quot; or &quot;yyyy-MM-ddThh:mm:ss&quot;</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Date</span>: strings with format &quot;yyyy-MM-dd&quot;</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Time</span>: strings with format &quot;hh:mm:ss&quot;</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Label</span>: other string formats. Selecting this column as X axis will produce a Bars plot with the column values as labels for the bars</li><li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Numeric</span>: integer or real values</li></ul><p>Double-clicking the Y cells you can change the used color for that graph.</p></body></html> + <p>تعرض هذه اللوحة قائمة الأعمدة للمجدول المتصفّح حاليًا أو للاستعلام الذي نُفّذ حديثًا. يمكنك تحديد الأعمدة التي تريد استخدامها كمحاور X أو Y للوحة الرسم البياني أدناه. يعرض الجدول نوع المحور المكتشف والذي سيؤثّر على الرسم البياني الناتج. يمكنك تحديد الأعمدة العددية فقط لمحور Y، عكس محور X حيث يمكنك تحديد:</p><ul style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;"><li style=" margin-top:12px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">تاريخ/وقت</span>: السلاسل النصّية التي لها التنسيق ”yyyy-MM-dd hh:mm:ss“ أو ”yyyy-MM-ddThh:mm:ss“</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">تاريخ</span>: السلاسل النصّية التي لها التنسيق ”yyyy-MM-dd“</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">وقت</span>: السلاسل النصّية التي لها التنسيق ”hh:mm:ss“</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">لصيقة</span>: السلاسل النصّية التي لها تنسيقات أخرى. تحديد هذا العمود كمحور x سيُنتج رسم بياني بأشرطة حيث قيم الأعمدة ستكون لصيقات للأشرطة</li><li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">عددي</span>: قيم عددية صحيحة أو حقيقية</li></ul><p>بنقر خلايا Y مزدوجًا يمكنك تغيير اللون المستخدم لذاك الرسم.</p> - + Columns - الأعمدة + الأعمدة - + X - س + س - + Y - ص + ص - _ - _ + _ + + + + Axis Type + نوع المحور + + + + Here is a plot drawn when you select the x and y values above. + +Click on points to select them in the plot and in the table. Ctrl+Click for selecting a range of points. + +Use mouse-wheel for zooming and mouse drag for changing the axis range. + +Select the axes or axes labels to drag and zoom only in that orientation. + هنا تجد الرسم البياني المرسوم عند تحديد قيم x و y أعلاه. + +انقر النقاط لتحديدها في الرسم البياني والجدول. انقر مع Ctrl لتحديد مدًى من النقاط. + +استخدم عجلة الفأرة للتقريب والإبعاد، وحرّك الفأرة لتغيير مدى المحور. + +اختر المحاور أو لصيقات المحاور لتحريكها أو قرّب/بعّد بذاك الاتجاه فحسب. - + Line type: - نوع الخطوط: + نوع الخطوط: - - + + None - None + بلا - + Line - خطّ + خطّ - + StepLeft - عتبة يسرى + عتبة يسرى - + StepRight - عتبة يمنى + عتبة يمنى - + StepCenter - عتبة وسطى + عتبة وسطى - + Impulse - نبض + نبض - + Point shape: - شكل النّقط: + شكل النقط: - + Cross - علامة ضرب + علامة ضرب - + Plus - علامة جمع + علامة جمع - + Circle - دائرة + دائرة - + Disc - قرص + قرص - + Square - مربّع + مربّع - + Diamond - معيّن + معيّن - + Star - نجمة + نجمة - + Triangle - مثلّث + مثلّث - + TriangleInverted - مثلّث مقلوب + مثلّث مقلوب - + CrossSquare - علامة ضرب في مربّع + علامة ضرب في مربّع - + PlusSquare - علامة جمع في مربّع + علامة جمع في مربّع - + CrossCircle - علامة ضرب في دائرة + علامة ضرب في دائرة - + PlusCircle - علامة جمع في دائرة + علامة جمع في دائرة - + Peace - رمز السّلام + رمز السلام - + <html><head/><body><p>Save current plot...</p><p>File format chosen by extension (png, jpg, pdf, bmp)</p></body></html> - <html dir="rtl"><head/><body><p>احفظ الرّسم البيانيّ الحاليّ...</p><p>نسق الملفّ يحدّده الامتداد (png،‏ jpg،‏ pdf وbmp)</p></body></html> + <html dir="rtl"><p>احفظ الرسم البياني الحالي...</p><p>نسق الملف يحدّده الامتداد (png وjpg وpdf وbmp)</p></html> - + Save current plot... - احفظ الرّسم البيانيّ الحاليّ... + احفظ الرسم البياني الحالي... + + + + + Load all data and redraw plot + حمّل كلّ البيانات وأعِد رسم الرسم البياني - Load all data. This has only an effect if not all data has been fetched from the table yet due to the partial fetch mechanism. - حمّل كلّ البيانات. يؤثّر هذا فقط إن لم تكن كلّ البيانات قد جُلبت من الجدول بسبب آليّة جلب جزئيّة. + حمّل كلّ البيانات. لا فائدة من هذا إن لم تكن كلّ البيانات قد جُلبت أساسًا من الجدول (بسبب استخدام آليّة جلب جزئية). - - - + + + Row # - + صفّ # - Choose a axis color - اختر لونًا للمحور + اختر لونًا للمحور + + + + Copy + انسخ + + + + Print... + اطبع... + + + + Show legend + اعرض مفتاح الرسم + + + + Stacked bars + أشرطة مرصوصة + + + + Date/Time + تاريخ/وقت + + + + Date + تاريخ + + + + Time + وقت + + + + + Numeric + عددي + + + + Label + لصيقة + + + + Invalid + غير صالح + + + + Load all data and redraw plot. +Warning: not all data has been fetched from the table yet due to the partial fetch mechanism. + حمّل كلّ البيانات وأعِد رسم الرسم البياني. +تحذير: لم تُجلب كلّ البيانات من الجدول بسبب استخدام آليّة جلب جزئية. + + + + Choose an axis color + اختر لونًا للمحور - + Choose a filename to save under - اختر اسمًا للملفّ لحفظه + اختر اسمًا للملف لحفظه - + PNG(*.png);;JPG(*.jpg);;PDF(*.pdf);;BMP(*.bmp);;All Files(*) - PNG(*.png);;JPG(*.jpg);;PDF(*.pdf);;BMP(*.bmp);;كلّ الملفّات(*) + PNG(*.png);;JPG(*.jpg);;PDF(*.pdf);;BMP(*.bmp);;كلّ الملفات(*) + + + + There are curves in this plot and the selected line style can only be applied to graphs sorted by X. Either sort the table or query by X to remove curves or select one of the styles supported by curves: None or Line. + توجد منحنيات في هذا الرسم البياني ولا يمكن تطبيق نمط الخطوط المحدّد إلّا على الرسوم البيانية المفروزة حسب X. إمّا أن تفرز الجدول أو الاستعلام حسب X لإزالة المنحنيات أو تحديد أحد الأنماط التي تدعمها المنحنيات: ”بل“ أو ”خطّ“. - Fetching all data... - + يجلب كل البيانات... - Cancel - ألغِ + ألغِ @@ -3034,12 +4653,12 @@ Preferences - التّفضيلات + التفضيلات &General - &عامّ + &عام @@ -3058,15 +4677,15 @@ - - + + ... ... Default &location - الم&كان الافتراضيّ + الم&كان المبدئي @@ -3074,57 +4693,59 @@ الل&غة - + Automatic &updates - التّ&حديثات الآليّة + الت&حديثات الآلية - - - - - - + + + + + + + + enabled مفعّلة - + Show remote options - + اعرض خيارات البعيد - + &Database &قاعدة البيانات - + Database &encoding &ترميز قاعدة البيانات - + Open databases with foreign keys enabled. - افتح قواعد البيانات والمفتاحي الرّئيسيّة مفعّلة. + افتح قواعد البيانات والمفاتيح الأجنبية مفعّلة. - + &Foreign keys - الم&فاتيح الرّئيسيّة + الم&فاتيح الأجنبية - + Remove line breaks in schema &view - أزل كاسرات الأسطر في من&ظور المخطّط + أزِل كاسرات الأسطر في من&ظور المخطّط - + Prefetch block si&ze - ح&جم الكتلة لجلبها مسبقًا + &حجم الكتلة لجلبها مسبقًا - + Advanced متقدّم @@ -3133,488 +4754,693 @@ إفادة SQL لتُنفّذ بعد فتح قاعدة البيانات - + SQ&L to execute after opening database - + إ&فادة SQL لتُنفّذ بعد فتح قاعدة البيانات - + Default field type - نوع الحقل الافتراضيّ + نوع الحقل المبدئي - + Data &Browser مت&صفّح البيانات - + Font - الخطّ + الخط - + &Font - ال&خطّ + ال&خط - Font si&ze: - م&قاس الخطّ: + &حجم الخط: - + Content - + المحتوى - + Symbol limit in cell - + أقصى عدد من الرموز في كلّ خليّة - NULL fields - حقول NULL + حقول NULL - &Text - ال&نّصّ + ال&نص - Field colors - ألوان الحقول + ألوان الحقول - + NULL NULL - + Regular - العاديّة + العادية - Text - النّصّ + النصّ - + Binary - الثّنائيّة + الثنائيّة - + Background - الخلفيّة + الخلفية - + Filters المرشّحات - + Escape character محرف الهروب - + Delay time (&ms) - وقت التّأخير (&م‌ث) + وقت التأخير (&م‌ث) - + Set the waiting time before a new filter value is applied. Can be set to 0 for disabling waiting. - اضبط وقت انتظار قبل تطبيق قيمة المرشّح الجديدة. يمكن ضبطه إلى 0 لتعطيل الانتظار. + اضبط وقت انتظار قبل تطبيق قيمة المرشّح الجديدة. يمكن ضبطه إلى القيمة صِفر لتعطيل الانتظار. - + &SQL م&حرّر SQL - + Settings name الاسم في الإعدادات - + Context - السّياق + السياق - + Colour اللون - + Bold ثخين - + Italic مائل - + Underline مسطّر - + Keyword - الكلمات المفتاحيّة + الكلمات المفتاحية - function - function + function - + Function - الدّوال + الدوال - + Table الجداول - + Comment - التّعليقات + التعليقات - + Identifier المعرّفات - + String - السّلاسل + السلاسل النصّية - currentline - currentline + currentline - + Current line - السّطر الحاليّ + السطر الحالي - + SQL &editor font size - مقاس الخطّ في م&حرّر SQL + حجم الخط في م&حرّر SQL - SQL &log font size - مقاس الخطّ في س&جلّ SQL + حجم الخط في &سجلّ SQL - + Tab size - حجم التّبويبات + حجم التبويبات - + SQL editor &font - &خطّ محرّر SQL + &خط محرّر SQL - + Error indicators مؤشّرات الأخطاء - Enabling error indicators highlights the SQL code lines that caused errors during the last execution - تفعيل مؤشّرات الأخطاء تلوّن أسطر كود SQL التي سبّبت أخطاء أثناء آخر تنفيذ + تفعيل مؤشّرات الأخطاء سيُلوّن أسطر كود SQL التي سبّبت أخطاء أثناء آخر تنفيذ - + Hori&zontal tiling - التّراتب أف&قيًّا + التراتب أف&قيًا - + If enabled the SQL code editor and the result table view are shown side by side instead of one over the other. - إن فُعّل، سيظهر محرّر أكواد SQL ومنظور جدول النّتائج جنبًا إلى جنب بدلًا من أن يكونان فوق بعض. + إن فُعّل، سيظهر محرّر أكواد SQL ومنظور جدول النتائج جنبًا إلى جنب بدلًا من أن يكونان فوق بعض. - + Code co&mpletion إ&كمال الكود - + + Toolbar style + نمط شريط الأدوات + + + + Only display the icon + اعرض الأيقونة فحسب + + + + Only display the text + اعرض النصّ فحسب + + + + The text appears beside the icon + يظهر النصّ بجانب الأيقونة + + + + The text appears under the icon + يظهر النصّ أسفل الأيقونة + + + + Follow the style + اتبع النمط + + + + DB file extensions + امتدادات ملفات قواعد البيانات + + + + Manage + أدِر + + + + When enabled, the line breaks in the Schema column of the DB Structure tab, dock and printed output are removed. + إن فُعّل، ستُزال كاسرات الأسطر في عمود ”المخطّط“ في لسان ”بنية قاعدة البيانات“ كما والرصيف والخرج المطبوع. + + + + Font si&ze + &حجم الخط + + + + + This is the maximum number of rows in a table for enabling the value completion based on current values in the column. +Can be set to 0 for disabling completion. + هذا أقصى عدد من الصفوف في كلّ جدول لتفعيل إكمال القيمة حسب البيانات الحالية في العمود. +يمكن ضبطه على صفر لتعطيل الإكمال. + + + + Row count threshold for completion + عتبة عدد الصفوف للإكمال + + + + Field display + عرض الحقول + + + + Displayed &text + ال&نصّ المعروض + + + + Text color + لون النصّ + + + + Background color + لون الخلفية + + + + Preview only (N/A) + معاينة فقط (غير متوفّر) + + + + Foreground + الأمامية + + + + SQL &results font size + حجم خط ن&تائج SQL + + + + &Wrap lines + لُ&فّ الأسطر + + + + Never + أبدًا + + + + At word boundaries + عند حدود الكلمات + + + + At character boundaries + عند حدود المحارف + + + + At whitespace boundaries + عند حدود المسافات + + + + &Quotes for identifiers + &علامات التنصيص للمُعرّفات + + + + Choose the quoting mechanism used by the application for identifiers in SQL code. + اختر آليّة التنصيص التي سيستخدمها التطبيق للمُعرّفات في كود SQL. + + + + "Double quotes" - Standard SQL (recommended) + "علامات تنصيص مزدوجة" - SQL القياسية (مستحسن) + + + + `Grave accents` - Traditional MySQL quotes + `نبر الإطالة` - علامات اقتباس MySQL التقليدية + + + + [Square brackets] - Traditional MS SQL Server quotes + [أقواس مربّعة] - علامات تنصيص خادوم SQL لِمايكروسوفت التقليدي + + + + Keywords in &UPPER CASE + الكلمات المفتاحية &كبيرة الحالة + + + + When set, the SQL keywords are completed in UPPER CASE letters. + إن أُشّر عليه، ستُكمل كلمات SQL بأحرف حالتها كبيرة. + + + + When set, the SQL code lines that caused errors during the last execution are highlighted and the results frame indicates the error in the background + إن أُشر، ستُبرز الأسطر في كود SQL التي تسبّبت بأخطاء أثناء آخر تنفيذ وسيُشير إطار النتائج إلى الخطأ في الخلفية + + + &Extensions الامت&دادات - + Select extensions to load for every database: حدّد الامتدادات لتُحمّل لكلّ قاعدة بيانات: - + Add extension - أضف امتدادًا + أضِف امتدادًا - + Remove extension - أزل الامتداد + أزِل الامتداد - + <html><head/><body><p>While supporting the REGEXP operator SQLite doesn't implement any regular expression<br/>algorithm but calls back the running application. DB Browser for SQLite implements this<br/>algorithm for you to let you use REGEXP out of the box. However, as there are multiple possible<br/>implementations of this and you might want to use another one, you're free to disable the<br/>application's implementation and load your own by using an extension. Requires restart of the application.</p></body></html> - <html dir="rtl"><head/><body><p>مع أنّ معامل REGEX في SQLITE مدعوم، إلّا أنّه لا يُنجز أي خوارزميّة تعابير نمطيّة بل ينادي التّطبيق الجاري. «متصفّح قواعد بيانات SQLite» ينفّذ هذه الخوارزميّة لك لتستخدم REGEXP خارج الصّندوق. مع ذلك، هناك عدّة إنجازات لهذا ولربّما تحتاج استخدام واحدة أخرى، لذا فأنت حرّ في تعطيل إنجاز التّطبيق وتحميل أيّ من تلك باستخدام امتداد ما. إعادة تشغيل التّطبيق مطلوبة.</p></body></html> + <html dir="rtl">مع أنّ معامل REGEX مدعوم، إلّا أنّ SQLITE ليس فيها أية خوارزمية تعابير نمطية منجزة، بل تنادي التطبيق الجاري. «متصفّح قواعد بيانات SQLite» ينفّذ هذه الخوارزمية لك لتستخدم REGEXP دون عناء. مع ذلك، يختلف تنفيذ هذه الميزة ولربّما تحتاج استخدام واحدة أخرى، لذا فأنت حرّ في تعطيل طريقة التطبيق في التنفيذ وتحميل أيّ من تلك باستخدام احد الامتدادات. إعادة تشغيل التطبيق مطلوبة.</html> - + Disable Regular Expression extension - عطّل ملحقة العبارات النّمطيّة + عطّل ملحقة العبارات النمطية - + + <html><head/><body><p>SQLite provides an SQL function for loading extensions from a shared library file. Activate this if you want to use the <span style=" font-style:italic;">load_extension()</span> function from SQL code.</p><p>For security reasons, extension loading is turned off by default and must be enabled through this setting. You can always load extensions through the GUI, even though this option is disabled.</p></body></html> + <p>توفّر SQLite دالة SQL لتحميل الامتدادات من ملف مكتبة مشتركة. فعّل هذا إن أردت استخدام دالة <span style=" font-style:italic;">load_extension()‎</span> من كود SQL.</p><p>لأسباب أمنية، تحميل الامتدادا معطّل مبدئيًا ويجب تفعيله بهذا الإعداد. يمكنك دائمًا تحميل الامتدادات عبر الواجهة الرسومية، حتى لو كان هذا الخيار معطّلًا.</p> + + + + Allow loading extensions from SQL code + اسمح بتحميل الامتدادات من كود SQL + + + Remote - + البعيد - + CA certificates - + شهادات سلطة الشهادات - - + + Subject CN - + اش موضوع التعمية - + Common Name - + الاسم الشائع - + Subject O - + منظّمة موضوع التعمية - + Organization - + المنظّمة - - + + Valid from - + صالحة من - - + + Valid to - + صالحة حتى - - + + Serial number - + الرقم التسلسلي - + Your certificates - + شهاداتك - + File - File + الملف - + Subject Common Name - + الاسم الشائع لموضوع التعمية - + Issuer CN - + اش المُصدِر - + Issuer Common Name - + الاسم الشائع للمُصدِر - + Clone databases into - + استنسخ قواعد البيانات إلى - - + + Choose a directory اختر دليلًا - + The language will change after you restart the application. - ستتغيّر اللغة بعد إعادة تشغيل التّطبيق. + ستتغيّر اللغة بعد إعادة تشغيل التطبيق. - + Select extension file - اختر ملفّ الامتداد + اختر ملف الامتداد - + Extensions(*.so *.dll);;All files(*) - الامتدادات(*.so *.dll);;كلّ الملفّات(*) + الامتدادات(*.so *.dll);;كلّ الملفات(*) - + Import certificate file - + استورِد ملف شهادة - + No certificates found in this file. - + لم تُعثر على شهادات في هذا الملف. - + Are you sure you want do remove this certificate? All certificate data will be deleted from the application settings! - + أمتأكّد من إزالة هذه الشهادة؟ ستُحذف كلّ بيانات الشهادة من إعدادات التطبيق! + + + + Are you sure you want to clear all the saved settings? +All your preferences will be lost and default values will be used. + أمتأكّد من مسح كلّ الإعدادات المحفوظة؟ +ستفقد كلّ التفضيلات لديك وستُستخدم القيمة المبدئية. QObject - + Error importing data خطأ في استيراد البيانات - + from record number %1 - من السّجلّ رقم %1 + من السجلّ رقم %L1 - + . %1 . -%1 +%L1 - - Decoding CSV file... - يفكّ ترميز ملفّ CSV... + + Importing CSV file... + يستورد ملف CSV... - + Decoding CSV file... + يفكّ ترميز ملف CSV... + + + Cancel ألغِ - Collation needed! Proceed? - التّجميع مطلوب! أنتابع؟ + التجميع مطلوب! أنتابع؟ - A table in this database requires a special collation function '%1' that this application can't provide without further knowledge. If you choose to proceed, be aware bad things can happen to your database. Create a backup! - يحتاج جدول في قاعدة البيانات هذه دالة التّجميع الخاصّة '%1' والتي لا يستطيع البرنامج توفيرها دون معلومات أخرى. -إن اخترت المتابعة، احذر أنّ أمورًا سيّئة قد تحصل لقاعدة البيانات. + يحتاج أحد الجداول في قاعدة البيانات هذه دالة التجميع الخاصّة ”%L1“ والتي لا يستطيع البرنامج توفيرها دون معلومات أخرى. +احذر إن اخترت المتابعة، فقد تحدث أمور غير حسنة لقاعدة البيانات. خُذ نسخة احتياطيّة! - SQLite database files (*.db *.sqlite *.sqlite3 *.db3);;All files (*) - ملفّات قواعد بيانات SQLite ‏(*.db *.sqlite *.sqlite3 *.db3);;كلّ الملفّات (*) + ملفات قواعد بيانات SQLite ‏(*.db *.sqlite *.sqlite3 *.db3);;كلّ الملفات (*) + + + + All files (*) + كلّ الملفات (*) + + + + SQLite database files (*.db *.sqlite *.sqlite3 *.db3) + ملفّات قواعد بيانات SQLite ‏(*.db *.sqlite *.sqlite3 *.db3) RemoteDatabase - + Error when connecting to %1. %2 - + خطأ أثناء الاتصال بِ‍ %L1. +%L2 - + Error opening remote file at %1. %2 - + خطأ أثناء فتح الملف البعيد في %L1. +%L2 - + Error: Invalid client certificate specified. - + خطأ: حُدّدت شهادة عميل غير صالحة. - + Please enter the passphrase for this client certificate in order to authenticate. - + من فضلك أدخِل عبارة السر لشهادة العميل لإجراء الاستيثاق. - + Cancel - ألغِ + ألغِ + + + + Uploading remote database to +%1 + يرفع قاعدة البيانات البعيدة إلى +%L1 + + + + Downloading remote database from +%1 + ينزّل قاعدة البيانات البعيدة من +%L1 + + + + The remote database has been updated since the last checkout. Do you want to update the local database to the newest version? Note that this discards any changes you have made locally! If you don't want to lose local changes, click No to open the local version. + لم تُحدّث أيّة قاعدة بيانات منذ آخر عمليّة جلب/checkout. أتريد تحديث قاعدة البيانات المحلية إلى أحدث إصدارة؟ لاحظ بأنّ هذا سيُهمل أيّ تغيير أجريته محليًا! إن لم ترد فقد هذه التغييرات المُجراة محليًا، فانقر ”لا“ لفتح النسخة المحلية. - Uploading remote database to %1. - + يرفع قاعدة البيانات البعيدة إلى +%L1. - Downloading remote database from %1. - + ينزّل قاعدة البيانات البعيدة من +%L1. - - + + Error: The network is not accessible. - + خطأ: تعذّر الوصول إلى الشبكة. - + Error: Cannot open the file for sending. - + خطأ: تعذّر فتح الملف لإرساله. - + Error opening local databases list. %1 - + خطأ أثناء فتح قائمة قواعد البيانات المحلية. +%L1 - + Error creating local databases list. %1 - + خطأ أثناء إنشاء قائمة قواعد البيانات المحلية. +%L1 @@ -3622,22 +5448,32 @@ Remote - + البعيد Identity - + الهويّة + Connect to the remote server using the currently selected identity. The correct server is taken from the identity as well. + اتّصل بالخادوم البعيد مستخدمًا الهويّة المحدّدة حاليًا. يُأخذ الخادوم الصحيح من الهوّية هو الآخر. + + + Go - + انتقل - + Push currently opened database to server - + ادفع قاعدة البيانات المفتوحة حاليًا إلى الخادوم + + + + <html><head/><body><p>In this pane, remote databases from dbhub.io website can be added to DB4S. First you need an identity:</p><ol style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;"><li style=" margin-top:12px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Login to the dbhub.io website (use your GitHub credentials or whatever you want)</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Click the button to create a DB4S certificate (that's your identity). That'll give you a certificate file (save it to your local disk).</li><li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Go to the Remote tab in DB4S Preferences. Click the button to add a new certificate to DB4S and choose the just downloaded certificate file.</li></ol><p>Now the Remote panel shows your identity and you can add remote databases.</p></body></html> + <p>يمكن في هذه اللوحة إضافة قواعد البيانات البعيدة من موقع الوبّ dbhub.io إلى DB4S. تحتاج بداية إلى هويّة:</p><ol style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;"><li style=" margin-top:12px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">لِج إلى موقع الوبّ dbhub.io (استخدم بياناتك على غِت‌هَب أو أيّ بيانات تريد)</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">انقر على الزرّ لإنشاء شهادة DB4S (وهذه ستكون الهويّة). بهذا ستسلتم ملف شهادة (احفظه في قرص محليّ).</li><li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">انتقل إلى لسان ”البعيد“ في تفضيلات DB4S. انقر الزرّ لإضافة شهادة جديدة إلى DB4S واختر ملف الشهادة الذي نزّلته لتوّك.</li></ol><p>ستعرض لوحة ”البعيد“ الآن الهويّة وستقدر على إضافة قواعد البيانات البعيدة.</p> @@ -3645,7 +5481,7 @@ Name - الاسم + الاسم Version @@ -3654,22 +5490,22 @@ Last modified - + آخر تعديل Size - + الحجم Commit - + الإيداع bytes - + بايت @@ -3677,51 +5513,66 @@ Push database - + دفع قاعدة البيانات Database na&me to push to - + ا&سم قاعدة البيانات الذي سيُدفع إليها - + Commit message - + رسالة الإيداع - + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Oxygen-Sans'; font-size:10pt; font-weight:400; font-style:normal;"> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p></body></html> - + - + Database licence - + رخصة قاعدة البيانات - + Public - + عامّة + + + + Branch + الفرع - + + Force push + أجبِر الدفع + + + Database will be public. Everyone has read access to it. - + ستكون قاعدة البيانات عامّة. يملك الجميع تصريح القراءة منها. - + Database will be private. Only you have access to it. - + ستكون قاعدة البيانات خاصّة. أنت من لديك حقّ الوصول إليها لا غير. - + + Use with care. This can cause remote commits to be deleted. + استخدمه بحذر. يمكن أن يتسبّب هذا بحذف الإيداعات البعيدة. + + + Unspecified - + غير محدّدة @@ -3729,316 +5580,505 @@ Form - نموذج + استمارة + + + + Find previous match [Shift+F3] + جِد المطابقة السابقة [Shift+F3] + + + + Find previous match with mapping + جِد المطابقة السابقة مع الالتفاف + + + + Shift+F3 + Shift+F3 + + + + The found pattern must be a whole word + يجب أن يكون النمط الذي سيُبحث عنه كلمة كاملة + + + + Whole Words + الكلمات الكاملة + + + + Text pattern to find considering the checks in this frame + نمط البحث للبحث عنه بأخذ الفحوص في هذا الإطار بعين الاعتبار + + + + Find in editor + ابحث في المحرّر - + + The found pattern must match in letter case + يجب أن يطابق النمط الذي سيُبحث عنه حالة الأحرف + + + + Case Sensitive + حسّاس لحالة الأحرف + + + + Find next match [Enter, F3] + جِد المطابقة التالية [Enter, F3] + + + + Find next match with wrapping + جِد المطابقة التالية مع الالتفاف + + + + F3 + F3 + + + + Interpret search pattern as a regular expression + تعامل مع نمط البحث كتعبير نمطي + + + + <html><head/><body><p>When checked, the pattern to find is interpreted as a UNIX regular expression. See <a href="https://en.wikibooks.org/wiki/Regular_Expressions">Regular Expression in Wikibooks</a>.</p></body></html> + <p>إن أُشّر، سيُتعامل مع نمط البحث على أنّه تعبير يونكس نمطي. طالع <a href="https://en.wikibooks.org/wiki/Regular_Expressions">التعابير النمطية في ويكي‌كتب (بالإنجليزية)</a>.</p> + + + + Regular Expression + تعبير نمطي + + + + + Close Find Bar + أغلِق شريط البحث + + + + Results of the last executed statements نتائج آخر الإفادات المنفّذة - + This field shows the results and status codes of the last executed statements. يعرض هذا الحقل نتائج ورموز حالة آخر الإفادات المنفّذة. - Export to &CSV - &صدّر كَ‍ CSV + &صدّر بنسق CSV - Save as &view - احفظ ك&عرض + احفظ كمن&ظور - Save as view - احفظ كعرض + احفظ كمنظور - Please specify the view name - فضلًا حدّد اسم العرض + من فضلك حدّد اسم المنظور - There is already an object with that name. Please choose a different name. - هناك كائن بنفس الاسم. فضلًا اختر اسمًا آخر. + هناك كائن بنفس الاسم. من فضلك اختر اسمًا آخر. - View successfully created. - أُنشئ العرض بنجاح. + نجح إنشاء المنظور. - Error creating view: %1 - خطأ في إنشاء العرض: %1 + خطأ أثناء إنشاء المنظور: %L1 SqlUiLexer - + (X) The abs(X) function returns the absolute value of the numeric argument X. - + (X) ‫تُعيد الدالة abs(X) القيمة المُطلقة للمعطى العددي X. - + () The changes() function returns the number of database rows that were changed or inserted or deleted by the most recently completed INSERT, DELETE, or UPDATE statement. - + ‎() ‫تُعيد الدالة changes()‎ عدد الصفوف في قاعدة البيانات التي تغيّرت أو أُدرجت أو حُذفت باستخدام أحدث إفادة INSERT أو DELETE أو UPDATE أُجريت بنجاح. - + (X1,X2,...) The char(X1,X2,...,XN) function returns a string composed of characters having the unicode code point values of integers X1 through XN, respectively. - + (X1,X2,...) ‫تُعيد الدالة char(X1,X2,...,XN) سلسلة نصّية مؤلّفة من محارفَ قيمُ نقاط رموزها اليونيكودية هي الأعداد الصحيحة بدءًا من X1 وحتّى XN بالترتيب. - + (X,Y,...) The coalesce() function returns a copy of its first non-NULL argument, or NULL if all arguments are NULL - + (X,Y,...) ‫تُعيد الدالة coalesce()‎ نسخة من أوّل معطًى ليس NUL، أو NULL إن كانت كلّ المعطيات تساوي NULL. - + (X,Y) The glob(X,Y) function is equivalent to the expression "Y GLOB X". - + (X,Y) ‫الدالة glob(X,Y) تعادل التعبير ”Y GLOB X“. - + (X,Y) The ifnull() function returns a copy of its first non-NULL argument, or NULL if both arguments are NULL. - + (X,Y) تُعيد الدالة‫ ifnull()‎ نسخة من أوّل معطًى ليس NUL، أو NULL إن كان كِلا المعطيين يساويان NULL. - + (X,Y) The instr(X,Y) function finds the first occurrence of string Y within string X and returns the number of prior characters plus 1, or 0 if Y is nowhere found within X. - + (X,Y) ‫تبحث الدالة instr(X,Y) عن أوّل حدوث للسلسلة النصّية Y داخل السلسلة النصّية X وتُعيد عدد المحارف قبلها زائدًا ١، أو تُعيد القيمة صِفر إن لم توجد Y في أيّ مكان في X. - + (X) The hex() function interprets its argument as a BLOB and returns a string which is the upper-case hexadecimal rendering of the content of that blob. - + (X) ‫تفسّر الدالة hex()‎ المطى على أنّه BLOB وتُعيد سلسلة نصّية تمثّل عرضًا ستّ‌عشري بحالة أحرف كبيرة لمحتوى كائن BLOB ذاك. - + () The last_insert_rowid() function returns the ROWID of the last row insert from the database connection which invoked the function. - + ‎() ‫تُعيد الدالة last_insert_rowid()‎ معرّف الصّف/ROWID لآخر عمليّة إدراج صفّ من اتّصال قاعدة البيانات والتي نفّذت الدالة. - + (X) For a string value X, the length(X) function returns the number of characters (not bytes) in X prior to the first NUL character. - + (X) ‫باعتبار X سلسلة نصّية، تُعيد الدالة length(X) عدد المحارف (وليس البايتات) داخل X والموجودة قبل أوّل محرف NUL فيها. - + (X,Y) The like() function is used to implement the "Y LIKE X" expression. - + (X,Y) تُستخدم الدالة‫ like()‎ لتنفيذ التعبير ”Y LIKE X“. - + (X,Y,Z) The like() function is used to implement the "Y LIKE X ESCAPE Z" expression. - + (X,Y,Z) تُستخدم الدالة‫ like()‎ لتنفيذ التعبير ”Y LIKE X ESCAPE Z“. - (X) The load_extension(X) function loads SQLite extensions out of the shared library file named X. - + (X) ‫تُحمّل الدالة load_extension(X) امتدادات SQLite من ملف مكتبة مشتركة اسمه X. - (X,Y) The load_extension(X) function loads SQLite extensions out of the shared library file named X using the entry point Y. - + (X,Y) ‫تُحمّل الدالة load_extension(X) امتدادات SQLite من ملف مكتبة مشتركة اسمه X باستخدام نقطة الإدخال Y. - + + (X) The load_extension(X) function loads SQLite extensions out of the shared library file named X. +Use of this function must be authorized from Preferences. + (X) ‫تُحمّل الدالة load_extension(X) امتدادات SQLite من ملف مكتبة مشتركة اسمه X. +يجب السماح باستخدام هذه الدالة من التفضيلات. + + + + (X,Y) The load_extension(X) function loads SQLite extensions out of the shared library file named X using the entry point Y. +Use of this function must be authorized from Preferences. + (X,Y) ‫تُحمّل الدالة load_extension(X) امتدادات SQLite من ملف مكتبة مشتركة اسمه X باستخدام نقطة الإدخال Y. +يجب السماح باستخدام هذه الدالة من التفضيلات. + + + (X) The lower(X) function returns a copy of string X with all ASCII characters converted to lower case. - + (X) ‫تُعيد الدالة lower(X) نسخة من السلسلة النصّية X حيث محارف آسكي كلّها محوّلة إلى حالة الأحرف الصغيرة. - + (X) ltrim(X) removes spaces from the left side of X. - + (X) ‫تُزيل ltrim(X) المسافات من الجانب الأيسر للسلسلة النصّية X. - + (X,Y) The ltrim(X,Y) function returns a string formed by removing any and all characters that appear in Y from the left side of X. - + (X,Y) ‫تُعيد الدالة ltrim(X,Y) سلسلة نصّية بإزالة كلّ المحارف التي قد تظهر في Y من الجانب الأيسر للسلسلة X. - + (X,Y,...) The multi-argument max() function returns the argument with the maximum value, or return NULL if any argument is NULL. - + (X,Y,...) ‫تُعيد الدالة متعدّدة المعطيات max()‎ المعطى الذي له أكبر قيمة، أو NULL إن كان أحد المعطيات هو NULL. - + (X,Y,...) The multi-argument min() function returns the argument with the minimum value. - + (X,Y,...) ‫تُعيد الدالة متعدّدة المعطيات min()‎ المعطى الذي له أصغر قيمة. - + (X,Y) The nullif(X,Y) function returns its first argument if the arguments are different and NULL if the arguments are the same. - + (X,Y) ‫تُعيد الدالة nullif(X,Y) أوّل معطًى إن كانت المعطيات مختلفة، وتُعيد NULL إن كانت المعطيات متطابقة. - + (FORMAT,...) The printf(FORMAT,...) SQL function works like the sqlite3_mprintf() C-language function and the printf() function from the standard C library. - + (FORMAT,...) ‫تعمل دالة SQL هذه printf(FORMAT,...) تمامًا مثل دالة لغة سي sqlite3_mprintf()‎ ودالة printf()‎ من مكتبة سي القياسية. - + (X) The quote(X) function returns the text of an SQL literal which is the value of its argument suitable for inclusion into an SQL statement. - + (X) ‫تُعيد الدالة quote(X) نص SQL حرفيّ تكون قيمة معامله مناسبة لتوضع في عبارة SQL. - + () The random() function returns a pseudo-random integer between -9223372036854775808 and +9223372036854775807. - + ‎() ‫تُعيد الدالة random()‎ عددًا صحيحًا عشوائيًا زائفًا بين -٩٢٢٣٣٧٢٠٣٦٨٥٤٧٧٥٨٠٨ و +٩٢٢٣٣٧٢٠٣٦٨٥٤٧٧٥٨٠٧. - + (N) The randomblob(N) function return an N-byte blob containing pseudo-random bytes. - + (N) ‫تُعيد الدالة randomblob(N) كائن BLOB بحجم N بايت يحتوي على بايتات عشوائية زائفة. - + (X,Y,Z) The replace(X,Y,Z) function returns a string formed by substituting string Z for every occurrence of string Y in string X. - + (X,Y,Z) ‫تُعيد الدالة replace(X,Y,Z) سلسلة نصّية باستبدال كلّ ظهور للسلسة النصّية Y في السلسلة النصّية X بالسلسلة النصّية Z. - + (X) The round(X) function returns a floating-point value X rounded to zero digits to the right of the decimal point. - + (X) تُعيد الدالة‫ round(X) قيمة X عشرية عائمة مُقرّبة إلى خانات الصِفر يمين الفاصلة العشرية. - + (X,Y) The round(X,Y) function returns a floating-point value X rounded to Y digits to the right of the decimal point. - + (X,Y) تُعيد الدالة‫ round(X,Y) قيمة X عشرية عائمة مُقرّبة إلى خانات Y يمين الفاصلة العشرية. - + (X) rtrim(X) removes spaces from the right side of X. - + (X) ‫تُزيل rtrim(X) المسافات من الجانب الأيمن للسلسلة النصّية X. - + (X,Y) The rtrim(X,Y) function returns a string formed by removing any and all characters that appear in Y from the right side of X. - + (X,Y) ‫تُعيد الدالة rtrim(X,Y) سلسلة نصّية بإزالة كلّ المحارف التي قد تظهر في Y من الجانب الأيمن للسلسلة X. - + (X) The soundex(X) function returns a string that is the soundex encoding of the string X. - + (X) ‫تُعيد الدالة soundex(X) سلسلة نصّية بترميز Soundex من السلسلة النصّية X. - + (X,Y) substr(X,Y) returns all characters through the end of the string X beginning with the Y-th. - + (X,Y) ‫تُعيد substr(X,Y) كلّ المحارف حتّى نهاية السلسلة النصّية X بدايةً من المحرف رقم Y. - + (X,Y,Z) The substr(X,Y,Z) function returns a substring of input string X that begins with the Y-th character and which is Z characters long. - + (X,Y,Z) ‫تُعيد الدالة substr(X,Y,Z) سلسلة نصّية جزئيّة من السلسلة الدخل X والتي تبدأ بالمحرف رقم Y وبطول Z من المحارف. - + () The total_changes() function returns the number of row changes caused by INSERT, UPDATE or DELETE statements since the current database connection was opened. - + ‎() ‫تُعيد الدالة total_changes()‎ عدد الصفوف المتأثّرة بإفادة INSERT أو UPDATE أو DELETE مذ فُتح اتّصال قاعدة البيانات الحالية. - + (X) trim(X) removes spaces from both ends of X. - + (X) ‫تُزيل trim(X) المسافات من جانبي للسلسلة النصّية X. - + (X,Y) The trim(X,Y) function returns a string formed by removing any and all characters that appear in Y from both ends of X. - + (X,Y) ‫تُعيد الدالة trim(X,Y) سلسلة نصّية بإزالة كلّ المحارف التي قد تظهر في Y من كِلا جانبي X. - + (X) The typeof(X) function returns a string that indicates the datatype of the expression X. - + (X) ‫تُعيد الدالة typeof(X) سلسلة نصّية توضّح نوع بيانات التعبير X. - + (X) The unicode(X) function returns the numeric unicode code point corresponding to the first character of the string X. - + (X) ‫تُعيد دالة unicode(X) النقطة الرمزية اليونيكودية العددية لأوّل محرف من السلسلة النصّية X. - + (X) The upper(X) function returns a copy of input string X in which all lower-case ASCII characters are converted to their upper-case equivalent. - + (X) ‫تُعيد الدالة upper(X) نسخة من السلسلة النصّية الدخل X حيث محارف آسكي بحالة الأحرف الكبيرة محوّلة كلّها إلى حالة الأحرف الكبيرة. - + (N) The zeroblob(N) function returns a BLOB consisting of N bytes of 0x00. - + (N) ‫تُعيد الدالة zeroblob(N) كائن BLOB يحتوي N بايت بالمحتوى 0x00. - - - - + + + + (timestring,modifier,modifier,...) - + (timestring,modifier,modifier,...) - + (format,timestring,modifier,modifier,...) - + (format,timestring,modifier,modifier,...) - + (X) The avg() function returns the average value of all non-NULL X within a group. - + (X) تُعيد الدالة‫ avg()‎ القيمة المتوسّطة لكلّ X لا تساوي NULL داخل مجموعة ما. - + (X) The count(X) function returns a count of the number of times that X is not NULL in a group. - + (X) ‫تُعيد الدالة count(X) عدد المرات التي لا يكون فيها X يساوي NULL في مجموعة ما. - + (X) The group_concat() function returns a string which is the concatenation of all non-NULL values of X. - + (X) ‫تُعيد الدالة group_concat()‎ سلسلة نصّية تجمع كلّ قيم X التي لا تساوي NULL. - + (X,Y) The group_concat() function returns a string which is the concatenation of all non-NULL values of X. If parameter Y is present then it is used as the separator between instances of X. - + (X,Y) ‫تُعيد الدالة group_concat()‎ سلسلة نصّية تجمع كلّ قيم X التي لا تساوي NULL. إن كان المعطى Y موجودًا، فسيُستخدم كفاصل بين سيرورات X. - + (X) The max() aggregate function returns the maximum value of all values in the group. - + (X) ‫تُعيد الدالة الجامعة max()‎ أكبر قيمة لكلّ القيم في المجموعة. - + (X) The min() aggregate function returns the minimum non-NULL value of all values in the group. - + (X) ‫تُعيد الدالة الجامعة min()‎ أدنى قيمة لا تساوي NULL لكلّ القيم في المجموعة. - - + + (X) The sum() and total() aggregate functions return sum of all non-NULL values in the group. + (X) ‫تُعيد الدالتان الجامعتان sum()‎ و total()‎ مجموع كل القيم التي لا تساوي NULL في المجموعة. + + + + () The number of the row within the current partition. Rows are numbered starting from 1 in the order defined by the ORDER BY clause in the window definition, or in arbitrary order otherwise. + ‎() ‫رقم الصفّ داخل القسم الحالي. تُرقّم الصفوف بدءًا من ١ بالترتيب الذي حدّده بند ORDER BY في تعريف النافذة، أو بترتيب اعتباطي إن لم يكن كذلك.‏ + + + + () The row_number() of the first peer in each group - the rank of the current row with gaps. If there is no ORDER BY clause, then all rows are considered peers and this function always returns 1. + ‎() ‫ناتج row_number()‎ لأوّل فرد في كلّ مجموعة - رتبة الصفّ الحالي مع الفراغات. إن لم يكن هناك بند ORDER BY، فستُعتبر كلّ الصفوف أفراد وستُعيد هذه الدالة ١ دومًا. + + + + () The number of the current row's peer group within its partition - the rank of the current row without gaps. Partitions are numbered starting from 1 in the order defined by the ORDER BY clause in the window definition. If there is no ORDER BY clause, then all rows are considered peers and this function always returns 1. + ‎() ‫رقم مجموعة الأفراد للصفّ الحالي داخل القسم - رتبة الصفّ الحالي مع الفراغات. تُرقّم الأقسام بدءًا من 1 الترتيب الذي حدّده بند ORDER BY في تعريف النافذة. إن لم يوجد بند ORDER BY، فستُعتبر كلّ الصفوف أفراد وستُعيد هذه الدالة ١ دومًا. + + + + () Despite the name, this function always returns a value between 0.0 and 1.0 equal to (rank - 1)/(partition-rows - 1), where rank is the value returned by built-in window function rank() and partition-rows is the total number of rows in the partition. If the partition contains only one row, this function returns 0.0. + ‎() ب‫غضّ النظر عن الاسم، تُعيد هذه الدالة دومًا قيمة بين ٠٫٠ و١٫٠ مساويةً لِ‍ (الرتبة - ١)/(صفوف القسم - ١)، حيث ”الرتبة“ هي القيمة التي تُعيدها دالة النافذة المضمّنة rank()‎ و”صفوف القسم“ هو إجمال عدد الصفوف في القسم. إن احتوى القسم صفًا واحدًا فحسب، فستُعيد هذه الدالة ٠٫٠. + + + + () The cumulative distribution. Calculated as row-number/partition-rows, where row-number is the value returned by row_number() for the last peer in the group and partition-rows the number of rows in the partition. + ‎() التوزيع التصاعدي. يُحسب بالمعادلة رقم الصف/صفوف القسم، حيث ”رقم الصف“ هي القيمة التي أرجعتها‫ row_number()‎ لآخر فرد في المجموعة، و”صفوف القسم“ هي عدد الصفوف في القسم. + + + + (N) Argument N is handled as an integer. This function divides the partition into N groups as evenly as possible and assigns an integer between 1 and N to each group, in the order defined by the ORDER BY clause, or in arbitrary order otherwise. If necessary, larger groups occur first. This function returns the integer value assigned to the group that the current row is a part of. + (N) ‫يُتعامل مع المعطى N على أنّه عدد صحيح. تقسم هذه الدالة القسم إلى N مجموعة إلى حد الإمكان من المساواة، وتُسند عددًا صحيحًا بين 1 وN لكل مجموعة، بالترتيب الذي حدّده بند ORDER BY، أو بترتيب اعتباطي إن كان عكس ذلك. إن كان ضروريا، فستحدث المجموعات الأكبر أولا. تُعيد هذه الدالة قيمة العدد الصحيح المُسنحدة إلى المجموعة التي هي جزء من الصف الحالي. + + + + (expr) Returns the result of evaluating expression expr against the previous row in the partition. Or, if there is no previous row (because the current row is the first), NULL. + (expr) ‫تُعيد ناتج حساب التعبير expr على الصفّ السابق في القسم. أو NULL إن لم يكن هناك صفّ سابق (لأنّ الصف الحالي هو الأوّل). + + + + (expr,offset) If the offset argument is provided, then it must be a non-negative integer. In this case the value returned is the result of evaluating expr against the row offset rows before the current row within the partition. If offset is 0, then expr is evaluated against the current row. If there is no row offset rows before the current row, NULL is returned. + + + + + + (expr,offset,default) If default is also provided, then it is returned instead of NULL if the row identified by offset does not exist. + + + + + (expr) Returns the result of evaluating expression expr against the next row in the partition. Or, if there is no next row (because the current row is the last), NULL. + + + + + (expr,offset) If the offset argument is provided, then it must be a non-negative integer. In this case the value returned is the result of evaluating expr against the row offset rows after the current row within the partition. If offset is 0, then expr is evaluated against the current row. If there is no row offset rows after the current row, NULL is returned. + + + + + (expr) This built-in window function calculates the window frame for each row in the same way as an aggregate window function. It returns the value of expr evaluated against the first row in the window frame for each row. + + + + + (expr) This built-in window function calculates the window frame for each row in the same way as an aggregate window function. It returns the value of expr evaluated against the last row in the window frame for each row. + + + + + (expr,N) This built-in window function calculates the window frame for each row in the same way as an aggregate window function. It returns the value of expr evaluated against the row N of the window frame. Rows are numbered within the window frame starting from 1 in the order defined by the ORDER BY clause if one is present, or in arbitrary order otherwise. If there is no Nth row in the partition, then NULL is returned. SqliteTableModel - References %1(%2) Hold Ctrl+Shift and click to jump there - المراجع %1(%2) -أبقِ الضّغط على Ctrl+Shift وانقر للتّنقّل إلى هناك + المراجع %L1‏(%L2) +أبقِ الضغط على Ctrl+Shift وانقر للانتقال إلى هناك + + + + reading rows + يقرأ الصفوف + + + + loading... + يحمّل... - + + References %1(%2) +Hold %3Shift and click to jump there + التفضيلات %L1‏(%L2) +اضغط %L3Shift وانقر للانتقال إلى هناك + + + Error changing data: %1 - خطأ في تغيير البيانات: -%1 + خطأ أثناء تغيير البيانات: +%L1 + + + + retrieving list of columns + يجلب قائمة الأعمدة + + + + Fetching data... + يجلب البيانات... + + + + Cancel + ألغِ @@ -4046,17 +6086,25 @@ Compact Database - تنظيف قاعدة البيانات + رصّ قاعدة البيانات - Warning: Compacting the database will commit all changes you made. - تحذير: تنظيف قاعدة البيانات سيودع كلّ التّعديلات التي أجريتها. + Warning: Compacting the database will commit all of your changes. + تحذير: برصّ قاعدة البيانات ستُودع كلّ التعديلات التي أجريتها. + Please select the databases to co&mpact: + من فضلك اختر قواعد البيانات لر&صّها: + + + Warning: Compacting the database will commit all changes you made. + تحذير: برصّ قاعدة البيانات أنت تُودع كلّ التعديلات التي أجريتها. + + Please select the objects to compact: - فضلًا اختر الكائنات لتنظيفها: + من فضلك اختر الكائنات لرصّها: diff -Nru sqlitebrowser-3.10.100ubuntu1/src/translations/sqlb_cs.ts sqlitebrowser-3.11.1/src/translations/sqlb_cs.ts --- sqlitebrowser-3.10.100ubuntu1/src/translations/sqlb_cs.ts 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/src/translations/sqlb_cs.ts 2019-02-19 23:51:34.000000000 +0000 @@ -15,96 +15,210 @@ - <html><head/><body><p>DB Browser for SQLite is an open source, freeware visual tool used to create, design and edit SQLite database files.</p><p>It is bi-licensed under the Mozilla Public License Version 2, as well as the GNU General Public License Version 3 or later. You can modify or redistribute it under the conditions of these licenses.</p><p>See <a href="http://www.gnu.org/licenses/gpl.html"><span style=" text-decoration: underline; color:#0000ff;">http://www.gnu.org/licenses/gpl.html</span></a> and <a href="https://www.mozilla.org/MPL/2.0/index.txt"><span style=" text-decoration: underline; color:#0000ff;">https://www.mozilla.org/MPL/2.0/index.txt</span></a> for details.</p><p>For more information on this program please visit our website at: <a href="http://sqlitebrowser.org"><span style=" text-decoration: underline; color:#0000ff;">http://sqlitebrowser.org</span></a></p><p><span style=" font-size:small;">This software uses the GPL/LGPL Qt Toolkit from </span><a href="http://qt-project.org/"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://qt-project.org/</span></a><span style=" font-size:small;"><br/>See </span><a href="http://qt-project.org/doc/qt-5/licensing.html"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://qt-project.org/doc/qt-5/licensing.html</span></a><span style=" font-size:small;"> for licensing terms and information.</span></p><p><span style=" font-size:small;">It also uses the Silk icon set by Mark James licensed under a Creative Commons Attribution 2.5 and 3.0 license.<br/>See </span><a href="http://www.famfamfam.com/lab/icons/silk/"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://www.famfamfam.com/lab/icons/silk/</span></a><span style=" font-size:small;"> for details.</span></p></body></html> - <html><head/><body><p>DB Browser pro SQLite je open source, freeware a vizualizační nástroj užívaný k tvorbě, návrhu a úpravě SQLite souborů databáze.</p><p>Je multilicencován pod Mozilla Public License Version 2, jakož i GNU General Public License Version 3 nebo pozdější. Můžete jej upravovat nebo redistribuovat podle podmínek těchto licencí.</p><p>Viz <a href="http://www.gnu.org/licenses/gpl.html"><span style=" text-decoration: underline; color:#0000ff;">http://www.gnu.org/licenses/gpl.html</span></a> a <a href="https://www.mozilla.org/MPL/2.0/index.txt"><span style=" text-decoration: underline; color:#0000ff;">https://www.mozilla.org/MPL/2.0/index.txt</span></a> pro více informací.</p><p>Pro získání více informací o tomto programu prosím navštivte naše webové stránky na: <a href="http://sqlitebrowser.org"><span style=" text-decoration: underline; color:#0000ff;">http://sqlitebrowser.org</span></a></p><p><span style=" font-size:small;">Tento software užívá GPL/LGPL Qt Toolkit od </span><a href="http://qt-project.org/"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://qt-project.org/</span></a><span style=" font-size:small;"><br/>Viz </span><a href="http://qt-project.org/doc/qt-5/licensing.html"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://qt-project.org/doc/qt-5/licensing.html</span></a><span style=" font-size:small;"> pro licenční podmínky a informace.</span></p><p><span style=" font-size:small;">Také využívá Silk icon set od Marka Jamese licencovaný pod licencí Creative Commons Attribution 2.5 a 3.0.<br/>See </span><a href="http://www.famfamfam.com/lab/icons/silk/"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://www.famfamfam.com/lab/icons/silk/</span></a><span style=" font-size:small;"> pro více informací.</span></p></body></html> + <html><head/><body><p>DB Browser for SQLite is an open source, freeware visual tool used to create, design and edit SQLite database files.</p><p>It is bi-licensed under the Mozilla Public License Version 2, as well as the GNU General Public License Version 3 or later. You can modify or redistribute it under the conditions of these licenses.</p><p>See <a href="http://www.gnu.org/licenses/gpl.html">http://www.gnu.org/licenses/gpl.html</a> and <a href="https://www.mozilla.org/MPL/2.0/index.txt">https://www.mozilla.org/MPL/2.0/index.txt</a> for details.</p><p>For more information on this program please visit our website at: <a href="http://sqlitebrowser.org">http://sqlitebrowser.org</a></p><p><span style=" font-size:small;">This software uses the GPL/LGPL Qt Toolkit from </span><a href="http://qt-project.org/"><span style=" font-size:small;">http://qt-project.org/</span></a><span style=" font-size:small;"><br/>See </span><a href="http://qt-project.org/doc/qt-5/licensing.html"><span style=" font-size:small;">http://qt-project.org/doc/qt-5/licensing.html</span></a><span style=" font-size:small;"> for licensing terms and information.</span></p><p><span style=" font-size:small;">It also uses the Silk icon set by Mark James licensed under a Creative Commons Attribution 2.5 and 3.0 license.<br/>See </span><a href="http://www.famfamfam.com/lab/icons/silk/"><span style=" font-size:small;">http://www.famfamfam.com/lab/icons/silk/</span></a><span style=" font-size:small;"> for details.</span></p></body></html> + + + + <html><head/><body><p>DB Browser for SQLite is an open source, freeware visual tool used to create, design and edit SQLite database files.</p><p>It is bi-licensed under the Mozilla Public License Version 2, as well as the GNU General Public License Version 3 or later. You can modify or redistribute it under the conditions of these licenses.</p><p>See <a href="http://www.gnu.org/licenses/gpl.html"><span style=" text-decoration: underline; color:#0000ff;">http://www.gnu.org/licenses/gpl.html</span></a> and <a href="https://www.mozilla.org/MPL/2.0/index.txt"><span style=" text-decoration: underline; color:#0000ff;">https://www.mozilla.org/MPL/2.0/index.txt</span></a> for details.</p><p>For more information on this program please visit our website at: <a href="https://sqlitebrowser.org"><span style=" text-decoration: underline; color:#0000ff;">https://sqlitebrowser.org</span></a></p><p><span style=" font-size:small;">This software uses the GPL/LGPL Qt Toolkit from </span><a href="http://qt-project.org/"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://qt-project.org/</span></a><span style=" font-size:small;"><br/>See </span><a href="http://qt-project.org/doc/qt-5/licensing.html"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://qt-project.org/doc/qt-5/licensing.html</span></a><span style=" font-size:small;"> for licensing terms and information.</span></p><p><span style=" font-size:small;">It also uses the Silk icon set by Mark James licensed under a Creative Commons Attribution 2.5 and 3.0 license.<br/>See </span><a href="http://www.famfamfam.com/lab/icons/silk/"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://www.famfamfam.com/lab/icons/silk/</span></a><span style=" font-size:small;"> for details.</span></p></body></html> + <html><head/><body><p>DB Browser pro SQLite je open source, freeware a vizualizační nástroj užívaný k tvorbě, návrhu a úpravě SQLite souborů databáze.</p><p>Je multilicencován pod Mozilla Public License Version 2, jakož i GNU General Public License Version 3 nebo pozdější. Můžete jej upravovat nebo redistribuovat podle podmínek těchto licencí.</p><p>Viz <a href="http://www.gnu.org/licenses/gpl.html"><span style=" text-decoration: underline; color:#0000ff;">http://www.gnu.org/licenses/gpl.html</span></a> a <a href="https://www.mozilla.org/MPL/2.0/index.txt"><span style=" text-decoration: underline; color:#0000ff;">https://www.mozilla.org/MPL/2.0/index.txt</span></a> pro více informací.</p><p>Pro získání více informací o tomto programu prosím navštivte naše webové stránky na: <a href="https://sqlitebrowser.org"><span style=" text-decoration: underline; color:#0000ff;">https://sqlitebrowser.org</span></a></p><p><span style=" font-size:small;">Tento software užívá GPL/LGPL Qt Toolkit od </span><a href="http://qt-project.org/"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://qt-project.org/</span></a><span style=" font-size:small;"><br/>Viz </span><a href="http://qt-project.org/doc/qt-5/licensing.html"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://qt-project.org/doc/qt-5/licensing.html</span></a><span style=" font-size:small;"> pro licenční podmínky a informace.</span></p><p><span style=" font-size:small;">Také využívá Silk icon set od Marka Jamese licencovaný pod licencí Creative Commons Attribution 2.5 a 3.0.<br/>See </span><a href="http://www.famfamfam.com/lab/icons/silk/"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://www.famfamfam.com/lab/icons/silk/</span></a><span style=" font-size:small;"> pro více informací.</span></p></body></html> + + + + (based on SQLite %1) + - + Version Verze - + Qt Version verze Qt - + SQLCipher Version verze SQLCipher - + SQLite Version verze SQLite + AddRecordDialog + + + Add New Record + + + + + Enter values for the new record considering constraints. Fields in bold are mandatory. + + + + + In the Value column you can specify the value for the field identified in the Name column. The Type column indicates the type of the field. Default values are displayed in the same style as NULL values. + + + + + Name + Název + + + + Type + Typ + + + + Value + + + + + Values to insert. Pre-filled default values are inserted automatically unless they are changed. + + + + + When you edit the values in the upper frame, the SQL query for inserting this new record is shown here. You can edit manually the query before saving. + + + + + <html><head/><body><p><span style=" font-weight:600;">Save</span> will submit the shown SQL statement to the database for inserting the new record.</p><p><span style=" font-weight:600;">Restore Defaults</span> will restore the initial values in the <span style=" font-weight:600;">Value</span> column.</p><p><span style=" font-weight:600;">Cancel</span> will close this dialog without executing the query.</p></body></html> + + + + + Auto-increment + + + + + + Unique constraint + + + + + + Check constraint: %1 + + + + + + Foreign key: %1 + + + + + + Default value: %1 + + + + + + Error adding record. Message from database engine: + +%1 + + + + + Are you sure you want to restore all the entered values to their defaults? + + + + Application - + Usage: %1 [options] [db] Použití: %1 [volby] [db] - + Possible command line arguments: Možné parametry pro příkazový řádek: - + -h, --help Show command line options -h, --help Zobrazit volby příkazové řádky - + -s, --sql [file] Execute this SQL file after opening the DB -s, --sql [file] Vykonat tento SQL soubor po otevření DB - + -t, --table [table] Browse this table after opening the DB -t, --table [table] Prohlížet tuto tabulku po otevření DB - + + This is DB Browser for SQLite version %1. + + + + -q, --quit Exit application after running scripts -q, --quit Po vykonání skriptů ukončit aplikaci - - -v, --version Display the current version + + -R, --read-only Open database in read-only mode - - [file] Open this SQLite database - [file] Otevřít tuto SQLite databázi + + -o, --option [group/setting=value] Run application with this setting temporarily set to value + - - This is DB Browser for SQLite version %1%2. - + + -v, --version Display the current version + -v, --version Zobrazit aktuální verzi + + + + [file] Open this SQLite database + [file] Otevřít tuto SQLite databázi - + The -s/--sql option requires an argument Volba -s/--sql vyžaduje parametry - + The file %1 does not exist Soubor %1 neexistuje - + The -t/--table option requires an argument Volba -t/--table vyžaduje parametry - + + The -o/--option option requires an argument in the form group/setting=value + + + + Invalid option/non-existant file: %1 Neplatná volba/neexistující soubor: %1 @@ -129,24 +243,24 @@ Page si&ze - + Velikost strany - + Passphrase - + Raw key Page &size - Strana &velikost + Velikost strany - + Please set a key to encrypt the database. Note that if you change any of the other, optional, settings you'll need to re-enter them as well every time you open the database file. Leave the password fields empty to disable the encryption. @@ -154,7 +268,7 @@ - + Please enter the key used to encrypt the database. If any of the other settings were altered for this database file you need to provide this information as well. @@ -183,67 +297,82 @@ Výchozí - + Decimal number Desetinné číslo - + Exponent notation Notace exponentu - + Hex blob Šestnáctkový blob - + Hex number Šestnáctkové číslo - + Apple NSDate to date Apple NSDate na datum - + + Java epoch (milliseconds) to date + + + + Julian day to date Juliánský den na datum - + + Unix epoch to local time + + + + + Date as dd/mm/yyyy + Datum jako dd/mm/yyyy + + + Lower case Malá písmena - + Octal number Osmičkové číslo - + Round number Zaokrouhlit číslo - + Unix epoch to date Unix epoch na datum - + Upper case Velká písmena - + Windows DATE to date Windows DATE na datum - + Custom Vlastní @@ -251,38 +380,38 @@ DBBrowserDB - + Please specify the database name under which you want to access the attached database Prosím specifikujte jméno databáze, pod kterým chcete přistupovat k připojené databázi - + Invalid file format - + Neplatný formát souboru - + Do you want to save the changes made to the database file %1? Chcete uložit změny provedené do databázového souboru %1? - + Exporting database to SQL file... Exportuji databázi do souboru SQL... - - + + Cancel Zrušit - + Executing SQL... Provádím SQL... - + Action cancelled. Akce zrušena. @@ -297,76 +426,122 @@ renameColumn: nemohu nalézt tabulku %1. - - + + This database has already been attached. Its schema name is '%1'. + + + + + Do you really want to close this temporary database? All data will be lost. + + + + + The database is currently busy: + Databáze je právě zaneprázdněná: + + + + Do you want to abort that other operation? + + + + + + No database file opened + + + + + Error in statement #%1: %2. Aborting execution%3. - - + + and rolling back - + + Cannot delete this object + Nemohu smazat tento objekt + + + Cannot set data on this object - + + A table with the name '%1' already exists in schema '%2'. + + + + renameColumn: cannot find column %1. renameColumn: nemohu nalézt sloupec %1. - + renameColumn: creating savepoint failed. DB says: %1 renameColumn: vytváření bodu obnovy selhalo. DB říká: %1 - + renameColumn: creating new table failed. DB says: %1 renameColumn: vytváření nové tabulky selhalo. DB říká: %1 - + renameColumn: copying data to new table failed. DB says: %1 renameColumn: kopírování dat do nové tabulky selhalo. DB říká: %1 - + renameColumn: deleting old table failed. DB says: %1 renameColumn: smazání staré tabulky selhalo. DB říká: %1 - + Restoring some of the objects associated with this table failed. This is most likely because some column names changed. Here's the SQL statement which you might want to fix and execute manually: - + renameColumn: releasing savepoint failed. DB says: %1 renameColumn: uvolňování bodu obnovy selhalo. DB říká: %1 - + Error renaming table '%1' to '%2'.Message from database engine: %3 Chyba při přejmenování tabulky '%1' to '%2'.Zpráva z databáze: %3 - + ... <string can not be logged, contains binary data> ... ... <string nemůže být zaznamenán, obsahuje binární data> ... - + + could not get list of databases: %1 + + + + + Error loading extension: %1 + Chyba při načítání přípony: %1 + + + could not get column information @@ -375,7 +550,7 @@ neznámý typ objektu %1 - + could not get list of db objects: %1, %2 nemohu získat seznam objektů db: %1, %2 @@ -384,22 +559,22 @@ nemohu získat typy - + didn't receive any output from pragma %1 - + could not execute pragma command: %1, %2 nemohu provést příkaz pragma: %1, %2 - + Error setting pragma %1 to %2: %3 Chyba při nastavování pragma %1 na %2: %3 - + File not found. Soubor nebyl nalezen. @@ -407,52 +582,66 @@ DbStructureModel - + Name Název - + Object Objekt - + Type Typ - + Schema Schéma - Browsables (%1) - Možné prohlížet (%1) + Možné prohlížet (%1) + + + + Database + Databáze + + + + Browsables + - + All Všechny - + + Temporary + Dočasný + + + Tables (%1) Tabulky (%1) - + Indices (%1) Indexy (%1) - + Views (%1) Pohledy (%1) - + Triggers (%1) Triggery (%1) @@ -470,181 +659,395 @@ Mód: - - + Image Obrázek - Import text - Importovat text + Importovat text - Opens a file dialog used to import text to this database cell. - Otevře dialog pro následný import textu do této databázové buňky. + Otevře dialog pro následný import textu do této databázové buňky. - + &Import &Import - Export text - Exportovat text + Exportovat text - Opens a file dialog used to export the contents of this database cell to a text file. - Otevře dialog pro následný export obsahu databázové buňky do textového souboru. + Otevře dialog pro následný export obsahu databázové buňky do textového souboru. - + &Export &Export - + Set this cell to NULL Nastavit buňku na hodnotu NULL - + Set as &NULL Nastavit na &NULL - + + Apply data to cell + + + + + This button saves the changes performed in the cell editor to the database cell. + + + + Apply Provést - + Text Text - + + This is the list of supported modes for the cell editor. Choose a mode for viewing or editing the data of the current cell. + + + + Binary Binární - + + JSON + + + + + XML + XML + + + + + Automatically adjust the editor mode to the loaded data type + + + + + This checkable button enables or disables the automatic switching of the editor mode. When a new cell is selected or new data is imported and the automatic switching is enabled, the mode adjusts to the detected data type. You can then change the editor mode manually. If you want to keep this manually switched mode while moving through the cells, switch the button off. + + + + + Auto-switch + + + + + + Auto-format: pretty print on loading, compact on saving. + + + + + When enabled, the auto-format feature formats the data on loading, breaking the text in lines and indenting it for maximum readability. On data saving, the auto-format feature compacts the data removing end of lines, and unnecessary whitespace. + + + + + Autoformat + + + + + Import from file + Importovat ze souboru + + + + Opens a file dialog used to import any kind of data to this database cell. + + + + + Export to file + Exportovat do souboru + + + + Opens a file dialog used to export the contents of this database cell to a file. + + + + Erases the contents of the cell Vymazat obsah buňky - + This area displays information about the data present in this database cell Tato oblast zobrazuje informace o aktuálních datech v této databázové buňce - + + This editor mode lets you edit JSON or XML data with syntax highlighting, automatic formatting and validation before saving. + +Errors are indicated with a red squiggle underline. + + + + Type of data currently in cell Současný typ dat v buňce - + Size of data currently in table Současná velikost dat v tabulce - + + + Print... + Tisk... + + + + Open preview dialog for printing displayed image + + + + + + Ctrl+P + Ctrl+P + + + + Open preview dialog for printing displayed text + + + + + Copy Hex and ASCII + + + + + Copy selected hexadecimal and ASCII columns to the clipboard + + + + + Ctrl+Shift+C + Ctrl+Shift+C + + Choose a file - Vybrat soubor + Vybrat soubor - Text files(*.txt);;Image files(%1);;All files(*) - Textové soubory(*.txt);;Soubory s obrázky(%1);;Všechny soubory(*) + Textové soubory(*.txt);;Soubory s obrázky(%1);;Všechny soubory(*) - + Choose a filename to export data Vyberte název souboru pro export dat - Text files(*.txt);;All files(*) - Textové soubory(*.txt);;Všechny soubory(*) + Textové soubory(*.txt);;Všechny soubory(*) - Image data can't be viewed with the text editor - Obrazová data nelze zobrazit pomocí textového editoru + Obrazová data nelze zobrazit pomocí textového editoru - Binary data can't be viewed with the text editor - Binární data nemohou být prohlížena v textovém editoru + Binární data nemohou být prohlížena v textovém editoru - + Type of data currently in cell: %1 Image Aktuální typ dat v buňce: %1 Obrázek - + %1x%2 pixel(s) %1x%2 pixel/ů - + Type of data currently in cell: NULL Aktuální typ dat v buňce: NULL - - + + Type of data currently in cell: Text / Numeric Aktuální typ dat v buňce: Text / Číselný - - - - %n char(s) - - %n znak - %n znaků - - + + + + Image data can't be viewed in this mode. + - - Type of data currently in cell: Binary - Aktuální typ dat v buňce: Binární + + + Try switching to Image or Binary mode. + - - - - %n byte(s) - - %n byte - %n bytů - - + + + + Binary data can't be viewed in this mode. + - - - EditIndexDialog - Create New Index - Vytvořit Nový Index + + + Try switching to Binary mode. + Zkuste přepnout do binárního režimu. - - &Name - &Název + + + + + Text files (*.txt) + Textové soubory (*.txt) - &Columns - &Sloupce + + + + JSON files (*.json) + Soubory JSON (*.json) - Column - Sloupec + + + + + XML files (*.xml) + Soubory XML (*.xml) + + + + + Image files (%1) + Soubory obrázků (%1) + + + + + + Binary files (*.bin) + Binární soubory (*.bin) + + + + + All files (*) + Všechny soubory (*) + + + + Choose a file to import + Vyberte soubor pro import + + + + %1 Image + %1 Obrázek + + + + SVG files (*.svg) + Soubory SVG (*.svg) + + + + + Hex dump files (*.txt) + + + + + Invalid data for this mode + Neplatná data pro tento režim + + + + The cell contains invalid %1 data. Reason: %2. Do you really want to apply it to the cell? + + + + + + + %n char(s) + + %n znak + %n znaků + + + + + + Type of data currently in cell: Valid JSON + + + + + Type of data currently in cell: Binary + Aktuální typ dat v buňce: Binární + + + + + %n byte(s) + + %n byte + %n bytů + + + + + + EditIndexDialog + + Create New Index + Vytvořit Nový Index + + + + &Name + Název + + + &Columns + Sloupce + + + Column + Sloupec @@ -654,17 +1057,17 @@ &Table - &Tabulka + Tabulka Edit Index Schema - + Upravit schéma indexů &Unique - &Unikátní + Unikátní @@ -679,12 +1082,12 @@ Colu&mns - + Sloupce Table column - + Sloupec tabulky @@ -699,16 +1102,16 @@ Index column - + Index sloupce - + Deleting the old index failed: %1 - + Creating the index failed: %1 Vytváření indexu se nezdařilo: @@ -734,122 +1137,121 @@ + Database schema + Schéma databáze + + + Make this a 'WITHOUT rowid' table. Setting this flag requires a field of type INTEGER with the primary key flag set and the auto increment flag unset. - + Without Rowid Bez id řádku - - Set this to create a temporary table that is deleted when closing the database. - - - - - Temporary table - - - - + Fields Pole - + Add field Přidat pole - + Remove field Odstranit pole - + Move field up Posunout pole nahoru - + Move field down Posunout pole dolů - + Name Název - + Type Typ - - + + NN + NN + + + Not null Není null - + PK PK - + Primary key Primární klíč - + AI AI - + Autoincrement Autoincrement - + U U - + Unique Unikátní - + Default Výchozí - + Default value Výchozí hodnota - + Check Zkontrolovat - + Check constraint Zkontrolovat omezení - + Foreign Key Cizí klíč - + <html><head/><body><p><span style=" font-weight:600; color:#ff0000;">Warning: </span>There is something with this table definition that our parser doesn't fully understand. Modifying and saving this table might result in problems.</p></body></html> @@ -858,74 +1260,74 @@ <html><head/><body><p><span style=" font-weight:600; color:#ff0000;">Upozornění: </span>Není něco v pořádku s definicí tabulky, jelikož ji náš parser plně neporozumněl. Úprava a uložení tabulky může vést k problémům.</p></body></html> - + Error creating table. Message from database engine: %1 Chyba při vytváření tabulky. Zpráva z databáze: %1 - + There already is a field with that name. Please rename it first or choose a different name for this field. Pole s tímto názvem již existuje. Nejdříve jej přejmenujte, nebo vyberte pro toto pole jiný název, prosím. - + This column is referenced in a foreign key in table %1 and thus its name cannot be changed. Tento sloupec je použit jako cizí klíč v tabulce %1 a jeho název nemůže být změněn. - + There is at least one row with this field set to NULL. This makes it impossible to set this flag. Please change the table data first. Existuje alespoň jeden řádek, který je nastaven na NULL. Z tohoto důvodu je nemožné nastavit tento flag. Nejprve změňte data v tabulce, prosím. - + There is at least one row with a non-integer value in this field. This makes it impossible to set the AI flag. Please change the table data first. Existuje alespoň jeden řádek, který neobsahuje hodnotu typu integer. Z tohoto důvodu je nemožné nastavit AI flag. Nejprve změňte data v tabulce, prosím. - + Column '%1' has no unique data. Sloupec '%1' neobsahuje unikátní data. - + This makes it impossible to set this flag. Please change the table data first. Není možné nastavit tento flag. Nejdříve změňte data v tabulce, prosím. - + Modifying this column failed. Error returned from database: %1 Úprava sloupce selhala. Chyba z databáze: %1 - + Are you sure you want to delete the field '%1'? All data currently stored in this field will be lost. - + Please add a field which meets the following criteria before setting the without rowid flag: - Primary key flag set - Auto increment disabled - + Setting the rowid column for the table failed. Error message: %1 V tabulce selhalo nastavování rowid sloupce. Chybová zpráva: %1 - - Setting the temporary flag for the table failed. Error message: + + Changing the table schema failed. Error message: %1 @@ -1015,44 +1417,54 @@ Pretty print - - + + Could not open output file: %1 Nemohu otevřít výstupní soubor: %1 - - + + Choose a filename to export data Vyberte název souboru pro export dat - + Text files(*.csv *.txt) Textové soubory(*.csv *.txt) - + Export data as JSON - + Exportovat data jako JSON + + + + exporting CSV + exportování CSV + + + + exporting JSON + exportování JSONu - + Text files(*.json *.js *.txt) Textové soubory(*.json *.js *.txt) - + Please select at least 1 table. Vyberte alespoň jednu tabulku, prosím. - + Choose a directory Vybrat složku - + Export completed. Export byl dokončen. @@ -1112,7 +1524,7 @@ Overwrite old schema (DROP TABLE, then CREATE TABLE) - + Přepsat staré schéma (DROP TABLE, then CREATE TABLE) @@ -1120,32 +1532,61 @@ Exportovat pouze schéma - Please select at least 1 table. - Vyberte alespoň jednu tabulku, prosím. + Vyberte alespoň jednu tabulku, prosím. + + + + Please select at least one table. + Vyberte prosím aspoň jednu tabulku. - + Choose a filename to export Vyberte název souboru pro export - + Text files(*.sql *.txt) Textové soubory(*.sql *.txt) - + Export completed. Export dokončen. - + Export cancelled or failed. Export byl zrušen nebo selhal. + ExtendedScintilla + + + + Ctrl+H + Ctrl+H + + + + + Ctrl+P + Ctrl+P + + + + Find and Replace... + Najít a nahradit... + + + + Print... + Tisk... + + + ExtendedTableWidget The content of clipboard is bigger than the range selected. @@ -1154,335 +1595,712 @@ Chcete jej přesto vložit? - - Set to NULL + + Use as Exact Filter - - Copy + + Containing - - Paste + + Not equal to - - The content of the clipboard is bigger than the range selected. -Do you want to insert it anyway? - + + Greater than + Větší než - - - FileDialog - SQLite database files (*.db *.sqlite *.sqlite3 *.db3);;All files (*) - Databázové soubory SQLite (*.db *.sqlite *.sqlite3 *.db3);;Všechny soubory (*) + + Less than + Menší než - - - FilterLineEdit - - Filter - Filtr + + Greater or equal + Větší nebo rovno - - - ForeignKeyEditor - - &Reset - + + Less or equal + Menší nebo rovno - - Foreign key clauses (ON UPDATE, ON DELETE etc.) - + + Between this and... + Mezi tímto a... - - - ImportCsvDialog - - Import CSV file - Importovat soubor CSV + + Set to NULL + Nastavit na NULL - - &Table name - &Název tabulky + + Copy + Kopírovat - - &Column names in first line - &Názvy sloupců v prvním řádku + + Copy with Headers + Kopírovat s hlavičkami - - Field &separator - Oddělovač &pole + + Copy as SQL + Kopírovat jako SQL - - , - , + + Paste + Vložit - - ; - ; + + Print... + Tisk... - - - Tab - Karta + + Use in Filter Expression + - - | - | + + Alt+Del + Alt+Del - - - - Other - Ostatní + + Ctrl+Shift+C + Ctrl+Shift+C - - &Quote character - &Uvozovka + + Ctrl+Alt+C + Ctrl+Alt+C - - " - " + + The content of the clipboard is bigger than the range selected. +Do you want to insert it anyway? + + + + FileDialog - - ' - ' + SQLite database files (*.db *.sqlite *.sqlite3 *.db3);;All files (*) + Databázové soubory SQLite (*.db *.sqlite *.sqlite3 *.db3);;Všechny soubory (*) + + + FileExtensionManager - - &Encoding - &Kódování + + File Extension Manager + - - UTF-8 - UTF-8 + + &Up + Nahoru - - UTF-16 - UTF-16 + + &Down + Dolů - - ISO-8859-1 - ISO-8859-1 + + &Add + Přidat - - Trim fields? - Ořezat pole? + + &Remove + Odstranit - - Separate tables - + + + Description + Popis - - - Deselect All - Zrušit výběr + + Extensions + Rozšíření - - Match Similar - + + *.extension + *.extension + + + FilterLineEdit - - Select All - Vybrat vše + + Filter + Filtr - - Inserting data... - Vkládám data... + + These input fields allow you to perform quick filters in the currently selected table. +By default, the rows containing the input text are filtered out. +The following operators are also supported: +% Wildcard +> Greater than +< Less than +>= Equal to or greater +<= Equal to or less += Equal to: exact match +<> Unequal: exact inverse match +x~y Range: values between x and y + - - Cancel - Zrušit + + Set Filter Expression + - - There is already a table of that name and an import into an existing table is only possible if the number of columns match. - Tabulka s tímto názvem již existuje. Import do existující tabulky je možný jen v případě stejného počtu sloupců. + + What's This? + Co je toto? - - There is already a table of that name. Do you want to import the data into it? - Tabulka s tímto názvem již existuje. Chcete data importovat do ní? + + Is NULL + je NULL - - Creating restore point failed: %1 - Vytváření bodu obnovy selhalo: %1 + + Is not NULL + Není NULL - - Creating the table failed: %1 - Vytváření tabulky selhalo: %1 + + Is empty + Je prázdný - - Missing field for record %1 - Chybí pole pro záznam %1 + + Is not empty + Není prázdný - - Inserting row failed: %1 - Vkládání řádku selhalo: %1 + + Equal to... + Rovný k... - - - MainWindow - - DB Browser for SQLite - DB Browser pro SQLite + + Not equal to... + Není rovný k... - - - toolBar1 - toolBar1 + + Greater than... + Větší než... - - Select a table to browse data - Vyberte tabulku pro prohlížení dat + + Less than... + Menší než... - - Use this list to select a table to be displayed in the database view - Pro zobrazení v databázovém pohledu použijte pro výběr tabulky tento seznam + + Greater or equal... + Větší nebo rovno... - - Refresh the data in the selected table. - Obnovit data ve vybrané tabulce. + + Less or equal... + Menší nebo rovno... - - This button refreshes the data in the currently selected table. - Toto tlačítko obnoví data v aktuálně vybrané tabulce. + + In range... + V rozmezí... + + + FindReplaceDialog - - SQLCipher &FAQ... - SQLCipher &FAQ... + + Find and Replace + Najít a nahradit - - Opens the SQLCipher FAQ in a browser window - Otevře SQLCipher FAQ v okně prohlížeče + + Fi&nd text: + Najít text - - Table(s) to JSON... - Tabulka/y do JSONu... + + Re&place with: + Nahradit s: - - Export one or more table(s) to a JSON file - Export jedné nebo více tabulek do souboru JSON + + Match &exact case + + + + + Match &only whole words + + + + + When enabled, the search continues from the other end when it reaches one end of the page + + + + + &Wrap around + + + + + When set, the search goes backwards from cursor position, otherwise it goes forward + + + + + Search &backwards + + + + + <html><head/><body><p>When checked, the pattern to find is interpreted as a UNIX regular expression. See <a href="https://en.wikibooks.org/wiki/Regular_Expressions">Regular Expression in Wikibooks</a>.</p></body></html> + + + + + Use regular e&xpressions + + + + + Find the next occurrence from the cursor position and in the direction set by "Search backwards" + + + + + &Find Next + Najít další + + + + &Replace + Nahradit + + + + Highlight all the occurrences of the text in the page + + + + + F&ind All + Najít vše + + + + Replace all the occurrences of the text in the page + + + + + Replace &All + Nahradit vše + + + + The searched text was not found + Hledaný text nebyl nalezen + + + + + The searched text was not found. + Hledaný text nebyl nalezen. + + + + The searched text was found one time. + Hledaný text byl nalezen jednou. + + + + The searched text was found %1 times. + Hledaný text byl nalezen %1 krát. + + + + The searched text was replaced one time. + Hledaný text byl nahrazen jednou. + + + + The searched text was replaced %1 times. + Hledaný text byl nahrazen %1 krát. + + + + ForeignKeyEditor + + + &Reset + + + + + Foreign key clauses (ON UPDATE, ON DELETE etc.) + + + + + ImportCsvDialog + + + Import CSV file + Importovat soubor CSV + + + &Table name + &Název tabulky + + + + Table na&me + Název tabulky + + + + &Column names in first line + &Názvy sloupců v prvním řádku + + + + Field &separator + Oddělovač pole + + + + , + , + + + + ; + ; + + + + + Tab + Karta + + + + | + | + + + + + + Other + Ostatní + + + + &Quote character + &Uvozovka + + + + " + " + + + + ' + ' + + + + &Encoding + Kódování + + + + UTF-8 + UTF-8 + + + + UTF-16 + UTF-16 + + + + ISO-8859-1 + ISO-8859-1 + + + + Trim fields? + Ořezat pole? + + + + Separate tables + Oddělit tabulky + + + + Advanced + Pokročilé + + + + When importing an empty value from the CSV file into an existing table with a default value for this column, that default value is inserted. Activate this option to insert an empty value instead. + + + + + Ignore default &values + Ignorovat výchozí hodnoty + + + + Activate this option to stop the import when trying to import an empty value into a NOT NULL column without a default value. + + + + + Fail on missing values + + + + + Disable data type detection + + + + + Disable the automatic data type detection when creating a new table. + + + + + + Deselect All + Zrušit celý výběr + + + + Match Similar + + + + + Select All + Vybrat vše + + + Inserting data... + Vkládám data... + + + Cancel + Zrušit + + + There is already a table of that name and an import into an existing table is only possible if the number of columns match. + Tabulka s tímto názvem již existuje. Import do existující tabulky je možný jen v případě stejného počtu sloupců. + + + There is already a table of that name. Do you want to import the data into it? + Tabulka s tímto názvem již existuje. Chcete data importovat do ní? + + + + Import completed + Import dokončen + + + + There is already a table named '%1' and an import into an existing table is only possible if the number of columns match. + + + + + There is already a table named '%1'. Do you want to import the data into it? + + + + + Creating restore point failed: %1 + Vytváření bodu obnovy selhalo: %1 + + + + Creating the table failed: %1 + Vytváření tabulky selhalo: %1 + + + + importing CSV + importování CSV + + + + Importing the file '%1' took %2ms. Of this %3ms were spent in the row function. + + + + Missing field for record %1 + Chybí pole pro záznam %1 + + + + Inserting row failed: %1 + Vkládání řádku selhalo: %1 + + + + MainWindow + + + DB Browser for SQLite + DB Browser pro SQLite + + + + toolBar1 + toolBar1 + + + + Select a table to browse data + Vyberte tabulku pro prohlížení dat + + + + Use this list to select a table to be displayed in the database view + Pro zobrazení v databázovém pohledu použijte pro výběr tabulky tento seznam + + + Refresh the data in the selected table. + Obnovit data ve vybrané tabulce. + + + + This button refreshes the data in the currently selected table. + Toto tlačítko obnoví data v aktuálně vybrané tabulce. + + + SQLCipher &FAQ... + SQLCipher FAQ... + + + + Opens the SQLCipher FAQ in a browser window + Otevře SQLCipher FAQ v okně prohlížeče + + + Table(s) to JSON... + Tabulka/y do JSONu... + + + + Export one or more table(s) to a JSON file + Export jedné nebo více tabulek do souboru JSON Open from Remote - Otevřít ze Vzdálena + Otevřít ze vzdálena Save to Remote - Uložit do Vzdálena + Uložit do vzdálena - + Refresh Obnovit - + F5 F5 - + Clear all filters Vymazat všechny filtry - + &Table: &Tabulka: - + Insert a new record in the current table Vložit nový záznam do současné tabulky - This button creates a new, empty record in the database - Toto tlačítko vytvoří nový, prázdný záznam v databázi + Toto tlačítko vytvoří nový, prázdný záznam v databázi - + + New Record Nový záznam - + Delete the current record Smazat aktuální záznam - This button deletes the record currently selected in the database - Toto tlačítko smaže právě vybraný záznam v databázi + Toto tlačítko smaže právě vybraný záznam v databázi - + + Delete Record Smazat záznam - This is the database view. You can double-click any record to edit its contents in the cell editor window. - Toto je pohled databáze. Můžete udělat double-click na jakýkoliv záznam pro jeho editaci obsahu v editoru buněk + Toto je pohled databáze. Můžete udělat double-click na jakýkoliv záznam pro jeho editaci obsahu v editoru buněk - + <html><head/><body><p>Scroll to the beginning</p></body></html> <html><head/><body><p>Posune na úplný začátek</p></body></html> - + <html><head/><body><p>Clicking this button navigates to the beginning in the table view above.</p></body></html> <html><head/><body><p>Kliknutím na toto tlačítko se přesunete na začátek pohledu tabulky výše.</p></body></html> - + |< |< @@ -1495,12 +2313,12 @@ <html><head/><body><p>Kliknutím na toto tlačítko se přesunete o 100 záznamů nahoru v pohledu tabulky výše.</p></body></html> - + < < - + 0 - 0 of 0 0 - 0 z 0 @@ -1513,241 +2331,170 @@ <html><head/><body><p>Kliknutím na toto tlačítko se přesunete o 100 záznamů dolů v pohledu tabulky nahoře</p></body></html> - + > > - + Scroll to the end Posunout na konec - + <html><head/><body><p>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Clicking this button navigates up to the end in the table view above.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</p></body></html> - + >| >| - + <html><head/><body><p>Click here to jump to the specified record</p></body></html> <html><head/><body><p>Kliknutím zde přeskočíte na určený záznam</p></body></html> - + <html><head/><body><p>This button is used to navigate to the record number specified in the Go to area.</p></body></html> <html><head/><body><p>Toto tlačítko je určeno k navigaci k záznamu, jehož číslo je nastaveno v poli Jít na.</p></body></html> - + Go to: Jít na: - + Enter record number to browse Vložte číslo záznamu pro jeho procházení - + Type a record number in this area and click the Go to: button to display the record in the database view Napiště číslo záznamu do tohoto pole a klikněte na Jít na: tlačítko k zobrazení záznamu v pohledu databáze - + 1 1 - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_auto_vacuum"><span style=" text-decoration: underline; color:#0000ff;">Auto Vacuum</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_auto_vacuum"><span style=" text-decoration: underline; color:#0000ff;">Auto Vacuum</span></a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_auto_vacuum"><span style=" text-decoration: underline; color:#0000ff;">Auto Vacuum</span></a></p></body></html> - None - Žádná + Žádná - - Full - Plná + Plná - Incremental - Inkrementální + Inkrementální - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_automatic_index"><span style=" text-decoration: underline; color:#0000ff;">Automatic Index</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_automatic_index"><span style=" text-decoration: underline; color:#0000ff;">Automatické Indexy</span></a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_automatic_index"><span style=" text-decoration: underline; color:#0000ff;">Automatické Indexy</span></a></p></body></html> - - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_checkpoint_fullfsync"><span style=" text-decoration: underline; color:#0000ff;">Checkpoint Full FSYNC</span></a></p></body></html> - - - - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_foreign_keys"><span style=" text-decoration: underline; color:#0000ff;">Foreign Keys</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_foreign_keys"><span style=" text-decoration: underline; color:#0000ff;">Cizí klíče</span></a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_foreign_keys"><span style=" text-decoration: underline; color:#0000ff;">Cizí klíče</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_fullfsync"><span style=" text-decoration: underline; color:#0000ff;">Full FSYNC</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_fullfsync"><span style=" text-decoration: underline; color:#0000ff;">Plný FSYNC</span></a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_fullfsync"><span style=" text-decoration: underline; color:#0000ff;">Plný FSYNC</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_ignore_check_constraints"><span style=" text-decoration: underline; color:#0000ff;">Ignore Check Constraints</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_ignore_check_constraints"><span style=" text-decoration: underline; color:#0000ff;">Ignorovat Kontrolu Omezení</span></a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_ignore_check_constraints"><span style=" text-decoration: underline; color:#0000ff;">Ignorovat Kontrolu Omezení</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_journal_mode"><span style=" text-decoration: underline; color:#0000ff;">Journal Mode</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_journal_mode"><span style=" text-decoration: underline; color:#0000ff;">Žurnálování</span></a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_journal_mode"><span style=" text-decoration: underline; color:#0000ff;">Žurnálování</span></a></p></body></html> - Delete - Smazat + Smazat - Truncate - Osekat + Osekat - Persist - Zachovat + Zachovat - - Memory - Paměť + Paměť - WAL - WAL + WAL - - Off - Vypnout + Vypnout - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_journal_size_limit"><span style=" text-decoration: underline; color:#0000ff;">Journal Size Limit</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_journal_size_limit"><span style=" text-decoration: underline; color:#0000ff;">Maximální velikost žurnálu</span></a></p></body></html> - - - - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_locking_mode"><span style=" text-decoration: underline; color:#0000ff;">Locking Mode</span></a></p></body></html> - - - - - - Normal - Normální - - - - Exclusive - Exkluzivní - - - - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_max_page_count"><span style=" text-decoration: underline; color:#0000ff;">Max Page Count</span></a></p></body></html> - - - - - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_page_size"><span style=" text-decoration: underline; color:#0000ff;">Page Size</span></a></p></body></html> - + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_journal_size_limit"><span style=" text-decoration: underline; color:#0000ff;">Maximální velikost žurnálu</span></a></p></body></html> - - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_recursive_triggers"><span style=" text-decoration: underline; color:#0000ff;">Recursive Triggers</span></a></p></body></html> - + Normal + Normální - - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_secure_delete"><span style=" text-decoration: underline; color:#0000ff;">Secure Delete</span></a></p></body></html> - + Exclusive + Exkluzivní - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_synchronous"><span style=" text-decoration: underline; color:#0000ff;">Synchronous</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_synchronous"><span style=" text-decoration: underline; color:#0000ff;">Synchronní</span></a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_synchronous"><span style=" text-decoration: underline; color:#0000ff;">Synchronní</span></a></p></body></html> - - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_temp_store"><span style=" text-decoration: underline; color:#0000ff;">Temp Store</span></a></p></body></html> - - - - Default - Výchozí + Výchozí - File - Soubor + Soubor - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_user_version"><span style=" text-decoration: underline; color:#0000ff;">User Version</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_user_version"><span style=" text-decoration: underline; color:#0000ff;">Verze Uživatele</span></a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_user_version"><span style=" text-decoration: underline; color:#0000ff;">Verze Uživatele</span></a></p></body></html> - - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_wal_autocheckpoint"><span style=" text-decoration: underline; color:#0000ff;">WAL Auto Checkpoint</span></a></p></body></html> - - - - + &File &Soubor - + &Import &Import - + &Export &Export - - &Open Database Read Only... - - - - + Open an existing database file in read only mode - + Unlock view editing - + This unlocks the current view for editing. However, you will need appropriate triggers for editing. @@ -1756,113 +2503,113 @@ Vzdálený - + &Edit Upravit - + &View - &Pohled + Pohled - + &Help - &Pomoc + Pomoc - + DB Toolbar Panel nástrojů DB - + Edit Database &Cell - Upravit databázovou &buňku + Upravit databázovou buňku - + DB Sche&ma DB Schéma - - Execute SQL [F5, Ctrl+Return, Ctrl+R] - Proveďte SQL [F5, Ctrl+Return, Ctrl+R] + Execute SQL + Proveďte SQL - &Load extension - Načíst rozšíření + Načíst rozšíření + + + + Execute current line + Provést aktuální řádek - - Execute current line [Shift+F5] - Provést aktuální řádek [Shift+F5] + + This button executes the SQL statement present in the current editor line + - + Shift+F5 Shift+F5 - Sa&ve Project - Ulo&žit Projekt + Ulo&žit Projekt - Open &Project - Otevřít &Projekt + Otevřít projekt - &Set Encryption - Nastavit šifrování + Nastavit šifrování - + Edit display format Upravit formát zobrazení - + Edit the display format of the data in this column Upravit formát zobrazení dat v tomto sloupci - + Show rowid column Zobrazit rowid sloupce - + Toggle the visibility of the rowid column Přepnout viditelnost rowid sloupců - - + + Set encoding Nastavit kódování - + Change the encoding of the text in the table cells Změnit kódování textu v buňkách tabulky - + Set encoding for all tables Nastavit kódování pro všechny tabulky - + Change the default encoding assumed for all tables in the database - + User Uživatel @@ -1872,27 +2619,27 @@ Databázová Struktura - + Browse Data Prohlížet data - + Edit Pragmas Editovat Pragma - + Execute SQL Provést SQL - + Application Aplikace - + &Clear &Vyčistit @@ -1977,462 +2724,937 @@ PlusČtverec - + &New Database... Nová databáze... - - + + Create a new database file Vytvořit nový databázový soubor - + This option is used to create a new database file. Tato volba slouží k vytvoření nového souboru databáze. - + Ctrl+N Ctrl+N - + + &Open Database... Otevřít databázi... - - - + + + + + Open an existing database file Otevřít existující soubor databáze - - + + + This option is used to open an existing database file. Tato volba slouží k otevření existujícího souboru databáze. - + + Ctrl+O Ctrl+O - - &Close Database - &Zavřít databázi + + &Close Database + &Zavřít databázi + + + + This button closes the connection to the currently open database file + + + + + Ctrl+W + Ctrl+W + + + + + Revert database to last saved state + Vrátit databázi do posledního uloženého stavu + + + + This option is used to revert the current database file to its last saved state. All changes made since the last save operation are lost. + + + + + + Write changes to the database file + Zapsat změny do souboru databáze + + + + This option is used to save changes to the database file. + Tato volba slouží k uložení provedených změn do souboru databáze. + + + + Ctrl+S + Ctrl+S + + + + Compact &Database... + + + + + Compact the database file, removing space wasted by deleted records + + + + + + Compact the database file, removing space wasted by deleted records. + + + + + E&xit + Exit + + + + Ctrl+Q + Ctrl+Q + + + + Import data from an .sql dump text file into a new or existing database. + Importovat data z textového souboru .sql do nové nebo již existující databáze. + + + + This option lets you import data from an .sql dump text file into a new or existing database. SQL dump files can be created on most database engines, including MySQL and PostgreSQL. + + + + + Open a wizard that lets you import data from a comma separated text file into a database table. + Otevře průzkumníka, kde můžete importovat data z textového souboru, kde jsou data oddělena čárkami, do databázové tabulky. + + + + Open a wizard that lets you import data from a comma separated text file into a database table. CSV files can be created on most database and spreadsheet applications. + + + + + Export a database to a .sql dump text file. + Exportovat databázi do textového souboru .sql + + + + This option lets you export a database to a .sql dump text file. SQL dump files contain all data necessary to recreate the database on most database engines, including MySQL and PostgreSQL. + + + + + Export a database table as a comma separated text file. + Exportovat databázovou tabulku jako textový soubor oddělený čárkami. + + + + Export a database table as a comma separated text file, ready to be imported into other database or spreadsheet applications. + + + + + Open the Create Table wizard, where it is possible to define the name and fields for a new table in the database + + + + + + Delete Table + Smazat Tabulku + + + + Open the Delete Table wizard, where you can select a database table to be dropped. + + + + + Open the Modify Table wizard, where it is possible to rename an existing table. It is also possible to add or delete fields form a table, as well as modify field names and types. + + + + + Open the Create Index wizard, where it is possible to define a new index on an existing database table. + + + + + &Preferences... + &Možnosti... + + + + + Open the preferences window. + Otevřít okno s možnostmi. + + + + &DB Toolbar + Panel nástrojů DB + + + + Shows or hides the Database toolbar. + Zobrazí nebo skryje lištu Databáze. + + + + Shift+F1 + Shift+F1 + + + + &Wiki + Wiki + + + + Bug &Report... + Nahlásit chybu... + + + + Feature Re&quest... + Požadavek na funkci... + + + + Web&site + Webová stránka + + + + &Donate on Patreon... + Přispět na Patreon... + + + + Sa&ve Project... + Uložit projekt... + + + + This button lets you open a DB4S project file + + + + + &Attach Database... + Přiložit databázi... + + + + + Add another database file to the current database connection + + + + + This button lets you add another database file to the current database connection + + + + + &Set Encryption... + Nastavit šifrování... + + + + SQLCipher &FAQ + SQLCipher FAQ + + + + Table(&s) to JSON... + Tabulka(ky) do JSONu... + + + + Open Data&base Read Only... + + + + + Save results + Uložit výsledky + + + + Save the results view + + + + + This button lets you save the results of the last executed query + + + + + Find text in SQL editor + Najít text v SQL editoru + + + + Find text in SQL editor + Najít text v SQL editoru + + + + This button opens the search bar of the editor + + + + + Ctrl+F + Ctrl+F + + + + Find or replace text in SQL editor + Najít a nahradit text v SQL editoru + + + + Find or replace text in SQL editor + Najít a nahradit text v SQL editoru + + + + This button opens the find/replace dialog for the current editor tab + + + + + + Export to &CSV + Export do CSV + + + + + Save as &view + Uložit jako pohled + + + + Save as view + Uložit jako pohled + + + + Hide column(s) + Skrýt sloupec(ce) + + + + Hide selected column(s) + Skrýt vybraný sloupec(ce) + + + + Show all columns + Zobrazit všechny sloupce + + + + Show all columns that were hidden + + + + + Shows or hides the Project toolbar. + Zobrazit nebo skrýt lištu projektu + + + + Extra DB Toolbar + Extra DB Toolbar + + + + + Export the filtered data to CSV + + + + + This button exports the data of the browsed table as currently displayed (after filters, display formats and order column) as a CSV file. + + + + + + Save the current filter, sort column and display formats as a view + + + + + This button saves the current setting of the browsed table (filters, display formats and order column) as an SQL view that you can later browse or use in SQL statements. + + + + + Insert Values... + Vložit hodnoty... + + + + + Open a dialog for inserting values in a new record + + + + + + Insert new record using default values in browsed table + + + + + New In-&Memory Database + + + + + Drag && Drop Qualified Names + - - Ctrl+W - Ctrl+W + + + Use qualified names (e.g. "Table"."Field") when dragging the objects and dropping them into the editor + - - Revert database to last saved state - Vrátit databázi do posledního uloženého stavu + + Drag && Drop Enquoted Names + - - This option is used to revert the current database file to its last saved state. All changes made since the last save operation are lost. - + + + Use escaped identifiers (e.g. "Table1") when dragging the objects and dropping them into the editor + - - Write changes to the database file - Zapsat změny do souboru databáze + + &Integrity Check + - - This option is used to save changes to the database file. - Tato volba slouží k uložení provedených změn do souboru databáze. + + Runs the integrity_check pragma over the opened database and returns the results in the Execute SQL tab. This pragma does an integrity check of the entire database. + - - Ctrl+S - Ctrl+S + + &Foreign-Key Check + - - Compact the database file, removing space wasted by deleted records - + + Runs the foreign_key_check pragma over the opened database and returns the results in the Execute SQL tab + - - - Compact the database file, removing space wasted by deleted records. - + + &Quick Integrity Check + - - E&xit - E&xit + + Run a quick integrity check over the open DB + - - Ctrl+Q - Ctrl+Q + + Runs the quick_check pragma over the opened database and returns the results in the Execute SQL tab. This command does most of the checking of PRAGMA integrity_check but runs much faster. + - - Import data from an .sql dump text file into a new or existing database. - Importovat data z textového souboru .sql do nové nebo již existující databáze. + + &Optimize + - - This option lets you import data from an .sql dump text file into a new or existing database. SQL dump files can be created on most database engines, including MySQL and PostgreSQL. - + + Attempt to optimize the database + - - Open a wizard that lets you import data from a comma separated text file into a database table. - Otevře průzkumníka, kde můžete importovat data z textového souboru, kde jsou data oddělena čárkami, do databázové tabulky. + + Runs the optimize pragma over the opened database. This pragma might perform optimizations that will improve the performance of future queries. + - - Open a wizard that lets you import data from a comma separated text file into a database table. CSV files can be created on most database and spreadsheet applications. - + + + Print + Tisk - - Export a database to a .sql dump text file. - Exportovat databázi do textového souboru .sql + + Print text from current SQL editor tab + - - This option lets you export a database to a .sql dump text file. SQL dump files contain all data necessary to recreate the database on most database engines, including MySQL and PostgreSQL. - + + Open a dialog for printing the text in the current SQL editor tab + - - Export a database table as a comma separated text file. - Exportovat databázovou tabulku jako textový soubor oddělený čárkami. + + Print the structure of the opened database + - - Export a database table as a comma separated text file, ready to be imported into other database or spreadsheet applications. - + + Open a dialog for printing the structure of the opened database + - - Open the Create Table wizard, where it is possible to define the name and fields for a new table in the database - + &About... + O... - - - - Delete Table - Smazat Tabulku + + &Recently opened + &Nedávno otevřené - - Open the Delete Table wizard, where you can select a database table to be dropped. - + + Open &tab + Otevřít kartu - - Open the Modify Table wizard, where it is possible to rename an existing table. It is also possible to add or delete fields form a table, as well as modify field names and types. - + + + Ctrl+T + Ctrl+T - - Open the Create Index wizard, where it is possible to define a new index on an existing database table. - + + This is the structure of the opened database. +You can drag SQL statements from an object row and drop them into other applications or into another instance of 'DB Browser for SQLite'. + + - - &Preferences... - &Možnosti... + + Refresh the data in the selected table + - - - Open the preferences window. - Otevřít okno s možnostmi. + + This button clears all the filters set in the header input fields for the currently browsed table. + - - &DB Toolbar - Panel nástrojů DB + + Save the table as currently displayed + - - Shows or hides the Database toolbar. - Zobrazí nebo skryje lištu Databáze. + + <html><head/><body><p>This popup menu provides the following options applying to the currently browsed and filtered table:</p><ul style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;"><li style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Export to CSV: this option exports the data of the browsed table as currently displayed (after filters, display formats and order column) to a CSV file.</li><li style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Save as view: this option saves the current setting of the browsed table (filters, display formats and order column) as an SQL view that you can later browse or use in SQL statements.</li></ul></body></html> + - - Shift+F1 - Shift+F1 + + ... + ... - - &About... - &O... + + Print currently browsed table data + Tisk právě prohlížených dat tabulky - - &Recently opened - &Nedávno otevřeno + + Print currently browsed table data. Print selection if more than one cell is selected. + - - Open &tab - Otevřít &kartu + + <html><head/><body><p>This button creates a new record in the database. Hold the mouse button to open a pop-up menu of different options:</p><ul><li><span style=" font-weight:600;">New Record</span>: insert a new record with default values in the database.</li><li><span style=" font-weight:600;">Insert Values...</span>: open a dialog for entering values before they are inserted in the database. This allows to enter values acomplishing the different constraints. This dialog is also open if the <span style=" font-weight:600;">New Record</span> option fails due to these constraints.</li></ul></body></html> + - - - Ctrl+T - Ctrl+T + + This button deletes the record or records currently selected in the table + + This is the database table view. You can do the following actions: + - Start writing for editing inline the value. + - Double-click any record to edit its contents in the cell editor window. + - Alt+Del for deleting the cell content to NULL. + - Ctrl+" for duplicating the current record. + - Ctrl+' for copying the value from the cell above. + - Standard selection and copy/paste operations. + + + + Scroll one page upwards - + <html><head/><body><p>Clicking this button navigates one page of records upwards in the table view above.</p></body></html> - + Scroll one page downwards - + <html><head/><body><p>Clicking this button navigates one page of records downwards in the table view above.</p></body></html> - + + <html><head/><body><p><a href="https://www.sqlite.org/pragma.html#pragma_case_sensitive_like">Case Sensitive Like</a></p></body></html> + + + + + Warning: this pragma is not readable and this value has been inferred. Writing the pragma might overwrite a redefined LIKE provided by an SQLite extension. + + + + + &Tools + Nástroje + + + SQL &Log SQL &Log - + Show S&QL submitted by - + + This button clears the contents of the SQL logs + + + + + This panel lets you examine a log of all SQL commands issued by the application or by yourself + + + + &Plot - - &Remote + + This is the structure of the opened database. +You can drag multiple object names from the Name column and drop them into the SQL editor and you can adjust the properties of the dropped names using the context menu. This would help you in composing SQL statements. +You can drag SQL statements from the Schema column and drop them into the SQL editor or into other applications. + - - &Revert Changes - &Vrátit Změny + + &Remote + Vzdálené - - &Write Changes - &Zapsat Změny + + + Project Toolbar + + + + + Extra DB toolbar + Extra DB toolbar - - Compact &Database + + + + Close the current database file - + + &Revert Changes + Vrátit Změny + + + + &Write Changes + Zapsat Změny + + + &Database from SQL file... - &Databáze z SQL souboru... + Databáze z SQL souboru... - + &Table from CSV file... - &Tabulka ze souboru CSV... + Tabulka ze souboru CSV... - + &Database to SQL file... - &Databáze do souboru SQL... + Databáze do souboru SQL... - + &Table(s) as CSV file... Tabulka/ky jako soubor CSV... - + &Create Table... - &Vytvořit Tabulku... + Vytvořit Tabulku... - + &Delete Table... - &Smazat Tabulku... + Smazat Tabulku... - + &Modify Table... - &Upravit Tabulku... + Upravit Tabulku... - + Create &Index... - Vytvořit &Index... + Vytvořit Index... - + W&hat's This? Co je toto? - + + &About + O + + + + This button opens a new tab for the SQL editor + + + + &Execute SQL &Provést příkaz SQL - + + Execute all/selected SQL + Provést všechny/vybrané SQL + + + + This button executes the currently selected SQL statements. If no text is selected, all SQL statements are executed. + + + + Open SQL file Otevřít SQL soubor - - - + + This button opens a file containing SQL statements and loads it in a new editor tab + + + + + + Save SQL file Uložit SQL soubor - + + &Load Extension... + Načíst rozšíření... + + + Execute current line Vykonat aktuální řádek - + Ctrl+E Ctrl+E - + Export as CSV file Exportovat jako soubor CSV - + Export table as comma separated values file Exportovat tabulku do souboru jako hodnoty oddělené čárkami - &Wiki... - &Wiki... + &Wiki... - Bug &report... - Nahlášení &chyby... + Nahlášení &chyby... - Web&site... - Webová&stránka... + Webová&stránka... - - + + Save the current session to a file Uložit aktuální session do souboru - - + + This button lets you save all the settings associated to the open DB to a DB4S project file + + + + + Open &Project... + Otevřít projekt... + + + + Load a working session from a file - &Attach Database - &Přiložit Databázi + &Přiložit databázi - - + + Save SQL file as Uložit soubor SQL jako - + + This button saves the content of the current SQL editor tab to a file + + + + &Browse Table &Prohlížet Tabulku - + Copy Create statement Kopírovat příkaz Create - + Copy the CREATE statement of the item to the clipboard Zkopírovat do schránky příkaz CREATE - + Ctrl+Return Ctrl+Return - + Ctrl+L Ctrl+L - + Ctrl+P Ctrl+P - + Ctrl+D Ctrl+D - + Ctrl+I Ctrl+I - + Encrypted Šifrováno - + Read only Pouze pro čtení - + Database file is read only. Editing the database is disabled. Soubor databáze je určen pouze pro čtení. Úprava databáze je zakázána. - + Database encoding Kódování databáze - + Database is encrypted using SQLCipher Databáze je šifrována přes SQLCipher - - + + Choose a database file Vyberte soubor databáze @@ -2441,54 +3663,51 @@ Nesprávný formát souboru. - - - + + + Choose a filename to save under Vyberte název souboru pro uložení - Error adding record: - Chyba při přidávání záznamu: + Chyba při přidávání záznamu: - + Error deleting record: %1 Chyba při mazání záznamu: %1 - + Please select a record first Prosím vyberte záznam jako první - + %1 - %2 of %3 %1 - %2 z %3 - - + + There is no database opened. Please open or create a new database file. Žádná databáze není otevřena. Otevřete nebo vytvořte nový soubor databáze, prosím. - Are you sure you want to delete the %1 '%2'? All data associated with the %1 will be lost. - Jste si jisti, že chcete smazat %1 '%2'? + Jste si jisti, že chcete smazat %1 '%2'? Všechna přidružená data se %1 budou ztracena. - Error: could not delete the %1. Message from database engine: %2 - Chyba: nemohu smazat %1. Zpráva z databáze: + Chyba: nemohu smazat %1. Zpráva z databáze: %2 @@ -2496,221 +3715,410 @@ Žádná databáze není otevřena. - Error executing query: %1 - Chyba při vykonávání příkazu: %1 + Chyba při vykonávání příkazu: %1 - %1 rows returned in %2ms from: %3 - %1 řádků vráceno za %2ms z: %3 + %1 řádků vráceno za %2ms z: %3 - + , %1 rows affected , %1 řádků bylo ovlivněno - Query executed successfully: %1 (took %2ms%3) - Příkaz byl proveden úspěšně: %1 (za dobu %2ms%3) + Příkaz byl proveden úspěšně: %1 (za dobu %2ms%3) Choose a text file Vyberte textový soubor - + Text files(*.csv *.txt);;All files(*) Textové soubory(*.csv *.txt);;Všechny soubory(*) - Import completed - Import dokončen + Import dokončen - + Error while saving the database file. This means that not all changes to the database were saved. You need to resolve the following error first. %1 - + Are you sure you want to undo all changes made to the database file '%1' since the last save? Jste si jisti, že chcete vrátit zpět všechny provedené změny v databázi '%1' od posledního uložení? - + Choose a file to import Vyberte soubor pro import - - - + + + Text files(*.sql *.txt);;All files(*) Textové soubory(*.sql *.txt);;Všechny soubory(*) - + Do you want to create a new database file to hold the imported data? If you answer no we will attempt to import the data in the SQL file to the current database. - + File %1 already exists. Please choose a different name. Soubor %1 již existuje. Vyberte jiný název, prosím. - - Error importing data: %1 - Chyba při importu dat: %1 + + Error importing data: %1 + Chyba při importu dat: %1 + + + + Import completed. + Import dokončen. + + + + Delete View + Smazat Pohled + + + + Modify View + + + + + Delete Trigger + Smazat Spoušť + + + + Modify Trigger + + + + + Delete Index + Smazat Index + + + + Modify Index + Změnit Index + + + + Modify Table + Změnit tabulku + + + + &%1 %2 + &%1 %2 + + + + Choose a project file to open + Vybrat soubor projektu k otevření + + + + This project file is using an old file format because it was created using DB Browser for SQLite version 3.10 or lower. Loading this file format is still fully supported but we advice you to convert all your project files to the new file format because support for older formats might be dropped at some point in the future. You can convert your files by simply opening and re-saving them. + + + + + Duplicate records + + + + + Duplicate record + + + + + Ctrl+" + Ctrl+ + + + + Please enter a pseudo-primary key in order to enable editing on this view. This should be the name of a unique column in the view. + + + + + Setting PRAGMA values will commit your current transaction. +Are you sure? + + + + + Could not open database file. +Reason: %1 + + + + + In-Memory database + + + + + determining row count... + + + + + %1 - %2 of >= %3 + + + + + Are you sure you want to delete the table '%1'? +All data associated with the table will be lost. + - - Import completed. - Import dokončen. + + Are you sure you want to delete the view '%1'? + - - - Delete View - Smazat Pohled + + Are you sure you want to delete the trigger '%1'? + - - - Modify View + + Are you sure you want to delete the index '%1'? - - - Delete Trigger - Smazat Spoušť + + Error: could not delete the table. + - - - Modify Trigger + + Error: could not delete the view. - - - Delete Index - Smazat Index + + Error: could not delete the trigger. + - - - Modify Index + + Error: could not delete the index. - - - Modify Table + + Message from database engine: +%1 - - &%1 %2 - &%1 %2 + + Editing the table requires to save all pending changes now. +Are you sure you want to save the database? + - - Please enter a pseudo-primary key in order to enable editing on this view. This should be the name of a unique column in the view. + + -- EXECUTING SELECTION IN '%1' +-- - - Setting PRAGMA values will commit your current transaction. -Are you sure? - + + -- EXECUTING LINE IN '%1' +-- + - - Could not open database file. -Reason: %1 + + -- EXECUTING ALL IN '%1' +-- - + Setting PRAGMA values or vacuuming will commit your current transaction. Are you sure? - + Execution aborted by user - - Choose text files + + executing query + + + + + %1 rows returned in %2ms + + + + + query executed successfully. Took %1ms%2 + + + + + -- At line %1: +%4 +-- Result: %3 + + Choose text files + Vybrat textové soubory + + + Import completed. Some foreign key constraints are violated. Please fix them before saving. + + + + Select SQL file to open Vyberte soubor SQL k otevření - + Couldn't read file: %1. - + Couldn't save file: %1. - + Select file name Vyberte název souboru - + Select extension file Vyberte soubor s rozšířením - + Extensions(*.so *.dll);;All files(*) Přípony(*.so *.dll);;Všechny soubory(*) - + Extension successfully loaded. Rozšíření bylo úspěšně načteno. - - + Error loading extension: %1 Chyba při načítání přípony: %1 - + + Don't show again Znovu nezobrazovat - + New version available. Dostupná nová verze. - + A new DB Browser for SQLite version is available (%1.%2.%3).<br/><br/>Please download at <a href='%4'>%4</a>. Nová verze DB Browseru pro SQLite je nyní dostupná (%1.%2.%3).<br/><br/>Stáhněte ji prosím na <a href='%4'>%4</a>. + + Collation needed! Proceed? + Je potřeba provést collation! Potvrdit? + + + + A table in this database requires a special collation function '%1' that this application can't provide without further knowledge. +If you choose to proceed, be aware bad things can happen to your database. +Create a backup! + + + + + creating collation + + + + + Set a new name for the SQL tab. Use the '&&' character to allow using the following character as a keyboard shortcut. + + + + + Please specify the view name + Specifikujte název pohledu, prosím + + + + There is already an object with that name. Please choose a different name. + Objekt s tímto názvem již existuje. Vyberte jiný název, prosím. + + + + View successfully created. + Pohled byl úspěšně vytvořen. + + + + Error creating view: %1 + Chyba při vytváření pohledu: %1 + + + + There is no filter set for this table. View will not be created. + + + + + Delete Records + + + + + This action will open a new SQL tab for running: + + + + + Press Help for opening the corresponding SQLite reference page. + + + Row # Řádek # @@ -2731,35 +4139,44 @@ Zadejte URL k databázového souboru pro jeho uložení, prosím. - Choose a file to open - Vyberte soubor k otevření + Vyberte soubor k otevření - - + + DB Browser for SQLite project file (*.sqbpro) DB Browser pro SQLite project file (*.sqbpro) - + Please choose a new encoding for this table. Vyberte nové kódování pro tuto tabulku, prosím. - + Please choose a new encoding for all tables. Vyberte nové kódování pro všechny tabulky, prosím. - + + Error checking foreign keys after table modification. The changes will be reverted. + + + + + This table did not pass a foreign-key check.<br/>You should run 'Tools | Foreign-Key Check' and fix the reported issues. + + + + %1 Leave the field empty for using the database encoding. %1 Pro použití kódování databáze ponechte pole prázdné. - + This encoding is either not valid or not supported. Toto kódování není buď platné, nebo podporováno. @@ -2773,6 +4190,19 @@ + NullLineEdit + + + Set to NULL + Nastavit na NULL + + + + Alt+Del + Alt+Del + + + PlotDock @@ -2780,182 +4210,267 @@ - + + <html><head/><body><p>This pane shows the list of columns of the currently browsed table or the just executed query. You can select the columns that you want to be used as X or Y axis for the plot pane below. The table shows detected axis type that will affect the resulting plot. For the Y axis you can only select numeric columns, but for the X axis you will be able to select:</p><ul style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;"><li style=" margin-top:12px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Date/Time</span>: strings with format &quot;yyyy-MM-dd hh:mm:ss&quot; or &quot;yyyy-MM-ddThh:mm:ss&quot;</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Date</span>: strings with format &quot;yyyy-MM-dd&quot;</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Time</span>: strings with format &quot;hh:mm:ss&quot;</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Label</span>: other string formats. Selecting this column as X axis will produce a Bars plot with the column values as labels for the bars</li><li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Numeric</span>: integer or real values</li></ul><p>Double-clicking the Y cells you can change the used color for that graph.</p></body></html> + + + + Columns Sloupce - + X X - + Y Y - _ - _ + _ + + + + Axis Type + + + + + Here is a plot drawn when you select the x and y values above. + +Click on points to select them in the plot and in the table. Ctrl+Click for selecting a range of points. + +Use mouse-wheel for zooming and mouse drag for changing the axis range. + +Select the axes or axes labels to drag and zoom only in that orientation. + - + Line type: Typ řádku: - - + + None Žádná - + Line Řádek - + StepLeft KrokVlevo - + StepRight KrokVpravo - + StepCenter KrokDoprostřed - + Impulse Impuls - + Point shape: - + Cross Kříž - + Plus Plus - + Circle Kruh - + Disc Disk - + Square Čtverec - + Diamond Diamand - + Star Hvězda - + Triangle Trojúhelník - + TriangleInverted ObrácenýTrojúhelník - + CrossSquare - + PlusSquare PlusČtverec - + CrossCircle - + PlusCircle - + Peace - + <html><head/><body><p>Save current plot...</p><p>File format chosen by extension (png, jpg, pdf, bmp)</p></body></html> - + Save current plot... - - Load all data. This has only an effect if not all data has been fetched from the table yet due to the partial fetch mechanism. + + + Load all data and redraw plot - - - + + + Row # Řádek # - Choose a axis color + Vyberte barvu osy + + + + Copy + + + + + Print... + Tisk... + + + + Show legend + Zobrazit legendu + + + + Stacked bars + + + + + Date/Time + Datum/čas + + + + Date + Datum + + + + Time + Čas + + + + + Numeric + + + + + Label + Štítek + + + + Invalid + + + + + Load all data and redraw plot. +Warning: not all data has been fetched from the table yet due to the partial fetch mechanism. + + + + + Choose an axis color Vyberte barvu osy - + Choose a filename to save under Vyberte název souboru pro uložení - + PNG(*.png);;JPG(*.jpg);;PDF(*.pdf);;BMP(*.bmp);;All Files(*) PNG(*.png);;JPG(*.jpg);;PDF(*.pdf);;BMP(*.bmp);;Všechny Soubory(*) - + + There are curves in this plot and the selected line style can only be applied to graphs sorted by X. Either sort the table or query by X to remove curves or select one of the styles supported by curves: None or Line. + + + Fetching all data... - Načítám všechna data... + Načítám všechna data... - Cancel - Zrušit + Zrušit @@ -2987,8 +4502,8 @@ - - + + ... ... @@ -3003,476 +4518,648 @@ Jazyk - + Automatic &updates Automatické &aktualizace - - - - - - + + + + + + + + enabled povoleno - + Show remote options Zobrazit vzdálené možnosti - + &Database &Databáze - + Database &encoding Kódování &databáze - + Open databases with foreign keys enabled. Otevře databázi s povolenými cizími klíči. - + &Foreign keys &Cizí klíče - + SQ&L to execute after opening database SQ&L k vykonání po otevření databáze - + Data &Browser - Prohlížeč &Dat + Prohlížeč Dat - NULL fields - pole s NULL + pole s NULL - &Text - &Text + Text - + Remove line breaks in schema &view - + Prefetch block si&ze - + Advanced Pokročilé - + Default field type Výchozí typ pole - + Font Font - + &Font &Font - Font si&ze: - Velikost fontu + Velikost fontu - + Content Obsah - + Symbol limit in cell Maximální počet znaků v buňce - Field colors - Barvy pole + Barvy pole - + NULL NULL - + Regular Regulární - Text - Text + Text - + Binary Binární - + Background Pozadí - + Filters Filtry - + Escape character - + Delay time (&ms) Zpoždění (&ms) - + Set the waiting time before a new filter value is applied. Can be set to 0 for disabling waiting. - + &SQL &SQL - + Settings name Název možností - + Context Kontext - + Colour Barva - + Bold Tučný - + Italic Kurzíva - + Underline Podtržený - + Keyword Klíčové slovo - function - funkce + funkce - + Function Funkce - + Table Tabulka - + Comment Komentář - + Identifier Identifikátor - + String String - currentline - aktuální řádek + aktuální řádek - + Current line Aktuální řádek - + SQL &editor font size velikost fontu SQL &editoru - SQL &log font size - Velikost fontu SQL &logu + Velikost fontu SQL &logu - + Tab size - - SQL editor &font - &font SQL editoru + + SQL editor &font + &font SQL editoru + + + + Error indicators + + + + + Hori&zontal tiling + + + + + If enabled the SQL code editor and the result table view are shown side by side instead of one over the other. + + + + + Code co&mpletion + + + + + Toolbar style + + + + + Only display the icon + + + + + Only display the text + + + + + The text appears beside the icon + + + + + The text appears under the icon + + + + + Follow the style + + + + + DB file extensions + + + + + Manage + + + + + When enabled, the line breaks in the Schema column of the DB Structure tab, dock and printed output are removed. + + + + + Font si&ze + Velikost písma + + + + + This is the maximum number of rows in a table for enabling the value completion based on current values in the column. +Can be set to 0 for disabling completion. + + + + + Row count threshold for completion + + + + + Field display + + + + + Displayed &text + + + + + Text color + Barva textu + + + + Background color + Barva pozadí + + + + Preview only (N/A) + + + + + Foreground + Popředí + + + + SQL &results font size + + + + + &Wrap lines + + + + + Never + Nikdy + + + + At word boundaries + + + + + At character boundaries + + + + + At whitespace boundaries + + + + + &Quotes for identifiers + + + + + Choose the quoting mechanism used by the application for identifiers in SQL code. + + + + + "Double quotes" - Standard SQL (recommended) + - - Error indicators + + `Grave accents` - Traditional MySQL quotes - - Enabling error indicators highlights the SQL code lines that caused errors during the last execution + + [Square brackets] - Traditional MS SQL Server quotes - - Hori&zontal tiling + + Keywords in &UPPER CASE - - If enabled the SQL code editor and the result table view are shown side by side instead of one over the other. + + When set, the SQL keywords are completed in UPPER CASE letters. - - Code co&mpletion + + When set, the SQL code lines that caused errors during the last execution are highlighted and the results frame indicates the error in the background - + &Extensions &Rozšíření - + Select extensions to load for every database: Vyberte rozšíření k načtení pro každou databázi: - + Add extension Přidat rozšíření - + Remove extension Odebrat rozšíření - + <html><head/><body><p>While supporting the REGEXP operator SQLite doesn't implement any regular expression<br/>algorithm but calls back the running application. DB Browser for SQLite implements this<br/>algorithm for you to let you use REGEXP out of the box. However, as there are multiple possible<br/>implementations of this and you might want to use another one, you're free to disable the<br/>application's implementation and load your own by using an extension. Requires restart of the application.</p></body></html> - + Disable Regular Expression extension Zakázat rozšíření pro regulární výrazy - + + <html><head/><body><p>SQLite provides an SQL function for loading extensions from a shared library file. Activate this if you want to use the <span style=" font-style:italic;">load_extension()</span> function from SQL code.</p><p>For security reasons, extension loading is turned off by default and must be enabled through this setting. You can always load extensions through the GUI, even though this option is disabled.</p></body></html> + + + + + Allow loading extensions from SQL code + + + + Remote Vzdálený - + CA certificates certifikáty CA - - + + Subject CN předmět CN - + Common Name - + Subject O předmět O - + Organization Organizace - - + + Valid from Platné od - - + + Valid to Platné do - - + + Serial number Sériové číslo - + Your certificates Vaše certifikáty - + File Soubor - + Subject Common Name - + Issuer CN - + Issuer Common Name - + Clone databases into - - + + Choose a directory Vyberte složku - + The language will change after you restart the application. Jazyk bude změněn po restartu aplikace. - + Select extension file Vybrat soubor rozšíření - + Extensions(*.so *.dll);;All files(*) Přípony(*.so *.dll);;Všechny soubory(*) - + Import certificate file Importovat soubor certifikátu - + No certificates found in this file. V tomto souboru nebyly nalezeny žádné certifikáty. - + Are you sure you want do remove this certificate? All certificate data will be deleted from the application settings! Opravdu chcete smazat tento certifikát? Všechny data certifikátu budou smazány z nastavení aplikace! + + + Are you sure you want to clear all the saved settings? +All your preferences will be lost and default values will be used. + + QObject - + Error importing data Chyba při importu dat - + from record number %1 ze záznamu číslo %1 - + . %1 . %1 - + + Importing CSV file... + + + Decoding CSV file... - Dekóduji soubor CSV... + Dekóduji soubor CSV... - + Cancel Zrušit - Collation needed! Proceed? - Je potřeba provést collation! Potvrdit? + Je potřeba provést collation! Potvrdit? - - A table in this database requires a special collation function '%1' that this application can't provide without further knowledge. -If you choose to proceed, be aware bad things can happen to your database. -Create a backup! - + SQLite database files (*.db *.sqlite *.sqlite3 *.db3);;All files (*) + Databázové soubory SQLite (*.db *.sqlite *.sqlite3 *.db3);;Všechny soubory (*) - - SQLite database files (*.db *.sqlite *.sqlite3 *.db3);;All files (*) - Databázové soubory SQLite (*.db *.sqlite *.sqlite3 *.db3);;Všechny soubory (*) + + All files (*) + + + + + SQLite database files (*.db *.sqlite *.sqlite3 *.db3) + @@ -3484,65 +5171,83 @@ %2 - + Error when connecting to %1. %2 - + Chyba při připojování k %1. +%2 - + Error opening remote file at %1. %2 - + Error: Invalid client certificate specified. - + Please enter the passphrase for this client certificate in order to authenticate. - + Cancel Zrušit - + Uploading remote database to -%1. +%1 Nahrávám vzdálenou databázi do +%1. {1?} + + + + Downloading remote database from +%1 + Stahuji vzdálenou databázi z +%1. {1?} + + + + The remote database has been updated since the last checkout. Do you want to update the local database to the newest version? Note that this discards any changes you have made locally! If you don't want to lose local changes, click No to open the local version. + + + + Uploading remote database to +%1. + Nahrávám vzdálenou databázi do %1. - Downloading remote database from %1. - Stahuji vzdálenou databázi z + Stahuji vzdálenou databázi z %1. - - + + Error: The network is not accessible. Chyba: síť není dostupná. - + Error: Cannot open the file for sending. Chyba: Nemohu otevřít soubor k odeslání. - + Error opening local databases list. %1 - + Error creating local databases list. %1 @@ -3562,14 +5267,24 @@ + Connect to the remote server using the currently selected identity. The correct server is taken from the identity as well. + + + + Go - + Push currently opened database to server + + + <html><head/><body><p>In this pane, remote databases from dbhub.io website can be added to DB4S. First you need an identity:</p><ol style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;"><li style=" margin-top:12px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Login to the dbhub.io website (use your GitHub credentials or whatever you want)</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Click the button to create a DB4S certificate (that's your identity). That'll give you a certificate file (save it to your local disk).</li><li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Go to the Remote tab in DB4S Preferences. Click the button to add a new certificate to DB4S and choose the just downloaded certificate file.</li></ol><p>Now the Remote panel shows your identity and you can add remote databases.</p></body></html> + + RemoteModel @@ -3586,17 +5301,17 @@ Last modified - + Poslední změněné Size - + Velikost bytes - + bytů @@ -3612,12 +5327,12 @@ - + Commit message - + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } @@ -3626,30 +5341,45 @@ - + Database licence - + Public + Veřejný + + + + Branch + Větev + + + + Force push - + Database will be public. Everyone has read access to it. - + Database will be private. Only you have access to it. - - Unspecified + + Use with care. This can cause remote commits to be deleted. + + + Unspecified + Nespecifikovaný + SqlExecutionArea @@ -3659,330 +5389,503 @@ Formulář - + + Find previous match [Shift+F3] + + + + + Find previous match with mapping + + + + + Shift+F3 + Shift+F3 + + + + The found pattern must be a whole word + + + + + Whole Words + Celá slova + + + + Text pattern to find considering the checks in this frame + + + + + Find in editor + Najít v editoru + + + + The found pattern must match in letter case + + + + + Case Sensitive + + + + + Find next match [Enter, F3] + + + + + Find next match with wrapping + + + + + F3 + F3 + + + + Interpret search pattern as a regular expression + + + + + <html><head/><body><p>When checked, the pattern to find is interpreted as a UNIX regular expression. See <a href="https://en.wikibooks.org/wiki/Regular_Expressions">Regular Expression in Wikibooks</a>.</p></body></html> + + + + + Regular Expression + Regulární výraz + + + + + Close Find Bar + Zavřít lištu pro hledání + + + + Results of the last executed statements Výsledky naposledy provedených příkazů - + This field shows the results and status codes of the last executed statements. - Export to &CSV - Export do &CSV + Export do CSV - Save as &view - Uložit jako &pohled + Uložit jako pohled - Save as view - Uložit jako pohled + Uložit jako pohled - Please specify the view name - Specifikujte název pohledu, prosím + Specifikujte název pohledu, prosím - There is already an object with that name. Please choose a different name. - Objekt s tímto názvem již existuje. Vyberte jiný název, prosím. + Objekt s tímto názvem již existuje. Vyberte jiný název, prosím. - View successfully created. - Pohled byl úspěšně vytvořen. + Pohled byl úspěšně vytvořen. - Error creating view: %1 - Chyba při vytváření pohledu: %1 + Chyba při vytváření pohledu: %1 SqlUiLexer - + (X) The abs(X) function returns the absolute value of the numeric argument X. - + () The changes() function returns the number of database rows that were changed or inserted or deleted by the most recently completed INSERT, DELETE, or UPDATE statement. - + (X1,X2,...) The char(X1,X2,...,XN) function returns a string composed of characters having the unicode code point values of integers X1 through XN, respectively. - + (X,Y,...) The coalesce() function returns a copy of its first non-NULL argument, or NULL if all arguments are NULL - + (X,Y) The glob(X,Y) function is equivalent to the expression "Y GLOB X". - + (X,Y) The ifnull() function returns a copy of its first non-NULL argument, or NULL if both arguments are NULL. - + (X,Y) The instr(X,Y) function finds the first occurrence of string Y within string X and returns the number of prior characters plus 1, or 0 if Y is nowhere found within X. - + (X) The hex() function interprets its argument as a BLOB and returns a string which is the upper-case hexadecimal rendering of the content of that blob. - + () The last_insert_rowid() function returns the ROWID of the last row insert from the database connection which invoked the function. - + (X) For a string value X, the length(X) function returns the number of characters (not bytes) in X prior to the first NUL character. - + (X,Y) The like() function is used to implement the "Y LIKE X" expression. - + (X,Y,Z) The like() function is used to implement the "Y LIKE X ESCAPE Z" expression. - - (X) The load_extension(X) function loads SQLite extensions out of the shared library file named X. - + + (X) The load_extension(X) function loads SQLite extensions out of the shared library file named X. +Use of this function must be authorized from Preferences. + - - (X,Y) The load_extension(X) function loads SQLite extensions out of the shared library file named X using the entry point Y. - + + (X,Y) The load_extension(X) function loads SQLite extensions out of the shared library file named X using the entry point Y. +Use of this function must be authorized from Preferences. + - + (X) The lower(X) function returns a copy of string X with all ASCII characters converted to lower case. - + (X) ltrim(X) removes spaces from the left side of X. (X) ltrim(X) odstraní mezery z levé strany X. - + (X,Y) The ltrim(X,Y) function returns a string formed by removing any and all characters that appear in Y from the left side of X. - + (X,Y,...) The multi-argument max() function returns the argument with the maximum value, or return NULL if any argument is NULL. - + (X,Y,...) The multi-argument min() function returns the argument with the minimum value. (X,Y,...) Funkce s více parametry min() vrací parametr s minimální hodnotou. - + (X,Y) The nullif(X,Y) function returns its first argument if the arguments are different and NULL if the arguments are the same. (X,Y) Funkce nullif(X,Y) vrací první parametr, pokud jsou parametry odlišné. NULL vrací, pokud jsou parametry stejné. - + (FORMAT,...) The printf(FORMAT,...) SQL function works like the sqlite3_mprintf() C-language function and the printf() function from the standard C library. - + (X) The quote(X) function returns the text of an SQL literal which is the value of its argument suitable for inclusion into an SQL statement. - + () The random() function returns a pseudo-random integer between -9223372036854775808 and +9223372036854775807. () Funkce random() vrací pseudo-náhodný integer v rozmezí -9223372036854775808 a +9223372036854775807. - + (N) The randomblob(N) function return an N-byte blob containing pseudo-random bytes. - + (X,Y,Z) The replace(X,Y,Z) function returns a string formed by substituting string Z for every occurrence of string Y in string X. - + (X) The round(X) function returns a floating-point value X rounded to zero digits to the right of the decimal point. - + (X,Y) The round(X,Y) function returns a floating-point value X rounded to Y digits to the right of the decimal point. - + (X) rtrim(X) removes spaces from the right side of X. - + (X,Y) The rtrim(X,Y) function returns a string formed by removing any and all characters that appear in Y from the right side of X. - + (X) The soundex(X) function returns a string that is the soundex encoding of the string X. - + (X,Y) substr(X,Y) returns all characters through the end of the string X beginning with the Y-th. - + (X,Y,Z) The substr(X,Y,Z) function returns a substring of input string X that begins with the Y-th character and which is Z characters long. - + () The total_changes() function returns the number of row changes caused by INSERT, UPDATE or DELETE statements since the current database connection was opened. - + (X) trim(X) removes spaces from both ends of X. (X) trim(X) odstraní mezery z obou stran X. - + (X,Y) The trim(X,Y) function returns a string formed by removing any and all characters that appear in Y from both ends of X. - + (X) The typeof(X) function returns a string that indicates the datatype of the expression X. - + (X) The unicode(X) function returns the numeric unicode code point corresponding to the first character of the string X. - + (X) The upper(X) function returns a copy of input string X in which all lower-case ASCII characters are converted to their upper-case equivalent. - + (N) The zeroblob(N) function returns a BLOB consisting of N bytes of 0x00. - - - - + + + + (timestring,modifier,modifier,...) - + (format,timestring,modifier,modifier,...) - + (X) The avg() function returns the average value of all non-NULL X within a group. - + (X) The count(X) function returns a count of the number of times that X is not NULL in a group. - + (X) The group_concat() function returns a string which is the concatenation of all non-NULL values of X. - + (X,Y) The group_concat() function returns a string which is the concatenation of all non-NULL values of X. If parameter Y is present then it is used as the separator between instances of X. - + (X) The max() aggregate function returns the maximum value of all values in the group. (X) Agregační funkce max() vrací maximální hodnotu ze všech hodnot ve skupině. - + (X) The min() aggregate function returns the minimum non-NULL value of all values in the group. (X) Agregační funkce min() vrací minimální hodnotu ze všech hodnot ve skupině, která není NULL. - - + + (X) The sum() and total() aggregate functions return sum of all non-NULL values in the group. (X) Agregační funkce sum() a total() vrací součet všech hodnot ve skupině, které nejsou NULL. + + + () The number of the row within the current partition. Rows are numbered starting from 1 in the order defined by the ORDER BY clause in the window definition, or in arbitrary order otherwise. + + + + + () The row_number() of the first peer in each group - the rank of the current row with gaps. If there is no ORDER BY clause, then all rows are considered peers and this function always returns 1. + + + + + () The number of the current row's peer group within its partition - the rank of the current row without gaps. Partitions are numbered starting from 1 in the order defined by the ORDER BY clause in the window definition. If there is no ORDER BY clause, then all rows are considered peers and this function always returns 1. + + + + + () Despite the name, this function always returns a value between 0.0 and 1.0 equal to (rank - 1)/(partition-rows - 1), where rank is the value returned by built-in window function rank() and partition-rows is the total number of rows in the partition. If the partition contains only one row, this function returns 0.0. + + + + + () The cumulative distribution. Calculated as row-number/partition-rows, where row-number is the value returned by row_number() for the last peer in the group and partition-rows the number of rows in the partition. + + + + + (N) Argument N is handled as an integer. This function divides the partition into N groups as evenly as possible and assigns an integer between 1 and N to each group, in the order defined by the ORDER BY clause, or in arbitrary order otherwise. If necessary, larger groups occur first. This function returns the integer value assigned to the group that the current row is a part of. + + + + + (expr) Returns the result of evaluating expression expr against the previous row in the partition. Or, if there is no previous row (because the current row is the first), NULL. + + + + + (expr,offset) If the offset argument is provided, then it must be a non-negative integer. In this case the value returned is the result of evaluating expr against the row offset rows before the current row within the partition. If offset is 0, then expr is evaluated against the current row. If there is no row offset rows before the current row, NULL is returned. + + + + + + (expr,offset,default) If default is also provided, then it is returned instead of NULL if the row identified by offset does not exist. + + + + + (expr) Returns the result of evaluating expression expr against the next row in the partition. Or, if there is no next row (because the current row is the last), NULL. + + + + + (expr,offset) If the offset argument is provided, then it must be a non-negative integer. In this case the value returned is the result of evaluating expr against the row offset rows after the current row within the partition. If offset is 0, then expr is evaluated against the current row. If there is no row offset rows after the current row, NULL is returned. + + + + + (expr) This built-in window function calculates the window frame for each row in the same way as an aggregate window function. It returns the value of expr evaluated against the first row in the window frame for each row. + + + + + (expr) This built-in window function calculates the window frame for each row in the same way as an aggregate window function. It returns the value of expr evaluated against the last row in the window frame for each row. + + + + + (expr,N) This built-in window function calculates the window frame for each row in the same way as an aggregate window function. It returns the value of expr evaluated against the row N of the window frame. Rows are numbered within the window frame starting from 1 in the order defined by the ORDER BY clause if one is present, or in arbitrary order otherwise. If there is no Nth row in the partition, then NULL is returned. + + SqliteTableModel - + + reading rows + čtení sloupců + + + + loading... + načítání... + + + References %1(%2) -Hold Ctrl+Shift and click to jump there +Hold %3Shift and click to jump there - + Error changing data: %1 Chyba při změně dat: %1 + + + retrieving list of columns + + + + + Fetching data... + Načítám data... + + + + Cancel + Zrušit + VacuumDialog Compact Database - + Compact Database - Warning: Compacting the database will commit all changes you made. - + Warning: Compacting the database will commit all of your changes. + Varování: Procesem 'compact the database' budou aplikovány všechny vaše provedené změny. - Please select the objects to compact: - + Please select the databases to co&mpact: + Prosím vyberte databázi pro proces 'compact': diff -Nru sqlitebrowser-3.10.100ubuntu1/src/translations/sqlb_de.ts sqlitebrowser-3.11.1/src/translations/sqlb_de.ts --- sqlitebrowser-3.10.100ubuntu1/src/translations/sqlb_de.ts 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/src/translations/sqlb_de.ts 2019-02-19 23:51:34.000000000 +0000 @@ -1,6 +1,6 @@ - + AboutDialog @@ -15,8 +15,12 @@ - <html><head/><body><p>DB Browser for SQLite is an open source, freeware visual tool used to create, design and edit SQLite database files.</p><p>It is bi-licensed under the Mozilla Public License Version 2, as well as the GNU General Public License Version 3 or later. You can modify or redistribute it under the conditions of these licenses.</p><p>See <a href="http://www.gnu.org/licenses/gpl.html"><span style=" text-decoration: underline; color:#0000ff;">http://www.gnu.org/licenses/gpl.html</span></a> and <a href="https://www.mozilla.org/MPL/2.0/index.txt"><span style=" text-decoration: underline; color:#0000ff;">https://www.mozilla.org/MPL/2.0/index.txt</span></a> for details.</p><p>For more information on this program please visit our website at: <a href="http://sqlitebrowser.org"><span style=" text-decoration: underline; color:#0000ff;">http://sqlitebrowser.org</span></a></p><p><span style=" font-size:small;">This software uses the GPL/LGPL Qt Toolkit from </span><a href="http://qt-project.org/"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://qt-project.org/</span></a><span style=" font-size:small;"><br/>See </span><a href="http://qt-project.org/doc/qt-5/licensing.html"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://qt-project.org/doc/qt-5/licensing.html</span></a><span style=" font-size:small;"> for licensing terms and information.</span></p><p><span style=" font-size:small;">It also uses the Silk icon set by Mark James licensed under a Creative Commons Attribution 2.5 and 3.0 license.<br/>See </span><a href="http://www.famfamfam.com/lab/icons/silk/"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://www.famfamfam.com/lab/icons/silk/</span></a><span style=" font-size:small;"> for details.</span></p></body></html> - <html><head/><body><p>DB-Browser für SQLite ist ein grafisches, freies Open Source Tool zum Erstellen, Bearbeiten und Ändern von SQLite-Datenbankdateien.</p><p>Es steht unter zwei Lizenzen, der Mozilla Public License Version 2 und der GNU General Public License Version 3 oder aktueller. Sie können das Programm unter den Bedingungen dieser Lizenzen ändern und weitergeben.</p><p>Siehe <a href="http://www.gnu.org/licenses/gpl.html"><span style=" text-decoration: underline; color:#0000ff;">http://www.gnu.org/licenses/gpl.html</span></a> und <a href="https://www.mozilla.org/MPL/2.0/index.txt"><span style=" text-decoration: underline; color:#0000ff;">https://www.mozilla.org/MPL/2.0/index.txt</span></a> für Details.</p><p>Für mehr Informationen über dieses Programm besuchen Sie unsere Website unter: <a href="http://sqlitebrowser.org"><span style=" text-decoration: underline; color:#0000ff;">http://sqlitebrowser.org</span></a></p><p><span style=" font-size:small;">Diese Anwendung verwendet das GPL/LGPL Qt Toolkit von </span><a href="http://qt-project.org/"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://qt-project.org/</span></a><span style=" font-size:small;"><br/>Siehe </span><a href="http://qt-project.org/doc/qt-5/licensing.html"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://qt-project.org/doc/qt-5/licensing.html</span></a><span style=" font-size:small;"> für Lizenzinformationenund weitere Informationen.</span></p><p><span style=" font-size:small;">Sie verwendet außerdem das Silk Iconset von Mark James, das unter einer Creative Commons Attribution 2.5 und 3.0 Lizenz steht.<br/>Siehe </span><a href="http://www.famfamfam.com/lab/icons/silk/"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://www.famfamfam.com/lab/icons/silk/</span></a><span style=" font-size:small;"> für Details.</span></p></body></html> + <html><head/><body><p>DB Browser for SQLite is an open source, freeware visual tool used to create, design and edit SQLite database files.</p><p>It is bi-licensed under the Mozilla Public License Version 2, as well as the GNU General Public License Version 3 or later. You can modify or redistribute it under the conditions of these licenses.</p><p>See <a href="http://www.gnu.org/licenses/gpl.html">http://www.gnu.org/licenses/gpl.html</a> and <a href="https://www.mozilla.org/MPL/2.0/index.txt">https://www.mozilla.org/MPL/2.0/index.txt</a> for details.</p><p>For more information on this program please visit our website at: <a href="http://sqlitebrowser.org">http://sqlitebrowser.org</a></p><p><span style=" font-size:small;">This software uses the GPL/LGPL Qt Toolkit from </span><a href="http://qt-project.org/"><span style=" font-size:small;">http://qt-project.org/</span></a><span style=" font-size:small;"><br/>See </span><a href="http://qt-project.org/doc/qt-5/licensing.html"><span style=" font-size:small;">http://qt-project.org/doc/qt-5/licensing.html</span></a><span style=" font-size:small;"> for licensing terms and information.</span></p><p><span style=" font-size:small;">It also uses the Silk icon set by Mark James licensed under a Creative Commons Attribution 2.5 and 3.0 license.<br/>See </span><a href="http://www.famfamfam.com/lab/icons/silk/"><span style=" font-size:small;">http://www.famfamfam.com/lab/icons/silk/</span></a><span style=" font-size:small;"> for details.</span></p></body></html> + <html><head/><body><p>DB-Browser für SQLite ist ein grafisches, freies Open-Source-Tool zum Erstellen, Entwerfen und Bearbeiten von SQLite-Datenbankdateien.</p><p>Es steht unter zwei Lizenzen zur Verfügung: der Mozilla Public License Version 2 und der GNU General Public License Version 3 oder aktueller. Sie können das Programm unter den Bedingungen dieser Lizenzen verändern und weiterverteilen.</p><p>Siehe <a href="http://www.gnu.org/licenses/gpl.html">http://www.gnu.org/licenses/gpl.html</a> und <a href="https://www.mozilla.org/MPL/2.0/index.txt">https://www.mozilla.org/MPL/2.0/index.txt</a> für Details.</p><p>Für mehr Informationen über dieses Programm besuchen Sie bitte unsere Website: <a href="http://sqlitebrowser.org">http://sqlitebrowser.org</a></p><p><span style=" font-size:small;">Diese Software verwendet das GPL/LGPL QT Toolkit von </span><a href="http://qt-project.org/"><span style=" font-size:small;">http://qt-project.org/</span></a><span style=" font-size:small;"><br/>Siehe </span><a href="http://qt-project.org/doc/qt-5/licensing.html"><span style=" font-size:small;">http://qt-project.org/doc/qt-5/licensing.html</span></a><span style=" font-size:small;"> für Lizenzbedingungen und -informationen.</span></p><p><span style=" font-size:small;">Sie verwendet ebenso das Silk-Iconset von Mark James, welches unter einer Creative Commons Attribution 2.5 und 3.0 Lizenz verfügbar ist.<br/>Siehe </span><a href="http://www.famfamfam.com/lab/icons/silk/"><span style=" font-size:small;">http://www.famfamfam.com/lab/icons/silk/</span></a><span style=" font-size:small;"> für Details.</span></p></body></html> + + + <html><head/><body><p>DB Browser for SQLite is an open source, freeware visual tool used to create, design and edit SQLite database files.</p><p>It is bi-licensed under the Mozilla Public License Version 2, as well as the GNU General Public License Version 3 or later. You can modify or redistribute it under the conditions of these licenses.</p><p>See <a href="http://www.gnu.org/licenses/gpl.html"><span style=" text-decoration: underline; color:#0000ff;">http://www.gnu.org/licenses/gpl.html</span></a> and <a href="https://www.mozilla.org/MPL/2.0/index.txt"><span style=" text-decoration: underline; color:#0000ff;">https://www.mozilla.org/MPL/2.0/index.txt</span></a> for details.</p><p>For more information on this program please visit our website at: <a href="https://sqlitebrowser.org"><span style=" text-decoration: underline; color:#0000ff;">https://sqlitebrowser.org</span></a></p><p><span style=" font-size:small;">This software uses the GPL/LGPL Qt Toolkit from </span><a href="http://qt-project.org/"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://qt-project.org/</span></a><span style=" font-size:small;"><br/>See </span><a href="http://qt-project.org/doc/qt-5/licensing.html"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://qt-project.org/doc/qt-5/licensing.html</span></a><span style=" font-size:small;"> for licensing terms and information.</span></p><p><span style=" font-size:small;">It also uses the Silk icon set by Mark James licensed under a Creative Commons Attribution 2.5 and 3.0 license.<br/>See </span><a href="http://www.famfamfam.com/lab/icons/silk/"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://www.famfamfam.com/lab/icons/silk/</span></a><span style=" font-size:small;"> for details.</span></p></body></html> + <html><head/><body><p>DB-Browser für SQLite ist ein grafisches, freies Open Source Tool zum Erstellen, Bearbeiten und Ändern von SQLite-Datenbankdateien.</p><p>Es steht unter zwei Lizenzen, der Mozilla Public License Version 2 und der GNU General Public License Version 3 oder aktueller. Sie können das Programm unter den Bedingungen dieser Lizenzen ändern und weitergeben.</p><p>Siehe <a href="http://www.gnu.org/licenses/gpl.html"><span style=" text-decoration: underline; color:#0000ff;">http://www.gnu.org/licenses/gpl.html</span></a> und <a href="https://www.mozilla.org/MPL/2.0/index.txt"><span style=" text-decoration: underline; color:#0000ff;">https://www.mozilla.org/MPL/2.0/index.txt</span></a> für Details.</p><p>Für mehr Informationen über dieses Programm besuchen Sie unsere Website unter: <a href="https://sqlitebrowser.org"><span style=" text-decoration: underline; color:#0000ff;">https://sqlitebrowser.org</span></a></p><p><span style=" font-size:small;">Diese Anwendung verwendet das GPL/LGPL Qt Toolkit von </span><a href="http://qt-project.org/"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://qt-project.org/</span></a><span style=" font-size:small;"><br/>Siehe </span><a href="http://qt-project.org/doc/qt-5/licensing.html"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://qt-project.org/doc/qt-5/licensing.html</span></a><span style=" font-size:small;"> für Lizenzinformationenund weitere Informationen.</span></p><p><span style=" font-size:small;">Sie verwendet außerdem das Silk Iconset von Mark James, das unter einer Creative Commons Attribution 2.5 und 3.0 Lizenz steht.<br/>Siehe </span><a href="http://www.famfamfam.com/lab/icons/silk/"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://www.famfamfam.com/lab/icons/silk/</span></a><span style=" font-size:small;"> für Details.</span></p></body></html> Qt Version @@ -27,46 +31,144 @@ SQLite-Version - <html><head/><body><p>SQLite Database Browser is an open source, freeware visual tool used to create, design and edit SQLite database files.</p><p>It is bi-licensed under the Mozilla Public License Version 2, as well as the GNU General Public License Version 3 or later. You can modify or redistribute it under the conditions of these licenses.</p><p>See <a href="http://www.gnu.org/licenses/gpl.html"><span style=" text-decoration: underline; color:#0000ff;">http://www.gnu.org/licenses/gpl.html</span></a> and <a href="https://www.mozilla.org/MPL/2.0/index.txt"><span style=" text-decoration: underline; color:#0000ff;">https://www.mozilla.org/MPL/2.0/index.txt</span></a> for details.</p><p>For more information on this program please visit our website at: <a href="http://sqlitebrowser.org"><span style=" text-decoration: underline; color:#0000ff;">http://sqlitebrowser.org</span></a></p><p><span style=" font-size:small;">This software uses the GPL/LGPL Qt Toolkit from </span><a href="http://qt-project.org/"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://qt-project.org/</span></a><span style=" font-size:small;"><br/>See </span><a href="http://qt-project.org/doc/qt-5/licensing.html"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://qt-project.org/doc/qt-5/licensing.html</span></a><span style=" font-size:small;"> for licensing terms and information.</span></p><p><span style=" font-size:small;">It also uses the Silk icon set by Mark James licensed under a Creative Commons Attribution 2.5 and 3.0 license.<br/>See </span><a href="http://www.famfamfam.com/lab/icons/silk/"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://www.famfamfam.com/lab/icons/silk/</span></a><span style=" font-size:small;"> for details.</span></p></body></html> - <html><head/><body><p>SQLite Database Browser ist ein grafisches, freies Open Source Tool zum Erstellen, Bearbeiten und Ändern von SQLite-Datenbankdateien.</p><p>Es steht unter zwei Lizenzen, der Mozilla Public License Version 2 und der GNU General Public License Version 3 oder aktueller. Sie können das Programm unter den Bedingungen dieser Lizenzen ändern und weitergeben.</p><p>Siehe <a href="http://www.gnu.org/licenses/gpl.html"><span style=" text-decoration: underline; color:#0000ff;">http://www.gnu.org/licenses/gpl.html</span></a> und <a href="https://www.mozilla.org/MPL/2.0/index.txt"><span style=" text-decoration: underline; color:#0000ff;">https://www.mozilla.org/MPL/2.0/index.txt</span></a> für Details.</p><p>Für mehr Informationen über dieses Programm besuchen Sie unsere Website unter: <a href="http://sqlitebrowser.org"><span style=" text-decoration: underline; color:#0000ff;">http://sqlitebrowser.org</span></a></p><p><span style=" font-size:small;">Diese Anwendung verwendet das GPL/LGPL Qt Toolkit von </span><a href="http://qt-project.org/"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://qt-project.org/</span></a><span style=" font-size:small;"><br/>Siehe </span><a href="http://qt-project.org/doc/qt-5/licensing.html"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://qt-project.org/doc/qt-5/licensing.html</span></a><span style=" font-size:small;"> für Lizenzinformationenund weitere Informationen.</span></p><p><span style=" font-size:small;">Sie verwendet außerdem das Silk iconset von Mark James, das unter einer Creative Commons Attribution 2.5 und 3.0 Lizenz steht.<br/>Siehe </span><a href="http://www.famfamfam.com/lab/icons/silk/"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://www.famfamfam.com/lab/icons/silk/</span></a><span style=" font-size:small;"> für Details.</span></p></body></html> + <html><head/><body><p>SQLite Database Browser is an open source, freeware visual tool used to create, design and edit SQLite database files.</p><p>It is bi-licensed under the Mozilla Public License Version 2, as well as the GNU General Public License Version 3 or later. You can modify or redistribute it under the conditions of these licenses.</p><p>See <a href="http://www.gnu.org/licenses/gpl.html"><span style=" text-decoration: underline; color:#0000ff;">http://www.gnu.org/licenses/gpl.html</span></a> and <a href="https://www.mozilla.org/MPL/2.0/index.txt"><span style=" text-decoration: underline; color:#0000ff;">https://www.mozilla.org/MPL/2.0/index.txt</span></a> for details.</p><p>For more information on this program please visit our website at: <a href="https://sqlitebrowser.org"><span style=" text-decoration: underline; color:#0000ff;">https://sqlitebrowser.org</span></a></p><p><span style=" font-size:small;">This software uses the GPL/LGPL Qt Toolkit from </span><a href="http://qt-project.org/"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://qt-project.org/</span></a><span style=" font-size:small;"><br/>See </span><a href="http://qt-project.org/doc/qt-5/licensing.html"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://qt-project.org/doc/qt-5/licensing.html</span></a><span style=" font-size:small;"> for licensing terms and information.</span></p><p><span style=" font-size:small;">It also uses the Silk icon set by Mark James licensed under a Creative Commons Attribution 2.5 and 3.0 license.<br/>See </span><a href="http://www.famfamfam.com/lab/icons/silk/"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://www.famfamfam.com/lab/icons/silk/</span></a><span style=" font-size:small;"> for details.</span></p></body></html> + <html><head/><body><p>SQLite Database Browser ist ein grafisches, freies Open Source Tool zum Erstellen, Bearbeiten und Ändern von SQLite-Datenbankdateien.</p><p>Es steht unter zwei Lizenzen, der Mozilla Public License Version 2 und der GNU General Public License Version 3 oder aktueller. Sie können das Programm unter den Bedingungen dieser Lizenzen ändern und weitergeben.</p><p>Siehe <a href="http://www.gnu.org/licenses/gpl.html"><span style=" text-decoration: underline; color:#0000ff;">http://www.gnu.org/licenses/gpl.html</span></a> und <a href="https://www.mozilla.org/MPL/2.0/index.txt"><span style=" text-decoration: underline; color:#0000ff;">https://www.mozilla.org/MPL/2.0/index.txt</span></a> für Details.</p><p>Für mehr Informationen über dieses Programm besuchen Sie unsere Website unter: <a href="https://sqlitebrowser.org"><span style=" text-decoration: underline; color:#0000ff;">https://sqlitebrowser.org</span></a></p><p><span style=" font-size:small;">Diese Anwendung verwendet das GPL/LGPL Qt Toolkit von </span><a href="http://qt-project.org/"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://qt-project.org/</span></a><span style=" font-size:small;"><br/>Siehe </span><a href="http://qt-project.org/doc/qt-5/licensing.html"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://qt-project.org/doc/qt-5/licensing.html</span></a><span style=" font-size:small;"> für Lizenzinformationenund weitere Informationen.</span></p><p><span style=" font-size:small;">Sie verwendet außerdem das Silk iconset von Mark James, das unter einer Creative Commons Attribution 2.5 und 3.0 Lizenz steht.<br/>Siehe </span><a href="http://www.famfamfam.com/lab/icons/silk/"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://www.famfamfam.com/lab/icons/silk/</span></a><span style=" font-size:small;"> für Details.</span></p></body></html> + + + + (based on SQLite %1) + (basierend auf SQLite %1) - + Version Version - + Qt Version Qt-Version - + SQLCipher Version SQLCipher-Version - + SQLite Version SQLite-Version + AddRecordDialog + + + Add New Record + Neue Zeile hinzufügen + + + + Enter values for the new record considering constraints. Fields in bold are mandatory. + Geben Sie Werte für die neue Zeile unter Beachtung der Constraints ein. Fette Felder sind Pflichtfelder. + + + + In the Value column you can specify the value for the field identified in the Name column. The Type column indicates the type of the field. Default values are displayed in the same style as NULL values. + In der Wertspalte können Sie den Wert für das durch die Namensspalte identifizierte Feld angeben. Die Typspalte zeigt den Feldtyp an. Standardwerte werden im Stil von NULL-Werten angezeigt. + + + + Name + Name + + + + Type + Typ + + + + Value + Wert + + + + Values to insert. Pre-filled default values are inserted automatically unless they are changed. + Einzufügende Werte. Vorausgefüllte Standardwerte werden automatisch eingefügt, insofern sie nicht geändert wurden. + + + + When you edit the values in the upper frame, the SQL query for inserting this new record is shown here. You can edit manually the query before saving. + Wenn Sie die Werte im oberen Teil ändern, wird hier das SQL-Query für das Einfügen der neuen Zeile angezeigt. Sie können das Query vor dem Speichern manuell bearbeiten. + + + + <html><head/><body><p><span style=" font-weight:600;">Save</span> will submit the shown SQL statement to the database for inserting the new record.</p><p><span style=" font-weight:600;">Restore Defaults</span> will restore the initial values in the <span style=" font-weight:600;">Value</span> column.</p><p><span style=" font-weight:600;">Cancel</span> will close this dialog without executing the query.</p></body></html> + <html><head/><body><p><span style=" font-weight:600;">Speichern</span> wird das dargestellte SQL-Statement zum Einfügen des neuen Eintrags an die Datenbank übermitteln.</p><p><span style=" font-weight:600;">Voreinstellungen</span> wird die ursprünglichen Werte der <span style=" font-weight:600;">Wert</span>-Spalte wiederherstellen.</p><p><span style=" font-weight:600;">Abbrechen</span> schließt diesen Dialog, ohne die Query auszuführen.</p></body></html> + + + + Auto-increment + + Auto-Inkrement + + + + + Unique constraint + + Unique-Constraint + + + + Check constraint: %1 + + Prüfungsconstraint: %1 + + + + Foreign key: %1 + + Fremdschlüssel: %1 + + + + Default value: %1 + + Standardwert: %1 + + + + Error adding record. Message from database engine: + +%1 + Fehler beim Hinzufügen der Zeile. Mitteilung der Datenbank-Engine: + +%1 + + + + Are you sure you want to restore all the entered values to their defaults? + Sind Sie sicher, dass Sie alle eingegebenen Werte auf deren Standardwerte zurücksetzen möchten? + + + Application - + Usage: %1 [options] [db] Verwendung: %1 [Optionen] [db] - + Possible command line arguments: Mögliche Kommandozeilen-Argumente: - + -h, --help Show command line options -h, --help Kommandozeilen-Optionen anzeigen @@ -75,52 +177,71 @@ -s, --sql [Datei] Führe diese SQL-Datei nach dem Öffnen der DB aus - + -s, --sql [file] Execute this SQL file after opening the DB -s, --sql [Datei] Führe nach dem Öffnen der Datenbank diese SQL-Datei aus - + -t, --table [table] Browse this table after opening the DB -t, --table [Tabelle] Navigiere nach dem Öffnen der Datenbank durch diese Tabelle - + -q, --quit Exit application after running scripts -q, --quit Beende die Anwendung nach Ausführung der Skripte - + + -R, --read-only Open database in read-only mode + -R, --read-only: Datenbank im rein lesenden Modus öffnen + + + + -o, --option [group/setting=value] Run application with this setting temporarily set to value + -o, --option [Gruppe/Einstellung=Wert] Anwendung mit dem temporär gesetzten Wert für diese Einstellung ausführen + + + -v, --version Display the current version -v, --version Die aktuelle Version anzeigen - + [file] Open this SQLite database [Datei] Diese SQLite-Datenbank öffnen - + + This is DB Browser for SQLite version %1. + Dies ist DB-Browser für SQLite Version %1. + + This is DB Browser for SQLite version %1%2. Dies ist DB Browser für SQLite Version %1%2. - + The -s/--sql option requires an argument Die -s/--sql Option benötigt ein Argument - + The file %1 does not exist Die Datei %1 existiert nicht - + The -t/--table option requires an argument Die -t/--table Option benötigt ein Argument - + + The -o/--option option requires an argument in the form group/setting=value + Die Option -o/--option benötigt ein Argument in der Form Gruppe/Einstellung=Wert + + + Invalid option/non-existant file: %1 Ungültige Option/nicht existente Datei: %1 @@ -148,21 +269,21 @@ Seiten&größe - + Passphrase Passphrase - + Raw key Originalschlüssel Page &size - &Seitengröße + &Seitengröße - + Please set a key to encrypt the database. Note that if you change any of the other, optional, settings you'll need to re-enter them as well every time you open the database file. Leave the password fields empty to disable the encryption. @@ -173,7 +294,7 @@ Der Verschlüsselungsprozess benötigt unter Umständen ein bisschen Zeit und Sie sollten ein Backup-Kopie Ihrer Datenbank haben! Ungespeicherte Änderungen werden vor der Änderung der Verschlüsselung übernommen. - + Please enter the key used to encrypt the database. If any of the other settings were altered for this database file you need to provide this information as well. Geben Sie bitte den zur Verschlüsselung der Datenbank genutzten Schlüssel ein. @@ -203,67 +324,82 @@ Voreinstellung - + Decimal number Dezimalzahl - + Exponent notation Exponentnotation - + Hex blob Hex-Blob - + Hex number Hexwert - + Apple NSDate to date Apple NSDate zu Datum - + + Java epoch (milliseconds) to date + Java-Epoche (Millisekunden) zu Datum + + + Julian day to date Julianischer Tag zu Datum - + + Unix epoch to local time + Unix-Epoche zu lokaler Zeit + + + + Date as dd/mm/yyyy + Datum als dd/mm/yyyy + + + Lower case Kleinschreibung - + Octal number Oktalwert - + Round number Gerundeter Wert - + Unix epoch to date Unix-Epoche zu Datum - + Upper case Großschreibung - + Windows DATE to date Windows DATUM zu Datum - + Custom Benutzerdefiniert @@ -271,99 +407,135 @@ DBBrowserDB - + Please specify the database name under which you want to access the attached database Geben Sie bitte einen Datenbanknamen an, mit dem Sie auf die anhängte Datenbank zugreifen möchten - + Invalid file format Ungültiges Dateiformat - + Do you want to save the changes made to the database file %1? Sollen die getätigten Änderungen an der Datenbank-Datei %1 gespeichert werden? - + Exporting database to SQL file... Datenbank in SQL-Datei exportieren... - - + + Cancel Abbrechen - + Executing SQL... SQL ausführen... - + Action cancelled. Vorgang abgebrochen. Error in statement #%1: %2. Aborting execution. - Fehler im Statement #%1: %2. + Fehler im Statement #%1: %2. Ausführung wird abgebrochen. renameColumn: cannot find table %1. - Spalte umbenennen: Tabelle %1 nicht gefunden. + Spalte umbenennen: Tabelle %1 nicht gefunden. + + + + This database has already been attached. Its schema name is '%1'. + Diese Datenbank wurde bereits angehängt. Ihr Schemaname ist '%1'. - - + + Do you really want to close this temporary database? All data will be lost. + Möchten Sie diese temporäre Datenbank wirklich schließen? Alle Daten gehen damit verloren. + + + + The database is currently busy: + Die Datenbank ist zur Zeit beschäfigt: + + + + Do you want to abort that other operation? + Möchten Sie die andere Operation abbrechen? + + + + + No database file opened + Keine Datenbankdatei geöffnet + + + + Error in statement #%1: %2. Aborting execution%3. Fehler im Statement #%1: %2. Ausführung wird abgebrochen %3. - - + + and rolling back und der Zustand zurückgesetzt - + + Cannot delete this object + Dieses Objekt kann nicht gelöscht werden + + + Cannot set data on this object Daten können für dieses Objekt nicht gesetzt werden - + + A table with the name '%1' already exists in schema '%2'. + Es existiert eine Tabelle mit dem Namen '%1' im Schema '%2'. + + + renameColumn: cannot find column %1. Spalte umbennen: Spalte %1 nicht gefunden. - + renameColumn: creating savepoint failed. DB says: %1 Spalte umbenennen: Anlegen von Speicherpunkt fehlgeschlagen. DB meldet: %1 - + renameColumn: creating new table failed. DB says: %1 Spalte umbenennen: Erstellen neuer Tabelle fehlgeschlagen. DB meldet: %1 - + renameColumn: copying data to new table failed. DB says: %1 Spalte umbenennen: Kopieren der Daten in neue Tabelle fehlgeschlagen. DB meldet: %1 - + renameColumn: deleting old table failed. DB says: %1 Spalte umbenennen: Löschen der alten Tabelle fehlgeschlagen. DB meldet: %1 - + Restoring some of the objects associated with this table failed. This is most likely because some column names changed. Here's the SQL statement which you might want to fix and execute manually: @@ -372,57 +544,67 @@ - + renameColumn: releasing savepoint failed. DB says: %1 Spalte umbenennen: Freigeben des Speicherpunktes fehlgeschlagen. DB meldet: %1 - + Error renaming table '%1' to '%2'.Message from database engine: %3 Fehler beim Umbenennen der Tabelle '%1' zu '%2'. Meldung von Datenbank: %3 - + ... <string can not be logged, contains binary data> ... ... <String kann nicht geloggt werden, enthält binäre Daten> ... - + + could not get list of databases: %1 + konnte keine Datenbankliste abrufen: %1 + + + + Error loading extension: %1 + Fehler beim Laden der Erweiterung: %1 + + + could not get column information Spalteninformationen konnten nicht errmittelt werden unknown object type %1 - unbekannter Objekttyp %1 + unbekannter Objekttyp %1 - + could not get list of db objects: %1, %2 Liste mit DB-Ojekten konnte nicht bezogen werden: %1, %2 could not get types - Typen konnten nicht bezogen werden + Typen konnten nicht bezogen werden - + didn't receive any output from pragma %1 keine Ausgabe erhalten von Pragma %1 - + could not execute pragma command: %1, %2 Pragma-Kommando konnte nicht ausgeführt werden: %1, %2 - + Error setting pragma %1 to %2: %3 Fehler beim Setzen des Pragmas %1 auf %2: %3 - + File not found. Datei nicht gefunden. @@ -430,52 +612,66 @@ DbStructureModel - + Name Name - + Object Objekt - + Type Typ - + Schema Schema - Browsables (%1) Durchsuchbar (%1) - + + Database + Datenbank + + + + Browsables + Durchsuchbar + + + All Alle - + + Temporary + Temporär + + + Tables (%1) Tabellen (%1) - + Indices (%1) Indizes (%1) - + Views (%1) Ansichten (%1) - + Triggers (%1) Trigger (%1) @@ -493,63 +689,181 @@ Modus: - - + + This is the list of supported modes for the cell editor. Choose a mode for viewing or editing the data of the current cell. + Dies ist die Liste der unterstützten Modi des Zelleneditors. Wählen Sie einen Modus für die Anzeige oder Bearbeitung der Daten der aktuellen Zelle aus. + + + Image Bild + + JSON + JSON + + + + XML + XML + + + + + Automatically adjust the editor mode to the loaded data type + Den Editormodus automatisch dem geladenen Datentyp anpassen + + + This checkable button enables or disables the automatic switching of the editor mode. When a new cell is selected or new data is imported and the automatic switching is enabled, the mode adjusts to the detected data type. You can then change the editor mode manually. If you want to keep this manually switched mode while moving through the cells, switch the button off. + Dieser Button aktiviert oder deaktiviert den automatischen Wechsel des Editormodus. Wenn eine neue Zelle ausgewählt wird oder neue Daten importiert werden und der automatische Wechsel aktiviert ist, passt sich der Modus dem erkannten Datentyp an. Sie können den Editormodus danach manuell ändern. Falls Sie dies bei der Bewegung durch die Zellen im manuell eingestellten Modus behalten möchten, deaktivieren Sie den Button. + + + + Auto-switch + Auto-Wechsel + + + + + Auto-format: pretty print on loading, compact on saving. + Auto-Format: Druckoptimierung (Pretty Print) beim Laden, kompakt beim Speichern. + + + + When enabled, the auto-format feature formats the data on loading, breaking the text in lines and indenting it for maximum readability. On data saving, the auto-format feature compacts the data removing end of lines, and unnecessary whitespace. + Falls aktiviert, formatiert die Auto-Format-Funktion die Daten beim Laden, bricht den Text in Zeilen und rückt ihn ein für maximale Lesbarkeit. Beim Speichern der Daten verdichtet die Auto-Format-Funktion die Daten durch das Entfernen der Zeilenumbrüche und unnötigen Leerzeichen. + + + + Autoformat + Auto-Format + + + + Import from file + Aus Datei importieren + + + + Opens a file dialog used to import any kind of data to this database cell. + Öffnet einen Dateidialog, um jegliche Art von Daten in diese Datenbankzelle zu importieren. + + + + Export to file + In Datei exportieren + + + + Opens a file dialog used to export the contents of this database cell to a file. + Öffnet einen Dateidialog, um den Inhalt dieser Datenbankzelle in eine Datei zu exportieren. + + + + + Print... + Drucken... + + + + Open preview dialog for printing displayed image + Vorschaudialog zum Drucken des angezeigten Bildes öffnen + + + + + Ctrl+P + Strg+P + + + + Open preview dialog for printing displayed text + Vorschaudialog zum Drucken des angezeigten Textes öffnen + + + + Copy Hex and ASCII + Hex und ASCII kopieren + + + + Copy selected hexadecimal and ASCII columns to the clipboard + Ausgewählte hexadezimale und ASCII-Spalten in die Zwischenablage kopieren + + + + Ctrl+Shift+C + Strg+Umschalt+C + + Import text Text importieren - Opens a file dialog used to import text to this database cell. Öffnet einen Dateiauswahldialog, um Text in diese Datenbank-Zelle zu importieren. - + &Import &Importieren - Export text Text exportieren - Opens a file dialog used to export the contents of this database cell to a text file. Öffnet einen Dateiauswahldialog, um den Inhalt dieser Datenbank-Zelle in eine Textdatei zu exportieren. - + &Export &Exportieren - + Set this cell to NULL Diese Zelle auf NULL setzen - + Set as &NULL Auf &NULL setzen - + + This editor mode lets you edit JSON or XML data with syntax highlighting, automatic formatting and validation before saving. + +Errors are indicated with a red squiggle underline. + Dieser Editormodus erlaubt Ihnen das Bearbeiten von JSON- oder XML-Daten mit Syntaxhervorhebung, automatischer Formatierung und Validierung vor dem Speichern. + +Fehler werden durch eine rote Wellenlinie gekennzeichnet. + + + + Apply data to cell + Daten auf Zelle anwenden + + + + This button saves the changes performed in the cell editor to the database cell. + Dieser Button speichert die im Zelleneditor für die Datenbankzelle durchgeführten Änderungen. + + + Apply Übernehmen - + Text Text - + Binary Binär @@ -558,7 +872,7 @@ Zelldaten löschen - + Erases the contents of the cell Löscht den Inhalt der Zelle @@ -571,74 +885,167 @@ <html><head/><body><p><span style=" font-weight:600; color:#c00000;">Warnung: Das Bearbeiten von Binärdaten im Textmodus produziert eventuell ungültige Daten!</span></p></body></html> - + This area displays information about the data present in this database cell Dieser Bereich stellt Informationen über die Daten in dieser Datenbank-Zelle dar - + Type of data currently in cell Art der Daten in dieser Zelle - + Size of data currently in table Größe der Daten in dieser Tabelle - Choose a file Datei auswählen - Text files(*.txt);;Image files(%1);;All files(*) Text-Dateien(*.txt);;Bild-Dateien(%1);;Alle Dateien(*) - + Choose a filename to export data Dateinamen für den Datenexport wählen - Text files(*.txt);;All files(*) Text-Dateien(*.txt);;Alle Dateien(*) - Image data can't be viewed with the text editor Bilddaten können nicht mit dem Texteditor angezeigt werden - Binary data can't be viewed with the text editor Binärdaten können nicht mit dem Texteditor angezeigt werden - + Type of data currently in cell: %1 Image Art der Daten in der aktuellen Zelle: %1 Bild - + %1x%2 pixel(s) %1x%2 Pixel - + Type of data currently in cell: NULL Art der Daten in dieser Zelle: NULL - - + + Type of data currently in cell: Text / Numeric Art der Daten in dieser Zelle: Text / Numerisch + + + + Image data can't be viewed in this mode. + In diesem Modus können keine Bilddaten angezeigt werden. + + + + + Try switching to Image or Binary mode. + Versuchen Sie, in den Bild- oder Binär-Modus zu wechseln. + + + + + Binary data can't be viewed in this mode. + Binärdaten können in diesem Modus nicht angezeigt werden. + + + + + Try switching to Binary mode. + Versuchen Sie, in den Binär-Modus zu wechseln. + + + + + + + Text files (*.txt) + Textdateien (*.txt) + + + + + + JSON files (*.json) + JSON-Dateien (*.json) + + + + + + + XML files (*.xml) + XML-Dateien (*.xml) + + + + + Image files (%1) + Bilddateien (%1) + + + + + + Binary files (*.bin) + Binärdateien (*.bin) + + + + + All files (*) + Alle Dateien (*) + + + + Choose a file to import + Datei für Import auswählen + + + + %1 Image + %1 Bild + + + + SVG files (*.svg) + SVG-Dateien (*.svg) + + + + + Hex dump files (*.txt) + Hex-Dump-Dateien (*.txt) + + + + Invalid data for this mode + Ungültige Daten für diesen Modus + + + + The cell contains invalid %1 data. Reason: %2. Do you really want to apply it to the cell? + Die Zelle enthält ungültige %1-Daten. Grund: %2. Möchten Sie diese wirklich auf die Zelle anwenden? + - - + + + %n char(s) %n Zeichen @@ -646,6 +1053,11 @@ + + Type of data currently in cell: Valid JSON + Aktueller Datentyp in dieser Zelle: Gültiges JSON + + Type of data currently in cell: Image Art der Daten in dieser Zelle: Bild @@ -654,13 +1066,13 @@ %1x%2 Pixel - + Type of data currently in cell: Binary Art der Daten in dieser Zelle: Binär - - + + %n byte(s) %n Byte @@ -672,7 +1084,7 @@ EditIndexDialog Create New Index - Neuen Index erstellen + Neuen Index erstellen @@ -682,15 +1094,15 @@ &Columns character after ampersand changed - &Spalten + &Spalten Column - Spalte + Spalte Use in Index - Im Index verwenden + Im Index verwenden @@ -748,13 +1160,13 @@ Indexspalte - + Deleting the old index failed: %1 Löschen des alten Index fehlgeschlagen: %1 - + Creating the index failed: %1 Erstellen des Index fehlgeschlagen: @@ -780,186 +1192,193 @@ + Database schema + Datenbankschema + + + Make this a 'WITHOUT rowid' table. Setting this flag requires a field of type INTEGER with the primary key flag set and the auto increment flag unset. Als 'WITHOUT rowid'-Tabelle markieren. Das Setzen dieses Flags erfordert ein Feld vom Typ INTEGER mit gesetzten Primärkey-Flag und nicht gesetztem Autoinkrement-Flag. - + Without Rowid Ohne Rowid - Set this to create a temporary table that is deleted when closing the database. Dies erzeugt eine temporäre Tabelle, welche beim Schließen der Datenbank gelöscht wird. - Temporary table Temporäre Tabelle - + Fields Felder - + Add field Feld hinzufügen - + Remove field Feld entfernen - + Move field up Ein Feld nach oben - + Move field down Ein Feld nach unten - + Name Name - + Type Typ - - + + NN + NN + + + Not null Nicht Null - + PK PK - + Primary key Primärschlüssel - + AI AI - + Autoincrement Autoinkrement - + U - + Unique Eindeutig - + Default Voreinstellung - + Default value Voreingestellter Wert - + Check Prüfen - + Check constraint Beschränkung prüfen - + Foreign Key Fremdschlüssel - + <html><head/><body><p><span style=" font-weight:600; color:#ff0000;">Warning: </span>There is something with this table definition that our parser doesn't fully understand. Modifying and saving this table might result in problems.</p></body></html> <html><head/><body><p><span style="font-weight:600; color:#ff0000;">Warnung: </span>Diese Tabellendefinitionenthält Elemente, die unser Parser nicht vollständig versteht. Das Ändern und Speichern der Tabelle kann zu Problemen führen.</p></body></html> <html><head/><body><p><span style=" font-weight:600; color:#ff0000;">Warning: </span>There is something with this table definition that our parser doesn't fully understand. Modifying and saving this table might result it in problems.</p></body></html> - <html><head/><body><p><span style=" font-weight:600; color:#ff0000;">Warnung: </span>Die Definition dieser Tabelle enthält Elemente, die unser Parser nicht vollständig versteht. Ändern und Speichern dieser Tabelle könnte zu Problemen führen.</p></body></html> + <html><head/><body><p><span style=" font-weight:600; color:#ff0000;">Warnung: </span>Die Definition dieser Tabelle enthält Elemente, die unser Parser nicht vollständig versteht. Ändern und Speichern dieser Tabelle könnte zu Problemen führen.</p></body></html> - + Error creating table. Message from database engine: %1 Fehler beim Erstellen der Tabelle. Meldung der Datenbank: %1 - + There already is a field with that name. Please rename it first or choose a different name for this field. Es existiert bereits ein Feld mit diesem Namen. Bitte benennen Sie es zunächst um oder wählen Sie einen anderen Namen für dieses Feld. This column is referenced in a foreign key in table %1, column %2 and thus its name cannot be changed. - Diese Spalte wird über einen Fremdschlüssel in Tabelle %1, Spalte %2 referenziert, sodass deren Name nicht geändert werden kann. + Diese Spalte wird über einen Fremdschlüssel in Tabelle %1, Spalte %2 referenziert, sodass deren Name nicht geändert werden kann. - + This column is referenced in a foreign key in table %1 and thus its name cannot be changed. Diese Spalte wird in einem Fremdschlüssel in Tabelle %1 referenziert und kann aus diesem Grund nicht geändert werden. - + There is at least one row with this field set to NULL. This makes it impossible to set this flag. Please change the table data first. Mindestens eine Reihe enthält ein Feld mit dem Wert NULL. Dies verhindert das Setzen dieser Markierung. Bitte zunächst die Tabellendaten ändern. - + There is at least one row with a non-integer value in this field. This makes it impossible to set the AI flag. Please change the table data first. Mindestens eine Reihe enthält ein Feld mit einem nicht ganzzahligen Wert. Dies verhindert das Setzen der AI-Markierung. Bitte zunächst die Tabellendaten ändern. - + Column '%1' has no unique data. Spalte '%1' hat keine eindeutigen Daten. - + This makes it impossible to set this flag. Please change the table data first. Dies verhindert das Setzen dieses Flags. Bitte zunächst die Tabellendaten ändern. - + Modifying this column failed. Error returned from database: %1 Ändern dieser Spalte fehlgeschlagen: Die Datenbank meldet diesen Fehler: %1 - + Are you sure you want to delete the field '%1'? All data currently stored in this field will be lost. Soll das Feld '%1' wirklich gelöscht werden? Alle aktuell in diesem Feld gespeicherten Daten gehen verloren. - + Please add a field which meets the following criteria before setting the without rowid flag: - Primary key flag set - Auto increment disabled @@ -968,13 +1387,19 @@ - Autoinkrement deaktiviert - + Setting the rowid column for the table failed. Error message: %1 Setzen der Zeilenid-Spalte dieser Tabelle fehlgeschlagen. Fehlermeldung: %1 - + + Changing the table schema failed. Error message: +%1 + Die Änderung des Tabellenschemas ist fehlgeschlagen. Fehlermeldung: +%1 + + Setting the temporary flag for the table failed. Error message: %1 Setzen des Temporär-Flags dieser Tabelle fehlgeschlagen. Fehlermeldung: %1 @@ -993,15 +1418,15 @@ &Table(s) - &Tabelle(n) + &Tabelle(n) &Column names in first line - &Spaltennamen in erster Zeile + &Spaltennamen in erster Zeile Field &separator - Feld-&Separator + Feld-&Separator @@ -1081,44 +1506,54 @@ Pretty Print - - + + Could not open output file: %1 Ausgabedatei konnte nicht geöffnet werden: %1 - - + + Choose a filename to export data Dateinamen für den Datenexport wählen - + Text files(*.csv *.txt) Text-Dateien(*.csv *.txt) - + Export data as JSON Daten als JSON exportieren - + + exporting CSV + exportiere CSV + + + + exporting JSON + exportiere JSON + + + Text files(*.json *.js *.txt) Text-Dateien(*.json *.js *.txt) - + Please select at least 1 table. Bitte mindestens eine Tabelle auswählen. - + Choose a directory Verzeichnis wählen - + Export completed. Export abgeschlossen. @@ -1190,57 +1625,161 @@ Altes Schema überschreiben (DROP TABLE, dann CREATE TABLE) - Please select at least 1 table. Bitte mindestens eine Tabelle auswählen. - + + Please select at least one table. + Bitte wählen Sie mindestens eine Tabelle aus. + + + Choose a filename to export Dateinamen zum Export auswählen - + Text files(*.sql *.txt) Textdateien(*.sql *.txt) - + Export completed. Export abgeschlossen. - + Export cancelled or failed. Export abgebrochen oder fehlgeschlagen. + ExtendedScintilla + + + + Ctrl+H + Strg+H + + + + + Ctrl+P + Strg+P + + + + Find and Replace... + Suchen und ersetzen... + + + + Print... + Drucken... + + + ExtendedTableWidget The content of clipboard is bigger than the range selected. Do you want to insert it anyway? - Der Inhalt der Zwischenablage ist größer als der ausgewählte Bereich. + Der Inhalt der Zwischenablage ist größer als der ausgewählte Bereich. Möchten Sie ihn dennoch einfügen? - - Set to NULL - Auf NULL setzen + + Use as Exact Filter + Als exakten Filter verwenden - - Copy - Kopieren + + Containing + Enthält - - Paste - Einfügen + + Not equal to + Ungleich zu - - The content of the clipboard is bigger than the range selected. + + Greater than + Größer als + + + + Less than + Kleiner als + + + + Greater or equal + Größer oder gleich + + + + Less or equal + Kleiner oder gleich + + + + Between this and... + Zwischen diesem und... + + + + Set to NULL + Auf NULL setzen + + + + Copy + Kopieren + + + + Copy with Headers + Mit Headern kopieren + + + + Copy as SQL + Als SQL kopieren + + + + Paste + Einfügen + + + + Print... + Drucken... + + + + Use in Filter Expression + In Filterausdruck verwenden + + + + Alt+Del + Alt+Entf + + + + Ctrl+Shift+C + Strg+Umschalt+C + + + + Ctrl+Alt+C + Strg+Alt+C + + + + The content of the clipboard is bigger than the range selected. Do you want to insert it anyway? Der Inhalt der Zwischenablage ist größer als der ausgewählte Bereich. Soll er dennoch eingefügt werden? @@ -1249,16 +1788,150 @@ FileDialog SQLite database files (*.db *.sqlite *.sqlite3 *.db3);;All files (*) - SQLite Datenbankdateien (*.db *.sqlite *.sqlite3 *.db3);;Alle Dateien (*) + SQLite Datenbankdateien (*.db *.sqlite *.sqlite3 *.db3);;Alle Dateien (*) + + + + FileExtensionManager + + + File Extension Manager + Dateierweiterungs-Manager + + + + &Up + H&och + + + + &Down + &Runter + + + + &Add + &Hinzufügen + + + + &Remove + &Entfernen + + + + + Description + Beschreibung + + + + Extensions + Erweiterungen + + + + *.extension + *.erweiterung FilterLineEdit - + Filter Filtern + + + These input fields allow you to perform quick filters in the currently selected table. +By default, the rows containing the input text are filtered out. +The following operators are also supported: +% Wildcard +> Greater than +< Less than +>= Equal to or greater +<= Equal to or less += Equal to: exact match +<> Unequal: exact inverse match +x~y Range: values between x and y + Diese Eingabefelder erlauben Ihnen das Anwenden von schnellen Filtern in der aktuell ausgewählten Tabelle. +Standardmäßig werden Zeilen, die den Eingabetext beinhalten, herausgefiltert. +Zudem werden die folgenden Operatoren unterstützt: +% Wildcard +> Größer als +< Kleiner als +>= Größer oder gleich +<= Kleiner oder gleich += Gleich: exakte Übereinstimmung +<> Ungleich:exakte inverse Übereinstimmung +x~y Bereich: Werte zwischen x und y + + + + Set Filter Expression + Filterausdruck setzen + + + + What's This? + Was ist das? + + + + Is NULL + Ist NULL + + + + Is not NULL + Ist nicht NULL + + + + Is empty + Ist leer + + + + Is not empty + Ist nicht leer + + + + Equal to... + Gleich zu... + + + + Not equal to... + Ungleich zu... + + + + Greater than... + Größer als... + + + + Less than... + Kleiner als... + + + + Greater or equal... + Größer oder gleich... + + + + Less or equal... + Kleiner oder gleich... + + + + In range... + Im Bereich... + FilterTableHeader @@ -1268,6 +1941,130 @@ + FindReplaceDialog + + + Find and Replace + Suchen und Ersetzen + + + + Fi&nd text: + Text fi&nden: + + + + Re&place with: + Er&setzen mit: + + + + Match &exact case + &Exakte Schreibung + + + + Match &only whole words + Nur &ganze Wörter + + + + When enabled, the search continues from the other end when it reaches one end of the page + Falls aktiviert, fährt die Suche am anderen Ende fort, wenn sie das Ende der Seite erreicht hat + + + + &Wrap around + &Umbrechen + + + + When set, the search goes backwards from cursor position, otherwise it goes forward + Falls gesetzt, erfolgt die Suche rückwärts von der Cursorposition, andernfalls erfolgt sie vorwärts + + + + Search &backwards + Rück&wärts suchen + + + + <html><head/><body><p>When checked, the pattern to find is interpreted as a UNIX regular expression. See <a href="https://en.wikibooks.org/wiki/Regular_Expressions">Regular Expression in Wikibooks</a>.</p></body></html> + <html><head/><body><p>Falls aktiviert, wird das Suchmuster als regulärer Ausdruck (UNIX-Stil) interpretiert. Siehe <a href="https://en.wikibooks.org/wiki/Regular_Expressions">Regular Expression in Wikibooks (englisch)</a>.</p></body></html> + + + + Use regular e&xpressions + Reguläre A&usdrücke verwenden + + + + Find the next occurrence from the cursor position and in the direction set by "Search backwards" + Das nächste Auftreten ausgehend von der Cursorpositoin und in der durch "Rückwärts suchen" gesetzten Richtung finden + + + + &Find Next + Nächste &finden + + + + &Replace + &Ersetzen + + + + Highlight all the occurrences of the text in the page + Alle Auftreten des Textes auf der Seite hervorheben + + + + F&ind All + Alle f&inden + + + + Replace all the occurrences of the text in the page + Alle Auftreten des Textes auf der Seite ersetzen + + + + Replace &All + &Alle ersetzen + + + + The searched text was not found + Der gesuchte Text wurde nicht gefunden + + + + + The searched text was not found. + Der gesuchte Text wurde nicht gefunden. + + + + The searched text was found one time. + Der gesuchte Text wurde einmal gefunden. + + + + The searched text was found %1 times. + Der gesuchte Text wurde %1-mal gefunden. + + + + The searched text was replaced one time. + Der gesuchte Text wurde einmal ersetzt. + + + + The searched text was replaced %1 times. + Der gesuchte Text wurde %1-mal ersetzt. + + + ForeignKeyEditor @@ -1281,7 +2078,7 @@ (foreign key clauses(ON UPDATE, ON DELETE etc.) - (Fremdschlüssel-Klauseln(ON UPDATE, ON DELETE etc.)) + (Fremdschlüssel-Klauseln(ON UPDATE, ON DELETE etc.)) @@ -1292,11 +2089,15 @@ CSV-Datei importieren - &Table name &Tabellenname + + Table na&me + Tabellenna&me + + &Column names in first line &Spaltennamen in erster Zeile @@ -1318,7 +2119,7 @@ - + Tab Tab @@ -1380,58 +2181,113 @@ Tabellen trennen + + Advanced + Erweitert + + + + When importing an empty value from the CSV file into an existing table with a default value for this column, that default value is inserted. Activate this option to insert an empty value instead. + Beim Import eines leeren Wertes aus einer CSV-Datei in eine existierende Tabelle mit einem Standardwert für diese Spalte wird dieser Standardwert eingefügt. Aktivieren Sie diese Option, um stattdessen einen leeren Wert einzufügen. + + + + Ignore default &values + Standard&werte ignorieren + + - + Activate this option to stop the import when trying to import an empty value into a NOT NULL column without a default value. + Aktivieren Sie diese Option, um den Import zu stoppen, falls ein leerer Wert in eine NOT-NULL-Spalte ohne Standardwert importiert werden soll. + + + + Fail on missing values + Fehler bei fehlenden Werten + + + + Disable data type detection + Datentyp-Erkennung deaktivieren + + + + Disable the automatic data type detection when creating a new table. + Die automatische Datentyperkennung bei der Erstellung einer neuen Tabelle deaktivieren. + + + + Deselect All Alle abwählen - + Match Similar Ähnliche suchen - + Select All Alle auswählen - Inserting data... Füge Daten ein... - Cancel Abbrechen - There is already a table of that name and an import into an existing table is only possible if the number of columns match. Es gibt bereits eine Tabelle mit diesem Namen. Ein Import in eine existierende Tabelle ist nur bei übereinstimmender Spaltenanzahl möglich. - There is already a table of that name. Do you want to import the data into it? Es gibt bereits eine Tabelle mit diesem Namen. Sollen die Daten in diese importiert werden? - + + Import completed + Import vollständig + + + + There is already a table named '%1' and an import into an existing table is only possible if the number of columns match. + Es gibt bereits eine Tabelle namens '%1' und ein Import in eine existierende Tabelle ist nur bei übereinstimmender Spaltenanzahl möglich. + + + + There is already a table named '%1'. Do you want to import the data into it? + Es gibt bereits eine Tabelle namens '%1'. Möchten Sie die Daten in diese importieren? + + + Creating restore point failed: %1 Erstellung des Wiederherstellungspunktes fehlgeschlagen: %1 - + Creating the table failed: %1 Erstellung der Tabelle fehlgeschlagen: %1 - + + importing CSV + importierte CSV + + + + Importing the file '%1' took %2ms. Of this %3ms were spent in the row function. + Import der Datei '%1' benötigte %2ms. Davon wurden %3ms in der Zeilenfunktion verbracht. + + Missing field for record %1 Fehlendes Feld für Record %1 - + Inserting row failed: %1 Einfügen der Zeile fehlgeschlagen: %1 @@ -1447,231 +2303,641 @@ Datenbank&struktur - - + toolBar1 Toolbar1 - &Browse Data - &Daten durchsuchen + &Browse Data + &Daten durchsuchen + + + Table: + Tabelle: + + + + Select a table to browse data + Anzuzeigende Tabelle auswählen + + + + Use this list to select a table to be displayed in the database view + Mit dieser Liste können Sie die in der Tabllenansicht anzuzeigende Tabelle auswählen + + + Refresh the data in the selected table. + Aktualisiert die angezeigten Tabellendaten. + + + + This button refreshes the data in the currently selected table. + Dieser Button aktualisiert die Daten der aktuellen Tabellenansicht. + + + + Scroll one page upwards + Eine Seite nach oben scrollen + + + + <html><head/><body><p>Clicking this button navigates one page of records upwards in the table view above.</p></body></html> + <html><head/><body><p>Ein Klick auf diesen Button navigiert in den Einträgen der Tabellenansicht oben eine Seite nach oben.</p></body></html> + + + + Scroll one page downwards + Eine Seite nach unten scrollen + + + + <html><head/><body><p>Clicking this button navigates one page of records downwards in the table view above.</p></body></html> + <html><head/><body><p>Ein Klick auf diesen Button navigiert in den Einträgen der Tabellenansicht oben eine Seite nach unten.</p></body></html> + + + SQLCipher &FAQ... + SQLCipher &FAQ... + + + + Opens the SQLCipher FAQ in a browser window + Öffnt die SQLCiper FAQ in einem Browserfenster + + + Table(s) to JSON... + Tabelle(n) zu JSON... + + + + Export one or more table(s) to a JSON file + Exportiert eine oder mehrere Tabelle(n) in eine JSON-Datei + + + Save to Remote + Entfernt speichern + + + + Refresh + Aktualisieren + + + + F5 + F5 + + + + Insert a new record in the current table + Fügt eine neue Zeile zur aktuellen Tabelle hinzu + + + This button creates a new, empty record in the database + Dieser Button erzeugt eine neue, leere Zeile in der Tabelle + + + + + New Record + Neue Zeile + + + + Delete the current record + Aktuelle Zeile löschen + + + This button deletes the record currently selected in the database + Dieser Button löscht die aktuell in der Tabellenansicht ausgewählte Zeile + + + + + Delete Record + Zeile löschen + + + This is the database view. You can double-click any record to edit its contents in the cell editor window. + Dies ist die Tabellenansicht. Mit einem Doppelklick auf eine Zeile können Sie ihren Inhalt in einem Editorfenster bearbeiten. + + + + < + < + + + + 0 - 0 of 0 + 0 - 0 von 0 + + + + > + > + + + Scroll 100 records upwards + 100 Zeilen nach oben scrollen + + + + DB Browser for SQLite + DB Browser für SQLite + + + + This is the structure of the opened database. +You can drag SQL statements from an object row and drop them into other applications or into another instance of 'DB Browser for SQLite'. + + Dies ist die Struktur der geöffneten Datenbank. +Sie können SQL-Statements aus einer Objektzeile fassen und in anderen Anwendungen oder einer anderen 'DB-Browser für SQLite'-Instanz ablegen. + + + + &Table: + &Tabelle: + + + + Refresh the data in the selected table + Die Daten in der ausgewählten Tabelle aktualisieren + + + + Clear all filters + Alle Filter löschen + + + + This button clears all the filters set in the header input fields for the currently browsed table. + Dieser Button löscht alle gesetzten Filter in den Header-Eingabefeldern der aktuell angezeigten Tabelle. + + + + Save the table as currently displayed + Tabelle wie aktuell angezeigt speichern + + + + <html><head/><body><p>This popup menu provides the following options applying to the currently browsed and filtered table:</p><ul style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;"><li style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Export to CSV: this option exports the data of the browsed table as currently displayed (after filters, display formats and order column) to a CSV file.</li><li style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Save as view: this option saves the current setting of the browsed table (filters, display formats and order column) as an SQL view that you can later browse or use in SQL statements.</li></ul></body></html> + <html><head/><body><p>Dieses Popup-Menü bietet die folgenden Optionen zur Anwendung auf die aktuell ausgewählte und gefilterte Tabelle:</p><ul style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;"><li style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">CSV exportieren: diese Option exportiert die Daten der ausgewählten Tabelle wie aktuell angezeigt (gefiltert, Anzeigeformat und Spaltenreihenfolge) in eine CSV-Datei.</li><li style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Als Ansicht speichern: diese Option speichert die aktuelle Einstellung der ausgewählten Tabelle (Filter, Anzeigeformat und Spaltenreihenfolge) als eine SQL-View, die Sie später durchsuchen oder in SQL-Statements verwenden können.</li></ul></body></html> + + + + ... + ... + + + + Print currently browsed table data + Aktuell angezeigte Tabellendaten drucken + + + + Print currently browsed table data. Print selection if more than one cell is selected. + Die aktuell angezeigten Tabellendaten drucken. Druckauswahl, falls mehr als eine Zelle ausgewählt ist. + + + + <html><head/><body><p>This button creates a new record in the database. Hold the mouse button to open a pop-up menu of different options:</p><ul><li><span style=" font-weight:600;">New Record</span>: insert a new record with default values in the database.</li><li><span style=" font-weight:600;">Insert Values...</span>: open a dialog for entering values before they are inserted in the database. This allows to enter values acomplishing the different constraints. This dialog is also open if the <span style=" font-weight:600;">New Record</span> option fails due to these constraints.</li></ul></body></html> + <html><head/><body><p>Dieser Button erstellt eine neue Zeile in der Datenbank. Halten sie die Maustaste gedrückt, um ein Popup-Menü mit verschiedenen Optionen zu öffnen:</p><ul><li><span style=" font-weight:600;">Neuer Eintrag</span>: eine neue Zeile mit Standardwerten in die Datenbank einfügen.</li><li><span style=" font-weight:600;">Werte einfügen...</span>: einen Dialog zur Eingabe von Werten öffnen, bevor diese in die Datenbank eingefügt werden. Dies erlaubt die Eingabe von Werten, die den Constraints Genüge tun. Dieser Dialog wird auch geöffnet, falls die <span style=" font-weight:600;">Neuer Eintrag</span>-Option aufgrund dieser Constraints fehlschlägt.</li></ul></body></html> + + + + This button deletes the record or records currently selected in the table + Dieser Button löscht die Zeile oder Zeilen, die aktuell in der Tabelle ausgewählt sind + + + + This is the database table view. You can do the following actions: + - Start writing for editing inline the value. + - Double-click any record to edit its contents in the cell editor window. + - Alt+Del for deleting the cell content to NULL. + - Ctrl+" for duplicating the current record. + - Ctrl+' for copying the value from the cell above. + - Standard selection and copy/paste operations. + Dies ist die Datenbanktabellen-Ansicht. Sie können die folgenden Aktionen durchführen: + - Mit Schreiben beginnen, um die Werte inline zu bearbeiten. + - Doppelt auf einen Eintrag klicken, um dessen Inhalte im Zelleneditor-Fenster zu bearbeiten. + - Alt+Entf zum Löschen des Zellinhaltes zu NULL. + - Strg+" zur Duplizierung des aktuellen Eintrags. + - Ctrl+' zum Kopieren des Wertes der darüberliegenden Zelle. + - Standardmäßige Auswahl- und Kopieren/Einfügen-Operationen. + + + + <html><head/><body><p>Scroll to the beginning</p></body></html> + <html><head/><body><p>Zum Anfang scrollen</p></body></html> + + + + <html><head/><body><p>Clicking this button navigates to the beginning in the table view above.</p></body></html> + <html><head/><body><p>Ein Klick auf diesen Button navigiert zum Anfang der oben angezeigten Tabelle.</p></body></html> + + + + |< + |< + + + + Compact &Database... + &Datenbank komprimieren... + + + + Execute all/selected SQL + Komplettes/ausgewähltes SQL ausführen + + + + This button executes the currently selected SQL statements. If no text is selected, all SQL statements are executed. + Dieser Button führt das aktuell ausgewählte SQL-Statement aus. Falls kein Text ausgewählt ist, werden alle SQL-Statements ausgeführt. + + + + This button opens a file containing SQL statements and loads it in a new editor tab + Dieser Button öffnet eine Datei mit SQL-Statements und lädt diese in einen neuen Editortab + + + + &Load Extension... + Erweiterung &laden... + + + + &Wiki + &Wiki + + + + Bug &Report... + Fehle&rmeldung... + + + + Feature Re&quest... + Funktions&anfrage... + + + + Web&site + Web&seite + + + + &Donate on Patreon... + Über &Patreon spenden... + + + + Sa&ve Project... + Projekt &speichern... + + + + This button lets you save all the settings associated to the open DB to a DB4S project file + Dieser Button erlaubt Ihnen das Speichern aller mit der geöffneten DB verbundenen Einstellungen in einer DB4S-Projektdatei + + + + Open &Project... + &Projekt öffnen... + + + + This button lets you open a DB4S project file + Dieser Button erlaubt Ihnen das Öffnen einer DB4S-Projektdatei + + + + &Attach Database... + Datenbank &anhängen... + + + + + Add another database file to the current database connection + Eine andere Datenbankdatei zur aktuellen Datenbankverbindung hinzufügen + + + + This button lets you add another database file to the current database connection + Dieser Button erlaubt Ihnen das Hinzufügen einer anderen Datenbankdatei zur aktuellen Datenbankverbindung + + + + &Set Encryption... + Verschlüsselung &setzen... + + + + SQLCipher &FAQ + SQLCiper &FAQ + + + + Table(&s) to JSON... + Tabelle(&n) zu JSON... + + + + Open Data&base Read Only... + Daten&bank im Lesemodus öffnen... + + + + Save results + Ergebnisse speichern + + + + Save the results view + Ergebnisansicht speichern + + + + This button lets you save the results of the last executed query + Dieser Button erlaubt Ihnen das Speichern der Ergebnisse der zuletzt ausgeführten Query + + + + Find text in SQL editor + Text im SQL-Editor finden + + + + Find text in SQL editor + Text im SQL-Editor finden + + + + This button opens the search bar of the editor + Dieser Button öffnet die Suchleiste des Editors + + + + Ctrl+F + Strg+F + + + + Find or replace text in SQL editor + Text im SQL-Editor suchen oder ersetzen + + + + Find or replace text in SQL editor + Text im SQL-Editor suchen oder ersetzen + + + + This button opens the find/replace dialog for the current editor tab + Dieser Button öffnet den Suchen-/Ersetzen-Dialog für den aktuellen Editortab + + + + + Export to &CSV + Nach &CSV exportieren + + + + + Save as &view + Als &View speichern + + + + Save as view + Als View speichern - Table: - Tabelle: + + Hide column(s) + Spalte(n) verbergen - - Select a table to browse data - Anzuzeigende Tabelle auswählen + + Hide selected column(s) + Ausgewählte Spalte(n) verbergen - - Use this list to select a table to be displayed in the database view - Mit dieser Liste können Sie die in der Tabllenansicht anzuzeigende Tabelle auswählen + + Show all columns + Alle Spalten anzeigen - - Refresh the data in the selected table. - Aktualisiert die angezeigten Tabellendaten. + + Show all columns that were hidden + Alle versteckten Spalten anzeigen - - This button refreshes the data in the currently selected table. - Dieser Button aktualisiert die Daten der aktuellen Tabellenansicht. + + Shows or hides the Project toolbar. + Zeigt oder versteckt die Projekt-Werkzeugleiste. - - Scroll one page upwards - Eine Seite nach oben scrollen + + Extra DB Toolbar + Extra-DB-Werkzeugleiste - - <html><head/><body><p>Clicking this button navigates one page of records upwards in the table view above.</p></body></html> - <html><head/><body><p>Ein Klick auf diesen Button navigiert in den Einträgen der Tabellenansicht oben eine Seite nach oben.</p></body></html> + + + Export the filtered data to CSV + Die gefilterten Daten als CSV exportieren - - Scroll one page downwards - Eine Seite nach unten scrollen + + This button exports the data of the browsed table as currently displayed (after filters, display formats and order column) as a CSV file. + Dieser Button exportiert die Daten der ausgewählten Tabelle wie aktuell angezeigt (gefiltert, Anzeigeformate und Spaltenreihenfolge) als CSV-Datei. - - <html><head/><body><p>Clicking this button navigates one page of records downwards in the table view above.</p></body></html> - <html><head/><body><p>Ein Klick auf diesen Button navigiert in den Einträgen der Tabellenansicht oben eine Seite nach unten.</p></body></html> + + + Save the current filter, sort column and display formats as a view + Den aktuellen Filter, die Spaltenreihenfolge und Anzeigeformate als View speichern - - SQLCipher &FAQ... - SQLCipher &FAQ... + + This button saves the current setting of the browsed table (filters, display formats and order column) as an SQL view that you can later browse or use in SQL statements. + Dieser Button speichert die aktuellen Einstellungen der ausgewählten Tabelle (Filter, Anzeigeformate und Spaltenreihenfolge) als SQL-View, welche Sie später durchsuchen oder in SQL-Statements verwenden können. - - Opens the SQLCipher FAQ in a browser window - Öffnt die SQLCiper FAQ in einem Browserfenster + + Insert Values... + Werte einfügen... - - Table(s) to JSON... - Tabelle(n) zu JSON... + + + Open a dialog for inserting values in a new record + Einen Dialog zum Einfügen von Werten in eine neue Zeile öffnen - - Export one or more table(s) to a JSON file - Exportiert eine oder mehrere Tabelle(n) in eine JSON-Datei + + + Insert new record using default values in browsed table + Eine neue Zeile mit den Standardwerten in den ausgewählte Tabelle einfügen - Save to Remote - Entfernt speichern + + New In-&Memory Database + Neue In-&Memory-Datenbank - - Refresh - Aktualisieren + + Drag && Drop Qualified Names + Drag && Drop qualifizierter Namen - - F5 - F5 + + + Use qualified names (e.g. "Table"."Field") when dragging the objects and dropping them into the editor + Qualifizierte Namen (z.B. "Tabelle."Feld") verwenden, wenn die Objekte gefasst und im Editor abgelegt werden - - Insert a new record in the current table - Fügt eine neue Zeile zur aktuellen Tabelle hinzu + + Drag && Drop Enquoted Names + Drag && Drop zitierter Namen - - This button creates a new, empty record in the database - Dieser Button erzeugt eine neue, leere Zeile in der Tabelle + + + Use escaped identifiers (e.g. "Table1") when dragging the objects and dropping them into the editor + Geschützte Identifier (z.B. "Tabelle1") verwenden, wenn die Objekte gefasst und im Editor abgelegt werden - - New Record - Neue Zeile + + &Integrity Check + &Integritätsprüfung - - Delete the current record - Aktuelle Zeile löschen + + Runs the integrity_check pragma over the opened database and returns the results in the Execute SQL tab. This pragma does an integrity check of the entire database. + Führt das integrity_check-Pragma auf der geöffneten Datenbank aus und gibt die Ergebnisse im SQL-Tab zurück. Dieses Pragma führt eine Integritätsprüfung der gesamten Datenbank durch. - - This button deletes the record currently selected in the database - Dieser Button löscht die aktuell in der Tabellenansicht ausgewählte Zeile + + &Foreign-Key Check + &Fremdschlüssel-Prüfung - - Delete Record - Zeile löschen + + Runs the foreign_key_check pragma over the opened database and returns the results in the Execute SQL tab + Führt das foreign_key_check-Pragma auf der geöffneten Datenbank aus und gibt die Ergebnisse im SQL-Tab zurück - - This is the database view. You can double-click any record to edit its contents in the cell editor window. - Dies ist die Tabellenansicht. Mit einem Doppelklick auf eine Zeile können Sie ihren Inhalt in einem Editorfenster bearbeiten. + + &Quick Integrity Check + &Schnelle Integritätsprüfung - - < - < + + Run a quick integrity check over the open DB + Führt eine schnelle Integritätsprüfung der geöffneten DB aus - - 0 - 0 of 0 - 0 - 0 von 0 + + Runs the quick_check pragma over the opened database and returns the results in the Execute SQL tab. This command does most of the checking of PRAGMA integrity_check but runs much faster. + Führt das quick_check-Pragma auf der geöffneten Datenbank aus und gibt die Ergebnisse im SQL-Tab zurück. Dieser Befehl führt einen Großteil der Prüfung des integrity_check-Pragmas aus, ist aber deutlich schneller. - - > - > + + &Optimize + &Optimieren - Scroll 100 records upwards - 100 Zeilen nach oben scrollen + + Attempt to optimize the database + Versuchen, die Datenbank zu optimieren - - DB Browser for SQLite - DB Browser für SQLite + + Runs the optimize pragma over the opened database. This pragma might perform optimizations that will improve the performance of future queries. + Führt das optimize-Pragma auf der geöffneten Datenbank aus. Dieses Pragma führt möglicherweise Optimierungen durch, die die Performanz zukünftiger Queries verbessern. - - &Table: - &Tabelle: + + + Print + Drucken - - Clear all filters - Alle Filter löschen + + Print text from current SQL editor tab + Den Text aus dem aktuellen SQL-Editortab drucken - - <html><head/><body><p>Scroll to the beginning</p></body></html> - <html><head/><body><p>Zum Anfang scrollen</p></body></html> + + Open a dialog for printing the text in the current SQL editor tab + Einen Dialog zum Drucken des Textes im aktuellen SQL-Editortab öffnen - - <html><head/><body><p>Clicking this button navigates to the beginning in the table view above.</p></body></html> - <html><head/><body><p>Ein Klick auf diesen Button navigiert zum Anfang der oben angezeigten Tabelle.</p></body></html> + + Print the structure of the opened database + Die Struktur der geöffneten Datenbank drucken - - |< - |< + + Open a dialog for printing the structure of the opened database + Einen Dialog zum Drucken der Struktur der geöffneten Datenbank öffnen <html><head/><body><p>Clicking this button navigates 100 records upwards in the table view above.</p></body></html> - <html><head/><body><p>Ein Klick auf diesen Button navigiert 100 Einträge höher in der oben angezeigten Tabelle.</p></body></html> + <html><head/><body><p>Ein Klick auf diesen Button navigiert 100 Einträge höher in der oben angezeigten Tabelle.</p></body></html> <html><head/><body><p>Scroll 100 records downwards</p></body></html> - <html><head/><body><p>100 Zeilen nach unten scrollen</p></body></html> + <html><head/><body><p>100 Zeilen nach unten scrollen</p></body></html> <html><head/><body><p>Clicking this button navigates 100 records downwards in the table view above.</p></body></html> - <html><head/><body><p>Ein Klick auf diesen Button navigiert 100 Einträge nach unten in der oben angezeigten Tabelle.</p></body></html> + <html><head/><body><p>Ein Klick auf diesen Button navigiert 100 Einträge nach unten in der oben angezeigten Tabelle.</p></body></html> - + Scroll to the end Zum Ende scrollen - + <html><head/><body><p>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Clicking this button navigates up to the end in the table view above.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</p></body></html> <html><head/><body><p>Ein Klick auf diesen Button navigiert zum Ende der oben angezeigten Tabelle.</p></body></html> - + >| >| - + <html><head/><body><p>Click here to jump to the specified record</p></body></html> <html><body><p>Klicken Sie hier, um zu einer bestimmten Zeile zu springen</p></body></html> - + <html><head/><body><p>This button is used to navigate to the record number specified in the Go to area.</p></body></html> <html><body><p>Dieser Button kann zum Navigieren zu einer im "Springe zu"-Bereich festgelegten Zeile verwendet werden.</p></body></html> - + Go to: Springe zu: - + Enter record number to browse Zeilennummer zum Suchen auswählen - + Type a record number in this area and click the Go to: button to display the record in the database view Geben Sie eine Zeilennummer in diesem Bereich ein und klicken Sie auf den "Springe zu:"-Button, um die Zeile in der Datenbankansicht anzuzeigen - + 1 1 @@ -1680,176 +2946,141 @@ &Pragmas bearbeiten - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_auto_vacuum"><span style=" text-decoration: underline; color:#0000ff;">Auto Vacuum</span></a></p></body></html> <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_auto_vacuum"><span style=" text-decoration: underline, color:#0000ff;">Automatisches Vakuum</span></a></p></body></html> - None Nichts - - Full Vollständig - Incremental Inkrementell - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_automatic_index"><span style=" text-decoration: underline; color:#0000ff;">Automatic Index</span></a></p></body></html> <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_automatic_index"><span style=" text-decoration: underline; color:#0000ff;">Automatischer Index</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_checkpoint_fullfsync"><span style=" text-decoration: underline; color:#0000ff;">Checkpoint Full FSYNC</span></a></p></body></html> <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_checkpoint_fullfsync"><span style=" text-decoration: underline; color:#0000ff;">Vollständiger FSYNC Speicherpunkt</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_foreign_keys"><span style=" text-decoration: underline; color:#0000ff;">Foreign Keys</span></a></p></body></html> <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_foreign_key"><span style=" text-decoration: underline; color:#0000ff;">Fremdschlüssel</span></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_fullfsync"><span style=" text-decoration: underline; color:#0000ff;">Full FSYNC</span></a></p></body></html> <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_fullfsync"><span style=" text-decoration: underline; color:#0000ff;">Vollständiger FSYNC</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_ignore_check_constraints"><span style=" text-decoration: underline; color:#0000ff;">Ignore Check Constraints</span></a></p></body></html> <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_ignore_check_constraints"><span style=" text-decoration: underline; color:#0000ff;">Beschränkungsprüfung ignorieren</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_journal_mode"><span style=" text-decoration: underline; color:#0000ff;">Journal Mode</span></a></p></body></html> <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_journal_mode"><span style=" text-decoration: underline; color:#0000ff;">Journal Modus</span></a></p></body></html> - Delete Löschen - Truncate Kürzen - Persist Behalten - - Memory Speicher - WAL WAL - - Off Aus - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_journal_size_limit"><span style=" text-decoration: underline; color:#0000ff;">Journal Size Limit</span></a></p></body></html> <html><head/><body><body><p><a href="http://www.sqlite.org/pragma.html#pragma_journal_size_limit"><span style=" text-decoration: underline; color:#0000ff;">Journal Größenbegrenzung</span></a></p></body><html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_locking_mode"><span style=" text-decoration: underline; color:#0000ff;">Locking Mode</span></a></p></body></html> <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_locking_mode"><span style=" text-decoration: underline; color:#0000ff;">Sperrmodus</span></a><p></body></html> - - Normal Normal - Exclusive Exklusiv - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_max_page_count"><span style=" text-decoration: underline; color:#0000ff;">Max Page Count</span></a></p></body></html> <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_max_page_count"><span style=" text decoration: underline; color:#0000ff;">Maximale Seitenanzahl</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_page_size"><span style=" text-decoration: underline; color:#0000ff;">Page Size</span></a></p></body></html> <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_page_size"><span style=" text-decoration: underline; color:#0000ff;">Seitengröße</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_recursive_triggers"><span style=" text-decoration: underline; color:#0000ff;">Recursive Triggers</span></a></p></body></html> <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_recursive_triggers"><span style=" text-decoration: underline; color:#0000ff;">Rekursive Trigger</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_secure_delete"><span style=" text-decoration: underline; color:#0000ff;">Secure Delete</span></a></p></body></html> <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_secure_delete"><span style=" text-decoration: underline; color:#0000ff;">Sicheres Löschen</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_synchronous"><span style=" text-decoration: underline; color:#0000ff;">Synchronous</span></a></p></body></html> <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_synchronous"><span style=" text-decoration: underline; color:#0000ff;">Synchronisierung</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_temp_store"><span style=" text-decoration: underline; color:#0000ff;">Temp Store</span></a></p></body></html> <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_temp_store"><span style=" text-decoration: underline; color:#0000ff;">Zwischenspeicherung</span></a></p></body></html> - Default Voreinstellung - File Datei - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_user_version"><span style=" text-decoration: underline; color:#0000ff;">User Version</span></a></p></body></html> <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_user_version"><span style=" text-decoration: underline; color:#0000ff;">Schemaversion</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_wal_autocheckpoint"><span style=" text-decoration: underline; color:#0000ff;">WAL Auto Checkpoint</span></a></p></body></html> <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_wal_autocheckpoint"><span style=" text-decoration: underline; color:#0000ff;">Automatischer WAL Speicherpunkt</span></a></p></body></html> - &Open Database Read Only... Datenbank schreibgeschützt &öffnen... - + Open an existing database file in read only mode Eine existierende Datenbank schreibgeschützt öffnen - + Unlock view editing Ansicht zur Bearbeitung entsperren - + This unlocks the current view for editing. However, you will need appropriate triggers for editing. Dies entsperrt die aktuelle Ansicht zur Bearbeitung. Allerdings werden zur Bearbeitung passende Trigger benötigt. @@ -1858,154 +3089,180 @@ S&QL ausführen - + &File &Datei - + &Import &Import - + &Export &Export Remote - Entfernt + Entfernt - + &Edit &Bearbeiten - + &View &Ansicht - + &Help &Hilfe - + Edit Database &Cell Datenbank&zelle bearbeiten - + + This button clears the contents of the SQL logs + Dieser Button löscht den Inhalt der SQL-Logs + + + + This panel lets you examine a log of all SQL commands issued by the application or by yourself + Dieses Panel erlaubt Ihnen das Betrachten eines Logs aller SQL-Kommandos, die von der Anwendung oder von Ihnen selbst ausgegangen sind + + + DB Sche&ma DB Sche&ma - + + This is the structure of the opened database. +You can drag multiple object names from the Name column and drop them into the SQL editor and you can adjust the properties of the dropped names using the context menu. This would help you in composing SQL statements. +You can drag SQL statements from the Schema column and drop them into the SQL editor or into other applications. + + Dies ist die Struktur der geöffneten Datenbank. +Sie können mehrere Objektnamen aus der Namensspalte nehmen und in den SQL-Editor ziehen und Sie können die Eigenschaften der abgelegten Namen über das Kontextmenü anpassen. Dies kann Sie bei der Erstellung von SQL-Statements unterstützen. +Sie können SQL-Statements aus der Schemaspalte nehmen und in den SQL-Editor oder in anderen Anwendungen ablegen. + + + &Remote Entfe&rnt - - Execute SQL [F5, Ctrl+Return, Ctrl+R] - SQL ausführen [F5, Ctrl+Return, Ctrl+R] + Execute SQL + SQL ausführen + + + + Execute current line + Aktuelle Zeile ausführen - - Execute current line [Shift+F5] - Aktuelle Zeile ausführen [Shift+F5] + + This button executes the SQL statement present in the current editor line + Dieser Button führt das SQL-Statement in der aktuellen Editorzeile aus - + Shift+F5 Shift+F5 - Sa&ve Project &Projekt speichern - Open &Project &Projekt öffnen - &Attach Database Datenbank &anhängen - &Set Encryption Verschlüsselung &setzen - - + + Save SQL file as SQL-Datei speichern als - + + This button saves the content of the current SQL editor tab to a file + Dieser Button speichert den Inhalt des aktuellen SQL-Editortabs in einer Datei + + + &Browse Table Tabelle &durchsuchen - + Copy Create statement Create-Statement kopieren - + Copy the CREATE statement of the item to the clipboard CREATE-Statement des Elements in die Zwischenablage kopieren - + Edit display format Anzeigeformat bearbeiten - + Edit the display format of the data in this column Anzeigeformat der Daten in dieser Spalte bearbeiten - + Show rowid column Rowid-Spalte anzeigen - + Toggle the visibility of the rowid column Sichtbarkeit der Rowid-Spalte umschalten - - + + Set encoding Codierung setzen - + Change the encoding of the text in the table cells Kodierung des Textes in den Tabellenzellen ändern - + Set encoding for all tables Kodierung für alle Tabellen setzen - + Change the default encoding assumed for all tables in the database Voreingestellte Kodierung für alle Tabellen in der Datenbank ändern + Duplicate record - Zeile duplizieren + Zeile duplizieren toolBar @@ -2020,17 +3277,17 @@ Zeige SQL von - + User Benutzer - + Application Anwendung - + &Clear &Leeren @@ -2040,167 +3297,177 @@ Columns - Spalten + Spalten X - X + X Y - Y + Y _ - _ + _ Line type: - Zeilentyp: + Zeilentyp: Line - Zeile + Zeile StepLeft - Nach links + Nach links StepRight - Nach rechts + Nach rechts StepCenter - Zur Mitte + Zur Mitte Impulse - Impuls + Impuls Point shape: - Punktform: + Punktform: Cross - Kreuz + Kreuz Plus - Plus + Plus Circle - Kreis + Kreis Disc - Scheibe + Scheibe Square - Quadrat + Quadrat Diamond - Diamant + Diamant Star - Stern + Stern Triangle - Dreieck + Dreieck TriangleInverted - Invertiertes Dreieck + Invertiertes Dreieck CrossSquare - Quadrat mit Kreuz + Quadrat mit Kreuz PlusSquare - Quadrat mit Plus + Quadrat mit Plus CrossCircle - Kreis mit Kreuz + Kreis mit Kreuz PlusCircle - Kreis mit Plus + Kreis mit Plus Peace - Peace + Peace Save current plot... - Aktuelles Diagramm speichern... + Aktuelles Diagramm speichern... Load all data. This has only an effect if not all data has been fetched from the table yet due to the partial fetch mechanism. - Alle Daten laden. Dies bringt nur etwas, wenn aufgrund des partiellen Abrufmechanismus noch nicht alle Daten der Tabelle abgerufen wurden. + Alle Daten laden. Dies bringt nur etwas, wenn aufgrund des partiellen Abrufmechanismus noch nicht alle Daten der Tabelle abgerufen wurden. DB Schema - DB Schema + DB Schema - + &New Database... &Neue Datenbank... - - + + Create a new database file Neue Datenbank-Datei erstellen - + This option is used to create a new database file. Diese Option wird zum Erstellen einer neuen Datenbank-Datei verwendet. - + Ctrl+N Strg+N - + + &Open Database... Datenbank &öffnen... - - - + + + + + Open an existing database file Existierende Datenbank-Datei öffnen - - + + + This option is used to open an existing database file. Diese Option wird zum Öffnen einer existierenden Datenbank-Datei verwendet. - + + Ctrl+O Strg+O - + &Close Database Datenbank &schließen - + + This button closes the connection to the currently open database file + Dieser Button schließt die Verbindung zu der aktuell geöffneten Datenbankdatei + + + Ctrl+W Strg+W @@ -2209,12 +3476,13 @@ Änderungen rückgängig machen - + + Revert database to last saved state Datenbank auf zuletzt gespeicherten Zustand zurücksetzen - + This option is used to revert the current database file to its last saved state. All changes made since the last save operation are lost. Diese Option wird zum Zurücksetzen der aktuellen Datenbank-Datei auf den zuletzt gespeicherten Zustand verwendet. Alle getätigten Änderungen gehen verloren. @@ -2223,17 +3491,18 @@ Änderungen schreiben - + + Write changes to the database file Änderungen in Datenbank-Datei schreiben - + This option is used to save changes to the database file. Diese Option wird zum Speichern von Änderungen in der Datenbank-Datei verwendet. - + Ctrl+S Strg+S @@ -2242,23 +3511,23 @@ Datenbank komprimieren - + Compact the database file, removing space wasted by deleted records Datenbank-Datei komprimieren, löscht Speicherplatz von gelöschten Zeilen - - + + Compact the database file, removing space wasted by deleted records. Datenbank-Datei komprimieren, löscht Speicherplatz von gelöschten Zeilen. - + E&xit &Beenden - + Ctrl+Q Strg+Q @@ -2267,12 +3536,12 @@ Datenbank aus SQL-Datei... - + Import data from an .sql dump text file into a new or existing database. Daten von einer .sql-Dump-Textdatei in eine neue oder existierende Datenbank importieren. - + This option lets you import data from an .sql dump text file into a new or existing database. SQL dump files can be created on most database engines, including MySQL and PostgreSQL. Diese Option wird zum Importieren von Daten von einer .sql-Dump-Textdatei in eine neue oder existierende Datenbank verwendet. SQL-Dumpdateien können von den meisten Datenbankanwendungen erstellt werden, inklusive MySQL und PostgreSQL. @@ -2281,12 +3550,12 @@ Tabelle aus CSV-Datei... - + Open a wizard that lets you import data from a comma separated text file into a database table. Öffnet einen Assistenten zum Importieren von Daten aus einer kommaseparierten Textdatei in eine Datenbanktabelle. - + Open a wizard that lets you import data from a comma separated text file into a database table. CSV files can be created on most database and spreadsheet applications. Öffnet einen Assistenten zum Importieren von Daten aus einer kommaseparierten Textdatei in eine Datenbanktabelle. CSV-Dateien können von den meisten Datenbank- und Tabellenkalkulations-Anwendungen erstellt werden. @@ -2295,12 +3564,12 @@ Datenbank zu SQL-Datei... - + Export a database to a .sql dump text file. Daten in eine .sql-Dump-Textdatei exportieren. - + This option lets you export a database to a .sql dump text file. SQL dump files contain all data necessary to recreate the database on most database engines, including MySQL and PostgreSQL. Diese Option ermöglicht den Export einer Datenbank in eine .sql-Dump-Textdatei. SQL-Dumpdateien enthalten alle notwendigen Daten, um die Datenbank mit den meisten Datenbankanwendungen neu erstellen zu können, inklusive MySQL und PostgreSQL. @@ -2309,12 +3578,12 @@ Tabelle als CSV-Datei... - + Export a database table as a comma separated text file. Datenbank als kommaseparierte Textdatei exportieren. - + Export a database table as a comma separated text file, ready to be imported into other database or spreadsheet applications. Exportiert die Datenbank als kommaseparierte Textdatei, fertig zum Import in andere Datenbank- oder Tabellenkalkulations-Anwendungen. @@ -2323,7 +3592,7 @@ Tabelle erstellen... - + Open the Create Table wizard, where it is possible to define the name and fields for a new table in the database Den Assistenten zum Erstellen einer Tabelle öffnen, wo der Name und die Felder für eine neue Tabelle in der Datenbank festgelegt werden können @@ -2332,7 +3601,7 @@ Tabelle löschen... - + Open the Delete Table wizard, where you can select a database table to be dropped. Den Assistenten zum Löschen einer Tabelle öffnen, wo eine zu entfernende Datenbanktabelle ausgewählt werden kann. @@ -2341,7 +3610,7 @@ Tabelle ändern... - + Open the Modify Table wizard, where it is possible to rename an existing table. It is also possible to add or delete fields form a table, as well as modify field names and types. Den Assistenten zum Ändern einer Tabelle öffnen, wo eine existierende Tabelle umbenannt werden kann. Ebenso können Felder hinzugefügt und gelöscht sowie Feldnamen und -typen geändert werden. @@ -2350,28 +3619,28 @@ Index erstellen... - + Open the Create Index wizard, where it is possible to define a new index on an existing database table. Den Assistenten zum Erstellen des Index öffnen, wo ein neuer Index für eine existierende Datenbanktabelle gewählt werden kann. - + &Preferences... &Einstellungen... - - + + Open the preferences window. Das Einstellungsfenster öffnen. - + &DB Toolbar &DB Toolbar - + Shows or hides the Database toolbar. Zeigt oder versteckt die Datenbank-Toolbar. @@ -2380,28 +3649,27 @@ Funktionen erläutern - + Shift+F1 Shift+F1 - &About... &Über... - + &Recently opened &Kürzlich geöffnet - + Open &tab &Tab öffnen - - + + Ctrl+T Strg+T @@ -2411,130 +3679,168 @@ Datenbankstruktur - + Browse Data Daten durchsuchen - + Edit Pragmas Pragmas bearbeiten - + + <html><head/><body><p><a href="https://www.sqlite.org/pragma.html#pragma_case_sensitive_like">Case Sensitive Like</a></p></body></html> + <html><head/><body><p><a href="https://www.sqlite.org/pragma.html#pragma_case_sensitive_like">Case Sensitive Like</a></p></body></html> + + + + Warning: this pragma is not readable and this value has been inferred. Writing the pragma might overwrite a redefined LIKE provided by an SQLite extension. + Warnung: dieses Pragma ist nicht lesbar und dieser Wert wurde abgeleitet. Das Schreiben des Pragmas überschreibt möglicherweise ein geändertes LIKE, welches von einer SQLite-Erweiterung zur Verfügung gestellt wird. + + + Execute SQL SQL ausführen - + + &Tools + &Werkzeuge + + + DB Toolbar DB Toolbar Edit Database Cell - Datenbankzelle bearbeiten + Datenbankzelle bearbeiten - + SQL &Log SQL-&Log - + Show S&QL submitted by Anzeige des übergebenen S&QL von - + &Plot &Diagramm - + + + Project Toolbar + Projekt-Werkzeugleiste + + + + Extra DB toolbar + Extra-DB-Werkzeugleiste + + + + + + Close the current database file + Die aktuelle Datenbankdatei schließen + + + &Revert Changes Änderungen &rückgängig machen - + &Write Changes Änderungen &schreiben - Compact &Database &Datenbank komprimieren - + &Database from SQL file... &Datenbank aus SQL-Datei... - + &Table from CSV file... &Tabelle aus CSV-Datei... - + &Database to SQL file... &Datenbank zu SQL-Datei... - + &Table(s) as CSV file... &Tabelle(n) als CSV-Datei... - + &Create Table... Tabelle &erstellen... - + &Delete Table... Tabelle &löschen... - + &Modify Table... Tabelle &ändern... - + Create &Index... &Index erstellen... - + W&hat's This? &Was ist das? - + + &About + &Über + + + + This button opens a new tab for the SQL editor + Dieser Button öffnet einen neuen Tab im SQL-Editor + + + &Execute SQL SQL &ausführen - Execute SQL [F5, Ctrl+Return] - SQL ausführen [F5, Strg+Return] + Execute SQL + SQL ausführen - &Load extension Erweiterung &laden - &Wiki... &Wiki... - Bug &report... Fehler &melden... - Web&site... Web&site... @@ -2543,8 +3849,8 @@ Projekt speichern - - + + Save the current session to a file Aktuelle Sitzung in einer Datei speichern @@ -2553,24 +3859,24 @@ Projekt öffnen - - + + Load a working session from a file Sitzung aus einer Datei laden - + Open SQL file SQL-Datei öffnen <html><head/><body><p>Save current plot...</p><p>File format chosen by extension (png, jpg, pdf, bmp)</p></body></html> - <html><head/><body><p>Aktuelles Diagramm speichern...</p><p>Dateiformat durch Endung auswählen (png, jpg, pdf, bmp)</p></body></html> + <html><head/><body><p>Aktuelles Diagramm speichern...</p><p>Dateiformat durch Endung auswählen (png, jpg, pdf, bmp)</p></body></html> - - - + + + Save SQL file SQL-Datei speichern @@ -2579,137 +3885,134 @@ Erweiterung laden - + Execute current line Aktuelle Zeile ausführen - Execute current line [Ctrl+E] - Aktuelle Zeile ausführen [Strg+E] + Execute current line + Aktuelle Zeile ausführen - + Ctrl+E Strg+E - + Export as CSV file Als CSV-Datei exportieren - + Export table as comma separated values file Tabelle als kommaseparierte Wertedatei exportieren - + Ctrl+L Strg+L - + Ctrl+P Strg+P - + Database encoding Datenbank-Kodierung - - + + Choose a database file Eine Datenbankdatei auswählen - + Ctrl+Return Strg+Return - + Ctrl+D Strg+D - + Ctrl+I Strg+I - + Encrypted Verschlüsselt - + Database is encrypted using SQLCipher Datenbank ist mittels SQLCipher verschlüsselt - + Read only Nur lesen - + Database file is read only. Editing the database is disabled. Zugriff auf Datenbank nur lesend. Bearbeiten der Datenbank ist deaktiviert. - + Could not open database file. Reason: %1 Datenbankdatei konnte nicht geöffnet werden. Grund: %1 - - - + + + Choose a filename to save under Dateinamen zum Speichern auswählen - Error adding record: Fehler beim Hinzufügen der Zeile: - + Error deleting record: %1 Fehler beim Löschen der Zeile: %1 - + Please select a record first Bitte zuerst eine Zeile auswählen - + %1 - %2 of %3 %1 - %2 von %3 - - + + There is no database opened. Please open or create a new database file. Es ist keine Datenbank geöffnet. Bitte eine Datenbank-Datei öffnen oder eine neue erstellen. - Are you sure you want to delete the %1 '%2'? All data associated with the %1 will be lost. Sollen %1 '%2' wirklich gelöscht werden? Alle mit %1 verbundenen Daten gehen verloren. - Error: could not delete the %1. Message from database engine: %2 Fehler: %1 konnte nicht gelöscht werden. Meldung der Datenbank: @@ -2717,25 +4020,23 @@ There is no database opened. - Keine Datenbank geöffnet. + Keine Datenbank geöffnet. - %1 rows returned in %2ms from: %3 %1 Reihen innerhalb von %2ms zurückgegeben von: %3 - + , %1 rows affected , %1 Zeilen betroffen - Query executed successfully: %1 (took %2ms%3) Query erfolgreich ausgeführt: %1 (innerhalb von %2ms%3) - + Error while saving the database file. This means that not all changes to the database were saved. You need to resolve the following error first. %1 @@ -2744,39 +4045,49 @@ %1 - + A new DB Browser for SQLite version is available (%1.%2.%3).<br/><br/>Please download at <a href='%4'>%4</a>. Eine neue Version des DB Browsers für SQLite ist verfügbar (%1.%2.%3).<br/><br/>Bitte laden Sie diese von <a href='%4'>%4</a> herunter. Please enter the URL of the database file to save. - Bitte die URL der zu speichernden Datenbankdatei eingeben. + Bitte die URL der zu speichernden Datenbankdatei eingeben. - - + + DB Browser for SQLite project file (*.sqbpro) DB Browser für SQLite Projektdatei (*.sqbpro) - + Please choose a new encoding for this table. Bitte wählen Sie eine neue Kodierung für diese Tabelle. - + Please choose a new encoding for all tables. Bitte wählen Sie eine neue Kodierung für alle Tabellen. - + + Error checking foreign keys after table modification. The changes will be reverted. + Fehler beim Prüfen von Fremdschlüsseln nach der Änderung an der Tabelle. Die Änderungen werden rückgängig gemacht. + + + + This table did not pass a foreign-key check.<br/>You should run 'Tools | Foreign-Key Check' and fix the reported issues. + Diese Tabelle hat die Fremdschlüsselprüfung nicht bestanden.<br/>Sie sollten 'Werkzeuge | Fremdschlüssel-Prüfng' ausführen und die gemeldeten Probleme beheben. + + + %1 Leave the field empty for using the database encoding. %1 Lassen Sie das Feld leer, um die Datenbankodierung zu verwenden. - + This encoding is either not valid or not supported. Diese Kodierung ist entweder nicht gültig oder nicht unterstützt. @@ -2789,7 +4100,6 @@ %1 Reihen zurückgegeben von: %2 (in %3ms) - Error executing query: %1 Fehler beim Ausführen der Anfrage: %1 @@ -2799,20 +4109,19 @@ Choose a text file - Textdatei auswählen + Textdatei auswählen - + Text files(*.csv *.txt);;All files(*) Textdateien(*.csv *.txt);;Alle Dateien(*) - Import completed Import vollständig - + Are you sure you want to undo all changes made to the database file '%1' since the last save? Sollen wirklich alle Änderungen an der Datenbankdatei '%1' seit dem letzten Speichern rückgängig gemacht werden? @@ -2833,186 +4142,383 @@ Export abgeschlossen. - + Choose a file to import Datei für Import auswählen - - - - Text files(*.sql *.txt);;All files(*) - Textdateien(*.sql *.txt);;Alle Dateien(*) + + + + Text files(*.sql *.txt);;All files(*) + Textdateien(*.sql *.txt);;Alle Dateien(*) + + + + Do you want to create a new database file to hold the imported data? +If you answer no we will attempt to import the data in the SQL file to the current database. + Soll für die importierten Daten eine neue Datenbank erstellt werden? +Bei der Antwort NEIN werden die Daten in die SQL-Datei der aktuellen Datenbank importiert. + + + + File %1 already exists. Please choose a different name. + Datei %1 existiert bereits. Bitte einen anderen Namen auswählen. + + + + Error importing data: %1 + Fehler beim Datenimport: %1 + + + + Import completed. + Import abgeschlossen. + + + + Delete View + Ansicht löschen + + + + Delete Trigger + Trigger löschen + + + + Delete Index + Index löschen + + + + + Delete Table + Tabelle löschen + + + + &%1 %2 + &%1 %2 + + + + Setting PRAGMA values will commit your current transaction. +Are you sure? + Das Setzen von PRAGMA-Werten übermittelt den aktuellen Vorgang. +Sind Sie sicher? + + + + Execution aborted by user + Ausführung durch Benutzer abgebrochen + + + + In-Memory database + In-Memory-Datenbank + + + + determining row count... + bestimmte Zeilenanzahl... + + + + %1 - %2 of >= %3 + %1 - %2 von >= %3 + + + + Are you sure you want to delete the table '%1'? +All data associated with the table will be lost. + Möchten Sie die Tabelle '%1' wirklich löschen? +Alle mit dieser Tabelle verbundenen Daten gehen verloren. + + + + Are you sure you want to delete the view '%1'? + Möchten Sie die Ansicht '%1' wirklich löschen? + + + + Are you sure you want to delete the trigger '%1'? + Möchten Sie den Trigger '%1' wirklich löschen? + + + + Are you sure you want to delete the index '%1'? + Möchten Sie den Index '%1' wirklich löschen? + + + + Error: could not delete the table. + Fehler: Tabelle konnte nicht gelöscht werden. + + + + Error: could not delete the view. + Fehler: Ansicht konnte nicht gelöscht werden. - - Do you want to create a new database file to hold the imported data? -If you answer no we will attempt to import the data in the SQL file to the current database. - Soll für die importierten Daten eine neue Datenbank erstellt werden? -Bei der Antwort NEIN werden die Daten in die SQL-Datei der aktuellen Datenbank importiert. + + Error: could not delete the trigger. + Fehler: Trigger konnte nicht gelöscht werden. - - File %1 already exists. Please choose a different name. - Datei %1 existiert bereits. Bitte einen anderen Namen auswählen. + + Error: could not delete the index. + Fehler: Index konnte nicht gelöscht werden. - - Error importing data: %1 - Fehler beim Datenimport: %1 + + Message from database engine: +%1 + Nachricht von Datenbank-Engine: +%1 - - Import completed. - Import abgeschlossen. + + Editing the table requires to save all pending changes now. +Are you sure you want to save the database? + Das Bearbeiten der Tabelle setzt das Speichern aller ausstehenden Änderungen voraus. +Möchten Sie die Datenbank wirklich speichern? - - - Delete View - Ansicht löschen + + -- EXECUTING SELECTION IN '%1' +-- + -- FÜHRE AUSWAHL IN '%1' AUS +-- - - - Delete Trigger - Trigger löschen + + -- EXECUTING LINE IN '%1' +-- + -- FÜHRE ZEILE IN '%1' AUS +-- - - - Delete Index - Index löschen + + -- EXECUTING ALL IN '%1' +-- + -- FÜHRE ALLES IN '%1' AUS +-- - - - - Delete Table - Tabelle löschen + + Setting PRAGMA values or vacuuming will commit your current transaction. +Are you sure? + Das Setzen von PRAGMA-Werten oder des Vakuumings wird Ihre aktuelle Transaktion committen. +Sind Sie sich sicher? - - &%1 %2 - &%1 %2 + + executing query + führe Query aus - - Setting PRAGMA values will commit your current transaction. -Are you sure? - Das Setzen von PRAGMA-Werten übermittelt den aktuellen Vorgang. -Sind Sie sicher? + + %1 rows returned in %2ms + %1 Zeilen in %2ms zurückgegeben - - Execution aborted by user - Ausführung durch Benutzer abgebrochen + + query executed successfully. Took %1ms%2 + Query erfolgreich ausgeführt. Benötigte %1ms%2 - - Setting PRAGMA values or vacuuming will commit your current transaction. -Are you sure? - + + -- At line %1: +%4 +-- Result: %3 + -- In Zeile %1: +%4 +-- Ergebnis: %3 - + Choose text files Textdateien auswählen - - + + Import completed. Some foreign key constraints are violated. Please fix them before saving. + Import vollständig. Ein paar Fremdschlüssel wurden verletzt. Bitten beheben Sie diese vor dem Speichern. + + + Modify View Ansicht verändern - - + Modify Trigger Trigger verändern - - + Modify Index Index verändern - - + Modify Table Tabelle verändern - + Select SQL file to open SQL-Datei zum Öffnen auswählen - + Couldn't read file: %1. Datei konnte nicht gelesen werden: %1. - + Couldn't save file: %1. Datei konnte nicht gespeichert werden: %1. - + Select file name Dateinamen auswählen - + Select extension file Erweiterungsdatei auswählen - + Extensions(*.so *.dll);;All files(*) Erweiterungen(*.so *.dll);;Alle Dateien(*) - + Extension successfully loaded. Erweiterung erfolgreich geladen. - - + Error loading extension: %1 Fehler beim Laden der Erweiterung: %1 - + + Don't show again Nicht wieder anzeigen - + New version available. Neue Version verfügbar. - + + Choose a project file to open + Wählen Sie die zu öffnende Projektdatei + + + + This project file is using an old file format because it was created using DB Browser for SQLite version 3.10 or lower. Loading this file format is still fully supported but we advice you to convert all your project files to the new file format because support for older formats might be dropped at some point in the future. You can convert your files by simply opening and re-saving them. + Diese Projektdatei verwendet ein altes Dateiformat, da es mit DB-Browser für SQLite Version 3.10 oder niedriger erstellt wurde. Das Laden dieses Dateiformats wird noch vollständig unterstützt, wird empfehlen Ihnen allerdings, alle Ihre Projektdateien in das neue Dateiformat zu überführen, da die Unterstützung für ältere Formate in Zukunft möglicherweise entfernt wird. Sie können Ihre Dateien einfach durch Öffnen und Neuspeichern umwandeln. + + + + Duplicate records + Doppelte Einträge + + + + Ctrl+" + Strg+" + + + Please enter a pseudo-primary key in order to enable editing on this view. This should be the name of a unique column in the view. Bitte einen Pseudo-Primärschlüssel eingeben, um die Bearbeitung dieser Ansicht zu ermöglichen. Dies sollte der Name der eindeutigen Spalte dieser Ansicht sein. + + Collation needed! Proceed? + Kollation notwendig! Fortführen? + + + + A table in this database requires a special collation function '%1' that this application can't provide without further knowledge. +If you choose to proceed, be aware bad things can happen to your database. +Create a backup! + Eine Tabelle in dieser Datenbank benötigt eine spezielle Kollationsfunktion '%1', welche diese Anwendung ohne weiterem Wissen nicht zur Verfügung stellen kann. +Wenn Sie fortfahren, sollten Sie im Hinterkopf behalten, dass mit Ihrer Datenbank unerwartete Dinge geschehen können. +Erstellen Sie ein Backup! + + + + creating collation + erstelle Kollation + + + + Set a new name for the SQL tab. Use the '&&' character to allow using the following character as a keyboard shortcut. + Vergeben Sie einen Namen für den SQL-Tab. Verwenden Sie das '&&'-Zeichen, um das folgende Zeichen als Tastaturkürzel zu verwenden. + + + + Please specify the view name + Geben Sie bitte einen Namen für Ansicht an + + + + There is already an object with that name. Please choose a different name. + Es gibt bereits ein Objekt mit diesem Namen. Bitte wählen Sie einen anderen aus. + + + + View successfully created. + Ansicht erfolgreich erstellt. + + + + Error creating view: %1 + Fehler beim Erstellen der Ansicht: %1 + + + + There is no filter set for this table. View will not be created. + Es gibt kein Filterset für diese Tabelle. Die Ansicht wird nicht erstellt. + + + + Delete Records + Einträge löschen + + + + This action will open a new SQL tab for running: + Diese Aktion öffnet einen neuen SQL-Tab zur Ausführung: + + + + Press Help for opening the corresponding SQLite reference page. + Drücken Sie auf 'Hilfe', um die entsprechende SQLite-Referenzseite zu öffnen. + + A new sqlitebrowser version is available (%1.%2.%3).<br/><br/>Please download at <a href='%4'>%4</a>. Eine neue sqlitebrowser-Version ist verfügbar (%1.%2.%3).<br/><br/>Bitte von <a href='%4'>%4</a> herunterladen. Choose a axis color - Achsenfarbe auswählen + Achsenfarbe auswählen PNG(*.png);;JPG(*.jpg);;PDF(*.pdf);;BMP(*.bmp);;All Files(*) - PNG(*.png);;JPG(*.jpg);;PDF(*.pdf);;BMP(*.bmp);;Alle Dateien(*) + PNG(*.png);;JPG(*.jpg);;PDF(*.pdf);;BMP(*.bmp);;Alle Dateien(*) - Choose a file to open Datei zum Öffnen auswählen @@ -3022,7 +4528,20 @@ Invalid file format. - Ungültiges Dateiformat. + Ungültiges Dateiformat. + + + + NullLineEdit + + + Set to NULL + Auf NULL setzen + + + + Alt+Del + Alt+Entf @@ -3033,180 +4552,276 @@ Diagramm - + + <html><head/><body><p>This pane shows the list of columns of the currently browsed table or the just executed query. You can select the columns that you want to be used as X or Y axis for the plot pane below. The table shows detected axis type that will affect the resulting plot. For the Y axis you can only select numeric columns, but for the X axis you will be able to select:</p><ul style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;"><li style=" margin-top:12px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Date/Time</span>: strings with format &quot;yyyy-MM-dd hh:mm:ss&quot; or &quot;yyyy-MM-ddThh:mm:ss&quot;</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Date</span>: strings with format &quot;yyyy-MM-dd&quot;</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Time</span>: strings with format &quot;hh:mm:ss&quot;</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Label</span>: other string formats. Selecting this column as X axis will produce a Bars plot with the column values as labels for the bars</li><li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Numeric</span>: integer or real values</li></ul><p>Double-clicking the Y cells you can change the used color for that graph.</p></body></html> + <html><head/><body><p>Dieses Pane zeigt die Liste der Spalten der aktuell ausgewählten Tabelle oder des soeben ausgeführtne Queries. Sie können die für die X- und Y-Achse gewünschten Spalten für das Plot-Pane unten auswählen. Die Tabelle zeigt den erkannten Axentyp, der den entstehenden Plot beeinflusst. Für die Y-Achse sind nur numerische Spalten zulässig, während Sie für die X-Achse aus folgenden Optionen auswählen können:</p><ul style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;"><li style=" margin-top:12px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Datum/Zeit</span>: Strings im Format &quot;yyyy-MM-dd hh:mm:ss&quot; or &quot;yyyy-MM-ddThh:mm:ss&quot;</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Datum</span>: Strings im Format &quot;yyyy-MM-dd&quot;</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Zeit</span>: Strings im Format &quot;hh:mm:ss&quot;</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Beschriftung</span>: andere Stringformate. Die Auswahl dieser Spalte als X-Achse erzeugt einen Barplot mit den Spaltenwerten als Beschriftungen der Bars.</li><li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Numerisch</span>: Integer- oder Real-Werte</li></ul><p>Ein Doppelklick auf die Y-Zellen ermöglicht Ihnen das Ändern der für den Graph verwendeten Farbe.</p></body></html> + + + Columns Spalten - + X X - + Y Y - _ _ - + + Axis Type + Achsentyp + + + + Here is a plot drawn when you select the x and y values above. + +Click on points to select them in the plot and in the table. Ctrl+Click for selecting a range of points. + +Use mouse-wheel for zooming and mouse drag for changing the axis range. + +Select the axes or axes labels to drag and zoom only in that orientation. + Hier wird ein Plot angezeigt, wenn Sie oben die x- und y-Werte auswählen. + +Klicken Sie auf Punkte, um diese im Plot und in der Tabelle auszuwählen. Strg+Klick zur Auswahl eines Punktebereichs. + +Verwenden Sie das Mausrad zum Zoomen und Ziehen Sie mit der Maus, um den Achsenbereich zu ändern. + +Wählen Sie die Achsen oder Achsenbeschriftungen aus, um nur in diese Richtung zu zoomen oder zu verschieben. + + + Line type: Linientyp: - - + + None Keine - + Line Linie - + StepLeft Linksschritt - + StepRight Rechtsschritt - + StepCenter Mittelschritt - + Impulse Impuls - + Point shape: Punktform: - + Cross Kreuz - + Plus Plus - + Circle Kreis - + Disc Scheibe - + Square Quadrat - + Diamond Diamant - + Star Stern - + Triangle Dreieck - + TriangleInverted Invertiertes Dreieck - + CrossSquare Quadrat mit Kreuz - + PlusSquare Quadrat mit Plus - + CrossCircle Kreis mit Kreuz - + PlusCircle Kreis mit Plus - + Peace Peace - + <html><head/><body><p>Save current plot...</p><p>File format chosen by extension (png, jpg, pdf, bmp)</p></body></html> <html><head/><body><p>Aktuelles Diagramm speichern...</p><p>Dateiformat durch Endung auswählen (png, jpg, pdf, bmp)</p></body></html> - + Save current plot... Aktuelles Diagramm speichern... - + + + Load all data and redraw plot + Alle Daten laden und Plot neu zeichnen + + Load all data. This has only an effect if not all data has been fetched from the table yet due to the partial fetch mechanism. Alle Daten laden. Dies bringt nur etwas, wenn aufgrund des partiellen Abrufmechanismus noch nicht alle Daten der Tabelle abgerufen wurden. - - - + + + Row # Zeile # - Choose a axis color Achsenfarbe auswählen - + + Copy + Kopieren + + + + Print... + Drucken... + + + + Show legend + Legende anzeigen + + + + Stacked bars + Gestapelte Bars + + + + Date/Time + Datum/Zeit + + + + Date + Datum + + + + Time + Zeit + + + + + Numeric + Numerisch + + + + Label + Beschriftung + + + + Invalid + Ungültig + + + + Load all data and redraw plot. +Warning: not all data has been fetched from the table yet due to the partial fetch mechanism. + Alle Daten laden und Plot neu zeichnen. +Warnung: es wurden aufgrund der partiellen Abrufmechanismus noch nicht alle Daten aus der Tabelle abgerufen. + + + + Choose an axis color + Eine Achsenfarbe wählen + + + Choose a filename to save under Dateinamen zum Speichern auswählen - + PNG(*.png);;JPG(*.jpg);;PDF(*.pdf);;BMP(*.bmp);;All Files(*) PNG(*.png);;JPG(*.jpg);;PDF(*.pdf);;BMP(*.bmp);;Alle Dateien(*) - + + There are curves in this plot and the selected line style can only be applied to graphs sorted by X. Either sort the table or query by X to remove curves or select one of the styles supported by curves: None or Line. + Dieser Plot enthält Kurven und der ausgewählte Linienstil kann nur auf nach X sortierte Graphen angewendet werden. Sortieren Sie entweder die Tabelle oder Query nach X oder entfernen Sie die Kurven oder wählen Sie eine der Stile, die von Kurven unterstützt werden: Keiner oder Linie. + + Fetching all data... Alle Daten werden abgerufen... - Cancel Abbrechen @@ -3244,42 +4859,44 @@ &Sprache - + Show remote options Fernzugriffs-Optionen anzeigen - + Automatic &updates Automatische &Updates - + &Database &Datenbank - + Database &encoding Datenbank-&Kodierung - + Open databases with foreign keys enabled. Öffnen von Datenbanken mit Fremdschlüsseln aktiviert. - + &Foreign keys &Fremdschlüssel - - - - - - + + + + + + + + enabled aktiviert @@ -3290,8 +4907,8 @@ - - + + ... ... @@ -3300,394 +4917,565 @@ &Prefetch Blockgröße - + Remove line breaks in schema &view Zeilenumbrüche in der Schema&ansicht entfernen - + Prefetch block si&ze Block&größe für Prefetch - + Advanced Erweitert SQL to execute after opening database - Nach dem Öffnen einer Datenbank auszuführendes SQL + Nach dem Öffnen einer Datenbank auszuführendes SQL - + SQ&L to execute after opening database Nach dem Öffnen einer Datenbank auszuführendes SQ&L - + Default field type Voreingestellter Feldtyp - + Data &Browser Daten&auswahl - + Font Schrift - + &Font Schri&ft - Font si&ze: Schrift&größe: - + Content Inhalt - + Symbol limit in cell Symbolbegrenzung in Zelle - NULL fields NULL-Felder - &Text &Text - Field colors Feldfarben - + NULL NULL - + Regular Normal - Text Text - + Binary Binär - + Background Hintergrund - + Filters Filter - + Escape character Escape-Zeichen - + Delay time (&ms) Verzögerung (&ms) - + Set the waiting time before a new filter value is applied. Can be set to 0 for disabling waiting. Verzögerung vor der Anwendung eines neuen Filters setzen. Kann auf 0 gesetzt werden, um dies zu deaktivieren. - + &SQL &SQL - + Settings name Einstellungsname - + Context Kontext - + Colour Farbe - + Bold Fett - - Italic - Kursiv + + Italic + Kursiv + + + + Underline + Unterstreichung + + + + Keyword + Schlüsselwort + + + function + Funktion + + + + Function + Funktion + + + + Table + Tabelle + + + + Comment + Kommentar + + + + Identifier + Bezeichner + + + + String + String + + + currentline + Aktuelle Zeile + + + + Current line + Aktuelle Zeile + + + + SQL &editor font size + SQL-&Editor Schriftgröße + + + SQL &log font size + SQL-&Log Schriftgröße + + + + Tab size + Tab-Größe + + + + SQL editor &font + SQL Editor &Schrift + + + + Error indicators + Fehleranzeige + + + Enabling error indicators highlights the SQL code lines that caused errors during the last execution + Durch Aktivieren der Fehleranzeige werden SQL-Codezeilen hervorgehoben, die während der letzten Ausführung Fehler verursacht haben + + + + Hori&zontal tiling + Hori&zontale Anordnung + + + + If enabled the SQL code editor and the result table view are shown side by side instead of one over the other. + Im aktivierten Zustand werden der SQL-Codeeditor und die Ergebnistabelle neben- statt untereinander angezeigt. + + + + Code co&mpletion + &Codevervollständung + + + + Toolbar style + Werkzeugleisten-Stil + + + + Only display the icon + Nur das Symbol anzeigen + + + + Only display the text + Nur den Text anzeigen + + + + The text appears beside the icon + Der Text erscheint neben dem Symbol + + + + The text appears under the icon + Der Text erscheint unter dem Symbol + + + + Follow the style + Dem Stil folgen + + + + DB file extensions + DB-Datei-Erweiterungen + + + + Manage + Verwalten + + + + When enabled, the line breaks in the Schema column of the DB Structure tab, dock and printed output are removed. + Falls aktiviert, werden die Zeilenumbrüche in der Schemaspalte des DB-Strukturtabs, Docks und der gedruckten Ausgabe entfernt. + + + + Font si&ze + Schrift&größe + + + + + This is the maximum number of rows in a table for enabling the value completion based on current values in the column. +Can be set to 0 for disabling completion. + Dies ist die maximale Anzahl an Zeilen in einer Tabelle, die zur Wertvervollständigung basierend auf aktuellen Werten in dieser Spalte erlaubt ist. +Kann auf 0 gesetzt werden, um die Vervollständigung zu deaktivieren. + + + + Row count threshold for completion + Zeilenanzahl-Grenzwert für Vervollständigung + + + + Field display + Feldanzeige - - Underline - Unterstreichung + + Displayed &text + Angezeigter &Text - - Keyword - Schlüsselwort + + Text color + Textfarbe - - function - Funktion + + Background color + Hintergrundfarbe - - Function - Funktion + + Preview only (N/A) + Nur Vorschau (N/A) - - Table - Tabelle + + Foreground + Vordergrund - - Comment - Kommentar + + SQL &results font size + Schriftgröße SQL-&Ergebnisse - - Identifier - Bezeichner + + &Wrap lines + Zeilen &umbrechen - - String - String + + Never + Nie - - currentline - Aktuelle Zeile + + At word boundaries + An Wortgrenzen - - Current line - Aktuelle Zeile + + At character boundaries + An Zeichengrenzen - - SQL &editor font size - SQL-&Editor Schriftgröße + + At whitespace boundaries + An Leerzeichengrenzen - - SQL &log font size - SQL-&Log Schriftgröße + + &Quotes for identifiers + &Anführungszeichen für Identifiers - - Tab size - Tab-Größe + + Choose the quoting mechanism used by the application for identifiers in SQL code. + Wählen Sie den Zitiermechanismus aus, der von der Anwendung für Identifier im SQL-Code verwendet wird. - - SQL editor &font - SQL Editor &Schrift + + "Double quotes" - Standard SQL (recommended) + "Doppelt Anführungszeichen" - Standard-SQL (empfohlen) - - Error indicators - Fehleranzeige + + `Grave accents` - Traditional MySQL quotes + `Akzente` - Traditionelle MySQL-Anführungszeichen - - Enabling error indicators highlights the SQL code lines that caused errors during the last execution - Durch Aktivieren der Fehleranzeige werden SQL-Codezeilen hervorgehoben, die während der letzten Ausführung Fehler verursacht haben + + [Square brackets] - Traditional MS SQL Server quotes + [Eckige Klammern] - Traditionelle MS-SQL-Server-Anführungszeichen - - Hori&zontal tiling - Hori&zontale Anordnung + + Keywords in &UPPER CASE + Schlüsselwörter in &GROSSSCHREIBUNG - - If enabled the SQL code editor and the result table view are shown side by side instead of one over the other. - Im aktivierten Zustand werden der SQL-Codeeditor und die Ergebnistabelle neben- statt untereinander angezeigt. + + When set, the SQL keywords are completed in UPPER CASE letters. + Falls gesetzt, werden die SQL-Schlüsselwörter in GROßSCHREIBUNG vervollständigt. - - Code co&mpletion - &Codevervollständung + + When set, the SQL code lines that caused errors during the last execution are highlighted and the results frame indicates the error in the background + Falls gesetzt, werden die SQL-Codezeilen, die während der letzten Ausführung Fehler verursacht haben, hervorgehoben und das Ergebnisfenster zeigt den Fehler im Hintergrund na - + &Extensions &Erweiterungen - + Select extensions to load for every database: Bei jeder Datenbank zu ladende Erweiterungen auswählen: - + Add extension Erweiterung hinzufügen - + Remove extension Erweiterung entfernen - + <html><head/><body><p>While supporting the REGEXP operator SQLite doesn't implement any regular expression<br/>algorithm but calls back the running application. DB Browser for SQLite implements this<br/>algorithm for you to let you use REGEXP out of the box. However, as there are multiple possible<br/>implementations of this and you might want to use another one, you're free to disable the<br/>application's implementation and load your own by using an extension. Requires restart of the application.</p></body></html> <html><head/><body><p>Auch wenn der REGEXP-Operator unterstützt wird, implementiert SQLite keinerlei Algorithmus für reguläre<br/>Ausdrücke, sondern leitet diese an die laufende Anwendung weiter. DB Browser für SQLite implementierte diesen<br/>Algorithmus für Sie, um REGEXP ohne Zusätze verwenden zu können. Allerdings gibt es viele mögliche<br/>Implementierungen und Sie möchten unter Umständen eine andere wählen, dann können Sie die<br/>Implementierung der Anwendung deaktivieren und Ihre eigene durch Laden einer Erweiterung verwenden. Ein Neustart der Anwendung ist notwendig.</p></body></html> - + Disable Regular Expression extension Erweiterung für reguläre Ausdrücke deaktivieren - + + <html><head/><body><p>SQLite provides an SQL function for loading extensions from a shared library file. Activate this if you want to use the <span style=" font-style:italic;">load_extension()</span> function from SQL code.</p><p>For security reasons, extension loading is turned off by default and must be enabled through this setting. You can always load extensions through the GUI, even though this option is disabled.</p></body></html> + <html><head/><body><p>SQLite bietet eine SQL-Funktion an, um Erweiterungen aus einer Shared-Library-Datei zu laden. Aktivieren Sie dies, falls Sie die <span style=" font-style:italic;">load_extension()</span>-Funktion aus SQL-Code heraus benutzen möchten.</p><p>Aus Sicherheitsgründen ist das Laden von Erweiterungen standardmäßig deaktiviert und muss durch diese Einstellung aktiviert werden. Sie können alternativ immer die gewünschten Erweiterungen über die GUI laden, auch wenn diese Option deaktiviert ist.</p></body></html> + + + + Allow loading extensions from SQL code + Erlaube das Laden von Erweiterungen aus SQL-Code + + + Remote Entfernt - + CA certificates CA-Zertifikate - - + + Subject CN Subject CN - + Common Name Common Name - + Subject O Subject O - + Organization Organisation - - + + Valid from Gültig ab - - + + Valid to Gültig bis - - + + Serial number Seriennummer - + Your certificates Ihre Zertifikate - + File Datei - + Subject Common Name Subject Common Name - + Issuer CN CN des Ausstellers - + Issuer Common Name Common Name des Ausstellers - + Clone databases into Datenbank klonen nach - - + + Choose a directory Verzeichnis wählen - + The language will change after you restart the application. Die Sprache wird nach einem Neustart der Anwendung geändert. - + Select extension file Erweiterungsdatei wählen - + Extensions(*.so *.dll);;All files(*) Erweiterungen(*.so *.dll);;Alle Dateien(*) - + Import certificate file Zertifikatsdatei importieren - + No certificates found in this file. In dieser Datei wurden keine Zertifikate gefunden. - + Are you sure you want do remove this certificate? All certificate data will be deleted from the application settings! Soll dieses Zertifikat wirklich entfernt werden? Jegliche Zertifikatdaten werden aus den Anwendungseinstellungen gelöscht! + + + Are you sure you want to clear all the saved settings? +All your preferences will be lost and default values will be used. + Möchten Sie wirklich alle gespeicherten Einstellungen löschen? +Alle Ihre Einstellungen gehen dadurch verloren und die Standardwerte werden verwendet. + QObject @@ -3716,24 +5504,29 @@ Datenbank in SQL-Datei exportieren... - + Error importing data Fehler beim Datenimport - + from record number %1 von Zeilennummer %1 - + . %1 %1 - + + Importing CSV file... + Importiere CSV-Datei... + + + Cancel Abbrechen @@ -3812,7 +5605,6 @@ Typen konnten nicht bezogen werden - Decoding CSV file... CSV-Datei dekodieren... @@ -3833,12 +5625,10 @@ Datei nicht gefunden. - Collation needed! Proceed? Kollation notwendig! Fortführen? - A table in this database requires a special collation function '%1' that this application can't provide without further knowledge. If you choose to proceed, be aware bad things can happen to your database. Create a backup! @@ -3847,76 +5637,102 @@ Erstellen Sie ein Backup! - SQLite database files (*.db *.sqlite *.sqlite3 *.db3);;All files (*) SQLite Datenbankdateien (*.db *.sqlite *.sqlite3 *.db3);;Alle Dateien (*) + + + All files (*) + Alle Dateien (*) + + + + SQLite database files (*.db *.sqlite *.sqlite3 *.db3) + SQLite Datenbankdateien (*.db *.sqlite *.sqlite3 *.db3) + RemoteDatabase - + Error when connecting to %1. %2 Fehler beim Verbinden zu %1. %2 - + Error opening remote file at %1. %2 Fehler beim Öffnen der entfernten Datei unter %1. %2 - + Error: Invalid client certificate specified. Fehler: Ungültiges Benutzerzertifikat angegeben. - + Please enter the passphrase for this client certificate in order to authenticate. Bitte die Passphrase für diese Benutzerzertifikat eingeben, um die Authentifizierung durchzuführen. - + Cancel Abbrechen - + + Uploading remote database to +%1 + Entfernte Datenbank wird hochgeladen zu +%1 + + + + Downloading remote database from +%1 + Entfernte Datenbank wird heruntergeladen von +%1 + + + + The remote database has been updated since the last checkout. Do you want to update the local database to the newest version? Note that this discards any changes you have made locally! If you don't want to lose local changes, click No to open the local version. + Die entfernte Datenbank wurde seit dem letzten Checkout verändert. Möchten Sie die lokale Datenbank mit der neuesten Version aktualisieren? Beachten Sie, dass dies alle Ihre lokalen Änderungen verwirft! Falls Sie Ihre lokalen Änderungen nicht verlieren möchten, klicken Sie auf Nein, um die lokale Version zu öffnen. + + Uploading remote database to %1. Entfernte Datenbank wird hochgeladen zu %1. - Downloading remote database from %1. Entfernte Datenbank wird heruntergeladen von %1. - - + + Error: The network is not accessible. Fehler: Netzwerkzugriff nicht möglich. - + Error: Cannot open the file for sending. Fehler: Öffnen der Datei zum Senden nicht möglich. - + Error opening local databases list. %1 Fehler beim Öffnen der lokalen Datenbankliste. %1 - + Error creating local databases list. %1 Fehler beim Erstellen der lokalen Datenbankliste. @@ -3932,11 +5748,11 @@ B&rowse - &Durchsuchen + &Durchsuchen Local - Lokal + Lokal @@ -3945,13 +5761,23 @@ + Connect to the remote server using the currently selected identity. The correct server is taken from the identity as well. + Verbindung zum entfernten Server unter Verwendung der aktuell ausgewählten Identität. Der richtige Server wird ebenso von der Identität genommen. + + + Go Los - + Push currently opened database to server - + Aktuell geöffnete Datenbank an den Server schicken + + + + <html><head/><body><p>In this pane, remote databases from dbhub.io website can be added to DB4S. First you need an identity:</p><ol style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;"><li style=" margin-top:12px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Login to the dbhub.io website (use your GitHub credentials or whatever you want)</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Click the button to create a DB4S certificate (that's your identity). That'll give you a certificate file (save it to your local disk).</li><li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Go to the Remote tab in DB4S Preferences. Click the button to add a new certificate to DB4S and choose the just downloaded certificate file.</li></ol><p>Now the Remote panel shows your identity and you can add remote databases.</p></body></html> + <html><head/><body><p>In diesem Pane könnten entfernte Datenbanken von der dbhub.io-Webseite zu DB4S hinzugefügt werden. Zunächst benötigen Sie eine Identität:</p><ol style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;"><li style=" margin-top:12px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Melden Sie sich auf der dbhub.io-Webseite an (unter Verwendung Ihrer GitHub-Daten oder wie gewünscht)</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Klicken Sie auf den Button, um ein DB4S-Zertifikat zu erstellen (das ist Ihre Identität). Dies erzeugt Ihnen eine Zertifikatsdatei (speichern Sie dies auf ihrer lokalen Festplatte).</li><li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Öffnen Sie den Remote-Tab in den DB4S-Einstellungen. Klicken Sie auf den Button, um ein neues Zertifikat zu DB4S hinzuzufügen und wählen Sie die soeben heruntergeladene Zertifikatsdatei aus.</li></ol><p>Jetzt zeigt das Remote-Panel Ihre Identität und Sie können entfernte Datenbanken hinzufügen.</p></body></html> @@ -3963,7 +5789,7 @@ Version - Version + Version @@ -3991,51 +5817,70 @@ Push database - + Datenbank pushen Database na&me to push to - + Zu pushender Datenbankna&me - + Commit message - + Commit-Nachricht - + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Oxygen-Sans'; font-size:10pt; font-weight:400; font-style:normal;"> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p></body></html> - + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Oxygen-Sans'; font-size:10pt; font-weight:400; font-style:normal;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p></body></html> - + Database licence - + Datenbanklizenz - + Public - + Öffentlich + + + + Branch + Branch - + + Force push + Push erzwingen + + + Database will be public. Everyone has read access to it. - + Datenbank wird öffentlich sein. Jeder hat Lesezugriff darauf. - + Database will be private. Only you have access to it. - + Datenbank wird privat sein. Nur Sie haben Zugriff darauf. + + + + Use with care. This can cause remote commits to be deleted. + Verwenden Sie dies mit Vorsicht. Dadurch können entfernte Commits gelöscht werden. - + Unspecified - + Nicht festgelegt @@ -4046,47 +5891,122 @@ Formular - + + Find previous match [Shift+F3] + Vorherige Übereinstimmung finden [Umschalt+F3] + + + + Find previous match with mapping + Vorherige Übereinstimmung mit Mapping finden + + + + Shift+F3 + Umschalt+F3 + + + + The found pattern must be a whole word + Das Pattern muss ein ganzes Wort sein + + + + Whole Words + Ganze Wörter + + + + Text pattern to find considering the checks in this frame + Zu findendes Textpattern unter Einbeziehung der Prüfungen in diesem Fenster + + + + Find in editor + Im Editor finden + + + + The found pattern must match in letter case + Das Fundpattern muss in Groß-/Kleinschreibung übereinstimmen + + + + Case Sensitive + Schreibungsabhängig + + + + Find next match [Enter, F3] + Nächste Übereinstimmung finden [Enter, F3] + + + + Find next match with wrapping + Nächste Übereinstimmung mit Umbruch finden + + + + F3 + F3 + + + + Interpret search pattern as a regular expression + Suchpattern als regulären Ausdruck interpretieren + + + + <html><head/><body><p>When checked, the pattern to find is interpreted as a UNIX regular expression. See <a href="https://en.wikibooks.org/wiki/Regular_Expressions">Regular Expression in Wikibooks</a>.</p></body></html> + <html><head/><body><p>Falls aktiviert, wird das Suchmuster als regulärer Ausdruck (UNIX-Stil) interpretiert. Siehe <a href="https://en.wikibooks.org/wiki/Regular_Expressions">Regular Expression in Wikibooks (englisch)</a>.</p></body></html> + + + + Regular Expression + Regulärer Ausdruck + + + + + Close Find Bar + Suchbar schließen + + + + Results of the last executed statements Ergebnisse des zuletzt ausgeführten Statements - + This field shows the results and status codes of the last executed statements. Dieses Feld zeigt die Ergebnisse und Statuscodes der zuletzt ausgeführten Statements. - Export to &CSV Nach &CSV exportieren - Save as &view Ansicht &speichern - Save as view Ansicht speichern - Please specify the view name Namen für Ansicht angeben - There is already an object with that name. Please choose a different name. Es gibt bereits ein Objekt mit diesem Namen. Bitte einen anderen auswählen. - View successfully created. Ansicht erfolgreich erstellt. - Error creating view: %1 Fehler beim Erstellen der Ansicht: %1 @@ -4094,266 +6014,380 @@ SqlUiLexer - + (X) The abs(X) function returns the absolute value of the numeric argument X. (X) Die abs(X)-Funktion gibt einen absoluten Wert des numerischen Arguments X zurück. - + () The changes() function returns the number of database rows that were changed or inserted or deleted by the most recently completed INSERT, DELETE, or UPDATE statement. () Die changes()-Funktion gibt die Anzahl der Datenbankzeilen zurück, die mit dem zuletzt abgeschlossenen INSERT-, DELETE- oder UPDATE-Statement geändert, einfügt oder gelöscht worden sind. - + (X1,X2,...) The char(X1,X2,...,XN) function returns a string composed of characters having the unicode code point values of integers X1 through XN, respectively. (X1,X2,...) Die char(X1,X2,...,XN)-Funktion gibt eine Zeichenkette zurück, die aus den Zeichen der Unicode-Werte der Ganzzahlen X1 bis XN zusammengesetzt ist. - + (X,Y,...) The coalesce() function returns a copy of its first non-NULL argument, or NULL if all arguments are NULL (X,Y,...) Die coalesce()-Funktion gibt eine Kopie des ersten nicht-NULL-Arguments zurück, oder NULL wenn alle Argumente NULL sind - + (X,Y) The glob(X,Y) function is equivalent to the expression "Y GLOB X". (X,Y) Die glob(X,Y)-Funktion ist äquivalent zum Ausdruck "Y GLOB X". - + (X,Y) The ifnull() function returns a copy of its first non-NULL argument, or NULL if both arguments are NULL. (X,Y) Die ifnull()-Funktion gibt eine Kopie des ersten nicht-NULL-Arguments zurück, oder NULL, wenn beide Argumente NULL sind. - + (X,Y) The instr(X,Y) function finds the first occurrence of string Y within string X and returns the number of prior characters plus 1, or 0 if Y is nowhere found within X. (X,Y) Die instr(X,Y)-Funktion sucht das erste Auftreten von Zeichenkette Y innerhalb der Zeichenkette X und gibt die Anzahl vorhergehender Charakter plus 1 zurück, oder 0, wenn Y in X nicht gefunden werden konnte. - + (X) The hex() function interprets its argument as a BLOB and returns a string which is the upper-case hexadecimal rendering of the content of that blob. (X) Die hex()-Funktion interpretiert ihr Argument als BLOB und gibt eine Zeichenkette zurück, die die Hexadezimaldarstellung des Blob-Inhaltes in Großbuchstaben enthält. - + () The last_insert_rowid() function returns the ROWID of the last row insert from the database connection which invoked the function. () Die last_insert_rowid()-Funktion gibt die ROWID der letzte Zeile zurück, die von der diese Funktion aufrufenden Datenbankverbindung eingefügt wurde. - + (X) For a string value X, the length(X) function returns the number of characters (not bytes) in X prior to the first NUL character. (X) Für eine Zeichenkette X gibt die length(X)-Funktion die Anzahl der Zeichen (keine Bytes) von X zurück, die sich for dem ersten NUL-Zeichen befinden. - + (X,Y) The like() function is used to implement the "Y LIKE X" expression. (X,Y) Die like()-Funktion wird als Implementierung des "Y LIKE X"-Ausdrucks verwendet. - + (X,Y,Z) The like() function is used to implement the "Y LIKE X ESCAPE Z" expression. (X,Y,Z) Die like()-Funktion wird als Implementierung des "Y LIKE X ESCAPE Z"-Ausdrucks verwendet. - (X) The load_extension(X) function loads SQLite extensions out of the shared library file named X. (X) Die load_extension(X)-Funktion lädt SQLite-Erweiterungen aus der geteilten Bibliotheksdatei mit dem Namen X. - (X,Y) The load_extension(X) function loads SQLite extensions out of the shared library file named X using the entry point Y. (X,Y) Die load_extension(X)-Funktion lädt SQLite-Erweiterungen aus der geteilten Bibliotheksdatei mit dem Namen X unter Verwendung des Eintrittspunktes Y. - + + (X) The load_extension(X) function loads SQLite extensions out of the shared library file named X. +Use of this function must be authorized from Preferences. + (X) Die load_extension(X)-Funktion lädt SQLite-Erweiterungen aus der Shared-Library-Datei namens X. +Die Verwendung dieser Funktion muss in den Einstellungen authorisiert werden. + + + + (X,Y) The load_extension(X) function loads SQLite extensions out of the shared library file named X using the entry point Y. +Use of this function must be authorized from Preferences. + (X,Y) Die load_extension(X,Y)-Funktion lädt SQLite-Erweiterungen aus der Shared-Library-Datei namens X unter Verwendung des Eintrittspunktes Y. +Die Verwendung dieser Funktion muss in den Einstellungen authorisiert werden. + + + (X) The lower(X) function returns a copy of string X with all ASCII characters converted to lower case. (X) Die lower(X)-Funktion gibt eine Kopie der Zeichenkette X mit allen ASCII-Zeichen in Kleinschreibung zurück. - + (X) ltrim(X) removes spaces from the left side of X. (X) ltrim(X) entfernt Leerzeichen aus der linken Seite von X. - + (X,Y) The ltrim(X,Y) function returns a string formed by removing any and all characters that appear in Y from the left side of X. (X,Y) Die ltrim(X,Y)-Funktion gibt eine Zeichenkette zurück, die durch Entfernen aller Zeichen innerhalb von Y aus der linken Seite von X gebildet wird. - + (X,Y,...) The multi-argument max() function returns the argument with the maximum value, or return NULL if any argument is NULL. (X,Y,...) Die max()-Funktion mit mehreren Argumenten gibt das Argument mit dem größten Wert zurück, oder NULL, wenn ein Argument NULL ist. - + (X,Y,...) The multi-argument min() function returns the argument with the minimum value. (X,Y,...) Die max()-Funktion mit mehreren Argumenten gibt das Argument mit dem kleinsten Wert zurück. - + (X,Y) The nullif(X,Y) function returns its first argument if the arguments are different and NULL if the arguments are the same. (X,Y) Die nullif(X,Y)-FUnktion gibt ihr erstes Argument zurück, wenn die Argumente verschieden sind und NULL, wenn die Argumente gleich sind. - + (FORMAT,...) The printf(FORMAT,...) SQL function works like the sqlite3_mprintf() C-language function and the printf() function from the standard C library. (FORMAT,...) Die printf(FORMAT,...) SQL-Funktion arbeitet wie die sqlite3_mprintf() C-Funktion und die printf()-Funktion aus der C-Standardbibliothek. - + (X) The quote(X) function returns the text of an SQL literal which is the value of its argument suitable for inclusion into an SQL statement. (X) Die quote(X)-Funktion gibt den Text eines SQL-Literals zurück, wobei der Wert des Arguments zum Einfügen in ein SQL-Statement geeignet ist. - + () The random() function returns a pseudo-random integer between -9223372036854775808 and +9223372036854775807. () Die random()-Funktion gibt eine pseudo-zufällige Ganzzahl zwischen -9223372036854775808 und +9223372036854775807 zurück. - + (N) The randomblob(N) function return an N-byte blob containing pseudo-random bytes. (N) Die randomblob(N)-Funktion gibt einen N-Byte Blob aus pseudo-zufälligen Bytes zurück. - + (X,Y,Z) The replace(X,Y,Z) function returns a string formed by substituting string Z for every occurrence of string Y in string X. (X,Y,Z) Die replace(X,Y,Z)-Funktion gibt einen String zurück, der durch Ersetzen der Zeichenkette Z bei jedem Auftreten von Zeichenkette Y in Zeichenkette X gebildet wird. - + (X) The round(X) function returns a floating-point value X rounded to zero digits to the right of the decimal point. (X) Die round(X)-Funktion gibt einen Gleitkommawert X auf nulll Nachkommastellen gerundet zurück. - + (X,Y) The round(X,Y) function returns a floating-point value X rounded to Y digits to the right of the decimal point. (X,Y) Die round(X,Y)-Funktion gibt eine Gleitkommazahl X auf Y Nachkommastellen gerundet zurück. - + (X) rtrim(X) removes spaces from the right side of X. (X) rtrim(X) entfernt Leerzeichen aus der rechten Seite von X. - + (X,Y) The rtrim(X,Y) function returns a string formed by removing any and all characters that appear in Y from the right side of X. (X,Y) Die rtrim(X,Y)-Funktion gibt eine Zeichenkette zurück, die durch Entfernen aller Zeichen innerhalb von Y aus der rechten Seite von X gebildet wird. - + (X) The soundex(X) function returns a string that is the soundex encoding of the string X. (X) Die soundex(X)-Funktion gibt eine Zeichenkette zurück, die aus der Soundex-Kodierung von Zeichenkette X besteht. - + (X,Y) substr(X,Y) returns all characters through the end of the string X beginning with the Y-th. (X,Y) substr(X,Y) gibt alle Zeichen bis zum Ende der Zeichenkette X zurück, beginnend mit dem Y-ten. - + (X,Y,Z) The substr(X,Y,Z) function returns a substring of input string X that begins with the Y-th character and which is Z characters long. (X,Y,Z) Die substr(X,Y)-Funktion gibt einen Teil der Zeichenkette X zurück, die mit dem Y-ten Zeichen beginnt und Z Zeichen lang ist. - + () The total_changes() function returns the number of row changes caused by INSERT, UPDATE or DELETE statements since the current database connection was opened. () Die changes()-Funktion gibt die Anzahl dergeänderten Datenbankzeilen zurück, die seit dem Öffnen der aktuellen Datenbankverbindung mit INSERT-, DELETE- oder UPDATE-Statement geändert, einfügt oder gelöscht worden sind. - + (X) trim(X) removes spaces from both ends of X. (X) trim(X) entfernt Leerzeichen an beiden Enden von X. - + (X,Y) The trim(X,Y) function returns a string formed by removing any and all characters that appear in Y from both ends of X. (X,Y) Die ltrim(X,Y)-Funktion gibt eine Zeichenkette zurück, die durch Entfernen aller Zeichen innerhalb von Y aus der von beiden Seiten von X gebildet wird. - + (X) The typeof(X) function returns a string that indicates the datatype of the expression X. (X) Die typeof(X)-Funktion gibt einen String zurück, der den Datentyp des Ausdruckes X angibt. - + (X) The unicode(X) function returns the numeric unicode code point corresponding to the first character of the string X. (X) Die unicode(X)-Funktion gibt einen numerischen Unicode-Wert zurück, der dem ersten Zeichen der Zeichenkette X entspricht. - + (X) The upper(X) function returns a copy of input string X in which all lower-case ASCII characters are converted to their upper-case equivalent. (X) Die lower(X)-Funktion gibt eine Kopie der Zeichenkette X mit allen ASCII-Zeichen in Großschreibung zurück. - + (N) The zeroblob(N) function returns a BLOB consisting of N bytes of 0x00. (N) Die zeroblob(N)-Funktion gibt einen BLOB aus N Bytes mit 0x00 zurück. - - - - + + + + (timestring,modifier,modifier,...) (Zeitstring,Modifikation,Modifikation,...) - + (format,timestring,modifier,modifier,...) (Format,Zeitstring,Modifikation,Modifikation,...) - + (X) The avg() function returns the average value of all non-NULL X within a group. (X) Die avg()-Funktion gibt den Durchschnittswert alle nicht-NULL X in einer Gruppe zurück. - + (X) The count(X) function returns a count of the number of times that X is not NULL in a group. (X) Die count(X)-Funktion gibt die Anzahl der nicht-NULL-Elemente von X in einer Gruppe zurück. - + (X) The group_concat() function returns a string which is the concatenation of all non-NULL values of X. (X) Die group_conact()-Funktion gibt eine Zeichenkette zurück, die eine Verkettung aller nicht-NULL-Werte von X ist. - + (X,Y) The group_concat() function returns a string which is the concatenation of all non-NULL values of X. If parameter Y is present then it is used as the separator between instances of X. (X,Y) Die group_conact()-Funktion gibt eine Zeichenkette zurück, die eine Verkettung aller nicht-NULL-Werte von X ist. Wenn der Parameter Y aktiv ist, wird dieser als Trennzeichen zwischen Instanzen von X behandelt. - + (X) The max() aggregate function returns the maximum value of all values in the group. (X) Die max()-Sammelfunktion gibt den Maximalwert aller Werte in der Gruppe zurück. - + (X) The min() aggregate function returns the minimum non-NULL value of all values in the group. (X) Die min()-Sammelfunktion gibt den Minimalwert aller nicht-NULL-Werte in der Gruppe zurück. - - + + (X) The sum() and total() aggregate functions return sum of all non-NULL values in the group. (X) Die sum()- und total()-Sammelfunktionen geben die Summe aller nicht-NULL-Werte in der Gruppe zurück. + + + () The number of the row within the current partition. Rows are numbered starting from 1 in the order defined by the ORDER BY clause in the window definition, or in arbitrary order otherwise. + () Die Anzahl der Zeilen in der aktuellen Partition. Zeilen werden beginnend bei 1 in der durch den ORDER-BY-Befehl in der Fensterdefinition nummeriert, ansonsten in willkürlicher Reihenfolge. + + + + () The row_number() of the first peer in each group - the rank of the current row with gaps. If there is no ORDER BY clause, then all rows are considered peers and this function always returns 1. + () Die row_number() des ersten Peer in jeder Gruppe - der Rang der aktuellen Zeile mit Lücken. Falls es keinen ORDER-BY-Befehl gibt, dann werden alle Zeilen als Peers angesehen und diese Funktion gibt immer 1 zurück. + + + + () The number of the current row's peer group within its partition - the rank of the current row without gaps. Partitions are numbered starting from 1 in the order defined by the ORDER BY clause in the window definition. If there is no ORDER BY clause, then all rows are considered peers and this function always returns 1. + () Die Nummer der Peer-Gruppe der aktuellen Zeile in der Partition - der Rang der aktuellen Reihe ohne Lücken. Partitionen werden mit 1 startend nummeriert in der Reihenfolge, wie sie durch den ORDER-BY-Befehl in der Fensterdefinition festgelegt ist. Falls es keinen ORDER-BY-Befehl gibt, werden alle Zeilen als Peers angesehen und diese Funktion gibt immer 1 zurück. + + + + () Despite the name, this function always returns a value between 0.0 and 1.0 equal to (rank - 1)/(partition-rows - 1), where rank is the value returned by built-in window function rank() and partition-rows is the total number of rows in the partition. If the partition contains only one row, this function returns 0.0. + () Ungeachtet des Namens gibt diese Funktion immer einen Wert zwischen 0.0 und 1.0 identisch zu (Rang - 1)/(Partitionszeilen - 1) zurück, wobei Rang der Wert der eingebauten Fensterfunktion rank() und Partitionszeilen die Gesamtanzahl der Zeilen in der Partition ist. Falls die Partition nur eine Zeile enthält, gibt diese Funktion 0.0 zurück. + + + + () The cumulative distribution. Calculated as row-number/partition-rows, where row-number is the value returned by row_number() for the last peer in the group and partition-rows the number of rows in the partition. + () Die kumulative Verteilung. Berechnet als Zeilenanzahl/Partitionszeilen, wobei Zeilenanzahl der durch row_number() zurückgegebene Wert für den letzten Peer in der Gruppe ist und Partitionszeilen die Anzahl der Zeilen in der Partition. + + + + (N) Argument N is handled as an integer. This function divides the partition into N groups as evenly as possible and assigns an integer between 1 and N to each group, in the order defined by the ORDER BY clause, or in arbitrary order otherwise. If necessary, larger groups occur first. This function returns the integer value assigned to the group that the current row is a part of. + (N) Das Argument N wird als Integer behandelt. Diese Funktion teilt die Partition in N Gruppen so gleichmäßig wie möglich auf und weist jeder Gruppe einen Integer zwischen 1 und N zu, in der Reihenfolge, die durch den ORDER-BY-Befehl definiert ist, ansonsten in beliebiger Reihenfolge. Falls notwendig tauchen größere Gruppen als erstes auf. Diese Funktion gibt einen Integerwert zurück, der der Gruppe zugewiesen ist, zu der die aktuelle Zeile gehört. + + + + (expr) Returns the result of evaluating expression expr against the previous row in the partition. Or, if there is no previous row (because the current row is the first), NULL. + (expr) Gibt das Ergebnis der Evaluation des Ausdrucks expr gegen die vorherige Zeile in der Partition zurück. Falls es keine vorhergehende Zeile gibt (weil die aktuelle Zeile die erste ist), wird NULL zurückgegeben. + + + + (expr,offset) If the offset argument is provided, then it must be a non-negative integer. In this case the value returned is the result of evaluating expr against the row offset rows before the current row within the partition. If offset is 0, then expr is evaluated against the current row. If there is no row offset rows before the current row, NULL is returned. + (expr,offset) Falls das Offset-Argument angegeben ist, dann muss dieses ein nicht-negativer Integerwert sein. In diesem Fall ist der Rückgabewert das Ergebnis der Evaluation von expr gegen die Zeile, die innerhalb der Partition offset Zeilen weiter oben liegt. Falls offset 0 ist, wird expr gegen die aktuelle Zeile evaluiert. Falls vor der aktuellen Zeile nicht genügend Zeilen vorhanden sind, wird NULL zurückgegeben. + + + + + (expr,offset,default) If default is also provided, then it is returned instead of NULL if the row identified by offset does not exist. + (expr,offset,default) Falls auch default angegeben ist, dann wird dieser Wert anstatt NULL zurückgegeben, falls die durch offset angegebene Zeile nicht existiert. + + + + (expr) Returns the result of evaluating expression expr against the next row in the partition. Or, if there is no next row (because the current row is the last), NULL. + (expr) Gibt das Ergebnis der Evaluation des Ausdrucks expr gegen die nächste Zeile in der Partition zurück. Falls es keine nächste Zeile gibt (weil die aktuelle Zeile die letzte ist), wird NULL zurückgegeben. + + + + (expr,offset) If the offset argument is provided, then it must be a non-negative integer. In this case the value returned is the result of evaluating expr against the row offset rows after the current row within the partition. If offset is 0, then expr is evaluated against the current row. If there is no row offset rows after the current row, NULL is returned. + (expr,offset) Falls das Offset-Argument angegeben ist, dann muss dieses ein nicht-negativer Integerwert sein. In diesem Fall ist der Rückgabewert das Ergebnis der Evaluation von expr gegen die Zeile, die innerhalb der Partition offset Zeilen weiter unten liegt. Falls offset 0 ist, wird expr gegen die aktuelle Zeile evaluiert. Falls nach der aktuellen Zeile nicht genügend Zeilen vorhanden sind, wird NULL zurückgegeben. + + + + (expr) This built-in window function calculates the window frame for each row in the same way as an aggregate window function. It returns the value of expr evaluated against the first row in the window frame for each row. + (expr) Diese eingebaute Fensterfunktion berechnet das Windowframe für jede Zeile auf die gleiche Art wie ein aggregierte Fensterfunktion. Sie gibt den Wert von expr evaluiert gegen die erste Zeile des Windowframes für jede Zeile zurück. + + + + (expr) This built-in window function calculates the window frame for each row in the same way as an aggregate window function. It returns the value of expr evaluated against the last row in the window frame for each row. + (expr) Diese eingebaute Fensterfunktion berechnet das Windowframe für jede Zeile auf die gleiche Art wie ein aggregierte Fensterfunktion. Sie gibt den Wert von expr evaluiert gegen die letzte Zeile des Windowframes für jede Zeile zurück. + + + + (expr,N) This built-in window function calculates the window frame for each row in the same way as an aggregate window function. It returns the value of expr evaluated against the row N of the window frame. Rows are numbered within the window frame starting from 1 in the order defined by the ORDER BY clause if one is present, or in arbitrary order otherwise. If there is no Nth row in the partition, then NULL is returned. + (expr,N) Diese eingebaute Fensterfunktion berechnet das Windowframe für jede Zeile auf die gleiche Art wie ein aggregierte Fensterfunktion. Sie gibt den Wert von expr evaluiert gegen die N-te Zeile des Windowframes für zurück. Die Zeilen werden beginnend bei 1 in der durch den ORDER-BY-Befehl definierten Reihenfolge nummeriert, falls dieser vorhanden ist, ansonsten in beliebiger Reihenfolge. Falls es keine N-te Zeile in der Partition gibt, dann wird NULL zurückgegeben. + SqliteTableModel - References %1(%2) Hold Ctrl+Shift and click to jump there Referenzen %1(%2) Strg+Shift halten und klicken, um hierher zu springen - + + reading rows + lese Zeilen + + + + loading... + lade... + + + + References %1(%2) +Hold %3Shift and click to jump there + Referenzen %1(%2) +Halten Sie %3Umschalt und klicken Sie, um hierher zu springen + + + Error changing data: %1 Fehler beim Ändern der Daten: %1 + + + retrieving list of columns + ermittle Liste der Spalten + + + + Fetching data... + Rufe Daten ab... + + + + Cancel + Abbrechen + VacuumDialog @@ -4364,11 +6398,19 @@ + Warning: Compacting the database will commit all of your changes. + Warnung: Das Verdichten der Datenbank wird alle Ihre Änderungen übermitteln. + + + + Please select the databases to co&mpact: + Bitte wählen Sie die zu ver&dichtenden Datenbanken aus: + + Warning: Compacting the database will commit all changes you made. Warnung: Das Komprimieren der Datenbank wird alle getätigten Änderungen übernehmen. - Please select the objects to compact: Bitte zu komprimierende Objekte auswählen: diff -Nru sqlitebrowser-3.10.100ubuntu1/src/translations/sqlb_en_GB.ts sqlitebrowser-3.11.1/src/translations/sqlb_en_GB.ts --- sqlitebrowser-3.10.100ubuntu1/src/translations/sqlb_en_GB.ts 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/src/translations/sqlb_en_GB.ts 2019-02-19 23:51:34.000000000 +0000 @@ -15,95 +15,205 @@ - <html><head/><body><p>DB Browser for SQLite is an open source, freeware visual tool used to create, design and edit SQLite database files.</p><p>It is bi-licensed under the Mozilla Public License Version 2, as well as the GNU General Public License Version 3 or later. You can modify or redistribute it under the conditions of these licenses.</p><p>See <a href="http://www.gnu.org/licenses/gpl.html"><span style=" text-decoration: underline; color:#0000ff;">http://www.gnu.org/licenses/gpl.html</span></a> and <a href="https://www.mozilla.org/MPL/2.0/index.txt"><span style=" text-decoration: underline; color:#0000ff;">https://www.mozilla.org/MPL/2.0/index.txt</span></a> for details.</p><p>For more information on this program please visit our website at: <a href="http://sqlitebrowser.org"><span style=" text-decoration: underline; color:#0000ff;">http://sqlitebrowser.org</span></a></p><p><span style=" font-size:small;">This software uses the GPL/LGPL Qt Toolkit from </span><a href="http://qt-project.org/"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://qt-project.org/</span></a><span style=" font-size:small;"><br/>See </span><a href="http://qt-project.org/doc/qt-5/licensing.html"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://qt-project.org/doc/qt-5/licensing.html</span></a><span style=" font-size:small;"> for licensing terms and information.</span></p><p><span style=" font-size:small;">It also uses the Silk icon set by Mark James licensed under a Creative Commons Attribution 2.5 and 3.0 license.<br/>See </span><a href="http://www.famfamfam.com/lab/icons/silk/"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://www.famfamfam.com/lab/icons/silk/</span></a><span style=" font-size:small;"> for details.</span></p></body></html> - + <html><head/><body><p>DB Browser for SQLite is an open source, freeware visual tool used to create, design and edit SQLite database files.</p><p>It is bi-licensed under the Mozilla Public License Version 2, as well as the GNU General Public License Version 3 or later. You can modify or redistribute it under the conditions of these licenses.</p><p>See <a href="http://www.gnu.org/licenses/gpl.html">http://www.gnu.org/licenses/gpl.html</a> and <a href="https://www.mozilla.org/MPL/2.0/index.txt">https://www.mozilla.org/MPL/2.0/index.txt</a> for details.</p><p>For more information on this program please visit our website at: <a href="http://sqlitebrowser.org">http://sqlitebrowser.org</a></p><p><span style=" font-size:small;">This software uses the GPL/LGPL Qt Toolkit from </span><a href="http://qt-project.org/"><span style=" font-size:small;">http://qt-project.org/</span></a><span style=" font-size:small;"><br/>See </span><a href="http://qt-project.org/doc/qt-5/licensing.html"><span style=" font-size:small;">http://qt-project.org/doc/qt-5/licensing.html</span></a><span style=" font-size:small;"> for licensing terms and information.</span></p><p><span style=" font-size:small;">It also uses the Silk icon set by Mark James licensed under a Creative Commons Attribution 2.5 and 3.0 license.<br/>See </span><a href="http://www.famfamfam.com/lab/icons/silk/"><span style=" font-size:small;">http://www.famfamfam.com/lab/icons/silk/</span></a><span style=" font-size:small;"> for details.</span></p></body></html> + + + + + (based on SQLite %1) + - + Version - + Qt Version - + SQLCipher Version - + SQLite Version + AddRecordDialog + + + Add New Record + + + + + Enter values for the new record considering constraints. Fields in bold are mandatory. + + + + + In the Value column you can specify the value for the field identified in the Name column. The Type column indicates the type of the field. Default values are displayed in the same style as NULL values. + + + + + Name + + + + + Type + + + + + Value + + + + + Values to insert. Pre-filled default values are inserted automatically unless they are changed. + + + + + When you edit the values in the upper frame, the SQL query for inserting this new record is shown here. You can edit manually the query before saving. + + + + + <html><head/><body><p><span style=" font-weight:600;">Save</span> will submit the shown SQL statement to the database for inserting the new record.</p><p><span style=" font-weight:600;">Restore Defaults</span> will restore the initial values in the <span style=" font-weight:600;">Value</span> column.</p><p><span style=" font-weight:600;">Cancel</span> will close this dialog without executing the query.</p></body></html> + + + + + Auto-increment + + + + + + Unique constraint + + + + + + Check constraint: %1 + + + + + + Foreign key: %1 + + + + + + Default value: %1 + + + + + + Error adding record. Message from database engine: + +%1 + + + + + Are you sure you want to restore all the entered values to their defaults? + + + + Application - + Usage: %1 [options] [db] - + Possible command line arguments: - + -h, --help Show command line options - + -s, --sql [file] Execute this SQL file after opening the DB - + -t, --table [table] Browse this table after opening the DB - + + This is DB Browser for SQLite version %1. + + + + -q, --quit Exit application after running scripts - - -v, --version Display the current version + + -R, --read-only Open database in read-only mode - - [file] Open this SQLite database - + + -o, --option [group/setting=value] Run application with this setting temporarily set to value + - - This is DB Browser for SQLite version %1%2. + + -v, --version Display the current version - + + [file] Open this SQLite database + + + + The -s/--sql option requires an argument - + The file %1 does not exist - + The -t/--table option requires an argument - + + The -o/--option option requires an argument in the form group/setting=value + + + + Invalid option/non-existant file: %1 @@ -131,17 +241,17 @@ - + Passphrase - + Raw key - + Please set a key to encrypt the database. Note that if you change any of the other, optional, settings you'll need to re-enter them as well every time you open the database file. Leave the password fields empty to disable the encryption. @@ -149,7 +259,7 @@ - + Please enter the key used to encrypt the database. If any of the other settings were altered for this database file you need to provide this information as well. @@ -178,67 +288,82 @@ - + Decimal number - + Exponent notation - + Hex blob - + Hex number - + Apple NSDate to date - + + Java epoch (milliseconds) to date + + + + Julian day to date - + + Unix epoch to local time + + + + + Date as dd/mm/yyyy + + + + Lower case - + Octal number - + Round number - + Unix epoch to date - + Upper case - + Windows DATE to date - + Custom @@ -246,135 +371,181 @@ DBBrowserDB - + Please specify the database name under which you want to access the attached database - + Invalid file format - + + Do you really want to close this temporary database? All data will be lost. + + + + Do you want to save the changes made to the database file %1? - + + The database is currently busy: + + + + + Do you want to abort that other operation? + + + + Exporting database to SQL file... - - + + Cancel - + + + No database file opened + + + + Executing SQL... - + Action cancelled. - - + + Error in statement #%1: %2. Aborting execution%3. - - + + and rolling back - + + Cannot delete this object + + + + Cannot set data on this object - + + A table with the name '%1' already exists in schema '%2'. + + + + renameColumn: cannot find column %1. - + renameColumn: creating savepoint failed. DB says: %1 - + renameColumn: creating new table failed. DB says: %1 - + renameColumn: copying data to new table failed. DB says: %1 - + renameColumn: deleting old table failed. DB says: %1 - + Restoring some of the objects associated with this table failed. This is most likely because some column names changed. Here's the SQL statement which you might want to fix and execute manually: - + renameColumn: releasing savepoint failed. DB says: %1 - + Error renaming table '%1' to '%2'.Message from database engine: %3 - + ... <string can not be logged, contains binary data> ... - + + could not get list of databases: %1 + + + + + Error loading extension: %1 + + + + could not get column information - + could not get list of db objects: %1, %2 - + + This database has already been attached. Its schema name is '%1'. + + + + didn't receive any output from pragma %1 - + could not execute pragma command: %1, %2 - + Error setting pragma %1 to %2: %3 - + File not found. @@ -382,52 +553,62 @@ DbStructureModel - + Name - + Object - + Type - + Schema - - Browsables (%1) + + Database + + + + + Browsables - + All - + + Temporary + + + + Tables (%1) - + Indices (%1) - + Views (%1) - + Triggers (%1) @@ -445,231 +626,409 @@ - - + Image - - Import text - - - - - Opens a file dialog used to import text to this database cell. - - - - + &Import - - Export text + + &Export - - Opens a file dialog used to export the contents of this database cell to a text file. - + + Set this cell to NULL + - - &Export - + + Set as &NULL + - - Set this cell to NULL + + Apply data to cell - - Set as &NULL + + This button saves the changes performed in the cell editor to the database cell. - + Apply - + Text - - Binary - + + This is the list of supported modes for the cell editor. Choose a mode for viewing or editing the data of the current cell. + - - Erases the contents of the cell + + Binary - - This area displays information about the data present in this database cell - + + JSON + - - Type of data currently in cell - + + XML + - - Size of data currently in table - + + + Automatically adjust the editor mode to the loaded data type + - - Choose a file - + + This checkable button enables or disables the automatic switching of the editor mode. When a new cell is selected or new data is imported and the automatic switching is enabled, the mode adjusts to the detected data type. You can then change the editor mode manually. If you want to keep this manually switched mode while moving through the cells, switch the button off. + - - Text files(*.txt);;Image files(%1);;All files(*) - + + Auto-switch + - - Choose a filename to export data - + + + Auto-format: pretty print on loading, compact on saving. + - - Text files(*.txt);;All files(*) - + + When enabled, the auto-format feature formats the data on loading, breaking the text in lines and indenting it for maximum readability. On data saving, the auto-format feature compacts the data removing end of lines, and unnecessary whitespace. + - - Image data can't be viewed with the text editor + + Autoformat - - Binary data can't be viewed with the text editor + + Import from file - - Type of data currently in cell: %1 Image + + Opens a file dialog used to import any kind of data to this database cell. - - %1x%2 pixel(s) + + Export to file - - Type of data currently in cell: NULL + + Opens a file dialog used to export the contents of this database cell to a file. - - - Type of data currently in cell: Text / Numeric + + Erases the contents of the cell - - - - %n char(s) - - - - - - - Type of data currently in cell: Binary + + This area displays information about the data present in this database cell - - - - %n byte(s) - - - - - - - - EditIndexDialog - - &Name - + + This editor mode lets you edit JSON or XML data with syntax highlighting, automatic formatting and validation before saving. + +Errors are indicated with a red squiggle underline. + - - Order + + Type of data currently in cell - - &Table + + Size of data currently in table - - Edit Index Schema + + + Print... - - &Unique - - - - - For restricting the index to only a part of the table you can specify a WHERE clause here that selects the part of the table that should be indexed + + Open preview dialog for printing displayed image - - Partial inde&x clause + + + Ctrl+P - - Colu&mns + + Open preview dialog for printing displayed text - - Table column + + Copy Hex and ASCII - - Type + + Copy selected hexadecimal and ASCII columns to the clipboard - - Add a new expression column to the index. Expression columns contain SQL expression rather than column names. + + Ctrl+Shift+C - + + Choose a filename to export data + + + + + Type of data currently in cell: %1 Image + + + + + %1x%2 pixel(s) + + + + + Type of data currently in cell: NULL + + + + + + Type of data currently in cell: Text / Numeric + + + + + + Image data can't be viewed in this mode. + + + + + + Try switching to Image or Binary mode. + + + + + + Binary data can't be viewed in this mode. + + + + + + Try switching to Binary mode. + + + + + + + + Text files (*.txt) + + + + + + + JSON files (*.json) + + + + + + + + XML files (*.xml) + + + + + + Image files (%1) + + + + + + + Binary files (*.bin) + + + + + + All files (*) + + + + + Choose a file to import + + + + + %1 Image + + + + + SVG files (*.svg) + + + + + + Hex dump files (*.txt) + + + + + Invalid data for this mode + + + + + The cell contains invalid %1 data. Reason: %2. Do you really want to apply it to the cell? + + + + + + + %n char(s) + + + + + + + + Type of data currently in cell: Valid JSON + + + + + Type of data currently in cell: Binary + + + + + + %n byte(s) + + + + + + + + EditIndexDialog + + + &Name + + + + + Order + + + + + &Table + + + + + Edit Index Schema + + + + + &Unique + + + + + For restricting the index to only a part of the table you can specify a WHERE clause here that selects the part of the table that should be indexed + + + + + Partial inde&x clause + + + + + Colu&mns + + + + + Table column + + + + + Type + + + + + Add a new expression column to the index. Expression columns contain SQL expression rather than column names. + + + + Index column - + Deleting the old index failed: %1 - + Creating the index failed: %1 @@ -694,190 +1053,189 @@ - Make this a 'WITHOUT rowid' table. Setting this flag requires a field of type INTEGER with the primary key flag set and the auto increment flag unset. - + Database schema + - - Without Rowid + + Make this a 'WITHOUT rowid' table. Setting this flag requires a field of type INTEGER with the primary key flag set and the auto increment flag unset. - - Set this to create a temporary table that is deleted when closing the database. - - - - Temporary table - + Without Rowid + - + Fields - + Add field - + Remove field - + Move field up - + Move field down - + Name - + Type - - + + NN + + + + Not null - + PK - + Primary key - + AI - + Autoincrement - + U - + Unique - + Default - + Default value - + Check - + Check constraint - + Foreign Key - + <html><head/><body><p><span style=" font-weight:600; color:#ff0000;">Warning: </span>There is something with this table definition that our parser doesn't fully understand. Modifying and saving this table might result in problems.</p></body></html> - + Error creating table. Message from database engine: %1 - + There already is a field with that name. Please rename it first or choose a different name for this field. - + This column is referenced in a foreign key in table %1 and thus its name cannot be changed. - + There is at least one row with this field set to NULL. This makes it impossible to set this flag. Please change the table data first. - + There is at least one row with a non-integer value in this field. This makes it impossible to set the AI flag. Please change the table data first. - + Column '%1' has no unique data. - + This makes it impossible to set this flag. Please change the table data first. - + Modifying this column failed. Error returned from database: %1 - + Are you sure you want to delete the field '%1'? All data currently stored in this field will be lost. - + Please add a field which meets the following criteria before setting the without rowid flag: - Primary key flag set - Auto increment disabled - + Setting the rowid column for the table failed. Error message: %1 - - Setting the temporary flag for the table failed. Error message: + + Changing the table schema failed. Error message: %1 @@ -967,44 +1325,54 @@ - - + + Could not open output file: %1 - - + + Choose a filename to export data - + Text files(*.csv *.txt) - + Export data as JSON - + + exporting CSV + + + + + exporting JSON + + + + Text files(*.json *.js *.txt) - + Please select at least 1 table. - + Choose a directory - + Export completed. @@ -1072,149 +1440,497 @@ - - Please select at least 1 table. - + + Please select at least one table. + - + Choose a filename to export - + Text files(*.sql *.txt) - + Export completed. - + Export cancelled or failed. - ExtendedTableWidget + ExtendedScintilla - - Set to NULL + + + Ctrl+H - - Copy + + + Ctrl+P - - Paste + + Find and Replace... - - The content of the clipboard is bigger than the range selected. -Do you want to insert it anyway? + + Print... - FilterLineEdit + ExtendedTableWidget - - Filter - + + Use as Exact Filter + - - - ForeignKeyEditor - - &Reset + + Containing - - Foreign key clauses (ON UPDATE, ON DELETE etc.) + + Not equal to - - - ImportCsvDialog - - Import CSV file - + + Greater than + - - &Table name - + + Less than + - - &Column names in first line - + + Greater or equal + - - Field &separator - + + Less or equal + - - , - + + Between this and... + - - ; - + + Set to NULL + - - - Tab - + + Copy + - - | - + + Copy with Headers + - - - - Other - + + Copy as SQL + - - &Quote character - + + Paste + - - " - + + Print... + - - ' - + + Use in Filter Expression + - - &Encoding - + + Alt+Del + - - UTF-8 + + Ctrl+Shift+C + + + + + Ctrl+Alt+C + + + + + The content of the clipboard is bigger than the range selected. +Do you want to insert it anyway? + + + + + FileExtensionManager + + + File Extension Manager + + + + + &Up + + + + + &Down + + + + + &Add + + + + + &Remove + + + + + + Description + + + + + Extensions + + + + + *.extension + + + + + FilterLineEdit + + + Filter + + + + + These input fields allow you to perform quick filters in the currently selected table. +By default, the rows containing the input text are filtered out. +The following operators are also supported: +% Wildcard +> Greater than +< Less than +>= Equal to or greater +<= Equal to or less += Equal to: exact match +<> Unequal: exact inverse match +x~y Range: values between x and y + + + + + Set Filter Expression + + + + + What's This? + + + + + Is NULL + + + + + Is not NULL + + + + + Is empty + + + + + Is not empty + + + + + Equal to... + + + + + Not equal to... + + + + + Greater than... + + + + + Less than... + + + + + Greater or equal... + + + + + Less or equal... + + + + + In range... + + + + + FindReplaceDialog + + + Find and Replace + + + + + Fi&nd text: + + + + + Re&place with: + + + + + Match &exact case + + + + + Match &only whole words + + + + + When enabled, the search continues from the other end when it reaches one end of the page + + + + + &Wrap around + + + + + When set, the search goes backwards from cursor position, otherwise it goes forward + + + + + Search &backwards + + + + + <html><head/><body><p>When checked, the pattern to find is interpreted as a UNIX regular expression. See <a href="https://en.wikibooks.org/wiki/Regular_Expressions">Regular Expression in Wikibooks</a>.</p></body></html> + + + + + Use regular e&xpressions + + + + + Find the next occurrence from the cursor position and in the direction set by "Search backwards" + + + + + &Find Next + + + + + &Replace + + + + + Highlight all the occurrences of the text in the page + + + + + F&ind All + + + + + Replace all the occurrences of the text in the page + + + + + Replace &All + + + + + The searched text was not found + + + + + + The searched text was not found. + + + + + The searched text was found one time. + + + + + The searched text was found %1 times. + + + + + The searched text was replaced one time. + + + + + The searched text was replaced %1 times. + + + + + ForeignKeyEditor + + + &Reset + + + + + Foreign key clauses (ON UPDATE, ON DELETE etc.) + + + + + ImportCsvDialog + + + Import CSV file + + + + + Table na&me + + + + + &Column names in first line + + + + + Field &separator + + + + + , + + + + + ; + + + + + + Tab + + + + + | + + + + + + + Other + + + + + &Quote character + + + + + " + + + + + ' + + + + + &Encoding + + + + + UTF-8 @@ -1238,58 +1954,93 @@ + + Advanced + + + + + When importing an empty value from the CSV file into an existing table with a default value for this column, that default value is inserted. Activate this option to insert an empty value instead. + + + + + Ignore default &values + + + - + Activate this option to stop the import when trying to import an empty value into a NOT NULL column without a default value. + + + + + Fail on missing values + + + + + Disable data type detection + + + + + Disable the automatic data type detection when creating a new table. + + + + + Deselect All - + Match Similar - + Select All - - Inserting data... - - - - - Cancel - + + Import completed + - - There is already a table of that name and an import into an existing table is only possible if the number of columns match. - + + There is already a table named '%1' and an import into an existing table is only possible if the number of columns match. + - - There is already a table of that name. Do you want to import the data into it? - + + There is already a table named '%1'. Do you want to import the data into it? + - + Creating restore point failed: %1 - + Creating the table failed: %1 - - Missing field for record %1 - + + importing CSV + + + + + Importing the file '%1' took %2ms. Of this %3ms were spent in the row function. + - + Inserting row failed: %1 @@ -1302,1267 +2053,1687 @@ - - - toolBar1 - + + toolBar1 + + + + + Select a table to browse data + + + + + Use this list to select a table to be displayed in the database view + + + + + This button refreshes the data in the currently selected table. + + + + + Opens the SQLCipher FAQ in a browser window + + + + + Export one or more table(s) to a JSON file + + + + + Refresh + + + + + F5 + + + + + Clear all filters + + + + + &Table: + + + + + Insert a new record in the current table + + + + + + New Record + + + + + Delete the current record + + + + + + Delete Record + + + + + <html><head/><body><p>Scroll to the beginning</p></body></html> + + + + + <html><head/><body><p>Clicking this button navigates to the beginning in the table view above.</p></body></html> + + + + + |< + + + + + < + + + + + 0 - 0 of 0 + + + + + > + + + + + Scroll to the end + + + + + <html><head/><body><p>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Clicking this button navigates up to the end in the table view above.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</p></body></html> + + + + + >| + + + + + <html><head/><body><p>Click here to jump to the specified record</p></body></html> + + + + + <html><head/><body><p>This button is used to navigate to the record number specified in the Go to area.</p></body></html> + + + + + Go to: + + + + + Enter record number to browse + + + + + Type a record number in this area and click the Go to: button to display the record in the database view + + + + + 1 + + + + + &File + + + + + &Import + + + + + &Export + + + + + &Edit + + + + + &View + + + + + &Help + + + + + DB Toolbar + + + + + Edit Database &Cell + + + + + DB Sche&ma + + + + + &Remote + + + + + Execute current line + + + + + This button executes the SQL statement present in the current editor line + + + + + Shift+F5 + + + + + Edit display format + + + + + Edit the display format of the data in this column + + + + + Show rowid column + + + + + Toggle the visibility of the rowid column + + + + + + Set encoding + + + + + Change the encoding of the text in the table cells + + + + + Set encoding for all tables + + + + + Change the default encoding assumed for all tables in the database + - - Select a table to browse data - + + Open an existing database file in read only mode + - - Use this list to select a table to be displayed in the database view - + + Unlock view editing + - - Refresh the data in the selected table. - + + This unlocks the current view for editing. However, you will need appropriate triggers for editing. + - - This button refreshes the data in the currently selected table. + + User - - SQLCipher &FAQ... + + Database Structure - - Opens the SQLCipher FAQ in a browser window + + This is the structure of the opened database. +You can drag SQL statements from an object row and drop them into other applications or into another instance of 'DB Browser for SQLite'. + - - Table(s) to JSON... + + Browse Data - - Export one or more table(s) to a JSON file + + Refresh the data in the selected table - - Refresh + + This button clears all the filters set in the header input fields for the currently browsed table. - - F5 - + + Save the table as currently displayed + - - Clear all filters - + + <html><head/><body><p>This popup menu provides the following options applying to the currently browsed and filtered table:</p><ul style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;"><li style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Export to CSV: this option exports the data of the browsed table as currently displayed (after filters, display formats and order column) to a CSV file.</li><li style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Save as view: this option saves the current setting of the browsed table (filters, display formats and order column) as an SQL view that you can later browse or use in SQL statements.</li></ul></body></html> + - - &Table: + + ... - - Insert a new record in the current table - + + Print currently browsed table data + - - This button creates a new, empty record in the database - + + Print currently browsed table data. Print selection if more than one cell is selected. + - - New Record - + + <html><head/><body><p>This button creates a new record in the database. Hold the mouse button to open a pop-up menu of different options:</p><ul><li><span style=" font-weight:600;">New Record</span>: insert a new record with default values in the database.</li><li><span style=" font-weight:600;">Insert Values...</span>: open a dialog for entering values before they are inserted in the database. This allows to enter values acomplishing the different constraints. This dialog is also open if the <span style=" font-weight:600;">New Record</span> option fails due to these constraints.</li></ul></body></html> + - - Delete the current record - + + This button deletes the record or records currently selected in the table + - - This button deletes the record currently selected in the database - + + This is the database table view. You can do the following actions: + - Start writing for editing inline the value. + - Double-click any record to edit its contents in the cell editor window. + - Alt+Del for deleting the cell content to NULL. + - Ctrl+" for duplicating the current record. + - Ctrl+' for copying the value from the cell above. + - Standard selection and copy/paste operations. + - - Delete Record - + + Scroll one page upwards + - - This is the database view. You can double-click any record to edit its contents in the cell editor window. - + + <html><head/><body><p>Clicking this button navigates one page of records upwards in the table view above.</p></body></html> + - - <html><head/><body><p>Scroll to the beginning</p></body></html> - + + Scroll one page downwards + - - <html><head/><body><p>Clicking this button navigates to the beginning in the table view above.</p></body></html> - + + <html><head/><body><p>Clicking this button navigates one page of records downwards in the table view above.</p></body></html> + - - |< - + + Edit Pragmas + - - < - + + <html><head/><body><p><a href="https://www.sqlite.org/pragma.html#pragma_case_sensitive_like">Case Sensitive Like</a></p></body></html> + - - 0 - 0 of 0 - + + Warning: this pragma is not readable and this value has been inferred. Writing the pragma might overwrite a redefined LIKE provided by an SQLite extension. + - - > - + + Execute SQL + - - Scroll to the end - + + &Tools + - - <html><head/><body><p>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Clicking this button navigates up to the end in the table view above.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</p></body></html> + + Application - - >| - + + This button clears the contents of the SQL logs + - - <html><head/><body><p>Click here to jump to the specified record</p></body></html> + + &Clear - - <html><head/><body><p>This button is used to navigate to the record number specified in the Go to area.</p></body></html> - + + This panel lets you examine a log of all SQL commands issued by the application or by yourself + - - Go to: - + + This is the structure of the opened database. +You can drag multiple object names from the Name column and drop them into the SQL editor and you can adjust the properties of the dropped names using the context menu. This would help you in composing SQL statements. +You can drag SQL statements from the Schema column and drop them into the SQL editor or into other applications. + + - - Enter record number to browse - + + + Project Toolbar + - - Type a record number in this area and click the Go to: button to display the record in the database view - + + Extra DB toolbar + - - 1 - + + + + Close the current database file + - - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_auto_vacuum"><span style=" text-decoration: underline; color:#0000ff;">Auto Vacuum</span></a></p></body></html> + + &New Database... - - None + + + Create a new database file - - - Full + + This option is used to create a new database file. - - Incremental + + Ctrl+N - - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_automatic_index"><span style=" text-decoration: underline; color:#0000ff;">Automatic Index</span></a></p></body></html> + + + &Open Database... - - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_checkpoint_fullfsync"><span style=" text-decoration: underline; color:#0000ff;">Checkpoint Full FSYNC</span></a></p></body></html> + + + + + + Open an existing database file - - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_foreign_keys"><span style=" text-decoration: underline; color:#0000ff;">Foreign Keys</span></a></p></body></html> + + + + This option is used to open an existing database file. - - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_fullfsync"><span style=" text-decoration: underline; color:#0000ff;">Full FSYNC</span></a></p></body></html> + + + Ctrl+O - - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_ignore_check_constraints"><span style=" text-decoration: underline; color:#0000ff;">Ignore Check Constraints</span></a></p></body></html> + + &Close Database - - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_journal_mode"><span style=" text-decoration: underline; color:#0000ff;">Journal Mode</span></a></p></body></html> - + + This button closes the connection to the currently open database file + - - Delete + + Ctrl+W - - Truncate + + + Revert database to last saved state - - Persist + + This option is used to revert the current database file to its last saved state. All changes made since the last save operation are lost. - - - Memory + + + Write changes to the database file - - WAL + + This option is used to save changes to the database file. - - - Off + + Ctrl+S - - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_journal_size_limit"><span style=" text-decoration: underline; color:#0000ff;">Journal Size Limit</span></a></p></body></html> - + + Compact &Database... + - - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_locking_mode"><span style=" text-decoration: underline; color:#0000ff;">Locking Mode</span></a></p></body></html> + + Compact the database file, removing space wasted by deleted records - - - Normal + + + Compact the database file, removing space wasted by deleted records. - - Exclusive + + E&xit - - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_max_page_count"><span style=" text-decoration: underline; color:#0000ff;">Max Page Count</span></a></p></body></html> + + Ctrl+Q - - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_page_size"><span style=" text-decoration: underline; color:#0000ff;">Page Size</span></a></p></body></html> + + Import data from an .sql dump text file into a new or existing database. - - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_recursive_triggers"><span style=" text-decoration: underline; color:#0000ff;">Recursive Triggers</span></a></p></body></html> + + This option lets you import data from an .sql dump text file into a new or existing database. SQL dump files can be created on most database engines, including MySQL and PostgreSQL. - - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_secure_delete"><span style=" text-decoration: underline; color:#0000ff;">Secure Delete</span></a></p></body></html> + + Open a wizard that lets you import data from a comma separated text file into a database table. - - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_synchronous"><span style=" text-decoration: underline; color:#0000ff;">Synchronous</span></a></p></body></html> + + Open a wizard that lets you import data from a comma separated text file into a database table. CSV files can be created on most database and spreadsheet applications. - - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_temp_store"><span style=" text-decoration: underline; color:#0000ff;">Temp Store</span></a></p></body></html> + + Export a database to a .sql dump text file. - - Default + + This option lets you export a database to a .sql dump text file. SQL dump files contain all data necessary to recreate the database on most database engines, including MySQL and PostgreSQL. - - File + + Export a database table as a comma separated text file. - - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_user_version"><span style=" text-decoration: underline; color:#0000ff;">User Version</span></a></p></body></html> + + Export a database table as a comma separated text file, ready to be imported into other database or spreadsheet applications. - - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_wal_autocheckpoint"><span style=" text-decoration: underline; color:#0000ff;">WAL Auto Checkpoint</span></a></p></body></html> + + Open the Create Table wizard, where it is possible to define the name and fields for a new table in the database - - &File + + + Delete Table - - &Import + + Open the Delete Table wizard, where you can select a database table to be dropped. - - &Export + + Open the Modify Table wizard, where it is possible to rename an existing table. It is also possible to add or delete fields form a table, as well as modify field names and types. - - &Edit + + Open the Create Index wizard, where it is possible to define a new index on an existing database table. - - &View + + &Preferences... - - &Help + + + Open the preferences window. - - DB Toolbar + + &DB Toolbar - - Edit Database &Cell - + + Shows or hides the Database toolbar. + - - DB Sche&ma - + + Shift+F1 + - - &Remote + + &Wiki - - Execute SQL [F5, Ctrl+Return, Ctrl+R] + + Bug &Report... - - &Load extension + + Feature Re&quest... - - Execute current line [Shift+F5] + + Web&site - - Shift+F5 + + &Donate on Patreon... - - Sa&ve Project + + Sa&ve Project... - - Open &Project + + This button lets you open a DB4S project file - - &Set Encryption + + &Attach Database... - - Edit display format + + + Add another database file to the current database connection - - Edit the display format of the data in this column + + This button lets you add another database file to the current database connection - - Show rowid column + + &Set Encryption... - - Toggle the visibility of the rowid column + + SQLCipher &FAQ - - - Set encoding + + Table(&s) to JSON... - - Change the encoding of the text in the table cells + + Open Data&base Read Only... - - Set encoding for all tables + + Save results - - Change the default encoding assumed for all tables in the database + + Save the results view - - &Open Database Read Only... + + This button lets you save the results of the last executed query - - Open an existing database file in read only mode + + Find text in SQL editor - - Unlock view editing + + Find text in SQL editor - - This unlocks the current view for editing. However, you will need appropriate triggers for editing. + + This button opens the search bar of the editor - - User - - - - - Database Structure + + Ctrl+F - - Browse Data + + Find or replace text in SQL editor - - Scroll one page upwards + + Find or replace text in SQL editor - - <html><head/><body><p>Clicking this button navigates one page of records upwards in the table view above.</p></body></html> + + This button opens the find/replace dialog for the current editor tab - - Scroll one page downwards + + + Export to &CSV - - <html><head/><body><p>Clicking this button navigates one page of records downwards in the table view above.</p></body></html> + + + Save as &view - - Edit Pragmas + + Save as view - - Execute SQL + + Hide column(s) - - Application - - - - - &Clear - - - - - &New Database... - - - - - - Create a new database file - - - - - This option is used to create a new database file. - - - - - Ctrl+N - - - - - &Open Database... - - - - - - - Open an existing database file - - - - - - This option is used to open an existing database file. - + + Hide selected column(s) + - - Ctrl+O - + + Show all columns + - - &Close Database - + + Show all columns that were hidden + - - Ctrl+W - + + Shows or hides the Project toolbar. + - - Revert database to last saved state - + + Extra DB Toolbar + - - This option is used to revert the current database file to its last saved state. All changes made since the last save operation are lost. - + + + Export the filtered data to CSV + - - Write changes to the database file - + + This button exports the data of the browsed table as currently displayed (after filters, display formats and order column) as a CSV file. + - - This option is used to save changes to the database file. - + + + Save the current filter, sort column and display formats as a view + - - Ctrl+S - + + This button saves the current setting of the browsed table (filters, display formats and order column) as an SQL view that you can later browse or use in SQL statements. + - - Compact the database file, removing space wasted by deleted records - + + Insert Values... + - - - Compact the database file, removing space wasted by deleted records. - + + + Open a dialog for inserting values in a new record + - - E&xit - + + + Insert new record using default values in browsed table + - - Ctrl+Q - + + New In-&Memory Database + - - Import data from an .sql dump text file into a new or existing database. - + + Drag && Drop Qualified Names + - - This option lets you import data from an .sql dump text file into a new or existing database. SQL dump files can be created on most database engines, including MySQL and PostgreSQL. - + + + Use qualified names (e.g. "Table"."Field") when dragging the objects and dropping them into the editor + - - Open a wizard that lets you import data from a comma separated text file into a database table. - + + Drag && Drop Enquoted Names + - - Open a wizard that lets you import data from a comma separated text file into a database table. CSV files can be created on most database and spreadsheet applications. - + + + Use escaped identifiers (e.g. "Table1") when dragging the objects and dropping them into the editor + - - Export a database to a .sql dump text file. - + + &Integrity Check + - - This option lets you export a database to a .sql dump text file. SQL dump files contain all data necessary to recreate the database on most database engines, including MySQL and PostgreSQL. - + + Runs the integrity_check pragma over the opened database and returns the results in the Execute SQL tab. This pragma does an integrity check of the entire database. + - - Export a database table as a comma separated text file. - + + &Foreign-Key Check + - - Export a database table as a comma separated text file, ready to be imported into other database or spreadsheet applications. - + + Runs the foreign_key_check pragma over the opened database and returns the results in the Execute SQL tab + - - Open the Create Table wizard, where it is possible to define the name and fields for a new table in the database - + + &Quick Integrity Check + - - - - Delete Table - + + Run a quick integrity check over the open DB + - - Open the Delete Table wizard, where you can select a database table to be dropped. - + + Runs the quick_check pragma over the opened database and returns the results in the Execute SQL tab. This command does most of the checking of PRAGMA integrity_check but runs much faster. + - - Open the Modify Table wizard, where it is possible to rename an existing table. It is also possible to add or delete fields form a table, as well as modify field names and types. - + + &Optimize + - - Open the Create Index wizard, where it is possible to define a new index on an existing database table. - + + Attempt to optimize the database + - - &Preferences... - + + Runs the optimize pragma over the opened database. This pragma might perform optimizations that will improve the performance of future queries. + - - - Open the preferences window. - + + + Print + - - &DB Toolbar - + + Print text from current SQL editor tab + - - Shows or hides the Database toolbar. - + + Open a dialog for printing the text in the current SQL editor tab + - - Shift+F1 - + + Print the structure of the opened database + - - &About... - + + Open a dialog for printing the structure of the opened database + - + &Recently opened - + Open &tab - - + + Ctrl+T - + SQL &Log - + Show S&QL submitted by - + &Plot - + &Revert Changes - + &Write Changes - - Compact &Database - - - - + &Database from SQL file... - + &Table from CSV file... - + &Database to SQL file... - + &Table(s) as CSV file... - + &Create Table... - + &Delete Table... - + &Modify Table... - + Create &Index... - + W&hat's This? - + + &About + + + + + This button opens a new tab for the SQL editor + + + + &Execute SQL - + + Execute all/selected SQL + + + + + This button executes the currently selected SQL statements. If no text is selected, all SQL statements are executed. + + + + Open SQL file - - - + + This button opens a file containing SQL statements and loads it in a new editor tab + + + + + + Save SQL file - + + &Load Extension... + + + + Execute current line - + Ctrl+E - + Export as CSV file - + Export table as comma separated values file - - &Wiki... - - - - - Bug &report... + + + Save the current session to a file - - Web&site... - + + This button lets you save all the settings associated to the open DB to a DB4S project file + - - - Save the current session to a file - + + Open &Project... + - - + + Load a working session from a file - - &Attach Database + + + Save SQL file as - - - Save SQL file as - + + This button saves the content of the current SQL editor tab to a file + - + &Browse Table - + Copy Create statement - + Copy the CREATE statement of the item to the clipboard - + Ctrl+Return - + Ctrl+L - + Ctrl+P - + Ctrl+D - + Ctrl+I - + Encrypted - + Read only - + Database file is read only. Editing the database is disabled. - + Database encoding - + Database is encrypted using SQLCipher - - + + Choose a database file - - - + + + Choose a filename to save under - - Error adding record: - - - - - + Error deleting record: %1 - + Please select a record first - + %1 - %2 of %3 - - + + There is no database opened. Please open or create a new database file. - - Are you sure you want to delete the %1 '%2'? -All data associated with the %1 will be lost. - - - - - Error: could not delete the %1. Message from database engine: -%2 - - - - - Error executing query: %1 - + + Error checking foreign keys after table modification. The changes will be reverted. + - - %1 rows returned in %2ms from: %3 + + This table did not pass a foreign-key check.<br/>You should run 'Tools | Foreign-Key Check' and fix the reported issues. - + Setting PRAGMA values or vacuuming will commit your current transaction. Are you sure? - + , %1 rows affected - - Query executed successfully: %1 (took %2ms%3) - - - - + Text files(*.csv *.txt);;All files(*) - - Import completed - - - - + Error while saving the database file. This means that not all changes to the database were saved. You need to resolve the following error first. %1 - + Are you sure you want to undo all changes made to the database file '%1' since the last save? - + Choose a file to import - - - + + + Text files(*.sql *.txt);;All files(*) - + Do you want to create a new database file to hold the imported data? If you answer no we will attempt to import the data in the SQL file to the current database. - + File %1 already exists. Please choose a different name. - + Error importing data: %1 - + Import completed. - - + Delete View - - + Modify View - - + Delete Trigger - - - Modify Trigger + + Modify Trigger + + + + + Delete Index + + + + + Modify Index + + + + + Modify Table + + + + + &%1 %2 + + + + + Choose a project file to open + + + + + This project file is using an old file format because it was created using DB Browser for SQLite version 3.10 or lower. Loading this file format is still fully supported but we advice you to convert all your project files to the new file format because support for older formats might be dropped at some point in the future. You can convert your files by simply opening and re-saving them. + + + + + Duplicate records + + + + + Duplicate record + + + + + Ctrl+" + + + + + Please enter a pseudo-primary key in order to enable editing on this view. This should be the name of a unique column in the view. + + + + + Setting PRAGMA values will commit your current transaction. +Are you sure? + + + + + Could not open database file. +Reason: %1 + + + + + In-Memory database + + + + + determining row count... + + + + + %1 - %2 of >= %3 + + + + + Are you sure you want to delete the table '%1'? +All data associated with the table will be lost. + + + + + Are you sure you want to delete the view '%1'? + + + + + Are you sure you want to delete the trigger '%1'? + + + + + Are you sure you want to delete the index '%1'? + + + + + Error: could not delete the table. + + + + + Error: could not delete the view. + + + + + Error: could not delete the trigger. + + + + + Error: could not delete the index. + + + + + Message from database engine: +%1 + + + + + Editing the table requires to save all pending changes now. +Are you sure you want to save the database? - - - Delete Index - + + -- EXECUTING SELECTION IN '%1' +-- + - - - Modify Index + + -- EXECUTING LINE IN '%1' +-- - - - Modify Table + + -- EXECUTING ALL IN '%1' +-- - - &%1 %2 - + + Execution aborted by user + - - Please enter a pseudo-primary key in order to enable editing on this view. This should be the name of a unique column in the view. + + executing query - - Setting PRAGMA values will commit your current transaction. -Are you sure? - + + %1 rows returned in %2ms + - - Could not open database file. -Reason: %1 + + query executed successfully. Took %1ms%2 - - Execution aborted by user + + -- At line %1: +%4 +-- Result: %3 - + Choose text files - + + Import completed. Some foreign key constraints are violated. Please fix them before saving. + + + + Select SQL file to open - + Couldn't read file: %1. - + Couldn't save file: %1. - + Select file name - + Select extension file - + Extensions(*.so *.dll);;All files(*) - + Extension successfully loaded. - - + Error loading extension: %1 - + + Don't show again - + New version available. - + A new DB Browser for SQLite version is available (%1.%2.%3).<br/><br/>Please download at <a href='%4'>%4</a>. - Choose a axis color - Choose an axis colour + + Collation needed! Proceed? + - - Choose a file to open - + + A table in this database requires a special collation function '%1' that this application can't provide without further knowledge. +If you choose to proceed, be aware bad things can happen to your database. +Create a backup! + + + + + creating collation + + + + + Set a new name for the SQL tab. Use the '&&' character to allow using the following character as a keyboard shortcut. + + + + + Please specify the view name + + + + + There is already an object with that name. Please choose a different name. + + + + + View successfully created. + + + + + Error creating view: %1 + + + + + There is no filter set for this table. View will not be created. + + + + + Delete Records + + + + + This action will open a new SQL tab for running: + + + + + Press Help for opening the corresponding SQLite reference page. + + + + Choose a axis color + Choose an axis colour - - + + DB Browser for SQLite project file (*.sqbpro) - + Please choose a new encoding for this table. - + Please choose a new encoding for all tables. - + %1 Leave the field empty for using the database encoding. - + This encoding is either not valid or not supported. + NullLineEdit + + + Set to NULL + + + + + Alt+Del + + + + PlotDock @@ -2570,181 +3741,254 @@ - + + <html><head/><body><p>This pane shows the list of columns of the currently browsed table or the just executed query. You can select the columns that you want to be used as X or Y axis for the plot pane below. The table shows detected axis type that will affect the resulting plot. For the Y axis you can only select numeric columns, but for the X axis you will be able to select:</p><ul style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;"><li style=" margin-top:12px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Date/Time</span>: strings with format &quot;yyyy-MM-dd hh:mm:ss&quot; or &quot;yyyy-MM-ddThh:mm:ss&quot;</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Date</span>: strings with format &quot;yyyy-MM-dd&quot;</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Time</span>: strings with format &quot;hh:mm:ss&quot;</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Label</span>: other string formats. Selecting this column as X axis will produce a Bars plot with the column values as labels for the bars</li><li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Numeric</span>: integer or real values</li></ul><p>Double-clicking the Y cells you can change the used color for that graph.</p></body></html> + + + + Columns - + X - + Y - - _ + + Axis Type + + + + + Here is a plot drawn when you select the x and y values above. + +Click on points to select them in the plot and in the table. Ctrl+Click for selecting a range of points. + +Use mouse-wheel for zooming and mouse drag for changing the axis range. + +Select the axes or axes labels to drag and zoom only in that orientation. - + Line type: - - + + None - + Line - + StepLeft - + StepRight - + StepCenter - + Impulse - + Point shape: - + Cross - + Plus - + Circle - + Disc - + Square - + Diamond - + Star - + Triangle - + TriangleInverted - + CrossSquare - + PlusSquare - + CrossCircle - + PlusCircle - + Peace - + <html><head/><body><p>Save current plot...</p><p>File format chosen by extension (png, jpg, pdf, bmp)</p></body></html> - + Save current plot... - - Load all data. This has only an effect if not all data has been fetched from the table yet due to the partial fetch mechanism. + + + Load all data and redraw plot - - - + + + Row # - Choose a axis color - Choose an axis colour + Choose an axis colour - - Choose a filename to save under + + Copy - - PNG(*.png);;JPG(*.jpg);;PDF(*.pdf);;BMP(*.bmp);;All Files(*) + + Print... - - Fetching all data... + + Show legend - - Cancel + + Stacked bars + + + + + Date/Time + + + + + Date + + + + + Time + + + + + + Numeric + + + + + Label + + + + + Invalid + + + + + Load all data and redraw plot. +Warning: not all data has been fetched from the table yet due to the partial fetch mechanism. + + + + + Choose an axis color + + + + + Choose a filename to save under + + + + + PNG(*.png);;JPG(*.jpg);;PDF(*.pdf);;BMP(*.bmp);;All Files(*) + + + + + There are curves in this plot and the selected line style can only be applied to graphs sorted by X. Either sort the table or query by X to remove curves or select one of the styles supported by curves: None or Line. @@ -2777,8 +4021,8 @@ - - + + ... @@ -2793,537 +4037,670 @@ - + Automatic &updates - - - - - - + + + + + + + + enabled - + Show remote options - + &Database - + Database &encoding - + Open databases with foreign keys enabled. - + &Foreign keys - + SQ&L to execute after opening database - + Data &Browser - - NULL fields - - - - - &Text - - - - + Remove line breaks in schema &view - + Prefetch block si&ze - + Advanced - + Default field type - + Font - + &Font - - Font si&ze: - - - - + Content - + Symbol limit in cell - - Field colors - - - - + NULL - + Regular - - Text - - - - + Binary - + Background - + Filters - + Escape character - + Delay time (&ms) - + Set the waiting time before a new filter value is applied. Can be set to 0 for disabling waiting. - + &SQL - + Settings name - + Context - + Colour - + Bold - + Italic - + Underline - + Keyword - - function - - - - + Function - + Table - + Comment - + Identifier - + String - - currentline - - - - + Current line - + SQL &editor font size - - SQL &log font size + + Tab size + + + + + SQL editor &font - - Tab size + + Error indicators + + + + + Hori&zontal tiling + + + + + If enabled the SQL code editor and the result table view are shown side by side instead of one over the other. + + + + + Code co&mpletion + + + + + Toolbar style + + + + + Only display the icon + + + + + Only display the text + + + + + The text appears beside the icon + + + + + The text appears under the icon + + + + + Follow the style + + + + + DB file extensions + + + + + Manage + + + + + When enabled, the line breaks in the Schema column of the DB Structure tab, dock and printed output are removed. + + + + + Font si&ze + + + + + + This is the maximum number of rows in a table for enabling the value completion based on current values in the column. +Can be set to 0 for disabling completion. + + + + + Row count threshold for completion + + + + + Field display + + + + + Displayed &text + + + + + Text color + + + + + Background color + + + + + Preview only (N/A) + + + + + Foreground + + + + + SQL &results font size + + + + + &Wrap lines + + + + + Never + + + + + At word boundaries + + + + + At character boundaries + + + + + At whitespace boundaries + + + + + &Quotes for identifiers + + + + + Choose the quoting mechanism used by the application for identifiers in SQL code. - - SQL editor &font - + + "Double quotes" - Standard SQL (recommended) + - - Error indicators + + `Grave accents` - Traditional MySQL quotes - - Enabling error indicators highlights the SQL code lines that caused errors during the last execution + + [Square brackets] - Traditional MS SQL Server quotes - - Hori&zontal tiling + + Keywords in &UPPER CASE - - If enabled the SQL code editor and the result table view are shown side by side instead of one over the other. + + When set, the SQL keywords are completed in UPPER CASE letters. - - Code co&mpletion + + When set, the SQL code lines that caused errors during the last execution are highlighted and the results frame indicates the error in the background - + &Extensions - + Select extensions to load for every database: - + Add extension - + Remove extension - + <html><head/><body><p>While supporting the REGEXP operator SQLite doesn't implement any regular expression<br/>algorithm but calls back the running application. DB Browser for SQLite implements this<br/>algorithm for you to let you use REGEXP out of the box. However, as there are multiple possible<br/>implementations of this and you might want to use another one, you're free to disable the<br/>application's implementation and load your own by using an extension. Requires restart of the application.</p></body></html> - + Disable Regular Expression extension - + + <html><head/><body><p>SQLite provides an SQL function for loading extensions from a shared library file. Activate this if you want to use the <span style=" font-style:italic;">load_extension()</span> function from SQL code.</p><p>For security reasons, extension loading is turned off by default and must be enabled through this setting. You can always load extensions through the GUI, even though this option is disabled.</p></body></html> + + + + + Allow loading extensions from SQL code + + + + Remote - + CA certificates - - + + Subject CN - + Common Name - + Subject O - + Organization - - + + Valid from - - + + Valid to - - + + Serial number - + Your certificates - + File - + Subject Common Name - + Issuer CN - + Issuer Common Name - + Clone databases into - - + + Choose a directory - + The language will change after you restart the application. - + Select extension file - + Extensions(*.so *.dll);;All files(*) - + Import certificate file - + No certificates found in this file. - + Are you sure you want do remove this certificate? All certificate data will be deleted from the application settings! + + + Are you sure you want to clear all the saved settings? +All your preferences will be lost and default values will be used. + + QObject - + Error importing data - + from record number %1 - + . %1 - - Decoding CSV file... - + + Importing CSV file... + - + Cancel - - Collation needed! Proceed? - - - - - A table in this database requires a special collation function '%1' that this application can't provide without further knowledge. -If you choose to proceed, be aware bad things can happen to your database. -Create a backup! - + + All files (*) + - - SQLite database files (*.db *.sqlite *.sqlite3 *.db3);;All files (*) + + SQLite database files (*.db *.sqlite *.sqlite3 *.db3) RemoteDatabase - + Error when connecting to %1. %2 - + Error opening remote file at %1. %2 - + Error: Invalid client certificate specified. - + Please enter the passphrase for this client certificate in order to authenticate. - + Cancel - + Uploading remote database to -%1. +%1 - + Downloading remote database from -%1. +%1 + + + + + The remote database has been updated since the last checkout. Do you want to update the local database to the newest version? Note that this discards any changes you have made locally! If you don't want to lose local changes, click No to open the local version. - - + + Error: The network is not accessible. - + Error: Cannot open the file for sending. - + Error opening local databases list. %1 - + Error creating local databases list. %1 @@ -3343,14 +4720,24 @@ + Connect to the remote server using the currently selected identity. The correct server is taken from the identity as well. + + + + Go - + Push currently opened database to server + + + <html><head/><body><p>In this pane, remote databases from dbhub.io website can be added to DB4S. First you need an identity:</p><ol style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;"><li style=" margin-top:12px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Login to the dbhub.io website (use your GitHub credentials or whatever you want)</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Click the button to create a DB4S certificate (that's your identity). That'll give you a certificate file (save it to your local disk).</li><li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Go to the Remote tab in DB4S Preferences. Click the button to add a new certificate to DB4S and choose the just downloaded certificate file.</li></ol><p>Now the Remote panel shows your identity and you can add remote databases.</p></body></html> + + RemoteModel @@ -3393,12 +4780,12 @@ - + Commit message - + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } @@ -3407,27 +4794,42 @@ - + Database licence - + Public - + + Branch + + + + + Force push + + + + Database will be public. Everyone has read access to it. - + Database will be private. Only you have access to it. - + + Use with care. This can cause remote commits to be deleted. + + + + Unspecified @@ -3440,312 +4842,457 @@ - - Results of the last executed statements - + + Find previous match [Shift+F3] + - - This field shows the results and status codes of the last executed statements. - + + Find previous match with mapping + - - Export to &CSV - + + Shift+F3 + - - Save as &view - + + The found pattern must be a whole word + - - Save as view - + + Whole Words + - - Please specify the view name - + + Text pattern to find considering the checks in this frame + - - There is already an object with that name. Please choose a different name. - + + Find in editor + - - View successfully created. + + The found pattern must match in letter case + + + + + Case Sensitive + + + + + Find next match [Enter, F3] + + + + + Find next match with wrapping + + + + + F3 + + + + + Interpret search pattern as a regular expression + + + + + <html><head/><body><p>When checked, the pattern to find is interpreted as a UNIX regular expression. See <a href="https://en.wikibooks.org/wiki/Regular_Expressions">Regular Expression in Wikibooks</a>.</p></body></html> + + + + + Regular Expression + + + + + + Close Find Bar + + + + + + Results of the last executed statements - - Error creating view: %1 + + This field shows the results and status codes of the last executed statements. SqlUiLexer - + (X) The abs(X) function returns the absolute value of the numeric argument X. - + () The changes() function returns the number of database rows that were changed or inserted or deleted by the most recently completed INSERT, DELETE, or UPDATE statement. - + (X1,X2,...) The char(X1,X2,...,XN) function returns a string composed of characters having the unicode code point values of integers X1 through XN, respectively. - + (X,Y,...) The coalesce() function returns a copy of its first non-NULL argument, or NULL if all arguments are NULL - + (X,Y) The glob(X,Y) function is equivalent to the expression "Y GLOB X". - + (X,Y) The ifnull() function returns a copy of its first non-NULL argument, or NULL if both arguments are NULL. - + (X,Y) The instr(X,Y) function finds the first occurrence of string Y within string X and returns the number of prior characters plus 1, or 0 if Y is nowhere found within X. - + (X) The hex() function interprets its argument as a BLOB and returns a string which is the upper-case hexadecimal rendering of the content of that blob. - + () The last_insert_rowid() function returns the ROWID of the last row insert from the database connection which invoked the function. - + (X) For a string value X, the length(X) function returns the number of characters (not bytes) in X prior to the first NUL character. - + (X,Y) The like() function is used to implement the "Y LIKE X" expression. - + (X,Y,Z) The like() function is used to implement the "Y LIKE X ESCAPE Z" expression. - - (X) The load_extension(X) function loads SQLite extensions out of the shared library file named X. - + + (X) The load_extension(X) function loads SQLite extensions out of the shared library file named X. +Use of this function must be authorized from Preferences. + - - (X,Y) The load_extension(X) function loads SQLite extensions out of the shared library file named X using the entry point Y. - + + (X,Y) The load_extension(X) function loads SQLite extensions out of the shared library file named X using the entry point Y. +Use of this function must be authorized from Preferences. + - + (X) The lower(X) function returns a copy of string X with all ASCII characters converted to lower case. - + (X) ltrim(X) removes spaces from the left side of X. - + (X,Y) The ltrim(X,Y) function returns a string formed by removing any and all characters that appear in Y from the left side of X. - + (X,Y,...) The multi-argument max() function returns the argument with the maximum value, or return NULL if any argument is NULL. - + (X,Y,...) The multi-argument min() function returns the argument with the minimum value. - + (X,Y) The nullif(X,Y) function returns its first argument if the arguments are different and NULL if the arguments are the same. - + (FORMAT,...) The printf(FORMAT,...) SQL function works like the sqlite3_mprintf() C-language function and the printf() function from the standard C library. - + (X) The quote(X) function returns the text of an SQL literal which is the value of its argument suitable for inclusion into an SQL statement. - + () The random() function returns a pseudo-random integer between -9223372036854775808 and +9223372036854775807. - + (N) The randomblob(N) function return an N-byte blob containing pseudo-random bytes. - + (X,Y,Z) The replace(X,Y,Z) function returns a string formed by substituting string Z for every occurrence of string Y in string X. - + (X) The round(X) function returns a floating-point value X rounded to zero digits to the right of the decimal point. - + (X,Y) The round(X,Y) function returns a floating-point value X rounded to Y digits to the right of the decimal point. - + (X) rtrim(X) removes spaces from the right side of X. - + (X,Y) The rtrim(X,Y) function returns a string formed by removing any and all characters that appear in Y from the right side of X. - + (X) The soundex(X) function returns a string that is the soundex encoding of the string X. - + (X,Y) substr(X,Y) returns all characters through the end of the string X beginning with the Y-th. - + (X,Y,Z) The substr(X,Y,Z) function returns a substring of input string X that begins with the Y-th character and which is Z characters long. - + () The total_changes() function returns the number of row changes caused by INSERT, UPDATE or DELETE statements since the current database connection was opened. - + (X) trim(X) removes spaces from both ends of X. - + (X,Y) The trim(X,Y) function returns a string formed by removing any and all characters that appear in Y from both ends of X. - + (X) The typeof(X) function returns a string that indicates the datatype of the expression X. - + (X) The unicode(X) function returns the numeric unicode code point corresponding to the first character of the string X. - + (X) The upper(X) function returns a copy of input string X in which all lower-case ASCII characters are converted to their upper-case equivalent. - + (N) The zeroblob(N) function returns a BLOB consisting of N bytes of 0x00. - - - - + + + + (timestring,modifier,modifier,...) - + (format,timestring,modifier,modifier,...) - + (X) The avg() function returns the average value of all non-NULL X within a group. - + (X) The count(X) function returns a count of the number of times that X is not NULL in a group. - + (X) The group_concat() function returns a string which is the concatenation of all non-NULL values of X. - + (X,Y) The group_concat() function returns a string which is the concatenation of all non-NULL values of X. If parameter Y is present then it is used as the separator between instances of X. - + (X) The max() aggregate function returns the maximum value of all values in the group. - + (X) The min() aggregate function returns the minimum non-NULL value of all values in the group. - - + + (X) The sum() and total() aggregate functions return sum of all non-NULL values in the group. + + + () The number of the row within the current partition. Rows are numbered starting from 1 in the order defined by the ORDER BY clause in the window definition, or in arbitrary order otherwise. + + + + + () The row_number() of the first peer in each group - the rank of the current row with gaps. If there is no ORDER BY clause, then all rows are considered peers and this function always returns 1. + + + + + () The number of the current row's peer group within its partition - the rank of the current row without gaps. Partitions are numbered starting from 1 in the order defined by the ORDER BY clause in the window definition. If there is no ORDER BY clause, then all rows are considered peers and this function always returns 1. + + + + + () Despite the name, this function always returns a value between 0.0 and 1.0 equal to (rank - 1)/(partition-rows - 1), where rank is the value returned by built-in window function rank() and partition-rows is the total number of rows in the partition. If the partition contains only one row, this function returns 0.0. + + + + + () The cumulative distribution. Calculated as row-number/partition-rows, where row-number is the value returned by row_number() for the last peer in the group and partition-rows the number of rows in the partition. + + + + + (N) Argument N is handled as an integer. This function divides the partition into N groups as evenly as possible and assigns an integer between 1 and N to each group, in the order defined by the ORDER BY clause, or in arbitrary order otherwise. If necessary, larger groups occur first. This function returns the integer value assigned to the group that the current row is a part of. + + + + + (expr) Returns the result of evaluating expression expr against the previous row in the partition. Or, if there is no previous row (because the current row is the first), NULL. + + + + + (expr,offset) If the offset argument is provided, then it must be a non-negative integer. In this case the value returned is the result of evaluating expr against the row offset rows before the current row within the partition. If offset is 0, then expr is evaluated against the current row. If there is no row offset rows before the current row, NULL is returned. + + + + + + (expr,offset,default) If default is also provided, then it is returned instead of NULL if the row identified by offset does not exist. + + + + + (expr) Returns the result of evaluating expression expr against the next row in the partition. Or, if there is no next row (because the current row is the last), NULL. + + + + + (expr,offset) If the offset argument is provided, then it must be a non-negative integer. In this case the value returned is the result of evaluating expr against the row offset rows after the current row within the partition. If offset is 0, then expr is evaluated against the current row. If there is no row offset rows after the current row, NULL is returned. + + + + + (expr) This built-in window function calculates the window frame for each row in the same way as an aggregate window function. It returns the value of expr evaluated against the first row in the window frame for each row. + + + + + (expr) This built-in window function calculates the window frame for each row in the same way as an aggregate window function. It returns the value of expr evaluated against the last row in the window frame for each row. + + + + + (expr,N) This built-in window function calculates the window frame for each row in the same way as an aggregate window function. It returns the value of expr evaluated against the row N of the window frame. Rows are numbered within the window frame starting from 1 in the order defined by the ORDER BY clause if one is present, or in arbitrary order otherwise. If there is no Nth row in the partition, then NULL is returned. + + SqliteTableModel - + + reading rows + + + + + loading... + + + + References %1(%2) -Hold Ctrl+Shift and click to jump there +Hold %3Shift and click to jump there - + Error changing data: %1 + + + retrieving list of columns + + + + + Fetching data... + + + + + Cancel + + VacuumDialog @@ -3756,13 +5303,13 @@ - Warning: Compacting the database will commit all changes you made. - + Warning: Compacting the database will commit all of your changes. + - Please select the objects to compact: - + Please select the databases to co&mpact: + diff -Nru sqlitebrowser-3.10.100ubuntu1/src/translations/sqlb_es_ES.ts sqlitebrowser-3.11.1/src/translations/sqlb_es_ES.ts --- sqlitebrowser-3.10.100ubuntu1/src/translations/sqlb_es_ES.ts 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/src/translations/sqlb_es_ES.ts 2019-02-19 23:51:34.000000000 +0000 @@ -1,12 +1,12 @@ - + AboutDialog About DB Browser for SQLite - Acerca de DB Browser para SQLite + Acerca de «DB Browser for SQLite» @@ -15,48 +15,159 @@ - <html><head/><body><p>DB Browser for SQLite is an open source, freeware visual tool used to create, design and edit SQLite database files.</p><p>It is bi-licensed under the Mozilla Public License Version 2, as well as the GNU General Public License Version 3 or later. You can modify or redistribute it under the conditions of these licenses.</p><p>See <a href="http://www.gnu.org/licenses/gpl.html"><span style=" text-decoration: underline; color:#0000ff;">http://www.gnu.org/licenses/gpl.html</span></a> and <a href="https://www.mozilla.org/MPL/2.0/index.txt"><span style=" text-decoration: underline; color:#0000ff;">https://www.mozilla.org/MPL/2.0/index.txt</span></a> for details.</p><p>For more information on this program please visit our website at: <a href="http://sqlitebrowser.org"><span style=" text-decoration: underline; color:#0000ff;">http://sqlitebrowser.org</span></a></p><p><span style=" font-size:small;">This software uses the GPL/LGPL Qt Toolkit from </span><a href="http://qt-project.org/"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://qt-project.org/</span></a><span style=" font-size:small;"><br/>See </span><a href="http://qt-project.org/doc/qt-5/licensing.html"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://qt-project.org/doc/qt-5/licensing.html</span></a><span style=" font-size:small;"> for licensing terms and information.</span></p><p><span style=" font-size:small;">It also uses the Silk icon set by Mark James licensed under a Creative Commons Attribution 2.5 and 3.0 license.<br/>See </span><a href="http://www.famfamfam.com/lab/icons/silk/"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://www.famfamfam.com/lab/icons/silk/</span></a><span style=" font-size:small;"> for details.</span></p></body></html> - <html><head/><body> + <html><head/><body><p>DB Browser for SQLite is an open source, freeware visual tool used to create, design and edit SQLite database files.</p><p>It is bi-licensed under the Mozilla Public License Version 2, as well as the GNU General Public License Version 3 or later. You can modify or redistribute it under the conditions of these licenses.</p><p>See <a href="http://www.gnu.org/licenses/gpl.html">http://www.gnu.org/licenses/gpl.html</a> and <a href="https://www.mozilla.org/MPL/2.0/index.txt">https://www.mozilla.org/MPL/2.0/index.txt</a> for details.</p><p>For more information on this program please visit our website at: <a href="http://sqlitebrowser.org">http://sqlitebrowser.org</a></p><p><span style=" font-size:small;">This software uses the GPL/LGPL Qt Toolkit from </span><a href="http://qt-project.org/"><span style=" font-size:small;">http://qt-project.org/</span></a><span style=" font-size:small;"><br/>See </span><a href="http://qt-project.org/doc/qt-5/licensing.html"><span style=" font-size:small;">http://qt-project.org/doc/qt-5/licensing.html</span></a><span style=" font-size:small;"> for licensing terms and information.</span></p><p><span style=" font-size:small;">It also uses the Silk icon set by Mark James licensed under a Creative Commons Attribution 2.5 and 3.0 license.<br/>See </span><a href="http://www.famfamfam.com/lab/icons/silk/"><span style=" font-size:small;">http://www.famfamfam.com/lab/icons/silk/</span></a><span style=" font-size:small;"> for details.</span></p></body></html> + <html><head/><body><p>«DB Browser for SQLite» es una herramienta visual, libre y de fuente abierta usada para crear, diseñar y editar archivos de bases de datos SQLite.</p><p>Está licenciada dualmente con la Mozilla Public License Versión 2, y con la GNU General Public License Versión 3 o posterior. Usted puede modificarla o redistribuirla bajo las condiciones de estas licencias.</p><p>Vea <a href="http://www.gnu.org/licenses/gpl.html">http://www.gnu.org/licenses/gpl.html</a> y <a href="https://www.mozilla.org/MPL/2.0/index.txt">https://www.mozilla.org/MPL/2.0/index.txt</a> para más detalles.</p><p>Para más información sobre este programa visite nuestra página web: <a href="http://sqlitebrowser.org">http://sqlitebrowser.org</a></p><p><span style=" font-size:small;">Esta aplicación utiliza GPL/LGPL Qt Toolkit de </span><a href="http://qt-project.org/"><span style=" font-size:small;">http://qt-project.org/</span></a><span style=" font-size:small;"><br/>Vea </span><a href="http://qt-project.org/doc/qt-5/licensing.html"><span style=" font-size:small;">http://qt-project.org/doc/qt-5/licensing.html</span></a><span style=" font-size:small;"> para los términos de licencia e información.</span></p><p><span style=" font-size:small;">Además utiliza el conjunto de iconos Silk de Mark James licenciado bajo la licencia Creative Commons Attribution 2.5 y 3.0.<br/>Vea </span><a href="http://www.famfamfam.com/lab/icons/silk/"><span style=" font-size:small;">http://www.famfamfam.com/lab/icons/silk/</span></a><span style=" font-size:small;"> para los detalles.</span></p></body></html> + + + <html><head/><body><p>DB Browser for SQLite is an open source, freeware visual tool used to create, design and edit SQLite database files.</p><p>It is bi-licensed under the Mozilla Public License Version 2, as well as the GNU General Public License Version 3 or later. You can modify or redistribute it under the conditions of these licenses.</p><p>See <a href="http://www.gnu.org/licenses/gpl.html"><span style=" text-decoration: underline; color:#0000ff;">http://www.gnu.org/licenses/gpl.html</span></a> and <a href="https://www.mozilla.org/MPL/2.0/index.txt"><span style=" text-decoration: underline; color:#0000ff;">https://www.mozilla.org/MPL/2.0/index.txt</span></a> for details.</p><p>For more information on this program please visit our website at: <a href="https://sqlitebrowser.org"><span style=" text-decoration: underline; color:#0000ff;">https://sqlitebrowser.org</span></a></p><p><span style=" font-size:small;">This software uses the GPL/LGPL Qt Toolkit from </span><a href="http://qt-project.org/"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://qt-project.org/</span></a><span style=" font-size:small;"><br/>See </span><a href="http://qt-project.org/doc/qt-5/licensing.html"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://qt-project.org/doc/qt-5/licensing.html</span></a><span style=" font-size:small;"> for licensing terms and information.</span></p><p><span style=" font-size:small;">It also uses the Silk icon set by Mark James licensed under a Creative Commons Attribution 2.5 and 3.0 license.<br/>See </span><a href="http://www.famfamfam.com/lab/icons/silk/"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://www.famfamfam.com/lab/icons/silk/</span></a><span style=" font-size:small;"> for details.</span></p></body></html> + <html><head/><body> <p>DB Browser para SQLite es una herramienta gratuita y de código abierto usada para crear, diseñar y editar archivos de bases de datos de SQLite.</p> <p>Está doblemente licenciada con Mozilla Public License Version 2, y también con GNU General Public License Version 3 o posterior. Puede modificarla o redistribuirla bajo las condiciones de esas licencias.</p> <p>Vea <a href="http://www.gnu.org/licenses/gpl.html"><span style=" text-decoration: underline; color:#0000ff;">http://www.gnu.org/licenses/gpl.html</span></a> y <a href="https://www.mozilla.org/MPL/2.0/index.txt"><span style=" text-decoration: underline; color:#0000ff;">https://www.mozilla.org/MPL/2.0/index.txt</span></a> para los detalles.</p> -<p>Para más información acerca de este programa visite, por favor, nuestra página web en: <a href="http://sqlitebrowser.org"><span style=" text-decoration: underline; color:#0000ff;">http://sqlitebrowser.org</span></a></p> +<p>Para más información acerca de este programa visite, por favor, nuestra página web en: <a href="https://sqlitebrowser.org"><span style=" text-decoration: underline; color:#0000ff;">https://sqlitebrowser.org</span></a></p> <p><span style=" font-size:small;">Este software usa el GPL/LGPL Qt Toolkit de </span><a href="http://qt-project.org/"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://qt-project.org/</span></a><span style=" font-size:small;"><br/>Vea </span><a href="http://qt-project.org/doc/qt-5/licensing.html"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://qt-project.org/doc/qt-5/licensing.html</span></a><span style=" font-size:small;"> para más información y las condiciones de la licencia.</span> </p><p><span style=" font-size:small;">También usa el conjunto de iconos Silk de Mark James licenciado bajo Creative Commons Attribution 2.5 y 3.0.<br/>Vea </span><a href="http://www.famfamfam.com/lab/icons/silk/"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://www.famfamfam.com/lab/icons/silk/</span></a><span style=" font-size:small;"> para los detalles.</span></p></body></html> - + + (based on SQLite %1) + (basado en SQLite %1) + + + Version Versión - + + Built for + + + + Qt Version Versión de Qt - + SQLCipher Version Versión de SQLCipher - + SQLite Version Versión de SQLite + AddRecordDialog + + + Add New Record + Añadir nuevo registro + + + + Enter values for the new record considering constraints. Fields in bold are mandatory. + Introduzca valores para el nuevo registro teniendo en cuenta las restricciones. Los campos en negrita son obligatorios. + + + + In the Value column you can specify the value for the field identified in the Name column. The Type column indicates the type of the field. Default values are displayed in the same style as NULL values. + En la columna Valor puede especificar el valor del campo identificado en la columna Nombre. La columna Tipo indica el tipo de campo. Los valores por defecto se muestran en la misma tipografía que los valores NULL. + + + + Name + Nombre + + + + Type + Tipo + + + + Value + Valor + + + + Values to insert. Pre-filled default values are inserted automatically unless they are changed. + Valores a insertar. Los valores mostrados por defecto son insertados automáticamente a menos que se cambien. + + + + When you edit the values in the upper frame, the SQL query for inserting this new record is shown here. You can edit manually the query before saving. + Cuando se editan los valores en el cuadro superior, aquí se muestra la consulta SQL para insertar este nuevo registro. Puede editarla antes de guardar. + + + + <html><head/><body><p><span style=" font-weight:600;">Save</span> will submit the shown SQL statement to the database for inserting the new record.</p><p><span style=" font-weight:600;">Restore Defaults</span> will restore the initial values in the <span style=" font-weight:600;">Value</span> column.</p><p><span style=" font-weight:600;">Cancel</span> will close this dialog without executing the query.</p></body></html> + <html><head/><body><p><span style=" font-weight:600;">Guardar</span> enviará a la base de datos la sentencia SQL mostrada para insertar el nuevo registro.</p><p><span style=" font-weight:600;">Restituir valores por Defecto</span> restituirá los valores iniciales en la columna <span style=" font-weight:600;">Valor</span></p><p><span style=" font-weight:600;">Cancelar</span> cierra este diálogo sin ejecutar la consulta.</p></body></html> + + + + Auto-increment + + Auto-incremento + + + + + Unique constraint + + Restricción UNIQUE + + + + + Check constraint: %1 + + Restricción CHECK: %1 + + + + + Foreign key: %1 + + Clave foránea: %1 + + + + + Default value: %1 + + Valor por defecto: %1 + + + + + Error adding record. Message from database engine: + +%1 + Error añadiendo registro. Mensaje de la base de datos: + +%1 + + + + Are you sure you want to restore all the entered values to their defaults? + ¿Está seguro de que quiere restaurar todos los valores introducidos a sus valores por defecto? + + + Application - + Usage: %1 [options] [db] Uso: %1 [opciones] [bd] - + Possible command line arguments: Argumentos de línea de comandos disponibles: @@ -69,57 +180,76 @@ -s, --sql [archivo] Ejecuta este archivo de SQL tras abrir la base de datos - + -h, --help Show command line options -h, --help Mostrar opciones de línea de comandos - + -s, --sql [file] Execute this SQL file after opening the DB - -s, --sql [archivo] Ejecutar este archivo de SQL tras abrir la base de datos + -s, --sql [archivo] Ejecutar este archivo de SQL tras abrir la base de datos - + -t, --table [table] Browse this table after opening the DB - -t, --table [table] Navegar esta tabla tras abrir la base de datos + -t, --table [tabla] Mostrar esta tabla en la hoja de datos tras abrir la base de datos - + -q, --quit Exit application after running scripts -q, --quit Salir de la aplicación tras ejecutar los scripts - + + -R, --read-only Open database in read-only mode + -R, --read-only Abrir base de datos en modo de solo-lectura + + + + -o, --option [group/setting=value] Run application with this setting temporarily set to value + -o, --option [grupo/ajuste=valor] Ejecutar la aplicación con este ajuste establecido temporalmente a este valor + + + -v, --version Display the current version -v, --version Mostrar la versión actual - + [file] Open this SQLite database [archivo] Abrir esta base de datos de SQLite - + + This is DB Browser for SQLite version %1. + Esto es «DB Browser for SQLite» versión %1. + + This is DB Browser for SQLite version %1%2. - Esto es DB Browser para SQLite versión %1%2. + Esto es DB Browser para SQLite versión %1%2. - + The -s/--sql option requires an argument La opción -s/--sql necesita un argumento - + The file %1 does not exist El archivo %1 no existe - + The -t/--table option requires an argument La opción -t/--table necesita un argumento - + + The -o/--option option requires an argument in the form group/setting=value + La opción -o/--option requiere un argumento con la forma grupo/ajuste=valor + + + Invalid option/non-existant file: %1 Opción inválida o archivo inexistente: %1 @@ -142,17 +272,52 @@ &Reintroducir clave - + + Encr&yption settings + Ajustes de &cifrado + + + + SQLCipher &3 defaults + Predeterminados de SQLCipher &3 + + + + SQLCipher &4 defaults + Predeterminados de SQLCipher &4 + + + + Custo&m + &Personalizado + + + Page si&ze &Tamaño de página - + + &KDF iterations + Iteraciones &KDF + + + + HMAC algorithm + Algoritmo HMAC + + + + KDF algorithm + Algoritmo KDF + + + Passphrase Frase de contraseña - + Raw key Clave en bruto @@ -161,7 +326,7 @@ &Tamaño de página - + Please set a key to encrypt the database. Note that if you change any of the other, optional, settings you'll need to re-enter them as well every time you open the database file. Leave the password fields empty to disable the encryption. @@ -176,7 +341,7 @@ - Los cambios no guardados son aplicados antes de modificar el cifrado. - + Please enter the key used to encrypt the database. If any of the other settings were altered for this database file you need to provide this information as well. Por favor, introduzca la clave a usar en el cifrado de la base de datos. @@ -226,52 +391,62 @@ Número hexadecimal - + Apple NSDate to date Fecha de Apple NSDate a fecha - + Java epoch (milliseconds) to date - Fecha Java (milisegundos) a fecha + Tiempo Java (milisegundos) a fecha - + Julian day to date Fecha juliana a fecha - + + Unix epoch to local time + Tiempo Unix a hora local + + + + Date as dd/mm/yyyy + Fecha dd/mm/aaaa + + + Lower case Minúsculas - + Octal number Número octal - + Round number Número redondeado - + Unix epoch to date - Fecha Unix a fecha + Tiempo Unix a fecha - + Upper case Mayúsculas - + Windows DATE to date Fecha Windows a fecha - + Custom A medida @@ -283,45 +458,45 @@ Sin errores - + Please specify the database name under which you want to access the attached database - Por favor, especifique el nombre de la base de datos con el que acceder a la base de datos anexada + Por favor, especifique el nombre con el que acceder a la base de datos anexada - + Invalid file format Formato de archivo inválido - + Do you want to save the changes made to the database file %1? ¿Guardar los cambios hechos al archivo de base de datos «%1»? - + Exporting database to SQL file... Exportando base de datos a un archivo SQL... - - + + Cancel Cancelar - + Executing SQL... Ejecutando SQL... - + Action cancelled. Acción cancelada. Error in statement #%1: %2. Aborting execution. - Error en la consulta #%1: %2. + Error en la sentencia #%1: %2. Abortando ejecución. @@ -329,100 +504,179 @@ renameColumn: no se puede encontrar la tabla %1. - + This database has already been attached. Its schema name is '%1'. - Esta base de datos ya ha sido asociada. Su nombre de esquema es «%1». + Esta base de datos ya ha sido anexada. Su nombre de esquema es «%1». + + + + Do you really want to close this temporary database? All data will be lost. + ¿Está seguro de que quiere cerrar esta base de datos temporal? Todos los datos se perderán. + + + + Database didn't close correctly, probably still busy + + + + + The database is currently busy: + La base de datos está actualmente ocupada: + + + + Do you want to abort that other operation? + ¿Desea abortar la otra operación? - - + + No database file opened No hay una base de datos abierta - - + + Error in statement #%1: %2. Aborting execution%3. - Error en la consulta #%1: %2. + Error en la sentencia #%1: %2. Abortando ejecución%3. - - + + and rolling back y deshaciendo cambios - + + didn't receive any output from %1 + no se recibió ninguna salida de «%1» + + + + could not execute command: %1 + no se pudo ejecutar el comando: «%1» + + + + Cannot delete this object + No se puede borrar este objeto + + + Cannot set data on this object No se pueden poner datos en este objeto - + + A table with the name '%1' already exists in schema '%2'. Una tabla con el nombre «%1» ya existe en el esquema «%2». - + + No table with name '%1' exists in schema '%2'. + + + + + + Cannot find column %1. + + + + + Creating savepoint failed. DB says: %1 + + + + + Renaming the column failed. DB says: +%1 + + + + + + Releasing savepoint failed. DB says: %1 + + + + + Creating new table failed. DB says: %1 + + + + + Copying data to new table failed. DB says: +%1 + + + + + Deleting old table failed. DB says: %1 + + + renameColumn: cannot find column %1. - renameColumn: no se puede encontrar la columna «%1». + renameColumn: no se puede encontrar la columna «%1». - renameColumn: creating savepoint failed. DB says: %1 - renameColumn: creación del savepoint fallido. La base de datos dice: %1 + renameColumn: creación del savepoint fallido. La base de datos dice: %1 - renameColumn: creating new table failed. DB says: %1 - renameColumn: creación de la nueva tabla fallida. La base de datos dice: %1 + renameColumn: creación de la nueva tabla fallida. La base de datos dice: %1 - renameColumn: copying data to new table failed. DB says: %1 - renameColumn: copia de datos a la nueva table fallida. La base de datos dice: + renameColumn: copia de datos a la nueva table fallida. La base de datos dice: %1 - renameColumn: deleting old table failed. DB says: %1 - renameColumn: borrado de tabla fallido. La base de datos dice: %1 + renameColumn: borrado de tabla fallido. La base de datos dice: %1 - + Restoring some of the objects associated with this table failed. This is most likely because some column names changed. Here's the SQL statement which you might want to fix and execute manually: - La restitución de algunos de los objetos asociados con esta tabla falló. Lo más probable es que esto suceda porque han cambiado los nombres de algunas columnas. Esta es la consulta SQL que puede que quiera corregir y ejecutar manualmente: + La restitución de algunos de los objetos asociados con esta tabla ha fallado. Lo más probable es que esto suceda porque los nombres de algunas columnas han cambiado. Esta es la sentencia SQL que puede que quiera corregir y ejecutar manualmente: - renameColumn: releasing savepoint failed. DB says: %1 - renameColumn: liberación del savepoint fallido. La base de datos dice: %1 + renameColumn: liberación del savepoint fallido. La base de datos dice: %1 - + Error renaming table '%1' to '%2'.Message from database engine: %3 Error renombrando la tabla «%1» a «%2». Mensaje de la base de datos: «%3» - + ... <string can not be logged, contains binary data> ... ... <la cadena no se puede registrar; contiene datos binarios> ... - + could not get list of databases: %1 no se pudo obtener lista de bases de datos: %1 - + + Error loading extension: %1 + Error cargando la extensión: %1 + + + could not get column information No se pudo obtener información de la columna @@ -431,7 +685,7 @@ tipo de objeto desconocido %1 - + could not get list of db objects: %1, %2 No se pudo obtener la lista de objetos de la base de datos: %1, %2 @@ -440,22 +694,20 @@ No se pudieron obtener los tipos - didn't receive any output from pragma %1 - No se obtuvo ninguna salida del pragma %1 + No se obtuvo ninguna salida del pragma %1 - could not execute pragma command: %1, %2 - No se pudo ejecutar el comando pragma: %1, %2 + No se pudo ejecutar el comando pragma: %1, %2 - + Error setting pragma %1 to %2: %3 Error definiendo pragma %1 como %2: %3 - + File not found. Archivo no encontrado. @@ -463,22 +715,22 @@ DbStructureModel - + Name Nombre - + Object Objeto - + Type Tipo - + Schema Esquema @@ -487,42 +739,42 @@ Navegables (%1) - + Database Base de datos - + Browsables Navegables - + All Todos - + Temporary Temporal - + Tables (%1) Tablas (%1) - + Indices (%1) Índices (%1) - + Views (%1) Vistas (%1) - + Triggers (%1) Disparadores (%1) @@ -540,64 +792,182 @@ Modo: - - + + This is the list of supported modes for the cell editor. Choose a mode for viewing or editing the data of the current cell. + Esta es la lista de modos admitidos en el editor de celdas. Elija un modo para visualizar o editar los datos de la celda actual. + + + Image Imagen + + JSON + JSON + + + + XML + XML + + + + Automatically adjust the editor mode to the loaded data type + Ajustar automáticamente el modo de edición al tipo de datos cargados + + + + This checkable button enables or disables the automatic switching of the editor mode. When a new cell is selected or new data is imported and the automatic switching is enabled, the mode adjusts to the detected data type. You can then change the editor mode manually. If you want to keep this manually switched mode while moving through the cells, switch the button off. + Esta casilla activa o desactiva el cambio automático del modo de edición. Cuando se selecciona una nueva celda o se importan nuevos datos y la selección automática está activada, el modo de edición se ajusta al tipo de datos detectados. El modo de edición para la celda se puede cambiar manualmente. Si prefiere mantener el modo de edición seleccionado manualmente mientras se mueve por las celdas, desmarque la casilla. + + + + Auto-switch + Auto-selección + + + + + Auto-format: pretty print on loading, compact on saving. + Auto-formato: dar formato al cargar, compactar al guardar. + + + + When enabled, the auto-format feature formats the data on loading, breaking the text in lines and indenting it for maximum readability. On data saving, the auto-format feature compacts the data removing end of lines, and unnecessary whitespace. + Si se habilita, la opción de auto-formato da formato a los datos al cargarlos, rompiendo y sangrando las líneas de texto para una legibilidad máxima. Al guardar los datos, esta opción los compacta, eliminando fines de línea y espacio en blanco innecesario. + + + + Autoformat + Auto-formato + + + + Import from file + Importar desde archivo + + + + Opens a file dialog used to import any kind of data to this database cell. + Abre un diálogo para elegir el archivo para importar cualquier tipo de datos a esta celda. + + + + Export to file + Exportar a archivo + + + + Opens a file dialog used to export the contents of this database cell to a file. + Abre un diálogo para elegir el archivo al que exportar el contenido de esta celda de la base de datos. + + + + + Print... + Imprimir... + + + + Open preview dialog for printing displayed image + Abre un diálogo de previsualización para imprimir la imagen mostrada + + + + + Ctrl+P + Ctrl+P + + + + Open preview dialog for printing displayed text + Abre un diálogo de previsualización para imprimir el texto mostrado + + + + Copy Hex and ASCII + Copiar hex. y ASCII + + + + Copy selected hexadecimal and ASCII columns to the clipboard + Copia las columnas seleccionadas en hexadecimal y ASCII al portapapeles + + + + Ctrl+Shift+C + Ctrl+Shift+C + + Import text - Importa texto + Importa texto - Opens a file dialog used to import text to this database cell. - Abre una ventana para importar texto a esta celda de la base de datos. + Abre una ventana para importar texto a esta celda de la base de datos. - + &Import &Importar - Export text - Exporta texto + Exporta texto - Opens a file dialog used to export the contents of this database cell to a text file. - Abre una ventana para exportar el contenido de esta celda a un archivo de texto. + Abre una ventana para exportar el contenido de esta celda a un archivo de texto. - + &Export E es el acelerador del menú editar E&xportar - + Set this cell to NULL Borra esta celda a NULL - + Set as &NULL Borrar a &NULL - + + This editor mode lets you edit JSON or XML data with syntax highlighting, automatic formatting and validation before saving. + +Errors are indicated with a red squiggle underline. + Este modo del editor le permite editar datos JSON o XML con resalte de sintaxis, formato automático y validación antes de guardar. + +Los errores se indican con un subrayado ondulado rojo. + + + + Apply data to cell + Aplicar los datos a la celda + + + + This button saves the changes performed in the cell editor to the database cell. + Este botón guarda los cambios realizados en el editor a la celda de la base de datos. + + + Apply Aplicar - + Text Texto - + Binary Binario @@ -606,7 +976,7 @@ Borrar datos de la celda - + Erases the contents of the cell Borra el contenido de la celda @@ -619,78 +989,192 @@ <html><head/><body><p><span style=" font-weight:600; color:#c00000;">¡Precaución: Editar contenido binario en modo texto puede dañar los datos!</span></p></body></html> - + This area displays information about the data present in this database cell Esta zona muestra información acerca de los datos presentes en esta celda de la base de datos - + Type of data currently in cell Tipo de datos actualmente en la celda - + Size of data currently in table Tamaño de los datos actualmente en la tabla - Choose a file - Seleccione un archivo + Seleccione un archivo - Text files(*.txt);;Image files(%1);;All files(*) - Archivos de texto(*.txt);;Archivos de imagen(%1);;Todos los archivos(*) + Archivos de texto(*.txt);;Archivos de imagen(%1);;Todos los archivos(*) - + Choose a filename to export data Seleccione un nombre de archivo para exportar los datos - Text files(*.txt);;All files(*) - Archivos de texto(*.txt);;Todos los archivos(*) + Archivos de texto(*.txt);;Todos los archivos(*) - Image data can't be viewed with the text editor - Los datos de imagen no se pueden mostrar en el editor de texto + Los datos de imagen no se pueden mostrar en el editor de texto - Binary data can't be viewed with the text editor - Los datos binarios no se pueden mostrar en el editor de texto + Los datos binarios no se pueden mostrar en el editor de texto + + + + + Image data can't be viewed in this mode. + Datos de imagen no se puede visualizar en este modo. + + + + + Try switching to Image or Binary mode. + Intente cambiando al modo «Imagen» o «Binario». + + + + + Binary data can't be viewed in this mode. + Datos binarios no se puede visualizar en este modo. + + + + + Try switching to Binary mode. + Intente cambiando al modo «Binario». + + + + + + + Text files (*.txt) + Archivos de texto (*.txt) + + + + + + JSON files (*.json) + Archivos JSON (*.json) + + + + + + + XML files (*.xml) + Archivos XML (*.xml) + + + + + Image files (%1) + Archivos de imagen (%1) + + + + + + Binary files (*.bin) + Archivos binarios (*.bin) + + + + + All files (*) + Todos los archivos (*) + + + + Choose a file to import + Seleccione el archivo a importar + + + + %1 Image + %1 Imagen + + + + SVG files (*.svg) + Archivos SVG (*.svg) + + + + + Hex dump files (*.txt) + Archivos de volcado hex. (*.txt) + + + Text files (*.txt);;Image files (%1);;JSON files (*.json);;XML files (*.xml);;Binary files (*.bin);;All files (*) + Archivos de texto (*.txt);;Archivos de imagen (%1);;Archivos JSON (*.json);;Archivos XML (*.xml);;Archivos binarios (*.bin);;Todos los archivos (*) + + + Binary files(*.bin);;All files(*) + Archivos binarios (*.bin);;Todos los archivos (*) + + + JSON files(*.json);;All files(*) + Archivos JSON (*.json);;Todos los archivos (*) + + + SVG files(*.svg);;All files(*) + Archivos SVG(*.svg);;Todos los archivos (*) + + + + Invalid data for this mode + Datos inválidos para este modo + + + + The cell contains invalid %1 data. Reason: %2. Do you really want to apply it to the cell? + La celda contiene datos de tipo %1 inválidos. Razón: «%2». ¿Realmente desea aplicarlos a la celda? - + Type of data currently in cell: %1 Image El tipo de datos en la celda es: Imagen %1 - + %1x%2 pixel(s) %1×%2 píxel(s) - + Type of data currently in cell: NULL El tipo de datos en la celda es: NULL + + Type of data currently in cell: Valid JSON + Tipo de datos actualmente en la celda: JSON válido + + Type of data currently in cell: Null Tipo de datos actualmente en la celda: Null - - + + Type of data currently in cell: Text / Numeric Tipo de datos actualmente en la celda: Texto / Numérico - - + + + %n char(s) %n carácter @@ -706,13 +1190,13 @@ %1x%2 píxel - + Type of data currently in cell: Binary Tipo de datos actualmente en la celda: Binario - - + + %n byte(s) %n byte @@ -766,7 +1250,7 @@ For restricting the index to only a part of the table you can specify a WHERE clause here that selects the part of the table that should be indexed - Para restringir el índice excusivamente a una parte de la tabla hay que especificar aquí una cláusula WHERE que seleccione la parte de la tabla que será indexada + Para restringir el índice exclusivamente a una parte de la tabla hay que especificar aquí una cláusula WHERE que seleccione la parte de la tabla que será indexada @@ -799,14 +1283,14 @@ Columna de índice - + Deleting the old index failed: %1 Borrado del índice previo fallido: %1 - + Creating the index failed: %1 Creación de índice fallida: @@ -891,6 +1375,10 @@ + NN + NN + + Not null No nulo @@ -960,14 +1448,14 @@ <html><head/><body><p><span style=" font-weight:600; color:#ff0000;">Cuidado: </span>Hay algo en la definición de esta tabla que nuestro intérprete no entiende del todo. Modificar y guardar esta tabla puede causar problemas.</p></body></html> - + Error creating table. Message from database engine: %1 Error creando la tabla. Mensaje de la base de datos: %1 - + There already is a field with that name. Please rename it first or choose a different name for this field. Ya hay un campo con este nombre. Por favor, renómbrelo antes o elija un nombre diferente para este campo. @@ -976,38 +1464,43 @@ Esta columna está referenciada en una foreign key en la tabla %1, columna %2 y por tanto no se le puede cambiar el nombre. - + This column is referenced in a foreign key in table %1 and thus its name cannot be changed. Esta columna está referenciada en una clave foránea en la tabla %1 y por tanto no se le puede cambiar el nombre. - + There is at least one row with this field set to NULL. This makes it impossible to set this flag. Please change the table data first. Hay al menos una línea con este campo NULO. Esto hace imposible activar este flag. Por favor, modifique antes los datos de la tabla. - + There is at least one row with a non-integer value in this field. This makes it impossible to set the AI flag. Please change the table data first. Hay al menos una línea con un valor no entero en este campo. Esto hace imposible activar el flag AI. Por favor, modifique antes los datos de la tabla. - - Column '%1' has no unique data. + + Column '%1' has duplicate data. - La columna «%1» no tiene datos únicos. + La columna «%1» tiene datos duplicados. + + + + + This makes it impossible to enable the 'Unique' flag. Please remove the duplicate data, which will allow the 'Unique' flag to then be enabled. + Como en otros textos, pasamos los términos estándar de SQL a mayúsculas para evitar traducirlos, lo que podría ser más confuso para el usuario experto y no tener beneficio para el inexperto. + Esto imposibilita la habilitación de la restricción UNIQUE. Por favor, elimine primero los datos duplicados, lo cual permitirá habilitar la restricción UNIQUE. - Setting the rowid column for the table failed. Error message: %1 - El ajuste de la columna rowid para la tabla falló. Mensaje de error: + El ajuste de la columna rowid para la tabla falló. Mensaje de error: %1 - Changing the table schema failed. Error message: %1 - Falló el cambio de esquema de la tabla. Mensaje de error: + Falló el cambio de esquema de la tabla. Mensaje de error: %1 @@ -1023,26 +1516,24 @@ - This makes it impossible to set this flag. Please change the table data first. - Esto hace imposible activar este flag. Por favor, modifique antes los datos de la tabla. + Esto hace imposible activar este flag. Por favor, modifique antes los datos de la tabla. - Modifying this column failed. Error returned from database: %1 - La modificación de esta columna falló. Error devuelto por la base de datos: + La modificación de esta columna falló. Error devuelto por la base de datos: %1 - + Are you sure you want to delete the field '%1'? All data currently stored in this field will be lost. ¿Está seguro de que quiere borrar este campo «%1»? Todos los datos actualmente almacenados en este campo se perderán. - + Please add a field which meets the following criteria before setting the without rowid flag: - Primary key flag set - Auto increment disabled @@ -1148,44 +1639,54 @@ Impresión formateada - - + + Could not open output file: %1 No se puede abrir el archivo de salida: %1 - - + + Choose a filename to export data Seleccione un nombre de archivo para exportar los datos - + Text files(*.csv *.txt) Archivos de texto(*.csv *.txt) - + Export data as JSON Exportar datos como JSON - + + exporting CSV + exportando CSV + + + + exporting JSON + exportando JSON + + + Text files(*.json *.js *.txt) Archivos de texto(*.json *.js *.txt) - + Please select at least 1 table. Por favor, seleccione al menos 1 tabla. - + Choose a directory Seleccione una carpeta - + Export completed. Exportación completada. @@ -1229,7 +1730,7 @@ Multiple rows (VALUES) per INSERT statement - Múltiples líneas (VALUES) en cada comando INSERT + Múltiples líneas (VALUES) en cada sentencia INSERT @@ -1239,7 +1740,7 @@ Export data only - Exportar sólo los datos + Exportar solo los datos @@ -1249,7 +1750,7 @@ Overwrite old schema (DROP TABLE, then CREATE TABLE) - Sobreescribir esquema previo (DROP TABLE, después CREATE TABLE) + Sobrescribir esquema previo (DROP TABLE, después CREATE TABLE) New INSERT INTO syntax (multiple rows in VALUES) @@ -1258,64 +1759,182 @@ Export schema only - Exportar sólo el esquema + Exportar solo el esquema - Please select at least 1 table. - Por favor, seleccione al menos 1 tabla. + Por favor, seleccione al menos 1 tabla. + + + + Please select at least one table. + Por favor, seleccione al menos una tabla. - + Choose a filename to export Seleccione un nombre de archivo al que exportar - + Text files(*.sql *.txt) Archivos de texto(*.sql *.txt) - + Export completed. Exportación completada. - + Export cancelled or failed. Exportación cancelada o fallida. - ExtendedTableWidget + ExtendedScintilla - The content of clipboard is bigger than the range selected. -Do you want to insert it anyway? + + + Ctrl+H + Ctrl+H + + + + + Ctrl+P + Ctrl+P + + + + Find and Replace... + Buscar y reemplazar... + + + + Print... + Imprimir... + + + + ExtendedTableWidget + + The content of clipboard is bigger than the range selected. +Do you want to insert it anyway? El contenido del portapapeles es mayor que el rango seleccionado. ¿Quiere insertarlo de todos modos? - + + Use as Exact Filter + Usar como filtro exacto + + + + Containing + Conteniendo + + + + Not containing + + + + + Not equal to + No igual a + + + + Greater than + Mayor que + + + + Less than + Menor que + + + + Greater or equal + Mayor o igual + + + + Less or equal + Menor o igual + + + + Between this and... + Entre esto y... + + + + Regular expression + + + + Set to NULL Poner a NULL - + Copy Copiar - + + Copy with Headers + Copiar con cabeceras + + + + Copy as SQL + Copiar como SQL + + + Paste Pegar - + + Print... + Imprimir... + + + + Use in Filter Expression + Usar en expresión de filtro + + + + Alt+Del + + + + + Ctrl+Shift+C + Ctrl+Shift+C + + + + Ctrl+Alt+C + Ctrl+Alt+C + + + + <p>Not all data has been loaded. <b>Do you want to load all data before selecting all the rows?</b><p><p>Answering <b>No</b> means that no more data will be loaded and the selection will not be performed.<br/>Answering <b>Yes</b> might take some time while the data is loaded but the selection will be complete.</p>Warning: Loading all the data might require a great amount of memory for big tables. + + + Use as Filter - Usar como filtro + Usar como filtro - + The content of the clipboard is bigger than the range selected. Do you want to insert it anyway? El contenido del portapapeles es mayor que el rango seleccionado. @@ -1330,12 +1949,314 @@ + FileExtensionManager + + + File Extension Manager + Gestor de extensiones de archivos + + + + &Up + &Subir + + + + &Down + &Bajar + + + + &Add + &Añadir + + + + &Remove + &Eliminar + + + + + Description + Descripción + + + + Extensions + Extensiones + + + + *.extension + *.extensión + + + FilterLineEdit - + Filter Filtro + + These input fields allow you to perform quick filters in the currently selected table. +By default, the rows containing the input text are filtered out. +The following operators are also supported: +% Wildcard +> Greater than +< Less than +>= Equal to or greater +<= Equal to or less += Equal to: exact match +<> Unequal: exact inverse match +x~y Range: values between x and y + Estos campos de texto permiten realizar filtros rápidos sobre la tabla actualmente seleccionada. +Por defecto, las filas que contengan el texto introducido se muestran. +Los siguientes operadores también se admiten: +% Comodín +> Mayor que +< Menor que +>= Igual o mayor que +<= Igual o menor que += Igual a: correspondencia exacta +<> Distinto: correspondencia inversa exacta +x~y Rango: valores entre x e y + + + + These input fields allow you to perform quick filters in the currently selected table. +By default, the rows containing the input text are filtered out. +The following operators are also supported: +% Wildcard +> Greater than +< Less than +>= Equal to or greater +<= Equal to or less += Equal to: exact match +<> Unequal: exact inverse match +x~y Range: values between x and y +/regexp/ Values matching the regular expression + + + + + Clear All Conditional Formats + + + + + Use for Conditional Format + + + + + Set Filter Expression + Establecer expresión de filtro + + + + What's This? + ¿Qué es esto? + + + + Is NULL + Es nulo + + + + Is not NULL + No es nulo + + + + Is empty + Es vacío + + + + Is not empty + No es vacío + + + + Not containing... + + + + + Equal to... + Igual a... + + + + Not equal to... + No igual a... + + + + Greater than... + Mayor que... + + + + Less than... + Menor que... + + + + Greater or equal... + Mayor o igual... + + + + Less or equal... + Menor o igual... + + + + In range... + En el rango... + + + + Regular expression... + + + + + FindReplaceDialog + + + Find and Replace + Buscar y reemplazar + + + + Fi&nd text: + &Buscar texto: + + + + Re&place with: + &Reemplazar con: + + + + Match &exact case + Distinguir &mayús. y minús. + + + + Match &only whole words + &Solo palabras completas + + + + When enabled, the search continues from the other end when it reaches one end of the page + Si se habilita, la búsqueda continua desde el otro extremo cuando llega a un extremo de la página + + + + &Wrap around + &Dar la vuelta + + + + When set, the search goes backwards from cursor position, otherwise it goes forward + Si se establece, la búsqueda va hacia atrás desde la posición del cursor. De lo contrario va hacia adelante + + + + Search &backwards + Buscar hacia &atrás + + + + <html><head/><body><p>When checked, the pattern to find is searched only in the current selection.</p></body></html> + + + + + &Selection only + + + + + <html><head/><body><p>When checked, the pattern to find is interpreted as a UNIX regular expression. See <a href="https://en.wikibooks.org/wiki/Regular_Expressions">Regular Expression in Wikibooks</a>.</p></body></html> + <html><head/><body><p>Si se establece, el patrón buscado se interpreta como una expresión regular UNIX. Véase <a href="https://es.wikipedia.org/wiki/Expresi%C3%B3n_regular">«Expresión regular» en Wikipedia</a>.</p></body></html> + + + + Use regular e&xpressions + Usar e&xpresiones regulares + + + + Find the next occurrence from the cursor position and in the direction set by "Search backwards" + Encontrar la siguiente ocurrencia desde la posición del cursor y en la dirección definida por «Buscar hacia atrás» + + + + &Find Next + Buscar &siguiente + + + + &Replace + R&eemplazar + + + + Highlight all the occurrences of the text in the page + Resaltar todas las ocurrencias del texto en la página + + + + F&ind All + Encontrar &todo + + + + Replace all the occurrences of the text in the page + Reemplazar todas las ocurrencias del texto en la página + + + + Replace &All + Reem&plazar todo + + + + The searched text was not found + El texto buscado no fue encontrado + + + + The searched text was not found. + El texto buscado no fue encontrado. + + + + The searched text was found one time. + El texto buscado fue encontrado una vez. + + + + The searched text was found %1 times. + El texto buscado fue encontrado %1 veces. + + + + The searched text was replaced one time. + El texto buscado fue reemplazado una vez. + + + + The searched text was replaced %1 times. + El texto buscado fue reemplazado %1 veces. + ForeignKeyEditor @@ -1351,7 +2272,7 @@ (foreign key clauses(ON UPDATE, ON DELETE etc.) - claúsulas para foreign key (ON UPDATE, ON DELETE etc.) + claúsulas de clave foránea (ON UPDATE, ON DELETE etc.) @@ -1362,9 +2283,13 @@ Importar archivo CSV - &Table name - Nombre de la &tabla + Nombre de la &tabla + + + + Table na&me + &Nombre de la tabla @@ -1388,7 +2313,7 @@ - + Tab Tab @@ -1450,18 +2375,78 @@ Tablas separadas + + Advanced + Avanzado + + + + When importing an empty value from the CSV file into an existing table with a default value for this column, that default value is inserted. Activate this option to insert an empty value instead. + Cuando se importe un valor vacío desde el archivo CSV a una tabla existente con un valor por defecto para la columna, ese valor por defecto es insertado. Active esta opción si, por el contrario, desea insertar un valor vacío para esta columna. + + + + Ignore default &values + Ignorar &valores por defecto + + + + Activate this option to stop the import when trying to import an empty value into a NOT NULL column without a default value. + Active esta opción para para la importación cuando se intente importar un valor vacío a una columna NOT NULL sin un valor por defecto. + + - + Fail on missing values + Fallar cuando falten valores + + + + Disable data type detection + Deshabilitar detección de tipo + + + + Disable the automatic data type detection when creating a new table. + Deshabilitar la detección automática de tipo cuando se esté creando una nueva tabla. + + + + When importing into an existing table with a primary key, unique constraints or a unique index there is a chance for a conflict. This option allows you to select a strategy for that case: By default the import is aborted and rolled back but you can also choose to ignore and not import conflicting rows or to replace the existing row in the table. + + + + + Abort import + + + + + Ignore row + + + + + Replace existing row + + + + + Conflict strategy + + + + + Deselect All Deseleccionar Todo - + Match Similar Emparejar Similares - + Select All Seleccionar Todo @@ -1482,32 +2467,37 @@ Ya hay una tabla con ese nombre. ¿Quiere importar los datos en ella? - + Import completed Importación completada - + There is already a table named '%1' and an import into an existing table is only possible if the number of columns match. - Ya existe una tabla con nombre «%1» y una importación a una tabla existente sólo es posible si el número de columnas coincide. + Ya existe una tabla con nombre «%1» y una importación a una tabla existente solo es posible si el número de columnas coincide. - + There is already a table named '%1'. Do you want to import the data into it? - Ya existe una tabla con nombre '%1'. ¿Desea importar los datos cargándolos en ella? + Ya existe una tabla con nombre «%1». ¿Desea importar los datos cargándolos en ella? - + Creating restore point failed: %1 Creación del punto de restauración fallido: %1 - + Creating the table failed: %1 Creación de la tabla fallido: %1 - + + importing CSV + importando CSV + + + Importing the file '%1' took %2ms. Of this %3ms were spent in the row function. Importar el archivo '%1' llevó %2ms. De ellos, %3ms se gastaron en la función fila. @@ -1516,7 +2506,7 @@ Falta el campo para el registro %1 - + Inserting row failed: %1 Inserción de línea fallido: %1 @@ -1526,15 +2516,14 @@ DB Browser for SQLite - DB Browser para SQLite + DB Browser for SQLite Database &Structure E&structura de la Base de Datos - - + toolBar1 toolBar1 @@ -1547,56 +2536,478 @@ Tabla: - + Select a table to browse data - Seleccione una tabla para navegar + Seleccione una tabla para ver sus datos - + Use this list to select a table to be displayed in the database view Use esta lista para seleccionar la tabla a mostrar en la vista de la base de datos - Refresh the data in the selected table. - Refresca los datos de la tabla seleccionada. + Refresca los datos de la tabla seleccionada. - + This button refreshes the data in the currently selected table. Este botón refresca los datos de la tabla actualmente seleccionada. - + + <html><head/><body><p>This button creates a new record in the database. Hold the mouse button to open a pop-up menu of different options:</p><ul><li><span style=" font-weight:600;">New Record</span>: insert a new record with default values in the database.</li><li><span style=" font-weight:600;">Insert Values...</span>: open a dialog for entering values before they are inserted in the database. This allows to enter values acomplishing the different constraints. This dialog is also open if the <span style=" font-weight:600;">New Record</span> option fails due to these constraints.</li></ul></body></html> + <html><head/><body><p>Este botón crea un nuevo registro en la base de datos. Mantenga pulsado el botón del ratón para abrir un menú emergente con varias opciones:</p><ul><li><span style=" font-weight:600;">Nuevo Registro</span>: inserta en la base de datos un nuevo registro con valores por defecto.</li><li><span style=" font-weight:600;">Introduce Valores...</span>: abre un diálogo para introducir valores antes de insertarlos en la base de datos. Esto permite introducir valores que cumplan con las restricciones. Este diálogo también se abre si la opción de <span style=" font-weight:600;">Nuevo Registro</span> falla debido a esas restricciones.</li></ul></body></html> + + + + This button deletes the record or records currently selected in the table + Este botón borra el registro seleccionado (o los registros seleccionados) actualmente en la base de datos + + + + This is the database table view. You can do the following actions: + - Start writing for editing inline the value. + - Double-click any record to edit its contents in the cell editor window. + - Alt+Del for deleting the cell content to NULL. + - Ctrl+" for duplicating the current record. + - Ctrl+' for copying the value from the cell above. + - Standard selection and copy/paste operations. + Este es el visor de la tabla de la base de datos. Puede realizar lo siguiente: + - Escribir y editar valores. + - Doble-clic en cualquier registro para editar su contenido en la ventana del editor de celdas. + - Alt+Supr para borrar el contenido de la celda a NULL. + - Ctrl+" para duplicar el registro actual. + - Ctrl+' para copiar el valor de la celda de arriba. + - Las operaciones de copiar y pegar usuales. + + + Scroll one page upwards Retroceder una página - + <html><head/><body><p>Clicking this button navigates one page of records upwards in the table view above.</p></body></html> <html><head/><body><p>Al pulsar este botón se retrocede una página de registros en la vista de tabla superior.</p></body></html> - + Scroll one page downwards Avanzar una página - + <html><head/><body><p>Clicking this button navigates one page of records downwards in the table view above.</p></body></html> <html><head/><body><p>Al pulsar este botón se avanza una página de registros en la vista de tabla superior.</p></body></html> - + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_automatic_index">Automatic Index</a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_automatic_index">Indexado automático</a></p></body></html> + + + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_foreign_keys">Foreign Keys</a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_foreign_keys">Claves foráneas</a></p></body></html> + + + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_ignore_check_constraints">Ignore Check Constraints</a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_ignore_check_constraints">Ignorar Check Constraints</a></p></body></html> + + + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_journal_mode">Journal Mode</a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_journal_mode">Modo journal</a></p></body></html> + + + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_journal_size_limit">Journal Size Limit</a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_journal_size_limit">Límite de tamaño del journal</a></p></body></html> + + + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_locking_mode">Locking Mode</a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_locking_mode">Modo de bloqueo</a></p></body></html> + + + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_max_page_count">Max Page Count</a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_max_page_count">Máx. número de páginas</a></p></body></html> + + + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_page_size">Page Size</a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_page_size">Tamaño de página</a></p></body></html> + + + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_recursive_triggers">Recursive Triggers</a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_recursive_triggers">Disparadores recursivos</a></p></body></html> + + + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_secure_delete">Secure Delete</a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_secure_delete">Borrado seguro</a></p></body></html> + + + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_synchronous">Synchronous</a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_synchronous">Síncrono</a></p></body></html> + + + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_temp_store">Temp Store</a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_temp_store">Almacenamiento temporal</a></p></body></html> + + + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_user_version">User Version</a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_user_version">Versión de usuario</a></p></body></html> + + + + This button clears the contents of the SQL logs + Este botón limpia el contenido del historial SQL + + + + This panel lets you examine a log of all SQL commands issued by the application or by yourself + Este panel le permite examinar el histórico de todos los comandos SQL ordenados por la aplicación o por usted mismo + + + This is the structure of the opened database. +You can drag multiple object names from the Name column and drop them into the SQL editor. +You can drag SQL statements from the Schema column and drop them into the SQL editor or into other applications. + + Esta es la estructura de la base de datos abierta. +Usted puede arrastrar varios nombres de objetos desde la columna «Nombre» y soltarlos en el editor SQL. +También puede arrastrar varias sentencias SQL desde la columna «Esquema» y soltarlos en el editor SQL o en otra aplicación. + + + + + Project Toolbar + Barra de herramientas de proyectos + + + + Extra DB toolbar + Barra de herramientas extra + + + + + + Close the current database file + Cierra el archivo de base de datos actual + + + + This button closes the connection to the currently open database file + Este botón cierra la conexión con el archivo de base de datos actualmente abierto + + + + Compact &Database... + Compactar base de &datos... + + + + &About + &Acerca de + + + + This button opens a new tab for the SQL editor + Este botón abre una nueva pestaña para el editor SQL + + + + Execute all/selected SQL + Ejecuta todo el SQL (o la selección) + + + + This button executes the currently selected SQL statements. If no text is selected, all SQL statements are executed. + Este botón ejecuta las sentencias SQL actualmente seleccionadas. Si no hay ningún texto seleccionado, se ejecutan todas las sentencias. + + + + This button opens a file containing SQL statements and loads it in a new editor tab + Este botón abre un archivo que contenga sentencias SQL y las carga en una pestaña nueva del editor + + + + &Load Extension... + &Cargar extensión... + + + + This button executes the SQL statement present in the current editor line + Este botón ejecuta la sentencia SQL presente en la línea actual del editor + + + + &Wiki + &Wiki + + + + Bug &Report... + &Informar de fallos... + + + + Feature Re&quest... + Solicitud de &mejoras... + + + + Web&site + &Sitio web + + + + &Donate on Patreon... + &Donar en Patreon... + + + + Sa&ve Project... + &Guardar proyecto... + + + + This button lets you save all the settings associated to the open DB to a DB4S project file + Este botón le permite guardar todos los ajustes asociados a la base de datos abierta a un archivo de proyecto DB4S + + + + Open &Project... + Abrir &proyecto... + + + + This button lets you open a DB4S project file + Este botón le permite abrir un archivo de proyecto DB4S + + + + &Attach Database... + Ane&xar base de datos... + + + + + Add another database file to the current database connection + Añade un archivo de base de datos adicional a la conexión actual + + + + This button lets you add another database file to the current database connection + Este botón le permite añadir otro archivo de base de datos a la conexión de base de datos actual + + + + &Set Encryption... + &Establecer cifrado... + + + + This button saves the content of the current SQL editor tab to a file + Este botón guarda el contenido de la pestaña actual del editor SQL a un archivo + + + + SQLCipher &FAQ + SQLCipher &FAQ + + + + Ctrl+H + Ctrl+H + + + + Insert Values... + Introducir valores... + + + + + Open a dialog for inserting values in a new record + Abre un diálogo para introducir valores en un nuevo registro + + + + + Insert new record using default values in browsed table + Inserta un nuevo registro usando valores por defecto en la tabla visualizada + + + + New In-&Memory Database + Nueva base de datos en &memoria + + + + Drag && Drop Qualified Names + Arrastrar y soltar nombres calificados + + + + + Use qualified names (e.g. "Table"."Field") when dragging the objects and dropping them into the editor + Usa nombres calificados (p.ej. "Tabla"."Campo") al arrastrar los objetos y soltarlos en el editor + + + + Drag && Drop Enquoted Names + Arrastrar y soltar nombres entrecomillados + + + + + Use escaped identifiers (e.g. "Table1") when dragging the objects and dropping them into the editor + Usa identificadores escapados (p.ej. "Tabla1") al arrastrar los objetos y soltarlos en el editor + + + + &Integrity Check + Comprobar &integridad + + + + Runs the integrity_check pragma over the opened database and returns the results in the Execute SQL tab. This pragma does an integrity check of the entire database. + Ejecuta el pragma integrity_check en la base de datos abierta y devuelve los resultados en la pestaña Ejecutar SQL. Este pragma realiza una comprobación de integridad de toda la base de datos. + + + + &Foreign-Key Check + Comprobar clave &foránea + + + + Runs the foreign_key_check pragma over the opened database and returns the results in the Execute SQL tab + Ejecuta el pragma foreign_key_check con la base de datos abierta y devuelve los resultados en la pestaña Ejecutar SQL. + + + + &Quick Integrity Check + Comprobar integridad &rápido + + + + Run a quick integrity check over the open DB + Ejecuta una comprobación de integridad rápida en la base de datos abierta + + + + Runs the quick_check pragma over the opened database and returns the results in the Execute SQL tab. This command does most of the checking of PRAGMA integrity_check but runs much faster. + Ejecuta el pragma quick_check en la base de datos abierta y devuelve los resultados en la pestaña Executar SQL. Este comando hace la mayoría de comprobaciones de PRAGMA integrity_check pero se ejecuta mucho más rápido. + + + + &Optimize + &Optimizar + + + + Attempt to optimize the database + Intenta optimizar la base de datos + + + + Runs the optimize pragma over the opened database. This pragma might perform optimizations that will improve the performance of future queries. + Ejecuta el pragma optimize en la base de datos abierta. Este pragma realiza optimizaciones que pueden mejorar el rendimiento de consultas futuras. + + + + + Print + Imprimir + + + + Print text from current SQL editor tab + Imprime el texto de la pestaña actual del editor SQL + + + + Open a dialog for printing the text in the current SQL editor tab + Abre un diálogo para imprimir el texto de la pestaña actual del editor SQL + + + + Print the structure of the opened database + Imprime la estructura de la base de datos abierta + + + + Open a dialog for printing the structure of the opened database + Abre un diálogo para imprimir la estructura de la base de datos abierta + + + + Un/comment block of SQL code + + + + + Comment or uncomment current line or selected block of code + + + + + Comment or uncomment the selected lines or the current line, when there is no selection. All the block is toggled according to the first line. + + + + + Ctrl+/ + + + + + Stop SQL execution + + + + + Stop the currently running SQL script + + + SQLCipher &FAQ... - &FAQ de SQLCipher... + &FAQ de SQLCipher... + + + + Shows or hides the Project toolbar. + Muestra u oculta la barra de herramientas de proyecto. + + + + Extra DB Toolbar + Barra de herramientas extra + + + + + Export the filtered data to CSV + Exportar los datos filtrados a CSV + + + + This button exports the data of the browsed table as currently displayed (after filters, display formats and order column) as a CSV file. + Este botón exporta los datos de la tabla mostrada tal como se presentan (después de filtros, formatos de presentación y columna de orden) como un archivo CSV. + + + + + Save the current filter, sort column and display formats as a view + Guardar el filtro actual, la columna de orden y los formatos de presentación como una vista + + + + This button saves the current setting of the browsed table (filters, display formats and order column) as an SQL view that you can later browse or use in SQL statements. + Este botón guarda los ajustes actuales de la tabla visualizada (filtros, formatos de presentación y la columna de orden) como una vista SQL que más tarde puede visualizar o usar en sentencias SQL. Table(s) to JSON... Tabla(s) a JSON... - + Export one or more table(s) to a JSON file Exportar una o más tablas a un archivo JSON @@ -1609,72 +3020,114 @@ Guardar al Remoto - + Refresh Refrescar - + F5 F5 - + Clear all filters Borra todos los filtros - + + This is the structure of the opened database. +You can drag SQL statements from an object row and drop them into other applications or into another instance of 'DB Browser for SQLite'. + + Esta es la estructura de la base de datos abierta. +Usted puede arrastrar sentencias SQL desde una fila de objeto y soltarlas en otras aplicaciones o en otra instancia de «DB Browser for SQLite». + + + &Table: &Tabla: - + + Refresh the data in the selected table + Refresca los datos en la tabla seleccionada + + + + This button clears all the filters set in the header input fields for the currently browsed table. + Este botón elimina todos los filtros establecidos en la cabecera para la tabla actualmente mostrada. + + + + Save the table as currently displayed + Guarda la tabla tal como se presenta + + + + <html><head/><body><p>This popup menu provides the following options applying to the currently browsed and filtered table:</p><ul style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;"><li style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Export to CSV: this option exports the data of the browsed table as currently displayed (after filters, display formats and order column) to a CSV file.</li><li style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Save as view: this option saves the current setting of the browsed table (filters, display formats and order column) as an SQL view that you can later browse or use in SQL statements.</li></ul></body></html> + <html><head/><body><p>Este menú contextual provee las siguientes opciones que se aplican a la tabla actualmente visualizada y filtrada:</p><ul style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;"><li style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Exportar a CSV: esta opción exporta los datas de la tabla tal cual se presentan actualmente (después de filtros, formatos de presentación y columna de orden) a un archivo CSV.</li><li style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Guardar como vista: esta opción guarda la configuración actual de la tabla visualizada (filtros, formatos de presentación y columna de orden) como una vista SQL que usted luego puede visualizar o usar en sentencias SQL.</li></ul></body></html> + + + + ... + ... + + + + Print currently browsed table data + Imprime los datos de la tabla mostrada actualmente + + + + Print currently browsed table data. Print selection if more than one cell is selected. + Imprime los datos de la tabla mostrada actualmente. Imprime la selección si se ha seleccionado más de una celda. + + + Insert a new record in the current table Inserta un nuevo registro en la tabla actual - This button creates a new, empty record in the database - Este botón crea un nuevo registro vacío en la base de datos + Este botón crea un nuevo registro vacío en la base de datos - + + New Record Nuevo registro - + Delete the current record Borra el registro actual - This button deletes the record currently selected in the database - Este botón borra el registro actualmente seleccionado en la base de datos + Este botón borra el registro actualmente seleccionado en la base de datos - + + Delete Record Borrar registro - This is the database view. You can double-click any record to edit its contents in the cell editor window. - Esta es la vista de la base de datos. Puede hacer doble-click sobre cualquier registro para editar su contenido en la ventana del editor de celdas. + Esta es la vista de la base de datos. Puede hacer doble-clic sobre cualquier registro para editar su contenido en la ventana del editor de celdas. - + <html><head/><body><p>Scroll to the beginning</p></body></html> <html><head/><body><p>Desplazarse hasta el principio</p></body></html> - + <html><head/><body><p>Clicking this button navigates to the beginning in the table view above.</p></body></html> <html><head/><body><p>Pulsando este botón se mueve hasta el principio en la vista de tabla de arriba.</p></body></html> - + |< |< @@ -1687,12 +3140,12 @@ <html><head/><body><p>Pulsando este botón se desplaza 100 registros hacia arriba en la vista de tabla de arriba.</p></body></html> - + < < - + 0 - 0 of 0 0 - 0 de 0 @@ -1705,52 +3158,52 @@ <html><head/><body><p>Pulsando este botón se desplaza 100 registros hacia abajo en la vista de tabla de arriba.</p></body></html> - + > > - + Scroll to the end Desplazarse hasta el final - + <html><head/><body><p>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Clicking this button navigates up to the end in the table view above.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</p></body></html> <html><head/><body><p>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Pulsando este botón se mueve hasta el final en la vista de tabla de arriba.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</p></body></html> - + >| >| - + <html><head/><body><p>Click here to jump to the specified record</p></body></html> Pulse aquí para saltar al registro especificado - + <html><head/><body><p>This button is used to navigate to the record number specified in the Go to area.</p></body></html> <html><head/><body><p>Este botón se usa para moverse al número de registro especificado en la casilla Ir a.</p></body></html> - + Go to: Ir a: - + Enter record number to browse - Introduzca el número de registro para navegar + Introduzca el número de registro al que navegar - + Type a record number in this area and click the Go to: button to display the record in the database view - Escriba un número de registro en esta casilla y haga click en el botón Ir a: para mostrar el registro en la vista de la base de datos + Escriba un número de registro en esta casilla y haga clic en el botón «Ir a:» para mostrar el registro en la vista de la base de datos - + 1 1 @@ -1759,211 +3212,195 @@ Editar &Pragmas - - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_auto_vacuum"><span style=" text-decoration: underline; color:#0000ff;">Auto Vacuum</span></a></p></body></html> - - - - None - Ninguno + Ninguno - - Full - Completo + Completo - Incremental - Incremental + Incremental - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_automatic_index"><span style=" text-decoration: underline; color:#0000ff;">Automatic Index</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_automatic_index"><span style=" text-decoration: underline; color:#0000ff;">Indexado Automático</span></a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_automatic_index"><span style=" text-decoration: underline; color:#0000ff;">Indexado Automático</span></a></p></body></html> - - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_checkpoint_fullfsync"><span style=" text-decoration: underline; color:#0000ff;">Checkpoint Full FSYNC</span></a></p></body></html> - - - - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_foreign_keys"><span style=" text-decoration: underline; color:#0000ff;">Foreign Keys</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_foreign_keys"><span style=" text-decoration: underline; color:#0000ff;">Claves foráneas</span></a></p></body></html> - - - - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_fullfsync"><span style=" text-decoration: underline; color:#0000ff;">Full FSYNC</span></a></p></body></html> - + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_foreign_keys"><span style=" text-decoration: underline; color:#0000ff;">Claves foráneas</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_ignore_check_constraints"><span style=" text-decoration: underline; color:#0000ff;">Ignore Check Constraints</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_ignore_check_constraints"><span style=" text-decoration: underline; color:#0000ff;">Ignorar Check Constraints</span></a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_ignore_check_constraints"><span style=" text-decoration: underline; color:#0000ff;">Ignorar Check Constraints</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_journal_mode"><span style=" text-decoration: underline; color:#0000ff;">Journal Mode</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_journal_mode"><span style=" text-decoration: underline; color:#0000ff;">Modo Journal</span></a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_journal_mode"><span style=" text-decoration: underline; color:#0000ff;">Modo Journal</span></a></p></body></html> - Delete - Borrar + Borrar - Truncate - Truncar + Truncar - Persist - Persistente + Persistente - - Memory - Memoria + Memoria - WAL - WAL + WAL - - Off - Apagado + Apagado - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_journal_size_limit"><span style=" text-decoration: underline; color:#0000ff;">Journal Size Limit</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_journal_size_limit"><span style=" text-decoration: underline; color:#0000ff;">Límite de tamaño del Journal</span></a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_journal_size_limit"><span style=" text-decoration: underline; color:#0000ff;">Límite de tamaño del Journal</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_locking_mode"><span style=" text-decoration: underline; color:#0000ff;">Locking Mode</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_locking_mode"><span style=" text-decoration: underline; color:#0000ff;">Modo de Bloqueo</span></a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_locking_mode"><span style=" text-decoration: underline; color:#0000ff;">Modo de Bloqueo</span></a></p></body></html> - - Normal - Normal + Normal - Exclusive - Exclusivo + Exclusivo - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_max_page_count"><span style=" text-decoration: underline; color:#0000ff;">Max Page Count</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_max_page_count"><span style=" text-decoration: underline; color:#0000ff;">Máximo número de Páginas</span></a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_max_page_count"><span style=" text-decoration: underline; color:#0000ff;">Máximo número de Páginas</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_page_size"><span style=" text-decoration: underline; color:#0000ff;">Page Size</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_page_size"><span style=" text-decoration: underline; color:#0000ff;">Tamaño de Página</span></a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_page_size"><span style=" text-decoration: underline; color:#0000ff;">Tamaño de Página</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_recursive_triggers"><span style=" text-decoration: underline; color:#0000ff;">Recursive Triggers</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_recursive_triggers"><span style=" text-decoration: underline; color:#0000ff;">Disparadores Recursivos</span></a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_recursive_triggers"><span style=" text-decoration: underline; color:#0000ff;">Disparadores Recursivos</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_secure_delete"><span style=" text-decoration: underline; color:#0000ff;">Secure Delete</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_secure_delete"><span style=" text-decoration: underline; color:#0000ff;">Borrado Seguro</span></a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_secure_delete"><span style=" text-decoration: underline; color:#0000ff;">Borrado Seguro</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_synchronous"><span style=" text-decoration: underline; color:#0000ff;">Synchronous</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_synchronous"><span style=" text-decoration: underline; color:#0000ff;">Síncrono</span></a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_synchronous"><span style=" text-decoration: underline; color:#0000ff;">Síncrono</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_temp_store"><span style=" text-decoration: underline; color:#0000ff;">Temp Store</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_temp_store"><span style=" text-decoration: underline; color:#0000ff;">Almacenamiento Temporal</span></a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_temp_store"><span style=" text-decoration: underline; color:#0000ff;">Almacenamiento Temporal</span></a></p></body></html> - Default - Por defecto + Por defecto - File - Archivo + Archivo - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_user_version"><span style=" text-decoration: underline; color:#0000ff;">User Version</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_user_version"><span style=" text-decoration: underline; color:#0000ff;">Versión de Usuario</span></a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_user_version"><span style=" text-decoration: underline; color:#0000ff;">Versión de Usuario</span></a></p></body></html> - - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_wal_autocheckpoint"><span style=" text-decoration: underline; color:#0000ff;">WAL Auto Checkpoint</span></a></p></body></html> - - - - + Table(&s) to JSON... Tabla(&s) a JSON... - - Open Data&base Read Only... - Abrir &base de datos como sólo lectura... + + Open Data&base Read Only... + Abrir &base de datos como solo lectura... + + + + Save results + Guardar resultados + + + + Save the results view + Guarda la vista de resultados + + + + This button lets you save the results of the last executed query + Este botón le permite guardar los resultados de la última consulta ejecutada + + + + + Find text in SQL editor + Buscar texto en el editor SQL + + + + This button opens the search bar of the editor + Este botón abre la barra de búsqueda en el editor + + + + Ctrl+F + Ctrl+F - - Save results - Guardar resultados + + + Find or replace text in SQL editor + Buscar o reemplazar texto en el editor SQL - - Save the results view - Guardar la vista de resultados + + This button opens the find/replace dialog for the current editor tab + Este botón abre el diálogo de buscar/reemplazar para la pestaña actual del editor - + + Export to &CSV Exportar a &CSV - + + Save as &view Guardar como &vista - + Save as view Guardar como vista - + Hide column(s) Ocultar columna(s) - + Hide selected column(s) Ocultar columna(s) seleccionada(s) - + Show all columns Mostrar todas las columnas - + Show all columns that were hidden Mostrar todas las columnas que están ocultas @@ -1972,17 +3409,17 @@ &Abrir Base de Datos como Sólo Lectura... - + Open an existing database file in read only mode - Abre una Base de Datos existente en modo de sólo lectura + Abre una base de datos existente en modo de solo lectura - + Unlock view editing Desbloquear edición de vistas - + This unlocks the current view for editing. However, you will need appropriate triggers for editing. Esto desbloquea la vista actual para edición. Aunque para la edición se necesitarán los disparadores adecuados. @@ -1991,17 +3428,17 @@ E&jecutar SQL - + &File &Archivo - + &Import &Importar - + &Export E&xportar @@ -2010,119 +3447,135 @@ Remoto - + &Edit &Editar - + &View &Ver - + &Help Ay&uda - + + &Tools + &Herramientas + + + DB Toolbar DB Toolbar - + Edit Database &Cell Editar &celda - + DB Sche&ma Esque&ma - + + This is the structure of the opened database. +You can drag multiple object names from the Name column and drop them into the SQL editor and you can adjust the properties of the dropped names using the context menu. This would help you in composing SQL statements. +You can drag SQL statements from the Schema column and drop them into the SQL editor or into other applications. + + Esta es la estructura de la base de datos abierta. +Puede arrastrar múltiples objetos de la columna Nombre, soltarlos en el editor SQL y ajustar sus propiedades usando el menú contextual. Esto le ayudará a componer sentencias SQL. +Puede arrastrar sentencias SQL desde la columna Esquema y soltarlas en el editor SQL o en otras aplicaciones. + + + + &Remote &Remoto - - Execute SQL [F5, Ctrl+Return, Ctrl+R] - Ejecuta SQL [F5, Ctrl+Intro, Ctrl+R] + + + Execute SQL + This has to be equal to the tab title in all the main tabs + Ejecuta SQL - &Load extension - &Cargar extension + &Cargar extensión - - Execute current line [Shift+F5] - Ejecuta la línea actual [Shift+F5] + + + Execute current line + Ejecuta la línea actual - + Shift+F5 Shift+F5 - Sa&ve Project - &Guardar proyecto + &Guardar proyecto - Open &Project - Abrir &proyecto + Abrir &proyecto - &Set Encryption - &Definir cifrado + &Definir cifrado - + Edit display format Editar el formato de presentación - + Edit the display format of the data in this column Editar el formato de presentación de los datos en esta columna - + Show rowid column Mostrar la columna rowid - + Toggle the visibility of the rowid column Cambia la visibilidad de la columna rowid - - + + Set encoding Definir codificación - + Change the encoding of the text in the table cells Cambia la codificación del texto de las celdas de la tabla - + Set encoding for all tables Definir la codificación para todas las tablas - + Change the default encoding assumed for all tables in the database Cambia la codificación por defecto para todas las tablas en la base de datos + Duplicate record - Registro duplicado + Duplicar registro SQL Log @@ -2133,17 +3586,17 @@ &Mostrar SQL enviado por - + User Usuario - + Application Aplicación - + &Clear &Limpiar @@ -2268,56 +3721,60 @@ Esquema de la base de datos - + &New Database... &Nueva base de datos... - - + + Create a new database file Crea un nuevo archivo de base de datos - + This option is used to create a new database file. Esta opción se usa para crear un nuevo archivo de base de datos. - + Ctrl+N Ctrl+N - + + &Open Database... &Abrir base de datos... - - - + + + + + Open an existing database file Abre un archivo de base de datos - - + + + This option is used to open an existing database file. Esta opción se usa para abrir un archivo de base de datos. - + Ctrl+O Ctrl+O - + &Close Database - &Cerrar la base de datos + &Cerrar base de datos - + Ctrl+W Ctrl+W @@ -2326,7 +3783,7 @@ FAQ de SQLCipher... - + Opens the SQLCipher FAQ in a browser window Abre la FAQ de SQLCipher en una ventana del navegador @@ -2335,12 +3792,13 @@ Deshacer cambios - + + Revert database to last saved state Deshace los cambios al último estado guardado - + This option is used to revert the current database file to its last saved state. All changes made since the last save operation are lost. Esta opción se usa para deshacer los cambios en la base de datos actual al último estado guardado. Todos los cambios hechos desde la última vez que se guardó se perderán. @@ -2349,17 +3807,18 @@ Escribir cambios - + + Write changes to the database file Escribe los cambios al archivo de la base de datos - + This option is used to save changes to the database file. Esta opción se usa para guardar los cambios en el archivo de la base de datos. - + Ctrl+S Ctrl+S @@ -2368,23 +3827,23 @@ Compactar base de datos - + Compact the database file, removing space wasted by deleted records Compacta el archivo de la base de datos eliminando el espacio malgastado por los registros borrados - - + + Compact the database file, removing space wasted by deleted records. Compacta el archivo de la base de datos, eliminando el espacio malgastado por los registros borrados. - + E&xit &Salir - + Ctrl+Q Ctrl+Q @@ -2393,12 +3852,12 @@ Base de datos en un archivo SQL... - + Import data from an .sql dump text file into a new or existing database. Importa datos de un archivo de texto con un volcado .sql en una base de datos nueva o existente. - + This option lets you import data from an .sql dump text file into a new or existing database. SQL dump files can be created on most database engines, including MySQL and PostgreSQL. Esta opción se usa para importar datos de un archivo de texto con un volcado .sql en una base de datos nueva o existente. Los archivos de volcado SQL se pueden crear en la mayoría de los motores de base de datos, incluyendo MySQL y PostgreSQL. @@ -2407,12 +3866,12 @@ Tabla de un archivo CSV... - + Open a wizard that lets you import data from a comma separated text file into a database table. Abre un asistente que le permite importar datos desde un archivo de texto con valores separado por comas a una tabla de una base de datos. - + Open a wizard that lets you import data from a comma separated text file into a database table. CSV files can be created on most database and spreadsheet applications. Abre un asistente que le permite importar datos desde un archivo de texto con valores separado por comas a una tabla de una base de datos. Los archivos CSV se pueden crear en la mayoría de las aplicaciones de bases de datos y hojas de cálculo. @@ -2421,12 +3880,12 @@ Base de datos a archivo SQL... - + Export a database to a .sql dump text file. Exporta la base de datos como un volcado .sql a un archivo de texto. - + This option lets you export a database to a .sql dump text file. SQL dump files contain all data necessary to recreate the database on most database engines, including MySQL and PostgreSQL. Esta opción le permite exportar la base de datos como un volcado .sql a un archivo de texto. Los archivos de volcado SQL contienen todos los datos necesarios para recrear la base de datos en la mayoría de los motores de base de datos, incluyendo MySQL y PostgreSQL. @@ -2435,12 +3894,12 @@ Tabla(s) como un archivo CSV... - + Export a database table as a comma separated text file. Exporta la base de datos como un archivo de texto con valores separados por comas. - + Export a database table as a comma separated text file, ready to be imported into other database or spreadsheet applications. Exporta la base de datos como un archivo de texto con valores separados por comas, listo para ser importado en otra base de datos o aplicaciones de hoja de cálculo. @@ -2449,7 +3908,7 @@ Crear Tabla... - + Open the Create Table wizard, where it is possible to define the name and fields for a new table in the database Abre el asistente para Crear una Tabla, donde se puede definir el nombre y los campos de una nueva tabla en la base de datos @@ -2458,53 +3917,52 @@ Borrar Tabla... - - - + + Delete Table - Borrar Tabla + Borrar tabla - + Open the Delete Table wizard, where you can select a database table to be dropped. - Abre el asistente para Borrar una Tabla, donde se puede seleccionar una tabla de la base de datos para borrar. + Abre el asistente para «Borrar tabla», donde se puede seleccionar una tabla de la base de datos para borrar. Modify Table... Modificar Tabla... - + Open the Modify Table wizard, where it is possible to rename an existing table. It is also possible to add or delete fields form a table, as well as modify field names and types. - Abre el asistente para Modificar una Tabla, donde se puede renombrar una tabla existente de la base de datos. También se pueden añadir o borrar campos de la tabla, así como modificar los nombres de los campos y sus tipos. + Abre el asistente «Modificar tabla», donde se puede renombrar una tabla existente de la base de datos. También se pueden añadir o borrar campos de la tabla, así como modificar los nombres de los campos y sus tipos. Create Index... Crear Índice... - + Open the Create Index wizard, where it is possible to define a new index on an existing database table. - Abre el asistente para Crear un Índice, donde se puede definir un nuevo índice de una tabla existente de la base de datos. + Abre el asistente «Crear índice», donde se puede definir un nuevo índice de una tabla existente de la base de datos. - + &Preferences... &Preferencias... - - + + Open the preferences window. Abrir la ventana de preferencias. - + &DB Toolbar &Barra de herramientas - + Shows or hides the Database toolbar. Muestra u oculta la barra de herramientas de la base de datos. @@ -2513,148 +3971,151 @@ ¿Qué es esto? - + Shift+F1 Shift+F1 - &About... - &Acerca de... + &Acerca de... - + &Recently opened Archivos &recientes - + Open &tab Abrir &pestaña - - + Ctrl+T Ctrl+T - + + Database Structure + This has to be equal to the tab title in all the main tabs Estructura - + + Browse Data + This has to be equal to the tab title in all the main tabs Hoja de datos - + + Edit Pragmas + This has to be equal to the tab title in all the main tabs Editar pragmas - - Execute SQL - Ejecutar SQL + <html><head/><body><p><a href="https://www.sqlite.org/pragma.html#pragma_case_sensitive_like">Case Sensitive Like</a></p></body></html> + <html><head/><body><p><a href="https://www.sqlite.org/pragma.html#pragma_case_sensitive_like">Like sensible a mayúsculas</a></p></body></html> + + + + Warning: this pragma is not readable and this value has been inferred. Writing the pragma might overwrite a redefined LIKE provided by an SQLite extension. + Aviso: este pragma no es legible y este valor se ha supuesto. Escribir el pragma puede sobreescribir un LIKE redefinido que proporcione una extensión de SQLite. Edit Database Cell Editar Celda de la Base de datos - + SQL &Log Historial de &SQL - + Show S&QL submitted by Mostrar S&QL ejecutado por - + &Plot &Gráfica - + &Revert Changes &Deshacer cambios - + &Write Changes &Guardar cambios - Compact &Database - Compactar base de &datos + Compactar base de &datos - + &Database from SQL file... Base de datos de &archivo SQL... - + &Table from CSV file... &Tabla de archivo CSV... - + &Database to SQL file... &Base de datos a archivo SQL... - + &Table(s) as CSV file... &Tabla(s) a archivo CSV... - + &Create Table... &Crear tabla... - + &Delete Table... &Borrar tabla... - + &Modify Table... &Modificar tabla... - + Create &Index... Crear &índice... - + W&hat's This? ¿&Qué es esto? - + &Execute SQL &Ejecutar SQL - Execute SQL [F5, Ctrl+Return] - Ejecuta SQL [F5, Ctrl+Return] - - - + Open SQL file Abrir archivo SQL - - - + + + Save SQL file Guardar archivo SQL @@ -2663,147 +4124,135 @@ Cargar extensión - - Execute current line - Ejecutar la línea actual - - - Execute current line [Ctrl+E] - Ejecuta la línea actual [Ctrl+E] - - - + Ctrl+E Ctrl+E - + Export as CSV file Exportar como archivo CSV - + Export table as comma separated values file Exportar tabla como archivo de valores separados por comas - &Wiki... - &Wiki... + Wi&ki... - Bug &report... - Informe de &fallos... + Informe de &fallos... - Web&site... - Sitio &web... + Sitio &web... Save Project Guardar Proyecto - - + + Save the current session to a file - Guardar la sesión actual en un archivo + Guarda la sesión actual en un archivo Open Project Abrir Proyecto - - + + Load a working session from a file Carga una sesión de trabajo de un archivo - &Attach Database - Asocia&rse a base de datos + Ane&xar base de datos Set Encryption Definir Cifrado - - + + Save SQL file as Guardar archivo SQL como - + &Browse Table - &Navegar por la tabla + &Mostrar datos - + Copy Create statement - Copiar comando Create + Copiar sentencia CREATE - + Copy the CREATE statement of the item to the clipboard - Copia el comando CREATE del ítem al portapapeles + Copia la sentencia CREATE del ítem al portapapeles - + Ctrl+Return Ctrl+Return - + Ctrl+L Ctrl+L - + + Ctrl+P Ctrl+P - + Ctrl+D Ctrl+D - + Ctrl+I Ctrl+I - + Encrypted Cifrado - + Read only - Sólo lectura + Solo lectura - + Database file is read only. Editing the database is disabled. - El archivo de la base de datos es de sólo lectura. La edición de la base de datos está desactivada. + El archivo de la base de datos es de solo lectura. La edición de la base de datos está desactivada. - + Database encoding Codificación de la base de datos - + Database is encrypted using SQLCipher La base de datos está cifrada usando SQLCipher - - + + Choose a database file Seleccione un archivo de base de datos @@ -2816,55 +4265,54 @@ Formato de archivo inválido. - - - + + + Choose a filename to save under Seleccione un nombre de archivo en el que guardar - Error adding record: - Error añadiendo registro: + Error añadiendo registro: - + Error deleting record: %1 Error borrando registro: %1 - + Please select a record first Por favor, antes seleccione un registro - + %1 - %2 of %3 %1 - %2 de %3 - - + + There is no database opened. Please open or create a new database file. No hay una base de datos abierta. Por favor, abra o cree un nuevo archivo de base de datos. - Are you sure you want to delete the %1 '%2'? All data associated with the %1 will be lost. - ¿Está seguro de que quiere borrar: %1 '%2'? -Se perderán todos los datos asociados con %1. + This is a bad case for translation. %1 is not translatable and if it would be, the genus would produce inconsistencies in some languages + ¿Está seguro de que quiere borrar el objeto «%2» de tipo: %1? +Se perderán todos los datos asociados con «%2». - Error: could not delete the %1. Message from database engine: %2 - Error: no se pudo borrar el %1. Mensaje de la base de datos: -%2 + This is a bad case for translation. %1 is not translatable and if it would be, the genus would produce inconsistencies in some languages + Error: no se pudo borrar el objeto de tipo: %1. Mensaje de la base de datos: +«%2» There is no database opened. @@ -2875,35 +4323,31 @@ %1 líneas devueltas de: %3 (tardó %2ms) - Error executing query: %1 - Error ejecutando la consulta: %1 + Error ejecutando la consulta: %1 Query executed successfully: %1 (took %2ms) Consulta ejecutada con éxito: %1 (tardó %2ms) - %1 rows returned in %2ms from: %3 - %1 líneas devueltas en %2ms de: %3 + %1 líneas devueltas en %2ms de: %3 - , %1 rows affected - , %1 líneas afectadas + , %1 líneas afectadas - Query executed successfully: %1 (took %2ms%3) - Consulta ejecutada con éxito: %1 (tardó %2ms%3) + Consulta ejecutada con éxito: %1 (tardó %2ms%3) Choose a text file Seleccione un archivo de texto - + Text files(*.csv *.txt);;All files(*) Archivos de texto(*.csv *.txt);;Todos los archivos(*) @@ -2912,7 +4356,7 @@ Importación completada - + Error while saving the database file. This means that not all changes to the database were saved. You need to resolve the following error first. %1 @@ -2920,197 +4364,431 @@ %1 - + Are you sure you want to undo all changes made to the database file '%1' since the last save? - ¿Está seguro de que quiere deshacer todos los cambios hechos al archivo de la base de datos '%1' desde la última vez que se guardó? + ¿Está seguro de que quiere deshacer todos los cambios hechos al archivo de la base de datos «%1» desde la última vez que se guardó? - + Choose a file to import Seleccione el archivo a importar - - - + + + Text files(*.sql *.txt);;All files(*) Archivos de texto(*.sql *.txt);;Todos los archivos(*) - + Do you want to create a new database file to hold the imported data? If you answer no we will attempt to import the data in the SQL file to the current database. ¿Quiere crear un nuevo archivo de base de datos donde poner los datos importados? Si responde no se intentarán importar los datos del archivo SQL en la base de datos actual. - + File %1 already exists. Please choose a different name. El archivo %1 ya existe. Por favor elija un nombre diferente. - + Error importing data: %1 Error importando datos: %1 - + Import completed. Importación completada. - - + Delete View Borrar vista - - + Modify View Modificar vista - - + Delete Trigger Borrar disparador - - + Modify Trigger Modificar disparador - - + Delete Index Borrar índice - - + Modify Index Modificar índice - - + Modify Table Modificar tabla - + &%1 %2 &%1 %2 - + + The statements in this tab are still executing. Closing the tab will stop the execution. This might leave the database in an inconsistent state. Are you sure you want to close the tab? + + + + + Extensions(*.so *.dylib *.dll);;All files(*) + Extensiones (*.so *.dylib *.dll);;Todos los archivos (*) + + + + Choose a project file to open + Seleccione un archivo de proyecto para abrir + + + + This project file is using an old file format because it was created using DB Browser for SQLite version 3.10 or lower. Loading this file format is still fully supported but we advice you to convert all your project files to the new file format because support for older formats might be dropped at some point in the future. You can convert your files by simply opening and re-saving them. + Este archivo de proyecto está usando un formato antiguo porque fue creado usando una versión 3.10 o inferior de «DB Browser for SQLite». La carga de este archivo aún está completamente soportada pero le recomendamos convertir todos sus archivos de proyecto al nuevo formato porque el soporte de formatos antiguos podría ser descartado en algún momento futuro. Usted puede convertir sus archivos simplemente abriéndolos y guardándolos de nuevo. + + + + Duplicate records + Duplicar registros + + + + Ctrl+" + Ctrl+" + + + Please enter a pseudo-primary key in order to enable editing on this view. This should be the name of a unique column in the view. Introduzca una clave pseudo-primaria para activar la edición en esta vista. Esta debería ser el nombre de una columna única en la vista. - + Collation needed! Proceed? ¡Es necesaria una función de comparación! ¿Proceder? - + A table in this database requires a special collation function '%1' that this application can't provide without further knowledge. If you choose to proceed, be aware bad things can happen to your database. Create a backup! - Una tabla en esta base de datos necesita una función de comparación especial '%1' que esta aplicación no puede proporcionar sin más información. + Una tabla en esta base de datos necesita una función de comparación especial «%1» que esta aplicación no puede proporcionar sin más información. Si decide continuar, está avisado de que la base de datos se puede dañar. ¡Cree una copia de respaldo! - + Setting PRAGMA values will commit your current transaction. Are you sure? Al definir los valores de PRAGMA se consolidará la transacción actual. ¿Está seguro? - + + Reset Window Layout + + + + + Alt+0 + + + + + The database is currenctly busy. + + + + + Click here to interrupt the currently running query. + + + + Could not open database file. Reason: %1 No se pudo abrir el archivo de base de datos. Razón: %1 - + + In-Memory database + Base de datos en memoria + + + + You are still executing SQL statements. When closing the database now the execution will be stopped. maybe leaving the database in an incosistent state. Are you sure you want to close the database? + + + + + determining row count... + determinando nº de filas... + + + + %1 - %2 of >= %3 + %1 - %2 de >= %3 + + + + Are you sure you want to delete the table '%1'? +All data associated with the table will be lost. + ¿Está seguro de que quiere borrar la tabla «%1»? +Se perderán todos los datos asociados con la tabla. + + + + Are you sure you want to delete the view '%1'? + ¿Está seguro de que quiere borrar la vista «%1»? + + + + Are you sure you want to delete the trigger '%1'? + ¿Está seguro de que quiere borrar el disparador «%1»? + + + + Are you sure you want to delete the index '%1'? + ¿Está seguro de que quiere borrar el índice «%1»? + + + + Error: could not delete the table. + Error: no se pudo borrar la tabla. + + + + Error: could not delete the view. + Error: no se pudo borrar la vista. + + + + Error: could not delete the trigger. + Error: no se pudo borrar el disparador. + + + + Error: could not delete the index. + Error: no se pudo borrar el índice. + + + + Message from database engine: +%1 + Mensaje de la base de datos: +%1 + + + + Editing the table requires to save all pending changes now. +Are you sure you want to save the database? + Para editar la tabla es necesario guardar antes todos los cambios pendientes. +¿Está seguro de que quiere guardar la base de datos? + + + + You are already executing SQL statements. Do you want to stop them in order to execute the current statements instead? Note that this might leave the database in an inconsistent state. + + + + + -- EXECUTING SELECTION IN '%1' +-- + -- EJECUTANDO SELECCIÓN DE «%1» +-- + + + + -- EXECUTING LINE IN '%1' +-- + -- EJECUTANDO LÍNEA DE «%1» +-- + + + + -- EXECUTING ALL IN '%1' +-- + -- EJECUTANDO TODO «%1» +-- + + + + -- At line %1: +%3 +-- Result: %2 + -- En la línea %1: +%4 +-- Resultado: %2 {1:?} {3 +?} + + + Setting PRAGMA values or vacuuming will commit your current transaction. Are you sure? Establecer valores PRAGMA o realizar una limpieza consolidará la transacción actual. ¿Está seguro? - + + Busy (%1) + + + Execution aborted by user - Ejecución abortada por el usuario + Ejecución abortada por el usuario + + + executing query + ejecutando consulta + + + + %1 rows returned in %2ms + %1 filas devueltas en %2ms + + + query executed successfully. Took %1ms%2 + consulta ejecutada con éxito. Llevó %1ms%2 + + + -- At line %1: +%4 +-- Result: %3 + -- En la línea %1: +%4 +-- Resultado: %3 - + Choose text files Elija archivos de texto - + + Import completed. Some foreign key constraints are violated. Please fix them before saving. + Importación completada. Algunas restricciones de las claves foráneas se han infringido. Por favor arréglelas antes de guardar. + + + Select SQL file to open Seleccione el archivo SQL a abrir - + Couldn't read file: %1. No se pudo leer el archivo: %1. - + Couldn't save file: %1. No se pudo guardar el archivo: %1. - + Select file name Seleccione el nombre del archivo - + Select extension file - Selecione el archivo de extensión + Seleccione el archivo de extensión - Extensions(*.so *.dll);;All files(*) - Extensiones(*.so *.dll);;Todos los archivos(*) + Extensiones(*.so *.dll);;Todos los archivos(*) - + Extension successfully loaded. Extensiones cargadas con éxito. - - + Error loading extension: %1 Error cargando la extensión: %1 - + + Don't show again No volver a mostrar - + New version available. Hay una nueva versión disponible. - + A new DB Browser for SQLite version is available (%1.%2.%3).<br/><br/>Please download at <a href='%4'>%4</a>. - Hay disponible una nueva versión de DB Browser para SQLite (%1.%2.%3).<br/><br/>Por favor, descárguela de <a href='%4'>%4</a>. + Hay disponible una nueva versión de «DB Browser for SQLite» (%1.%2.%3).<br/><br/>Por favor, descárguela de <a href='%4'>%4</a>. + + + + creating collation + creando comparación + + + + Set a new name for the SQL tab. Use the '&&' character to allow using the following character as a keyboard shortcut. + Establezca el nuevo nombre para la pestaña SQL. Use el carácter «&&» para permitir usar el carácter siguiente como un atajo de teclado. + + + + Please specify the view name + Por favor, especifique el nombre de la vista + + + + There is already an object with that name. Please choose a different name. + Ya hay un objeto con ese nombre. Por favor, elija un nombre diferente. + + + + View successfully created. + Vista creada con éxito. + + + + Error creating view: %1 + Error creando la vista: %1 + + + + There is no filter set for this table. View will not be created. + No existe un filtro para esta tabla. La vista no será creada. + + + + Delete Records + Borrar registros + + + + This action will open a new SQL tab for running: + Esta acción abrirá una nueva pestaña SQL para ejecutar: + + + + Press Help for opening the corresponding SQLite reference page. + Pulse Ayuda para abrir la página correspondiente de la referencia de SQLite. Row # @@ -3133,35 +4811,54 @@ Por favor introduzca la URL del archivo de la base de datos a guardar. - Choose a file to open - Seleccione un archivo para abrir + Seleccione un archivo para abrir - - + + DB Browser for SQLite project file (*.sqbpro) - Archivo de proyecto de DB Browser para SQLite (*.sqbpro) + Archivo de proyecto de «DB Browser for SQLite» (*.sqbpro) - + Please choose a new encoding for this table. Por favor, elija una nueva codificación para esta tabla. - + Please choose a new encoding for all tables. Por favor, elija una nueva codificación para todas las tablas. - + + Error checking foreign keys after table modification. The changes will be reverted. + Error comprobando las claves foráneas tras la modificación de la tabla. Los cambios se desharán. + + + + This table did not pass a foreign-key check.<br/>You should run 'Tools | Foreign-Key Check' and fix the reported issues. + Esta tabla no ha pasado la comprobación de claves foráneas.<br/>Debería ejecutar 'Herramientas | Comprobar Claves foráneas' y arreglar los problemas mostrados. + + + + Execution finished with errors. + + + + + Execution finished without errors. + + + + %1 Leave the field empty for using the database encoding. %1 Deje este campo vacío para usar la codificación de la base de datos. - + This encoding is either not valid or not supported. Esta codificación no es válida o no está soportada. @@ -3175,6 +4872,19 @@ + NullLineEdit + + + Set to NULL + Poner a NULL + + + + Alt+Del + + + + PlotDock @@ -3182,183 +4892,279 @@ Gráfica - + + <html><head/><body><p>This pane shows the list of columns of the currently browsed table or the just executed query. You can select the columns that you want to be used as X or Y axis for the plot pane below. The table shows detected axis type that will affect the resulting plot. For the Y axis you can only select numeric columns, but for the X axis you will be able to select:</p><ul style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;"><li style=" margin-top:12px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Date/Time</span>: strings with format &quot;yyyy-MM-dd hh:mm:ss&quot; or &quot;yyyy-MM-ddThh:mm:ss&quot;</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Date</span>: strings with format &quot;yyyy-MM-dd&quot;</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Time</span>: strings with format &quot;hh:mm:ss&quot;</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Label</span>: other string formats. Selecting this column as X axis will produce a Bars plot with the column values as labels for the bars</li><li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Numeric</span>: integer or real values</li></ul><p>Double-clicking the Y cells you can change the used color for that graph.</p></body></html> + <html><head/><body><p>Esta tabla muestra la lista de columnas de la tabla actualmente visualizada o de la consulta recién ejecutada. Puede seleccionar las columnas que desea usar como ejes X o Y en el gráfico del panel inferior. La tabla muestra el tipo de eje detectado, el cual afectará al gráfico resultante. Para los ejes Y solo se pueden seleccionar columnas numéricas, pero para el eje X se pueden seleccionar :</p><ul style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;"><li style=" margin-top:12px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Fecha/Hora</span>: texto con formato &quot;aaaa-MM-dd hh:mm:ss&quot; o &quot;aaaa-MM-ddThh:mm:ss&quot;</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Fecha</span>: texto con formato &quot;aaaa-MM-dd&quot;</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Time</span>: texto con formato &quot;hh:mm:ss&quot;</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Etiqueta</span>: texto con otros formatos. Seleccionado esta columna como eje X se dibuja un gráfico de barras con los valores de la columna usados como etiquetas de las barras.</li><li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Numérico</span>: valores reales o enteros</li></ul><p>Haciendo doble clic sobre las celdas Y se puede cambiar el color usado para la gráfica correspondiente.</p></body></html> + + + Columns Columnas - + X X - + Y Y - _ - _ + _ + + + + Axis Type + Tipo de eje + + + + Here is a plot drawn when you select the x and y values above. + +Click on points to select them in the plot and in the table. Ctrl+Click for selecting a range of points. + +Use mouse-wheel for zooming and mouse drag for changing the axis range. + +Select the axes or axes labels to drag and zoom only in that orientation. + Aquí se dibuja un gráfico cuando se seleccionan los valores de X e Y en la parte superior. + +Con un clic sobre los puntos se seleccionan en el gráfico y en la tabla. Con Ctrl+Clic se pueden seleccionar rangos de puntos. + +Use la rueda del ratón para aumentar y disminuir el gráfico y arrastre con el ratón para cambiar el rango del eje. + +Seleccione los ejes o sus etiquetas para arrastrar y aumentar/disminuir solo en esa orientación. - + Line type: Tipo de línea: - - + + None Ninguno - + Line Línea - + StepLeft EscalónIzquierda - + StepRight EscalónDerecha - + StepCenter EscalónCentrado - + Impulse Impulso - + Point shape: Forma de punto: - + Cross Aspa es más específico que cruz. El signo más también es una cruz (una cruz griega). Aspa - + Plus Más - + Circle Circunferencia - + Disc Círculo - + Square Cuadrado - + Diamond Diamante - + Star Estrella - + Triangle Triángulo - + TriangleInverted TriánguloInvertido - + CrossSquare AspaCuadrado - + PlusSquare MásCuadrado - + CrossCircle AspaCircunferencia - + PlusCircle MásCircunferencia - + Peace Paz - + <html><head/><body><p>Save current plot...</p><p>File format chosen by extension (png, jpg, pdf, bmp)</p></body></html> <html><head/><body><p>Guarda la gráfica actual...</p><p>El formato del archivo es elegido por la extensión (png, jpg, pdf, bmp)</p></body></html> - + Save current plot... Guarda la gráfica actual... - + + + Load all data and redraw plot + Cargar todos los datos y redibujar el gráfico + + Load all data. This has only an effect if not all data has been fetched from the table yet due to the partial fetch mechanism. - Cargar todos los datos. Es efectivo sólo si no se han leído ya todos los datos de la tabla porque el mecanismo de lectura ha hecho una lectura parcial. + Cargar todos los datos. Es efectivo sólo si no se han leído ya todos los datos de la tabla porque el mecanismo de lectura ha hecho una lectura parcial. - - - + + + Row # Nº de línea - Choose a axis color - Seleccione el color de la curva + Seleccione el color de la curva + + + + Copy + Copiar + + + + Print... + Imprimir... + + + + Show legend + Mostrar leyenda + + + + Stacked bars + Barras apiladas + + + + Date/Time + Fecha/hora + + + + Date + Fecha + + + + Time + Tiempo - + + + Numeric + Numérico + + + + Label + Etiqueta + + + + Invalid + Inválido + + + + Load all data and redraw plot. +Warning: not all data has been fetched from the table yet due to the partial fetch mechanism. + Cargar todos los datos y redibujar el gráfico. +Aviso: aún no se han cargado todos los datos desde la tabla debido al mecanismo de lectura parcial. + + + + Choose an axis color + Elija un color para el eje + + + Choose a filename to save under Seleccione un nombre de archivo en el que guardar - + PNG(*.png);;JPG(*.jpg);;PDF(*.pdf);;BMP(*.bmp);;All Files(*) - PNG(*.png);;JPG(*.jpg);;PDF(*.pdf);;BMP(*.bmp);;Todos los Archivos(*) + PNG(*.png);;JPG(*.jpg);;PDF(*.pdf);;BMP(*.bmp);;Todos los archivos(*) + + + + There are curves in this plot and the selected line style can only be applied to graphs sorted by X. Either sort the table or query by X to remove curves or select one of the styles supported by curves: None or Line. + Existen lazos en este gráfico y el estilo de línea seleccionado solo se puede aplicar a gráficos ordenados por X. Debe ordenar la tabla o consulta por X para eliminar los lazos o seleccionar uno de los estilos soportados por los lazos: Ninguno o Línea. - Fetching all data... - Trayendo todos los datos... + Trayendo todos los datos... - Cancel - Cancelar + Cancelar @@ -3386,12 +5192,12 @@ Remember last location for session only - Recordar la última posición sólo para esta sesión + Recordar la última posición solamente para esta sesión - - + + ... ... @@ -3406,42 +5212,44 @@ &Idioma - + Automatic &updates &Actualizaciones automáticas - - - - - - + + + + + + + + enabled activado - + Show remote options Mostrar opciones del remoto - + &Database &Base de datos - + Database &encoding Co&dificación de la base de datos - + Open databases with foreign keys enabled. Abrir base de datos con claves foráneas activadas. - + &Foreign keys Claves &foráneas @@ -3454,40 +5262,38 @@ Tamaño del bloque de &precarga - + Data &Browser &Hoja de datos - NULL fields - Campos NULL + Campos NULL Text &colour &Color del texto - &Text - &Texto + &Texto Bac&kground colour Color de &fondo - + Remove line breaks in schema &view Elimina los saltos de línea en la &vista del esquema - + Prefetch block si&ze &Tamaño del bloque de precarga - + Advanced Avanzado @@ -3496,261 +5302,418 @@ SQL a ejecutar tras abrir la base de datos - + SQ&L to execute after opening database SQ&L a ejecutar tras abrir la base de datos - + Default field type Tipo de campo por defecto - + Font Tipo de letra - + &Font &Tipo de letra - Font si&ze: - &Tamaño del texto + &Tamaño del texto - + Content Contenido - + Symbol limit in cell Límite de símbolos en la celda - Field colors - Color de los campos + Color de los campos + + + + NULL + NULL + + + + Regular + Normal + + + Text + Texto + + + + Binary + Binario + + + + Background + Fondo + + + + Filters + Filtros + + + + Toolbar style + Estilo de barra de herramientas + + + + Only display the icon + Solo mostrar el icono + + + + Only display the text + Solo mostrar el texto + + + + The text appears beside the icon + El texto aparece junto al icono + + + + The text appears under the icon + El texto aparece bajo el icono + + + + Follow the style + Seguir el estilo predefinido + + + + DB file extensions + Extensiones de archivos de BB.DD. + + + + Manage + Gestionar + + + + When enabled, the line breaks in the Schema column of the DB Structure tab, dock and printed output are removed. + Cuando está activado, se omiten los saltos de línea en la columna Esquema, tanto en la pestaña Estructura en pantalla, como al imprimir. + + + + Font si&ze + &Tamaño de fuente + + + + + This is the maximum number of rows in a table for enabling the value completion based on current values in the column. +Can be set to 0 for disabling completion. + Este el el número máximo de filas en una tabla para activar el autocompletado basado en los valores actuales en la columna. +Se puede poner a 0 para desactivar el autocompletado. - - NULL - NULL + + Row count threshold for completion + Umbral del conteo de filas para autocompletar - - Regular - Normal + + Field display + Estilo de las celdas - - Text - Texto + + Displayed &text + &Texto presentado - - Binary - Binario + + Text color + Color del texto - - Background - Fondo + + Background color + Color del fondo - - Filters - Filtros + + Preview only (N/A) + Solo vista previa (N/A) - + Escape character Carácter de escape - + Delay time (&ms) Tiempo de retardo (&ms) - + Set the waiting time before a new filter value is applied. Can be set to 0 for disabling waiting. Define el tiempo de espera antes de que se aplique un nuevo valor de filtro. Se puede poner a 0 para desactivar la espera. - + &SQL &SQL - + Settings name Nombre de los ajustes - + Context Contexto - + Colour Color - + Bold Negrita - + Italic Cursiva - + Underline Subrayado - + Keyword Palabra clave - function - función + función - + Function Función - + Table Tabla - + Comment Comentario - + Identifier Identificador - + String Cadena - currentline - currentline + currentline - + Current line Línea actual - + SQL &editor font size Tamaño de letra del &editor SQL - SQL &log font size - Tamaño de letra del &historial SQL + Tamaño de letra del &historial SQL - + Tab size Tamaño del tabulador - + + &Wrap lines + Ajuste de líneas + + + + Never + Nunca + + + + At word boundaries + En los límites de palabra + + + + At character boundaries + En los límites de caracteres + + + + At whitespace boundaries + En los límites de espacios en blanco + + + + &Quotes for identifiers + &Comillas para identificadores + + + + Choose the quoting mechanism used by the application for identifiers in SQL code. + Elija el mecanismo de entrecomillado usado por la aplicación para los identificadores en el código SQL. + + + + "Double quotes" - Standard SQL (recommended) + "Dobles comillas" - SQL estándar (recomendado) + + + + `Grave accents` - Traditional MySQL quotes + `Acentos graves` - Entrecomillado tradicional de MySQL + + + + [Square brackets] - Traditional MS SQL Server quotes + [Corchetes] - Entrecomillado tradicional de MS SQL Server + + + + Keywords in &UPPER CASE + Palabras claves en &MAYÚSCULAS + + + + When set, the SQL keywords are completed in UPPER CASE letters. + Si se activa, las palabras claves de SQL se completan en letras MAYÚSCULAS. + + + + When set, the SQL code lines that caused errors during the last execution are highlighted and the results frame indicates the error in the background + Si se activa, las líneas de código SQL que causaron errores durante la última ejecución se destacan y el marco de resultados indica el error mediante el color del fondo + + + + <html><head/><body><p>SQLite provides an SQL function for loading extensions from a shared library file. Activate this if you want to use the <span style=" font-style:italic;">load_extension()</span> function from SQL code.</p><p>For security reasons, extension loading is turned off by default and must be enabled through this setting. You can always load extensions through the GUI, even though this option is disabled.</p></body></html> + <html><head/><body><p>SQLite proporciona una función SQL para cargar extensiones desde un archivo de biblioteca compartida. Active esta opción si desea usar la función <span style=" font-style:italic;">load_extension()</span> desde código SQL.</p><p>Por razónes de seguridad, la carga de extensiones está desactivada por defecto y debe ser habilitada usando esta configuración. Siempre puede cargar extensiones a través de la interfaz de usuario, incluso aunque esta opción esté deshabilitada.</p></body></html> + + + + Allow loading extensions from SQL code + Permitir cargar extensiones desde código SQL + + + Remote Remoto - + CA certificates Certificados CA - - + + Subject CN Sujeto CN - + Common Name Nombre Común - + Subject O Sujeto O - + Organization Organización - - + + Valid from Válido desde - - + + Valid to Válido hasta - - + + Serial number Número de serie - + Your certificates Sus certificados - + File Archivo - + Subject Common Name Nombre Común del Sujeto - + Issuer CN Emisor CN - + Issuer Common Name Nombre Común del Emisor - + Clone databases into Clonar las bases de datos en @@ -3759,130 +5722,146 @@ Tamaño del tabulador: - + SQL editor &font &Tipo de letra del editor SQL - + Error indicators Indicadores de error - Enabling error indicators highlights the SQL code lines that caused errors during the last execution - Activando los indicadores de error se resaltan las líneas del código SQL que han causado errores durante la última ejecución + Activando los indicadores de error se resaltan las líneas del código SQL que han causado errores durante la última ejecución - + Hori&zontal tiling Mosaico hori&zontal - + If enabled the SQL code editor and the result table view are shown side by side instead of one over the other. Si se activa, el editor de código SQL y la vista de la tabla de resultados se muestran de lado a lado en lugar de una sobre la otra. - + Code co&mpletion Co&mpletar código - + + Foreground + Texto + + + + SQL &results font size + Tamaño de letra de resultados + + + &Extensions E&xtensiones - + Select extensions to load for every database: Seleccione extensiones a cargar para cada base de datos: - + Add extension Añadir extensión - + Remove extension Eliminar extensión - + <html><head/><body><p>While supporting the REGEXP operator SQLite doesn't implement any regular expression<br/>algorithm but calls back the running application. DB Browser for SQLite implements this<br/>algorithm for you to let you use REGEXP out of the box. However, as there are multiple possible<br/>implementations of this and you might want to use another one, you're free to disable the<br/>application's implementation and load your own by using an extension. Requires restart of the application.</p></body></html> <html><head/><body><p> Aunque SQLite admite el operador REGEXP, no implementa en sí ningún algoritmo de expresiones<br/> -regulares sino que llama a los de la aplicación en ejecución. DB Browser para SQLite implementa este<br/> +regulares sino que llama a los de la aplicación en ejecución. «DB Browser for SQLite» implementa este<br/> método para permitirle usar REGEXP de fábrica. Sin embargo, como hay múltiples posibles<br/> -implementaciones y puede querer usar otro, puede desactivar este método y cargar el suyo propio<br/> +implementaciones y puede querer usar otra, puede desactivar este método y cargar el suyo propio<br/> usando una extensión. Necesitará reiniciar la aplicación.</p> </body></html> - + Disable Regular Expression extension Desactivar extensión de Expresiones Regulares - - + + Choose a directory Seleccione una carpeta - + The language will change after you restart the application. El idioma cambiará al reiniciar la aplicación. - + Select extension file Seleccione archivo de extensión - - Extensions(*.so *.dll);;All files(*) - Extensiones(*.so *.dll);;Todos los archivos + + Extensions(*.so *.dylib *.dll);;All files(*) + Extensiones (*.so *.dll);;Todos los archivos (*) - + Import certificate file Importar archivo de certificado - + No certificates found in this file. No hay certificados en este archivo. - + Are you sure you want do remove this certificate? All certificate data will be deleted from the application settings! ¿Está seguro de que quiere eliminar este certificado? ¡Todos los datos del certificado se borrarán de los ajustes de la aplicación! + + + Are you sure you want to clear all the saved settings? +All your preferences will be lost and default values will be used. + ¿Está seguro de que desea borrar todos los ajustes guardadas? +Todas sus preferencias se perderán y se usarán valores predeterminados. + QObject - + Error importing data Error importando datos - + from record number %1 del registro número %1 - + . %1 . %1 - + Importing CSV file... Importando archivo CSV... @@ -3891,7 +5870,7 @@ Descodificando archivo CSV... - + Cancel Cancelar @@ -3909,9 +5888,18 @@ - SQLite database files (*.db *.sqlite *.sqlite3 *.db3);;All files (*) - Archivos de base de datos de SQLite (*.db *.sqlite *.sqlite3 *.db3);;Todos los archivos (*) + Archivos de base de datos de SQLite (*.db *.sqlite *.sqlite3 *.db3);;Todos los archivos (*) + + + + All files (*) + Todos los archivos (*) + + + + SQLite database files (*.db *.sqlite *.sqlite3 *.db3) + Archivos de BB.DD. SQLite (*.db *.sqlite *.sqlite3 *.db3) @@ -3930,45 +5918,45 @@ %2 - + Error opening remote file at %1. %2 Error abriendo el archivo remoto en %1. %2 - + Error: Invalid client certificate specified. Error: El certificado del cliente es inválido. - + Please enter the passphrase for this client certificate in order to authenticate. - Por favor introduzca la clave de este certificado del cliente para autentificarse. + Por favor, introduzca la clave de este certificado de cliente para autenticarse. - + Cancel Cancelar - + Uploading remote database to %1 Subiendo base de datos remota a %1 - + Downloading remote database from %1 Descargando base de datos remota desde %1 - + The remote database has been updated since the last checkout. Do you want to update the local database to the newest version? Note that this discards any changes you have made locally! If you don't want to lose local changes, click No to open the local version. - La base de datos remota ha cambiado desde la última sincronización. ¿Desea actualizar la base de datos local a la versión más reciente? ¡Tenga en cuenta que esto descartará cualquier cambio que haya hecho localmente! Si no desea perder cambios locales, pulse No para abrir la versión local. + La base de datos remota ha cambiado desde la última sincronización. ¿Desea actualizar la base de datos local a la versión más reciente? ¡Tenga en cuenta que esto descartará cualquier cambio que haya hecho localmente! Si no desea perder cambios locales, pulse «No» para abrir la versión local. Uploading remote database to @@ -3983,25 +5971,25 @@ %1. - - + + Error: The network is not accessible. Error: La red no es accesible. - + Error: Cannot open the file for sending. Error: No se puede abrir el archivo para enviar. - + Error opening local databases list. %1 Error abriendo la lista de bases de datos locales. %1 - + Error creating local databases list. %1 Error creando la lista de bases de datos locales. @@ -4024,25 +6012,35 @@ Local - + Identity Identidad - + Connect to the remote server using the currently selected identity. The correct server is taken from the identity as well. Conectar al servidor remoto usando la identidad actualmente seleccionada. El servidor correcto se selecciona también con la entidad. - + Go Ir - + Push currently opened database to server Volcar la base de datos actualmente abierta al servidor + + + <html><head/><body><p>In this pane, remote databases from dbhub.io website can be added to DB4S. First you need an identity:</p><ol style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;"><li style=" margin-top:12px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Login to the dbhub.io website (use your GitHub credentials or whatever you want)</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Click the button to create a DB4S certificate (that's your identity). That'll give you a certificate file (save it to your local disk).</li><li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Go to the Remote tab in DB4S Preferences. Click the button to add a new certificate to DB4S and choose the just downloaded certificate file.</li></ol><p>Now the Remote panel shows your identity and you can add remote databases.</p></body></html> + <html><head/><body><p>En este panel, las BB.DD. remotas del sitio web dbhub.io se pueden añadir a DB4S. En primer lugar usted necesita una identidad:</p><ol style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;"><li style=" margin-top:12px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Ingrese en el sitio web dbhub.io (use sus credenciales de GitHub o las que desee)</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Haga clic en el botón de crear un certificado de DB4S (esa es su identidad). Eso le proporcionará un archivo de certificado (guárdelo en su disco local).</li><li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Vaya a la pestaña «Remoto» de las preferencias de DB4S. Haga clic en el botón para añadir el nuevo certificado a DB4S y elija el archivo de certificado recién descargado.</li></ol><p>Ahora el panel «Remoto» le mostrará su identidad y podrá añadir BB.DD. remotas.</p></body></html> + + + + <html><head/><body><p>No DBHub.io account yet? <a href="https://dbhub.io/"><span style=" text-decoration: underline; color:#007af4;">Create one now</span></a> and import your certificate <a href="#preferences"><span style=" text-decoration: underline; color:#007af4;">here</span></a> to share your databases.</p><p>For online help visit <a href="https://dbhub.io/about"><span style=" text-decoration: underline; color:#007af4;">here</span></a>.</p></body></html> + + RemoteModel @@ -4130,7 +6128,7 @@ Database will be private. Only you have access to it. - La base de datos será privada. Sólo usted tendrá acceso. + La base de datos será privada. Solo usted tendrá acceso. @@ -4144,6 +6142,29 @@ + RunSql + + + Execution aborted by user + Ejecución abortada por el usuario + + + + , %1 rows affected + , %1 líneas afectadas + + + + query executed successfully. Took %1ms%2 + consulta ejecutada con éxito. Llevó %1ms%2 + + + + executing query + ejecutando consulta + + + SqlExecutionArea @@ -4151,14 +6172,96 @@ Formulario - + + Find previous match [Shift+F3] + Buscar la siguiente ocurrencia [May+F3] + + + + Find previous match with mapping + Buscar la siguiente ocurrencia + + + + Shift+F3 + Shift+F3 + + + + The found pattern must be a whole word + El patrón buscado debe ser una palabra completa + + + + Whole Words + Palabras completas + + + + Text pattern to find considering the checks in this frame + El patrón de texto buscado considerando las opciones de este marco + + + + Find in editor + Buscar en el editor + + + + The found pattern must match in letter case + El patrón busca debe coincidir en mayúsculas y minúsculas + + + + Case Sensitive + Distinguir mayús./minús. + + + + Find next match [Enter, F3] + Buscar la siguiente ocurrencia [Enter, F3] + + + + Find next match with wrapping + Encontrar la siguiente ocurrencia volviendo al principio si es necesario + + + + F3 + F3 + + + + Interpret search pattern as a regular expression + Interpretar el patrón buscado como una expresión regular + + + + <html><head/><body><p>When checked, the pattern to find is interpreted as a UNIX regular expression. See <a href="https://en.wikibooks.org/wiki/Regular_Expressions">Regular Expression in Wikibooks</a>.</p></body></html> + <html><head/><body><p>Si se activa, el patrón buscado se interpreta como una expresión regular UNIX. Véase <a href="https://es.wikipedia.org/wiki/Expresi%C3%B3n_regular">«Expresión regular» en Wikipedia</a>.</p></body></html> + + + + Regular Expression + Expresión regular + + + + + Close Find Bar + Cerrar la barra de búsqueda + + + + Results of the last executed statements - Resultados de los últimos comandos ejecutados + Resultados de las últimas sentencias ejecutadas - + This field shows the results and status codes of the last executed statements. - Este campo muestra los resultados y códigos de estado de los últimos comandos ejecutados. + Este campo muestra los resultados y códigos de estado de las últimas sentencias ejecutadas. Export to &CSV @@ -4173,289 +6276,407 @@ Guardar como vista - Please specify the view name - Por favor, especifique el nombre de la vista + Por favor, especifique el nombre de la vista - There is already an object with that name. Please choose a different name. - Ya hay un objeto con ese nombre. Por favor, elija un nombre diferente. + Ya hay un objeto con ese nombre. Por favor, elija un nombre diferente. - View successfully created. - Vista creada con éxito. + Vista creada con éxito. - Error creating view: %1 - Error creando la vista: %1 + Error creando la vista: %1 + + + + SqlTextEdit + + + Ctrl+/ + SqlUiLexer - + (X) The abs(X) function returns the absolute value of the numeric argument X. (X) La función abs(X) devuelve el valor absoluto del argumento numérico X. - + () The changes() function returns the number of database rows that were changed or inserted or deleted by the most recently completed INSERT, DELETE, or UPDATE statement. () La función changes() devuelve el número de líneas de la base de datos que se modificaron, insertaron o borraron por la consulta INSERT, DELETE, o UPDATE más reciente. - + (X1,X2,...) The char(X1,X2,...,XN) function returns a string composed of characters having the unicode code point values of integers X1 through XN, respectively. (X1,X2,...) La función char(X1,X2,...,XN) devuelve una cadena compuesta por caracteres que tienen el valor numérico del código de punto unicode los enteros X1 hasta XN, respectivamente. - + (X,Y,...) The coalesce() function returns a copy of its first non-NULL argument, or NULL if all arguments are NULL (X,Y,...) La función coalesce() devuelve una copia de su primer argumento no nulo, o NULL si todos los argumentos son NULL - + (X,Y) The glob(X,Y) function is equivalent to the expression "Y GLOB X". (X,Y) La función glob(X,Y) es equivalente a la expresión "Y GLOB X". - + (X,Y) The ifnull() function returns a copy of its first non-NULL argument, or NULL if both arguments are NULL. (X,Y) La función ifnull() devuelve una copia de su primer argumento no nulo, o NULL si ambos argumentos son NULL. - + (X,Y) The instr(X,Y) function finds the first occurrence of string Y within string X and returns the number of prior characters plus 1, or 0 if Y is nowhere found within X. (X,Y) La función instr(X,Y) busca la primera coincidencia de la cadena Y en la cadena X y devuelve el número de caracteres precedentes más 1, ó 0 si Y no se encuentra en X. - + (X) The hex() function interprets its argument as a BLOB and returns a string which is the upper-case hexadecimal rendering of the content of that blob. (X) La función hex() interpreta su argumento como un BLOB y devuelve una cadena que es el equivalente codificado en hexadecimal en mayúsculas del contenido del BLOB. - + () The last_insert_rowid() function returns the ROWID of the last row insert from the database connection which invoked the function. () La función last_insert_rowid() devuelve el ROWID del la última línea insertada desde la conexión de la base de datos que invocó la función. - + (X) For a string value X, the length(X) function returns the number of characters (not bytes) in X prior to the first NUL character. (X) La función length(X) devuelve el número de caracteres (no bytes) en X anteriores al primer carácter NUL. - + (X,Y) The like() function is used to implement the "Y LIKE X" expression. X,Y) La función like() se usa para implementar la expresión "Y LIKE X". - + (X,Y,Z) The like() function is used to implement the "Y LIKE X ESCAPE Z" expression. (X,Y,Z) La función like() se usa para implementar la expresión "Y LIKE X ESCAPE Z". - (X) The load_extension(X) function loads SQLite extensions out of the shared library file named X. - (X) La función load_extension(X) carga extensiones SQLite del archivo de la biblioteca compartida llamada X. + (X) La función load_extension(X) carga extensiones SQLite del archivo de la biblioteca compartida llamada X. - (X,Y) The load_extension(X) function loads SQLite extensions out of the shared library file named X using the entry point Y. - (X) La función load_extension(X) carga extensiones SQLite del archivo de la biblioteca compartida llamada X usando el punto de entrada Y. + (X) La función load_extension(X) carga extensiones SQLite del archivo de la biblioteca compartida llamada X usando el punto de entrada Y. - + + (X) The load_extension(X) function loads SQLite extensions out of the shared library file named X. +Use of this function must be authorized from Preferences. + (X) La función load_extension(X) carga extensiones SQLite del archivo de la biblioteca compartida llamada X usando el punto de entrada Y. +El uso de esta función tiene que ser autorizado desde las Preferencias. + + + + (X,Y) The load_extension(X) function loads SQLite extensions out of the shared library file named X using the entry point Y. +Use of this function must be authorized from Preferences. + (X,Y) La función load_extension(X,Y) carga extensiones SQLite del archivo de la biblioteca compartida llamado X usando el punto de entrada Y. +El uso de esta función tiene que ser autorizado desde las Preferencias. + + + (X) The lower(X) function returns a copy of string X with all ASCII characters converted to lower case. (X) La función lower(X) devuelve una copia de la cadena X con todos los caracteres ASCII convertidos a minúsculas. - + (X) ltrim(X) removes spaces from the left side of X. (X) La función ltrim(X) quita los espacios a la izquierda de X. - + (X,Y) The ltrim(X,Y) function returns a string formed by removing any and all characters that appear in Y from the left side of X. (X,Y) La función ltrim(X,Y) devuelve una cadena formada quitando todos los caracteres que aparecen en Y de la izquierda de X. - + (X,Y,...) The multi-argument max() function returns the argument with the maximum value, or return NULL if any argument is NULL. (X,Y,...) La función multi-argumento max() devuelve el argumento con el valor máximo, o NULL si cualquier argumento es NULL. - + (X,Y,...) The multi-argument min() function returns the argument with the minimum value. (X,Y,...) La función multi-argumento max() devuelve el argumento con el valor mínimo. - + (X,Y) The nullif(X,Y) function returns its first argument if the arguments are different and NULL if the arguments are the same. (X,Y) La función nullif(X,Y) devuelve su primer argumento si los argumentos son diferentes y NULL si los argumentos son el mismo. - + (FORMAT,...) The printf(FORMAT,...) SQL function works like the sqlite3_mprintf() C-language function and the printf() function from the standard C library. (FORMAT,...) La función SQL printf(FORMAT,...) funciona como la función de lenguaje C sqlite3_mprintf() y la función printf() de la biblioteca C estándar. - + (X) The quote(X) function returns the text of an SQL literal which is the value of its argument suitable for inclusion into an SQL statement. - (X) La función quote(X) devuelve el texto de un literal SQL, que es el valor de su argumento, apropiado para la inclusión en una consulta SQL. + (X) La función quote(X) devuelve el texto de un literal SQL, que es el valor de su argumento, apropiado para la inclusión en una sentencia SQL. - + () The random() function returns a pseudo-random integer between -9223372036854775808 and +9223372036854775807. () La función random() devuelve un entero pseudo-aleatorio entre -9223372036854775808 y +9223372036854775807. - + (N) The randomblob(N) function return an N-byte blob containing pseudo-random bytes. (N) La función randomblob(N) devuelve un BLOB de N bytes que contiene bytes pseudo-aleatorios. - + (X,Y,Z) The replace(X,Y,Z) function returns a string formed by substituting string Z for every occurrence of string Y in string X. (X,Y,Z) La función replace(X,Y,Z) devuelve una cadena formada substituyendo en la cadena Z cada coincidencia con la subcadena Y por la subcadena X. - + (X) The round(X) function returns a floating-point value X rounded to zero digits to the right of the decimal point. (X) La función round(X) devuelve un valor en coma flotante X redondeado a cero dígitos a la derecha de la coma decimal. - + (X,Y) The round(X,Y) function returns a floating-point value X rounded to Y digits to the right of the decimal point. (X,Y) La función round(X,Y) devuelve un valor en coma flotante X redondeado a Y dígitos a la derecha de la coma decimal. - + (X) rtrim(X) removes spaces from the right side of X. (X) La función rtrim(X) quita los espacios a la derecha de X. - + (X,Y) The rtrim(X,Y) function returns a string formed by removing any and all characters that appear in Y from the right side of X. (X,Y) La función rtrim(X,Y) devuelve una cadena formada quitando todos los caracteres que aparecen en Y de la derecha de X. - + (X) The soundex(X) function returns a string that is the soundex encoding of the string X. (X) La función soundex(X) devuelve una cadena que es la codificación soundex de la cadena X. - + (X,Y) substr(X,Y) returns all characters through the end of the string X beginning with the Y-th. (X,Y) La función substr(X,Y) devuelve una subcadena con todos los caracteres de la cadena X desde el Y-ésimo hasta el último. - + (X,Y,Z) The substr(X,Y,Z) function returns a substring of input string X that begins with the Y-th character and which is Z characters long. (X,Y) La función substr(X,Y) devuelve una subcadena de la cadena X desde el Y-ésimo y que es Z caracteres de largo. - + () The total_changes() function returns the number of row changes caused by INSERT, UPDATE or DELETE statements since the current database connection was opened. - () La función total_changes() devuelve el número de cambios en las líneas causadas por consultas INSERT, UPDATE o DELETE desde que la conexión con la base de datos actual se abrió. + () La función total_changes() devuelve el número de cambios en las líneas causadas por sentencias INSERT, UPDATE o DELETE desde que la conexión con la base de datos actual se abrió. - + (X) trim(X) removes spaces from both ends of X. (X) La función trim(X) quita los espacios de ambos lados de X. - + (X,Y) The trim(X,Y) function returns a string formed by removing any and all characters that appear in Y from both ends of X. (X,Y) La función trim(X,Y) devuelve una cadena formada quitando todos los caracteres que aparecen en Y de ambos lados de X. - + (X) The typeof(X) function returns a string that indicates the datatype of the expression X. (X) La función typeof(X) devuelve una cadena que indica el tipo de datos de la expresión X. - + (X) The unicode(X) function returns the numeric unicode code point corresponding to the first character of the string X. (X) La función unicode(X) devuelve el valor numérico del código de punto unicode correspondiente al primer carácter de la cadena X. - + (X) The upper(X) function returns a copy of input string X in which all lower-case ASCII characters are converted to their upper-case equivalent. (X) La función upper(X) devuelve una copia de la cadena X con todos los caracteres ASCII convertidos a mayúsculas. - + (N) The zeroblob(N) function returns a BLOB consisting of N bytes of 0x00. (N) La función zeroblob(N) devuelve un BLOB consistente en N bytes de 0x00. - - - - + + + + (timestring,modifier,modifier,...) (timestring,modificador,modificador,...) - + (format,timestring,modifier,modifier,...) (formato,timestring,modificador,modificador,...) - + (X) The avg() function returns the average value of all non-NULL X within a group. (X) La función avg() devuelve el valor medio de todos los valores no nulos del grupo X. - + (X) The count(X) function returns a count of the number of times that X is not NULL in a group. (X) La función count(X) devuelve el conteo del número de veces que X no es nulo en un grupo. - + (X) The group_concat() function returns a string which is the concatenation of all non-NULL values of X. (X) La función group_concat() devuelve una cadena que es la concatenación de todos los valores no nulos X. - + (X,Y) The group_concat() function returns a string which is the concatenation of all non-NULL values of X. If parameter Y is present then it is used as the separator between instances of X. (X,Y) La función group_concat() devuelve una cadena que es la concatenación de todos los valores no nulos X, usando el parámetro Y como separador entre las instancias de X. - + (X) The max() aggregate function returns the maximum value of all values in the group. - (X) La función max() devuelve el máximo valor de entre todos los valores en el grupo. + (X) La función agregada max() devuelve el máximo valor de entre todos los valores en el grupo. - + (X) The min() aggregate function returns the minimum non-NULL value of all values in the group. - (X) La función min() devuelve el mínimo valor no NULO de entre todos los valores en el grupo. + (X) La función agregada min() devuelve el mínimo valor no NULO de entre todos los valores en el grupo. - - + + (X) The sum() and total() aggregate functions return sum of all non-NULL values in the group. - (X) Las funciones sum() y total() devuelven la suma de todos los valores no NULOS en el grupo. + (X) Las funciones agregadas sum() y total() devuelven la suma de todos los valores no NULOS en el grupo. + + + + () The number of the row within the current partition. Rows are numbered starting from 1 in the order defined by the ORDER BY clause in the window definition, or in arbitrary order otherwise. + () El número de fila dentro de la partición actual. Las filas se numeran empezando por 1 en el orden definido por la cláusula ORDER BY en la ventana de definición, o sino en un orden arbitrario. + + + + () The row_number() of the first peer in each group - the rank of the current row with gaps. If there is no ORDER BY clause, then all rows are considered peers and this function always returns 1. + () El row_number() del primer par (igual) en cada grupo - el rango de la fila actual con huecos. Si no hay una cláusula ORDER BY, entonces todas las filas son consideradas pares y esta función siempre devuelve 1. + + + + () The number of the current row's peer group within its partition - the rank of the current row without gaps. Partitions are numbered starting from 1 in the order defined by the ORDER BY clause in the window definition. If there is no ORDER BY clause, then all rows are considered peers and this function always returns 1. + () El número del grupo de pares de la fila actual dentro de su partición - el rango de la fila actual sin huecos. Las particiones se numeran empezando por 1 en el orden definido por la cláusula ORDER BY en la ventana de definición. Si no hay una cláusula ORDER BY, entonces todas las filas son consideradas pares y esta función siempre devuelve 1. + + + + () Despite the name, this function always returns a value between 0.0 and 1.0 equal to (rank - 1)/(partition-rows - 1), where rank is the value returned by built-in window function rank() and partition-rows is the total number of rows in the partition. If the partition contains only one row, this function returns 0.0. + () A pesar del nombre, esta función siempre devuelve un valor entre 0.0 y 1.0 igual a (rank - 1)/(partition-rows - 1), donde rank es el valor devuelto por la función de ventana incorporada rank() y partition-rows es el número total de filas en la partición. Si la partición contiene sólo una fila, esta función devuelve 0.0. + + + + () The cumulative distribution. Calculated as row-number/partition-rows, where row-number is the value returned by row_number() for the last peer in the group and partition-rows the number of rows in the partition. + () La distribución acumulada. Calculada como row-number/partition-rows, donde row-number es el valor devuelto por row_number() para el último par (igual) en el grupo y partition-rows el número de filas en la partición. + + + + (N) Argument N is handled as an integer. This function divides the partition into N groups as evenly as possible and assigns an integer between 1 and N to each group, in the order defined by the ORDER BY clause, or in arbitrary order otherwise. If necessary, larger groups occur first. This function returns the integer value assigned to the group that the current row is a part of. + (N) El argumento N es tratado como un entero. Esta función divide la partición en N grupos tan equitativamente como sea posible y asigna un entero entre 1 y N a cada grupo, en el orden definido por la cláusula ORDER BY, o sino en un orden arbitrario. Si es necesario, los grupos mayores aparecen primero. Esta función devuelve un valor entero asignado al grupo del que la fila actual es parte. + + + + (expr) Returns the result of evaluating expression expr against the previous row in the partition. Or, if there is no previous row (because the current row is the first), NULL. + (expr) Devuelve el resultado de evaluar la expresión expr con la fila anterior en la partición. Si no hay fila anterior (porque la fila actual es la primera) devuelve NULL. + + + + (expr,offset) If the offset argument is provided, then it must be a non-negative integer. In this case the value returned is the result of evaluating expr against the row offset rows before the current row within the partition. If offset is 0, then expr is evaluated against the current row. If there is no row offset rows before the current row, NULL is returned. + (expr,offset) Si se proporciona un offset, éste debe ser un entero no negativo. En este caso el valor devuelto es el resultado de evaluar expr con la fila offset veces anterior a la fila actual dentro de la partición. Si offset es 0, entonces expr se evalua con la fila actual. Si no hay fila offset veces anterior devuelve NULL. + + + + + (expr,offset,default) If default is also provided, then it is returned instead of NULL if the row identified by offset does not exist. + (expr,offset,default) Si también se proporciona un default, entonces éste es devuelto en lugar de NULL si no existe la fila identificada por offet. + + + + (expr) Returns the result of evaluating expression expr against the next row in the partition. Or, if there is no next row (because the current row is the last), NULL. + (expr) Devuelve el resultado de evaluar la expresión expr con la siguiente fila en la partición. Si no hay fila siguiente (porque la fila actual es la última) devuelve NULL. + + + + (expr,offset) If the offset argument is provided, then it must be a non-negative integer. In this case the value returned is the result of evaluating expr against the row offset rows after the current row within the partition. If offset is 0, then expr is evaluated against the current row. If there is no row offset rows after the current row, NULL is returned. + (expr,offset) Si se proporciona un offset, éste debe ser un entero no negativo. En este caso el valor devuelto es el resultado de evaluar expr con la fila offset veces posterior a la fila actual dentro de la partición. Si offset es 0, entonces expr se evalua con la fila actual. Si no hay fila offset veces siguiente devuelve NULL. + + + + (expr) This built-in window function calculates the window frame for each row in the same way as an aggregate window function. It returns the value of expr evaluated against the first row in the window frame for each row. + (expr) Esta función de ventana incorporada calcula el marco de la ventana para cada fila de la misma forma que una función agregada de ventana. Devuelve el valor de expr evaluada con la primera fila en el marco de la ventana para cada fila. + + + + (expr) This built-in window function calculates the window frame for each row in the same way as an aggregate window function. It returns the value of expr evaluated against the last row in the window frame for each row. + (expr) Esta función de ventana incorporada calcula el marco de la ventana para cada fila de la misma forma que una función agregada de ventana. Devuelve el valor de expr evaluada con la última fila en el marco de la ventana para cada fila. + + + + (expr,N) This built-in window function calculates the window frame for each row in the same way as an aggregate window function. It returns the value of expr evaluated against the row N of the window frame. Rows are numbered within the window frame starting from 1 in the order defined by the ORDER BY clause if one is present, or in arbitrary order otherwise. If there is no Nth row in the partition, then NULL is returned. + (expr,N) Esta función de ventana incorporada calcula el marco de la ventana para cada fila de la misma forma que una función agregada de ventana. Devuelve el valor de expr evaluada con la fila N del marco de la ventana. Las columnas se numeran dentro del marco de la ventana empezando por 1 en el orden definico por la cláusula ORDER BY, o sino en orden arbitrario. Si no hay fila N-ava en la partición, entonces devuelve NULL. SqliteTableModel - + + reading rows + leyendo filas + + + + loading... + cargando... + + References %1(%2) Hold Ctrl+Shift and click to jump there - Referencias %1(%2) -Mantenga pulsado Ctrl+Shift y haga click para ir ahí + Referencia %1(%2) +Mantenga pulsado Ctrl+May y haga clic para ir ahí + + + + References %1(%2) +Hold %3Shift and click to jump there + Referencia %1(%2) +Mantenga pulsado %3May y haga clic para ir ahí - + Error changing data: %1 Error modificando datos: %1 + + + retrieving list of columns + obteniendo lista de columnas + + + + Fetching data... + Obteniendo datos... + + + + Cancel + Cancelar + VacuumDialog diff -Nru sqlitebrowser-3.10.100ubuntu1/src/translations/sqlb_fa.ts sqlitebrowser-3.11.1/src/translations/sqlb_fa.ts --- sqlitebrowser-3.10.100ubuntu1/src/translations/sqlb_fa.ts 1970-01-01 00:00:00.000000000 +0000 +++ sqlitebrowser-3.11.1/src/translations/sqlb_fa.ts 2019-02-19 23:51:34.000000000 +0000 @@ -0,0 +1,5481 @@ + + + + + AboutDialog + + + About DB Browser for SQLite + + + + + Version + + + + + <html><head/><body><p>DB Browser for SQLite is an open source, freeware visual tool used to create, design and edit SQLite database files.</p><p>It is bi-licensed under the Mozilla Public License Version 2, as well as the GNU General Public License Version 3 or later. You can modify or redistribute it under the conditions of these licenses.</p><p>See <a href="http://www.gnu.org/licenses/gpl.html">http://www.gnu.org/licenses/gpl.html</a> and <a href="https://www.mozilla.org/MPL/2.0/index.txt">https://www.mozilla.org/MPL/2.0/index.txt</a> for details.</p><p>For more information on this program please visit our website at: <a href="http://sqlitebrowser.org">http://sqlitebrowser.org</a></p><p><span style=" font-size:small;">This software uses the GPL/LGPL Qt Toolkit from </span><a href="http://qt-project.org/"><span style=" font-size:small;">http://qt-project.org/</span></a><span style=" font-size:small;"><br/>See </span><a href="http://qt-project.org/doc/qt-5/licensing.html"><span style=" font-size:small;">http://qt-project.org/doc/qt-5/licensing.html</span></a><span style=" font-size:small;"> for licensing terms and information.</span></p><p><span style=" font-size:small;">It also uses the Silk icon set by Mark James licensed under a Creative Commons Attribution 2.5 and 3.0 license.<br/>See </span><a href="http://www.famfamfam.com/lab/icons/silk/"><span style=" font-size:small;">http://www.famfamfam.com/lab/icons/silk/</span></a><span style=" font-size:small;"> for details.</span></p></body></html> + + + + + SQLite Version + + + + + SQLCipher Version + + + + + (based on SQLite %1) + + + + + Version + + + + + Qt Version + + + + + AddRecordDialog + + + Add New Record + + + + + Enter values for the new record considering constraints. Fields in bold are mandatory. + + + + + In the Value column you can specify the value for the field identified in the Name column. The Type column indicates the type of the field. Default values are displayed in the same style as NULL values. + + + + + Name + + + + + Type + + + + + Value + + + + + Values to insert. Pre-filled default values are inserted automatically unless they are changed. + + + + + When you edit the values in the upper frame, the SQL query for inserting this new record is shown here. You can edit manually the query before saving. + + + + + <html><head/><body><p><span style=" font-weight:600;">Save</span> will submit the shown SQL statement to the database for inserting the new record.</p><p><span style=" font-weight:600;">Restore Defaults</span> will restore the initial values in the <span style=" font-weight:600;">Value</span> column.</p><p><span style=" font-weight:600;">Cancel</span> will close this dialog without executing the query.</p></body></html> + + + + + Auto-increment + + + + + + Unique constraint + + + + + + Check constraint: %1 + + + + + + Foreign key: %1 + + + + + + Default value: %1 + + + + + + Error adding record. Message from database engine: + +%1 + + + + + Are you sure you want to restore all the entered values to their defaults? + + + + + Application + + + Usage: %1 [options] [db] + + + + + + Possible command line arguments: + + + + + -h, --help Show command line options + + + + + -q, --quit Exit application after running scripts + + + + + -s, --sql [file] Execute this SQL file after opening the DB + + + + + -t, --table [table] Browse this table after opening the DB + + + + + -R, --read-only Open database in read-only mode + + + + + -o, --option [group/setting=value] Run application with this setting temporarily set to value + + + + + -v, --version Display the current version + + + + + [file] Open this SQLite database + + + + + This is DB Browser for SQLite version %1. + + + + + The -s/--sql option requires an argument + + + + + The file %1 does not exist + + + + + The -t/--table option requires an argument + + + + + The -o/--option option requires an argument in the form group/setting=value + + + + + Invalid option/non-existant file: %1 + + + + + CipherDialog + + + SQLCipher encryption + + + + + &Password + + + + + &Reenter password + + + + + Passphrase + + + + + Raw key + + + + + Encr&yption settings + + + + + SQLCipher &3 defaults + + + + + SQLCipher &4 defaults + + + + + Custo&m + + + + + Page si&ze + + + + + &KDF iterations + + + + + HMAC algorithm + + + + + KDF algorithm + + + + + Please set a key to encrypt the database. +Note that if you change any of the other, optional, settings you'll need to re-enter them as well every time you open the database file. +Leave the password fields empty to disable the encryption. +The encryption process might take some time and you should have a backup copy of your database! Unsaved changes are applied before modifying the encryption. + + + + + Please enter the key used to encrypt the database. +If any of the other settings were altered for this database file you need to provide this information as well. + + + + + ColumnDisplayFormatDialog + + + Choose display format + + + + + Display format + + + + + Choose a display format for the column '%1' which is applied to each value prior to showing it. + + + + + Default + + + + + Decimal number + + + + + Exponent notation + + + + + Hex blob + + + + + Hex number + + + + + Octal number + + + + + Round number + + + + + Apple NSDate to date + + + + + Java epoch (milliseconds) to date + + + + + Julian day to date + + + + + Unix epoch to date + + + + + Unix epoch to local time + + + + + Windows DATE to date + + + + + Date as dd/mm/yyyy + + + + + Lower case + + + + + Upper case + + + + + Custom + + + + + DBBrowserDB + + + This database has already been attached. Its schema name is '%1'. + + + + + Please specify the database name under which you want to access the attached database + + + + + Invalid file format + + + + + Do you really want to close this temporary database? All data will be lost. + + + + + Do you want to save the changes made to the database file %1? + + + + + The database is currently busy: + + + + + Do you want to abort that other operation? + + + + + Exporting database to SQL file... + + + + + + Cancel + + + + + + No database file opened + + + + + Executing SQL... + + + + + Action cancelled. + + + + + + Error in statement #%1: %2. +Aborting execution%3. + + + + + + and rolling back + + + + + didn't receive any output from %1 + + + + + could not execute command: %1 + + + + + Cannot delete this object + + + + + Cannot set data on this object + + + + + + A table with the name '%1' already exists in schema '%2'. + + + + + No table with name '%1' exists in schema '%2'. + + + + + + Cannot find column %1. + + + + + Creating savepoint failed. DB says: %1 + + + + + Renaming the column failed. DB says: +%1 + + + + + + Releasing savepoint failed. DB says: %1 + + + + + Creating new table failed. DB says: %1 + + + + + Copying data to new table failed. DB says: +%1 + + + + + Deleting old table failed. DB says: %1 + + + + + Restoring some of the objects associated with this table failed. This is most likely because some column names changed. Here's the SQL statement which you might want to fix and execute manually: + + + + + + + Error renaming table '%1' to '%2'.Message from database engine: +%3 + + + + + ... <string can not be logged, contains binary data> ... + + + + + could not get list of db objects: %1, %2 + + + + + could not get list of databases: %1 + + + + + Error setting pragma %1 to %2: %3 + + + + + File not found. + + + + + Error loading extension: %1 + + + + + could not get column information + + + + + DbStructureModel + + + Name + + + + + Object + + + + + Type + + + + + Schema + + + + + Database + + + + + Browsables + + + + + All + + + + + Temporary + + + + + Tables (%1) + + + + + Indices (%1) + + + + + Views (%1) + + + + + Triggers (%1) + + + + + EditDialog + + + Edit database cell + + + + + Mode: + + + + + This is the list of supported modes for the cell editor. Choose a mode for viewing or editing the data of the current cell. + + + + + Text + + + + + Binary + + + + + Image + + + + + JSON + + + + + XML + + + + + + Automatically adjust the editor mode to the loaded data type + + + + + This checkable button enables or disables the automatic switching of the editor mode. When a new cell is selected or new data is imported and the automatic switching is enabled, the mode adjusts to the detected data type. You can then change the editor mode manually. If you want to keep this manually switched mode while moving through the cells, switch the button off. + + + + + Auto-switch + + + + + + Auto-format: pretty print on loading, compact on saving. + + + + + When enabled, the auto-format feature formats the data on loading, breaking the text in lines and indenting it for maximum readability. On data saving, the auto-format feature compacts the data removing end of lines, and unnecessary whitespace. + + + + + Autoformat + + + + + Import from file + + + + + Opens a file dialog used to import any kind of data to this database cell. + + + + + &Import + + + + + Export to file + + + + + Opens a file dialog used to export the contents of this database cell to a file. + + + + + &Export + + + + + Set this cell to NULL + + + + + Erases the contents of the cell + + + + + Set as &NULL + + + + + This area displays information about the data present in this database cell + + + + + This editor mode lets you edit JSON or XML data with syntax highlighting, automatic formatting and validation before saving. + +Errors are indicated with a red squiggle underline. + + + + + Type of data currently in cell + + + + + Size of data currently in table + + + + + Apply data to cell + + + + + This button saves the changes performed in the cell editor to the database cell. + + + + + Apply + + + + + + Print... + + + + + Open preview dialog for printing displayed image + + + + + + Ctrl+P + + + + + Open preview dialog for printing displayed text + + + + + Copy Hex and ASCII + + + + + Copy selected hexadecimal and ASCII columns to the clipboard + + + + + Ctrl+Shift+C + + + + + + Image data can't be viewed in this mode. + + + + + + Try switching to Image or Binary mode. + + + + + + Binary data can't be viewed in this mode. + + + + + + Try switching to Binary mode. + + + + + + + + Text files (*.txt) + + + + + + + JSON files (*.json) + + + + + + + + XML files (*.xml) + + + + + + Image files (%1) + + + + + + + Binary files (*.bin) + + + + + + All files (*) + + + + + Choose a file to import + + + + + %1 Image + + + + + SVG files (*.svg) + + + + + + Hex dump files (*.txt) + + + + + Choose a filename to export data + + + + + Invalid data for this mode + + + + + The cell contains invalid %1 data. Reason: %2. Do you really want to apply it to the cell? + + + + + + Type of data currently in cell: Text / Numeric + + + + + + + %n char(s) + + + + + + + Type of data currently in cell: %1 Image + + + + + %1x%2 pixel(s) + + + + + Type of data currently in cell: NULL + + + + + + %n byte(s) + + + + + + + Type of data currently in cell: Valid JSON + + + + + Type of data currently in cell: Binary + + + + + EditIndexDialog + + + Edit Index Schema + + + + + &Name + + + + + &Table + + + + + &Unique + + + + + For restricting the index to only a part of the table you can specify a WHERE clause here that selects the part of the table that should be indexed + + + + + Partial inde&x clause + + + + + Colu&mns + + + + + Table column + + + + + Type + + + + + Add a new expression column to the index. Expression columns contain SQL expression rather than column names. + + + + + Index column + + + + + Order + + + + + Deleting the old index failed: +%1 + + + + + Creating the index failed: +%1 + + + + + EditTableDialog + + + Edit table definition + + + + + Table + + + + + Advanced + + + + + Database schema + + + + + Without Rowid + + + + + Make this a 'WITHOUT rowid' table. Setting this flag requires a field of type INTEGER with the primary key flag set and the auto increment flag unset. + + + + + Fields + + + + + Add field + + + + + Remove field + + + + + Move field up + + + + + Move field down + + + + + Name + + + + + Type + + + + + NN + + + + + Not null + + + + + PK + + + + + Primary key + + + + + AI + + + + + Autoincrement + + + + + U + + + + + Unique + + + + + Default + + + + + Default value + + + + + Check + + + + + Check constraint + + + + + Foreign Key + + + + + <html><head/><body><p><span style=" font-weight:600; color:#ff0000;">Warning: </span>There is something with this table definition that our parser doesn't fully understand. Modifying and saving this table might result in problems.</p></body></html> + + + + + Error creating table. Message from database engine: +%1 + + + + + There already is a field with that name. Please rename it first or choose a different name for this field. + + + + + This column is referenced in a foreign key in table %1 and thus its name cannot be changed. + + + + + There is at least one row with this field set to NULL. This makes it impossible to set this flag. Please change the table data first. + + + + + There is at least one row with a non-integer value in this field. This makes it impossible to set the AI flag. Please change the table data first. + + + + + Column '%1' has duplicate data. + + + + + + This makes it impossible to enable the 'Unique' flag. Please remove the duplicate data, which will allow the 'Unique' flag to then be enabled. + + + + + Are you sure you want to delete the field '%1'? +All data currently stored in this field will be lost. + + + + + Please add a field which meets the following criteria before setting the without rowid flag: + - Primary key flag set + - Auto increment disabled + + + + + ExportDataDialog + + + Export data as CSV + + + + + Tab&le(s) + + + + + Colu&mn names in first line + + + + + Fie&ld separator + + + + + , + + + + + ; + + + + + Tab + + + + + | + + + + + + + Other + + + + + &Quote character + + + + + " + + + + + ' + + + + + New line characters + + + + + Windows: CR+LF (\r\n) + + + + + Unix: LF (\n) + + + + + Pretty print + + + + + Export data as JSON + + + + + exporting CSV + + + + + + Could not open output file: %1 + + + + + exporting JSON + + + + + Text files(*.csv *.txt) + + + + + Text files(*.json *.js *.txt) + + + + + + Choose a filename to export data + + + + + Please select at least 1 table. + + + + + Choose a directory + + + + + Export completed. + + + + + ExportSqlDialog + + + Export SQL... + + + + + Tab&le(s) + + + + + Select All + + + + + Deselect All + + + + + &Options + + + + + Keep column names in INSERT INTO + + + + + Multiple rows (VALUES) per INSERT statement + + + + + Export everything + + + + + Export schema only + + + + + Export data only + + + + + Keep old schema (CREATE TABLE IF NOT EXISTS) + + + + + Overwrite old schema (DROP TABLE, then CREATE TABLE) + + + + + Please select at least one table. + + + + + Choose a filename to export + + + + + Text files(*.sql *.txt) + + + + + Export completed. + + + + + Export cancelled or failed. + + + + + ExtendedScintilla + + + + Ctrl+H + + + + + + Ctrl+P + + + + + Find and Replace... + + + + + Print... + + + + + ExtendedTableWidget + + + Use as Exact Filter + + + + + Containing + + + + + Not containing + + + + + Not equal to + + + + + Greater than + + + + + Less than + + + + + Greater or equal + + + + + Less or equal + + + + + Between this and... + + + + + Regular expression + + + + + Set to NULL + + + + + Copy + + + + + Copy with Headers + + + + + Copy as SQL + + + + + Paste + + + + + Print... + + + + + Use in Filter Expression + + + + + Alt+Del + + + + + Ctrl+Shift+C + + + + + Ctrl+Alt+C + + + + + The content of the clipboard is bigger than the range selected. +Do you want to insert it anyway? + + + + + FileExtensionManager + + + File Extension Manager + + + + + &Up + + + + + &Down + + + + + &Add + + + + + &Remove + + + + + + Description + + + + + Extensions + + + + + *.extension + + + + + FilterLineEdit + + + Filter + + + + + These input fields allow you to perform quick filters in the currently selected table. +By default, the rows containing the input text are filtered out. +The following operators are also supported: +% Wildcard +> Greater than +< Less than +>= Equal to or greater +<= Equal to or less += Equal to: exact match +<> Unequal: exact inverse match +x~y Range: values between x and y +/regexp/ Values matching the regular expression + + + + + Clear All Conditional Formats + + + + + Use for Conditional Format + + + + + Set Filter Expression + + + + + What's This? + + + + + Is NULL + + + + + Is not NULL + + + + + Is empty + + + + + Is not empty + + + + + Not containing... + + + + + Equal to... + + + + + Not equal to... + + + + + Greater than... + + + + + Less than... + + + + + Greater or equal... + + + + + Less or equal... + + + + + In range... + + + + + Regular expression... + + + + + FindReplaceDialog + + + Find and Replace + + + + + Fi&nd text: + + + + + Re&place with: + + + + + Match &exact case + + + + + Match &only whole words + + + + + When enabled, the search continues from the other end when it reaches one end of the page + + + + + &Wrap around + + + + + When set, the search goes backwards from cursor position, otherwise it goes forward + + + + + Search &backwards + + + + + <html><head/><body><p>When checked, the pattern to find is searched only in the current selection.</p></body></html> + + + + + &Selection only + + + + + <html><head/><body><p>When checked, the pattern to find is interpreted as a UNIX regular expression. See <a href="https://en.wikibooks.org/wiki/Regular_Expressions">Regular Expression in Wikibooks</a>.</p></body></html> + + + + + Use regular e&xpressions + + + + + Find the next occurrence from the cursor position and in the direction set by "Search backwards" + + + + + &Find Next + + + + + &Replace + + + + + Highlight all the occurrences of the text in the page + + + + + F&ind All + + + + + Replace all the occurrences of the text in the page + + + + + Replace &All + + + + + The searched text was not found + + + + + The searched text was not found. + + + + + The searched text was replaced one time. + + + + + The searched text was found one time. + + + + + The searched text was replaced %1 times. + + + + + The searched text was found %1 times. + + + + + ForeignKeyEditor + + + &Reset + + + + + Foreign key clauses (ON UPDATE, ON DELETE etc.) + + + + + ImportCsvDialog + + + Import CSV file + + + + + Table na&me + + + + + &Column names in first line + + + + + Field &separator + + + + + , + + + + + ; + + + + + + Tab + + + + + | + + + + + + + Other + + + + + &Quote character + + + + + " + + + + + ' + + + + + &Encoding + + + + + UTF-8 + + + + + UTF-16 + + + + + ISO-8859-1 + + + + + Trim fields? + + + + + Separate tables + + + + + Advanced + + + + + When importing an empty value from the CSV file into an existing table with a default value for this column, that default value is inserted. Activate this option to insert an empty value instead. + + + + + Ignore default &values + + + + + Activate this option to stop the import when trying to import an empty value into a NOT NULL column without a default value. + + + + + Fail on missing values + + + + + Disable data type detection + + + + + Disable the automatic data type detection when creating a new table. + + + + + When importing into an existing table with a primary key, unique constraints or a unique index there is a chance for a conflict. This option allows you to select a strategy for that case: By default the import is aborted and rolled back but you can also choose to ignore and not import conflicting rows or to replace the existing row in the table. + + + + + Abort import + + + + + Ignore row + + + + + Replace existing row + + + + + Conflict strategy + + + + + + Deselect All + + + + + Match Similar + + + + + Import completed + + + + + Select All + + + + + There is already a table named '%1' and an import into an existing table is only possible if the number of columns match. + + + + + There is already a table named '%1'. Do you want to import the data into it? + + + + + Creating restore point failed: %1 + + + + + Creating the table failed: %1 + + + + + importing CSV + + + + + Inserting row failed: %1 + + + + + Importing the file '%1' took %2ms. Of this %3ms were spent in the row function. + + + + + MainWindow + + + DB Browser for SQLite + + + + + Database Structure + + + + + This is the structure of the opened database. +You can drag SQL statements from an object row and drop them into other applications or into another instance of 'DB Browser for SQLite'. + + + + + + Browse Data + + + + + &Table: + + + + + Select a table to browse data + + + + + Use this list to select a table to be displayed in the database view + + + + + Refresh the data in the selected table + + + + + This button refreshes the data in the currently selected table. + + + + + Clear all filters + + + + + This button clears all the filters set in the header input fields for the currently browsed table. + + + + + Save the table as currently displayed + + + + + <html><head/><body><p>This popup menu provides the following options applying to the currently browsed and filtered table:</p><ul style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;"><li style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Export to CSV: this option exports the data of the browsed table as currently displayed (after filters, display formats and order column) to a CSV file.</li><li style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Save as view: this option saves the current setting of the browsed table (filters, display formats and order column) as an SQL view that you can later browse or use in SQL statements.</li></ul></body></html> + + + + + ... + + + + + Print currently browsed table data + + + + + Print currently browsed table data. Print selection if more than one cell is selected. + + + + + Insert a new record in the current table + + + + + <html><head/><body><p>This button creates a new record in the database. Hold the mouse button to open a pop-up menu of different options:</p><ul><li><span style=" font-weight:600;">New Record</span>: insert a new record with default values in the database.</li><li><span style=" font-weight:600;">Insert Values...</span>: open a dialog for entering values before they are inserted in the database. This allows to enter values acomplishing the different constraints. This dialog is also open if the <span style=" font-weight:600;">New Record</span> option fails due to these constraints.</li></ul></body></html> + + + + + + New Record + + + + + Delete the current record + + + + + This button deletes the record or records currently selected in the table + + + + + + Delete Record + + + + + This is the database table view. You can do the following actions: + - Start writing for editing inline the value. + - Double-click any record to edit its contents in the cell editor window. + - Alt+Del for deleting the cell content to NULL. + - Ctrl+" for duplicating the current record. + - Ctrl+' for copying the value from the cell above. + - Standard selection and copy/paste operations. + + + + + <html><head/><body><p>Scroll to the beginning</p></body></html> + + + + + <html><head/><body><p>Clicking this button navigates to the beginning in the table view above.</p></body></html> + + + + + |< + + + + + Scroll one page upwards + + + + + <html><head/><body><p>Clicking this button navigates one page of records upwards in the table view above.</p></body></html> + + + + + < + + + + + 0 - 0 of 0 + + + + + Scroll one page downwards + + + + + <html><head/><body><p>Clicking this button navigates one page of records downwards in the table view above.</p></body></html> + + + + + > + + + + + Scroll to the end + + + + + <html><head/><body><p>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Clicking this button navigates up to the end in the table view above.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</p></body></html> + + + + + >| + + + + + <html><head/><body><p>Click here to jump to the specified record</p></body></html> + + + + + <html><head/><body><p>This button is used to navigate to the record number specified in the Go to area.</p></body></html> + + + + + Go to: + + + + + Enter record number to browse + + + + + Type a record number in this area and click the Go to: button to display the record in the database view + + + + + 1 + + + + + Edit Pragmas + + + + + <html><head/><body><p><a href="https://www.sqlite.org/pragma.html#pragma_case_sensitive_like">Case Sensitive Like</a></p></body></html> + + + + + Warning: this pragma is not readable and this value has been inferred. Writing the pragma might overwrite a redefined LIKE provided by an SQLite extension. + + + + + Execute SQL + + + + + toolBar1 + + + + + &File + + + + + &Import + + + + + &Export + + + + + &Edit + + + + + &View + + + + + &Help + + + + + &Tools + + + + + DB Toolbar + + + + + Edit Database &Cell + + + + + SQL &Log + + + + + Show S&QL submitted by + + + + + User + + + + + Application + + + + + This button clears the contents of the SQL logs + + + + + &Clear + + + + + This panel lets you examine a log of all SQL commands issued by the application or by yourself + + + + + &Plot + + + + + DB Sche&ma + + + + + This is the structure of the opened database. +You can drag multiple object names from the Name column and drop them into the SQL editor and you can adjust the properties of the dropped names using the context menu. This would help you in composing SQL statements. +You can drag SQL statements from the Schema column and drop them into the SQL editor or into other applications. + + + + + + &Remote + + + + + + Project Toolbar + + + + + Extra DB toolbar + + + + + + + Close the current database file + + + + + &New Database... + + + + + + Create a new database file + + + + + This option is used to create a new database file. + + + + + Ctrl+N + + + + + + &Open Database... + + + + + + + + + Open an existing database file + + + + + + + This option is used to open an existing database file. + + + + + + Ctrl+O + + + + + &Close Database + + + + + This button closes the connection to the currently open database file + + + + + Ctrl+W + + + + + &Revert Changes + + + + + + Revert database to last saved state + + + + + This option is used to revert the current database file to its last saved state. All changes made since the last save operation are lost. + + + + + &Write Changes + + + + + + Write changes to the database file + + + + + This option is used to save changes to the database file. + + + + + Ctrl+S + + + + + Compact &Database... + + + + + Compact the database file, removing space wasted by deleted records + + + + + + Compact the database file, removing space wasted by deleted records. + + + + + E&xit + + + + + Ctrl+Q + + + + + &Database from SQL file... + + + + + Import data from an .sql dump text file into a new or existing database. + + + + + This option lets you import data from an .sql dump text file into a new or existing database. SQL dump files can be created on most database engines, including MySQL and PostgreSQL. + + + + + &Table from CSV file... + + + + + Open a wizard that lets you import data from a comma separated text file into a database table. + + + + + Open a wizard that lets you import data from a comma separated text file into a database table. CSV files can be created on most database and spreadsheet applications. + + + + + &Database to SQL file... + + + + + Export a database to a .sql dump text file. + + + + + This option lets you export a database to a .sql dump text file. SQL dump files contain all data necessary to recreate the database on most database engines, including MySQL and PostgreSQL. + + + + + &Table(s) as CSV file... + + + + + Export a database table as a comma separated text file. + + + + + Export a database table as a comma separated text file, ready to be imported into other database or spreadsheet applications. + + + + + &Create Table... + + + + + Open the Create Table wizard, where it is possible to define the name and fields for a new table in the database + + + + + &Delete Table... + + + + + + Delete Table + + + + + Open the Delete Table wizard, where you can select a database table to be dropped. + + + + + &Modify Table... + + + + + Open the Modify Table wizard, where it is possible to rename an existing table. It is also possible to add or delete fields form a table, as well as modify field names and types. + + + + + Create &Index... + + + + + Open the Create Index wizard, where it is possible to define a new index on an existing database table. + + + + + &Preferences... + + + + + + Open the preferences window. + + + + + &DB Toolbar + + + + + Shows or hides the Database toolbar. + + + + + + Ctrl+T + + + + + W&hat's This? + + + + + Shift+F1 + + + + + &About + + + + + &Recently opened + + + + + Open &tab + + + + + This button opens a new tab for the SQL editor + + + + + &Execute SQL + + + + + Execute all/selected SQL + + + + + This button executes the currently selected SQL statements. If no text is selected, all SQL statements are executed. + + + + + Ctrl+Return + + + + + Open SQL file + + + + + This button opens a file containing SQL statements and loads it in a new editor tab + + + + + + + Save SQL file + + + + + &Load Extension... + + + + + + Execute current line + + + + + This button executes the SQL statement present in the current editor line + + + + + Shift+F5 + + + + + Export as CSV file + + + + + Export table as comma separated values file + + + + + &Wiki + + + + + Bug &Report... + + + + + Feature Re&quest... + + + + + Web&site + + + + + &Donate on Patreon... + + + + + Sa&ve Project... + + + + + + Save the current session to a file + + + + + This button lets you save all the settings associated to the open DB to a DB4S project file + + + + + Open &Project... + + + + + + Load a working session from a file + + + + + This button lets you open a DB4S project file + + + + + &Attach Database... + + + + + + Add another database file to the current database connection + + + + + This button lets you add another database file to the current database connection + + + + + &Set Encryption... + + + + + + Save SQL file as + + + + + This button saves the content of the current SQL editor tab to a file + + + + + &Browse Table + + + + + Copy Create statement + + + + + Copy the CREATE statement of the item to the clipboard + + + + + Edit display format + + + + + Edit the display format of the data in this column + + + + + Show rowid column + + + + + Toggle the visibility of the rowid column + + + + + + Set encoding + + + + + Change the encoding of the text in the table cells + + + + + Set encoding for all tables + + + + + Change the default encoding assumed for all tables in the database + + + + + SQLCipher &FAQ + + + + + Opens the SQLCipher FAQ in a browser window + + + + + Table(&s) to JSON... + + + + + Export one or more table(s) to a JSON file + + + + + Refresh + + + + + F5 + + + + + Open Data&base Read Only... + + + + + Open an existing database file in read only mode + + + + + Unlock view editing + + + + + This unlocks the current view for editing. However, you will need appropriate triggers for editing. + + + + + Save results + + + + + Save the results view + + + + + This button lets you save the results of the last executed query + + + + + + Find text in SQL editor + + + + + This button opens the search bar of the editor + + + + + Ctrl+F + + + + + + Find or replace text in SQL editor + + + + + This button opens the find/replace dialog for the current editor tab + + + + + Ctrl+H + + + + + + Export to &CSV + + + + + + Save as &view + + + + + Save as view + + + + + Hide column(s) + + + + + Hide selected column(s) + + + + + Show all columns + + + + + Show all columns that were hidden + + + + + Shows or hides the Project toolbar. + + + + + Extra DB Toolbar + + + + + + Export the filtered data to CSV + + + + + This button exports the data of the browsed table as currently displayed (after filters, display formats and order column) as a CSV file. + + + + + + Save the current filter, sort column and display formats as a view + + + + + This button saves the current setting of the browsed table (filters, display formats and order column) as an SQL view that you can later browse or use in SQL statements. + + + + + Insert Values... + + + + + + Open a dialog for inserting values in a new record + + + + + + Insert new record using default values in browsed table + + + + + New In-&Memory Database + + + + + Drag && Drop Qualified Names + + + + + + Use qualified names (e.g. "Table"."Field") when dragging the objects and dropping them into the editor + + + + + Drag && Drop Enquoted Names + + + + + + Use escaped identifiers (e.g. "Table1") when dragging the objects and dropping them into the editor + + + + + &Integrity Check + + + + + Runs the integrity_check pragma over the opened database and returns the results in the Execute SQL tab. This pragma does an integrity check of the entire database. + + + + + &Foreign-Key Check + + + + + Runs the foreign_key_check pragma over the opened database and returns the results in the Execute SQL tab + + + + + &Quick Integrity Check + + + + + Run a quick integrity check over the open DB + + + + + Runs the quick_check pragma over the opened database and returns the results in the Execute SQL tab. This command does most of the checking of PRAGMA integrity_check but runs much faster. + + + + + &Optimize + + + + + Attempt to optimize the database + + + + + Runs the optimize pragma over the opened database. This pragma might perform optimizations that will improve the performance of future queries. + + + + + + Print + + + + + Print text from current SQL editor tab + + + + + Open a dialog for printing the text in the current SQL editor tab + + + + + + Ctrl+P + + + + + Print the structure of the opened database + + + + + Open a dialog for printing the structure of the opened database + + + + + Un/comment block of SQL code + + + + + Comment or uncomment current line or selected block of code + + + + + Comment or uncomment the selected lines or the current line, when there is no selection. All the block is toggled according to the first line. + + + + + Ctrl+/ + + + + + Stop SQL execution + + + + + Stop the currently running SQL script + + + + + Ctrl+L + + + + + Ctrl+D + + + + + Ctrl+I + + + + + Ctrl+E + + + + + The database is currenctly busy. + + + + + Click here to interrupt the currently running query. + + + + + Encrypted + + + + + Database is encrypted using SQLCipher + + + + + Read only + + + + + Database file is read only. Editing the database is disabled. + + + + + Database encoding + + + + + + Choose a database file + + + + + Could not open database file. +Reason: %1 + + + + + + + Choose a filename to save under + + + + + In-Memory database + + + + + You are still executing SQL statements. When closing the database now the execution will be stopped. maybe leaving the database in an incosistent state. Are you sure you want to close the database? + + + + + Error deleting record: +%1 + + + + + Please select a record first + + + + + determining row count... + + + + + %1 - %2 of >= %3 + + + + + %1 - %2 of %3 + + + + + + There is no database opened. Please open or create a new database file. + + + + + Are you sure you want to delete the table '%1'? +All data associated with the table will be lost. + + + + + Are you sure you want to delete the view '%1'? + + + + + Are you sure you want to delete the trigger '%1'? + + + + + Are you sure you want to delete the index '%1'? + + + + + Error: could not delete the table. + + + + + Error: could not delete the view. + + + + + Error: could not delete the trigger. + + + + + Error: could not delete the index. + + + + + Message from database engine: +%1 + + + + + Editing the table requires to save all pending changes now. +Are you sure you want to save the database? + + + + + Error checking foreign keys after table modification. The changes will be reverted. + + + + + This table did not pass a foreign-key check.<br/>You should run 'Tools | Foreign-Key Check' and fix the reported issues. + + + + + You are already executing SQL statements. Do you want to stop them in order to execute the current statements instead? Note that this might leave the database in an inconsistent state. + + + + + -- EXECUTING SELECTION IN '%1' +-- + + + + + -- EXECUTING LINE IN '%1' +-- + + + + + -- EXECUTING ALL IN '%1' +-- + + + + + -- At line %1: +%3 +-- Result: %2 + + + + + %1 rows returned in %2ms + + + + + Setting PRAGMA values or vacuuming will commit your current transaction. +Are you sure? + + + + + Execution finished with errors. + + + + + Execution finished without errors. + + + + + Choose text files + + + + + Text files(*.csv *.txt);;All files(*) + + + + + Error while saving the database file. This means that not all changes to the database were saved. You need to resolve the following error first. + +%1 + + + + + Are you sure you want to undo all changes made to the database file '%1' since the last save? + + + + + Choose a file to import + + + + + + + Text files(*.sql *.txt);;All files(*) + + + + + Do you want to create a new database file to hold the imported data? +If you answer no we will attempt to import the data in the SQL file to the current database. + + + + + File %1 already exists. Please choose a different name. + + + + + Error importing data: %1 + + + + + Import completed. Some foreign key constraints are violated. Please fix them before saving. + + + + + Import completed. + + + + + Delete View + + + + + Modify View + + + + + Delete Trigger + + + + + Modify Trigger + + + + + Delete Index + + + + + Modify Index + + + + + Modify Table + + + + + &%1 %2 + + + + + Setting PRAGMA values will commit your current transaction. +Are you sure? + + + + + The statements in this tab are still executing. Closing the tab will stop the execution. This might leave the database in an inconsistent state. Are you sure you want to close the tab? + + + + + Select SQL file to open + + + + + Couldn't read file: %1. + + + + + Couldn't save file: %1. + + + + + Select file name + + + + + Select extension file + + + + + Extensions(*.so *.dylib *.dll);;All files(*) + + + + + Extension successfully loaded. + + + + + Error loading extension: %1 + + + + + + Don't show again + + + + + New version available. + + + + + A new DB Browser for SQLite version is available (%1.%2.%3).<br/><br/>Please download at <a href='%4'>%4</a>. + + + + + Choose a project file to open + + + + + + DB Browser for SQLite project file (*.sqbpro) + + + + + This project file is using an old file format because it was created using DB Browser for SQLite version 3.10 or lower. Loading this file format is still fully supported but we advice you to convert all your project files to the new file format because support for older formats might be dropped at some point in the future. You can convert your files by simply opening and re-saving them. + + + + + Duplicate records + + + + + Duplicate record + + + + + Ctrl+" + + + + + Please choose a new encoding for all tables. + + + + + Please choose a new encoding for this table. + + + + + %1 +Leave the field empty for using the database encoding. + + + + + This encoding is either not valid or not supported. + + + + + Please enter a pseudo-primary key in order to enable editing on this view. This should be the name of a unique column in the view. + + + + + Collation needed! Proceed? + + + + + A table in this database requires a special collation function '%1' that this application can't provide without further knowledge. +If you choose to proceed, be aware bad things can happen to your database. +Create a backup! + + + + + creating collation + + + + + Set a new name for the SQL tab. Use the '&&' character to allow using the following character as a keyboard shortcut. + + + + + Please specify the view name + + + + + There is already an object with that name. Please choose a different name. + + + + + View successfully created. + + + + + Error creating view: %1 + + + + + There is no filter set for this table. View will not be created. + + + + + Delete Records + + + + + This action will open a new SQL tab for running: + + + + + Press Help for opening the corresponding SQLite reference page. + + + + + Busy (%1) + + + + + NullLineEdit + + + Set to NULL + + + + + Alt+Del + + + + + PlotDock + + + Plot + + + + + <html><head/><body><p>This pane shows the list of columns of the currently browsed table or the just executed query. You can select the columns that you want to be used as X or Y axis for the plot pane below. The table shows detected axis type that will affect the resulting plot. For the Y axis you can only select numeric columns, but for the X axis you will be able to select:</p><ul style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;"><li style=" margin-top:12px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Date/Time</span>: strings with format &quot;yyyy-MM-dd hh:mm:ss&quot; or &quot;yyyy-MM-ddThh:mm:ss&quot;</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Date</span>: strings with format &quot;yyyy-MM-dd&quot;</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Time</span>: strings with format &quot;hh:mm:ss&quot;</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Label</span>: other string formats. Selecting this column as X axis will produce a Bars plot with the column values as labels for the bars</li><li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Numeric</span>: integer or real values</li></ul><p>Double-clicking the Y cells you can change the used color for that graph.</p></body></html> + + + + + Columns + + + + + X + + + + + Y + + + + + Axis Type + + + + + Here is a plot drawn when you select the x and y values above. + +Click on points to select them in the plot and in the table. Ctrl+Click for selecting a range of points. + +Use mouse-wheel for zooming and mouse drag for changing the axis range. + +Select the axes or axes labels to drag and zoom only in that orientation. + + + + + Line type: + + + + + + None + + + + + Line + + + + + StepLeft + + + + + StepRight + + + + + StepCenter + + + + + Impulse + + + + + Point shape: + + + + + Cross + + + + + Plus + + + + + Circle + + + + + Disc + + + + + Square + + + + + Diamond + + + + + Star + + + + + Triangle + + + + + TriangleInverted + + + + + CrossSquare + + + + + PlusSquare + + + + + CrossCircle + + + + + PlusCircle + + + + + Peace + + + + + <html><head/><body><p>Save current plot...</p><p>File format chosen by extension (png, jpg, pdf, bmp)</p></body></html> + + + + + Save current plot... + + + + + + Load all data and redraw plot + + + + + Copy + + + + + Print... + + + + + Show legend + + + + + Stacked bars + + + + + Date/Time + + + + + Date + + + + + Time + + + + + + Numeric + + + + + Label + + + + + Invalid + + + + + + + Row # + + + + + Load all data and redraw plot. +Warning: not all data has been fetched from the table yet due to the partial fetch mechanism. + + + + + Choose an axis color + + + + + Choose a filename to save under + + + + + PNG(*.png);;JPG(*.jpg);;PDF(*.pdf);;BMP(*.bmp);;All Files(*) + + + + + There are curves in this plot and the selected line style can only be applied to graphs sorted by X. Either sort the table or query by X to remove curves or select one of the styles supported by curves: None or Line. + + + + + PreferencesDialog + + + Preferences + + + + + &General + + + + + Default &location + + + + + Remember last location + + + + + Always use this location + + + + + Remember last location for session only + + + + + + + ... + + + + + Lan&guage + + + + + Toolbar style + + + + + Only display the icon + + + + + Only display the text + + + + + The text appears beside the icon + + + + + The text appears under the icon + + + + + Follow the style + + + + + + + + + + + + enabled + + + + + Automatic &updates + + + + + DB file extensions + + + + + Manage + + + + + Show remote options + + + + + &Database + + + + + Database &encoding + + + + + Open databases with foreign keys enabled. + + + + + &Foreign keys + + + + + Remove line breaks in schema &view + + + + + When enabled, the line breaks in the Schema column of the DB Structure tab, dock and printed output are removed. + + + + + Prefetch block si&ze + + + + + Advanced + + + + + SQ&L to execute after opening database + + + + + Default field type + + + + + Data &Browser + + + + + Font + + + + + &Font + + + + + Font si&ze + + + + + Content + + + + + Symbol limit in cell + + + + + + This is the maximum number of rows in a table for enabling the value completion based on current values in the column. +Can be set to 0 for disabling completion. + + + + + Row count threshold for completion + + + + + Field display + + + + + Displayed &text + + + + + Binary + + + + + NULL + + + + + Regular + + + + + Text color + + + + + Background color + + + + + Preview only (N/A) + + + + + Filters + + + + + Escape character + + + + + Delay time (&ms) + + + + + Set the waiting time before a new filter value is applied. Can be set to 0 for disabling waiting. + + + + + &SQL + + + + + Settings name + + + + + Context + + + + + Colour + + + + + Bold + + + + + Italic + + + + + Underline + + + + + Keyword + + + + + Function + + + + + Table + + + + + Comment + + + + + Identifier + + + + + String + + + + + Current line + + + + + Background + + + + + Foreground + + + + + SQL editor &font + + + + + SQL &editor font size + + + + + SQL &results font size + + + + + Tab size + + + + + &Wrap lines + + + + + Never + + + + + At word boundaries + + + + + At character boundaries + + + + + At whitespace boundaries + + + + + &Quotes for identifiers + + + + + Choose the quoting mechanism used by the application for identifiers in SQL code. + + + + + "Double quotes" - Standard SQL (recommended) + + + + + `Grave accents` - Traditional MySQL quotes + + + + + [Square brackets] - Traditional MS SQL Server quotes + + + + + Code co&mpletion + + + + + Keywords in &UPPER CASE + + + + + When set, the SQL keywords are completed in UPPER CASE letters. + + + + + Error indicators + + + + + When set, the SQL code lines that caused errors during the last execution are highlighted and the results frame indicates the error in the background + + + + + Hori&zontal tiling + + + + + If enabled the SQL code editor and the result table view are shown side by side instead of one over the other. + + + + + &Extensions + + + + + Select extensions to load for every database: + + + + + Add extension + + + + + Remove extension + + + + + <html><head/><body><p>While supporting the REGEXP operator SQLite doesn't implement any regular expression<br/>algorithm but calls back the running application. DB Browser for SQLite implements this<br/>algorithm for you to let you use REGEXP out of the box. However, as there are multiple possible<br/>implementations of this and you might want to use another one, you're free to disable the<br/>application's implementation and load your own by using an extension. Requires restart of the application.</p></body></html> + + + + + Disable Regular Expression extension + + + + + <html><head/><body><p>SQLite provides an SQL function for loading extensions from a shared library file. Activate this if you want to use the <span style=" font-style:italic;">load_extension()</span> function from SQL code.</p><p>For security reasons, extension loading is turned off by default and must be enabled through this setting. You can always load extensions through the GUI, even though this option is disabled.</p></body></html> + + + + + Allow loading extensions from SQL code + + + + + Remote + + + + + Your certificates + + + + + File + + + + + + Subject CN + + + + + Subject Common Name + + + + + Issuer CN + + + + + Issuer Common Name + + + + + + Valid from + + + + + + Valid to + + + + + + Serial number + + + + + CA certificates + + + + + Common Name + + + + + Subject O + + + + + Organization + + + + + Clone databases into + + + + + + Choose a directory + + + + + The language will change after you restart the application. + + + + + Select extension file + + + + + Extensions(*.so *.dylib *.dll);;All files(*) + + + + + Import certificate file + + + + + No certificates found in this file. + + + + + Are you sure you want do remove this certificate? All certificate data will be deleted from the application settings! + + + + + Are you sure you want to clear all the saved settings? +All your preferences will be lost and default values will be used. + + + + + QObject + + + All files (*) + + + + + Error importing data + + + + + from record number %1 + + + + + . +%1 + + + + + Importing CSV file... + + + + + Cancel + + + + + SQLite database files (*.db *.sqlite *.sqlite3 *.db3) + + + + + RemoteDatabase + + + Error when connecting to %1. +%2 + + + + + Error opening remote file at %1. +%2 + + + + + Error: Invalid client certificate specified. + + + + + Please enter the passphrase for this client certificate in order to authenticate. + + + + + Cancel + + + + + Uploading remote database to +%1 + + + + + Downloading remote database from +%1 + + + + + + Error: The network is not accessible. + + + + + Error: Cannot open the file for sending. + + + + + Error opening local databases list. +%1 + + + + + Error creating local databases list. +%1 + + + + + The remote database has been updated since the last checkout. Do you want to update the local database to the newest version? Note that this discards any changes you have made locally! If you don't want to lose local changes, click No to open the local version. + + + + + RemoteDock + + + Remote + + + + + Identity + + + + + Connect to the remote server using the currently selected identity. The correct server is taken from the identity as well. + + + + + Go + + + + + Push currently opened database to server + + + + + <html><head/><body><p>In this pane, remote databases from dbhub.io website can be added to DB4S. First you need an identity:</p><ol style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;"><li style=" margin-top:12px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Login to the dbhub.io website (use your GitHub credentials or whatever you want)</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Click the button to create a DB4S certificate (that's your identity). That'll give you a certificate file (save it to your local disk).</li><li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Go to the Remote tab in DB4S Preferences. Click the button to add a new certificate to DB4S and choose the just downloaded certificate file.</li></ol><p>Now the Remote panel shows your identity and you can add remote databases.</p></body></html> + + + + + <html><head/><body><p>No DBHub.io account yet? <a href="https://dbhub.io/"><span style=" text-decoration: underline; color:#007af4;">Create one now</span></a> and import your certificate <a href="#preferences"><span style=" text-decoration: underline; color:#007af4;">here</span></a> to share your databases.</p><p>For online help visit <a href="https://dbhub.io/about"><span style=" text-decoration: underline; color:#007af4;">here</span></a>.</p></body></html> + + + + + RemoteModel + + + Name + + + + + Commit + + + + + Last modified + + + + + Size + + + + + bytes + + + + + RemotePushDialog + + + Push database + + + + + Database na&me to push to + + + + + Commit message + + + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Oxygen-Sans'; font-size:10pt; font-weight:400; font-style:normal;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p></body></html> + + + + + Database licence + + + + + Public + + + + + Branch + + + + + Force push + + + + + Database will be public. Everyone has read access to it. + + + + + Database will be private. Only you have access to it. + + + + + Use with care. This can cause remote commits to be deleted. + + + + + Unspecified + + + + + RunSql + + + Execution aborted by user + + + + + , %1 rows affected + + + + + query executed successfully. Took %1ms%2 + + + + + executing query + + + + + SqlExecutionArea + + + Form + + + + + Find previous match [Shift+F3] + + + + + Find previous match with mapping + + + + + Shift+F3 + + + + + The found pattern must be a whole word + + + + + Whole Words + + + + + Text pattern to find considering the checks in this frame + + + + + Find in editor + + + + + The found pattern must match in letter case + + + + + Case Sensitive + + + + + Find next match [Enter, F3] + + + + + Find next match with wrapping + + + + + F3 + + + + + Interpret search pattern as a regular expression + + + + + <html><head/><body><p>When checked, the pattern to find is interpreted as a UNIX regular expression. See <a href="https://en.wikibooks.org/wiki/Regular_Expressions">Regular Expression in Wikibooks</a>.</p></body></html> + + + + + Regular Expression + + + + + + Close Find Bar + + + + + + Results of the last executed statements + + + + + This field shows the results and status codes of the last executed statements. + + + + + SqlTextEdit + + + Ctrl+/ + + + + + SqlUiLexer + + + (X) The abs(X) function returns the absolute value of the numeric argument X. + + + + + () The changes() function returns the number of database rows that were changed or inserted or deleted by the most recently completed INSERT, DELETE, or UPDATE statement. + + + + + (X1,X2,...) The char(X1,X2,...,XN) function returns a string composed of characters having the unicode code point values of integers X1 through XN, respectively. + + + + + (X,Y,...) The coalesce() function returns a copy of its first non-NULL argument, or NULL if all arguments are NULL + + + + + (X,Y) The glob(X,Y) function is equivalent to the expression "Y GLOB X". + + + + + (X,Y) The ifnull() function returns a copy of its first non-NULL argument, or NULL if both arguments are NULL. + + + + + (X,Y) The instr(X,Y) function finds the first occurrence of string Y within string X and returns the number of prior characters plus 1, or 0 if Y is nowhere found within X. + + + + + (X) The hex() function interprets its argument as a BLOB and returns a string which is the upper-case hexadecimal rendering of the content of that blob. + + + + + () The last_insert_rowid() function returns the ROWID of the last row insert from the database connection which invoked the function. + + + + + (X) For a string value X, the length(X) function returns the number of characters (not bytes) in X prior to the first NUL character. + + + + + (X,Y) The like() function is used to implement the "Y LIKE X" expression. + + + + + (X,Y,Z) The like() function is used to implement the "Y LIKE X ESCAPE Z" expression. + + + + + (X) The load_extension(X) function loads SQLite extensions out of the shared library file named X. +Use of this function must be authorized from Preferences. + + + + + (X,Y) The load_extension(X) function loads SQLite extensions out of the shared library file named X using the entry point Y. +Use of this function must be authorized from Preferences. + + + + + (X) The lower(X) function returns a copy of string X with all ASCII characters converted to lower case. + + + + + (X) ltrim(X) removes spaces from the left side of X. + + + + + (X,Y) The ltrim(X,Y) function returns a string formed by removing any and all characters that appear in Y from the left side of X. + + + + + (X,Y,...) The multi-argument max() function returns the argument with the maximum value, or return NULL if any argument is NULL. + + + + + (X,Y,...) The multi-argument min() function returns the argument with the minimum value. + + + + + (X,Y) The nullif(X,Y) function returns its first argument if the arguments are different and NULL if the arguments are the same. + + + + + (FORMAT,...) The printf(FORMAT,...) SQL function works like the sqlite3_mprintf() C-language function and the printf() function from the standard C library. + + + + + (X) The quote(X) function returns the text of an SQL literal which is the value of its argument suitable for inclusion into an SQL statement. + + + + + () The random() function returns a pseudo-random integer between -9223372036854775808 and +9223372036854775807. + + + + + (N) The randomblob(N) function return an N-byte blob containing pseudo-random bytes. + + + + + (X,Y,Z) The replace(X,Y,Z) function returns a string formed by substituting string Z for every occurrence of string Y in string X. + + + + + (X) The round(X) function returns a floating-point value X rounded to zero digits to the right of the decimal point. + + + + + (X,Y) The round(X,Y) function returns a floating-point value X rounded to Y digits to the right of the decimal point. + + + + + (X) rtrim(X) removes spaces from the right side of X. + + + + + (X,Y) The rtrim(X,Y) function returns a string formed by removing any and all characters that appear in Y from the right side of X. + + + + + (X) The soundex(X) function returns a string that is the soundex encoding of the string X. + + + + + (X,Y) substr(X,Y) returns all characters through the end of the string X beginning with the Y-th. + + + + + (X,Y,Z) The substr(X,Y,Z) function returns a substring of input string X that begins with the Y-th character and which is Z characters long. + + + + + () The total_changes() function returns the number of row changes caused by INSERT, UPDATE or DELETE statements since the current database connection was opened. + + + + + (X) trim(X) removes spaces from both ends of X. + + + + + (X,Y) The trim(X,Y) function returns a string formed by removing any and all characters that appear in Y from both ends of X. + + + + + (X) The typeof(X) function returns a string that indicates the datatype of the expression X. + + + + + (X) The unicode(X) function returns the numeric unicode code point corresponding to the first character of the string X. + + + + + (X) The upper(X) function returns a copy of input string X in which all lower-case ASCII characters are converted to their upper-case equivalent. + + + + + (N) The zeroblob(N) function returns a BLOB consisting of N bytes of 0x00. + + + + + + + + (timestring,modifier,modifier,...) + + + + + (format,timestring,modifier,modifier,...) + + + + + (X) The avg() function returns the average value of all non-NULL X within a group. + + + + + (X) The count(X) function returns a count of the number of times that X is not NULL in a group. + + + + + (X) The group_concat() function returns a string which is the concatenation of all non-NULL values of X. + + + + + (X,Y) The group_concat() function returns a string which is the concatenation of all non-NULL values of X. If parameter Y is present then it is used as the separator between instances of X. + + + + + (X) The max() aggregate function returns the maximum value of all values in the group. + + + + + (X) The min() aggregate function returns the minimum non-NULL value of all values in the group. + + + + + + (X) The sum() and total() aggregate functions return sum of all non-NULL values in the group. + + + + + () The number of the row within the current partition. Rows are numbered starting from 1 in the order defined by the ORDER BY clause in the window definition, or in arbitrary order otherwise. + + + + + () The row_number() of the first peer in each group - the rank of the current row with gaps. If there is no ORDER BY clause, then all rows are considered peers and this function always returns 1. + + + + + () The number of the current row's peer group within its partition - the rank of the current row without gaps. Partitions are numbered starting from 1 in the order defined by the ORDER BY clause in the window definition. If there is no ORDER BY clause, then all rows are considered peers and this function always returns 1. + + + + + () Despite the name, this function always returns a value between 0.0 and 1.0 equal to (rank - 1)/(partition-rows - 1), where rank is the value returned by built-in window function rank() and partition-rows is the total number of rows in the partition. If the partition contains only one row, this function returns 0.0. + + + + + () The cumulative distribution. Calculated as row-number/partition-rows, where row-number is the value returned by row_number() for the last peer in the group and partition-rows the number of rows in the partition. + + + + + (N) Argument N is handled as an integer. This function divides the partition into N groups as evenly as possible and assigns an integer between 1 and N to each group, in the order defined by the ORDER BY clause, or in arbitrary order otherwise. If necessary, larger groups occur first. This function returns the integer value assigned to the group that the current row is a part of. + + + + + (expr) Returns the result of evaluating expression expr against the previous row in the partition. Or, if there is no previous row (because the current row is the first), NULL. + + + + + (expr,offset) If the offset argument is provided, then it must be a non-negative integer. In this case the value returned is the result of evaluating expr against the row offset rows before the current row within the partition. If offset is 0, then expr is evaluated against the current row. If there is no row offset rows before the current row, NULL is returned. + + + + + + (expr,offset,default) If default is also provided, then it is returned instead of NULL if the row identified by offset does not exist. + + + + + (expr) Returns the result of evaluating expression expr against the next row in the partition. Or, if there is no next row (because the current row is the last), NULL. + + + + + (expr,offset) If the offset argument is provided, then it must be a non-negative integer. In this case the value returned is the result of evaluating expr against the row offset rows after the current row within the partition. If offset is 0, then expr is evaluated against the current row. If there is no row offset rows after the current row, NULL is returned. + + + + + (expr) This built-in window function calculates the window frame for each row in the same way as an aggregate window function. It returns the value of expr evaluated against the first row in the window frame for each row. + + + + + (expr) This built-in window function calculates the window frame for each row in the same way as an aggregate window function. It returns the value of expr evaluated against the last row in the window frame for each row. + + + + + (expr,N) This built-in window function calculates the window frame for each row in the same way as an aggregate window function. It returns the value of expr evaluated against the row N of the window frame. Rows are numbered within the window frame starting from 1 in the order defined by the ORDER BY clause if one is present, or in arbitrary order otherwise. If there is no Nth row in the partition, then NULL is returned. + + + + + SqliteTableModel + + + reading rows + + + + + loading... + + + + + References %1(%2) +Hold %3Shift and click to jump there + + + + + Error changing data: +%1 + + + + + retrieving list of columns + + + + + Fetching data... + + + + + Cancel + + + + + VacuumDialog + + + Compact Database + + + + + Warning: Compacting the database will commit all of your changes. + + + + + Please select the databases to co&mpact: + + + + diff -Nru sqlitebrowser-3.10.100ubuntu1/src/translations/sqlb_fr.ts sqlitebrowser-3.11.1/src/translations/sqlb_fr.ts --- sqlitebrowser-3.10.100ubuntu1/src/translations/sqlb_fr.ts 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/src/translations/sqlb_fr.ts 2019-02-19 23:51:34.000000000 +0000 @@ -19,9 +19,13 @@ - <html><head/><body><p>DB Browser for SQLite is an open source, freeware visual tool used to create, design and edit SQLite database files.</p><p>It is bi-licensed under the Mozilla Public License Version 2, as well as the GNU General Public License Version 3 or later. You can modify or redistribute it under the conditions of these licenses.</p><p>See <a href="http://www.gnu.org/licenses/gpl.html"><span style=" text-decoration: underline; color:#0000ff;">http://www.gnu.org/licenses/gpl.html</span></a> and <a href="https://www.mozilla.org/MPL/2.0/index.txt"><span style=" text-decoration: underline; color:#0000ff;">https://www.mozilla.org/MPL/2.0/index.txt</span></a> for details.</p><p>For more information on this program please visit our website at: <a href="http://sqlitebrowser.org"><span style=" text-decoration: underline; color:#0000ff;">http://sqlitebrowser.org</span></a></p><p><span style=" font-size:small;">This software uses the GPL/LGPL Qt Toolkit from </span><a href="http://qt-project.org/"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://qt-project.org/</span></a><span style=" font-size:small;"><br/>See </span><a href="http://qt-project.org/doc/qt-5/licensing.html"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://qt-project.org/doc/qt-5/licensing.html</span></a><span style=" font-size:small;"> for licensing terms and information.</span></p><p><span style=" font-size:small;">It also uses the Silk icon set by Mark James licensed under a Creative Commons Attribution 2.5 and 3.0 license.<br/>See </span><a href="http://www.famfamfam.com/lab/icons/silk/"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://www.famfamfam.com/lab/icons/silk/</span></a><span style=" font-size:small;"> for details.</span></p></body></html> + <html><head/><body><p>DB Browser for SQLite is an open source, freeware visual tool used to create, design and edit SQLite database files.</p><p>It is bi-licensed under the Mozilla Public License Version 2, as well as the GNU General Public License Version 3 or later. You can modify or redistribute it under the conditions of these licenses.</p><p>See <a href="http://www.gnu.org/licenses/gpl.html">http://www.gnu.org/licenses/gpl.html</a> and <a href="https://www.mozilla.org/MPL/2.0/index.txt">https://www.mozilla.org/MPL/2.0/index.txt</a> for details.</p><p>For more information on this program please visit our website at: <a href="http://sqlitebrowser.org">http://sqlitebrowser.org</a></p><p><span style=" font-size:small;">This software uses the GPL/LGPL Qt Toolkit from </span><a href="http://qt-project.org/"><span style=" font-size:small;">http://qt-project.org/</span></a><span style=" font-size:small;"><br/>See </span><a href="http://qt-project.org/doc/qt-5/licensing.html"><span style=" font-size:small;">http://qt-project.org/doc/qt-5/licensing.html</span></a><span style=" font-size:small;"> for licensing terms and information.</span></p><p><span style=" font-size:small;">It also uses the Silk icon set by Mark James licensed under a Creative Commons Attribution 2.5 and 3.0 license.<br/>See </span><a href="http://www.famfamfam.com/lab/icons/silk/"><span style=" font-size:small;">http://www.famfamfam.com/lab/icons/silk/</span></a><span style=" font-size:small;"> for details.</span></p></body></html> + <html><head/><body><p>DB Browser pour SQLite est un logiciel libre, open-source utilisé pour créer, concevoir et modifier des Bases de Données SQLite.</p><p>Ce programme vous est proposé sous une double licence : Mozilla Public License Version 2 et GNU General Public License Version 3 ou suivante. Vous pouvez le modifier ou le redistribuer en respectant les conditions de ces licences.</p><p>Voir : <a href="http://www.gnu.org/licenses/gpl.html">http://www.gnu.org/licenses/gpl.html</a> et <a href="https://www.mozilla.org/MPL/2.0/index.txt">https://www.mozilla.org/MPL/2.0/index.txt</a> pour plus de détails</p><p>Pour plus d'information concernant ce programme, visitez notre site Internet : <a href="http://sqlitebrowser.org">http://sqlitebrowser.org</a></p><p><span style=" font-size:small;">Ce logiciel utilise le GPL/LGPL Qt Toolkit fourni par </span><a href="http://qt-project.org/"><span style=" font-size:small;">http://qt-project.org/</span></a><span style=" font-size:small;"><br/>Voir : </span><a href="http://qt-project.org/doc/qt-5/licensing.html"><span style=" font-size:small;">http://qt-project.org/doc/qt-5/licensing.html</span></a><span style=" font-size:small;"> pour les conditions de licence et toute autre information.</span></p><p><span style=" font-size:small;">Il utilise le jeu d&apos;icones Silk créé par Mark James disponible selon la licence Creative Commons Attribution 2.5 and 3.0.<br/>Voir </span><a href="http://www.famfamfam.com/lab/icons/silk/"><span style=" font-size:small;">http://www.famfamfam.com/lab/icons/silk/</span></a><span style=" font-size:small;"> pour plus de details.</span></p></body></html> + + + <html><head/><body><p>DB Browser for SQLite is an open source, freeware visual tool used to create, design and edit SQLite database files.</p><p>It is bi-licensed under the Mozilla Public License Version 2, as well as the GNU General Public License Version 3 or later. You can modify or redistribute it under the conditions of these licenses.</p><p>See <a href="http://www.gnu.org/licenses/gpl.html"><span style=" text-decoration: underline; color:#0000ff;">http://www.gnu.org/licenses/gpl.html</span></a> and <a href="https://www.mozilla.org/MPL/2.0/index.txt"><span style=" text-decoration: underline; color:#0000ff;">https://www.mozilla.org/MPL/2.0/index.txt</span></a> for details.</p><p>For more information on this program please visit our website at: <a href="https://sqlitebrowser.org"><span style=" text-decoration: underline; color:#0000ff;">https://sqlitebrowser.org</span></a></p><p><span style=" font-size:small;">This software uses the GPL/LGPL Qt Toolkit from </span><a href="http://qt-project.org/"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://qt-project.org/</span></a><span style=" font-size:small;"><br/>See </span><a href="http://qt-project.org/doc/qt-5/licensing.html"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://qt-project.org/doc/qt-5/licensing.html</span></a><span style=" font-size:small;"> for licensing terms and information.</span></p><p><span style=" font-size:small;">It also uses the Silk icon set by Mark James licensed under a Creative Commons Attribution 2.5 and 3.0 license.<br/>See </span><a href="http://www.famfamfam.com/lab/icons/silk/"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://www.famfamfam.com/lab/icons/silk/</span></a><span style=" font-size:small;"> for details.</span></p></body></html> DB Browser for SQLite est un logiciel libre, open-source utilisé pour créer, concevoir et modifier des bases de données SQLite. - <html><head/><body><p>DB Browser pour SQLite est un logiciel libre, open-source utilisé pour créer, concevoir et modifier des Bases de Données SQLite.</p><p>Ce programme est proposé sous une double licence : Mozilla Public License Version 2 et GNU General Public License Version 3 ou suivante. Vous pouvez le modifier ou le redistribuer en respectant les conditions de ces licences.</p><p>Voir <a href="http://www.gnu.org/licenses/gpl.html"><span style=" text-decoration: underline; color:#0000ff;">http://www.gnu.org/licenses/gpl.html</span></a> et <a href="https://www.mozilla.org/MPL/2.0/index.txt"><span style=" text-decoration: underline; color:#0000ff;">https://www.mozilla.org/MPL/2.0/index.txt</span></a> pour plus de détails.</p><p>Pour plus d'information concernant ce programme, visitez notre site Internet sur : <a href="http://sqlitebrowser.org"><span style=" text-decoration: underline; color:#0000ff;">http://sqlitebrowser.org</span></a></p><p><span style=" font-size:small;">Ce logiciel utilise le GPL/LGPL Qt Toolkit fourni par </span><a href="http://qt-project.org/"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://qt-project.org/</span></a><span style=" font-size:small;"><br/>Voir </span><a href="http://qt-project.org/doc/qt-5/licensing.html"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://qt-project.org/doc/qt-5/licensing.html</span></a><span style=" font-size:small;"> pour les conditions de licence et toute autre information.</span></p><p><span style=" font-size:small;">Il utilise le jeu d'icones Silk créé par Mark James disponible selon la licence Creative Commons Attribution 2.5 and 3.0.<br/>Voir </span><a href="http://www.famfamfam.com/lab/icons/silk/"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://www.famfamfam.com/lab/icons/silk/</span></a><span style=" font-size:small;"> pour plus de détails.</span></p></body></html> + <html><head/><body><p>DB Browser pour SQLite est un logiciel libre, open-source utilisé pour créer, concevoir et modifier des Bases de Données SQLite.</p><p>Ce programme est proposé sous une double licence : Mozilla Public License Version 2 et GNU General Public License Version 3 ou suivante. Vous pouvez le modifier ou le redistribuer en respectant les conditions de ces licences.</p><p>Voir <a href="http://www.gnu.org/licenses/gpl.html"><span style=" text-decoration: underline; color:#0000ff;">http://www.gnu.org/licenses/gpl.html</span></a> et <a href="https://www.mozilla.org/MPL/2.0/index.txt"><span style=" text-decoration: underline; color:#0000ff;">https://www.mozilla.org/MPL/2.0/index.txt</span></a> pour plus de détails.</p><p>Pour plus d'information concernant ce programme, visitez notre site Internet sur : <a href="https://sqlitebrowser.org"><span style=" text-decoration: underline; color:#0000ff;">https://sqlitebrowser.org</span></a></p><p><span style=" font-size:small;">Ce logiciel utilise le GPL/LGPL Qt Toolkit fourni par </span><a href="http://qt-project.org/"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://qt-project.org/</span></a><span style=" font-size:small;"><br/>Voir </span><a href="http://qt-project.org/doc/qt-5/licensing.html"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://qt-project.org/doc/qt-5/licensing.html</span></a><span style=" font-size:small;"> pour les conditions de licence et toute autre information.</span></p><p><span style=" font-size:small;">Il utilise le jeu d'icones Silk créé par Mark James disponible selon la licence Creative Commons Attribution 2.5 and 3.0.<br/>Voir </span><a href="http://www.famfamfam.com/lab/icons/silk/"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://www.famfamfam.com/lab/icons/silk/</span></a><span style=" font-size:small;"> pour plus de détails.</span></p></body></html> Qt Version @@ -32,45 +36,142 @@ Version de SQLite - &lt;html><head/><body><p>SQLite Database Browser is an open source, freeware visual tool used to create, design and edit SQLite database files.</p><p>It is bi-licensed under the Mozilla Public License Version 2, as well as the GNU General Public License Version 3 or later. You can modify or redistribute it under the conditions of these licenses.</p><p>See <a href="http://www.gnu.org/licenses/gpl.html"><span style=" text-decoration: underline; color:#0000ff;">http://www.gnu.org/licenses/gpl.html</span></a> and <a href="https://www.mozilla.org/MPL/2.0/index.txt"><span style=" text-decoration: underline; color:#0000ff;">https://www.mozilla.org/MPL/2.0/index.txt</span></a> for details.</p><p>For more information on this program please visit our website at: <a href="http://sqlitebrowser.org"><span style=" text-decoration: underline; color:#0000ff;">http://sqlitebrowser.org</span></a></p><p><span style=" font-size:small;">This software uses the GPL/LGPL Qt Toolkit from </span><a href="http://qt-project.org/"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://qt-project.org/</span></a><span style=" font-size:small;"><br/>See </span><a href="http://qt-project.org/doc/qt-5/licensing.html"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://qt-project.org/doc/qt-5/licensing.html</span></a><span style=" font-size:small;"> for licensing terms and information.</span></p><p><span style=" font-size:small;">It also uses the Silk icon set by Mark James licensed under a Creative Commons Attribution 2.5 and 3.0 license.<br/>See </span><a href="http://www.famfamfam.com/lab/icons/silk/"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://www.famfamfam.com/lab/icons/silk/</span></a><span style=" font-size:small;"> for details.</span></p></body></html> - &lt;head/><meta charset="UTF-8"><body><p>SQLite Database Browser est un outil visuel, libre et open-source, pour créer, définir et éditer des bases de données SQLite.</p><p>Il est fourni sous une double licence, la licence Mozilla Public License Version 2 et la licence GNU General Public License Version 3 ou ultérieure. Vous pouvez modifier ou redistribuer de programme dans les mêmes conditions de licence.</p><p>Pour plus de détails, voir : <a href="http://www.gnu.org/licenses/gpl.html"><span style=" text-decoration: underline; color:#0000ff;">http://www.gnu.org/licenses/gpl.html</span></a> et <a href="https://www.mozilla.org/MPL/2.0/index.txt"><span style=" text-decoration: underline; color:#0000ff;">https://www.mozilla.org/MPL/2.0/index.txt</span></a>.</p><p>Pour plus d'information à propos de ce programme, merci de visiter notre site Internet à l'adresse suivante : <a href="http://sqlitebrowser.org"><span style=" text-decoration: underline; color:#0000ff;">http://sqlitebrowser.org</span></a>.</p><p><span style=" font-size:small;">Ce logiciel utilise le boite à outils GPL/LGPL Qt Toolkit de </span><a href="http://qt-project.org/"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://qt-project.org/</span></a>.<span style=" font-size:small;"><br/>Pour toute information et licences, voir : </span><a href="http://qt-project.org/doc/qt-5/licensing.html"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://qt-project.org/doc/qt-5/licensing.html</span></a>.</p><p><span style=" font-size:small;">Il utilise aussi le jeu d'icônes Silk créé par Mark James, qui est sous licence Creative Commons Attribution 2.5 et 3.0.<br/>Pour plus de détails, voir : </span><a href="http://www.famfamfam.com/lab/icons/silk/"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://www.famfamfam.com/lab/icons/silk/</span></a>.</p></body></html> + &lt;html><head/><body><p>SQLite Database Browser is an open source, freeware visual tool used to create, design and edit SQLite database files.</p><p>It is bi-licensed under the Mozilla Public License Version 2, as well as the GNU General Public License Version 3 or later. You can modify or redistribute it under the conditions of these licenses.</p><p>See <a href="http://www.gnu.org/licenses/gpl.html"><span style=" text-decoration: underline; color:#0000ff;">http://www.gnu.org/licenses/gpl.html</span></a> and <a href="https://www.mozilla.org/MPL/2.0/index.txt"><span style=" text-decoration: underline; color:#0000ff;">https://www.mozilla.org/MPL/2.0/index.txt</span></a> for details.</p><p>For more information on this program please visit our website at: <a href="https://sqlitebrowser.org"><span style=" text-decoration: underline; color:#0000ff;">https://sqlitebrowser.org</span></a></p><p><span style=" font-size:small;">This software uses the GPL/LGPL Qt Toolkit from </span><a href="http://qt-project.org/"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://qt-project.org/</span></a><span style=" font-size:small;"><br/>See </span><a href="http://qt-project.org/doc/qt-5/licensing.html"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://qt-project.org/doc/qt-5/licensing.html</span></a><span style=" font-size:small;"> for licensing terms and information.</span></p><p><span style=" font-size:small;">It also uses the Silk icon set by Mark James licensed under a Creative Commons Attribution 2.5 and 3.0 license.<br/>See </span><a href="http://www.famfamfam.com/lab/icons/silk/"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://www.famfamfam.com/lab/icons/silk/</span></a><span style=" font-size:small;"> for details.</span></p></body></html> + &lt;head/><meta charset="UTF-8"><body><p>SQLite Database Browser est un outil visuel, libre et open-source, pour créer, définir et éditer des bases de données SQLite.</p><p>Il est fourni sous une double licence, la licence Mozilla Public License Version 2 et la licence GNU General Public License Version 3 ou ultérieure. Vous pouvez modifier ou redistribuer de programme dans les mêmes conditions de licence.</p><p>Pour plus de détails, voir : <a href="http://www.gnu.org/licenses/gpl.html"><span style=" text-decoration: underline; color:#0000ff;">http://www.gnu.org/licenses/gpl.html</span></a> et <a href="https://www.mozilla.org/MPL/2.0/index.txt"><span style=" text-decoration: underline; color:#0000ff;">https://www.mozilla.org/MPL/2.0/index.txt</span></a>.</p><p>Pour plus d'information à propos de ce programme, merci de visiter notre site Internet à l'adresse suivante : <a href="https://sqlitebrowser.org"><span style=" text-decoration: underline; color:#0000ff;">https://sqlitebrowser.org</span></a>.</p><p><span style=" font-size:small;">Ce logiciel utilise le boite à outils GPL/LGPL Qt Toolkit de </span><a href="http://qt-project.org/"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://qt-project.org/</span></a>.<span style=" font-size:small;"><br/>Pour toute information et licences, voir : </span><a href="http://qt-project.org/doc/qt-5/licensing.html"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://qt-project.org/doc/qt-5/licensing.html</span></a>.</p><p><span style=" font-size:small;">Il utilise aussi le jeu d'icônes Silk créé par Mark James, qui est sous licence Creative Commons Attribution 2.5 et 3.0.<br/>Pour plus de détails, voir : </span><a href="http://www.famfamfam.com/lab/icons/silk/"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://www.famfamfam.com/lab/icons/silk/</span></a>.</p></body></html> + + + + (based on SQLite %1) + (basé sur SQLite %1) - + Version Version - + Qt Version - Version de Qt : + Version de Qt - + SQLCipher Version - Version de SQLCipher : + Version de SQLCipher - + SQLite Version - Version de SQLite : + Version de SQLite + + + + AddRecordDialog + + + Add New Record + Ajouter un nouvel enregistrement + + + + Enter values for the new record considering constraints. Fields in bold are mandatory. + Saisissez les valeurs en tenant compte des contraintes. Les champs en gras sont obligatoires. + + + + In the Value column you can specify the value for the field identified in the Name column. The Type column indicates the type of the field. Default values are displayed in the same style as NULL values. + Dans la colonne Valeur, vous pouvez spécifier la valeur du champ identifié dans la colonne Nom. La colonne Type indique le type du champ. Les valeurs par défaut sont affichées dans le même style que les valeurs NULL. + + + + Name + Nom + + + + Type + Type + + + + Value + Valeur + + + + Values to insert. Pre-filled default values are inserted automatically unless they are changed. + Valeurs à insérer. Les valeurs par défaut pré-remplies sont insérées automatiquement à moins qu'elles ne soient modifiées. + + + + When you edit the values in the upper frame, the SQL query for inserting this new record is shown here. You can edit manually the query before saving. + Lorsque vous éditez les valeurs dans le cadre supérieur, la requête SQL d'insersion du nouvel enregistrement est affichée ici. Vous pouvez l'éditer manuellement avant de l'enregistrer. + + + + <html><head/><body><p><span style=" font-weight:600;">Save</span> will submit the shown SQL statement to the database for inserting the new record.</p><p><span style=" font-weight:600;">Restore Defaults</span> will restore the initial values in the <span style=" font-weight:600;">Value</span> column.</p><p><span style=" font-weight:600;">Cancel</span> will close this dialog without executing the query.</p></body></html> + <html><head/><body><p><span style=" font-weight:600;">Enregistrer</span> soumettra l'instruction SQL affichée à la base de données pour créer le nouvel enregistrement..</p><p><span style=" font-weight:600;">Restaurer les valeurs par défaut</span> restaurera les valeurs par défaut dans la <span style=" font-weight:600;">colonne</span> Valeur.</p><p><span style=" font-weight:600;">Annuler</span> fermera cette boîte de dialogue sans exécuter la requête.</p></body></html> + + + + Auto-increment + + Incrément automatique + + + + Unique constraint + + Contrainte unique + + + + Check constraint: %1 + + Vérifier les contraintes : %1 + + + + Foreign key: %1 + + Clé étrangère : %1 + + + + Default value: %1 + + Valeur par défaut : %1 + + + + Error adding record. Message from database engine: + +%1 + Erreur lors de l'ajout d'un enregistrement. Message du moteur de base de données : + +%1 + + + + Are you sure you want to restore all the entered values to their defaults? + Êtes-vous sûr de vouloir restaurer toutes les valeurs saisies à leurs valeurs par défaut ? Application - + Usage: %1 [options] [db] Usage: %1 [options] [db]> - + Possible command line arguments: Arguments utilisables en ligne de commande : - + -h, --help Show command line options -h, --help Affiche les options en mode ligne de commande @@ -79,54 +180,73 @@ -s, --sql [fichier] Exécute ce fichier de commande SQL après l'ouverture de la base de données - + -s, --sql [file] Execute this SQL file after opening the DB Il est possible de remplacer "ce fichier de commande SQL" par "ce fichier SQL" et "base de données" par BdD -s, --sql [fichier], Exécute ce fichier de commande SQL après l'ouverture de la base de données - + -t, --table [table] Browse this table after opening the DB Il est possible de remplacer "base de données" par BdD -t, --table [table] Parcourir cette table après l'ouverture de la base de données - + -q, --quit Exit application after running scripts -q, --quit Quitte l'application après l'exécution du script - + + -R, --read-only Open database in read-only mode + -R, --read-only Ouvre la base de données en lecture seule + + + + -o, --option [group/setting=value] Run application with this setting temporarily set to value + + + + -v, --version Display the current version -v, --version Affiche la version en cours - + [file] Open this SQLite database [fichier] Ouvre cette base de données SQLite - + + This is DB Browser for SQLite version %1. + Voici DB Browser pour SQLite version %1. + + This is DB Browser for SQLite version %1%2. - Voici DB Browser pour SQLite version %1%2. + Voici DB Browser pour SQLite version %1%2. - + The -s/--sql option requires an argument L'option -s/--sql nécessite un argument - + The file %1 does not exist Le fichier %1 n'existe pas - + The -t/--table option requires an argument L'option -t/--table nécessite un argument - + + The -o/--option option requires an argument in the form group/setting=value + + + + Invalid option/non-existant file: %1 Option invalide ou fichier %1 inexistant @@ -154,13 +274,13 @@ &Taille de page - + Passphrase The button size is not large enought to handle the whole "french text", if #Passphrase must be translate Phrase Secrète - + Raw key Same comment as for Passphrase Clé de Chiffrement @@ -170,7 +290,7 @@ &Taille de la page - + Please set a key to encrypt the database. Note that if you change any of the other, optional, settings you'll need to re-enter them as well every time you open the database file. Leave the password fields empty to disable the encryption. @@ -182,7 +302,7 @@ Les modifications non enregistrées seront appliquées avant la modification du chiffrement. - + Please enter the key used to encrypt the database. If any of the other settings were altered for this database file you need to provide this information as well. Veuillez entrer la clé utilisée pour le chiffrement de la Base de Données. @@ -213,67 +333,82 @@ Défaut - + Decimal number Nombre décimal - + Exponent notation Notation scientifique - + Hex blob Blob Hexadécimal - + Hex number Nombre Hexadécimal - + Apple NSDate to date Apple NSDate vers date - + + Java epoch (milliseconds) to date + Java epoch (milliseconds) en date + + + Julian day to date - Date jullienne en Date + Date jullienne vers Date - + + Unix epoch to local time + Heure Unix epoch vers heure locale + + + + Date as dd/mm/yyyy + Date au format DD/MM/AAAA + + + Lower case Minuscule - + Octal number Nombre en Octal - + Round number Nombre arrondi - + Unix epoch to date Date Unix epoch en Date - + Upper case Majuscule - + Windows DATE to date Date Windows en Date - + Custom Personnalisé @@ -281,45 +416,45 @@ DBBrowserDB - + Please specify the database name under which you want to access the attached database Veuillez spécifier le nom de la Base de Données sous laquelle vous voulez accéder à la Base de Données attachée - + Invalid file format Format de fichier invalide - + Do you want to save the changes made to the database file %1? Voulez-vous enregistrer les changements effectués dans la Base de Données %1 ? - + Exporting database to SQL file... Exporter la base de données dans un fichier SQL... - - + + Cancel Annuler - + Executing SQL... Exécution du SQL... - + Action cancelled. Action annulée. Error in statement #%1: %2. Aborting execution. - Érreur dans le traitement #%1 : %2. + Erreur dans le traitement #%1 : %2. L'exécution est abandonnée. @@ -327,57 +462,93 @@ Renommer les Colonnes : La table %1 n'a pas été trouvée. - - + + This database has already been attached. Its schema name is '%1'. + Cette base de données a déjà été attachée. Son nom de schéma est '%1'. + + + + Do you really want to close this temporary database? All data will be lost. + Voulez-vous vraiment fermer cette base de données temporaire ? Toutes les données seront perdues. + + + + The database is currently busy: + La base de données est actuellement occupée : + + + + Do you want to abort that other operation? + Voulez-vous annuler cette autre opération ? + + + + + No database file opened + Aucun fichier de base de données ouvert + + + + Error in statement #%1: %2. Aborting execution%3. - Érreur dans le traitement #%1 : %2. + Erreur dans le traitement #%1 : %2. Exécution de %3 abandonnée. - - + + and rolling back et annulation des changements - + + Cannot delete this object + Impossible de supprimer cet objet + + + Cannot set data on this object 170726 MVT Has to be checked in real context Définition des données impossible pour cet objet - + + A table with the name '%1' already exists in schema '%2'. + Une table portant le nom " %1 " existe déjà dans le schéma " %2 ". + + + renameColumn: cannot find column %1. Renommer les Colonnes : La colonne %1 n'a pas été trouvée. - + renameColumn: creating savepoint failed. DB says: %1 Renommer les Colonnes : La création d'un point de sauvegarde a échoué. Message du moteur de base de données : %1 - + renameColumn: creating new table failed. DB says: %1 Renommer les Colonnes : La création de la table a échoué. Message du moteur de base de données : %1 - + renameColumn: copying data to new table failed. DB says: %1 Renommer les Colonnes : La copie des données dans une nouvelle table a échoué. Message du moteur de base de données : %1 - + renameColumn: deleting old table failed. DB says: %1 Renommer les Colonnes : La suppression de l'ancienne table a échoué. Message du moteur de base de données : %1 - + Restoring some of the objects associated with this table failed. This is most likely because some column names changed. Here's the SQL statement which you might want to fix and execute manually: @@ -385,25 +556,35 @@ - + renameColumn: releasing savepoint failed. DB says: %1 Renommer les Colonnes : La libération d'un point de sauvegarde a échoué. Message du moteur de base de données : %1 - + Error renaming table '%1' to '%2'.Message from database engine: %3 - Érreur lors du changement de nom de la table %1 vers %2. Message du moteur de base de données : + Erreur lors du changement de nom de la table %1 vers %2. Message du moteur de base de données : %3 - + ... <string can not be logged, contains binary data> ... ... <la Chaîne de caractère ne peut être journalisée. Elle contient des données binaires> ... - + + could not get list of databases: %1 + n'a pas pu obtenir la liste des bases de données : %1 + + + + Error loading extension: %1 + Erreur lors du chargement de l'extension %1 + + + could not get column information 170726 MVT Has to be checked in real context ne peut obtenir les informations sur la colonne @@ -413,7 +594,7 @@ Type d'objet %1 inconnu - + could not get list of db objects: %1, %2 la liste des objets de la base de données ne peut être obtenue : %1, %2 @@ -422,22 +603,22 @@ la liste des types ne peut être obtenue - + didn't receive any output from pragma %1 n'a pas reçu toutes les sorties du pragma %1 - + could not execute pragma command: %1, %2 ne peut pas exécuter les commandes du pragma : %1, %2 - + Error setting pragma %1 to %2: %3 - Érreur dans les paramètres des pragma %1 à %2 : %3 + Erreur dans les paramètres des pragma %1 à %2 : %3 - + File not found. Fichier non trouvé. @@ -445,52 +626,66 @@ DbStructureModel - + Name Nom - + Object Objet - + Type Type - + Schema Schéma - Browsables (%1) - Consultables (%1) + Consultables (%1) + + + + Database + Base de Données + + + + Browsables + Consultables - + All Tout - + + Temporary + Temporaire + + + Tables (%1) Tables (%1) - + Indices (%1) Index (%1) - + Views (%1) Vues (%1) - + Triggers (%1) Déclencheurs (%1) @@ -508,63 +703,181 @@ Mode : - - + + This is the list of supported modes for the cell editor. Choose a mode for viewing or editing the data of the current cell. + Voici la liste des modes pris en charge par l'éditeur de cellules. Choisissez un mode d'affichage ou d'édition des données de la cellule courante. + + + Image Image + + JSON + JSON + + + + XML + XML + + + + + Automatically adjust the editor mode to the loaded data type + Ajuster automatiquement le mode éditeur au type de données chargé + + - Import text - Importer du texte + This checkable button enables or disables the automatic switching of the editor mode. When a new cell is selected or new data is imported and the automatic switching is enabled, the mode adjusts to the detected data type. You can then change the editor mode manually. If you want to keep this manually switched mode while moving through the cells, switch the button off. + Ce bouton à cocher active ou désactive le changement automatique du mode éditeur. Lorsqu'une nouvelle cellule est sélectionnée ou de nouvelles données sont importées et que la commutation automatique est activée, le mode s'adapte au type de données détecté. Vous pouvez ensuite changer le mode éditeur manuellement. Si vous souhaitez conserver ce mode de commutation manuelle pendant que vous vous déplacez dans les cellules, éteignez le bouton. + Auto-switch + Auto-switch + + + + + Auto-format: pretty print on loading, compact on saving. + Auto-format : formater au chargement, compacter à l'enregistrement. + + + + When enabled, the auto-format feature formats the data on loading, breaking the text in lines and indenting it for maximum readability. On data saving, the auto-format feature compacts the data removing end of lines, and unnecessary whitespace. + Lorsqu'elle est activée, la fonction de formatage automatique met en forme les données lors du chargement, tranforme le texte en lignes et ajoute des retraits pour une lisibilité maximale. Lors de la sauvegarde des données, la fonction de formatage automatique compacte les données en supprimant les fins des lignes et les espaces inutiles. + + + + Autoformat + Format Automatique + + + + Import from file + Importer depuis un fichier + + + + Opens a file dialog used to import any kind of data to this database cell. + Ouvre une boîte de dialogue pour importer n'importe quel type de données dans cette cellule de base de données. + + + + Export to file + Exporter vers un fichier + + + + Opens a file dialog used to export the contents of this database cell to a file. + Ouvrir la boîte de dialogue pour exporter le contenu de cette cellule de la base de données vers un fichier. + + + + + Print... + Imprimer... + + + + Open preview dialog for printing displayed image + Ouvrir un apperçu de l'image pour son impression + + + + + Ctrl+P + Ctrl+P + + + + Open preview dialog for printing displayed text + Ouvrir un apperçu du texte avant son impression + + + + Copy Hex and ASCII + Copier l'Hex et l'ASCII + + + + Copy selected hexadecimal and ASCII columns to the clipboard + Copier les colonnes hexadécimales et ASCII sélectionnées dans le presse-papiers + + + + Ctrl+Shift+C + Ctrl+Shift+C + + + Import text + Importer du texte + + Opens a file dialog used to import text to this database cell. - Ouvrir la boîte de dialogue permettant d'importer du texte dans cette cellule. + Ouvrir la boîte de dialogue permettant d'importer du texte dans cette cellule. - + &Import &Importer - Export text - Exporter du texte + Exporter du texte - Opens a file dialog used to export the contents of this database cell to a text file. - Ouvrir la boîte de dialogue permettant d'exporter le contenu de la cellule de la base de données vers un fichier texte. + Ouvrir la boîte de dialogue permettant d'exporter le contenu de la cellule de la base de données vers un fichier texte. - + &Export &Exporter - + Set this cell to NULL Définir cette cellule comme NULL - + Set as &NULL Définir comme &NULL - + + This editor mode lets you edit JSON or XML data with syntax highlighting, automatic formatting and validation before saving. + +Errors are indicated with a red squiggle underline. + Ce mode éditeur vous permet d'éditer des données JSON ou XML avec la coloration syntaxique, la formatage automatique et la validation avant sauvegarde. + +Les erreurs sont signalées par un tilde rouge souligné. + + + + Apply data to cell + Appliquer les données à la cellule + + + + This button saves the changes performed in the cell editor to the database cell. + Ce bouton permet de sauvegarder les modifications effectuées dans l'éditeur de cellule dans la cellule de base de données. + + + Apply Appliquer - + Text Texte - + Binary Binaire @@ -573,7 +886,7 @@ Effacer les données de la cellule - + Erases the contents of the cell Effacer le contenu de la cellule @@ -586,74 +899,167 @@ <html><head/><body><p><span style=" font-weight:600; color:#c00000;">Attention : Éditer un contenu binaire en mode texte peut corrompre les données!</span></p></body></html> - + This area displays information about the data present in this database cell Cette zone affiche des informations à propos des données contenues dans la cellule de la base de données - + Type of data currently in cell Type actuel des données dans la cellule - + Size of data currently in table Taille actuelle des données dans la table - Choose a file - Choisir un fichier + Choisir un fichier - Text files(*.txt);;Image files(%1);;All files(*) - Fichiers Texte (*.txt);;Fichiers Image(%1);;Tous les fichiers(*) + Fichiers Texte (*.txt);;Fichiers Image(%1);;Tous les fichiers(*) - + Choose a filename to export data Choisir un nom de fichier pour exporter les données - Text files(*.txt);;All files(*) - Fichiers Texte (*.txt);;Tous les fichiers(*) + Fichiers Texte (*.txt);;Tous les fichiers(*) - Image data can't be viewed with the text editor - Les données d'une image ne peuvent être affichées dans l'éditeur de texte + Les données d'une image ne peuvent être affichées dans l'éditeur de texte - Binary data can't be viewed with the text editor - Les données binaires ne peuvent être affichées dans l'éditeur de texte + Les données binaires ne peuvent être affichées dans l'éditeur de texte - + Type of data currently in cell: %1 Image Type actuel des données de la cellule. Image %1 - + %1x%2 pixel(s) %1x%2 pixel(s) - + Type of data currently in cell: NULL Type actuel des données de la cellule : NULL - - + + Type of data currently in cell: Text / Numeric Type actuel des données de la cellule : Texte / Numérique + + + + Image data can't be viewed in this mode. + L'image ne peut être affichée dans ce mode. + + + + + Try switching to Image or Binary mode. + Essayez de basculer vers le mode Image ou le mode Binaire. + + + + + Binary data can't be viewed in this mode. + Les données Binaires ne peuvent être affichées dans ce mode. + + + + + Try switching to Binary mode. + Essayez de basculer vers le mode Binaire. + + + + + + + Text files (*.txt) + Fichiers Texte (*.txt) + + + + + + JSON files (*.json) + Fichiers JSON (*.json) + + + + + + + XML files (*.xml) + Fichiers XML (*.xml) + + + + + Image files (%1) + Fichiers image (%1) + + + + + + Binary files (*.bin) + Fichiers Binaires (*.bin) + + + + + All files (*) + Tous les fichiers (*) + + + + Choose a file to import + Choisir un fichier à importer + + + + %1 Image + %1 Image + + + + SVG files (*.svg) + Fichiers SVG (*.svg) + + + + + Hex dump files (*.txt) + Fichiers Dump Hexadécimal (*.txt) + + + + Invalid data for this mode + Les données sont invalides pour ce mode + + + + The cell contains invalid %1 data. Reason: %2. Do you really want to apply it to the cell? + La cellule contient des données %1 invalides. Raison : %2. Vouslez-vous vraiment l'appliquer à la cellule ? + - - + + + %n char(s) %n caractère @@ -661,6 +1067,11 @@ + + Type of data currently in cell: Valid JSON + Type de données actuellement dans la cellule : JSON valide + + Type of data currently in cell: Image Type des données actuellement dans la cellule : Image @@ -669,13 +1080,13 @@ %1x%2 pixel - + Type of data currently in cell: Binary Type actuel des données de la cellule : Binaire - - + + %n byte(s) %n octet @@ -763,14 +1174,14 @@ Colonne d'Index - + Deleting the old index failed: %1 La suppression de l'ancien index a échoué : %1 - + Creating the index failed: %1 La création de l'index a échoué : @@ -796,122 +1207,129 @@ + Database schema + Schéma de la base de Données + + + Make this a 'WITHOUT rowid' table. Setting this flag requires a field of type INTEGER with the primary key flag set and the auto increment flag unset. Faire cette table "SANS RowId". Positionner cette option nécessite un champ de type INTEGER défini comme clé primaire ET pour lequel l'incrément automatique a été désactivé. - + Without Rowid Sans RowId - Set this to create a temporary table that is deleted when closing the database. - Cochez cette case pour créer une table temporaire qui sera supprimée lors de la fermeture de la base de données. + Cochez cette case pour créer une table temporaire qui sera supprimée lors de la fermeture de la base de données. - Temporary table - Table Temporaire + Table Temporaire - + Fields Champs - + Add field Ajouter un champ - + Remove field Supprimer un champ - + Move field up Remonter le champ - + Move field down Descendre le champ - + Name Nom - + Type Type - - + + NN + NN + + + Not null Non-Null - + PK CP - + Primary key Clé primaire - + AI IA - + Autoincrement Incrément automatique - + U U - + Unique Unique - + Default Défaut - + Default value Valeur par défaut - + Check Vérifier - + Check constraint Vérifier les contraintes - + Foreign Key Clé étrangère - + <html><head/><body><p><span style=" font-weight:600; color:#ff0000;">Warning: </span>There is something with this table definition that our parser doesn't fully understand. Modifying and saving this table might result in problems.</p></body></html> <html><head/><body><p><span style=" font-weight:600; color:#ff0000;">Attention : </span>Il y a quelque chose dans la définition de cette table que notre analyseur syntaxique n'a pas complètement compris. La modification et la sauvegarde de cette table peuvent créer des problèmes.</p></body></html> @@ -920,14 +1338,14 @@ <html><head/><body><p><span style=" font-weight:600; color:#ff0000;">Attention : </span>Il y a quelque chose dans la définition de cette table que notre analyseur syntaxique n'a pas complètement compris. La modification et la sauvegarde de cette table peut créer des problèmes.</p></body></html> - + Error creating table. Message from database engine: %1 - Érreur lors de la création de la table. Message du moteur de la base de données : + Erreur lors de la création de la table. Message du moteur de la base de données : %1 - + There already is a field with that name. Please rename it first or choose a different name for this field. Il existe déjà un champ avec ce nom. Veuillez le renommer avant ou choisir un autre nom pour ce champ. @@ -936,47 +1354,47 @@ Cette colonne est référencée dans une clé étrangère dans la table %1, colonne %2. Son nom ne peut être changé. - + This column is referenced in a foreign key in table %1 and thus its name cannot be changed. Cette colonne est référencée dans une clé étrangère dans la table %1. Son nom ne peut être changé. - + There is at least one row with this field set to NULL. This makes it impossible to set this flag. Please change the table data first. Il existe au moins un enregistrement avec ce champ autorisant des valeurs nulles (NULL). Il est donc impossible de définir cet indicateur. Veuillez modifier les données de la table au préalable. - + There is at least one row with a non-integer value in this field. This makes it impossible to set the AI flag. Please change the table data first. Il existe au moins un enregistrement avec une valeur qui n'est pas un nombre entier dans ce champ. Il est donc impossible de définir l'indicateur AI (Incrément automatique) sur ce champ. Veuillez modifier les données de la table au préalable. - + Column '%1' has no unique data. La colonne %1 n'a pas de valeurs uniques. - + This makes it impossible to set this flag. Please change the table data first. Cela rend le choix de cette option impossible. Veuillez au préalable modifier les données de la table. - + Modifying this column failed. Error returned from database: %1 - La modification de cette colonne a échoué. Érreur retournée par la base de données : + La modification de cette colonne a échoué. Erreur retournée par la base de données : %1 - + Are you sure you want to delete the field '%1'? All data currently stored in this field will be lost. Êtes-vous sûr de vouloir supprimer le champ "%1" ? Toutes les données contenues dans ce champ seront perdues. - + Please add a field which meets the following criteria before setting the without rowid flag: - Primary key flag set - Auto increment disabled @@ -985,17 +1403,23 @@ - Incrément automatique désactivé - + Setting the rowid column for the table failed. Error message: %1 Le paramétrage de la colonne RowId pour la table a échoué. Message d'erreur : %1 - + + Changing the table schema failed. Error message: +%1 + Le changement du schéma de la Base de Données a echoué. Message d'erreur : +%1 + + Setting the temporary flag for the table failed. Error message: %1 - Activer l'option "table temporaire" pour cette table a échoué. Message d'erreur : + Activer l'option "table temporaire" pour cette table a échoué. Message d'erreur : %1 @@ -1100,44 +1524,54 @@ Formatter - - + + Could not open output file: %1 Le fichier de destination %1 ne peut être ouvert - - + + Choose a filename to export data Choisir un nom de fichier pour exporter les données - + Text files(*.csv *.txt) Fichiers Texte (*.csv *.txt) - + Export data as JSON Exporter au format JSON - + + exporting CSV + Exporter au format CSV + + + + exporting JSON + Exporter au format JSON + + + Text files(*.json *.js *.txt) Fichiers Texte (*.json *.js *.txt) - + Please select at least 1 table. Veuillez sélectionner au moins une table. - + Choose a directory Choisir un répertoire - + Export completed. Export terminé. @@ -1210,32 +1644,61 @@ Écraser l'ancien schéma (DROP TABLE, puis CREATE TABLE) - Please select at least 1 table. + Veuillez sélectionner au moins une table. + + + + Please select at least one table. Veuillez sélectionner au moins une table. - + Choose a filename to export Choisir un nom de fichier pour l'export - + Text files(*.sql *.txt) Fichiers Texte (*.sql *.txt) - + Export completed. Export terminé. - + Export cancelled or failed. L'export a été annulé ou a échoué. + ExtendedScintilla + + + + Ctrl+H + Ctrl+H + + + + + Ctrl+P + Ctrl+P + + + + Find and Replace... + Chercher et remplacer... + + + + Print... + Imprimer... + + + ExtendedTableWidget The content of clipboard is bigger than the range selected. @@ -1244,23 +1707,98 @@ Voulez-vous poursuivre l'insertion malgré tout ? - - Set to NULL - Définir comme NULL + + Use as Exact Filter + Utiliser comme filtre exact - - Copy - Copier + + Containing + Contenant - - Paste - Coller + + Not equal to + Différent de - - The content of the clipboard is bigger than the range selected. + + Greater than + Plus grand que + + + + Less than + Plus petit que + + + + Greater or equal + Plus grand ou égal à + + + + Less or equal + Plus petit ou égal à + + + + Between this and... + Entre ceci et... + + + + Set to NULL + Définir comme NULL + + + + Copy + Copier + + + + Copy with Headers + Copier avec les Entêtes + + + + Copy as SQL + Copier comme du SQL + + + + Paste + Coller + + + + Print... + Imprimer... + + + + Use in Filter Expression + Uriliser dans l'expression du Filtre + + + + Alt+Del + Alt+Supp + + + + Ctrl+Shift+C + Ctrl+Shift+C + + + + Ctrl+Alt+C + Ctrl+Alt+C + + + + The content of the clipboard is bigger than the range selected. Do you want to insert it anyway? Le contenu du presse-papier est plus grand que la plage sélectionnée. Voulez-vous poursuivre l'insertion malgré tout ? @@ -1274,12 +1812,147 @@ + FileExtensionManager + + + File Extension Manager + Gestionnaire d'extension de fichier + + + + &Up + &Monter + + + + &Down + &Descendre + + + + &Add + &Ajouter + + + + &Remove + &Supprimer + + + + + Description + Description + + + + Extensions + Extensions + + + + *.extension + *.extension + + + FilterLineEdit - + Filter Filtre + + + These input fields allow you to perform quick filters in the currently selected table. +By default, the rows containing the input text are filtered out. +The following operators are also supported: +% Wildcard +> Greater than +< Less than +>= Equal to or greater +<= Equal to or less += Equal to: exact match +<> Unequal: exact inverse match +x~y Range: values between x and y + Ces champs de saisie vous permettent d'effectuer des filtres rapides dans la table actuellement sélectionnée. +Par défaut, les lignes contenant le texte saisi sont filtrées. +Les opérateurs suivants sont également pris en charge : +Caractère de remplacement +> Supérieur à +< Inférieur à +>= Supérieur ou Égal à +<= Inférieur ou Égal à += Égal à : correspondance exacte +<> Différent de : correspondance inverse exacte +x~y Plage : valeurs comprises entre x et y + + + + Set Filter Expression + Définir l'expression du filtre + + + + What's This? + Qu'est-ce que c'est ? + + + + Is NULL + Est NULL + + + + Is not NULL + Est non NULL + + + + Is empty + Est Vide + + + + Is not empty + Est non Vide + + + + Equal to... + Egal à... + + + + Not equal to... + Différent de... + + + + Greater than... + Plus grand que... + + + + Less than... + Plus petit que... + + + + Greater or equal... + Plus grand ou égal à... + + + + Less or equal... + Plus petit ou égal à... + + + + In range... + Peut être aussi traduit par "dans la plage..." ou "Entre..." + Entre les valeurs... + FilterTableHeader @@ -1289,6 +1962,131 @@ + FindReplaceDialog + + + Find and Replace + Chercher et remplacer + + + + Fi&nd text: + &Rechercher : + + + + Re&place with: + Re&mplacer avec : + + + + Match &exact case + &Expression exacte + + + + Match &only whole words + M&ots entiers uniquement + + + + When enabled, the search continues from the other end when it reaches one end of the page + Lorsque la Recherche circulaire est activée, la recherche recommence au début une fois atteinte la fin de la page + + + + &Wrap around + Recherche &Circulaire + + + + When set, the search goes backwards from cursor position, otherwise it goes forward + Lorsqu'elle est activée, la recherche s'effectue en remontant à partir de la position du curseur, sinon elle se fait en descendant + + + + Search &backwards + Rechercher vers le &haut + + + + <html><head/><body><p>When checked, the pattern to find is interpreted as a UNIX regular expression. See <a href="https://en.wikibooks.org/wiki/Regular_Expressions">Regular Expression in Wikibooks</a>.</p></body></html> + La version française de https://en.wikibooks.org/wiki/Regular_Expressions n'existe pas + <html><head/><body><p>Lorsqu'elle est cochée, le motif à trouver est interprété comme une expression régulière UNIX. Voir <a href="https://en.wikibooks.org/wiki/Regular_Expressions">Regular Expression in Wikibooks</a>.</p></body></html> + + + + Use regular e&xpressions + Utiliser les e&xpressions régulières + + + + Find the next occurrence from the cursor position and in the direction set by "Search backwards" + Trouver l'occurrence suivante à partir de la position du curseur et dans la direction définie par "Rechercher vers le haut" + + + + &Find Next + &Suivant + + + + &Replace + Rem&placer + + + + Highlight all the occurrences of the text in the page + Surligner toutes les occurrences du texte dans la page + + + + F&ind All + Rechercher &Tout + + + + Replace all the occurrences of the text in the page + Remplace toutes les occurrences du texte dans la page + + + + Replace &All + Remplacer To&ut + + + + The searched text was not found + Le texte recherché n'a pas été trouvé + + + + + The searched text was not found. + Le texte recherché n'a pas été trouvé. + + + + The searched text was found one time. + Le texte recherché a été trouvé une fois. + + + + The searched text was found %1 times. + Le texte recherché a été trouvé %1 fois. + + + + The searched text was replaced one time. + Le texte recherché a été remplacé une fois. + + + + The searched text was replaced %1 times. + Le texte recherché a été remplacé %1 fois. + + + ForeignKeyEditor @@ -1313,9 +2111,13 @@ Importer un fichier CSV - &Table name - Nom de la &Table + Nom de la &Table + + + + Table na&me + No&m de la Table @@ -1339,7 +2141,7 @@ - + Tab Tabulation @@ -1401,59 +2203,114 @@ Tables distinctes + + Advanced + Avancé + + + + When importing an empty value from the CSV file into an existing table with a default value for this column, that default value is inserted. Activate this option to insert an empty value instead. + Lorsque vous importez une valeur vide du fichier CSV dans une table existante avec une valeur par défaut pour cette colonne, cette valeur par défaut est insérée. Activez cette option pour insérer une valeur vide à la place. + + + + Ignore default &values + Ignorer les &valeurs par défaut + + - + Activate this option to stop the import when trying to import an empty value into a NOT NULL column without a default value. + Activez cette option pour arrêter l'importation lorsque vous essayez d'importer une valeur vide dans une colonne NON NULL sans valeur par défaut. + + + + Fail on missing values + Erreur sur les valeurs manquantes + + + + Disable data type detection + Désactiver la détection du type de données + + + + Disable the automatic data type detection when creating a new table. + Désactive la détection automatique du type de données lors de la création d'une nouvelle table. + + + + Deselect All Déselectionner tout - + Match Similar 170726 MVT Has to be checked in real context or after explanation of this function. I suppose this function permits, with data names on the first line to "prefill a corresponding names" in an existing object ? Appairer - + Select All Sélectionner tout - Inserting data... - Ajout des données... + Ajout des données... - Cancel - Annuler + Annuler - There is already a table of that name and an import into an existing table is only possible if the number of columns match. - Il existe déjà une table portant ce nom. Importer des données dans une table existante n'est possible que si le nombre de colonnes correspond. + Il existe déjà une table portant ce nom. Importer des données dans une table existante n'est possible que si le nombre de colonnes correspond. - There is already a table of that name. Do you want to import the data into it? - Il existe déjà une table portant ce nom. Voulez-vous y importer les données ? + Il existe déjà une table portant ce nom. Voulez-vous y importer les données ? + + + + Import completed + Import terminé + + + + There is already a table named '%1' and an import into an existing table is only possible if the number of columns match. + Il existe déjà une table nommée'%1' et une importation dans une table existante n'est possible que si le nombre de colonnes correspond. - + + There is already a table named '%1'. Do you want to import the data into it? + Il existe déjà une table appelée "%1". Voulez-vous y importer les données ? + + + Creating restore point failed: %1 La création du point de restauration a échoué : %1 - + Creating the table failed: %1 La création de la table a échoué %1 - + + importing CSV + Importer au format CSV + + + + Importing the file '%1' took %2ms. Of this %3ms were spent in the row function. + L'importation du fichier'%1' a pris %2ms. %3ms ont été dépensés dans la fonction enregistrement. + + Missing field for record %1 - Champ manquant pour l'enregistrement %1 + Champ manquant pour l'enregistrement %1 - + Inserting row failed: %1 L'insertion de l'enregistrement a échoué : %1 @@ -1469,8 +2326,7 @@ &Structure de la base de données - - + toolBar1 Barre d'outils1 @@ -1483,47 +2339,59 @@ Table : - + Select a table to browse data Sélectionner une table pour parcourir son contenu - + Use this list to select a table to be displayed in the database view Utiliser cette liste pour sélectionner la table à afficher dans la vue Base de Données - Refresh the data in the selected table. - Rafraîchir les données de la table sélectionnée. + Rafraîchir les données de la table sélectionnée. - + This button refreshes the data in the currently selected table. Ce bouton permet de rafraîchir les données de la table actuellement sélectionnée. - + + <html><head/><body><p><a href="https://www.sqlite.org/pragma.html#pragma_case_sensitive_like">Case Sensitive Like</a></p></body></html> + <html><head/><body><p><a href="https://www.sqlite.org/pragma.html#pragma_case_sensitive_like">Case Sensitive Like</a></p></body></html> + + + + Warning: this pragma is not readable and this value has been inferred. Writing the pragma might overwrite a redefined LIKE provided by an SQLite extension. + Attention : ce pragma n'est pas lisible et cette valeur a été déduite. Ecrire le pragma pourrait écraser un LIKE redéfini fourni par une extension SQLite. + + + + &Tools + &Outils + + + Edit Database &Cell Éditer le contenu d'une &Cellule - SQLCipher &FAQ... - SQLCipher &FAQ... + SQLCipher &FAQ... - + Opens the SQLCipher FAQ in a browser window Ouvre la FAQ de SQLCipher dans la fenêtre d'un navigateur - Table(s) to JSON... - Table(s) vers JSON... + Table(s) vers JSON... - + Export one or more table(s) to a JSON file Exporter une ou plusieurs tables vers un fichier JSON @@ -1532,82 +2400,81 @@ Sauvegarder sur un serveur distant - + Refresh Rafraichir - + F5 F5 - + Clear all filters Effacer tous les filtres - + Insert a new record in the current table Insérer un nouvel enregistrement dans la table en cours - This button creates a new, empty record in the database - Ce bouton permet de créer un nouvel enregistrement, vide, dans la Base de Données + Ce bouton permet de créer un nouvel enregistrement, vide, dans la Base de Données - + + New Record Nouvel Enregistrement - + Delete the current record Supprimer l'enregistrement courant - This button deletes the record currently selected in the database - Ce bouton permet de supprimer l'enregistrement sélectionné de la Base de Données + Ce bouton permet de supprimer l'enregistrement sélectionné de la Base de Données - + + Delete Record Supprimer l'enregistrement - This is the database view. You can double-click any record to edit its contents in the cell editor window. - Ceci est la vue Base de données. Vous pouvez, en double-cliquant sur un enregistrement, modifier son contenu dans la fenêtre Éditeur de cellule. + Ceci est la vue Base de données. Vous pouvez, en double-cliquant sur un enregistrement, modifier son contenu dans la fenêtre Éditeur de cellule. - + <html><head/><body><p>Scroll to the beginning</p></body></html> <html><head/><body><p>Aller au début</p></body></html> - + <html><head/><body><p>Clicking this button navigates to the beginning in the table view above.</p></body></html> <html><head/><body><p>Cliquer sur ce bouton permet d'aller au début de la table ci-dessus.</p></body></html> - + |< |< - + < < - + 0 - 0 of 0 0 - 0 de 0 - + > > @@ -1633,47 +2500,47 @@ <html><head/><body><p>Cliquer sur ce bouton permet de descendre de 100 enregistrements dans l'affichage de la table ci-dessus.</p></body></html> - + Scroll to the end Aller à la fin - + <html><head/><body><p>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Clicking this button navigates up to the end in the table view above.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</p></body></html> <html><head/><body><p>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Cliquer sur ce bouton permet d'aller à la fin de la table ci-dessus.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</p></body></html> - + >| >| - + <html><head/><body><p>Click here to jump to the specified record</p></body></html> <html><head/><body><p>Cliquer ici pour vous déplacer sur l'enregistrement défini</p></body></html> - + <html><head/><body><p>This button is used to navigate to the record number specified in the Go to area.</p></body></html> <html><head/><body><p>Ce bouton est utilisé pour aller directement à l'enregistrement défini dans le champ Aller à.</p></body></html> - + Go to: Aller à : - + Enter record number to browse Entrez le nombre d'enregistrements à parcourir - + Type a record number in this area and click the Go to: button to display the record in the database view Entrez un numéro d'enregistrement dans ce champ et cliquez sur le bouton "Aller à" pour afficher l'enregistrement dans la vue Base de Données - + 1 1 @@ -1686,20 +2553,16 @@ <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_auto_vacuum""><span style=" text-decoration: underline; color:#0000ff;">Vidage automatique</span></a></p></body></html> - None - Aucun + Aucun - - Full - Complet + Complet - Incremental - Incrémental + Incrémental <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_automatic_index""><span style=" text-decoration: underline; color:#0000ff;">Automatic Index</span></a></p></body></html> @@ -1726,36 +2589,28 @@ <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_journal_mode""><span style=" text-decoration: underline; color:#0000ff;">Mode de journalisation</span></a></p></body></html> - Delete - Supprimer + Supprimer - Truncate - Tronquer + Tronquer - Persist - Persistant + Persistant - - Memory - Mémoire + Mémoire - WAL - WAL + WAL - - Off - Arrêté + Arrêté <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_journal_size_limit""><span style=" text-decoration: underline; color:#0000ff;">Journal Size Limit</span></a></p></body></html> @@ -1766,15 +2621,12 @@ <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_locking_mode""><span style=" text-decoration: underline; color:#0000ff;">Mode de recherche</span></a></p></body></html> - - Normal - Normal + Normal - Exclusive - Exclusif + Exclusif <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_max_page_count""><span style=" text-decoration: underline; color:#0000ff;">Max Page Count</span></a></p></body></html> @@ -1801,14 +2653,12 @@ <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_temp_store""><span style=" text-decoration: underline; color:#0000ff;">Stockage temporaire</span></a></p></body></html> - Default - Défaut + Défaut - File - Fichier + Fichier <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_user_version""><span style=" text-decoration: underline; color:#0000ff;">User Version</span></a></p></body></html> @@ -1823,32 +2673,32 @@ E&xécuter le SQL - + &File &Fichier - + &Import &Importer - + &Export &Exporter - + &Edit É&dition - + &View &Vue - + &Help &Aide @@ -1865,17 +2715,22 @@ A&fficher le SQL soumis par - + User Utilisateur - + Application Application - + + This button clears the contents of the SQL logs + Ce bouton supprime le contenu des logs SQL + + + &Clear &Effacer @@ -1910,116 +2765,463 @@ DB Schema - + &New Database... &Nouvelle base de données... - - + + Create a new database file Créer une nouvelle base de données - + This option is used to create a new database file. Cette option est utilisée pour créer un nouveau fichier de base de données. - + Ctrl+N Ctrl+N - + + &Open Database... &Ouvrir une base de données... - - - + + + + + Open an existing database file Ouvrir une base de données existante - - + + + This option is used to open an existing database file. Cette option est utilisée pour ouvrir une base de données existante. - + + Ctrl+O Ctrl+O - + &Close Database &Fermer la base de données - + + This button closes the connection to the currently open database file + Ce bouton ferme la connexion à la base de données actuellement ouverte + + + Ctrl+W Ctrl+W - + &Revert Changes &Annuler les modifications - + + Revert database to last saved state Revenir à la dernière sauvegarde de la base de données - + This option is used to revert the current database file to its last saved state. All changes made since the last save operation are lost. Cette option permet de remettre la base de données dans l'état de sa dernière sauvegarde. Tous les changements effectués depuis cette dernière sauvegarde seront perdus. - + &Write Changes Enregistrer les &modifications - + + Write changes to the database file Enregistrer les modifications dans la base de données - + This option is used to save changes to the database file. Cette option est utilisée pour enregistrer les modifications dans la base de données. - + Ctrl+S Ctrl+S + + Execute all/selected SQL + Exécuter soit Tout soit le SQL sélectionné + + + + This button executes the currently selected SQL statements. If no text is selected, all SQL statements are executed. + Ce bouton lance l'exécution des commandes SQL actuellement sélectionnées. Si aucun texte n'est sélectionné, toutes les commandes SQL seront écécutées. + + + + This button opens a file containing SQL statements and loads it in a new editor tab + Ce bouton ouvre un fichier contenant des instructions SQL et le charge dans un nouvel onglet de l'éditeur + + + + &Wiki + &Wiki + + + + Bug &Report... + &Rapport d'erreur... + + + + Feature Re&quest... + &Demande de fonctionnalités... + + + + Web&site + &Site Internet + + + + &Donate on Patreon... + Effectuer une &Donation sur Patreon... + + + + Sa&ve Project... + Sau&vegarder le projet... + + + + This button lets you save all the settings associated to the open DB to a DB4S project file + Ce bouton vous permet d'enregistrer tous les paramètres associés à la Base de Données ouverte dans un fichier projet DB4S + + + + Open &Project... + Ouvrir un &Projet... + + + + This button lets you open a DB4S project file + Ce bouton ouvre un fichier projet DB4S + + + + &Attach Database... + Attac&her une Base de Données... + + + + + Add another database file to the current database connection + Ajouter un autre fichier de base de connées à la connexion à la base de données en cours + + + + This button lets you add another database file to the current database connection + Ce bouton vous permet d'ajouter un autre fichier de base de données à la connexion de base de données en cours + + + + &Set Encryption... + Chi&ffrer... + + + + SQLCipher &FAQ + &Faq SQLCipher + + + + Table(&s) to JSON... + Table(&s) vers JSON... + + + + Open Data&base Read Only... + Ouvrir la base de données en &Lecture seule... + + + + Save results + Sauvegarder les résultats + + + + Save the results view + Sauvegarder la vue des résultats + + + + This button lets you save the results of the last executed query + Ce bouton vous permet de sauvegarder les résultats de la dernière requête exécutée + + + + Find text in SQL editor + Rechercher du texte dans l'éditeur SQL + + + + Find text in SQL editor + Rechercher du texte dans l'éditeur SQL + + + + This button opens the search bar of the editor + Ce bouton ouvre la barre de recherche dans l'éditeur + + + + Ctrl+F + Ctrl+F + + + + Find or replace text in SQL editor + Rechercher ou remplacer du texte dans l'éditeur SQL + + + + Find or replace text in SQL editor + Rechercher ou remplacer du texte dans l'éditeur SQL + + + + This button opens the find/replace dialog for the current editor tab + Ce bouton ouvre la boîte de dialogue Rechercher/Remplacer pour l'onglet de l'éditeur courant + + + + + Export to &CSV + Exporter au format &CSV + + + + + Save as &view + Enregistrer comme une &vue + + + + Save as view + Enregistrer comme une vue + + + + Hide column(s) + Masquer une/des colonnes + + + + Hide selected column(s) + Maquer la/les colonnes sélectionnées + + + + Show all columns + Afficher toutes les colonnes + + + + Show all columns that were hidden + Permet d'afficher toutes les colonnes qui ont été masquées + + + + Shows or hides the Project toolbar. + Afficher ou masquer la barre d'outil Projet. + + + + Extra DB Toolbar + Extra DB Toolbar + + + + + Export the filtered data to CSV + Exporte les données filtrées au format CSV + + + + This button exports the data of the browsed table as currently displayed (after filters, display formats and order column) as a CSV file. + Ce bouton exporte les données du tableau parcouru telles qu'elles sont actuellement affichées (après les filtres, les formats d'affichage et la colonne d'ordre) dans un fichier CSV. + + + + + Save the current filter, sort column and display formats as a view + Enregistrer le filtre, la colonne de tri et les formats d'affichage actuels sous forme de vue + + + + This button saves the current setting of the browsed table (filters, display formats and order column) as an SQL view that you can later browse or use in SQL statements. + Ce bouton permet de sauvegarder les paramètres actuels de la table parcourue (filtres, formats d'affichage et colonne d'ordre) sous forme de vue SQL que vous pourrez ensuite parcourir ou utiliser dans les instructions SQL. + + + + Insert Values... + Ajout de valeurs... + + + + + Open a dialog for inserting values in a new record + Ouvre une fenêtre de dialogue permettant l'insersion de valeurs dans un nouvel enregistrement + + + + + Insert new record using default values in browsed table + Insérer un nouvel enregistrement en utilisant les valeurs par défaut de la table parcourrue + + + + New In-&Memory Database + Nouvelle base de données en &Mémoire + + + + Drag && Drop Qualified Names + Glisser && Déposer les noms qualifiés + + + + + Use qualified names (e.g. "Table"."Field") when dragging the objects and dropping them into the editor + Utilisez des noms qualifiés (par ex. "Table", "Champ") lorsque vous faites glisser les objets et pour les déposez dans l'éditeur + + + + Drag && Drop Enquoted Names + Glisser && Déposer les noms cités + + + + + Use escaped identifiers (e.g. "Table1") when dragging the objects and dropping them into the editor + Utiliser les identificateurs par défaut (par ex. "Table1") lors du glisser-déposer des objets dans l'éditeur + + + + &Integrity Check + Vérifier l'&Intégrité + + + + Runs the integrity_check pragma over the opened database and returns the results in the Execute SQL tab. This pragma does an integrity check of the entire database. + Exécute le pragma integrity_check sur la base de données ouverte et retourne les résultats dans l'onglet Exécuter SQL. Ce pragma effectue un contrôle d'intégrité de l'ensemble de la base de données. + + + + &Foreign-Key Check + Vérifier les clés &Etrangères + + + + Runs the foreign_key_check pragma over the opened database and returns the results in the Execute SQL tab + Exécute le pragma foreign_key_check_check sur la base de données ouverte et retourne les résultats dans l'onglet Exécuter SQL + + + + &Quick Integrity Check + Vérification &rapide de l'intégrité + + + + Run a quick integrity check over the open DB + Effectuer un rapide contrôle d'intégrité sur la base de données ouverte + + + + Runs the quick_check pragma over the opened database and returns the results in the Execute SQL tab. This command does most of the checking of PRAGMA integrity_check but runs much faster. + Exécute le pragma quick_check sur la base de données ouverte et retourne les résultats dans l'onglet Exécuter SQL. Cette commande effectue la plupart des vérifications de PRAGMA integrity_check mais s'exécute beaucoup plus rapidement. + + + + &Optimize + &Optimiser + + + + Attempt to optimize the database + Tente d'optimiser la base de données + + + + Runs the optimize pragma over the opened database. This pragma might perform optimizations that will improve the performance of future queries. + Exécute le pragma d'optimisation sur la base de données ouverte. Ce pragma pourrait effectuer des optimisations qui amélioreront la performance des requêtes futures. + + + + + Print + Imprimer + + + + Print text from current SQL editor tab + Imprime le contenu de l'onglet en cours de l'éditeur SQL [Ctrp+P] + + + + Open a dialog for printing the text in the current SQL editor tab + Ouvre une boite de dialogue pour imprimer le contenu de l'onglet en cours de l'éditeur SQL + + + + Print the structure of the opened database + Imprime la structure de la base de données ouverte + + + + Open a dialog for printing the structure of the opened database + Ouvre une boite de dialogue pour imprimer la structure de la base de données ouverte + + Compact Database Compacter la base de données - + Compact the database file, removing space wasted by deleted records Compacter la base de donnée, récupérer l'espace perdu par les enregistrements supprimés - - + + Compact the database file, removing space wasted by deleted records. Compacter la base de donnée, récupérer l'espace perdu par les enregistrements supprimés. - + E&xit &Quitter - + Ctrl+Q Ctrl+Q @@ -2028,12 +3230,12 @@ Base de données à partir du fichier SQL... - + Import data from an .sql dump text file into a new or existing database. Importer les données depuis un fichier sql résultant d'un vidage (sql dump) dans une nouvelle base de données ou une base existante. - + This option lets you import data from an .sql dump text file into a new or existing database. SQL dump files can be created on most database engines, including MySQL and PostgreSQL. Cette option vous permet d'importer un fichier sql de vidage d'une base de données (SQL dump) dans une nouvelle base de données ou une base existante. Ce fichier peut être créé par la plupart des moteurs de base de données, y compris MySQL et PostgreSQL. @@ -2042,12 +3244,12 @@ Table à partir d'un fichier CSV... - + Open a wizard that lets you import data from a comma separated text file into a database table. Ouvrir un Assistant vous permettant d'importer des données dans une table de la base de données à partir d'un fichier texte séparé par des virgules (csv). - + Open a wizard that lets you import data from a comma separated text file into a database table. CSV files can be created on most database and spreadsheet applications. Ouvre un Assistant vous permettant d'importer des données dans une table de la base de données à partir d'un fichier texte séparé par des virgules (csv). Les fichiers CSV peuvent être créés par la plupart des outils de gestion de base de données et les tableurs. @@ -2056,12 +3258,12 @@ Base de données vers un fichier SQL... - + Export a database to a .sql dump text file. Exporter la base de données vers un fichier de vidage sql (SQL dump) au format texte. - + This option lets you export a database to a .sql dump text file. SQL dump files contain all data necessary to recreate the database on most database engines, including MySQL and PostgreSQL. Exporter la base de données vers un fichier de vidage sql (SQL dump) au format texte. Ce fichier (SQL dump) contient toutes les informations nécessaires pour recréer une base de données par la plupart des moteurs de base de données, y compris MySQL et PostgreSQL. @@ -2070,42 +3272,42 @@ Table vers un fichier CSV... - + Export a database table as a comma separated text file. Exporter la table vers un fichier texte séparé par des virgules (CSV). - + Export a database table as a comma separated text file, ready to be imported into other database or spreadsheet applications. Exporter la table vers un fichier texte séparé par des virgules (CSV), prêt à être importé dans une autre base de données ou un tableur. - + &Create Table... &Créer une table... - + Open the Create Table wizard, where it is possible to define the name and fields for a new table in the database Ouvrir l'assistant de création d'une table dans lequel il sera possible de définir les noms et les champs d'une nouvelle table dans la base de données - + &Delete Table... &Supprimer une table... - + Open the Delete Table wizard, where you can select a database table to be dropped. Ouvrir l'assistant de suppression d'une table dans lequel vous pourrez sélectionner la base de données dans laquelle cette table sera supprimée. - + &Modify Table... &Modifier une table... - + Open the Modify Table wizard, where it is possible to rename an existing table. It is also possible to add or delete fields form a table, as well as modify field names and types. Ouvrir l'assistant de modification d'une table dans lequel il sera possible de renommer une table existante. Il est aussi possible d'ajouter ou de supprimer des champs de la table, tout comme modifier le nom des champs et leur type. @@ -2114,28 +3316,28 @@ Créer un index... - + Open the Create Index wizard, where it is possible to define a new index on an existing database table. Ouvrir l'assistant de création d'un index dans lequel il sera possible de définir un nouvel index dans une table préexistante de la base de données. - + &Preferences... &Préférences... - - + + Open the preferences window. Ouvrir la fenêtre des préférences. - + &DB Toolbar &Barre d'outils BdD - + Shows or hides the Database toolbar. Affiche ou masque la barre d'outils Base de données. @@ -2144,68 +3346,106 @@ Qu'est-ce que c'est ? - + Shift+F1 Maj+F1 - &About... - À &propos... + À &propos... - + &Recently opened Ouvert &récemment - + Open &tab vérifier le contexte Ouvrir un on&glet - - + + Ctrl+T Ctrl+T - + + This is the structure of the opened database. +You can drag multiple object names from the Name column and drop them into the SQL editor and you can adjust the properties of the dropped names using the context menu. This would help you in composing SQL statements. +You can drag SQL statements from the Schema column and drop them into the SQL editor or into other applications. + + Ceci est la structure de la base de données ouverte. +Vous pouvez faire glisser plusieurs noms d'objets de la colonne Nom et les déposer dans l'éditeur SQL et vous pouvez ajuster les propriétés des noms déposés en utilisant le menu contextuel. Cela pourrait vous aider à composer des instructions SQL. +Vous pouvez faire glisser les instructions SQL de la colonne Schéma et les déposer dans l'éditeur SQL ou dans d'autres applications. + + + + + Project Toolbar + Barre d'outil Projet + + + + Extra DB toolbar + Extra DB Toolbar + + + + + + Close the current database file + Fermer la base de données en cours + + + + Compact &Database... + Compacter la Base de &Données... + + + + &About + À &propos + + + + This button opens a new tab for the SQL editor + Ce bouton ouvre un nouvel onglet dans l'éditeur SQL + + + &Execute SQL &Exécuter le SQL - Execute SQL [F5, Ctrl+Return] - Exécuter le SQL [F5 ou Ctrl+Entrée] + Execute SQL + Exécuter le SQL - &Load extension - Charger &l'Extension + Charger &l'Extension - &Wiki... - &Wiki... + &Wiki... - Bug &report... - &Rapport d'anomalie... + &Rapport d'anomalie... - Web&site... - &Site Internet... + &Site Internet... Save Project Sauvegarder le projet - - + + Save the current session to a file Sauvegarder la session courante dans un fichier @@ -2214,13 +3454,13 @@ Ouvrir un projet - - + + Load a working session from a file Charger une session de travail depuis un fichier - + Open SQL file Ouvrir un fichier SQL @@ -2230,127 +3470,180 @@ Structure de la Base de Données - + + This is the structure of the opened database. +You can drag SQL statements from an object row and drop them into other applications or into another instance of 'DB Browser for SQLite'. + + Ceci est la structure de la base de données ouverte. +Vous pouvez faire glisser les instructions SQL d'une ligne d'objet et les déposer dans d'autres applications ou dans une autre instance de'DB Browser for SQLite'. + + + Browse Data Parcourir les données - + &Table: &Table : + + Refresh the data in the selected table + Rafraîchir les données de la table sélectionnée + + + + This button clears all the filters set in the header input fields for the currently browsed table. + Ce bouton efface tous les filtres définis dans les champs de saisie de l'en-tête de la table actuellement parcourue. + + + + Save the table as currently displayed + Sauvegarder la table comme affichée actuellement + + + + <html><head/><body><p>This popup menu provides the following options applying to the currently browsed and filtered table:</p><ul style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;"><li style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Export to CSV: this option exports the data of the browsed table as currently displayed (after filters, display formats and order column) to a CSV file.</li><li style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Save as view: this option saves the current setting of the browsed table (filters, display formats and order column) as an SQL view that you can later browse or use in SQL statements.</li></ul></body></html> + <html><head/><body><p>Ce menu déroulant fournit les options suivantes s'appliquant à la table actuellement parcourue et filtrée:</p><ul style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;"><li style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Exporter au format CSV : cette option exporte les données de la table parcourue telles qu'elles sont actuellement affichées (après filtres, formats d'affichage et colonne d'ordre) vers un fichier CSV.</li><li style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Enregistrer comme vue : cette option permet d'enregistrer les paramètres actuels de la table parcourue (filtres, formats d'affichage et colonne d'ordre) dans une vue SQL que vous pourrez ensuite parcourir ou utiliser dans les instructions SQL.</li></ul></body></html> + + + + ... + ... + + + + Print currrently browsed table data + Imprimer le données de la table actuellement parcourues + + + + Print currrently browsed table data. Print selection if more than one cell is selected. + Imprimer le données de la table actuellement parcourues. Imprime la sélection su plus s'une ligne est sélectionnée. + + + + <html><head/><body><p>This button creates a new record in the database. Hold the mouse button to open a pop-up menu of different options:</p><ul><li><span style=" font-weight:600;">New Record</span>: insert a new record with default values in the database.</li><li><span style=" font-weight:600;">Insert Values...</span>: open a dialog for entering values before they are inserted in the database. This allows to enter values acomplishing the different constraints. This dialog is also open if the <span style=" font-weight:600;">New Record</span> option fails due to these constraints.</li></ul></body></html> + <html><head/><body><p>Ce bouton crée un nouvel enregistrement dans la base de données. Maintenez le bouton de la souris enfoncé pour ouvrir un menu contextuel de différentes options :</p><ul><li><span style=" font-weight:600;">Nouvel Enregistrement</span> : Insère un nouvel enregistrement avec les valeurs par défaut dans la base de données.</li><li><span style=" font-weight:600;">Insérer des valeurs...</span> : ouvre une boite de dialogue pour saisir des valeurs avant leur insersion dans la base de données. Ceci permet de saisir des valeurs correspondant aux différentes contraintes. Cette boîte de dialogue est également ouverte si l'option <span style=" font-weight:600;">Nouvel Enregistrement </span> est en erreur à cause de ces contraintes.</li></ul></body></html> + + + + This button deletes the record or records currently selected in the table + Ce bouton permet de supprimer l'enregistrement sélectionné dans la table + + + This is the database table view. You can do the following actions: + - Start writing for editing inline the value. + - Double-click any record to edit its contents in the cell editor window. + - Alt+Del for deleting the cell content to NULL. + - Ctrl+" for duplicating the current record. + - Ctrl+' for copying the value from the cell above. + - Standard selection and copy/paste operations. + Ceci est la vue des tables de base de données. Vous pouvez effectuer les actions suivantes : + - Commencez à écrire pour éditer en ligne la valeur. + - Double-cliquez sur n'importe quel enregistrement pour éditer son contenu dans la fenêtre de l'éditeur de cellule. + - Alt+Supp pour supprimer le contenu de la cellule et la met à NULL. + - Ctrl+" pour dupliquer l'enregistrement en cours. + - Ctrl+' pour copier la valeur de la cellule ci-dessus. + - Sélection standard et opérations de copier/coller. + + + Scroll one page upwards Remonter d'une page - + <html><head/><body><p>Clicking this button navigates one page of records upwards in the table view above.</p></body></html> <html><head/><body><p>Cliquer sur ce bouton permet d'afficher la page d'enregistrements précédente de la table ci dessus.</p></body></html> - + Scroll one page downwards Descendre d'une page - + <html><head/><body><p>Clicking this button navigates one page of records downwards in the table view above.</p></body></html> <html><head/><body><p>Cliquer sur ce bouton permet d'afficher la page d'enregistrements suivante de la table ci dessus.</p></body></html> - + Edit Pragmas Éditer les Pragmas - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_auto_vacuum"><span style=" text-decoration: underline; color:#0000ff;">Auto Vacuum</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_auto_vacuum"><span style=" text-decoration: underline; color:#0000ff;">Auto Vacuum</span></a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_auto_vacuum"><span style=" text-decoration: underline; color:#0000ff;">Auto Vacuum</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_automatic_index"><span style=" text-decoration: underline; color:#0000ff;">Automatic Index</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_automatic_index"><span style=" text-decoration: underline; color:#0000ff;">Index Automatique</span></a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_automatic_index"><span style=" text-decoration: underline; color:#0000ff;">Index Automatique</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_checkpoint_fullfsync"><span style=" text-decoration: underline; color:#0000ff;">Checkpoint Full FSYNC</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_checkpoint_fullfsync"><span style=" text-decoration: underline; color:#0000ff;">Point de contrôle FSYNC intégral</span></a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_checkpoint_fullfsync"><span style=" text-decoration: underline; color:#0000ff;">Point de contrôle FSYNC intégral</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_foreign_keys"><span style=" text-decoration: underline; color:#0000ff;">Foreign Keys</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_foreign_keys"><span style=" text-decoration: underline; color:#0000ff;">Clés étrangères</span></a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_foreign_keys"><span style=" text-decoration: underline; color:#0000ff;">Clés étrangères</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_fullfsync"><span style=" text-decoration: underline; color:#0000ff;">Full FSYNC</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_fullfsync"><span style=" text-decoration: underline; color:#0000ff;">Full FSYNC</span></a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_fullfsync"><span style=" text-decoration: underline; color:#0000ff;">Full FSYNC</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_ignore_check_constraints"><span style=" text-decoration: underline; color:#0000ff;">Ignore Check Constraints</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_ignore_check_constraints"><span style=" text-decoration: underline; color:#0000ff;">Ignorer la vérification des contraintes</span></a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_ignore_check_constraints"><span style=" text-decoration: underline; color:#0000ff;">Ignorer la vérification des contraintes</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_journal_mode"><span style=" text-decoration: underline; color:#0000ff;">Journal Mode</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_journal_mode"><span style=" text-decoration: underline; color:#0000ff;">Mode de journalisation</span></a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_journal_mode"><span style=" text-decoration: underline; color:#0000ff;">Mode de journalisation</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_journal_size_limit"><span style=" text-decoration: underline; color:#0000ff;">Journal Size Limit</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_journal_size_limit"><span style=" text-decoration: underline; color:#0000ff;">Taille maximale du journal</span></a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_journal_size_limit"><span style=" text-decoration: underline; color:#0000ff;">Taille maximale du journal</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_locking_mode"><span style=" text-decoration: underline; color:#0000ff;">Locking Mode</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_locking_mode"><span style=" text-decoration: underline; color:#0000ff;">Mode de vérouillagee</span></a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_locking_mode"><span style=" text-decoration: underline; color:#0000ff;">Mode de vérouillagee</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_max_page_count"><span style=" text-decoration: underline; color:#0000ff;">Max Page Count</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_max_page_count"><span style=" text-decoration: underline; color:#0000ff;">Max Page Count</span></a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_max_page_count"><span style=" text-decoration: underline; color:#0000ff;">Max Page Count</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_page_size"><span style=" text-decoration: underline; color:#0000ff;">Page Size</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_page_size"><span style=" text-decoration: underline; color:#0000ff;">Taille de la Page</span></a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_page_size"><span style=" text-decoration: underline; color:#0000ff;">Taille de la Page</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_recursive_triggers"><span style=" text-decoration: underline; color:#0000ff;">Recursive Triggers</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_recursive_triggers"><span style=" text-decoration: underline; color:#0000ff;">Triggers récursifs</span></a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_recursive_triggers"><span style=" text-decoration: underline; color:#0000ff;">Triggers récursifs</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_secure_delete"><span style=" text-decoration: underline; color:#0000ff;">Secure Delete</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_secure_delete"><span style=" text-decoration: underline; color:#0000ff;">Suppression sécuriséee</span></a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_secure_delete"><span style=" text-decoration: underline; color:#0000ff;">Suppression sécuriséee</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_synchronous"><span style=" text-decoration: underline; color:#0000ff;">Synchronous</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_synchronous"><span style=" text-decoration: underline; color:#0000ff;">Synchronisation</span></a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_synchronous"><span style=" text-decoration: underline; color:#0000ff;">Synchronisation</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_temp_store"><span style=" text-decoration: underline; color:#0000ff;">Temp Store</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_temp_store"><span style=" text-decoration: underline; color:#0000ff;">Stockage temporaire</span></a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_temp_store"><span style=" text-decoration: underline; color:#0000ff;">Stockage temporaire</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_user_version"><span style=" text-decoration: underline; color:#0000ff;">User Version</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_user_version"><span style=" text-decoration: underline; color:#0000ff;">Version utilisateur</span></a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_user_version"><span style=" text-decoration: underline; color:#0000ff;">Version utilisateur</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_wal_autocheckpoint"><span style=" text-decoration: underline; color:#0000ff;">WAL Auto Checkpoint</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_wal_autocheckpoint"><span style=" text-decoration: underline; color:#0000ff;">Point de contrôle WAL automatique</span></a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_wal_autocheckpoint"><span style=" text-decoration: underline; color:#0000ff;">Point de contrôle WAL automatique</span></a></p></body></html> - + Execute SQL Exécuter le SQL @@ -2359,7 +3652,7 @@ Serveur distant - + DB Toolbar Barre d'outils BdD @@ -2368,17 +3661,22 @@ Éditer le contenu d'une cellule de la base de données - + SQL &Log &Journal SQL - + Show S&QL submitted by A&fficher le SQL soumis par - + + This panel lets you examine a log of all SQL commands issued by the application or by yourself + Ce panneau vous permet d'examiner un journal de toutes les commandes SQL émises par l'application ou par vous-même + + + &Plot Gra&phique @@ -2479,317 +3777,323 @@ Charger toute les données : Cela a un effet uniquement si les données ont été parourues partiellement en raison du mécanisme de fetch partiel. - + DB Sche&ma DB Sche&ma - + &Remote Serveur &distant - Compact &Database - C&ompacter la Base de Données + C&ompacter la Base de Données - + &Database from SQL file... &Base de Données à partir du fichier SQL... - + &Table from CSV file... &Table depuis un fichier CSV... - + &Database to SQL file... Base de &Données vers un fichier SQL... - + &Table(s) as CSV file... &Table vers un fichier CSV... - + Create &Index... Créer un &Index... - + W&hat's This? &Qu'est-ce que c'est ? - - Execute SQL [F5, Ctrl+Return, Ctrl+R] - Exécuter le SQL [F5 ou Ctrl+Entrée; Ctrl+R] + Execute SQL + Exécuter le SQL - - - + + + Save SQL file Sauvegarder le fichier SQL - - Execute current line [Shift+F5] + + &Load Extension... + Charger l'&Extension... + + + + Execute current line Exécuter la ligne courante (Maj+F5) - + + This button executes the SQL statement present in the current editor line + Ce bouton exécute l'instruction SQL présente dans la ligne courante de l'éditeur + + + Shift+F5 Maj+F5 - Sa&ve Project - &Sauvegarder le projet + &Sauvegarder le projet - Open &Project - Ouvrir un &Projet + Ouvrir un &Projet - &Attach Database - Attac&her une Base de Données + Attac&her une Base de Données - &Set Encryption - &Chiffrer + &Chiffrer - - + + Save SQL file as Sauvegarder le fichier SQL comme - + + This button saves the content of the current SQL editor tab to a file + Ce bouton enregistre le contenu de l'onglet actuel de l'éditeur SQL dans un fichier + + + &Browse Table &Parcourir la table - + Copy Create statement Copier l'instruction CREATE - + Copy the CREATE statement of the item to the clipboard Copie l'instruction CREATE de cet item dans le presse-papier - + Edit display format Modifier le format d'affichage - + Edit the display format of the data in this column Modifie le format d'affichage des données contenues dans cette colonne - + Show rowid column Afficher la colonne RowId - + Toggle the visibility of the rowid column Permet d'afficher ou non la colonne RowId - - + + Set encoding Définir l'encodage - + Change the encoding of the text in the table cells Change l'encodage du texte des cellules de la table - + Set encoding for all tables Définir l'encodage pour toutes les tables - + Change the default encoding assumed for all tables in the database Change l'encodage par défaut choisi pour l'ensemble des tables de la Base de Données - &Open Database Read Only... - Ouvrir en &Lecture seule... + Ouvrir en &Lecture seule... - + Open an existing database file in read only mode Ouvrir une base de données existante en mode Lecture seule - + Unlock view editing Dévérouiller l'éditeur de vues - + This unlocks the current view for editing. However, you will need appropriate triggers for editing. Permet de dévérouiller la vue courante l'éditer. Cependant, vous aurez besoin de déclencheurs appropriés pour faire cela. + Duplicate record - Dupliquer l'enregistrement + Dupliquer l'enregistrement Load extension Charger une extension - + Execute current line Exécuter la ligne courante - Execute current line [Ctrl+E] + Execute current line Exécuter la ligne courante (Ctrl+E) - + Ctrl+E Ctrl+E - + Export as CSV file Exporter les données au format CSV - + Export table as comma separated values file Exporter la table vers un fichier texte séparé par des virgules (CSV) - + Ctrl+L Ctrl+L - + Ctrl+P Ctrl+P - + Database encoding Encodage de la base de données - - + + Choose a database file Choisir une base de données - + Ctrl+Return Ctrl+Entrée - + Ctrl+D Ctrl+D - + Ctrl+I Ctrl+I - + Encrypted Chiffré - + Database is encrypted using SQLCipher La Base de Données a été chiffrée avec SQLCipher - + Read only lecture seule - + Database file is read only. Editing the database is disabled. La Base de Données est en lecture seule. Il n'est pas possible de la modifier. - + Could not open database file. Reason: %1 La base de données ne peut être ouverte. Motif : %1 - - - + + + Choose a filename to save under Choisir un nom de fichier pour enregistrer sous - Error adding record: - Érreur dans l'ajout d'un enregistrement : + Erreur dans l'ajout d'un enregistrement : - + Error deleting record: %1 - Érreur dans la suppression d'un enregistrement : + Erreur dans la suppression d'un enregistrement : %1 - + Please select a record first Veuillez sélectionner au préalable un enregistrement - + %1 - %2 of %3 %1 - %2 de %3 - - + + There is no database opened. Please open or create a new database file. Il n'y a pas de base de données ouverte. Veuillez ouvrir ou créer une nouvelle base de données. - Are you sure you want to delete the %1 '%2'? All data associated with the %1 will be lost. - Êtes-vous sûr de vouloir supprimer le %1 '%2'? + Êtes-vous sûr de vouloir supprimer le %1 '%2'? Toutes les données associées à %1 seront perdues. - Error: could not delete the %1. Message from database engine: %2 - Érreur : Suppression impossible de %1. Message du moteur de base de données : + Erreur : Suppression impossible de %1. Message du moteur de base de données : %2 @@ -2797,31 +4101,29 @@ Il n'y a pas de base de données ouverte. - %1 rows returned in %2ms from: %3 - %1 enregistrements ramenés en %2ms depuis : %3 + %1 enregistrements ramenés en %2ms depuis : %3 - + , %1 rows affected , %1 enregistrements affectés - Query executed successfully: %1 (took %2ms%3) - Requête exécutée avec succès : %1 (en %2 ms%3) + Requête exécutée avec succès : %1 (en %2 ms%3) - + Error while saving the database file. This means that not all changes to the database were saved. You need to resolve the following error first. %1 - Érreur lors de la sauvegarde de la Base de Données. Cela sous-entend qu'aucun changement n'a été sauvegardé. Vous devez corriger au préalable l'erreur suivante : + Erreur lors de la sauvegarde de la Base de Données. Cela sous-entend qu'aucun changement n'a été sauvegardé. Vous devez corriger au préalable l'erreur suivante : %1 - + A new DB Browser for SQLite version is available (%1.%2.%3).<br/><br/>Please download at <a href='%4'>%4</a>. Une nouvelle version de SQLiteBrowser est disponible (%1.%2.%3).<br/><br/>Vous pouvez la télécharger sur <a href='%4'>%4</a>. @@ -2830,30 +4132,40 @@ Veuillez saisir l'URL du fichier de base de données à enregistrer. - - + + DB Browser for SQLite project file (*.sqbpro) Projet DB Browser pour SQLite (*.sqbpro) - + Please choose a new encoding for this table. Veuillez choisir un nouvel encodage pour cette table. - + Please choose a new encoding for all tables. Veuillez choisir un nouvel encodage pour toutes les tables. - + + Error checking foreign keys after table modification. The changes will be reverted. + Erreur de vérification des clés étrangères après modification de la table. Les modifications seront annulées. + + + + This table did not pass a foreign-key check.<br/>You should run 'Tools | Foreign-Key Check' and fix the reported issues. + Cette table n'a pas passé avec succès un contrôle de clé étrangère.<br/>Vous devez exécuter l'Outil | Contrôle des clés étrangères' et corriger les problèmes rapportés. + + + %1 Leave the field empty for using the database encoding. %1 Laissez le champ vide pour utiliser l'encodage de la Base de Données. - + This encoding is either not valid or not supported. Cet encodage est invalide ou non supporté. @@ -2866,9 +4178,8 @@ %1 enregistrements ramenés depuis %2 (en %3ms) - Error executing query: %1 - Érreur lors de l'exécution de la requête : %1 + Erreur lors de l'exécution de la requête : %1 Query executed successfully: %1 (took %2ms) @@ -2879,17 +4190,16 @@ Choisir un fichier texte - + Text files(*.csv *.txt);;All files(*) Fichiers Texte (*.txt);;Tous les fichiers(*) - Import completed - Import terminé + Import terminé - + Are you sure you want to undo all changes made to the database file '%1' since the last save? Êtes-vous sûr de vouloir annuler tous les changements effectués dans la base de données %1 depuis la dernière sauvegarde ? @@ -2910,173 +4220,371 @@ Export terminé. - + Choose a file to import Choisir un fichier à importer - - - + + + Text files(*.sql *.txt);;All files(*) Fichiers Texte (*.sql *.txt);;Tous les fichiers(*) - + Do you want to create a new database file to hold the imported data? If you answer no we will attempt to import the data in the SQL file to the current database. Voulez vous créer une nouvelle base de donnée pour gérer les données importées ? Si vous répondez non, nous essaierons d'importer les données du fichier SQL dans la base de données courante. - + File %1 already exists. Please choose a different name. Le fichier %1 existe déjà. Choisir un nom de fichier différent. - + Error importing data: %1 - Érreur lors de l'import des données : %1 + Erreur lors de l'import des données : %1 - + Import completed. Import terminé. - - + Delete View Supprimer la Vue - - + Delete Trigger Supprimer le Déclencheur - - + Delete Index Supprimer l'Index - - - + + Delete Table Supprimer la Table - + &%1 %2 &%1 %2 - + Setting PRAGMA values will commit your current transaction. Are you sure? Paramétrer les valeurs du PRAGMA enregistrera les actions de votre transaction courante. Êtes-vous sûr ? - + Execution aborted by user Exécution annulée par l'utilisateur - + + In-Memory database + Base de données en mémoire + + + + determining row count... + Détermination du nombre d'enregistrements... + + + + %1 - %2 of >= %3 + %1 - %2 de >= %3 + + + + Are you sure you want to delete the table '%1'? +All data associated with the table will be lost. + Êtes vous sûr de vouloir supprimer la table %1 ? +Toutes les données associées à la table seront perdues. + + + + Are you sure you want to delete the view '%1'? + Êtes vous sûr de voulolir supprimer la vue %1 ? + + + + Are you sure you want to delete the trigger '%1'? + Êtes vous sûr de voulolir supprimer le déclencheur %1 ? + + + + Are you sure you want to delete the index '%1'? + Êtes vous sûr de voulolir supprimer l'index %1 ? + + + + Error: could not delete the table. + Erreur : suppression de la table impossible. + + + + Error: could not delete the view. + Erreur : suppression de la vue impossible. + + + + Error: could not delete the trigger. + Erreur : suppression du déclencheur impossible. + + + + Error: could not delete the index. + Erreur : suppression d el'index impossible. + + + + Message from database engine: +%1 + Message depuis el moteur de la base de données : +%1 + + + + Editing the table requires to save all pending changes now. +Are you sure you want to save the database? + La modification de la table nécessite de sauvegarder toutes les modifications en attente maintenant. +Êtes-vous sûr de vouloir sauvegarder la base de données ? + + + + -- EXECUTING SELECTION IN '%1' +-- + -- EXECUTION DE LA SELECTION DANS '%1' +-- + + + + -- EXECUTING LINE IN '%1' +-- + -- EXECUTION DE LA LIGNE DANS '%1' +-- + + + + -- EXECUTING ALL IN '%1' +-- + -- EXECUTER TOUT DANS '%1' +-- + + + Setting PRAGMA values or vacuuming will commit your current transaction. Are you sure? - + Le réglage des valeurs PRAGMA ou l" "vacuuming" validera votre transaction en cours. +Êtes-vous sûr ? + + + + executing query + Exécution de la requête + + + + %1 rows returned in %2ms + %1 enregistrements ramenés en %2ms + + + + query executed successfully. Took %1ms%2 + Requête exécutée avec succès. A pris %1 ms %2 + + + + -- At line %1: +%4 +-- Result: %3 + -- A la ligne %1 : +%4 +-- Résultat : %3 - + Choose text files Choisir des fichiers texte - - + + Import completed. Some foreign key constraints are violated. Please fix them before saving. + Importation terminée. Certaines contraintes clés étrangères sont violées. Veuillez les corriger avant de les sauvegarder. + + + Modify View Modifier une Vue - - + Modify Trigger Modifier un Déclencheur - - + Modify Index Modifier un Index - - + Modify Table Modifier une Table - + Select SQL file to open Sélectionner un fichier SQL à ouvrir - + Couldn't read file: %1. Le fichier %1 ne peut être lu. - + Couldn't save file: %1. Le fichier %1 ne peut être sauvegardé. - + Select file name Sélectionner un nom de fichier - + Select extension file Sélectionner une extension de fichier - + Extensions(*.so *.dll);;All files(*) Extensions (*.so *.dll);;Tous les fichiers (*) - + Extension successfully loaded. l'extension a été chargée avec succès. - - + Error loading extension: %1 - Érreur lors du chargement de l'extension %1 + Erreur lors du chargement de l'extension %1 - + + Don't show again Ne plus afficher - + New version available. Une nouvelle version est disponible. - + + Choose a project file to open + Coisir un fichier de projet à ouvrir + + + + This project file is using an old file format because it was created using DB Browser for SQLite version 3.10 or lower. Loading this file format is still fully supported but we advice you to convert all your project files to the new file format because support for older formats might be dropped at some point in the future. You can convert your files by simply opening and re-saving them. + Ce fichier de projet utilise un ancien format de fichier parce qu'il a été créé avec DB Browser pour SQLite version 3.10 ou inférieure. Le chargement de ce format de fichier est toujours entièrement pris en charge, mais nous vous conseillons de convertir tous vos fichiers de projet vers le nouveau format de fichier car la prise en charge des anciens formats pourrait être supprimée à un moment donné dans le futur. Vous pouvez convertir vos fichiers en les ouvrant et en les sauvegardant à nouveau. + + + + Duplicate records + Enregistrement en double + + + + Ctrl+" + Ctrl+" + + + Please enter a pseudo-primary key in order to enable editing on this view. This should be the name of a unique column in the view. Veuillez entrer une pseudo clé primaire pour permettre l'édition de la vue. Ce devrait être le nom d'une colonne unique dans la vue. + + Collation needed! Proceed? + Classement nécessaire ! Continuer ? + + + + A table in this database requires a special collation function '%1' that this application can't provide without further knowledge. +If you choose to proceed, be aware bad things can happen to your database. +Create a backup! + Une table de cette Base de Données nécessite la fonction spéciale de classement '%1' que cette application ne peut fournir sans connaissances complémentaires. +Si vous choisissez de continuer, ayez à l'esprit que des choses non souhaitées peuvent survenir dans votre Base de Données. +Faitez une sauvegarde ! + + + + creating collation + Créer un classement + + + + Set a new name for the SQL tab. Use the '&&' character to allow using the following character as a keyboard shortcut. + Définissez un nouveau nom pour l'onglet SQL. Utilisez le caractère '&&' pour permettre d'utiliser le caractère suivant comme raccourci clavier. + + + + Please specify the view name + Veuillez spécifier le nom de la vue + + + + There is already an object with that name. Please choose a different name. + Il existe déjà un objet avec ce nom. Veuillez choisir un autre nom. + + + + View successfully created. + La vue a été crée avec succès. + + + + Error creating view: %1 + Erreur lors de la création de la vue : %1 + + + + There is no filter set for this table. View will not be created. + Il n'existe pas de filtre pour cette table. La vue ne sera pas crée. + + + + Delete Records + Supprimer les enregistrements + + + + This action will open a new SQL tab for running: + Cette action ouvrira un nouvel onglet SQL pour son exécution : + + + + Press Help for opening the corresponding SQLite reference page. + Cliquez sur Aide pour ouvrir la page de référence correspondante de SQLite. + + A new sqlitebrowser version is available (%1.%2.%3).<br/><br/>Please download at <a href='%4'>%4</a>. Une nouvelle version de SQLiteBrowser est disponible (%1.%2.%3).<br/><br/>Vous pouvez la télécharger sur <a href='%4'>%4</a>. @@ -3089,9 +4597,8 @@ PNG(*.png);;JPG(*.jpg);;PDF(*.pdf);;BMP(*.bmp);;All Files(*) - Choose a file to open - Choisir un fichier à ouvrir + Choisir un fichier à ouvrir SQLiteBrowser project(*.sqbpro) @@ -3103,6 +4610,19 @@ + NullLineEdit + + + Set to NULL + Définir comme NULL + + + + Alt+Del + Alt+Supp + + + PlotDock @@ -3110,182 +4630,278 @@ Graphique - + + <html><head/><body><p>This pane shows the list of columns of the currently browsed table or the just executed query. You can select the columns that you want to be used as X or Y axis for the plot pane below. The table shows detected axis type that will affect the resulting plot. For the Y axis you can only select numeric columns, but for the X axis you will be able to select:</p><ul style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;"><li style=" margin-top:12px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Date/Time</span>: strings with format &quot;yyyy-MM-dd hh:mm:ss&quot; or &quot;yyyy-MM-ddThh:mm:ss&quot;</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Date</span>: strings with format &quot;yyyy-MM-dd&quot;</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Time</span>: strings with format &quot;hh:mm:ss&quot;</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Label</span>: other string formats. Selecting this column as X axis will produce a Bars plot with the column values as labels for the bars</li><li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Numeric</span>: integer or real values</li></ul><p>Double-clicking the Y cells you can change the used color for that graph.</p></body></html> + <html><head/><body><p>Ce volet affiche la liste des colonnes de la table actuellement parcourue ou de la requête qui vient d'être exécutée. Vous pouvez sélectionner les colonnes que vous voulez utiliser comme axe X ou Y pour le volet de tracé ci-dessous. Le tableau montre le type d'axe détecté qui affectera le tracé résultant. Pour l'axe Y, vous ne pouvez sélectionner que des colonnes numériques, mais pour l'axe X, vous pourrez sélectionner :</p><ul style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;"><li style=" margin-top:12px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Date/Heure</span> : chaînes au format &quot;aaaa-MM-jj hh:mm:ss&quot; ou &quot;aaaa-MM-jjThh:mm:ss&quot;</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Date</span> : chaînes au format &quot;aaaa-MM-jj&quot;</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Heures</span> : chaînes au format &quot;hh:mm:ss&quot;</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Label</span> : autres formats de chaînes. Sélectionner cette colonne comme axe X produira un diagramme en barres avec les valeurs de la colonne comme étiquettes pour les barres</li><li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Numerique</span> : Nombres entiers ou Réels</li></ul><p>Avec Double-clic sur une cellule Y, vous pouvez changer le couleur utilisée dans le graphique.</p></body></html> + + + Columns Colonnes - + X X - + Y Y - _ - _ + _ + + + + Axis Type + Type d'axe + + + + Here is a plot drawn when you select the x and y values above. + +Click on points to select them in the plot and in the table. Ctrl+Click for selecting a range of points. + +Use mouse-wheel for zooming and mouse drag for changing the axis range. + +Select the axes or axes labels to drag and zoom only in that orientation. + Voici le graphique qui sera dessiné lorsque vous sélectionnerez les valeurs x et y ci-dessus. + +Cliquez sur les points pour les sélectionner dans le graphique et dans le tableau. Ctrl+Clic pour sélectionner une plage de points. + +Utilisez la molette de la souris pour zoomer et faites glisser la souris pour modifier la plage des axes. + +Sélectionnez les axes ou les étiquettes d'axes à faire glisser et à zoomer uniquement dans cette orientation. - + Line type: Type de ligne : - - + + None Aucun - + Line Ligne - + StepLeft A Gauche - + StepRight A Droite - + StepCenter Centré - + Impulse Impulsion - + Point shape: Forme du point : - + Cross Croix - + Plus Plus - + Circle Cercle - + Disc Disque - + Square Carré - + Diamond Diamant - + Star Étoile - + Triangle Triangle - + TriangleInverted Triangle Inversé - + CrossSquare Carré et croix - + PlusSquare Carré et Plus - + CrossCircle Cercle et Croix - + PlusCircle Cercle et Plus - + Peace Paix - + <html><head/><body><p>Save current plot...</p><p>File format chosen by extension (png, jpg, pdf, bmp)</p></body></html> <html><head/><body><p>Sauvegarder le graphique actuel...</p><p>Choisir le format de fichier parmi ces extensions (png, jpg, pdf, bmp)</p></body></html> - + Save current plot... Enregistrer le tracé actuel... - + + + Load all data and redraw plot + Charger toutes les données et redessiner le graphique + + Load all data. This has only an effect if not all data has been fetched from the table yet due to the partial fetch mechanism. - Charger toute les données : Cela a un effet uniquement si les données ont été parourues partiellement en raison du mécanisme de fetch partiel. + Charger toute les données : Cela a un effet uniquement si les données ont été parourues partiellement en raison du mécanisme de fetch partiel. - - - + + + Row # # Ligne - Choose a axis color - Choisir la couleur de l'axe + Choisir la couleur de l'axe + + + + Copy + Copier + + + + Print... + Imprimer... + + + + Show legend + Afficher la légende + + + + Stacked bars + Diagramme à barres empilées + + + + Date/Time + Date/Heure + + + + Date + Date + + + + Time + Heure + + + + + Numeric + Numérique + + + + Label + Label + + + + Invalid + Invalide + + + + Load all data and redraw plot. +Warning: not all data has been fetched from the table yet due to the partial fetch mechanism. + Charger toutes les données et redessiner le tracé. +Attention : toutes les données n'ont pas encore été extraites du tableau en raison du mécanisme d'extraction partielle. + + + + Choose an axis color + Choisir une couleur d'axe - + Choose a filename to save under Choisir un nom de fichier pour enregistrer sous - + PNG(*.png);;JPG(*.jpg);;PDF(*.pdf);;BMP(*.bmp);;All Files(*) PNG(*.png);;JPG(*.jpg);;PDF(*.pdf);;BMP(*.bmp);;All Files(*) - + + There are curves in this plot and the selected line style can only be applied to graphs sorted by X. Either sort the table or query by X to remove curves or select one of the styles supported by curves: None or Line. + Il y a des courbes dans ce graphique et le style de ligne sélectionné ne peut être appliqué qu'aux graphiques triés par X. Triez la table ou la requête par X pour supprimer les courbes ou sélectionnez un des styles pris en charge par les courbes : Aucun ou Ligne. + + Fetching all data... - Récupérer toutes les données... + Récupérer toutes les données... - Cancel - Annuler + Annuler @@ -3321,42 +4937,44 @@ Lan&gue - + Show remote options Afficher options Serv. Distant - + Automatic &updates Mises à jour A&utomatiques - + &Database Base de &Données - + Database &encoding &Encodage de la base de données - + Open databases with foreign keys enabled. Ouvrir une base de données en autorisant les clés étrangères. - + &Foreign keys &Clés étrangères - - - - - - + + + + + + + + enabled Autoriser @@ -3367,8 +4985,8 @@ - - + + ... ... @@ -3377,17 +4995,17 @@ Taille du bloc &Prefetch - + Remove line breaks in schema &view Suppr. les sauts de ligne dans la &vue du schéma - + Prefetch block si&ze &Taille du bloc de préfetch - + Advanced Avancé @@ -3397,382 +5015,553 @@ de la Base de Données - + SQ&L to execute after opening database Fichier SQ&L à exécuter à l'ouverture de la Base de Données - + Default field type Type de champ par défaut - + Data &Browser &Navigateur des données - + Font Police - + &Font &Police - Font si&ze: - T&aille de police : + T&aille de police : - + Content Contenu - + Symbol limit in cell Texte : Nb max. de caractères - NULL fields - Champs NULL + Champs NULL - &Text - &Texte + &Texte - Field colors - Couleur des champs + Couleur des champs - + NULL NULL - + Regular Standard - Text - Texte + Texte - + Binary Binaire - + Background Arrière plan - + Filters Filtres - + Escape character Caractère d'échappement - + Delay time (&ms) Délai (&ms) - + Set the waiting time before a new filter value is applied. Can be set to 0 for disabling waiting. Défini le temps d'attente avant qu'une nouvelle valeur de filtre est appliquee. Peut être renseigné à 0 pour supprimer le temps d'attente. - + &SQL &SQL - + Settings name Définir le nom - + Context Contexte - + Colour Couleur - + Bold Gras - + Italic Italique - + Underline Souligné - + Keyword Mot Clé - function - fonction + fonction - + Function Fonction - + Table Table - + Comment Commentaire - + Identifier Identifiant - + String Chaîne de caractère - - currentline - Ligne courante + currentline + Ligne courante + + + + Current line + Ligne courante + + + + SQL &editor font size + &Taille de la police : Éditeur SQL + + + SQL &log font size + Taille de la police : &Journal SQL + + + + Tab size + Largeur de tabulation + + + + SQL editor &font + &Police de l'éditeur SQL + + + + Error indicators + Indicateur d'erreur + + + Enabling error indicators highlights the SQL code lines that caused errors during the last execution + Activer l'indicateur d'erreur met en évidence la ligne de code SQL ayant causé une ou des erreurs pendant son exécution + + + + Hori&zontal tiling + Division hori&zontale + + + + If enabled the SQL code editor and the result table view are shown side by side instead of one over the other. + Si elle est activée, l'éditeur de code SQL et l'affichage du tableau de résultats sont présentés côte à côte au lieu d'être l'un sur l'autre. + + + + Code co&mpletion + Co&mplétion de code + + + + Toolbar style + Style de la barre d'outil + + + + Only display the icon + Afficher uniquement les icones + + + + Only display the text + Afficher uniquement le texte + + + + The text appears beside the icon + Le texte sera affiché à côté des icones + + + + The text appears under the icon + Le texte sera affiché sous les icones + + + + Follow the style + Suivre le style + + + + DB file extensions + Extensions de fichiers DB + + + + Manage + Gestion + + + + When enabled, the line breaks in the Schema column of the DB Structure tab, dock and printed output are removed. + Lorsque cette option est activée, les sauts de ligne de la colonne Schéma de l'onglet Structure de la Base de Données, du dock et de la sortie imprimée sont supprimés. + + + + Font si&ze + T&aille de police + + + + + This is the maximum number of rows in a table for enabling the value completion based on current values in the column. +Can be set to 0 for disabling completion. + Il s'agit du nombre maximum de lignes dans une table pour permettre la complétion de la valeur en fonction des valeurs actuelles dans la colonne. +Peut être mis à 0 pour désactiver la complétion. + + + + Row count threshold for completion + Seuil de comptage des enregistrements pour la complétion + + + + Field display + Affichage des champs + + + + Displayed &text + &Texte affiché + + + + Text color + Couleur de texte + + + + Background color + Couleur d'arrière plan + + + + Preview only (N/A) + Préaffichage uniquement (N/A) + + + + Foreground + Avant Plan + + + + SQL &results font size + Taille police &résultats SQL + + + + &Wrap lines + &Retour à la ligne + + + + Never + Jamais + + + + At word boundaries + Aux limites des mots - - Current line - Ligne courante + + At character boundaries + Aux limites des caractères - - SQL &editor font size - &Taille de la police : Éditeur SQL + + At whitespace boundaries + Aux limites des espaces - - SQL &log font size - Taille de la police : &Journal SQL + + &Quotes for identifiers + &Guillemets pour les identifiants - - Tab size - Largeur de tabulation + + Choose the quoting mechanism used by the application for identifiers in SQL code. + Choisissez le système de guillemets utilisés par l'application pour les identificateurs dans le code SQL. - - SQL editor &font - &Police de l'éditeur SQL + + "Double quotes" - Standard SQL (recommended) + "Double guillemet" - Standard SQL (recommandé) - - Error indicators - Indicateur d'erreur + + `Grave accents` - Traditional MySQL quotes + `Accent Grave` - Guillemets standards MySQL - - Enabling error indicators highlights the SQL code lines that caused errors during the last execution - Activer l'indicateur d'erreur met en évidence la ligne de code SQL ayant causé une ou des erreurs pendant son exécution + + [Square brackets] - Traditional MS SQL Server quotes + [Crochets] - Guillemets traditionels de MS SQL Server - - Hori&zontal tiling - Division hori&zontale + + Keywords in &UPPER CASE + Mots clé en &MAJUSCULES - - If enabled the SQL code editor and the result table view are shown side by side instead of one over the other. - Si elle est activée, l'éditeur de code SQL et l'affichage du tableau de résultats sont présentés côte à côte au lieu d'être l'un sur l'autre. + + When set, the SQL keywords are completed in UPPER CASE letters. + Quand cette case est cochée, les mots clé SQL sont transformés en MAJUSCULES. - - Code co&mpletion - Co&mplétion de code + + When set, the SQL code lines that caused errors during the last execution are highlighted and the results frame indicates the error in the background + Lorsque cette option est activée, les lignes de code SQL qui ont causé des erreurs lors de la dernière exécution sont mises en surbrillance et le cadre des résultats indique l'erreur en arrière-plan - + &Extensions E&xtensions - + Select extensions to load for every database: Sélectionner une extension à charger pour toutes les bases de données : - + Add extension Ajouter une extension - + Remove extension Enlever une extension - + <html><head/><body><p>While supporting the REGEXP operator SQLite doesn't implement any regular expression<br/>algorithm but calls back the running application. DB Browser for SQLite implements this<br/>algorithm for you to let you use REGEXP out of the box. However, as there are multiple possible<br/>implementations of this and you might want to use another one, you're free to disable the<br/>application's implementation and load your own by using an extension. Requires restart of the application.</p></body></html> <html><head/><body><p>Bien que SQLite supporte l'opérateur REGEXP, aucun algorithme<br>d'expression régulière est implémenté, mais il rappelle l'application en cours d'exécution. DB Browser pour SQLite implémente<br/>cet algorithme pour vous permettre d'utiliser REGEXP. Cependant, comme il existe plusieurs implémentations possibles<br/>et que vous souhaitez peut-être utiliser autre chose, vous êtes libre de désactiver cette implémentation dans l'application<br/>pour utiliser la votre en utilisant une extention. Cela nécessite le redémarrage de l'application.</p></body></html> - + Disable Regular Expression extension Désactiver l'extention "Expression Régulière" - + + <html><head/><body><p>SQLite provides an SQL function for loading extensions from a shared library file. Activate this if you want to use the <span style=" font-style:italic;">load_extension()</span> function from SQL code.</p><p>For security reasons, extension loading is turned off by default and must be enabled through this setting. You can always load extensions through the GUI, even though this option is disabled.</p></body></html> + <html><head/><body><p>SQLite fournit une fonction SQL pour charger des extensions à partir d'un fichier de bibliothèque partagé. Activez cette option si vous souhaitez utiliser la fonction <span style=" font-style:italic;">load_extension()</span> depuis el code SQL.</p><p>Pour des raisons de sécurité, le chargement des extensions est désactivé par défaut et doit être activé par ce paramètre. Vous pouvez toujours charger des extensions via l'interface graphique, même si cette option est désactivée.</p></body></html> + + + + Allow loading extensions from SQL code + Autoriser le chargement des extensions depuis le code SQL + + + Remote Serveur distant - + CA certificates Certificats CA - - + + Subject CN Sujet CN - + Common Name Nom Commun - CN - + Subject O Sujet O - + Organization Organisation - - + + Valid from Valide de - - + + Valid to Valide jusqu'à - - + + Serial number Numéro de série - + Your certificates Vos certificats - + File Fichier - + Subject Common Name Sujet Common Name - + Issuer CN Émetteur CN - + Issuer Common Name - + Clone databases into Cloner la base de données dans - - + + Choose a directory Choisir un répertoire - + The language will change after you restart the application. La langue ne changera qu'après le redémarrage de l'application. - + Select extension file Sélectionner un fichier d'extension - + Extensions(*.so *.dll);;All files(*) Extensions (*.so *.dll);;Tous les fichiers (*) - + Import certificate file Importer un fichier de certificat - + No certificates found in this file. Aucun certificat n'a été trouvé dans ce fichier. - + Are you sure you want do remove this certificate? All certificate data will be deleted from the application settings! Êtes-vous sûr de vouloir supprimer ce certificat ? Toutes les données de ce certificat seront supprimées des paramètres de l'application! + + + Are you sure you want to clear all the saved settings? +All your preferences will be lost and default values will be used. + Êtes-vous sûr de vouloir effacer tous les réglages sauvegardés ? +Toutes vos préférences seront perdues et les valeurs par défaut seront utilisées. + QObject Error importing data. Message from database engine: %1 - Érreur lors de l'import des données. Message du moteur de base de données : + Erreur lors de l'import des données. Message du moteur de base de données : %1 @@ -3796,24 +5585,29 @@ Exporter la base de données dans un fichier SQL... - + Error importing data - Érreur lors de l'import des données + Erreur lors de l'import des données - + from record number %1 pour l'enregistrement numéro %1 - + . %1 . %1 - + + Importing CSV file... + Import du fichier CSV... + + + Cancel Annuler @@ -3828,7 +5622,7 @@ Error in statement #%1: %2. Aborting execution. - Érreur dans le traitement #%1 : %2. + Erreur dans le traitement #%1 : %2. l'exécution est abandonnée. @@ -3875,7 +5669,7 @@ Error renaming table '%1' to '%2'.Message from database engine: %3 - Érreur lors du changement de nom de la table %1 vers %2. Message du moteur de base de données : + Erreur lors du changement de nom de la table %1 vers %2. Message du moteur de base de données : %3 @@ -3895,9 +5689,8 @@ la liste des types ne peut être obtenue - Decoding CSV file... - Décodage du fichier CSV... + Décodage du fichier CSV... didn't receive any output from pragma %1 @@ -3909,100 +5702,124 @@ Error setting pragma %1 to %2: %3 - Érreur dans les paramètres du pragma %1 à %2 : %3 + Erreur dans les paramètres du pragma %1 à %2 : %3 File not found. Fichier non trouvé. - Collation needed! Proceed? - Classement nécessaire ! Continuer ? + Classement nécessaire ! Continuer ? - A table in this database requires a special collation function '%1' that this application can't provide without further knowledge. If you choose to proceed, be aware bad things can happen to your database. Create a backup! - Une table de cette Base de Données nécessite la fonction spéciale de classement '%1' que cette application ne peut fournir sans connaissances complémentaires. + Une table de cette Base de Données nécessite la fonction spéciale de classement '%1' que cette application ne peut fournir sans connaissances complémentaires. Si vous choisissez de continuer, ayez à l'esprit que des choses non souhaitées peuvent survenir dans votre Base de Données. Faitez une sauvegarde ! - SQLite database files (*.db *.sqlite *.sqlite3 *.db3);;All files (*) - Base de Données SQLite (*.db *.sqlite *.sqlite3 *.db3);;Tous les fichiers (*) + Base de Données SQLite (*.db *.sqlite *.sqlite3 *.db3);;Tous les fichiers (*) + + + + All files (*) + Tous les fichiers (*) + + + + SQLite database files (*.db *.sqlite *.sqlite3 *.db3) + Base de Données SQLite (*.db *.sqlite *.sqlite3 *.db3) RemoteDatabase - + Error when connecting to %1. %2 - Érreur lors de la connexion à %1. + Erreur lors de la connexion à %1. %2 - + Error opening remote file at %1. %2 - Érreur lors de l'ouverture du fichier distant %1. + Erreur lors de l'ouverture du fichier distant %1. %2 - + Error: Invalid client certificate specified. - Érreur : Le certificat du client spécifié est invalide. + Erreur : Le certificat du client spécifié est invalide. - + Please enter the passphrase for this client certificate in order to authenticate. Veuillez entrer la phrase secrète pour ce certificat client de façon à vous authentifier. - + Cancel Annuler - + Uploading remote database to -%1. +%1 Téléchargement de la base distante dans +%1 + + + + Downloading remote database from +%1 + Télécharger une base de données distante depuis +%1 + + + + The remote database has been updated since the last checkout. Do you want to update the local database to the newest version? Note that this discards any changes you have made locally! If you don't want to lose local changes, click No to open the local version. + La base de données distante a été mise à jour depuis la dernière commande. Voulez-vous mettre à jour la base de données locale vers la dernière version ? Notez que ceci annule toutes les modifications que vous avez faites localement ! Si vous ne voulez pas perdre les modifications locales, cliquez sur Non pour ouvrir la version locale. + + + Uploading remote database to +%1. + Téléchargement de la base distante dans %1. - Downloading remote database from %1. - Télécharger une base de données distante depuis + Télécharger une base de données distante depuis %1. - - + + Error: The network is not accessible. - Érreur : le réseau n'est pas accessible. + Erreur : le réseau n'est pas accessible. - + Error: Cannot open the file for sending. - Érreur : Ne peut ouvrir le fichier à envoyer. + Erreur : Ne peut ouvrir le fichier à envoyer. - + Error opening local databases list. %1 - Érreur lors de l'ouverture de la liste des bases de données locales. + Erreur lors de l'ouverture de la liste des bases de données locales. %1 - + Error creating local databases list. %1 - Érreur lors de la création de la liste des bases de données locales. + Erreur lors de la création de la liste des bases de données locales. %1 @@ -4028,15 +5845,25 @@ + Connect to the remote server using the currently selected identity. The correct server is taken from the identity as well. + Connectez-vous au serveur distant en utilisant l'identité actuellement sélectionnée. Le serveur correct est également extrait de l'identité. + + + Go Go - + Push currently opened database to server Déplacer la Base de Données en cours sur le serveur + + <html><head/><body><p>In this pane, remote databases from dbhub.io website can be added to DB4S. First you need an identity:</p><ol style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;"><li style=" margin-top:12px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Login to the dbhub.io website (use your GitHub credentials or whatever you want)</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Click the button to create a DB4S certificate (that's your identity). That'll give you a certificate file (save it to your local disk).</li><li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Go to the Remote tab in DB4S Preferences. Click the button to add a new certificate to DB4S and choose the just downloaded certificate file.</li></ol><p>Now the Remote panel shows your identity and you can add remote databases.</p></body></html> + <html><head/><body><p>Dans ce volet, les bases de données distantes du site Web dbhub.io peuvent être ajoutées à DB4S. Il vous faut d'abord une identité :</p><ol style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;"><li style=" margin-top:12px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Connectez-vous sur le site dbhub.io (utilisez vos identifiants GitHub ou ce que vous voulez)</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Cliquez sur le bouton pour créer un certificat DB4S (c'est votre identité). Cela vous donnera un fichier de certificat (enregistrez-le sur votre disque local).</li><li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Allez dans l'onglet Serveur Distant des Préférences DB4S. Cliquez sur le bouton pour ajouter un nouveau certificat à DB4S et choisissez le fichier de certificat que vous venez de télécharger.</li></ol><p>Maintenant, le panneau Serveur distant affiche votre identité et vous pouvez ajouter des bases de données distantes..</p></body></html> + + Please enter the database name to push to. Veuillez saisir le nom de la Base de Données à déplacer. @@ -4078,51 +5905,71 @@ Push database - + Je ne pense pas que Push soir le bon terme. Est-ce que cela fonction comme un serveur de version ? + Pousser une basse de données Database na&me to push to - + &Nom de la base de données à pousser vers - + Commit message - + Message de Commit - + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Oxygen-Sans'; font-size:10pt; font-weight:400; font-style:normal;"> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p></body></html> - + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Oxygen-Sans'; font-size:10pt; font-weight:400; font-style:normal;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p></body></html> - + Database licence - + Licence de la base de données - + Public - + Publique + + + + Branch + Branche + + + + Force push + Forcer le "push" - + Database will be public. Everyone has read access to it. - + La Base de DOnnée sera publique. Tout le monde a un accès en lecture. - + Database will be private. Only you have access to it. - + La base de données est privée. Vous seul y avez accès. + + + + Use with care. This can cause remote commits to be deleted. + A utiliser avec précaution. Cela peut entraîner la suppression des commit distants. - + Unspecified - + Non spécifié @@ -4133,314 +5980,504 @@ Formulaire - + + Find previous match [Shift+F3] + Trouver la correspondance précédente [Maj+F3] + + + + Find previous match with mapping + Trouver la correspondance précédente avec le modèle + + + + Shift+F3 + Maj+F3 + + + + The found pattern must be a whole word + Le motif trouvé doit être un mot entier + + + + Whole Words + Mots entiers + + + + Text pattern to find considering the checks in this frame + Modèle de texte à trouver en tenant compte des contrôles de ce cadre + + + + Find in editor + Chercher dans l'éditeur + + + + The found pattern must match in letter case + Le motif recherché doit respecter la casse des lettres + + + + Case Sensitive + Sensible à la casse + + + + Find next match [Enter, F3] + Trouver la correspondance suivante [Entrée, F3] + + + + Find next match with wrapping + Trouver la correspondance suivante avec le modèle + + + + F3 + F3 + F3 + + + + Interpret search pattern as a regular expression + Interpréter le modèle de recherche comme une expression régulière + + + + <html><head/><body><p>When checked, the pattern to find is interpreted as a UNIX regular expression. See <a href="https://en.wikibooks.org/wiki/Regular_Expressions">Regular Expression in Wikibooks</a>.</p></body></html> + <html><head/><body><p>Lorsqu'elle est cochée, le motif à trouver est interprété comme une expression régulière UNIX. Voir <a href="https://en.wikibooks.org/wiki/Regular_Expressions">Regular Expression in Wikibooks</a>.</p></body></html> + + + + Regular Expression + Expression régulière + + + + + Close Find Bar + Fremer la barre de recherche + + + + Results of the last executed statements Résultats du dernier traitement exécuté - + This field shows the results and status codes of the last executed statements. Ce champ affiche les résultats et les codes de statut du dernier traitement exécuté. - Export to &CSV - Exporter au format &CSV + Exporter au format &CSV - Save as &view - Enregistrer comme une &vue + Enregistrer comme une &vue - Save as view - Enregistrer comme une vue + Enregistrer comme une vue - Please specify the view name - Veuillez spécifier le nom de la vue + Veuillez spécifier le nom de la vue - There is already an object with that name. Please choose a different name. - Il existe déjà un objet avec ce nom. Veuillez choisir un autre nom. + Il existe déjà un objet avec ce nom. Veuillez choisir un autre nom. - View successfully created. - La vue a été crée avec succès. + La vue a été crée avec succès. - Error creating view: %1 - Érreur lors de la création de la vue : %1 + Erreur lors de la création de la vue : %1 SqlUiLexer - + (X) The abs(X) function returns the absolute value of the numeric argument X. (X) La fonction abs(X) renvoie la valeur absolue de l'argument numérique X. - + () The changes() function returns the number of database rows that were changed or inserted or deleted by the most recently completed INSERT, DELETE, or UPDATE statement. () La fonction changes() renvoie le nombre de lignes de la Base de Données qui ont été modifiées, insérées ou supprimées par les instructions UPDATE, INSERT ou DELETE terminées dernièrement. - + (X1,X2,...) The char(X1,X2,...,XN) function returns a string composed of characters having the unicode code point values of integers X1 through XN, respectively. (X1, X2,...) La fonction char(X1,X2,...,XN) renvoie une chaîne composée des caractères ayant les valeurs des points de code unicode des entiers allant de X1 à XN, respectivement. - + (X,Y,...) The coalesce() function returns a copy of its first non-NULL argument, or NULL if all arguments are NULL (X, Y, ...) La fonction coalesce () renvoie une copie de son premier argument non-NULL, ou NULL si tous les arguments sont NULL - + (X,Y) The glob(X,Y) function is equivalent to the expression "Y GLOB X". (X, Y) La fonction glob (X, Y) est équivalente à l'expression « Y GLOB X ». - + (X,Y) The ifnull() function returns a copy of its first non-NULL argument, or NULL if both arguments are NULL. (X, Y) La fonction ifnull () renvoie une copie de son premier argument non-NULL, ou NULL si les deux arguments sont NULL. - + (X,Y) The instr(X,Y) function finds the first occurrence of string Y within string X and returns the number of prior characters plus 1, or 0 if Y is nowhere found within X. (X, Y) La fonction instr (X, Y) trouve la première occurrence de la chaîne Y dans la chaîne X. Elle renvoie le nombre de caractères précédents plus 1 ou 0 si Y n'est pas dans X. - + (X) The hex() function interprets its argument as a BLOB and returns a string which is the upper-case hexadecimal rendering of the content of that blob. (X) La fonction hex () interprète son argument comme un BLOB et renvoie une chaîne qui est le rendu hexadécimal en majuscules du contenu de ce blob. - + () The last_insert_rowid() function returns the ROWID of the last row insert from the database connection which invoked the function. () La fonction last_insert_rowid () renvoie le ROWID de la dernière ligne insérée par la connexion de la Base de Données qui a invoqué la fonction. - + (X) For a string value X, the length(X) function returns the number of characters (not bytes) in X prior to the first NUL character. (X) Pour une valeur de chaîne X, la fonction length(X) renvoie le nombre de caractères (pas d'octets) dans X avant le premier caractère NULL. - + (X,Y) The like() function is used to implement the "Y LIKE X" expression. (X, Y) La fonction like() est utilisée pour mettre en œuvre de l’expression « Y LIKE X ». - + (X,Y,Z) The like() function is used to implement the "Y LIKE X ESCAPE Z" expression. (X, Y, Z) La fonction like() est utilisée pour mettre en œuvre de l’expression « Y LIKE X ESCAPE Z ». - (X) The load_extension(X) function loads SQLite extensions out of the shared library file named X. - (X) La fonction load_extension(X) charge les extensions SQLite situées en dehors du fichier de bibliothèque partagée nommée X. + (X) La fonction load_extension(X) charge les extensions SQLite situées en dehors du fichier de bibliothèque partagée nommée X. - (X,Y) The load_extension(X) function loads SQLite extensions out of the shared library file named X using the entry point Y. - (X, Y) La fonction load_extension(X) charge les extensions SQLite situées en dehors du fichier de bibliothèque partagée nommée X en utilisant le point d'entrée Y. + (X, Y) La fonction load_extension(X) charge les extensions SQLite situées en dehors du fichier de bibliothèque partagée nommée X en utilisant le point d'entrée Y. - + + (X) The load_extension(X) function loads SQLite extensions out of the shared library file named X. +Use of this function must be authorized from Preferences. + (X) La fonction load_extension(X) charge les extensions SQLite à partir du fichier de bibliothèque partagé nommé X. +L'utilisation de cette fonction doit être autorisée à partir des Préférences. + + + + (X,Y) The load_extension(X) function loads SQLite extensions out of the shared library file named X using the entry point Y. +Use of this function must be authorized from Preferences. + (X,Y) La fonction load_extension(X) charge les extensions SQLite à partir du fichier de bibliothèque partagée nommé X en utilisant le point d'entrée Y. +L'utilisation de cette fonction doit être autorisée à partir des Préférences. + + + (X) The lower(X) function returns a copy of string X with all ASCII characters converted to lower case. (X) La fonction lower(X) renvoie une copie de la chaîne X avec tous ses caractères ASCII convertis en minuscules. - + (X) ltrim(X) removes spaces from the left side of X. (X) ltrim(X) supprime les espaces gauche de X. - + (X,Y) The ltrim(X,Y) function returns a string formed by removing any and all characters that appear in Y from the left side of X. (X, Y) La fonction ltrim(X,Y) renvoie une chaîne résultant de la suppression de tous les caractères qui apparaissent en Y à gauche de X. - + (X,Y,...) The multi-argument max() function returns the argument with the maximum value, or return NULL if any argument is NULL. (X,Y,...) La fonction à arguments multiples max() renvoie l'argument ayant la plus grande valeur ou renvoie NULL si tous les arguments sont NULL. - + (X,Y,...) The multi-argument min() function returns the argument with the minimum value. (X,Y,...) La fonction à arguments multiples min() renvoie l'argument ayant la plus petite valeur. - + (X,Y) The nullif(X,Y) function returns its first argument if the arguments are different and NULL if the arguments are the same. (X, Y) La fonction nullif(X,Y) renvoie le premier argument, si les arguments sont différents et NULL si les X et Y sont les mêmes. - + (FORMAT,...) The printf(FORMAT,...) SQL function works like the sqlite3_mprintf() C-language function and the printf() function from the standard C library. (FORMAT,...) La fonction SQL printf(FORMAT,...) fonctionne comme la fonction de sqlite3_mprintf() en langage C et la fonction printf() de la bibliothèque C standard. - + (X) The quote(X) function returns the text of an SQL literal which is the value of its argument suitable for inclusion into an SQL statement. (X) La fonction quote(X) renvoie le texte d’un litéral SQL qui est la valeur appropriée de l’argument pour son inclusion dans une requête SQL. - + () The random() function returns a pseudo-random integer between -9223372036854775808 and +9223372036854775807. () La fonction random() renvoie un nombre entier pseudo-aléatoire entre -9223372036854775808 et + 9223372036854775807. - + (N) The randomblob(N) function return an N-byte blob containing pseudo-random bytes. (N) La fonction randomblob(N) renvoie un blob de N octets contenant des octets pseudo-aléatoires. - + (X,Y,Z) The replace(X,Y,Z) function returns a string formed by substituting string Z for every occurrence of string Y in string X. (X, Y, Z) La fonction replace(X,Y,Z) renvoie une chaîne formée en substituant par la chaîne Z chaque occurrence de la chaîne Y présente dans la chaîne X. - + (X) The round(X) function returns a floating-point value X rounded to zero digits to the right of the decimal point. (X) La fonction round(X) renvoie une valeur à virgule flottante X arrondie à zéro chiffres à droite de la virgule décimale. - + (X,Y) The round(X,Y) function returns a floating-point value X rounded to Y digits to the right of the decimal point. (X, Y) La fonction round(X,Y) renvoie une valeur à virgule flottante X arrondie à Y chiffres à droite de la virgule décimale. - + (X) rtrim(X) removes spaces from the right side of X. X) rtrim(X) supprime les espaces droite de X. - + (X,Y) The rtrim(X,Y) function returns a string formed by removing any and all characters that appear in Y from the right side of X. (X, Y) La fonction rtrim(X,Y) renvoie une chaîne formée en supprimant tous les caractères qui apparaissent en Y, à droite de X. - + (X) The soundex(X) function returns a string that is the soundex encoding of the string X. (X) La fonction soundex(X) renvoie une chaîne qui est l'encodage soundex de la chaîne X. - + (X,Y) substr(X,Y) returns all characters through the end of the string X beginning with the Y-th. (X, Y) substr(X,Y) renvoie tous les caractères à partir du n-ième Y jusqu'à la fin de la chaîne X. - + (X,Y,Z) The substr(X,Y,Z) function returns a substring of input string X that begins with the Y-th character and which is Z characters long. (X, Y, Z) La fonction substr(X,Y,Z) renvoie une sous-chaîne de la chaîne X à partie du n-ième caractère Y, de longueur Z. - + () The total_changes() function returns the number of row changes caused by INSERT, UPDATE or DELETE statements since the current database connection was opened. () La fonction total_changes() renvoie le nombre d'enregistrements altérés par les instructions INSERT, UPDATE ou DELETE depuis l’ouverture de la connexion de base de données courante. - + (X) trim(X) removes spaces from both ends of X. (X) trim(X) supprime les espaces aux deux extrémités de X. - + (X,Y) The trim(X,Y) function returns a string formed by removing any and all characters that appear in Y from both ends of X. (X, Y) La fonction trim(X,Y) renvoie une chaîne formée en supprimant tous les caractères de Y présents aux deux extrémités de X. - + (X) The typeof(X) function returns a string that indicates the datatype of the expression X. (X) La fonction typeof(X) renvoie une chaîne qui indique le type de données de l’expression X. - + (X) The unicode(X) function returns the numeric unicode code point corresponding to the first character of the string X. (X) La fonction unicode(X) renvoie le point de code unicode numérique correspondant au premier caractère de la chaîne X. - + (X) The upper(X) function returns a copy of input string X in which all lower-case ASCII characters are converted to their upper-case equivalent. (X) La fonction upper(X) renvoie une copie de la chaîne X dans laquel tous les caractères ASCII en minuscules sont convertis en leurs équivalents en majuscules. - + (N) The zeroblob(N) function returns a BLOB consisting of N bytes of 0x00. (N) La fonction zeroblob(N) renvoie un BLOB composé de N octets de valeur 0x00. - - - - + + + + (timestring,modifier,modifier,...) (timestring,modifier,modifier,...) - + (format,timestring,modifier,modifier,...) (format,timestring,modifier,modifier,...) - + (X) The avg() function returns the average value of all non-NULL X within a group. (X) La fonction avg() renvoie la valeur moyenne de tous les X non-NULL dans d’un groupe. - + (X) The count(X) function returns a count of the number of times that X is not NULL in a group. (X) La fonction count(X) renvoie le nombre de fois où X n’est pas NULL dans un groupe. - + (X) The group_concat() function returns a string which is the concatenation of all non-NULL values of X. (X) la fonction group_concat() renvoie une chaîne qui est la concaténation de toutes les valeurs non-NULL de X. - + (X,Y) The group_concat() function returns a string which is the concatenation of all non-NULL values of X. If parameter Y is present then it is used as the separator between instances of X. (X, Y) La fonction group_concat() renvoie une chaîne qui est la concaténation de toutes les valeurs non-NULL de X. Si le paramètre Y est présent, il est utilisé comme séparateur entre chaque instances de X. - + (X) The max() aggregate function returns the maximum value of all values in the group. (X) La fonction d’agrégat max() renvoie la valeur maximale de toutes les valeurs du groupe. - + (X) The min() aggregate function returns the minimum non-NULL value of all values in the group. (X) La fonction d’agrégation min() renvoie la valeur non-NULL minimale de toutes les valeurs du groupe. - - + + (X) The sum() and total() aggregate functions return sum of all non-NULL values in the group. (X) Les fonctions d'agrégation sum() et total() renvoient la somme de toutes les valeurs non-NULL du groupe. + + + () The number of the row within the current partition. Rows are numbered starting from 1 in the order defined by the ORDER BY clause in the window definition, or in arbitrary order otherwise. + () Le numéro del'enregistrement dans la partition courante. Les lignes sont numérotées à partir de 1 dans l'ordre défini par la clause ORDER BY dans la définition de la fenêtre, ou, sinon, dans un ordre arbitraire. + + + + () The row_number() of the first peer in each group - the rank of the current row with gaps. If there is no ORDER BY clause, then all rows are considered peers and this function always returns 1. + () Le row_number() enregistrement homologue de chaque groupe - le rang de l'enregistrement courant avec les écarts. S'il n'y a pas de clause ORDER BY, alors tous les enregistrements sont considérées comme homologues et cette fonction renvoie toujours 1. + + + + () The number of the current row's peer group within its partition - the rank of the current row without gaps. Partitions are numbered starting from 1 in the order defined by the ORDER BY clause in the window definition. If there is no ORDER BY clause, then all rows are considered peers and this function always returns 1. + () Le numéro du groupe d'enregistrements homologues de la rangée courante dans sa partition - le rang de la rangée courante sans espaces. Les partitions sont numérotées à partir de 1 dans l'ordre défini par la clause ORDER BY dans la définition de la fenêtre. S'il n'y a pas de clause ORDER BY, alors toutes les lignes sont considérées comme homologues et cette fonction renvoie toujours 1. + + + + () Despite the name, this function always returns a value between 0.0 and 1.0 equal to (rank - 1)/(partition-rows - 1), where rank is the value returned by built-in window function rank() and partition-rows is the total number of rows in the partition. If the partition contains only one row, this function returns 0.0. + () Malgré le nom, cette fonction retourne toujours une valeur comprise entre 0.0 et 1.0 égale à (rang - 1)/(rangées de partitions - 1), où rang est la valeur retournée par la fonction de fenêtre intégrée rank() et rangées de partitions est le nombre total de rangées dans la partition. Si la partition ne contient qu'une seule ligne, cette fonction renvoie 0.0. + + + + () The cumulative distribution. Calculated as row-number/partition-rows, where row-number is the value returned by row_number() for the last peer in the group and partition-rows the number of rows in the partition. + () Répartition cumulée. Calculée en tant que ligne-numéro/rangées-partition, où ligne-numéro est la valeur retournée par row_number() pour le dernier homologue dans le groupe et ligne-partition le nombre de lignes dans la partition. + + + + (N) Argument N is handled as an integer. This function divides the partition into N groups as evenly as possible and assigns an integer between 1 and N to each group, in the order defined by the ORDER BY clause, or in arbitrary order otherwise. If necessary, larger groups occur first. This function returns the integer value assigned to the group that the current row is a part of. + (N) L'argument N est traité comme un entier. Cette fonction divise la partition en N groupes le plus uniformément possible et attribue un entier compris entre 1 et N à chaque groupe, dans l'ordre défini par la clause ORDER BY, ou, sinon, dans un ordre arbitraire. Si nécessaire, les plus grands groupes se forment en premier. Cette fonction retourne la valeur entière assignée au groupe dont la ligne courante fait partie. + + + + (expr) Returns the result of evaluating expression expr against the previous row in the partition. Or, if there is no previous row (because the current row is the first), NULL. + (expr) Retourne le résultat de l'évaluation de l'expression expr par rapport à la ligne précédente de la partition. Ou NULL s'il n'y a pas de ligne précédente (parce que la ligne courante est la première). + + + + (expr,offset) If the offset argument is provided, then it must be a non-negative integer. In this case the value returned is the result of evaluating expr against the row offset rows before the current row within the partition. If offset is 0, then expr is evaluated against the current row. If there is no row offset rows before the current row, NULL is returned. + (expr,offset) Si l'argument offset est fourni, alors il doit être un entier non négatif. Dans ce cas, la valeur retournée est le résultat de l'évaluation de expr par rapport au décalage des lignes avant la ligne courante dans la partition. Si l'offset est égal à 0, alors expr est évalué par rapport à la ligne courante. S'il n'y a pas de lignes de décalage de ligne avant la ligne courante, NULL est retourné. + + + + + (expr,offset,default) If default is also provided, then it is returned instead of NULL if the row identified by offset does not exist. + (expr,offset,default) Si la valeur par défaut est aussi renseignée, cette valeur sera retournée au lieu de NULL si la ligne identifiée par offset n'existe pas. + + + + (expr) Returns the result of evaluating expression expr against the next row in the partition. Or, if there is no next row (because the current row is the last), NULL. + (expr) Retourne le résultat de l'évaluation de l'expression expr par rapport à la ligne suivante de la partition. Ou NULL s'il n'y a pas de ligne suivante (parce que la ligne courante est la dernière). + + + + (expr,offset) If the offset argument is provided, then it must be a non-negative integer. In this case the value returned is the result of evaluating expr against the row offset rows after the current row within the partition. If offset is 0, then expr is evaluated against the current row. If there is no row offset rows after the current row, NULL is returned. + (expr,offset) Si l'argument offset est fourni, alors il doit être un entier non négatif. Dans ce cas, la valeur retournée est le résultat de l'évaluation de expr par rapport par rapport au décalage des lignes après la ligne courante dans la partition. Si l'offset est égal à 0, alors expr est évalué par rapport à la ligne courante. S'il n'y a pas de lignes de décalage de ligne après la ligne courante, NULL est retourné. + + + + (expr) This built-in window function calculates the window frame for each row in the same way as an aggregate window function. It returns the value of expr evaluated against the first row in the window frame for each row. + (expr) Cette fonction de fenêtrage intégrée calcule le cadre de la fenêtre pour chaque rangée de la même manière qu'une fonction de fenêtrage agrégée. Elle retourne la valeur de expr évaluée par rapport à la première ligne du cadre de la fenêtre pour chaque ligne. + + + + (expr) This built-in window function calculates the window frame for each row in the same way as an aggregate window function. It returns the value of expr evaluated against the last row in the window frame for each row. + (expr) Cette fonction de fenêtrage intégrée calcule le cadre de la fenêtre pour chaque rangée de la même manière qu'une fonction de fenêtrage agrégée. Elle retourne la valeur de expr évaluée par rapport à la dernière ligne du cadre de la fenêtre pour chaque ligne. + + + + (expr,N) This built-in window function calculates the window frame for each row in the same way as an aggregate window function. It returns the value of expr evaluated against the row N of the window frame. Rows are numbered within the window frame starting from 1 in the order defined by the ORDER BY clause if one is present, or in arbitrary order otherwise. If there is no Nth row in the partition, then NULL is returned. + (expr,N) Cette fonction de fenêtrage intégrée calcule le cadre de la fenêtre pour chaque rangée de la même manière qu'une fonction de fenêtrage agrégée. Elle retourne la valeur de expr évaluée par rapport à la ligne N du cadre de la fenêtre. Les rangées sont numérotées à l'intérieur du cadre de la fenêtre à partir de 1 dans l'ordre défini par la clause ORDER BY si elle est présente, ou dans un ordre arbitraire sinon. S'il n'y a pas de Nième ligne dans la partition, alors NULL est retourné. + SqliteTableModel - References %1(%2) Hold Ctrl+Shift and click to jump there - Références %1(%2) + Références %1(%2) Appuyez simultanément sur Ctrl+Maj et cliquez pour arriver ici - + + reading rows + Lecture des enregistrements + + + + loading... + chargement... + + + + References %1(%2) +Hold %3Shift and click to jump there + Références %1(%2) +Appuyez simultanément sur %3+Maj et cliquez pour arriver ici + + + Error changing data: %1 - Érreur lors du changement des données : + Erreur lors du changement des données : %1 + + + retrieving list of columns + récupération de la liste des colonnes + + + + Fetching data... + Récupération des données... + + + + Cancel + Annuler + VacuumDialog @@ -4451,13 +6488,21 @@ - Warning: Compacting the database will commit all changes you made. + Warning: Compacting the database will commit all of your changes. Attention : compacter la base de donnée entraînera l'enregistrement de tous les changements effectués. + Please select the databases to co&mpact: + Veuillez saisir le nom de la Base de Données à co&mpacter : + + + Warning: Compacting the database will commit all changes you made. + Attention : compacter la base de donnée entraînera l'enregistrement de tous les changements effectués. + + Please select the objects to compact: - Veuillez sélectionner les objets à compacter : + Veuillez sélectionner les objets à compacter : diff -Nru sqlitebrowser-3.10.100ubuntu1/src/translations/sqlb_it.ts sqlitebrowser-3.11.1/src/translations/sqlb_it.ts --- sqlitebrowser-3.10.100ubuntu1/src/translations/sqlb_it.ts 1970-01-01 00:00:00.000000000 +0000 +++ sqlitebrowser-3.11.1/src/translations/sqlb_it.ts 2019-02-19 23:51:34.000000000 +0000 @@ -0,0 +1,5739 @@ + + + + + AboutDialog + + + About DB Browser for SQLite + Informazioni su DB Browser for SQLite + + + + Version + Versione + + + + <html><head/><body><p>DB Browser for SQLite is an open source, freeware visual tool used to create, design and edit SQLite database files.</p><p>It is bi-licensed under the Mozilla Public License Version 2, as well as the GNU General Public License Version 3 or later. You can modify or redistribute it under the conditions of these licenses.</p><p>See <a href="http://www.gnu.org/licenses/gpl.html">http://www.gnu.org/licenses/gpl.html</a> and <a href="https://www.mozilla.org/MPL/2.0/index.txt">https://www.mozilla.org/MPL/2.0/index.txt</a> for details.</p><p>For more information on this program please visit our website at: <a href="http://sqlitebrowser.org">http://sqlitebrowser.org</a></p><p><span style=" font-size:small;">This software uses the GPL/LGPL Qt Toolkit from </span><a href="http://qt-project.org/"><span style=" font-size:small;">http://qt-project.org/</span></a><span style=" font-size:small;"><br/>See </span><a href="http://qt-project.org/doc/qt-5/licensing.html"><span style=" font-size:small;">http://qt-project.org/doc/qt-5/licensing.html</span></a><span style=" font-size:small;"> for licensing terms and information.</span></p><p><span style=" font-size:small;">It also uses the Silk icon set by Mark James licensed under a Creative Commons Attribution 2.5 and 3.0 license.<br/>See </span><a href="http://www.famfamfam.com/lab/icons/silk/"><span style=" font-size:small;">http://www.famfamfam.com/lab/icons/silk/</span></a><span style=" font-size:small;"> for details.</span></p></body></html> + <html><head/><body><p>DB-Browser for SQLite è uno strumento grafico opensource e freeware usato per creare, struttutturare e modificare file database di SQLite</p><p>È rilasciato sotto la licenza Mozilla Public License Version 2, così come sotto la licenza GNU General Public License Version 3 o successive. È possibile modificarlo e redistribuirlo sotto le condizioni specificate da queste licenze.</p><p>Si veda <a href="http://www.gnu.org/licenses/gpl.html">http://www.gnu.org/licenses/gpl.html</a> e <a href="https://www.mozilla.org/MPL/2.0/index.txt">https://www.mozilla.org/MPL/2.0/index.txt</a> per ulteriori dettagli.</p><p>Per ulteriori dettagli riguardo questo programma visitate il nostro sito web a: <a href="http://sqlitebrowser.org">http://sqlitebrowser.org</a></p><p><span style=" font-size:small;">Questo software usa GPL/LGPL QT Toolkit da </span><a href="http://qt-project.org/"><span style=" font-size:small;">http://qt-project.org/</span></a><span style=" font-size:small;"><br/>Si veda </span><a href="http://qt-project.org/doc/qt-5/licensing.html"><span style=" font-size:small;">http://qt-project.org/doc/qt-5/licensing.html</span></a><span style=" font-size:small;"> per termini di licenza e informazioni.</span></p><p><span style=" font-size:small;">Utilizza inoltre Silk-Iconset di Mark James, rilasciato sotto licenza Creative Commons Attribution 2.5 e 3.0.<br/>Si veda </span><a href="http://www.famfamfam.com/lab/icons/silk/"><span style=" font-size:small;">http://www.famfamfam.com/lab/icons/silk/</span></a><span style=" font-size:small;"> per ulteriori dettagli.</span></p></body></html> + + + + SQLite Version + Versione SQLite + + + + SQLCipher Version + Versione SQLCipher + + + + (based on SQLite %1) + (basato su SQLite %1) + + + + Version + Versione + + + + Built for + Compilato per + + + + Qt Version + Versione Qt + + + + AddRecordDialog + + + Add New Record + Aggiungi un nuovo record + + + + Enter values for the new record considering constraints. Fields in bold are mandatory. + Inserisci i valori per il nuovo record considerando i vincoli. I campi in grassetto sono obbligatori. + + + + In the Value column you can specify the value for the field identified in the Name column. The Type column indicates the type of the field. Default values are displayed in the same style as NULL values. + Nella colonna Valore puoi specificare il valore per il campo identificato dalla colonna Nome. La colonna Tipo indica il tipo del campo. I valori di default sono mostrati nello stesso stile come valori NULL. + + + + Name + Nome + + + + Type + Tipo + + + + Value + Valore + + + + Values to insert. Pre-filled default values are inserted automatically unless they are changed. + Valori da inserire. Sono preinseriti dei valori di default automaticamente a meno che essi non vengano cambiati. + + + + When you edit the values in the upper frame, the SQL query for inserting this new record is shown here. You can edit manually the query before saving. + Quando modifichi i valori nel riquadro superiore, la query SQL per inserire questo nuovo record è mostrata qui. Puoi modificare manualmente la query prima di salvare. + + + + <html><head/><body><p><span style=" font-weight:600;">Save</span> will submit the shown SQL statement to the database for inserting the new record.</p><p><span style=" font-weight:600;">Restore Defaults</span> will restore the initial values in the <span style=" font-weight:600;">Value</span> column.</p><p><span style=" font-weight:600;">Cancel</span> will close this dialog without executing the query.</p></body></html> + <html><head/><body><p><span style=" font-weight:600;">Salva</span> invia la richiesta SQL mostrata al database per inserire un nuovo record.</p><p><span style=" font-weight:600;">Ripristina Defaults</span> ripristinerà i valori iniziali della colonna <span style=" font-weight:600;">Valore</span>.</p><p><span style=" font-weight:600;">Annulla</span> chiuderà questa finestra di dialogo senza eseguire la query.</p></body></html> + + + + Auto-increment + + Auto-incrementale + + + + + Unique constraint + + Restrizione univoco + + + + + Check constraint: %1 + + Controlla restrizioni: %1 + + + + + Foreign key: %1 + + Chiave esterna: %1 + + + + + Default value: %1 + + Valore di default: %1 + + + + + Error adding record. Message from database engine: + +%1 + Errore nell'aggiungere il record. Messaggio dal database engine: + +%1 + + + + Are you sure you want to restore all the entered values to their defaults? + Sei sicuro di voler ripristinare tutti i valori inseriti ai loro valori di default? + + + + Application + + + Usage: %1 [options] [db] + + Utilizzo: %1 [opzioni] [db] + + + + + Possible command line arguments: + Possibili argomenti da linea di comando: + + + + -h, --help Show command line options + -h, --help Mostra opzioni della linea di comando + + + + -q, --quit Exit application after running scripts + -q, --quit Esci dall'applicazione dopo aver eseguito gli script + + + + -s, --sql [file] Execute this SQL file after opening the DB + -s, --sql [file] Esegui questo file SQL dopo aver aperto il DB + + + + -t, --table [table] Browse this table after opening the DB + -t, --table [table] Esplora questa tabella dopo aver aperto il DB + + + + -R, --read-only Open database in read-only mode + -R, --read-only Apri il database in modalità sola lettura + + + + -o, --option [group/setting=value] Run application with this setting temporarily set to value + -o, --option [group/setting=valore] Esegue l'applicazione con queste impostazioni temporaneamente modificate al valore + + + + -v, --version Display the current version + -v, --version Mostra la versione corrente + + + + [file] Open this SQLite database + [file] Apri questo database SQLite + + + + This is DB Browser for SQLite version %1. + Questo è DB Browser for SQLite versione %1. + + + + The -s/--sql option requires an argument + L'opzione -s/--sql richiede un argomento + + + + The file %1 does not exist + Il file %1 non esiste + + + + The -t/--table option requires an argument + L'opzione -t/--table richiede un argomento + + + + The -o/--option option requires an argument in the form group/setting=value + L'opzione -o/--option richiede un argomento nella forma group/setting=valore + + + + Invalid option/non-existant file: %1 + Opzione non valida/file inesistente: %1 + + + + CipherDialog + + + SQLCipher encryption + Criptatura SQLCipher + + + + &Password + &Password + + + + &Reenter password + &Reinserire password + + + + Encr&yption settings + I&mpostazioni cifratura + + + + SQLCipher &3 defaults + Predefiniti SQLCipher &3 + + + + SQLCipher &4 defaults + Predefiniti SQLCipher &4 + + + + Custo&m + Personalizzat&i + + + + Page si&ze + Di&mensioni pagina + + + + &KDF iterations + Integrazione &KDF + + + + HMAC algorithm + Algoritmo HMAC + + + + KDF algorithm + Algoritmo KDF + + + + Passphrase + Chiave testuale + + + + Raw key + Chiave grezza + + + + Please set a key to encrypt the database. +Note that if you change any of the other, optional, settings you'll need to re-enter them as well every time you open the database file. +Leave the password fields empty to disable the encryption. +The encryption process might take some time and you should have a backup copy of your database! Unsaved changes are applied before modifying the encryption. + Perfavore inserisci una chiave per criptare il database. +Nota che se cambi una qualsiasi delle altre impostazioni opzionali, dovrai reinserirle ogni volta che apri il file del database. +Lascia i campi password vuoti per disabilitare la crittografia. +Il processo di crittazione può richiedere del tempo e dovresti avere una copia di backup del database! Modifiche non salvate sono applicate prima di modificare la crittografia. + + + + Please enter the key used to encrypt the database. +If any of the other settings were altered for this database file you need to provide this information as well. + Si prega d'inserire la chiave utilizzata per criptare il database. +Se una qualunque altra impostazione è stata modificata per l'inserimento della criptazione si prega d'impostarla in modo adeguato. + + + + ColumnDisplayFormatDialog + + + Choose display format + Seleziona il formato di visualizzazione + + + + Display format + Formato di visualizzazione + + + + Choose a display format for the column '%1' which is applied to each value prior to showing it. + Seleziona un formato di visualizzazione per la colonna '%1' che è applicato a ciascun valore prima di mostrarlo. + + + + Default + Default + + + + Decimal number + Numero decimale + + + + Exponent notation + Notazione esponenziale + + + + Hex blob + Blob esadecimale + + + + Hex number + Numero esadecimale + + + + Octal number + Numero ottale + + + + Round number + Numero arrotondato + + + + Apple NSDate to date + Apple NSDate ad oggi + + + + Java epoch (milliseconds) to date + Java epoch (millisecondi) ad oggi + + + + Julian day to date + Giorno giuliano ad oggi + + + + Unix epoch to date + Unix epoch ad oggi + + + + Unix epoch to local time + Unix epoch a ora locale + + + + Windows DATE to date + Windows DATE ad oggi + + + + Date as dd/mm/yyyy + Data come gg/mm/aaaa + + + + Lower case + Minuscolo + + + + Upper case + Maiuscolo + + + + Custom + Personalizzato + + + + DBBrowserDB + + + This database has already been attached. Its schema name is '%1'. + Questo database è già stato collegato. Il nome del suo schema è '%1'. + + + + Please specify the database name under which you want to access the attached database + Si prega di specificare il nome del database con cui si vuol accedere al database collegato + + + + Invalid file format + Formato file non valido + + + + Do you really want to close this temporary database? All data will be lost. + Vuoi davvero chiudere questo database temporaneo? Tutti i dati andranno persi. + + + + Do you want to save the changes made to the database file %1? + Vuoi salvare le modifiche effettuate al database %1? + + + + Database didn't close correctly, probably still busy + Il database non è stato chiuso correttamente; probabilmente è ancora occupato + + + + The database is currently busy: + Il database è attualmente in uso: + + + + Do you want to abort that other operation? + Vuoi annullare l'altra operazione? + + + + Exporting database to SQL file... + Esportando il database in file SQL... + + + + + Cancel + Annulla + + + + + No database file opened + Nessun database aperto + + + + Executing SQL... + Eseguendo SQL... + + + + Action cancelled. + Azione annullata. + + + + + Error in statement #%1: %2. +Aborting execution%3. + Errore nello statement #%1: %2. +Annullo l'esecuzione %3. + + + + + and rolling back + e ripristino il db + + + + didn't receive any output from %1 + non ho ricevuto alcun ouput da %1 + + + + could not execute command: %1 + impossibile eseguire il comando: %1 + + + + Cannot delete this object + Non posso cancellare questo oggetto + + + + Cannot set data on this object + Non posso impostare i dati in questo oggetto + + + + + A table with the name '%1' already exists in schema '%2'. + Una tabella con il nome '%1' esiste già nello schema '%2'. + + + + No table with name '%1' exists in schema '%2'. + Nessuna tabella col nome '%1' esiste nello schema '%2'. + + + + + Cannot find column %1. + Impossibile trovare la colonna %1. + + + + Creating savepoint failed. DB says: %1 + Creazione del punto di salvataggio fallita. DB log: %1 + + + + Renaming the column failed. DB says: +%1 + Fallimento dell'operazione di rinomina. DB log: %1 + + + + + Releasing savepoint failed. DB says: %1 + Rilascio del salvataggio falitto. DB log: %1 + + + + Creating new table failed. DB says: %1 + Creazione della nuova tabella fallita. DB log: %1 + + + + Copying data to new table failed. DB says: +%1 + Copia dei dati nella nuova tabella fallita. DB log: %1 + + + + Deleting old table failed. DB says: %1 + Eliminazione della vecchia tabella fallita. DB log: %1 + + + renameColumn: cannot find column %1. + renameColumn: Impossibile trovare la colonna %1. + + + renameColumn: creating savepoint failed. DB says: %1 + renameColumn: creazione salvataggio fallita. Messaggio DB : %1 + + + renameColumn: renaming the column failed. DB says: +%1 + renameColumn: rinomino colonna fallito. Messaggio DB: +%1 + + + renameColumn: releasing savepoint failed. DB says: %1 + renameColumn: rilascio punto di salvataggio fallito. Messaggio DB: %1 + + + renameColumn: creating new table failed. DB says: %1 + renameColumn: creazione nuova tabella fallita. Messaggio DB: %1 + + + renameColumn: copying data to new table failed. DB says: +%1 + renameColumn: copia dei dati a nuova tabella fallito. Messaggio DB: +%1 + + + renameColumn: deleting old table failed. DB says: %1 + renameColumn: eliminazione vecchia tabella falita. Messaggio DB: %1 + + + + Restoring some of the objects associated with this table failed. This is most likely because some column names changed. Here's the SQL statement which you might want to fix and execute manually: + + + Ripristino di alcuni oggetti associati a questa tabella fallito. Questo è probabilmente dovuto al fatto che i nomi di alcune colonne sono cambiati . Qui c'è la richiesta SQL che potresti voler sistemare ed eseguire manualmente: + + + + + + Error renaming table '%1' to '%2'.Message from database engine: +%3 + Errore nel rinominare la tabella '%1' in '%2'.Messaggio dal database engine: +%3 + + + + ... <string can not be logged, contains binary data> ... + ... <la stringa non può essere loggata, contiene dati binari> ... + + + + could not get list of db objects: %1, %2 + non è possibile ricavare la lista degli oggetti db: %1, %2 + + + + could not get list of databases: %1 + non è possibile ricavare la lista dei database: %1 + + + didn't receive any output from pragma %1 + non ho ricevuto nessun output da pragma %1 + + + could not execute pragma command: %1, %2 + non è possibile eseguire il comando pragma: %1, %2 + + + + Error setting pragma %1 to %2: %3 + Errore nell'impostare pragma %1 in %2: %3 + + + + File not found. + File non trovato. + + + + Error loading extension: %1 + Errore nel caricamento dell'estensione: %1 + + + + could not get column information + non è possibile ricavare informazioni sulla colonna + + + + DbStructureModel + + + Name + Nome + + + + Object + Oggetto + + + + Type + Tipo + + + + Schema + Schema + + + + Database + Database + + + + Browsables + Navigabili + + + + All + Tutti + + + + Temporary + Temporaneo + + + + Tables (%1) + Tabelle (%1) + + + + Indices (%1) + Indici (%1) + + + + Views (%1) + Viste (%1) + + + + Triggers (%1) + Triggers (%1) + + + + EditDialog + + + Edit database cell + Modifica la cella del database + + + + Mode: + Modalità: + + + + This is the list of supported modes for the cell editor. Choose a mode for viewing or editing the data of the current cell. + Questa è la lista delle modalità supportate dall'editor della cella. Scegli una modalità per vedere o modificare i dati della cella corrente. + + + + Text + Testo + + + + Binary + Binario + + + + Image + Immagine + + + + JSON + JSON + + + + XML + XML + + + + + Automatically adjust the editor mode to the loaded data type + Seleziona automaticamente la modalità dell'editor in base al tipo di dato caricato + + + + This checkable button enables or disables the automatic switching of the editor mode. When a new cell is selected or new data is imported and the automatic switching is enabled, the mode adjusts to the detected data type. You can then change the editor mode manually. If you want to keep this manually switched mode while moving through the cells, switch the button off. + Questo bottone spuntabile permette di abilitare o disabilitare l'adattamento automatico della modalità dell'editor. Quando una nuova cella è selezionata o sono importati nuovi dati e la modalità di adattamento automaitco è abilitata, la modalità si aggiusta al tipo di dato rilevato. Puoi cambiare in seguito la modalità dell'editor in modo manuale. Se vuoi mantenere la modalità selezionata manualmente mentre ti muovi tre le celle, togli la spunta a questo bottone. + + + + Auto-switch + Auto-switch + + + + + Auto-format: pretty print on loading, compact on saving. + Auto-formato: migliore stampa al caricamento, compatta in salvataggio. + + + + When enabled, the auto-format feature formats the data on loading, breaking the text in lines and indenting it for maximum readability. On data saving, the auto-format feature compacts the data removing end of lines, and unnecessary whitespace. + Quando abilitato, la feature dell'auto-formato formatta i dati al caricamento, rompe il testo in righe e lo indenta per una maggiore leggibilità. Al salvataggio dei dati, la feature dell'auto-formato compatta i dati rimuovendo i fine riga, e spazi bianchi non necessari. + + + + Autoformat + Autoformato + + + + Import from file + Importa da file + + + + Opens a file dialog used to import any kind of data to this database cell. + Apri una finestra di dialogo per importare qualsiasi tipo di dato in questa cella del database. + + + + &Import + &Importa + + + + Export to file + Esporta in un file + + + + Opens a file dialog used to export the contents of this database cell to a file. + Apri una finestra di dialogo utilizzata per esportare i contenuti di questa cella del database in un file. + + + + &Export + &Esporta + + + + Apply data to cell + Applica i dati alla cella + + + + Set this cell to NULL + Imposta questa cella a NULL + + + + Erases the contents of the cell + Cancella i contenuti di questa cella + + + + Set as &NULL + Imposta come &NULL + + + + This area displays information about the data present in this database cell + Quest'area mostra informazioni riguardo i dati presenti in questa cella del database + + + + This editor mode lets you edit JSON or XML data with syntax highlighting, automatic formatting and validation before saving. + +Errors are indicated with a red squiggle underline. + Questa modalità editor permette di modificare dati JSON o XML con evidenziazione della sintassi, formattazione e validazione autmoatica prima del salvataggio. + +Gli errori sono indicati con una sottolineatura rossa ondulata. + + + + Type of data currently in cell + Tipo di dato attualmente nella cella + + + + Size of data currently in table + Dimensione dei dati attualmente in tabella + + + Apply data to cell [Ctrl+Return] + Applica i dati alla cella [Ctrl+Invio] + + + + This button saves the changes performed in the cell editor to the database cell. + Questo bottone salva le modifiche fatte alla cella dell'editor alla cella del database. + + + + Apply + Applica + + + + + Print... + Stampa... + + + + Open preview dialog for printing displayed image + Apri la finestra di anteprima per stampare l'immagine mostrata + + + + + Ctrl+P + Ctrl+P + + + + Open preview dialog for printing displayed text + Apri la finestra di anteprima per stampare il testo mostrato + + + + Copy Hex and ASCII + Copia HEX e ASCII + + + + Copy selected hexadecimal and ASCII columns to the clipboard + Copia le colonne esadecimali e ASCII selezionate negli appunti + + + + Ctrl+Shift+C + Ctrl+Shift+C + + + + + Image data can't be viewed in this mode. + I dati immagine non possono essere visualizzati in questa modalità. + + + + + Try switching to Image or Binary mode. + Prova a passare alla modalità Immagine o Binario. + + + + + Binary data can't be viewed in this mode. + I dati binari non possono essere visualizzati in questa modalità. + + + + + Try switching to Binary mode. + Prova a passare alla modalità Binario. + + + + + + + Text files (*.txt) + File di testo (*.txt) + + + + + + JSON files (*.json) + File JSON (*.json) + + + + + + + XML files (*.xml) + File XML (*.xml) + + + + + Image files (%1) + File immagine (%1) + + + + + + Binary files (*.bin) + File binario (*.bin) + + + + + All files (*) + Tutti i files (*) + + + + Choose a file to import + Scegli un file da importare + + + + %1 Image + %1 Immagine + + + + SVG files (*.svg) + File SVG (*.svg) + + + + + Hex dump files (*.txt) + File esadecimale di dump (*.txt) + + + + Choose a filename to export data + Scegli un nome del file per esportare i dati + + + + Invalid data for this mode + Dati non validi per questa modalità + + + + The cell contains invalid %1 data. Reason: %2. Do you really want to apply it to the cell? + La cella continete dati %1 non validi. Ragione: %2. Sei davvero sicuro di applicare quello alla cella? + + + + + Type of data currently in cell: Text / Numeric + Tipo di dato attualmente nella cella: Testo / Numerico + + + + + + %n char(s) + + %n carattere + %n caratteri + + + + + Type of data currently in cell: %1 Image + Tipo di dato attualmente nella cella: %1 Immagine + + + + %1x%2 pixel(s) + %1x%2 pixel(s) + + + + Type of data currently in cell: NULL + Tipo di dato attualmente nella cella: NULL + + + + + %n byte(s) + + %n byte + %n bytes + + + + + Type of data currently in cell: Valid JSON + Tipo di dato attualmente nella cella: Valid JSON + + + + Type of data currently in cell: Binary + Tipo di dato attualmente nella cella: Binario + + + + EditIndexDialog + + + Edit Index Schema + Modifica Indice Schema + + + + &Name + &Nome + + + + &Table + &Tabella + + + + &Unique + &Univoco + + + + For restricting the index to only a part of the table you can specify a WHERE clause here that selects the part of the table that should be indexed + Per restringere l'indice a solo una parte della tabella puoi specificare una clausula WHERE qui che selezioni la parte della tabella che dovrà essere indicizzata + + + + Partial inde&x clause + Clausola di &indice parziale + + + + Colu&mns + &Colonne + + + + Table column + Colonna della tabella + + + + Type + Tipo + + + + Add a new expression column to the index. Expression columns contain SQL expression rather than column names. + Aggiungi una nuova espressione colonna all'indice. Le espressioni colonna contengono espressioni SQL piuttosto che i nomi delle colonne. + + + + Index column + Indice di colonna + + + + Order + Ordine + + + + Deleting the old index failed: +%1 + Cancellazione del vecchio indice fallita: +%1 + + + + Creating the index failed: +%1 + Creazione del vecchio indice fallita: +%1 + + + + EditTableDialog + + + Edit table definition + Modifica la definizione della tabella + + + + Table + Tabella + + + + Advanced + Avanzate + + + + Database schema + Schema database + + + + Without Rowid + Senza id riga + + + + Make this a 'WITHOUT rowid' table. Setting this flag requires a field of type INTEGER with the primary key flag set and the auto increment flag unset. + Fai una tabella 'WITHOUT rowid'. Impostare questa spunta richiede un campo di tipo INTEGER con la chiave primaria impostata e l'auto incremento non impostato. + + + + Fields + Campi + + + + Add field + Aggiungi campo + + + + Remove field + Rimuovi campo + + + + Move field up + Muovi campo in sù + + + + Move field down + Muovi campo in giù + + + + Name + Nome + + + + Type + Tipo + + + + NN + NN + + + + Not null + Non null + + + + PK + CP + + + + Primary key + Chiave Primaria + + + + AI + AI + + + + Autoincrement + Autoincremento + + + + U + U + + + + Unique + Univoco + + + + Default + Default + + + + Default value + Valore di default + + + + Check + Controlla + + + + Check constraint + Controlla le restrizioni + + + + Foreign Key + Chiave esterna + + + + <html><head/><body><p><span style=" font-weight:600; color:#ff0000;">Warning: </span>There is something with this table definition that our parser doesn't fully understand. Modifying and saving this table might result in problems.</p></body></html> + <html><head/><body><p><span style=" font-weight:600; color:#ff0000;">Attenzione: </span>C'è qualcosa in questa definizione di tabella che il nostro parser non comprende. Modificare e salvare questa tabella potrebbe creare dei problemi.</p></body></html> + + + + Error creating table. Message from database engine: +%1 + Error nella creazione della tabella. Messaggio dal database engine: +%1 + + + + There already is a field with that name. Please rename it first or choose a different name for this field. + Esiste già un campo con quel nome. Si prega di rinominarlo prima o scegliere un nome differente per questo campo. + + + + This column is referenced in a foreign key in table %1 and thus its name cannot be changed. + Questa colonna è referenziata in una chiave esterna nella tabella %1 e quindi il nome non può essere modificato. + + + + There is at least one row with this field set to NULL. This makes it impossible to set this flag. Please change the table data first. + Esiste almeno una riga con questo campo impostato a NULL. Questo rende impossibile impostare questa opzione. Si prega prima di modificare quel dato. + + + + There is at least one row with a non-integer value in this field. This makes it impossible to set the AI flag. Please change the table data first. + Esiste almeno un riga con un valore non intero in questo campo. Questo rende impossibile impostare l'AI. Si prega prima di cambiare il dato. + + + + Column '%1' has duplicate data. + + La colonna '%1' ha dei dati duplicati. + + + + + This makes it impossible to enable the 'Unique' flag. Please remove the duplicate data, which will allow the 'Unique' flag to then be enabled. + Questo rende impossibile abilitare l'opzionie 'Univoco'. Perfavore rimuovi i dati duplicati, il che permetterà l'abilitazione dell'opzione 'Univoco'. + + + Column '%1' has no unique data. + + La colonna '%1' non ha dati univoci. + + + + This makes it impossible to set this flag. Please change the table data first. + Questo rende impossibile impostare questa opzione. Si prega prima di modificare il dato. + + + Modifying this column failed. Error returned from database: +%1 + La modifica di questa colonna è fallita. Errore restituito dal database: +%1 + + + + Are you sure you want to delete the field '%1'? +All data currently stored in this field will be lost. + Sei sicuro di voler eliminare il campo '%1'? +Tutti i dati che sono attualmente memorizzati in questo campo andranno persi. + + + + Please add a field which meets the following criteria before setting the without rowid flag: + - Primary key flag set + - Auto increment disabled + Perfavore agginugi un campo che rispetti i seguenti criteri prima di impostare l'opzione senza id di riga: + - Opzione Chiave Primaria impostata + - Autoincremento disabilitato + + + Setting the rowid column for the table failed. Error message: +%1 + Impostazione della colonna rowid per la tabella fallita. Messaggo di errore: +%1 + + + Changing the table schema failed. Error message: +%1 + Cambio dello schema della tabella fallito. Messaggio di errore: +%1 + + + + ExportDataDialog + + + Export data as CSV + Esporta i dati come CSV + + + + Tab&le(s) + Tabe&lla(e) + + + + Colu&mn names in first line + Nomi delle &Colonne sulla prima riga + + + + Fie&ld separator + Separatore di ca&mpo + + + + , + , + + + + ; + ; + + + + Tab + Tab + + + + | + | + + + + + + Other + Altro + + + + &Quote character + &Carattere citazione + + + + " + " + + + + ' + ' + + + + New line characters + Carattere di nuova riga + + + + Windows: CR+LF (\r\n) + Windows: CR+LF (\r\n) + + + + Unix: LF (\n) + Unix: LF (\n) + + + + Pretty print + Visualizzazione piacevole + + + + Export data as JSON + Esporta i dati come JSON + + + + exporting CSV + esportando in CSV + + + + + Could not open output file: %1 + Impossibile aprire il file di output: %1 + + + + exporting JSON + esportando in JSON + + + + Text files(*.csv *.txt) + File di testo(*.csv *.txt) + + + + Text files(*.json *.js *.txt) + File di testo(*.json *.js *.txt) + + + + + Choose a filename to export data + Scegliere un nome file per esportare i dati + + + + Please select at least 1 table. + Perfavore seleziona almeno una tabella. + + + + Choose a directory + Scegliere una cartella + + + + Export completed. + Esportazione completata. + + + + ExportSqlDialog + + + Export SQL... + Esporta SQL... + + + + Tab&le(s) + Tabe&lla(e) + + + + Select All + Seleziona tutto + + + + Deselect All + Deseleziona tutto + + + + &Options + &Opzioni + + + + Keep column names in INSERT INTO + Tieni i nomi delle colonne in INSERT INTO + + + + Multiple rows (VALUES) per INSERT statement + Righe multiple (VALUES) per lo statement INSERT + + + + Export everything + Esporta tutto + + + + Export schema only + Esporta solo lo schema + + + + Export data only + Esporta solo i dati + + + + Keep old schema (CREATE TABLE IF NOT EXISTS) + Mantieni lo schema esistente (CREATE TABLE IF NOT EXISTS) + + + + Overwrite old schema (DROP TABLE, then CREATE TABLE) + Sovrascrivi schema precedente (DROP TABLE, poi CREATE TABLE) + + + + Please select at least one table. + Perfavore seleziona almeno una tabella. + + + + Choose a filename to export + Scegli un nome del file per esportare + + + + Text files(*.sql *.txt) + File di testo(*.sql *.txt) + + + + Export completed. + Esportazione completata. + + + + Export cancelled or failed. + Esportazione annullata o fallita. + + + + ExtendedScintilla + + + + Ctrl+H + Ctrl+H + + + + + Ctrl+P + Ctrl+P + + + + Find and Replace... + Trova e Sostituisci... + + + + Print... + Stampa... + + + + ExtendedTableWidget + + + Use as Exact Filter + Usa come filtro esatto + + + + Containing + Che contiene + + + + Not containing + Non contenuto + + + + Not equal to + Non uguale a + + + + Greater than + Maggiore di + + + + Less than + Minore di + + + + Greater or equal + Maggiore o uguale + + + + Less or equal + Minore o uguale + + + + Between this and... + Tra questo e... + + + + Regular expression + Espressione regolare + + + + Set to NULL + Imposta a NULL + + + + Copy + Copia + + + + Copy with Headers + Copia con gli Headers + + + + Copy as SQL + Copia come SQL + + + + Paste + Incolla + + + + Print... + Stampa... + + + + Use in Filter Expression + Usa nell'espressione del filtro + + + + Alt+Del + Alt+Canc + + + + Ctrl+Shift+C + Ctrl+Shift+C + + + + Ctrl+Alt+C + Ctrl+Alt+C + + + + The content of the clipboard is bigger than the range selected. +Do you want to insert it anyway? + Il contenuto degli appunti è più grande del range selezionato. +Vuoi inserirlo comunque? + + + + <p>Not all data has been loaded. <b>Do you want to load all data before selecting all the rows?</b><p><p>Answering <b>No</b> means that no more data will be loaded and the selection will not be performed.<br/>Answering <b>Yes</b> might take some time while the data is loaded but the selection will be complete.</p>Warning: Loading all the data might require a great amount of memory for big tables. + <p>Non tutti i dati sono stati caricati. <b>Vuoi caricare tutti i dati prima di selezionare tutte le righe?</b><p><p>Rispondere <b>No</b> significa che non verranno caricati i restanti dati e la selezione non verrà effettuata.<br/>Rispondere <b>Si</b> potrebbe richiedere del tempo per caricare i dati, ma la selezione sarà completa.</p>Attenzione: Caricare tutti i dati potrebbe richiedere un grosso quantitativo di memoria in caso di grandi tabelle. + + + + FileExtensionManager + + + File Extension Manager + Gestore delle estensioni dei files + + + + &Up + Porta &su + + + + &Down + Porta &giù + + + + &Add + &Aggiungi + + + + &Remove + &Rimuovi + + + + + Description + Descrizione + + + + Extensions + Estensioni + + + + *.extension + *.estensione + + + + FilterLineEdit + + + Filter + Filtro + + + + These input fields allow you to perform quick filters in the currently selected table. +By default, the rows containing the input text are filtered out. +The following operators are also supported: +% Wildcard +> Greater than +< Less than +>= Equal to or greater +<= Equal to or less += Equal to: exact match +<> Unequal: exact inverse match +x~y Range: values between x and y +/regexp/ Values matching the regular expression + Questi campi di input permettono di effettuare filtri rapidi nella tabella correntemente selezionata. +er impostazione predefinita, le righe che contengono il testo immesso sono escluse. +Sono inoltre supportati i seguenti operatori: +% Wildcard +> Maggiore di +< Minore di +>= Maggiore o uguale +<= Minore o uguale += Uguale a: corrispondenza esatta +<> Diverso: corrispondenza esatta invertita +x~y Intervallo: valori tra x e y +/regexp/ Valori che corrispondono all'espressione regolare + + + + Use for Conditional Format + Usa per formattazioni condizionali + + + + Clear All Conditional Formats + Elimina tutte le formattazioni condizionali + + + + Set Filter Expression + Imposta l'espressione del filtro + + + + What's This? + Cos'è questo? + + + + Is NULL + È NULL + + + + Is not NULL + Non è NULL + + + + Is empty + È vuoto + + + + Is not empty + Non è vuoto + + + + Not containing... + Non contenente... + + + + Equal to... + Uguale a... + + + + Not equal to... + Non uguale a... + + + + Greater than... + Maggiore di... + + + + Less than... + Minore di... + + + + Greater or equal... + Maggiore o uguale... + + + + Less or equal... + Minore o uguale... + + + + In range... + Nell'intervallo... + + + + Regular expression... + Espressione regolare... + + + + FindReplaceDialog + + + Find and Replace + Trova e sostituisci + + + + Fi&nd text: + Tr&ova testo: + + + + Re&place with: + So&stituisci con: + + + + Match &exact case + Corrispondenza &esatta + + + + Match &only whole words + Trova solo &parole complete + + + + When enabled, the search continues from the other end when it reaches one end of the page + Quando abilitato, la ricerca contninua dall'altro capo del documento quando si raggiunge una fine del documento + + + + &Wrap around + Senza &limiti + + + + When set, the search goes backwards from cursor position, otherwise it goes forward + Quando abilitato, la ricerca va all'indietro dalla corrente posizione del cursore, altrimenti va in avanti + + + + Search &backwards + Cerca &indietro + + + + <html><head/><body><p>When checked, the pattern to find is searched only in the current selection.</p></body></html> + <html><head/><body><p>Quando abilitato, la ricerca viene effettuata solo all'interno della selezione corrente.</p></body></html> + + + + &Selection only + &Solo selezionati + + + + <html><head/><body><p>When checked, the pattern to find is interpreted as a UNIX regular expression. See <a href="https://en.wikibooks.org/wiki/Regular_Expressions">Regular Expression in Wikibooks</a>.</p></body></html> + <html><head/><body><p>Quando selezionato, la stringa del testo viene interpretata come una espressione regolare Unix. Vedi <a href="https://en.wikibooks.org/wiki/Regular_Expressions">Espressioni regolari su Wikibooks (in inglese)</a>.</p></body></html> + + + + Use regular e&xpressions + Usa &espressioni regolari + + + + Find the next occurrence from the cursor position and in the direction set by "Search backwards" + Trova la prossima occorrenza dalla corrente posizione del cursore nella direzione impostata da "Cerca indietro" + + + + &Find Next + &Trova successivo + + + + &Replace + &Sostituisci + + + + Highlight all the occurrences of the text in the page + Evidenzia tutte le occorrenze del testo nella pagina + + + + F&ind All + T&rova tutti + + + + Replace all the occurrences of the text in the page + Sostituisce tutte le occorrenze del testo nella pagina + + + + Replace &All + Sostituisci &Tutti + + + + The searched text was not found + Il testo cercato non è stato trovato + + + + The searched text was not found. + Il testo cercato non è stato trovato. + + + + The searched text was found one time. + Il testo cercato è stato trovato una volta. + + + + The searched text was found %1 times. + Il testo cercato è stato trovato %1 volte. + + + + The searched text was replaced one time. + Il testo cercato è stato sostituito una volta. + + + + The searched text was replaced %1 times. + Il testo cercato è stato sostituito %1 volte. + + + + ForeignKeyEditor + + + &Reset + &Reimposta + + + + Foreign key clauses (ON UPDATE, ON DELETE etc.) + Clausule per chiave esterna (ON UPDATE, ON DELETE etc.) + + + + ImportCsvDialog + + + Import CSV file + Imoprta file CSV + + + + Table na&me + No&me tabella + + + + &Column names in first line + Nomi &colonna nella prima riga + + + + Field &separator + &Separatore di campo + + + + , + , + + + + ; + ; + + + + + Tab + Tab + + + + | + | + + + + + + Other + Altro + + + + &Quote character + &Carattere citazione + + + + " + " + + + + ' + ' + + + + &Encoding + Codific&a + + + + UTF-8 + UTF-8 + + + + UTF-16 + UTF-16 + + + + ISO-8859-1 + ISO-8859-1 + + + + Trim fields? + Pulizia campi? + + + + Separate tables + Separa tabelle + + + + Advanced + Avanzate + + + + When importing an empty value from the CSV file into an existing table with a default value for this column, that default value is inserted. Activate this option to insert an empty value instead. + Quando importo un campo vuoto dal file CSV dentro una tabella con un valore predefinito per quella colonna, quel valore viene inserito. Attivare quest'opzione per inserire invece un valore vuoto. + + + + Ignore default &values + Ignora valori &predefiniti + + + + Activate this option to stop the import when trying to import an empty value into a NOT NULL column without a default value. + Attivare quest'opzione per fermare l'importazione quando si prova ad importare un valore vuoto in una colonna "NOT NULL" senza valore predefinito. + + + + Fail on missing values + Fallisci su valori mancanti + + + + Disable data type detection + Disabilita rilevamento tipo dati + + + + Disable the automatic data type detection when creating a new table. + Disabilita il riconoscimento automatico della tipologia di dato quando crea una nuova tabella. + + + + When importing into an existing table with a primary key, unique constraints or a unique index there is a chance for a conflict. This option allows you to select a strategy for that case: By default the import is aborted and rolled back but you can also choose to ignore and not import conflicting rows or to replace the existing row in the table. + Quando si importano dati all'interno di una tabella esistente con una chiave primaria, potrebbero esserci conflitti. Questa opzione ti permette di selezionare una strategia per quei casi: Di base l'importazione è annullata e viene fatto un rollback, ma puoi anche scegliere d'ignorare e non importare le righe in conflitto o di rimpiazzare quelle presenti nella tabella. + + + + Abort import + Annulla l'importazione + + + + Ignore row + Ignora la riga + + + + Replace existing row + Rimpiazza la riga esistente + + + + Conflict strategy + Strategia di conflitto + + + + + Deselect All + Deseleziona tutte + + + + Match Similar + Seleziona simili + + + + Import completed + Importazione completata + + + + Select All + Seleziona tutte + + + + There is already a table named '%1' and an import into an existing table is only possible if the number of columns match. + Esiste già una tabella col nome '%1' e l'importazione in una tabella esistente non è possibile se il numero di colonne non corrisponde. + + + + There is already a table named '%1'. Do you want to import the data into it? + Esiste già una tabella col nome '%1'. Vuoi importare i dati al suo interno? + + + + Creating restore point failed: %1 + Creazione del punto di ripristino fallita: %1 + + + + Creating the table failed: %1 + Creazione della tabella fallita: %1 + + + + importing CSV + importo il CSV + + + + Inserting row failed: %1 + Inserimento della riga fallito: %1 + + + + Importing the file '%1' took %2ms. Of this %3ms were spent in the row function. + Importare il file '%1' ha richiesto %2ms. Di questi %3ms sono stati spesi in funzioni di riga. + + + + MainWindow + + + DB Browser for SQLite + DB Browser for SQLite + + + + + Database Structure + This has to be equal to the tab title in all the main tabs + Struttura database + + + + This is the structure of the opened database. +You can drag SQL statements from an object row and drop them into other applications or into another instance of 'DB Browser for SQLite'. + + Questa è la struttura del database aperto. +Puoi trascinare SQL da una riga oggetto e rilasciarli dentro altri applicativi o in altre istanze di àDB Browser for SQLite'. + + + + + + Browse Data + This has to be equal to the tab title in all the main tabs + Naviga nei dati + + + + &Table: + &Tabella: + + + + Select a table to browse data + Seleziona una tabella per navigare tra i dati + + + + Use this list to select a table to be displayed in the database view + Usa questa lista per selezionare una tabella da visualizzare nella vista del database + + + Refresh the data in the selected table [F5, Ctrl+R] + Aggiorna i dati della tabella selezionata [F5, Ctrl+R] + + + + This button refreshes the data in the currently selected table. + Questo pulsante aggiorna i dati della tabella selezionata. + + + + Clear all filters + Cancella tutti i filtri + + + + This button clears all the filters set in the header input fields for the currently browsed table. + Questo pulsante pulisce tutti i filtri impostati nella riga d'intestazione per la tabella corrente. + + + + Save the table as currently displayed + Salva la tabella così come visualizzata + + + + <html><head/><body><p>This popup menu provides the following options applying to the currently browsed and filtered table:</p><ul style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;"><li style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Export to CSV: this option exports the data of the browsed table as currently displayed (after filters, display formats and order column) to a CSV file.</li><li style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Save as view: this option saves the current setting of the browsed table (filters, display formats and order column) as an SQL view that you can later browse or use in SQL statements.</li></ul></body></html> + <html><head/><body><p>Questo menù fornisce le seguenti opzioni applicabili alla tabella filtrata e visualizzata correntemente:</p><ul style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;"><li style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Esporta in CSV: questa opzione esporta i dati della tabella così come visualizzati (con filtri, riordine delle colonne e formati) in un file CSV.</li><li style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Salva come vista: questa opzione salva le impostazioni correnti della tabella visualizzata (filtri, riordine delle colonne e formati) come vista SQL che puoi successivamente visualizzare o utilizzare come statement.</li></ul></body></html> + + + + ... + ... + + + Print currently browsed table data [Ctrl+P] + Stampa i dati visualizzati [Ctrl+P] + + + + Print currently browsed table data. Print selection if more than one cell is selected. + Stampa i dati visualizzati. Stampa la selezione se più di una cella è selezionata. + + + + Insert a new record in the current table + Inserisci un nuovo valore nella tabella corrente + + + + <html><head/><body><p>This button creates a new record in the database. Hold the mouse button to open a pop-up menu of different options:</p><ul><li><span style=" font-weight:600;">New Record</span>: insert a new record with default values in the database.</li><li><span style=" font-weight:600;">Insert Values...</span>: open a dialog for entering values before they are inserted in the database. This allows to enter values acomplishing the different constraints. This dialog is also open if the <span style=" font-weight:600;">New Record</span> option fails due to these constraints.</li></ul></body></html> + <html><head/><body><p>Questo pulsante crea una nuova riga nel database. Mantieni premuto il tasto del mouse per ottenere più opzioni:</p><ul><li><span style=" font-weight:600;">Nuova Riga</span>: inserisce una nuova riga con i valori predefiniti.</li><li><span style=" font-weight:600;">Inserisci Valori...</span>: apre una finestra per inserire i valori prima che vengano immessi nel database. Questo permette che l'immissione dei valori rispetti diversi limiti (constraints). Questa finestra si apre anche se l'opzione <span style=" font-weight:600;">Nuova Riga</span> fallisce a causa di questi limiti (constraints).</li></ul></body></html> + + + + + New Record + Nuova Riga + + + + Delete the current record + Elimina il valore corrente + + + + This button deletes the record or records currently selected in the table + Questo pulsante elimina la/e righe selezionate nella tabella + + + + + Delete Record + Elimina Riga + + + + This is the database table view. You can do the following actions: + - Start writing for editing inline the value. + - Double-click any record to edit its contents in the cell editor window. + - Alt+Del for deleting the cell content to NULL. + - Ctrl+" for duplicating the current record. + - Ctrl+' for copying the value from the cell above. + - Standard selection and copy/paste operations. + Questa è la vista della tabella del database. Puoi eseguire le seguenti operazioni: + - Inizia a scrivere per modificare i valori. + - Doppio-click su qualsiasi valore per modificarne il contenuto nella finestra di editor della cella. + - Alt+Del per eliminare il contenuto della cella e portarlo a NULL. + - Ctrl+" per duplicare il valore corrente. + - Ctrl+' per copiare il valore dalla cella soprastante. + - Operazioni di selezione e copia/incolla. + + + + <html><head/><body><p>Scroll to the beginning</p></body></html> + <html><head/><body><p>Scorri all'ìinizio</p></body></html> + + + + <html><head/><body><p>Clicking this button navigates to the beginning in the table view above.</p></body></html> + <html><head/><body><p>Cliccare questo pulsante scorre la vista all'inizio della tabella.</p></body></html> + + + + |< + |< + + + + Scroll one page upwards + Scorri di una pagina in su + + + + <html><head/><body><p>Clicking this button navigates one page of records upwards in the table view above.</p></body></html> + <html><head/><body><p>Cliccando questo pulsante la vista scorre le righe di una pagina verso l'inizio della tabella.</p></body></html> + + + + < + < + + + + 0 - 0 of 0 + 0 - 0 di 0 + + + + Scroll one page downwards + Scorri di una pagina in giù + + + + <html><head/><body><p>Clicking this button navigates one page of records downwards in the table view above.</p></body></html> + <html><head/><body><p>Cliccando questo pulsante la vista scorre le righe di una pagina verso il fondo della tabella.</p></body></html> + + + + > + > + + + + Scroll to the end + Scorri alla fine + + + + <html><head/><body><p>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Clicking this button navigates up to the end in the table view above.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</p></body></html> + <html><head/><body><p>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Cliccando questo pulsante la vista scorre al fondo della tabella.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</p></body></html> + + + + >| + >| + + + + <html><head/><body><p>Click here to jump to the specified record</p></body></html> + <html><head/><body><p>Clicca qui per saltare alla riga specificata</p></body></html> + + + + <html><head/><body><p>This button is used to navigate to the record number specified in the Go to area.</p></body></html> + <html><head/><body><p>Questo pulsante è utilizzato per navigare alla riga impostata nell'area "Vai a".</p></body></html> + + + + Go to: + Vai a: + + + + Enter record number to browse + Inserisci il numero di riga a cui scorrere + + + + Type a record number in this area and click the Go to: button to display the record in the database view + Inserisci un numero in quest'area e clicca sul pul pulsante "Vai a" per visualizzare la riga selezionata + + + + 1 + 1 + + + + + Edit Pragmas + This has to be equal to the tab title in all the main tabs + Modifica Pragmas + + + <html><head/><body><p><a href="https://www.sqlite.org/pragma.html#pragma_case_sensitive_like">Case Sensitive Like</a></p></body></html> + <html><head/><body><p><a href="https://www.sqlite.org/pragma.html#pragma_case_sensitive_like">Case Sensitive Like</a></p></body></html> + + + + Warning: this pragma is not readable and this value has been inferred. Writing the pragma might overwrite a redefined LIKE provided by an SQLite extension. + Attenzione: questo pragma non è leggibile e questo valore è stato dedotto. Scrivere i pragma può sovrascrivere un LIKE ridefinito provvisto da un'estensione di SQLite. + + + + + Execute SQL + This has to be equal to the tab title in all the main tabs + Esegui SQL + + + + toolBar1 + + + + + &File + &File + + + + &Import + &Importa + + + + &Export + &Esporta + + + + &Edit + &Modifica + + + + &View + &Visualizza + + + + &Help + &Aiuto + + + + &Tools + &Strumenti + + + + DB Toolbar + Barra degli strumenti del DB + + + + Edit Database &Cell + Modifica &cella + + + + SQL &Log + &Log SQL + + + + Show S&QL submitted by + Mostra l'S&QL inviato da + + + + User + Utente + + + + Application + Applicazione + + + + This button clears the contents of the SQL logs + Questo pulsante cancella il contenuto del log SQL + + + + &Clear + &Pulisci + + + + This panel lets you examine a log of all SQL commands issued by the application or by yourself + Questo pannello ti permette di esaminare il log di tutti i comandi SQL inviati dall'applicazione o da te stesso + + + + &Plot + &Grafica + + + + DB Sche&ma + Sche&ma DB + + + + This is the structure of the opened database. +You can drag multiple object names from the Name column and drop them into the SQL editor and you can adjust the properties of the dropped names using the context menu. This would help you in composing SQL statements. +You can drag SQL statements from the Schema column and drop them into the SQL editor or into other applications. + + Questa è la struttura del database aperto. +Puoi trascinare nomi d'oggetto multipli dalla colonna "Nome" e rilasciarli all'interno dell'editor SQL e puoi modificare le proprietà dei nomi rilasciati utilizzando il menù contestuale. Questo può aiutarti nel comporre statement SQL. +Puoi trascinare statement SQL dalla colonna Schema e rilasciarli dentro l'editor SQL o all'interno di altre applicazioni. + + + + + &Remote + &Remoto + + + + + Project Toolbar + Barra degli strumenti di progetto + + + + Extra DB toolbar + Barra degli strumenti extra DB + + + + + + Close the current database file + Chiudi il file di database corrente + + + + &New Database... + &Nuovo Database... + + + + + Create a new database file + Crea un nuovo file di database + + + + This option is used to create a new database file. + Questa opzione è utilizzata per creare un nuovo file di database. + + + + Ctrl+N + Ctrl+N + + + + + &Open Database... + &Apri Database... + + + + + + + + Open an existing database file + Apre un file di database esistente + + + + + + This option is used to open an existing database file. + Questa opzione è utilizzata per aprire un file esistente di database. + + + + Ctrl+O + Ctrl+A + + + + &Close Database + &Chiudi Database + + + + This button closes the connection to the currently open database file + Questo pulsnate chiude la connessione al file di database attualmente aperto + + + + Ctrl+W + Ctrl+S + + + + &Revert Changes + &Ripristina le modifiche + + + + + Revert database to last saved state + Ripristina il database all'ultimo stato salvato + + + + This option is used to revert the current database file to its last saved state. All changes made since the last save operation are lost. + Questa opzione è utilizzata per ripristinare il file di database al suo ultimo stato salvato. Tutte le modifiche fatte dall'ultima opzione di salvataggio sono perse. + + + + &Write Changes + &Salva le modifiche + + + + + Write changes to the database file + Scrive le modifiche sul file di database + + + + This option is used to save changes to the database file. + Questa opzione è utilizzata per salvare le modifiche sul file di database. + + + + Ctrl+S + Ctrl+C + + + + Compact &Database... + &Compatta Database... + + + + Compact the database file, removing space wasted by deleted records + Compatta il file di database, rimuovendo lo spazio sprecato dalle righe eliminate + + + + + Compact the database file, removing space wasted by deleted records. + Compatta il file di database rimuovendo lo spazio sprecato dalle righe eliminate. + + + + E&xit + &Esci + + + + Ctrl+Q + Ctrl+E + + + + &Database from SQL file... + &Database dal file SQL... + + + + Import data from an .sql dump text file into a new or existing database. + Importa i dati da un file di testo di dump .sql all'interno di un database nuovo o esistente. + + + + This option lets you import data from an .sql dump text file into a new or existing database. SQL dump files can be created on most database engines, including MySQL and PostgreSQL. + Questa opzione ti permette d'importare i dati da un file di testo di dump .sql all'interno di un database nuovo o esistente. I file di dump SQL possono essere creati dalla maggiorparte dei motori SQL, inclusi MySQL e PostgreSQL. + + + + &Table from CSV file... + &Tabella da file CSV... + + + + Open a wizard that lets you import data from a comma separated text file into a database table. + Apre un wizard che ti permette d'importare dati da un file CSV all'interno di una tabella del database. + + + + Open a wizard that lets you import data from a comma separated text file into a database table. CSV files can be created on most database and spreadsheet applications. + Apre un wizard che ti permette d'importare dati da un file CSV all'interno di una tabella del database. I file CSV possono essere creati dalla maggiorparte delle applicazioni database o foglio di calcolo. + + + + &Database to SQL file... + &Database in file SQL... + + + + Export a database to a .sql dump text file. + Esporta un database in un file di testo di dump .sql. + + + + This option lets you export a database to a .sql dump text file. SQL dump files contain all data necessary to recreate the database on most database engines, including MySQL and PostgreSQL. + Questa opzione ti permette di esportare un database in un file di testo di dump .sql. Il file di dump SQL contiene tutti i dati necessari per ricreare il database sulla maggiorparte di motori di database, inclusi MySQL e PostgreSQL. + + + + &Table(s) as CSV file... + &Tabella(e) come file CSV... + + + + Export a database table as a comma separated text file. + Esporta la tabella del database come un file di testo CSV. + + + + Export a database table as a comma separated text file, ready to be imported into other database or spreadsheet applications. + Esporta la tabella del database come un file di testo CSV, pronto per essere importato in un altro database o foglio di calcolo. + + + + &Create Table... + &Crea tabella... + + + + Open the Create Table wizard, where it is possible to define the name and fields for a new table in the database + Apre un wizard per la creazione di una tabella, dov'è possibile definire il nome e i campi di una nuova tabella del database + + + + &Delete Table... + &Elimina tabella... + + + + + Delete Table + Elimina Tabella + + + + Open the Delete Table wizard, where you can select a database table to be dropped. + Apre un wizard per la cancellazione della tabella, da qui puoi selezionare la tabella del database da eliminare. + + + + &Modify Table... + &Modifica Tabella... + + + + Open the Modify Table wizard, where it is possible to rename an existing table. It is also possible to add or delete fields form a table, as well as modify field names and types. + Apre un wizard per la modifica di una tabella, da qui è possibile rinominare una tabella esistente. Si può anche aggiungere o rimuovere campi da una tabella così come modificarne il nome o il tipo. + + + + Create &Index... + Crea &Indice... + + + + Open the Create Index wizard, where it is possible to define a new index on an existing database table. + Apre un wizard per la crazione di un indice, da qui è possibile definire un nuovo indice s'una tabella di database pre-esistente. + + + + &Preferences... + &Preferenze... + + + + + Open the preferences window. + Apre la finestra delle preferenze. + + + + &DB Toolbar + &Barra degli strumenti + + + + Shows or hides the Database toolbar. + Mostra o nasconde la barra degli strumenti del database. + + + + Ctrl+T + Ctrl+T + + + + Print text from current SQL editor tab + Stampa testo dalla scheda corrente dell'editor SQL + + + + Print the structure of the opened database + Stampa la struttura del database aperto + + + + Un/comment block of SQL code + De/Commenta il blocco di codice SQL + + + + Comment or uncomment current line or selected block of code + Commenta o decommenta la riga corrente o il blocco selezionato di codice + + + + Comment or uncomment the selected lines or the current line, when there is no selection. All the block is toggled according to the first line. + Commenta o decommenta le righe selezionate o la riga corrente, quando non c'è nessuna selezione. Tutti i blocchi sono modificati in accordo alla prima riga. + + + + Ctrl+/ + Ctrl+/ + + + + Stop SQL execution + Ferma esecuzione SQL + + + + Stop the currently running SQL script + Ferma lo script SQL attualmente in esecuzione + + + + W&hat's This? + Cos'è &questo? + + + + Refresh the data in the selected table + Aggiorna i dati della tabella selezionata + + + + Print currently browsed table data + Stampa i dati della tabella attualmente in esplorazione + + + + Shift+F1 + Shift+F1 + + + + &About + &Informazioni + + + + &Recently opened + &Aperti di recente + + + + Open &tab + Apri &scheda + + + + This button opens a new tab for the SQL editor + Questo pulsante apre una nuova schede dell'editor SQL + + + + &Execute SQL + &Esegui SQL + + + Execute all/selected SQL [F5, Ctrl+Return, Ctrl+R] + Esegue tutti/selezionati SQL [F5, Ctrl+Invio, Ctrl+R] + + + + This button executes the currently selected SQL statements. If no text is selected, all SQL statements are executed. + Questo pulsante esegue gli statement SQL evidenziati. Se nessun testo è selezionato, tutti gli statement SQL vengono eseguiti. + + + + Open SQL file + Apri file SQL + + + + This button opens a file containing SQL statements and loads it in a new editor tab + Questo pulsante apre un file contenente statement SQL e lo carica in una nuova scheda dell'editor + + + + + + Save SQL file + Salva file SQL + + + + &Load Extension... + &Carica Estensioni... + + + + + Execute current line + Esegue la riga corrente + + + Execute current line [Shift+F5] + Esegue la riga corrente [Shift+F5] + + + + This button executes the SQL statement present in the current editor line + Questo pulsante esegue lo statement SQL presente nella riga corrente dell'editor + + + + Shift+F5 + Shift+F5 + + + + Export as CSV file + Esporta come file CSV + + + + Export table as comma separated values file + Esporta la tabella come file CSV + + + + &Wiki + &Wiki + + + + Bug &Report... + Bug &Report... + + + + Feature Re&quest... + Richiesta &Funzionalità... + + + + Web&site + Sito &Web + + + + &Donate on Patreon... + &Dona su Patreon... + + + + Sa&ve Project... + Sal&va Progetto... + + + + + Save the current session to a file + Salva la sessione correte in un file + + + + This button lets you save all the settings associated to the open DB to a DB4S project file + Questo pulsante ti permette di salvare tutte le impostazioni associate al DB aperto in un file di progetto di DB4S + + + + Open &Project... + Apri &Progetto... + + + + + Load a working session from a file + Carica una sessione di lavoro da file + + + + This button lets you open a DB4S project file + Questo pulsante ti permette di aprire un file di progetto DB4S + + + + &Attach Database... + &Collega Database... + + + + + Add another database file to the current database connection + Aggiunge un altro file di database alla connessione corrente + + + + This button lets you add another database file to the current database connection + Questo pulsante ti permette di aggiungere un altro file alla connessione corrente + + + + &Set Encryption... + &Imposta cifratura... + + + + + Save SQL file as + Salva file SQL come + + + + This button saves the content of the current SQL editor tab to a file + Questo pulsante salva il contenuto della scheda di editor SQL in un file + + + + &Browse Table + &Naviga Tabella + + + + Copy Create statement + Copia statement CREATE + + + + Copy the CREATE statement of the item to the clipboard + Copia lo statement CREATE negli appunti + + + + Edit display format + Modifica formato di visualizzazione + + + + Edit the display format of the data in this column + Modifica il formato di visualizzazione dei dati in questa colonna + + + + Show rowid column + Mostra colonna rowid + + + + Toggle the visibility of the rowid column + Mostra/nasconde la colonna rowid + + + + + Set encoding + Imposta codifica + + + + Change the encoding of the text in the table cells + Modifica la codifica dle testo nelle celle della tabella + + + + Set encoding for all tables + Imposta la codifica per tutte le tabelle + + + + Change the default encoding assumed for all tables in the database + Modifica il valore predefinito di codifica per tutte le tabelle del database + + + + SQLCipher &FAQ + SLQCipher &FAQ + + + + Opens the SQLCipher FAQ in a browser window + Apre le SQLCipher FAQ in una finestra del browser + + + + Table(&s) to JSON... + Tabella(&e) in JSON... + + + + Export one or more table(s) to a JSON file + Esporta una o più tabelle in un file JSON + + + + Refresh + Aggiorna + + + + F5 + + + + + Open Data&base Read Only... + Apri un Data&base in Sola Lettura... + + + + Open an existing database file in read only mode + Apre un file databse esistente in modalità sola lettura + + + + Unlock view editing + Sblocca la modifica della vista + + + + This unlocks the current view for editing. However, you will need appropriate triggers for editing. + Sblocca la vista corrente per modificarla. Per poterla modificare avrai comunque bisogno degli appropriati trigger. + + + + Save results + Salva risultati + + + + Save the results view + Salva i risultati della vista + + + + This button lets you save the results of the last executed query + Questo pulsante ti permette di salvare i risultati dell'ultima query eseguita + + + + + Find text in SQL editor + Trova testo nell'editor SQL + + + Find text in SQL editor [Ctrl+F] + Trova testo nell'editor SQL [Ctrl+F] + + + + This button opens the search bar of the editor + Questo pulsante apre la barra di ricerca dell'editor + + + + Ctrl+F + Ctrl+F + + + + + Find or replace text in SQL editor + Trova e/o sostituisci testo nell'editor SQL + + + Find or replace text in SQL editor [Ctrl+H] + Trova e/o sostituisce il testo nell'editor SQL [Ctrl+H] + + + + This button opens the find/replace dialog for the current editor tab + Questo pulsante apre la finestra di ricerca/sostituzione testo per la scheda corrente dell'editor + + + + Ctrl+H + Ctrl+H + + + + + Export to &CSV + Esporta in &CSV + + + + + Save as &view + Salva come &vista + + + + Save as view + Salva come vista + + + + Hide column(s) + Nascondi colonna(e) + + + + Hide selected column(s) + Nasconde la(e) colonna(e) selezionata(e) + + + + Show all columns + Mostra tutte le colonne + + + + Show all columns that were hidden + Mostra tutte le colonne nascoste + + + + Shows or hides the Project toolbar. + Mostra o nasconde la barra degli strumenti di progetto. + + + + Extra DB Toolbar + Barra degli strumenti DB estesa + + + + + Export the filtered data to CSV + Esporta i dati filtrati in CSV + + + + This button exports the data of the browsed table as currently displayed (after filters, display formats and order column) as a CSV file. + Questo pulsante esporta i dati della tabella così come visualizzati (applicando filtri, formati e ordine delle colonne) in un file CSV. + + + + + Save the current filter, sort column and display formats as a view + Salva il filtro corrente, ordine colonne e formati dati come vista + + + + This button saves the current setting of the browsed table (filters, display formats and order column) as an SQL view that you can later browse or use in SQL statements. + Questo pulsante salva le impostazioni della tabella visualizzata (filtri, formati e ordine colonne) in una vista SQL che puoi successivamente navigare o utilizzare in statement SQL. + + + + Insert Values... + Inserisci Valori... + + + + + Open a dialog for inserting values in a new record + Apre una finestra per l'inermento di valori all'interno di un nuovo record + + + + + Insert new record using default values in browsed table + Inserisce un nuovo record utilizzando i valori di default della tabella + + + + New In-&Memory Database + Nuovo Database In &Memoria + + + + Drag && Drop Qualified Names + Trascina && Rilascia Nomi Qualificati + + + + + Use qualified names (e.g. "Table"."Field") when dragging the objects and dropping them into the editor + Usa nomi qualificati (es. "Table"."Campo") quando trascini gli oggetti e li rilasci all'interno dell'editor + + + + Drag && Drop Enquoted Names + Trascina && Rilascia Nomi Quotati + + + + + Use escaped identifiers (e.g. "Table1") when dragging the objects and dropping them into the editor + Usa gl'identificatori di citazione (es. "Tabella1") quando trascini e rilasci gli oggetti nell'editor + + + + &Integrity Check + Controllo &Integrità + + + + Runs the integrity_check pragma over the opened database and returns the results in the Execute SQL tab. This pragma does an integrity check of the entire database. + Avvia il controllo integrità (integrity check pragma) sul database aperto e riporta il risultato nella scheda "Esegui SQL". Questa operazione esegue un controllo d'integrità sull'intero database. + + + + &Foreign-Key Check + Controlla Chiave &Esterna + + + + Runs the foreign_key_check pragma over the opened database and returns the results in the Execute SQL tab + Avvia il controllo chiavi esterne (foreign_key_check pragma) nel database aperto e riporta il risultato nella scheda "Esegui SQL" + + + + &Quick Integrity Check + Controllo Integrità &Veloce + + + + Run a quick integrity check over the open DB + Avvia un controllo veloce d'integrità sul DB aperto + + + + Runs the quick_check pragma over the opened database and returns the results in the Execute SQL tab. This command does most of the checking of PRAGMA integrity_check but runs much faster. + Avvia un controllo veloce d'integrità (quick_check pragma) sul database e riporta il risultato nella scheda "Esegui SQL". Quest comando esegue la maggiorparte dei controlli d'integrità del controllo completo, ma in modo molto più veloce. + + + + &Optimize + &Ottimizza + + + + Attempt to optimize the database + Prova ad ottimizzare il database + + + + Runs the optimize pragma over the opened database. This pragma might perform optimizations that will improve the performance of future queries. + Avvia l'ottimizzazione del database aperto. Questa operazione potrebbe eseguire delle ottimizzazione che miglioreranno le performance delle query future. + + + + + Print + Stampa + + + Print text from current SQL editor tab [Ctrl+P] + Stampa il testo della scheda editor SQL [Ctrl+P] + + + + Open a dialog for printing the text in the current SQL editor tab + Apre una finetra per la stampa del testo nella scheda dell'editor SQL + + + Print the structure of the opened database [Ctrl+P] + Stampa la struttura del database aperto [Ctrl+P] + + + + Open a dialog for printing the structure of the opened database + Apre una finestra per la stampa della struttura del database aperto + + + + + Ctrl+P + Ctrl+P + + + + Execute all/selected SQL + Esegui tutti gli SQL o quelli selezionati + + + + Ctrl+Return + Ctrl+Invio + + + + Ctrl+L + Ctrl+L + + + + Ctrl+D + + + + + Ctrl+I + + + + + Ctrl+E + + + + + Reset Window Layout + Ripristina disposizione finestra + + + + Alt+0 + Alt+0 + + + + The database is currenctly busy. + Il database è occupato. + + + + Click here to interrupt the currently running query. + Clicca qui per interrompere la query in esecuzione. + + + + Encrypted + Criptato + + + + Database is encrypted using SQLCipher + Il database è stato criptato utilizzando SQLCipher + + + + Read only + Sola lettura + + + + Database file is read only. Editing the database is disabled. + Il file di database è in sola lettura. Le modifiche al database sono disabilitate. + + + + Database encoding + Codifica Database + + + + + Choose a database file + Seleziona un file di database + + + + Could not open database file. +Reason: %1 + Impossibile aprire il file di database. +Motivo: %1 + + + + + + Choose a filename to save under + Seleziona un nome file per il salvataggio + + + + In-Memory database + Database In-Memoria + + + + You are still executing SQL statements. When closing the database now the execution will be stopped. maybe leaving the database in an incosistent state. Are you sure you want to close the database? + Sto ancora eseguendo degli SQL. Se chiudi ora il database l'esecuzione verrà terminata lasciando potenzialmente il database in uno stato inconsistente. Sei sicuro di voler chiudere il database? + + + + Error deleting record: +%1 + Errore eliminando le righe: +%1 + + + + Please select a record first + Si prega di selezionare prima un record + + + + determining row count... + determino il numero di righe... + + + + %1 - %2 of >= %3 + %1 - %2 di >= %3 + + + + %1 - %2 of %3 + %1 - %2 di %3 + + + + + There is no database opened. Please open or create a new database file. + Non c'è un database aperto. Si prega di aprire o creare un nuovo file di database. + + + + Are you sure you want to delete the table '%1'? +All data associated with the table will be lost. + Sei sicuro di voler eliminare la tabella '%1'? +Tutti i dati associati alla tabella andranno perduti. + + + + Are you sure you want to delete the view '%1'? + Sei sicuro di voler eliminare la vista '%1'? + + + + Are you sure you want to delete the trigger '%1'? + Sei sicuro di voler eliminare il trigger '%1'? + + + + Are you sure you want to delete the index '%1'? + Sei sicuro di voler eliminare l'indice '%1'? + + + + Error: could not delete the table. + Errore: impssibile eliminare la tabella. + + + + Error: could not delete the view. + Errore: impossibile eliminare la vista. + + + + Error: could not delete the trigger. + Errore: impossibile eliminare il trigger. + + + + Error: could not delete the index. + Errore: impossibile eliminare l'indice. + + + + Message from database engine: +%1 + Messaggio dal database: +%1 + + + + Editing the table requires to save all pending changes now. +Are you sure you want to save the database? + Per modificare la tabella bisogna salvare tutte le modifiche pendenti. +Sei sicuro di voler salvare il database? + + + + Error checking foreign keys after table modification. The changes will be reverted. + Errore nel controllo delle chiavi esterne dopo le modifiche alla tabella. Le modifiche saranno eliminate. + + + + This table did not pass a foreign-key check.<br/>You should run 'Tools | Foreign-Key Check' and fix the reported issues. + Questa tabella non ha passato il controllo sulle chiavi esterne.<br/>Dovresti avviare 'Strumenti | Controllo Chiavi Esterne' e correggere i problemi riportati. + + + + You are already executing SQL statements. Do you want to stop them in order to execute the current statements instead? Note that this might leave the database in an inconsistent state. + Sto eseguendo degli SQL. Vuoi fermarli per poter eseguire invece l'SQL corrente? Nota che questo potrebbe lasciare il database in uno stato inconsistente. + + + + -- EXECUTING SELECTION IN '%1' +-- + -- ESEGUO LA SELEZIONE IN '%1' +-- + + + + -- EXECUTING LINE IN '%1' +-- + -- ESEGUO LINEA IN '%1' +-- + + + + -- EXECUTING ALL IN '%1' +-- + -- ESEGUO TUTTO IN '%1' +-- + + + + -- At line %1: +%3 +-- Result: %2 + -- Alla riga %1: +%3 +-- Risultato: %2 + + + + Setting PRAGMA values or vacuuming will commit your current transaction. +Are you sure? + Impostare i valori PRAGMA o pulizia chiuderanno la transazione corrente. +Sei sicuro? + + + + Execution finished with errors. + Esecuzione completata con errori. + + + + Execution finished without errors. + Esecuzione completata senza errori. + + + + Extensions(*.so *.dylib *.dll);;All files(*) + Estensioni(*.so *.dylib *.dll);;Tutti i files(*) + + + Execution aborted by user + Esecuzione terminata dall'utente + + + executing query + query in esecuzione + + + + %1 rows returned in %2ms + %1 righe ritornate in %2ms + + + , %1 rows affected + , %1 righe modificate + + + query executed successfully. Took %1ms%2 + query eseguita con successo. Impiegati %1ms%2 + + + -- At line %1: +%4 +-- Result: %3 + -- Alla riga %1: +%4 +-- Risultato: %3 + + + + Choose text files + Seleziona i file di testo + + + + Text files(*.csv *.txt);;All files(*) + File di testo(*.csv *.txt);;Tutti i files(*) + + + + Error while saving the database file. This means that not all changes to the database were saved. You need to resolve the following error first. + +%1 + Errore nel salvataggio del database. Questo significa che non tutte le modifiche del database sono state salvate. Avrai bisogno di risolvere prima il seguente errore. + +%1 + + + + Are you sure you want to undo all changes made to the database file '%1' since the last save? + Sei sicuro di voler annullare tutte le modifiche effettuate al database '%1' dall'ultimo salvataggio? + + + + Choose a file to import + Seleziona un file da importare + + + + + + Text files(*.sql *.txt);;All files(*) + File di testo(*.sql *.txt);;Tutti i files(*) + + + + Do you want to create a new database file to hold the imported data? +If you answer no we will attempt to import the data in the SQL file to the current database. + Vuoi creare un nuovo file di database per mantenere i dati importati? +Se rispondi di no proveremo ad importare i dati del file SQL all'interno del database corrente. + + + + File %1 already exists. Please choose a different name. + Il file %1 esiste già. Si prega di scegliere un nome differente. + + + + Error importing data: %1 + Errore nell'importazione: %1 + + + + Import completed. Some foreign key constraints are violated. Please fix them before saving. + Importaizone completata. Alcuni vincoli per le chiavi esterne non sono rispettati. Si prega di correggerli prima di salvare. + + + + Import completed. + Import completato. + + + + Delete View + Elimina Vista + + + + Modify View + Modifica Vista + + + + Delete Trigger + Elimina Trigger + + + + Modify Trigger + Modifica Trigger + + + + Delete Index + Elimina Indice + + + + Modify Index + Modifica Indice + + + + Modify Table + Modifica Tabella + + + + &%1 %2 + &%1 %2 + + + + Setting PRAGMA values will commit your current transaction. +Are you sure? + Impostare i valori di PRAGMA chiuderà la transaione corrente. +Sei sicuro? + + + + The statements in this tab are still executing. Closing the tab will stop the execution. This might leave the database in an inconsistent state. Are you sure you want to close the tab? + Gli SQL in questa scheda sono ancora in esecuzione. Chiudere la scheda bloccherà l'esecuzione. Questo potrebbe lasciare il database in uno stato inconsistente. Sei sicuro di voler chiudere la scheda? + + + + Select SQL file to open + Selezionare il file SQL da aprire + + + + Couldn't read file: %1. + Impossibile leggere il file: %1. + + + + Couldn't save file: %1. + Impossibile salvare il file: %1. + + + + Select file name + Seleziona il nome del file + + + + Select extension file + Seleziona l'estensione del file + + + Extensions(*.so *.dll);;All files(*) + Estensioni(*.so *.dll);;Tutti i files(*) + + + + Extension successfully loaded. + Estensione caricata con successo. + + + + Error loading extension: %1 + Errore nel caricamento dell'estensione: %1 + + + + + Don't show again + Non mostrare di nuovo + + + + New version available. + Nuova versione disponibile. + + + + A new DB Browser for SQLite version is available (%1.%2.%3).<br/><br/>Please download at <a href='%4'>%4</a>. + Una nuova versione di DB Browser for SQLite è disponibile (%1.%2.%3).<br/><br/>Si prega di scaricarla da <a href='%4'>%4</a>. + + + + Choose a project file to open + Seleziona un file di progetto da aprire + + + + + DB Browser for SQLite project file (*.sqbpro) + File di progetto DB Browser for SQLite (*.sqbpro) + + + + This project file is using an old file format because it was created using DB Browser for SQLite version 3.10 or lower. Loading this file format is still fully supported but we advice you to convert all your project files to the new file format because support for older formats might be dropped at some point in the future. You can convert your files by simply opening and re-saving them. + Questo file di progetto utilizza un vecchio formato poiché è stato creato con la versione 3.10 o antecedente. Il caricamento di questo formato è ancora supportato, ma ti suggeriamo di convertire tutti i tuoi files di progetto al nuovo formato poiché il supporto ai formati precedenti potrebbe essere eliminato in futuro. Puoi convertire i tuoi file semplicemente aprendoli e salvandoli nuovamente. + + + + Duplicate records + Duplica i records + + + + Duplicate record + Duplica il record + + + + Ctrl+" + + + + + Please choose a new encoding for all tables. + Si prega di scegliere una nuova codifica per tutte le tabelle. + + + + Please choose a new encoding for this table. + Si prega di scegliere una nuova codifica per questa tabella. + + + + %1 +Leave the field empty for using the database encoding. + %1 +Lasciare il campo vuoto per utilizzare la codifica del database. + + + + This encoding is either not valid or not supported. + Questa codifica non è valida o non è supportata. + + + + Please enter a pseudo-primary key in order to enable editing on this view. This should be the name of a unique column in the view. + Si prega d'inserire una pseudo-chiave primaria in modo da abilitare le modifiche su questa vista. Deve corrispondere al nome di una colonna univoca nella vista. + + + + Collation needed! Proceed? + Necessario confronto! Procedo? + + + + A table in this database requires a special collation function '%1' that this application can't provide without further knowledge. +If you choose to proceed, be aware bad things can happen to your database. +Create a backup! + Una tabella di questo database richiede una funzione di confronto speciale '%1' che questa applicazione non può fornire senza ulteriori informazioni. +Se scegli di proseguire, sappi che potrebbero generarsi problemi nel tuo database. +Crea un backup! + + + + creating collation + creo confronto + + + + Set a new name for the SQL tab. Use the '&&' character to allow using the following character as a keyboard shortcut. + Imposta un nuovo nome per la scheda SQL. Usa il carattere '&&' per utilizzare il carattere succesivo come scorciatoia da tastiera. + + + + Please specify the view name + Si prega di specificare il nome della vista + + + + There is already an object with that name. Please choose a different name. + Esiste già un oggetto con quel nome. Si prega di scegliere un nome diverso. + + + + View successfully created. + Vista creata con successo. + + + + Error creating view: %1 + Errore nella creazione della vista: %1 + + + + There is no filter set for this table. View will not be created. + Non c'è filtro impostato per questa tabella. La vista non sarà creata. + + + + Delete Records + Elimina i Records + + + + This action will open a new SQL tab for running: + Questa azione aprirà una nuova scheda SQL per eseguire: + + + + Press Help for opening the corresponding SQLite reference page. + Premi Aiuto per aprire la pagina di riferimento SQLite corrispondente. + + + + Busy (%1) + Occupato (%1) + + + + NullLineEdit + + + Set to NULL + Imposta a NULL + + + + Alt+Del + Alt+Canc + + + + PlotDock + + + Plot + Grafico + + + + <html><head/><body><p>This pane shows the list of columns of the currently browsed table or the just executed query. You can select the columns that you want to be used as X or Y axis for the plot pane below. The table shows detected axis type that will affect the resulting plot. For the Y axis you can only select numeric columns, but for the X axis you will be able to select:</p><ul style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;"><li style=" margin-top:12px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Date/Time</span>: strings with format &quot;yyyy-MM-dd hh:mm:ss&quot; or &quot;yyyy-MM-ddThh:mm:ss&quot;</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Date</span>: strings with format &quot;yyyy-MM-dd&quot;</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Time</span>: strings with format &quot;hh:mm:ss&quot;</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Label</span>: other string formats. Selecting this column as X axis will produce a Bars plot with the column values as labels for the bars</li><li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Numeric</span>: integer or real values</li></ul><p>Double-clicking the Y cells you can change the used color for that graph.</p></body></html> + <html><head/><body><p>Questo pannello mostra la lista delle colonne della tabella corrente o della query eseguita. Puoi selezionare la colonna che vuoi utilizzare come asse X o Y per il grafico sottostante. La tabella mostra i tipi d'asse rilevati. Per l'asse Y puoi selezionare solo colonne numeriche, ma per l'asse X potrai selezionare:</p><ul style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;"><li style=" margin-top:12px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Data/Ora</span>: stringhe col formato &quot;aaaa-MM-gg hh:mm:ss&quot; o &quot;aaaa-MM-ggThh:mm:ss&quot;</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Data</span>: stringhe col formato &quot;aaaa-MM-dd&quot;</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Orario</span>: stringhe col formato &quot;hh:mm:ss&quot;</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Etichette</span>: altri formati di stringa. Selezionando queste colonne come X verrà visualizzato un grafico a barre</li><li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Numeri</span>: interi or valori reali</li></ul><p>Cliccando due volte sulle celle Y potrai cambiare il colore utilizzato per il grafico.</p></body></html> + + + + Columns + Colonne + + + + X + + + + + Y + + + + + Axis Type + Tipo asse + + + + Here is a plot drawn when you select the x and y values above. + +Click on points to select them in the plot and in the table. Ctrl+Click for selecting a range of points. + +Use mouse-wheel for zooming and mouse drag for changing the axis range. + +Select the axes or axes labels to drag and zoom only in that orientation. + Qui compare il grafico quando vengono selezionati i valori x e y. + +Clicca s'un punto per selezionarl sul grafico e nella tabella. Ctrl+Click per selezionare un intervallo di punti. + +Usa la rotella del mouse per ingrandire e trascina col mouse per cambiare l'intervallo degli assi. + +Seleziona le etichette dell'asse o degli assi per trascinare o ingrandire solo in quella direzione. + + + + Line type: + Tipo linea: + + + + + None + Nessuna + + + + Line + Linea + + + + StepLeft + Salto sinistro + + + + StepRight + Salto destro + + + + StepCenter + Salto centrato + + + + Impulse + Impulso + + + + Point shape: + Tipo punta: + + + + Cross + Croce + + + + Plus + Più + + + + Circle + Cerchio + + + + Disc + Disco + + + + Square + Quadrato + + + + Diamond + Rombo + + + + Star + Stella + + + + Triangle + Triangolo + + + + TriangleInverted + Triangolo inverso + + + + CrossSquare + Croce quadrato + + + + PlusSquare + Più quadrato + + + + CrossCircle + Croce cerchio + + + + PlusCircle + Più cerchio + + + + Peace + Pace + + + + <html><head/><body><p>Save current plot...</p><p>File format chosen by extension (png, jpg, pdf, bmp)</p></body></html> + <html><head/><body><p>Salva il grafico corrente...</p><p>Formato file selezionato dall'estensione (png, jpg, pdf, bmp)</p></body></html> + + + + Save current plot... + Salva il grafico corrente... + + + + + Load all data and redraw plot + Carica tutti i dati e ridisegna grafico + + + + Copy + Copia + + + + Print... + Stampa... + + + + Show legend + Mostra legenda + + + + Stacked bars + Barre impilate + + + + Date/Time + Data/Ora + + + + Date + Data + + + + Time + Ora + + + + + Numeric + Numerico + + + + Label + Etichetta + + + + Invalid + Invalido + + + + + + Row # + Riga # + + + + Load all data and redraw plot. +Warning: not all data has been fetched from the table yet due to the partial fetch mechanism. + Carica tutti i dati e ridisegna grafico. +Attenzione: non sono ancora stati recuperati tutti i dati dalla tabella a causa del meccanismo di recupero. + + + + Choose an axis color + Scegli il colore per l'asse + + + + Choose a filename to save under + Scegli il nome di salvataggio + + + + PNG(*.png);;JPG(*.jpg);;PDF(*.pdf);;BMP(*.bmp);;All Files(*) + + + + + There are curves in this plot and the selected line style can only be applied to graphs sorted by X. Either sort the table or query by X to remove curves or select one of the styles supported by curves: None or Line. + Ci sono delle curve in questo grafico e lo stile di line selezionato può essere applicato solo a grafici ordinati per X. Riordina la tabella o seleziona per X per rimuovere le curve o seleziona uno degli stili supportati dalle curve: Nessuno o Linea. + + + + PreferencesDialog + + + Preferences + Preferenze + + + + &General + &Generale + + + + Default &location + &Posizione di default + + + + Remember last location + Ricorda l'ultima posizione + + + + Always use this location + Usa sempre questa posizione + + + + Remember last location for session only + Ricorda l'ultima posizione solo per questa sessione + + + + + + ... + + + + + Lan&guage + Lin&gua + + + + Toolbar style + Stile barra degli strumenti + + + + Only display the icon + Mostra solo le icone + + + + Only display the text + Mostra solo il testo + + + + The text appears beside the icon + Mostra il testo a lato delle icone + + + + The text appears under the icon + Mostra il testo sotto le icone + + + + Follow the style + Segui lo stile + + + + Show remote options + Mostra opzioni remote + + + + + + + + + + + enabled + abilitato + + + + Automatic &updates + Aggiornamenti a&utomatici + + + + DB file extensions + Estensioni file DB + + + + Manage + Gestisci + + + + &Database + + + + + Database &encoding + &Codifica Database + + + + Open databases with foreign keys enabled. + Apri database contenenti chiavi esterne. + + + + &Foreign keys + Chiavi &Esterne + + + + Remove line breaks in schema &view + Rimuovi a-capo nella &vista dello schema + + + + When enabled, the line breaks in the Schema column of the DB Structure tab, dock and printed output are removed. + Quando abilitato, vengono rimossi gli a-capo nella colonna dello Schema del tab "Struttura DB", dock e stampa. + + + + Prefetch block si&ze + &Dimensione blocco di prefetch + + + + Advanced + Avanzate + + + + SQ&L to execute after opening database + SQ&L da eseguire dopo aver aperto il database + + + + Default field type + Tipo di campo di default + + + + Data &Browser + + + + + Font + + + + + &Font + + + + + Font si&ze + Dimensione te&sto + + + + Content + Contenuto + + + + Symbol limit in cell + Limite simboli nella cella + + + + + This is the maximum number of rows in a table for enabling the value completion based on current values in the column. +Can be set to 0 for disabling completion. + Questo è il numero massimo di righe in una tabella per abilitare il completamento dei valori basandosi su quelli attualmente nella colonna. +Può essere impostato a 0 per disabilitare il completamento. + + + + Row count threshold for completion + Numero massimo di righe per l'autocompletamento + + + + Field display + Visualizzazione campi + + + + Displayed &text + &Testo visualizzato + + + + Binary + Binario + + + + NULL + + + + + Regular + Normale + + + + Text color + Colore del testo + + + + Background color + Colore dello sfondo + + + + Preview only (N/A) + Solo anteprima (N/A) + + + + Filters + Filtri + + + + Escape character + Carattere di escape + + + + Delay time (&ms) + Ritardo (&ms) + + + + Set the waiting time before a new filter value is applied. Can be set to 0 for disabling waiting. + Imposta il tempo d'attesa prima che un nuovo filtro venga applicato. Può essere impostato a 0 per disabilitare l'attesa. + + + + &SQL + &SQL + + + + Settings name + Nome impostazioni + + + + Context + Contesto + + + + Colour + Colore + + + + Bold + Grassetto + + + + Italic + Corsivo + + + + Underline + Sottolinea + + + + Keyword + Parola chiave + + + + Function + Funzione + + + + Table + Tabella + + + + Comment + Commento + + + + Identifier + Identificatore + + + + String + Stringa + + + + Current line + Linea corrente + + + + Background + Sfondo + + + + Foreground + Primo piano + + + + SQL editor &font + &Font editor SQL + + + + SQL &editor font size + Dimensione font &editor SQL + + + + SQL &results font size + Dimensione font &risultati SQL + + + + Tab size + Dimensione tabulazione + + + + &Wrap lines + &A-capo automatico + + + + Never + Mai + + + + At word boundaries + Al limite della parola + + + + At character boundaries + Al limite del carattere + + + + At whitespace boundaries + Al limite del carattere vuoto + + + + &Quotes for identifiers + Identificatori per &citazioni + + + + Choose the quoting mechanism used by the application for identifiers in SQL code. + Scegli il tipo meccanismo di citazione utilizzato per il codice SQL. + + + + "Double quotes" - Standard SQL (recommended) + "Doppie virgolette" - Standard SQL (raccomandato) + + + + `Grave accents` - Traditional MySQL quotes + `Apice inverso` - Citazione tradizionale MySQL + + + + [Square brackets] - Traditional MS SQL Server quotes + [Parentesi quadre] - Citazione tradizionale MS SQL Server + + + + Code co&mpletion + Auto co&mpletamento + + + + Keywords in &UPPER CASE + Parole chiave &MAIUSCOLE + + + + When set, the SQL keywords are completed in UPPER CASE letters. + Quando impostato, le parole chiave vengono completate in MAIUSCOLO. + + + + Error indicators + Indicatori d'errore + + + + When set, the SQL code lines that caused errors during the last execution are highlighted and the results frame indicates the error in the background + Quando impostato, le righe di codice SQL che causano errori durante l'ultima esecuzione sono evidenziate e il campo del risultato indica l'errore sullo sfondo + + + + Hori&zontal tiling + Affianca &orizzontalmente + + + + If enabled the SQL code editor and the result table view are shown side by side instead of one over the other. + Se abilitato l'editor di codice SQL e la tabella del risultato sono mostrate una accanto all'altra anzichè una sopra l'altra. + + + + &Extensions + &Estensioni + + + + Select extensions to load for every database: + Seleziona le estensioni da caricare per ogni database: + + + + Add extension + Aggiungi estensione + + + + Remove extension + Rimuovi estensione + + + + <html><head/><body><p>While supporting the REGEXP operator SQLite doesn't implement any regular expression<br/>algorithm but calls back the running application. DB Browser for SQLite implements this<br/>algorithm for you to let you use REGEXP out of the box. However, as there are multiple possible<br/>implementations of this and you might want to use another one, you're free to disable the<br/>application's implementation and load your own by using an extension. Requires restart of the application.</p></body></html> + <html><head/><body><p>Anche se SQLite supporta l'operatore REGEXP non implementa alcun algoritmo<br/>di espressione regolare, ma richiama l'applicativo in esecuzione. DB Browser for SQLite implementa questo<br/>algoritmo per te per permetterti di usare le REGEXP immediatamente. Ci sono però multiple implementazioni<br/>possibili e potresti voler utilizzare una o l'altra, sei libero di disabilitare l'implementazione<br/>dell'applicativo e caricare la tua utilizzando un'estensione. Richiede il riavvio dell'applicativo.</p></body></html> + + + + Disable Regular Expression extension + Disabilita l'estensione per l'Espressione regolare + + + + <html><head/><body><p>SQLite provides an SQL function for loading extensions from a shared library file. Activate this if you want to use the <span style=" font-style:italic;">load_extension()</span> function from SQL code.</p><p>For security reasons, extension loading is turned off by default and must be enabled through this setting. You can always load extensions through the GUI, even though this option is disabled.</p></body></html> + <html><head/><body><p>SQLite fornisce una funzione SQL per il cariamento di estensioni da una libreria dinamica condivisa. Attiva questa opzione se vuoi utilizzare la funzione<span style=" font-style:italic;">load_extension()</span> dal codice SQL.</p><p>Per motivi di sicurezza, il caricamento delle estensioni è disabilitato di default e dev'essere abilitato tramite questa impostazione. Puoi sempre caricare le estensioni attraverso l'interfaccia grafica, anche se quest'opzione è disabilitata.</p></body></html> + + + + Allow loading extensions from SQL code + Permetti il caricamento di estensioni dal codice SQL + + + + Remote + Remoto + + + + CA certificates + Certificati CA + + + + + Subject CN + Soggetto CN + + + + Common Name + Nome comune + + + + Subject O + Soggetto O + + + + Organization + Organizzazione + + + + + Valid from + Valido dal + + + + + Valid to + Valido al + + + + + Serial number + Numero di serie + + + + Your certificates + Tuo certificato + + + + File + File + + + + Subject Common Name + Nome comune del soggetto + + + + Issuer CN + CN emittente + + + + Issuer Common Name + Nome comune emittente + + + + Clone databases into + Clona il database in + + + + + Choose a directory + Seleziona una cartella + + + + The language will change after you restart the application. + La lingua verrà modificata dopo il riavvio dell'applicativo. + + + + Select extension file + Seleziona il file d'estensione + + + Extensions(*.so *.dll);;All files(*) + Estensioni(*.so *.dll);;Tutti i files(*) + + + + Extensions(*.so *.dylib *.dll);;All files(*) + Estensioni(*.so *.dylib *.dll);;Tutti i files(*) + + + + Import certificate file + Importa il file di certificato + + + + No certificates found in this file. + Nessun certificato trovato in questo file. + + + + Are you sure you want do remove this certificate? All certificate data will be deleted from the application settings! + Sei sicuro di voler rimuovere questo certificato? Tutti i dati del certificato saranno eliminati dalle impostazioni dell'applicativo! + + + + Are you sure you want to clear all the saved settings? +All your preferences will be lost and default values will be used. + Sei sicuro di voler pulire tutte le impostazioni salvate? +Tutte le tue preferenze andranno perse e verranno utilizzati i valori predefiniti. + + + + QObject + + + All files (*) + Tutti i files (*) + + + + Error importing data + Errore nell'import dei dati + + + + from record number %1 + dalla riga numero %1 + + + + . +%1 + . +%1 + + + + Importing CSV file... + Importa file CSV... + + + + Cancel + Annulla + + + + SQLite database files (*.db *.sqlite *.sqlite3 *.db3) + File database SQLite (*.db *.sqlite *.sqlite3 *.db3) + + + + RemoteDatabase + + + Error when connecting to %1. +%2 + Errore nella connessione a %1. +%2 + + + + Error opening remote file at %1. +%2 + Errore aprendo il file remoto a %1. +%2 + + + + Error: Invalid client certificate specified. + Errore: specificato certificato invalido per il client. + + + + Please enter the passphrase for this client certificate in order to authenticate. + Si prega d'inserire la passphrase per questo certificato di client in modo da permetterne l'autenticazione. + + + + Cancel + Annulla + + + + Uploading remote database to +%1 + Carico il database remoto in +%1 + + + + Downloading remote database from +%1 + Scarico il database remoto da +%1 + + + + + Error: The network is not accessible. + Errore: Rete non disponibile. + + + + Error: Cannot open the file for sending. + Errore:Impossibile aprire il file per l'invio. + + + + Error opening local databases list. +%1 + Errore nell'apertura della lista di database locale. +%1 + + + + Error creating local databases list. +%1 + Errore nella creazione della lista di database locale. +%1 + + + + The remote database has been updated since the last checkout. Do you want to update the local database to the newest version? Note that this discards any changes you have made locally! If you don't want to lose local changes, click No to open the local version. + Il database remoto è stato aggiornato dall'ultima verifica. Vuoi aggiornare la copia locale del database alla versione più recente? Nota che questo eliminerà tutte le modifiche che puoi aver effettuato localmente! Se non vuoi perdere le modifiche locali, clicca su "No" per aprire la versione locale. + + + + RemoteDock + + + Remote + Remoto + + + + Identity + Identità + + + + Connect to the remote server using the currently selected identity. The correct server is taken from the identity as well. + Collega al server remoto utilizzando l'identità selezionata. Il server corretto è scelto anch'esso dall'identità. + + + + Go + Vai + + + + Push currently opened database to server + Invia il database corrente al server + + + + <html><head/><body><p>In this pane, remote databases from dbhub.io website can be added to DB4S. First you need an identity:</p><ol style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;"><li style=" margin-top:12px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Login to the dbhub.io website (use your GitHub credentials or whatever you want)</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Click the button to create a DB4S certificate (that's your identity). That'll give you a certificate file (save it to your local disk).</li><li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Go to the Remote tab in DB4S Preferences. Click the button to add a new certificate to DB4S and choose the just downloaded certificate file.</li></ol><p>Now the Remote panel shows your identity and you can add remote databases.</p></body></html> + <html><head/><body><p>In questo pannello si possono aggiungere a DB4S i database remoti del sitoi dbhub.io.Prima hai bisogno di un'identità:</p><ol style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;"><li style=" margin-top:12px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Accedi al sito dbhub.io (usa le tue credenziali GitHub o quelle che preferisci)</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Clicca il pulsante per creare un certificato DB4S (sarà la tua identità). Questo ti creerà un file di certificato (salvandolo sul tuo disco locale).</li><li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Vai al tab "Remoto" nelle preferenze di DB4S. Clicca il pulsante per aggiungere un nuovo certificato a DB4S e scegli il file di certificato appena scaricato.</li></ol><p>Ora il pannello "Remoto" mostra la tua identità e puoi aggiungere dei database remoti.</p></body></html> + + + + <html><head/><body><p>No DBHub.io account yet? <a href="https://dbhub.io/"><span style=" text-decoration: underline; color:#007af4;">Create one now</span></a> and import your certificate <a href="#preferences"><span style=" text-decoration: underline; color:#007af4;">here</span></a> to share your databases.</p><p>For online help visit <a href="https://dbhub.io/about"><span style=" text-decoration: underline; color:#007af4;">here</span></a>.</p></body></html> + <html><head/><body><p>Non hai ancora un account DBHub.io? <a href="https://dbhub.io/"><span style=" text-decoration: underline; color:#007af4;">Creane uno adesso</span></a> e importa il tuo certificato <a href="#preferences"><span style=" text-decoration: underline; color:#007af4;">qui</span></a> per condividere i tuoi database.</p><p>Per aiuto online vai <a href="https://dbhub.io/about"><span style=" text-decoration: underline; color:#007af4;">qui</span></a>.</p></body></html> + + + + RemoteModel + + + Name + Nome + + + + Commit + Commit + + + + Last modified + Ultima modifca + + + + Size + Dimensione + + + + bytes + bytes + + + + RemotePushDialog + + + Push database + Invia database + + + + Database na&me to push to + No&me del database a cui inviare + + + + Commit message + Messaggio di commit + + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Oxygen-Sans'; font-size:10pt; font-weight:400; font-style:normal;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p></body></html> + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Oxygen-Sans'; font-size:10pt; font-weight:400; font-style:normal;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p></body></html> + + + + Database licence + Licenza database + + + + Public + Pubblico + + + + Branch + Branch + + + + Force push + Forza invio + + + + Database will be public. Everyone has read access to it. + Il database sarà pubblico. Chiunque potrà accedere in lettura. + + + + Database will be private. Only you have access to it. + Il database sarà privato. Solo tu potrai accedervi. + + + + Use with care. This can cause remote commits to be deleted. + Usa con cautela. Questo può eliminare dei commit remoti. + + + + Unspecified + Non specificato + + + + RunSql + + + Execution aborted by user + Esecuzione terminata dall'utente + + + + , %1 rows affected + , %1 righe modificate + + + + query executed successfully. Took %1ms%2 + query eseguita con successo. Impiegati %1ms%2 + + + + executing query + query in esecuzione + + + + SqlExecutionArea + + + Form + + + + + Find previous match [Shift+F3] + Trova corrispondenza precedente [Shift+F3] + + + + Find previous match with mapping + Trova la corrispondenza precedente con reinizio + + + + Shift+F3 + + + + + The found pattern must be a whole word + Il pattern trovato deve essere una parola intera + + + + Whole Words + Parole intere + + + + Text pattern to find considering the checks in this frame + Il pattern da cercare considerando le spunte in quest'area + + + + Find in editor + Trova nell'editor + + + + The found pattern must match in letter case + Il patter trovato deve corrispondere esattamente (maiuscole/minuscole) incluse + + + + Case Sensitive + Case Sensitive + + + + Find next match [Enter, F3] + Trova la prossima corrispondenza [Invio, F3] + + + + Find next match with wrapping + Trova la prossima corrispondenza con reinizio + + + + F3 + + + + + Interpret search pattern as a regular expression + Interpreta il pattern di ricerca come un'espressione regolare + + + + <html><head/><body><p>When checked, the pattern to find is interpreted as a UNIX regular expression. See <a href="https://en.wikibooks.org/wiki/Regular_Expressions">Regular Expression in Wikibooks</a>.</p></body></html> + <html><head/><body><p>Quando selezionato, la stringa del testo viene interpretata come una RegExp Unix. Vedi <a href="https://en.wikibooks.org/wiki/Regular_Expressions">Espressioni regolari su Wikibooks (in inglese)</a>.</p></body></html> + + + + Regular Expression + Espressione regolare + + + + + Close Find Bar + Chiudi la barra di ricerca + + + + + Results of the last executed statements + Risultato degli 'ultimi statement eseguiti + + + + This field shows the results and status codes of the last executed statements. + Questo campo mostra i risultati e i codici di stato degli ultimi statements eseguiti. + + + + SqlTextEdit + + + Ctrl+/ + + + + + SqlUiLexer + + + (X) The abs(X) function returns the absolute value of the numeric argument X. + (X) La funzione abs(X) ritorna il valore assoluto dell'argomento numerico X. + + + + () The changes() function returns the number of database rows that were changed or inserted or deleted by the most recently completed INSERT, DELETE, or UPDATE statement. + () La funzione changes() ritorna il numero delle righe di database che sono state modificate o inserite o eliminate dallo statement INSERT, DELETE o UPDATE più recente. + + + + (X1,X2,...) The char(X1,X2,...,XN) function returns a string composed of characters having the unicode code point values of integers X1 through XN, respectively. + (X1, X2,...) La funzione char(X1,X2,...,XN) ritorna una stringa composta dai caratteri unicode rappresentati dai valori interi da X1 a XN. + + + + (X,Y,...) The coalesce() function returns a copy of its first non-NULL argument, or NULL if all arguments are NULL + (X,Y,...) La funzione coalesce(X,Y,...) ritorna una copia del suo primo argomento non NULL oppure NULL se tutti gli argomenti sono NULL + + + + (X,Y) The glob(X,Y) function is equivalent to the expression "Y GLOB X". + (X,Y) La funzione glob(X,Y) è equivalente all'espressione "Y GLOB X". + + + + (X,Y) The ifnull() function returns a copy of its first non-NULL argument, or NULL if both arguments are NULL. + (X,Y) La funzione ifnull(X,Y) ritorno una copia del suo primo argomento non NULL o NULL se entrambi gli argomenti sono NULL. + + + + (X,Y) The instr(X,Y) function finds the first occurrence of string Y within string X and returns the number of prior characters plus 1, or 0 if Y is nowhere found within X. + (X,Y) La funzione intstr(X,Y) trova la prima occorrenza della stringa Y all'interno della stringa X e ritorna il numero dei caratteri precedenti più 1 o 0 se Y non si trova all'interno di X. + + + + (X) The hex() function interprets its argument as a BLOB and returns a string which is the upper-case hexadecimal rendering of the content of that blob. + (X) La funzione hex() interpreta i suoi argomenti come un BLOB e ritorna una stringa corrispondente al rendering esadecimale maiuscolo del contenuto di quel blob. + + + + () The last_insert_rowid() function returns the ROWID of the last row insert from the database connection which invoked the function. + () La funzione last_insert_rowid() ritorna il ROWID dell'ultima riga inserita nella connessione database che ha invocato la funzione. + + + + (X) For a string value X, the length(X) function returns the number of characters (not bytes) in X prior to the first NUL character. + (X) La funzione lenght(X) ritorna per una stringa X, il numero di caratteri (non bytes) di X prima del primo carattere NUL. + + + + (X,Y) The like() function is used to implement the "Y LIKE X" expression. + (X,Y) La funzione like(X,Y) è utilizzata per implementare l'espressione "Y LIKE X". + + + + (X,Y,Z) The like() function is used to implement the "Y LIKE X ESCAPE Z" expression. + (X,Y,Z) La funzione like(X,Y,Z) è utilizzata per implementare l'espressione "Y LIKE X ESCAPE Z". + + + + (X) The load_extension(X) function loads SQLite extensions out of the shared library file named X. +Use of this function must be authorized from Preferences. + (X) La funzione load_extension(X) carica l'estensione SQLite da un file di libreria condivisa di nome X. +L'utilizzo di questa funzione dev'essere permesso tramite le Preferenze. + + + + (X,Y) The load_extension(X) function loads SQLite extensions out of the shared library file named X using the entry point Y. +Use of this function must be authorized from Preferences. + (X,Y) La funzione load_extension(X,Y) carica un'estensione SQLite da un file di libreria condivisa di nome X utilizzando il punto d'ingresso Y. +L'utilizzo di questa funzione dev'essere permesso tramite le Preferenze. + + + + (X) The lower(X) function returns a copy of string X with all ASCII characters converted to lower case. + (X) La funzione lower(X) ritorna una copia della stringa X con tutti i caratteri ASCII convertiti in minuscolo. + + + + (X) ltrim(X) removes spaces from the left side of X. + (X) La funzione ltrim(X) rimuove gli spazi dal lato sinistro di X. + + + + (X,Y) The ltrim(X,Y) function returns a string formed by removing any and all characters that appear in Y from the left side of X. + (X,Y) La funzione ltrim(X,Y) ritorna una stringa formata rimuovendo tutti i caratteri che compaiono in Y dal lato sinistro di X. + + + + (X,Y,...) The multi-argument max() function returns the argument with the maximum value, or return NULL if any argument is NULL. + (X,Y,...) La funzione multi-argomento max(X,Y,...) ritorna l'argomento con valore massimo o ritorna NULL se tutti gli argomenti sono NULL. + + + + (X,Y,...) The multi-argument min() function returns the argument with the minimum value. + (X,Y,...) La funzione multi-argomento min(X,Y,...) ritorna l'argomento con valore minore o NULL se tutti gli argomenti sono NULL. + + + + (X,Y) The nullif(X,Y) function returns its first argument if the arguments are different and NULL if the arguments are the same. + (X,Y) La funzione nullif(X,Y) ritorna il primo argomento se gli argomenti sono diversi e NULL se gli argomenti sono uguali. + + + + (FORMAT,...) The printf(FORMAT,...) SQL function works like the sqlite3_mprintf() C-language function and the printf() function from the standard C library. + (FORMAT,...) La funzione SQL printf(FORMAT,...) si comporta come la funzione del linguaggio C sqlite3_mprintf() e la funzione printf() della libreria standard C. + + + + (X) The quote(X) function returns the text of an SQL literal which is the value of its argument suitable for inclusion into an SQL statement. + (X) La funzione quote(X) ritorna il testo di un literale SQL il cui valore può essere incluso in uno statement SQL. + + + + () The random() function returns a pseudo-random integer between -9223372036854775808 and +9223372036854775807. + () La funzione random() ritorna un numero intero pseudo-casuale tra -9223372036854775808 e +9223372036854775807. + + + + (N) The randomblob(N) function return an N-byte blob containing pseudo-random bytes. + (N) La funzione randomblob(N) ritorna un blob di N-bytes contenenti dati pseudo-casuali. + + + + (X,Y,Z) The replace(X,Y,Z) function returns a string formed by substituting string Z for every occurrence of string Y in string X. + (X,Y,Z) La funzione replace(X,Y,Z) ritorna una striga formata sostituendo la stringa Z in ogni occorrenza della stringa Y nella stringa X. + + + + (X) The round(X) function returns a floating-point value X rounded to zero digits to the right of the decimal point. + (X) La funzione round(X) ritorna un valore in virgola mobile X arrotondato a 0 cifre decimali. + + + + (X,Y) The round(X,Y) function returns a floating-point value X rounded to Y digits to the right of the decimal point. + (X,Y) La funzione round(X,Y) ritorna un numero in virgola mobile X arrotondato a Y cifre decimali. + + + + (X) rtrim(X) removes spaces from the right side of X. + (X) La funzione rtrim(X) rimuove gli spazi dalla destra di X. + + + + (X,Y) The rtrim(X,Y) function returns a string formed by removing any and all characters that appear in Y from the right side of X. + (X,Y) La funzione rtrim(X,Y) ritorna una stringa formata rimuovendo tutti i caratteri che compaiono in Y dal lato destro di X. + + + + (X) The soundex(X) function returns a string that is the soundex encoding of the string X. + (X) La funzione soundex(X) ritorna una stringa che rappresenta la codifica soundex della stringa X. + + + + (X,Y) substr(X,Y) returns all characters through the end of the string X beginning with the Y-th. + (X,Y) La funzione substr(X,Y) ritorna tutti i caratteri dalla fine della stringa X iniziando dall'Y-esimo. + + + + (X,Y,Z) The substr(X,Y,Z) function returns a substring of input string X that begins with the Y-th character and which is Z characters long. + (X,Y,Z) La funzione substr(X,Y,Z) ritorna una sotto-stringa di X che inizia dal carattere Y-esimo e lunga Z caratteri. + + + + () The total_changes() function returns the number of row changes caused by INSERT, UPDATE or DELETE statements since the current database connection was opened. + () La funzione total_changes() ritorna il numero di righe modificate da INSERT, UPDATE o DELETE dall'apertura della connessione al database. + + + + (X) trim(X) removes spaces from both ends of X. + (X) La funzione trim(X) rimuove gli spazi da entrambi i lati di X. + + + + (X,Y) The trim(X,Y) function returns a string formed by removing any and all characters that appear in Y from both ends of X. + (X,Y) La funzione trim(X,Y) ritorna una stringa formata rimuovendo tutti i caratteri che compaiono in Y da entrambi i termini di X. + + + + (X) The typeof(X) function returns a string that indicates the datatype of the expression X. + (X) La funzione typeof(X) ritorna una stringa che indica il tipo di dato dell'espressione X. + + + + (X) The unicode(X) function returns the numeric unicode code point corresponding to the first character of the string X. + (X) La funzione unicode(X) ritorna il valore numerico in unicode corrispondente al primo carattere della stringa X. + + + + (X) The upper(X) function returns a copy of input string X in which all lower-case ASCII characters are converted to their upper-case equivalent. + (X) La funzione upper(X) ritorna una copia della stringa X in cui tutti i caratteri minuscoli ASCII sono stati converiti in maiuscolo. + + + + (N) The zeroblob(N) function returns a BLOB consisting of N bytes of 0x00. + (N) La funizione zeroblob(N) ritorna un BLOB di N byte di 0x00. + + + + + + + (timestring,modifier,modifier,...) + (stringa data,modificatore,modificatore,...) + + + + (format,timestring,modifier,modifier,...) + (formato,stringa data-ora,modificatore,modificatore,...) + + + + (X) The avg() function returns the average value of all non-NULL X within a group. + (X) La funzione avg(X) ritorna il valore medio di tutti gli X non-NULL in un gruppo. + + + + (X) The count(X) function returns a count of the number of times that X is not NULL in a group. + (X) La funzione count(X) ritorna il numero di volte che X non è NULL in un gruppo. + + + + (X) The group_concat() function returns a string which is the concatenation of all non-NULL values of X. + (X) La funzione group_concat(X) ritorna una stringa rappresentante la concatenazione di tutti i valori di X non-NULL. + + + + (X,Y) The group_concat() function returns a string which is the concatenation of all non-NULL values of X. If parameter Y is present then it is used as the separator between instances of X. + (X,Y) La funzione group_concat(X,Y) ritorna una stringa rappresentate la concatenazione di tutti i valori di X non-NULL. Se il parametro Y è presente allora è utilizzato come separatore tra le istanze di X. + + + + (X) The max() aggregate function returns the maximum value of all values in the group. + (X) La funzione aggregata max(X) ritorna il valore massimo di tutti i valori nel gruppo. + + + + (X) The min() aggregate function returns the minimum non-NULL value of all values in the group. + (X) La funzione aggregata min(X) ritorna il minore non-NULL tra tutti i valori del gruppo. + + + + + (X) The sum() and total() aggregate functions return sum of all non-NULL values in the group. + (X) Le funzioni aggregate sum(X) e total(X) ritornano la somma di tutti i valori non-NULL nel gruppo. + + + + () The number of the row within the current partition. Rows are numbered starting from 1 in the order defined by the ORDER BY clause in the window definition, or in arbitrary order otherwise. + () Il numero di righe all'interno della partizione corrente. Le righe sono numerate partendo da 1 nell'ordine definito dalla clausula ORDER BY nella finestra definizione, o altrimenti in ordine arbitrario. + + + + () The row_number() of the first peer in each group - the rank of the current row with gaps. If there is no ORDER BY clause, then all rows are considered peers and this function always returns 1. + () Il row_number() del primo peer in ogni gruppo - il rango della riga corrente con intervalli. Se non ci sono clausule ORDER BY, allora tutte le righe sono considerate peer e questa funzione ritorna 1. + + + + () The number of the current row's peer group within its partition - the rank of the current row without gaps. Partitions are numbered starting from 1 in the order defined by the ORDER BY clause in the window definition. If there is no ORDER BY clause, then all rows are considered peers and this function always returns 1. + () Il numero di peer nel gruppo della riga corrente all'interno della sua partizione - il rango della riga corrente senza intervalli. Le partizioni sono numerate a partire da 1 nell'ordine definito dalla clausula ORDER BY nella finestra definizione. Se non ci sono clausule ORDER BY allora tutte le righe sono considerate peer e questa funzione ritorna 1. + + + + () Despite the name, this function always returns a value between 0.0 and 1.0 equal to (rank - 1)/(partition-rows - 1), where rank is the value returned by built-in window function rank() and partition-rows is the total number of rows in the partition. If the partition contains only one row, this function returns 0.0. + () A dispetto del nome, questa funzione ritorna sempre un valore tra 0.0 e 1.0 uguale a (rango - 1)/(righe della partizione - 1), dove rango è il valore ritornato dalla funzione interna rank() e le "righe della partizione" sono il numero di righe nella partizione. Se la partizione contiene solo una riga, questa funzione ritorna 0.0. + + + + () The cumulative distribution. Calculated as row-number/partition-rows, where row-number is the value returned by row_number() for the last peer in the group and partition-rows the number of rows in the partition. + () La distribuzione cumulativa. Calcolata come "numero di righe"/"righe della partizione", dove "numero di righe" è il valore ritornato dalla funzione row_number() per l'utimo peer nel gruppo. + + + + (N) Argument N is handled as an integer. This function divides the partition into N groups as evenly as possible and assigns an integer between 1 and N to each group, in the order defined by the ORDER BY clause, or in arbitrary order otherwise. If necessary, larger groups occur first. This function returns the integer value assigned to the group that the current row is a part of. + (N) L'argomento N è gestito come valore intero. Questa funzione divide la partizione in N gruppi il più uniformemente possibile e assegna un'intero tra 1 e N ad ogni gruppo, nell'ordine definito dalla clausula ORDER BY o altrimenti in ordine arbitrario. Se necessario i gruppi più grandi compariranno per primi. Questa funzione ritorna il valore intero assegnato al gruppo di cui fa parte la riga corrente. + + + + (expr) Returns the result of evaluating expression expr against the previous row in the partition. Or, if there is no previous row (because the current row is the first), NULL. + (expr) Ritorna il risultato della valutazione dell'espressione expr sulla riga precedente della partizione o, se non esiste una riga precedente (perché la riga è la prima), NULL. + + + + (expr,offset) If the offset argument is provided, then it must be a non-negative integer. In this case the value returned is the result of evaluating expr against the row offset rows before the current row within the partition. If offset is 0, then expr is evaluated against the current row. If there is no row offset rows before the current row, NULL is returned. + (expr, offset) Se l'argomento offset viene fornito, allora dev'essere un intero non negativo. In questo caso il valore ritornato è il risultato della valutazione dell'espressione expr sulla riga "offset" posizioni antecedente nella partizione. Se offset è 0 allora expr viene valutata sulla riga corrente. Se non ci sono offset righe antecedenti viene ritornato NULL. + + + + + (expr,offset,default) If default is also provided, then it is returned instead of NULL if the row identified by offset does not exist. + (expr,offset,default) Se viene fornito anche default, allora viene ritornato al posto di NULL se la riga identificata da offset non esiste. + + + + (expr) Returns the result of evaluating expression expr against the next row in the partition. Or, if there is no next row (because the current row is the last), NULL. + (expr) Ritorna il risultato della valutazione dell'espressione expr con la riga successiva nella partizione o, se non c'è una riga successiva (perché la riga corrente è l'utlima) NULL. + + + + (expr,offset) If the offset argument is provided, then it must be a non-negative integer. In this case the value returned is the result of evaluating expr against the row offset rows after the current row within the partition. If offset is 0, then expr is evaluated against the current row. If there is no row offset rows after the current row, NULL is returned. + (expr,offset) Se viene fornito l'argomento offset, dev'essere un intero non negativo. In questo caso il valore ritornato è il risultato della valutazione dell'espressione expr sulla riga "offset" posizioni successiva a quella corrente nella partizione. Se offset è 0, allora expr viene valutata sulla riga corrente. Se non c'è una riga "offset" posizioni successive, NULL viene restituito. + + + + (expr) This built-in window function calculates the window frame for each row in the same way as an aggregate window function. It returns the value of expr evaluated against the first row in the window frame for each row. + (expr) Questa funzione interna calcola la cornice della finestra di ciascuna riga allo stesso modo di una funzione finestra aggregata. Ritorna il valore della valutazione di expr sulla prima riga nella cornice della finestra per ciascuna riga. + + + + (expr) This built-in window function calculates the window frame for each row in the same way as an aggregate window function. It returns the value of expr evaluated against the last row in the window frame for each row. + (expr) Questa funzione interna calcola la cornice della finestra per ciascuna riga allo stesso modo della funzione finestra aggregata. Ritorna il valore dell'espressione expr valutata sull'ultima riga della cornice della finestra per ciascuna riga. + + + + (expr,N) This built-in window function calculates the window frame for each row in the same way as an aggregate window function. It returns the value of expr evaluated against the row N of the window frame. Rows are numbered within the window frame starting from 1 in the order defined by the ORDER BY clause if one is present, or in arbitrary order otherwise. If there is no Nth row in the partition, then NULL is returned. + (expr,N) Questa funzione interna calcola la cornice della finestra per ciascuna riga allo stesso modo della funzione aggregata finestra. Ritorna il valore della valutazione dell'espressione expr sulla riga N della cornice della finestra. Le righe sono numerate dalla cornice della finestra partendo da 1 nell'ordine definito dalla clausula ORDER BY se presente o in modo arbitrario. Se non esiste la riga Nesima nella partizione, viene ritornato NULL. + + + + SqliteTableModel + + + reading rows + leggo le righe + + + + loading... + caricamento... + + + + References %1(%2) +Hold %3Shift and click to jump there + Riferimenti %1(%2) +Tieni premuto %3Shift e clicca per saltare lì + + + + Error changing data: +%1 + Errore nella modifica dei dati: +%1 + + + + retrieving list of columns + recupero la lista delle colonne + + + + Fetching data... + Recupero dati... + + + + Cancel + Annulla + + + + VacuumDialog + + + Compact Database + Compatta Database + + + + Warning: Compacting the database will commit all of your changes. + Attenzione: Compattare il database salverà tutte le tue modifiche. + + + + Please select the databases to co&mpact: + Si prega di selezionare il database da co&mpattare: + + + diff -Nru sqlitebrowser-3.10.100ubuntu1/src/translations/sqlb_ko_KR.ts sqlitebrowser-3.11.1/src/translations/sqlb_ko_KR.ts --- sqlitebrowser-3.10.100ubuntu1/src/translations/sqlb_ko_KR.ts 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/src/translations/sqlb_ko_KR.ts 2019-02-19 23:51:34.000000000 +0000 @@ -16,46 +16,145 @@ - <html><head/><body><p>DB Browser for SQLite is an open source, freeware visual tool used to create, design and edit SQLite database files.</p><p>It is bi-licensed under the Mozilla Public License Version 2, as well as the GNU General Public License Version 3 or later. You can modify or redistribute it under the conditions of these licenses.</p><p>See <a href="http://www.gnu.org/licenses/gpl.html"><span style=" text-decoration: underline; color:#0000ff;">http://www.gnu.org/licenses/gpl.html</span></a> and <a href="https://www.mozilla.org/MPL/2.0/index.txt"><span style=" text-decoration: underline; color:#0000ff;">https://www.mozilla.org/MPL/2.0/index.txt</span></a> for details.</p><p>For more information on this program please visit our website at: <a href="http://sqlitebrowser.org"><span style=" text-decoration: underline; color:#0000ff;">http://sqlitebrowser.org</span></a></p><p><span style=" font-size:small;">This software uses the GPL/LGPL Qt Toolkit from </span><a href="http://qt-project.org/"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://qt-project.org/</span></a><span style=" font-size:small;"><br/>See </span><a href="http://qt-project.org/doc/qt-5/licensing.html"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://qt-project.org/doc/qt-5/licensing.html</span></a><span style=" font-size:small;"> for licensing terms and information.</span></p><p><span style=" font-size:small;">It also uses the Silk icon set by Mark James licensed under a Creative Commons Attribution 2.5 and 3.0 license.<br/>See </span><a href="http://www.famfamfam.com/lab/icons/silk/"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://www.famfamfam.com/lab/icons/silk/</span></a><span style=" font-size:small;"> for details.</span></p></body></html> - <html><head/><body><p>DB Browser for SQLite는 오픈소스, 프리웨어 시각화 툴로 SQLite 데이터베이스 파일을 생성하고, 설계하고 수정할 수 있습니다.</p><p>이 프로그램은 두 가지 라이센스를 따르는데 Mozilla Public License Version 2와 GNU General Public License Version 3 또는 그 이후 버전의 라이센스를 따릅니다. 여러분은 이 라이센스 하에서 수정하거나 재배포 할 수 있습니다.</p><p>자세한 내용은 <a href="http://www.gnu.org/licenses/gpl.html"><span style=" text-decoration: underline; color:#0000ff;">http://www.gnu.org/licenses/gpl.html</span></a> 과 <a href="https://www.mozilla.org/MPL/2.0/index.txt"><span style=" text-decoration: underline; color:#0000ff;">https://www.mozilla.org/MPL/2.0/index.txt</span></a> 를 참고하시기 바랍니다.</p><p>이 프로그램에 대한 추가 정보를 알고 싶으시면 우리 웹사이트에 방문하세요: <a href="http://sqlitebrowser.org"><span style=" text-decoration: underline; color:#0000ff;">http://sqlitebrowser.org</span></a></p><p><span style=" font-size:small;">이 소프트웨어는 </span><a href="http://qt-project.org/"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://qt-project.org/</span></a><span style=" font-size:small;">의 GPL/LGPL Qt Toolkit을 사용합니다.</span><span style=" font-size:small;"><br/>라이센스 조건과 정보는 </span><a href="http://qt-project.org/doc/qt-5/licensing.html"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://qt-project.org/doc/qt-5/licensing.html</span></a><span style=" font-size:small;"> 에서 보실 수 있습니다.</span></p><p><span style=" font-size:small;">또한 이 프로그램은 Mark James가 제작한 실크 아이콘 세트를 Creative Commons Attribution 2.5와 3.0 버전 라이센스 하에서 사용하고 있습니다.<br/>자세한 것은 </span><a href="http://www.famfamfam.com/lab/icons/silk/"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://www.famfamfam.com/lab/icons/silk/</span></a><span style=" font-size:small;"> 를 참고하세요.</span></p></body></html> + <html><head/><body><p>DB Browser for SQLite is an open source, freeware visual tool used to create, design and edit SQLite database files.</p><p>It is bi-licensed under the Mozilla Public License Version 2, as well as the GNU General Public License Version 3 or later. You can modify or redistribute it under the conditions of these licenses.</p><p>See <a href="http://www.gnu.org/licenses/gpl.html">http://www.gnu.org/licenses/gpl.html</a> and <a href="https://www.mozilla.org/MPL/2.0/index.txt">https://www.mozilla.org/MPL/2.0/index.txt</a> for details.</p><p>For more information on this program please visit our website at: <a href="http://sqlitebrowser.org">http://sqlitebrowser.org</a></p><p><span style=" font-size:small;">This software uses the GPL/LGPL Qt Toolkit from </span><a href="http://qt-project.org/"><span style=" font-size:small;">http://qt-project.org/</span></a><span style=" font-size:small;"><br/>See </span><a href="http://qt-project.org/doc/qt-5/licensing.html"><span style=" font-size:small;">http://qt-project.org/doc/qt-5/licensing.html</span></a><span style=" font-size:small;"> for licensing terms and information.</span></p><p><span style=" font-size:small;">It also uses the Silk icon set by Mark James licensed under a Creative Commons Attribution 2.5 and 3.0 license.<br/>See </span><a href="http://www.famfamfam.com/lab/icons/silk/"><span style=" font-size:small;">http://www.famfamfam.com/lab/icons/silk/</span></a><span style=" font-size:small;"> for details.</span></p></body></html> + - + <html><head/><body><p>DB Browser for SQLite is an open source, freeware visual tool used to create, design and edit SQLite database files.</p><p>It is bi-licensed under the Mozilla Public License Version 2, as well as the GNU General Public License Version 3 or later. You can modify or redistribute it under the conditions of these licenses.</p><p>See <a href="http://www.gnu.org/licenses/gpl.html"><span style=" text-decoration: underline; color:#0000ff;">http://www.gnu.org/licenses/gpl.html</span></a> and <a href="https://www.mozilla.org/MPL/2.0/index.txt"><span style=" text-decoration: underline; color:#0000ff;">https://www.mozilla.org/MPL/2.0/index.txt</span></a> for details.</p><p>For more information on this program please visit our website at: <a href="https://sqlitebrowser.org"><span style=" text-decoration: underline; color:#0000ff;">https://sqlitebrowser.org</span></a></p><p><span style=" font-size:small;">This software uses the GPL/LGPL Qt Toolkit from </span><a href="http://qt-project.org/"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://qt-project.org/</span></a><span style=" font-size:small;"><br/>See </span><a href="http://qt-project.org/doc/qt-5/licensing.html"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://qt-project.org/doc/qt-5/licensing.html</span></a><span style=" font-size:small;"> for licensing terms and information.</span></p><p><span style=" font-size:small;">It also uses the Silk icon set by Mark James licensed under a Creative Commons Attribution 2.5 and 3.0 license.<br/>See </span><a href="http://www.famfamfam.com/lab/icons/silk/"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://www.famfamfam.com/lab/icons/silk/</span></a><span style=" font-size:small;"> for details.</span></p></body></html> + <html><head/><body><p>DB Browser for SQLite는 오픈소스, 프리웨어 시각화 툴로 SQLite 데이터베이스 파일을 생성하고, 설계하고 수정할 수 있습니다.</p><p>이 프로그램은 두 가지 라이센스를 따르는데 Mozilla Public License Version 2와 GNU General Public License Version 3 또는 그 이후 버전의 라이센스를 따릅니다. 여러분은 이 라이센스 하에서 수정하거나 재배포 할 수 있습니다.</p><p>자세한 내용은 <a href="http://www.gnu.org/licenses/gpl.html"><span style=" text-decoration: underline; color:#0000ff;">http://www.gnu.org/licenses/gpl.html</span></a> 과 <a href="https://www.mozilla.org/MPL/2.0/index.txt"><span style=" text-decoration: underline; color:#0000ff;">https://www.mozilla.org/MPL/2.0/index.txt</span></a> 를 참고하시기 바랍니다.</p><p>이 프로그램에 대한 추가 정보를 알고 싶으시면 우리 웹사이트에 방문하세요: <a href="https://sqlitebrowser.org"><span style=" text-decoration: underline; color:#0000ff;">https://sqlitebrowser.org</span></a></p><p><span style=" font-size:small;">이 소프트웨어는 </span><a href="http://qt-project.org/"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://qt-project.org/</span></a><span style=" font-size:small;">의 GPL/LGPL Qt Toolkit을 사용합니다.</span><span style=" font-size:small;"><br/>라이센스 조건과 정보는 </span><a href="http://qt-project.org/doc/qt-5/licensing.html"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://qt-project.org/doc/qt-5/licensing.html</span></a><span style=" font-size:small;"> 에서 보실 수 있습니다.</span></p><p><span style=" font-size:small;">또한 이 프로그램은 Mark James가 제작한 실크 아이콘 세트를 Creative Commons Attribution 2.5와 3.0 버전 라이센스 하에서 사용하고 있습니다.<br/>자세한 것은 </span><a href="http://www.famfamfam.com/lab/icons/silk/"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://www.famfamfam.com/lab/icons/silk/</span></a><span style=" font-size:small;"> 를 참고하세요.</span></p></body></html> + + + + (based on SQLite %1) + + + + Version 버전 - + Qt Version Qt 버전 - + SQLCipher Version SQLCipher 버전 - + SQLite Version SQLite 버전 + AddRecordDialog + + + Add New Record + + + + + Enter values for the new record considering constraints. Fields in bold are mandatory. + + + + + In the Value column you can specify the value for the field identified in the Name column. The Type column indicates the type of the field. Default values are displayed in the same style as NULL values. + + + + + Name + + + + + Type + 타입 + + + + Value + + + + + Values to insert. Pre-filled default values are inserted automatically unless they are changed. + + + + + When you edit the values in the upper frame, the SQL query for inserting this new record is shown here. You can edit manually the query before saving. + + + + + <html><head/><body><p><span style=" font-weight:600;">Save</span> will submit the shown SQL statement to the database for inserting the new record.</p><p><span style=" font-weight:600;">Restore Defaults</span> will restore the initial values in the <span style=" font-weight:600;">Value</span> column.</p><p><span style=" font-weight:600;">Cancel</span> will close this dialog without executing the query.</p></body></html> + + + + + Auto-increment + + + + + + Unique constraint + + + + + + Check constraint: %1 + + + + + + Foreign key: %1 + + + + + + Default value: %1 + + + + + + Error adding record. Message from database engine: + +%1 + + + + + Are you sure you want to restore all the entered values to their defaults? + + + + Application - + Usage: %1 [options] [db] 사용법: %1 [옵션] [데이터베이스] - + Possible command line arguments: 사용할 수 있는 커맨드라인 매개변수: - + -h, --help Show command line options -h, --help 커맨드라인 옵션을 보여줍니다 @@ -64,52 +163,71 @@ -s, --sql [file] 데이터베이스 파일을 연 후에 SQL 파일 내용을 실행합니다 - + -s, --sql [file] Execute this SQL file after opening the DB -s, --sql [file] 데이터베이스 파일을 연 후 이 SQL 파일을 실행합니다 - + -t, --table [table] Browse this table after opening the DB -t, --table [table] 데이터베이스 파일을 연 후 이 테이블을 봅니다 - + -q, --quit Exit application after running scripts -q, --quit 스크립트를 실행한 후에 애플리케이션을 종료합니다 - + + -R, --read-only Open database in read-only mode + + + + + -o, --option [group/setting=value] Run application with this setting temporarily set to value + + + + -v, --version Display the current version -v, --version 현재 버전을 표시합니다 - + [file] Open this SQLite database [파일] 지정한 SQLite 데이터베이스 파일을 엽니다 - + + This is DB Browser for SQLite version %1. + DB Browser for SQLite 버전 %1%2. {1.?} + + This is DB Browser for SQLite version %1%2. - DB Browser for SQLite 버전 %1%2. + DB Browser for SQLite 버전 %1%2. - + The -s/--sql option requires an argument -s/--sql 옵션은 실행할 SQL 파일명을 같이 지정해주어야 합니다 - + The file %1 does not exist %1 파일이 존재하지 않습니다 - + The -t/--table option requires an argument -t/--table 옵션의 대상이되는 테이블 명을 써주세요 - + + The -o/--option option requires an argument in the form group/setting=value + + + + Invalid option/non-existant file: %1 잘못된 옵션을 사용하였거나/파일이 존재하지 않습니다: %1 @@ -137,12 +255,12 @@ 페이지 크기(&Z) - + Passphrase 암호 - + Raw key Raw key @@ -151,7 +269,7 @@ 페이지 크기(&S) - + Please set a key to encrypt the database. Note that if you change any of the other, optional, settings you'll need to re-enter them as well every time you open the database file. Leave the password fields empty to disable the encryption. @@ -162,7 +280,7 @@ 암호화 작업은 시간이 좀 걸릴 수 있습니다. 그리고 꼭 여러분의 데이터베이스 백업본을 반드시 만들어두세요! 암호화 작업 이전에 한 저장되지 않은 변경 사항도 반영되니 주의하세요. - + Please enter the key used to encrypt the database. If any of the other settings were altered for this database file you need to provide this information as well. 데이터베이스를 암호화기 위해 사용할 키를 다시 입력해주세요. @@ -192,67 +310,82 @@ 일반 - + Decimal number 숫자 - + Exponent notation 지수 - + Hex blob 이진 데이터 - + Hex number 16진수 - + Apple NSDate to date 애플 NSDate 날짜 - + + Java epoch (milliseconds) to date + + + + Julian day to date 날짜 - + + Unix epoch to local time + + + + + Date as dd/mm/yyyy + + + + Lower case 소문자 - + Octal number 8진수 - + Round number 라운드 수 - + Unix epoch to date 유닉스 시간(타임스탬프) - + Upper case 대문자 - + Windows DATE to date 윈도우 날짜 - + Custom 사용자 지정 @@ -264,38 +397,38 @@ 에러 없음 - + Please specify the database name under which you want to access the attached database 데이터베이스 연결(attach)을 위해 불러올 데이터베이스의 별명을 지정해주세요 - + Invalid file format 잘못된 파일 포맷입니다 - + Do you want to save the changes made to the database file %1? %1 데이터베이스 파일을 생성하기 위해 변경사항을 저장하겠습니까? - + Exporting database to SQL file... 데이터베이스를 SQL 파일로 내보내기 중... - - + + Cancel 취소 - + Executing SQL... SQL 실행중... - + Action cancelled. 실행 취소되었습니다. @@ -310,51 +443,87 @@ 필드이름 변경: %1 테이블을 발견할 수 없습니다. - - + + This database has already been attached. Its schema name is '%1'. + + + + + Do you really want to close this temporary database? All data will be lost. + + + + + The database is currently busy: + + + + + Do you want to abort that other operation? + + + + + + No database file opened + + + + + Error in statement #%1: %2. Aborting execution%3. #%1: %2 구문에 에러가 있어 실행을 중단했습니다%3. - - + + and rolling back 그리고 롤백 합니다 - + + Cannot delete this object + + + + Cannot set data on this object 이 객체에는 데이터를 저장할 수 없습니다 - + + A table with the name '%1' already exists in schema '%2'. + + + + renameColumn: cannot find column %1. 필드이름 변경: %1 필드를 발견할 수 없습니다. - + renameColumn: creating savepoint failed. DB says: %1 필드이름 변경: 세이브포인트를 생성하는데 실패했습니다. 데이터베이스 메시지: %1 - + renameColumn: creating new table failed. DB says: %1 필드이름 변경: 새 테이블을 생성하는데 실패했습니다. 데이터베이스 메시지: %1 - + renameColumn: copying data to new table failed. DB says: %1 필드이름 변경: 새 테이블로 데이터를 복사하는데 실패했습니다. 데이터베이스 메시지: %1 - + renameColumn: deleting old table failed. DB says: %1 필드이름 변경: 이전 테이블을 삭제하는데 실패했습니다. 데이터베이스 메시지: %1 - + Restoring some of the objects associated with this table failed. This is most likely because some column names changed. Here's the SQL statement which you might want to fix and execute manually: @@ -363,24 +532,34 @@ - + renameColumn: releasing savepoint failed. DB says: %1 필드이름 변경: 세이브포인트를 해제하는데 실패했습니다. 데이터베이스 메시지: %1 - + Error renaming table '%1' to '%2'.Message from database engine: %3 테이블명을 '%1'에서 '%2'로 변경하는데 에러가 발생했습니다. 데이베이스 메시지: %3 - + ... <string can not be logged, contains binary data> ... ... <문자열이 바이너리 데이터를 포함하여 로깅될 수 없습니다.> ... - + + could not get list of databases: %1 + + + + + Error loading extension: %1 + 확장기능을 불러오기 에러: %1 + + + could not get column information 컬럼(열) 정보를 가져올 수 없습니다 @@ -389,7 +568,7 @@ %1 은(는) 알 수 없는 객체 타입입니다 - + could not get list of db objects: %1, %2 데이터베이스 객체 목록을 가져올 수 없습니다: %1, %2 @@ -398,22 +577,22 @@ 타입을 얻어올 수 없습니다 - + didn't receive any output from pragma %1 pragma %1 에서 출력결과를 받아올 수 없습니다 - + could not execute pragma command: %1, %2 pragma 명령을 실행할 수 없습니다: %1, %2 - + Error setting pragma %1 to %2: %3 pragma 세팅을 %1에서 %2로 변경하는데 에러: %3 - + File not found. 파일이 없습니다. @@ -421,52 +600,66 @@ DbStructureModel - + Name 이름 - + Object 객체 - + Type 타입 - + Schema 스키마 - Browsables (%1) - 찾아보기 (%1) + 찾아보기 (%1) + + + + Database + + + + + Browsables + - + All 모두선택 - + + Temporary + + + + Tables (%1) 테이블 (%1) - + Indices (%1) 인덱스 (%1) - + Views (%1) 뷰 (%1) - + Triggers (%1) 트리거 (%1) @@ -484,63 +677,179 @@ 모드: - - + + This is the list of supported modes for the cell editor. Choose a mode for viewing or editing the data of the current cell. + + + + Image 이미지 + + JSON + + + + + XML + + + + + + Automatically adjust the editor mode to the loaded data type + + + - Import text - 문자열 가져오기 + This checkable button enables or disables the automatic switching of the editor mode. When a new cell is selected or new data is imported and the automatic switching is enabled, the mode adjusts to the detected data type. You can then change the editor mode manually. If you want to keep this manually switched mode while moving through the cells, switch the button off. + + Auto-switch + + + + + + Auto-format: pretty print on loading, compact on saving. + + + + + When enabled, the auto-format feature formats the data on loading, breaking the text in lines and indenting it for maximum readability. On data saving, the auto-format feature compacts the data removing end of lines, and unnecessary whitespace. + + + + + Autoformat + + + + + Import from file + + + + + Opens a file dialog used to import any kind of data to this database cell. + + + + + Export to file + + + + + Opens a file dialog used to export the contents of this database cell to a file. + + + + + + Print... + + + + + Open preview dialog for printing displayed image + + + + + + Ctrl+P + Ctrl+P + + + + Open preview dialog for printing displayed text + + + + + Copy Hex and ASCII + + + + + Copy selected hexadecimal and ASCII columns to the clipboard + + + + + Ctrl+Shift+C + + + + Import text + 문자열 가져오기 + + Opens a file dialog used to import text to this database cell. - 이 데이터베이스 데이터 값으로 문자열을 가져오기 위하여 파일 대화상자를 엽니다. + 이 데이터베이스 데이터 값으로 문자열을 가져오기 위하여 파일 대화상자를 엽니다. - + &Import 가져오기(&I) - Export text - 문자열 내보내기 + 문자열 내보내기 - Opens a file dialog used to export the contents of this database cell to a text file. - 이 데이터베이스 데이터 값을 문자열 파일로 내보내기 위하여 대화상자를 엽니다. + 이 데이터베이스 데이터 값을 문자열 파일로 내보내기 위하여 대화상자를 엽니다. - + &Export 내보내기(&E) - + Set this cell to NULL 셀을 NULL 만들기 - + Set as &NULL &NULL로 만들기 - + + This editor mode lets you edit JSON or XML data with syntax highlighting, automatic formatting and validation before saving. + +Errors are indicated with a red squiggle underline. + + + + + Apply data to cell + + + + + This button saves the changes performed in the cell editor to the database cell. + + + + Apply 적용 - + Text 문자열 - + Binary 바이너리 @@ -549,7 +858,7 @@ 데이터 값 지우기 - + Erases the contents of the cell 데이터 값을 삭제합니다 @@ -562,78 +871,176 @@ <html><head/><body><p><span style=" font-weight:600; color:#c00000;">주의: 텍스트 모드에서 바이너리 콘텐츠를 수정하면 데이터가 깨질 수 있습니다!</span></p></body></html> - + This area displays information about the data present in this database cell 이 영역은 이 데이터베이스 데이터 값에 대한 정보를 보여줍니다 - + Type of data currently in cell 데이터 값 크기 - + Size of data currently in table 테이블에서 현재 데이터 크기 - Choose a file - 파일을 선택하세요 + 파일을 선택하세요 - Text files(*.txt);;Image files(%1);;All files(*) - 문자열 파일(*.txt);;이미지 파일(%1);;모든 파일(*) + 문자열 파일(*.txt);;이미지 파일(%1);;모든 파일(*) - + Choose a filename to export data 내보내기 할 데이터의 파일이름을 선택하세요 - Text files(*.txt);;All files(*) - 문자열 파일(*.txt);;모든 파일(*) + 문자열 파일(*.txt);;모든 파일(*) - Image data can't be viewed with the text editor - 텍스트 편집기에서는 이미지 데이터를 볼 수 없습니다 + 텍스트 편집기에서는 이미지 데이터를 볼 수 없습니다 - Binary data can't be viewed with the text editor - 텍스트 편집기에서는 바이너리 데이터를 볼 수 없습니다 + 텍스트 편집기에서는 바이너리 데이터를 볼 수 없습니다 + + + + + Image data can't be viewed in this mode. + + + + + + Try switching to Image or Binary mode. + + + + + + Binary data can't be viewed in this mode. + + + + + + Try switching to Binary mode. + + + + + + + + Text files (*.txt) + + + + + + + JSON files (*.json) + + + + + + + + XML files (*.xml) + + + + + + Image files (%1) + + + + + + + Binary files (*.bin) + + + + + + All files (*) + + + + + Choose a file to import + 가져올 파일을 고르세요 - + + %1 Image + + + + + SVG files (*.svg) + + + + + + Hex dump files (*.txt) + + + + + Invalid data for this mode + + + + + The cell contains invalid %1 data. Reason: %2. Do you really want to apply it to the cell? + + + + Type of data currently in cell: %1 Image 현재 데이터 타입: %1 이미지 - + %1x%2 pixel(s) %1x%2 픽셀 - + Type of data currently in cell: NULL 현재 데이터 타입: 널 + + Type of data currently in cell: Valid JSON + + + Type of data currently in cell: Null 현재 데이터 타입: 널 - - + + Type of data currently in cell: Text / Numeric 현재 데이터 타입: 문자열 / 숫자 - - + + + %n char(s) %n 문자 @@ -648,13 +1055,13 @@ %1x%2 픽셀 - + Type of data currently in cell: Binary 현재 데이터 타입: 바이너리 - - + + %n byte(s) %n 바이트 @@ -740,13 +1147,13 @@ 인덱스 컬럼 - + Deleting the old index failed: %1 이전 인덱스를 삭제하는데 실패했습니다: %1 - + Creating the index failed: %1 인덱스 생성에 실패했습니다: @@ -772,134 +1179,141 @@ + Database schema + + + + Make this a 'WITHOUT rowid' table. Setting this flag requires a field of type INTEGER with the primary key flag set and the auto increment flag unset. 이 테이블을 'rowid가 없는' 테이블로 생성합니다. 이 설정을 사용하려면 주 키(Primary Key)로 설정되고 자동 증가(Auto Increment)가 해제된 INTEGER 타입의 필드 하나가 필요합니다. - + Without Rowid Rowid 필드 없음 - Set this to create a temporary table that is deleted when closing the database. - 데이터베이스를 닫을 때 삭제되는 임시 테이블을 만들기위해서는 이 값을 설정하세요. + 데이터베이스를 닫을 때 삭제되는 임시 테이블을 만들기위해서는 이 값을 설정하세요. - Temporary table - 임시 테이블 + 임시 테이블 - + Fields 필드 - + Add field 필드 추가 - + Remove field 필드 삭제 - + Move field up 필드를 위로 올리기 - + Move field down 필드를 아래로 내리기 - + Name 필드명 - + Type 타입 - - + + NN + + + + Not null Not null - + PK PK - + Primary key 주 키(Primary key) - + AI AI - + Autoincrement 자동증가(Autoincrement) - + U U - + Unique 유니크(Unique) - + Default 기본값 - + Default value 기본값 - + Check 제약 - + Check constraint 제약조건(Check constraint) - + Foreign Key 외래키 - + <html><head/><body><p><span style=" font-weight:600; color:#ff0000;">Warning: </span>There is something with this table definition that our parser doesn't fully understand. Modifying and saving this table might result in problems.</p></body></html> <html><head/><body><p><span style=" font-weight:600; color:#ff0000;">Warning: </span>이 테이블 정의 중에 파서가 이해할 수 없는 부분이 있습니다. 이 테이블을 수정하거나 저장하면 문제가 생길 수 있습니다.</p></body></html> - + Error creating table. Message from database engine: %1 테이블 생성 에러. 데이터베이스 메시지: %1 - + There already is a field with that name. Please rename it first or choose a different name for this field. 이미 다른 필드에서 사용중인 이름입니다. 다른 이름을 사용하거나 사용중인 필드 이름을 바꾸세요 @@ -908,37 +1322,42 @@ 이 컬럼은 %1 테이블에서 외래키로 사용중이므로 이름을 변경할 수 없습니다. - + This column is referenced in a foreign key in table %1 and thus its name cannot be changed. 이 필드는 테이블 %1 에 있는 외래키에 참조되어 있기 때문에 이름을 변경할 수 없습니다. - + There is at least one row with this field set to NULL. This makes it impossible to set this flag. Please change the table data first. 이 필드 값이 NULL로 되어있는는 레코드가 최소한 하나 이상 존재합니다. 이러한 상태에서는 변경이 불가능하니 테이블의 데이터를 먼저 수정해서 NULL 값을 삭제주세요. - + There is at least one row with a non-integer value in this field. This makes it impossible to set the AI flag. Please change the table data first. 이 필드 값이 숫자가 아닌 값으로 되어있는는 레코드가 최소한 하나 이상 존재합니다. 이러한 상태에서는 변경이 불가능하니 테이블의 데이터 값을 먼저 변경해주세요. - + Column '%1' has no unique data. 컬럼 '%1'은(는) 유니크 데이터가 없습니다. - + Setting the rowid column for the table failed. Error message: %1 테이블의 rowid 필드를 지정하는데 실패했습니다. 에러 메시지: - + + Changing the table schema failed. Error message: +%1 + + + Setting the temporary flag for the table failed. Error message: %1 - 테이블에 임시 플래그를 지정하는데 실패했습니다. 에러 메시지: + 테이블에 임시 플래그를 지정하는데 실패했습니다. 에러 메시지: Column `%1` has no unique data. @@ -947,26 +1366,26 @@ - + This makes it impossible to set this flag. Please change the table data first. 이러한 상태에서는 변경이 불가능하니 테이블의 데이터 값을 먼저 변경해주세요. - + Modifying this column failed. Error returned from database: %1 이 필드를 수정하는데 실패했습니다. 데이터베이스가 반환된 에러: %1 - + Are you sure you want to delete the field '%1'? All data currently stored in this field will be lost. 정말로 '%1' 필드를 삭제하시려는 건가요? 이 필드에 저장된 모든 데이터가 같이 삭제됩니다. - + Please add a field which meets the following criteria before setting the without rowid flag: - Primary key flag set - Auto increment disabled @@ -1072,44 +1491,54 @@ 프린트하기 좋은 스타일 - - + + Could not open output file: %1 내보낸 파일을 열 수 없습니다: %1 - - + + Choose a filename to export data 데이터를 내보낼 파일 이름을 정하세요 - + Text files(*.csv *.txt) 문자열 파일(*.csv *.txt) - + Export data as JSON JSON으로 내보내기 - + + exporting CSV + + + + + exporting JSON + + + + Text files(*.json *.js *.txt) 텍스트 파일(*.json *.js *.txt) - + Please select at least 1 table. 최소한 테이블 1개는 선택하세요. - + Choose a directory 디렉토리를 선택하세요 - + Export completed. 내보내기가 완료되었습니다. @@ -1185,32 +1614,61 @@ 스키마만 내보내기 - Please select at least 1 table. - 최소한 1 개의 테이블을 . + 최소한 1 개의 테이블을 . + + + + Please select at least one table. + - + Choose a filename to export 내보내기 할 파일명을 고르세요 - + Text files(*.sql *.txt) 텍스트 파일(*.sql *.txt) - + Export completed. 내보내기가 완료되었습니다. - + Export cancelled or failed. 내보내기가 취소되었거나 실패했습니다. + ExtendedScintilla + + + + Ctrl+H + + + + + + Ctrl+P + Ctrl+P + + + + Find and Replace... + + + + + Print... + + + + ExtendedTableWidget The content of clipboard is bigger than the range selected. @@ -1218,44 +1676,367 @@ 클립보드의 내용이 선택범위보다 큽니다. 그래도 추가하시겠습니까? - - Set to NULL - NULL로 변경하기 + + Use as Exact Filter + - - Copy - 복사 + + Containing + - - Paste - 붙여넣기 + + Not equal to + - - The content of the clipboard is bigger than the range selected. -Do you want to insert it anyway? - 클립보드의 내용이 선택한 범위보다 큽니다. 어쨌든 추가할까요? + + Greater than + - - - FileDialog - SQLite database files (*.db *.sqlite *.sqlite3 *.db3);;All files (*) - SQLite 데이터베이스 파일(*.db *.sqlite *.sqlite3 *.db3);;모든 파일 (*) + + Less than + - - - FilterLineEdit - - Filter - 필터 + + Greater or equal + - - - ForeignKeyEditor + + + Less or equal + + + + + Between this and... + + + + + Set to NULL + NULL로 변경하기 + + + + Copy + 복사 + + + + Copy with Headers + + + + + Copy as SQL + + + + + Paste + 붙여넣기 + + + + Print... + + + + + Use in Filter Expression + + + + + Alt+Del + + + + + Ctrl+Shift+C + + + + + Ctrl+Alt+C + + + + + The content of the clipboard is bigger than the range selected. +Do you want to insert it anyway? + 클립보드의 내용이 선택한 범위보다 큽니다. 어쨌든 추가할까요? + + + + FileDialog + + SQLite database files (*.db *.sqlite *.sqlite3 *.db3);;All files (*) + SQLite 데이터베이스 파일(*.db *.sqlite *.sqlite3 *.db3);;모든 파일 (*) + + + + FileExtensionManager + + + File Extension Manager + + + + + &Up + + + + + &Down + + + + + &Add + + + + + &Remove + + + + + + Description + + + + + Extensions + + + + + *.extension + + + + + FilterLineEdit + + + Filter + 필터 + + + + These input fields allow you to perform quick filters in the currently selected table. +By default, the rows containing the input text are filtered out. +The following operators are also supported: +% Wildcard +> Greater than +< Less than +>= Equal to or greater +<= Equal to or less += Equal to: exact match +<> Unequal: exact inverse match +x~y Range: values between x and y + + + + + Set Filter Expression + + + + + What's This? + 이 프로그램은? + + + + Is NULL + + + + + Is not NULL + + + + + Is empty + + + + + Is not empty + + + + + Equal to... + + + + + Not equal to... + + + + + Greater than... + + + + + Less than... + + + + + Greater or equal... + + + + + Less or equal... + + + + + In range... + + + + + FindReplaceDialog + + + Find and Replace + + + + + Fi&nd text: + + + + + Re&place with: + + + + + Match &exact case + + + + + Match &only whole words + + + + + When enabled, the search continues from the other end when it reaches one end of the page + + + + + &Wrap around + + + + + When set, the search goes backwards from cursor position, otherwise it goes forward + + + + + Search &backwards + + + + + <html><head/><body><p>When checked, the pattern to find is interpreted as a UNIX regular expression. See <a href="https://en.wikibooks.org/wiki/Regular_Expressions">Regular Expression in Wikibooks</a>.</p></body></html> + + + + + Use regular e&xpressions + + + + + Find the next occurrence from the cursor position and in the direction set by "Search backwards" + + + + + &Find Next + + + + + &Replace + + + + + Highlight all the occurrences of the text in the page + + + + + F&ind All + + + + + Replace all the occurrences of the text in the page + + + + + Replace &All + + + + + The searched text was not found + + + + + + The searched text was not found. + + + + + The searched text was found one time. + + + + + The searched text was found %1 times. + + + + + The searched text was replaced one time. + + + + + The searched text was replaced %1 times. + + + + + ForeignKeyEditor &Reset @@ -1275,9 +2056,13 @@ CSV 파일 가져오기 - &Table name - 테이블 이름(&T) + 테이블 이름(&T) + + + + Table na&me + @@ -1301,7 +2086,7 @@ - + Tab @@ -1363,58 +2148,113 @@ 테이블 나누기 + + Advanced + 고급 + + + + When importing an empty value from the CSV file into an existing table with a default value for this column, that default value is inserted. Activate this option to insert an empty value instead. + + + + + Ignore default &values + + + - + Activate this option to stop the import when trying to import an empty value into a NOT NULL column without a default value. + + + + + Fail on missing values + + + + + Disable data type detection + + + + + Disable the automatic data type detection when creating a new table. + + + + + Deselect All 모두선택 해제 - + Match Similar 비슷한거 찾기 - + Select All 모두 선택 - Inserting data... - 데이터 추가하는 중... + 데이터 추가하는 중... - Cancel - 취소 + 취소 - There is already a table of that name and an import into an existing table is only possible if the number of columns match. - 가져오려는 테이블의 이름이 같고 필드의 수가 같은 경우에만 가능합니다. + 가져오려는 테이블의 이름이 같고 필드의 수가 같은 경우에만 가능합니다. - There is already a table of that name. Do you want to import the data into it? - 같은 이름의 테이블이 이미 존재합니다. 데이터만이라도 가져올까요? + 같은 이름의 테이블이 이미 존재합니다. 데이터만이라도 가져올까요? + + + + Import completed + 가져오기가 완료되었습니다 + + + + There is already a table named '%1' and an import into an existing table is only possible if the number of columns match. + - + + There is already a table named '%1'. Do you want to import the data into it? + + + + Creating restore point failed: %1 복원 포인트를 생성하는데 실패했습니다: %1 - + Creating the table failed: %1 테이블 생성에 실패했습니다: %1 - + + importing CSV + + + + + Importing the file '%1' took %2ms. Of this %3ms were spent in the row function. + + + Missing field for record %1 - 레코드에 %1 필드가 빠져있습니다 + 레코드에 %1 필드가 빠져있습니다 - + Inserting row failed: %1 행 추가에 실패했습니다: %1 @@ -1431,8 +2271,7 @@ 데이터베이스 구조(&S) - - + toolBar1 toolBar1 @@ -1445,62 +2284,59 @@ 테이블: - + Select a table to browse data 보려는 데이터가 있는 테이블을 선택하세요 - + Use this list to select a table to be displayed in the database view 리스트에서 테이블을 선택하면 데이터베이스 뷰에서 볼 수 있습니다 - Refresh the data in the selected table. - 선택된 테이블의 데이터를 다시 불러옵니다. + 선택된 테이블의 데이터를 다시 불러옵니다. - + This button refreshes the data in the currently selected table. 이 버튼은 현재 선택된 테이블의 데이터를 다시 불러옵니다. - + Scroll one page upwards 한 페이지 위로 스크롤합니다. - + <html><head/><body><p>Clicking this button navigates one page of records upwards in the table view above.</p></body></html> <html><head/><body><p>위 테이블 뷰에서 레코드를 한 페이지 앞으로 가려면 이 버튼을 클릭하세요.</p></body></html> - + Scroll one page downwards 한 페이지 아래로 스크롤합니다. - + <html><head/><body><p>Clicking this button navigates one page of records downwards in the table view above.</p></body></html> <html><head/><body><p>위 테이블 뷰에서 레코드를 한 페이지 뒤로 가려면 이 버튼을 클릭하세요.</p></body></html> - SQLCipher &FAQ... - SQLCipher &FAQ... + SQLCipher &FAQ... - + Opens the SQLCipher FAQ in a browser window SQLCipher FAQ를 봅니다 - Table(s) to JSON... - 테이블을 JSON으로 내보내기... + 테이블을 JSON으로 내보내기... - + Export one or more table(s) to a JSON file 테이블을 JSON 파일로 내보냅니다 @@ -1509,72 +2345,71 @@ 원격 저장하기 - + Refresh 새로고침 - + F5 F5 - + Clear all filters 모든 필터 지우기 - + &Table: 테이블(&T): - + Insert a new record in the current table 현재 테이블에 새 레코드를 추가합니다 - This button creates a new, empty record in the database - 이 버튼은 새로운 비어있는 레코드를 데이터베이스에 생성합니다 + 이 버튼은 새로운 비어있는 레코드를 데이터베이스에 생성합니다 - + + New Record 새 레코드 - + Delete the current record 현재 레코드 삭제하기 - This button deletes the record currently selected in the database - 이 버튼은 데이터베이스에서 현재 선택되어있는 레코드를 삭제합니다 + 이 버튼은 데이터베이스에서 현재 선택되어있는 레코드를 삭제합니다 - + + Delete Record 레코드 삭제 - This is the database view. You can double-click any record to edit its contents in the cell editor window. - 여기는 데이터베이스 뷰입니다. 레코드를 더블클릭하면 편집기창에서 값을 수정할 수 있습니다. + 여기는 데이터베이스 뷰입니다. 레코드를 더블클릭하면 편집기창에서 값을 수정할 수 있습니다. - + <html><head/><body><p>Scroll to the beginning</p></body></html> <html><head/><body><p>첫 페이지로 갑니다.</p></body></html> - + <html><head/><body><p>Clicking this button navigates to the beginning in the table view above.</p></body></html> <html><head/><body><p>테이블 뷰 맨 위로 가기 위해서는 버튼을 클릭하세요.</p></body></html> - + |< |< @@ -1587,12 +2422,12 @@ <html><head/><body><p>테이블 뷰에서 100 레코드 위로 스크롤하려면 이 버튼을 클릭하세요.</p></body></html> - + < < - + 0 - 0 of 0 0 - 0 of 0 @@ -1605,12 +2440,12 @@ <html><head/><body><p>테이블뷰에서 100 레코드 아래로 스크롤하려면 이 버튼을 클릭하세요.</p></body></html> - + > > - + Scroll to the end <html><head/><body><p>마지막 페이지로 갑니다.</p></body></html> @@ -1619,37 +2454,37 @@ <html><head/><body><p>테이블 뷰 맨 아래로 가기 위해서는 이 버튼을 클릭하세요.</p></body></html> - + >| >| - + <html><head/><body><p>Click here to jump to the specified record</p></body></html> <html><head/><body><p>특정 레코드로 점프하려면 여기를 클릭하세요</p></body></html> - + <html><head/><body><p>This button is used to navigate to the record number specified in the Go to area.</p></body></html> <html><head/><body><p>이 버튼은 특정 위치의 레코드 넘버로 가기 위해서 사용합니다.</p></body></html> - + Go to: 특정 레코드 행으로 가기: - + Enter record number to browse 레코드 행 번호를 입력하세요 - + Type a record number in this area and click the Go to: button to display the record in the database view 레코드 행번호를 입력하고 '특정 레코드 행으로 가기:' 버튼을 클릭하면 데이터베이스 뷰에 레코드가 표시됩니다 - + 1 1 @@ -1658,176 +2493,141 @@ 프라그마 수정(&P) - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_auto_vacuum"><span style=" text-decoration: underline; color:#0000ff;">Auto Vacuum</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_auto_vacuum"><span style=" text-decoration: underline; color:#0000ff;">자동 정리(Auto Vacuum)</span></a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_auto_vacuum"><span style=" text-decoration: underline; color:#0000ff;">자동 정리(Auto Vacuum)</span></a></p></body></html> - None - 사용하지 않음 + 사용하지 않음 - - Full - 모두(Vacuum Full) + 모두(Vacuum Full) - Incremental - 증분(Incremental) + 증분(Incremental) - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_automatic_index"><span style=" text-decoration: underline; color:#0000ff;">Automatic Index</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_automatic_index"><span style=" text-decoration: underline; color:#0000ff;">자동 인덱스</span></a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_automatic_index"><span style=" text-decoration: underline; color:#0000ff;">자동 인덱스</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_checkpoint_fullfsync"><span style=" text-decoration: underline; color:#0000ff;">Checkpoint Full FSYNC</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_checkpoint_fullfsync"><span style=" text-decoration: underline; color:#0000ff;">체크포인트 Full FSYNC</span></a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_checkpoint_fullfsync"><span style=" text-decoration: underline; color:#0000ff;">체크포인트 Full FSYNC</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_foreign_keys"><span style=" text-decoration: underline; color:#0000ff;">Foreign Keys</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_foreign_keys"><span style=" text-decoration: underline; color:#0000ff;">외래키</span></a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_foreign_keys"><span style=" text-decoration: underline; color:#0000ff;">외래키</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_fullfsync"><span style=" text-decoration: underline; color:#0000ff;">Full FSYNC</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_fullfsync"><span style=" text-decoration: underline; color:#0000ff;">Full FSYNC</span></a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_fullfsync"><span style=" text-decoration: underline; color:#0000ff;">Full FSYNC</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_ignore_check_constraints"><span style=" text-decoration: underline; color:#0000ff;">Ignore Check Constraints</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_ignore_check_constraints"><span style=" text-decoration: underline; color:#0000ff;">제약조건 무시</span></a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_ignore_check_constraints"><span style=" text-decoration: underline; color:#0000ff;">제약조건 무시</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_journal_mode"><span style=" text-decoration: underline; color:#0000ff;">Journal Mode</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_journal_mode"><span style=" text-decoration: underline; color:#0000ff;">저널 모드</span></a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_journal_mode"><span style=" text-decoration: underline; color:#0000ff;">저널 모드</span></a></p></body></html> - Delete - 삭제 + 삭제 - Truncate - 비우기 + 비우기 - Persist - Persist + Persist - - Memory - 메모리 + 메모리 - WAL - WAL + WAL - - Off - 사용안함 + 사용안함 - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_journal_size_limit"><span style=" text-decoration: underline; color:#0000ff;">Journal Size Limit</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_journal_mode"><span style=" text-decoration: underline; color:#0000ff;">저널 크기 제한</span></a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_journal_mode"><span style=" text-decoration: underline; color:#0000ff;">저널 크기 제한</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_locking_mode"><span style=" text-decoration: underline; color:#0000ff;">Locking Mode</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_locking_mode"><span style=" text-decoration: underline; color:#0000ff;">잠금(Locking) 모드</span></a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_locking_mode"><span style=" text-decoration: underline; color:#0000ff;">잠금(Locking) 모드</span></a></p></body></html> - - Normal - 일반 + 일반 - Exclusive - 독점(Exclusive) + 독점(Exclusive) - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_max_page_count"><span style=" text-decoration: underline; color:#0000ff;">Max Page Count</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_max_page_count"><span style=" text-decoration: underline; color:#0000ff;">최대 페이지 수</span></a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_max_page_count"><span style=" text-decoration: underline; color:#0000ff;">최대 페이지 수</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_page_size"><span style=" text-decoration: underline; color:#0000ff;">Page Size</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_page_size"><span style=" text-decoration: underline; color:#0000ff;">페이지 크기</span></a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_page_size"><span style=" text-decoration: underline; color:#0000ff;">페이지 크기</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_recursive_triggers"><span style=" text-decoration: underline; color:#0000ff;">Recursive Triggers</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_recursive_triggers"><span style=" text-decoration: underline; color:#0000ff;">재귀 트리거</span></a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_recursive_triggers"><span style=" text-decoration: underline; color:#0000ff;">재귀 트리거</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_secure_delete"><span style=" text-decoration: underline; color:#0000ff;">Secure Delete</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_secure_delete"><span style=" text-decoration: underline; color:#0000ff;">보안(Secure) 삭제</span></a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_secure_delete"><span style=" text-decoration: underline; color:#0000ff;">보안(Secure) 삭제</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_synchronous"><span style=" text-decoration: underline; color:#0000ff;">Synchronous</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_synchronous"><span style=" text-decoration: underline; color:#0000ff;">동기화(Synchronous)</span></a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_synchronous"><span style=" text-decoration: underline; color:#0000ff;">동기화(Synchronous)</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_temp_store"><span style=" text-decoration: underline; color:#0000ff;">Temp Store</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_temp_store"><span style=" text-decoration: underline; color:#0000ff;">임시 저장소(Temp Store)</span></a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_temp_store"><span style=" text-decoration: underline; color:#0000ff;">임시 저장소(Temp Store)</span></a></p></body></html> - Default - 기본 + 기본 - File - 파일 + 파일 - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_user_version"><span style=" text-decoration: underline; color:#0000ff;">User Version</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_user_version"><span style=" text-decoration: underline; color:#0000ff;">사용자 버전</span></a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_user_version"><span style=" text-decoration: underline; color:#0000ff;">사용자 버전</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_wal_autocheckpoint"><span style=" text-decoration: underline; color:#0000ff;">WAL Auto Checkpoint</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_wal_autocheckpoint"><span style=" text-decoration: underline; color:#0000ff;">WAL 자동 체크포인트</span></a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_wal_autocheckpoint"><span style=" text-decoration: underline; color:#0000ff;">WAL 자동 체크포인트</span></a></p></body></html> - &Open Database Read Only... - 읽기 전용으로 데이터베이스 열기(&O)... + 읽기 전용으로 데이터베이스 열기(&O)... - + Open an existing database file in read only mode 읽기 전용 모드로 존재하는 데이터베이스 파일을 엽니다 - + Unlock view editing 뷰 수정 락 해제하기 - + This unlocks the current view for editing. However, you will need appropriate triggers for editing. 수정을 위하여 현재 뷰의 락을 해제합니다. 하지만 수정을 위해서는 적절한 트리거가 필요할 것입니다. @@ -1836,17 +2636,17 @@ SQL 실행하기(&X) - + &File 파일(&F) - + &Import 가져오기(&I) - + &Export 내보내기(&E) @@ -1855,119 +2655,143 @@ 원격 - + &Edit 편집(&E) - + &View 뷰(&V) - + &Help 도움말(&H) - + + &Tools + + + + DB Toolbar DB 툴바 - + Edit Database &Cell 데이터베이스 셀 수정하기(&C) - + + This button clears the contents of the SQL logs + + + + + This panel lets you examine a log of all SQL commands issued by the application or by yourself + + + + DB Sche&ma DB 스키마 - + + This is the structure of the opened database. +You can drag multiple object names from the Name column and drop them into the SQL editor and you can adjust the properties of the dropped names using the context menu. This would help you in composing SQL statements. +You can drag SQL statements from the Schema column and drop them into the SQL editor or into other applications. + + + + + &Remote 원격 - - Execute SQL [F5, Ctrl+Return, Ctrl+R] - SQL 실행하기 [F5, Ctrl+Return, Ctrl+R] + Execute SQL + SQL 실행하기 - &Load extension - 확장기능 불러오기(&L) + 확장기능 불러오기(&L) + + + + Execute current line + 현재 행 실행하기 - - Execute current line [Shift+F5] - 현재 행 실행하기 [Shift+F5] + + This button executes the SQL statement present in the current editor line + - + Shift+F5 Shift+F5 - Sa&ve Project - 프로젝트 저장하기(&V) + 프로젝트 저장하기(&V) - Open &Project - 프로젝트 열기(&P) + 프로젝트 열기(&P) - &Set Encryption - 암호화하기(&S) + 암호화하기(&S) - + Edit display format 표시 형식 변경하기 - + Edit the display format of the data in this column 이 컬럼에 있는 데이터의 표시 형식을 수정합니다 - + Show rowid column 컬럼의 rowid 표시하기 - + Toggle the visibility of the rowid column rowid 컬럼을 표시하거나 감춥니다 - - + + Set encoding 인코딩 지정하기 - + Change the encoding of the text in the table cells 테이블 셀 안의 텍스트 인코딩을 변경합니다 - + Set encoding for all tables 모든 테이블의 인코딩 지정하기 - + Change the default encoding assumed for all tables in the database 데이터베이스 안에 있는 모든 테이블의 기본 인코딩을 변경합니다 + Duplicate record - 레코드 복제하기 + 레코드 복제하기 SQL Log @@ -1978,17 +2802,17 @@ SQL 보기(&S) by - + User 사용자 - + Application 애플리케이션 - + &Clear 지우기(&C) @@ -2113,56 +2937,66 @@ DB 스키마 - + &New Database... 새 데이터베이스(&N)... - - + + Create a new database file 새 데이터베이스 파일을 생성합니다 - + This option is used to create a new database file. 이 옵션은 새 데이터베이스 파일을 생성하려고 할 때 사용합니다. - + Ctrl+N Ctrl+N - + + &Open Database... 데이터베이스 열기(&O)... - - - + + + + + Open an existing database file 기존 데이터베이스 파일을 엽니다 - - + + + This option is used to open an existing database file. 이 옵션은 기존 데이터베이스 파일을 열 때 사용합니다. - + + Ctrl+O Ctrl+O - + &Close Database 데이터베이스 닫기(&C) - + + This button closes the connection to the currently open database file + + + + Ctrl+W Ctrl+W @@ -2171,12 +3005,13 @@ 변경사항 되돌리기 - + + Revert database to last saved state 마지막 저장된 상태로 데이터베이스를 되돌립니다 - + This option is used to revert the current database file to its last saved state. All changes made since the last save operation are lost. 이 옵션은 현재 데이터베이스를 마지막 저장된 상태로 되돌릴 때 사용합니다. 저장 이후에 이루어진 모든 변경 사항을 되돌립니다. @@ -2185,17 +3020,18 @@ 변경사항 반영하기 - + + Write changes to the database file 변경 사항을 데이터베이스 파일에 반영합니다 - + This option is used to save changes to the database file. 이 옵션은 데이터베이스 파일에 변경 사항을 저장하기 위해 사용됩니다. - + Ctrl+S Ctrl+S @@ -2204,23 +3040,23 @@ 데이터베이스 크기 줄이기 - + Compact the database file, removing space wasted by deleted records 삭제된 레코드 등 낭비된 공간을 삭제하여 데이터베이스 파일 크기를 줄입니다 - - + + Compact the database file, removing space wasted by deleted records. 삭제된 레코드 등 낭비된 공간을 삭제하여 데이터베이스 파일 크기를 줄입니다. - + E&xit 종료(&X) - + Ctrl+Q Ctrl+Q @@ -2229,12 +3065,12 @@ SQL 파일에서 데이터베이스 가져오기... - + Import data from an .sql dump text file into a new or existing database. .sql 덤프 문자열 파일에서 데이터를 새 데이터베이스나 기존 데이터베이스로 가져옵니다. - + This option lets you import data from an .sql dump text file into a new or existing database. SQL dump files can be created on most database engines, including MySQL and PostgreSQL. 이 옵션은 .sql 덤프 문자열 파일에서 데이터를 새 데이터베이스나 기존 데이터베이스로 가져옵니다. SQL 덤프 파일은 MySQL이나 PostgreSQL 등 대부분의 데이터베이스 엔진에서 생성할 수 있습니다. @@ -2243,12 +3079,12 @@ 테이블을 CSV 파일로 저장하기... - + Open a wizard that lets you import data from a comma separated text file into a database table. 마법사를 사용하여 CSV 파일(콤마로 필드가 나누어진 문자열 파일)에서 데이터베이스 테이블로 데이터를 가져올 수 있습니다. - + Open a wizard that lets you import data from a comma separated text file into a database table. CSV files can be created on most database and spreadsheet applications. 마법사를 사용하여 CSV 파일(콤마로 필드가 나누어진 문자열 파일)에서 데이터베이스 테이블로 데이터를 가져올 수 있습니다. CSV 파일은 대부분의 데이터베이스와 스프래드시트 애플리케이션(엑셀 등)에서 생성할 수 있습니다. @@ -2257,12 +3093,12 @@ 데이터베이스를 SQL 파일로 저장하기... - + Export a database to a .sql dump text file. 데이터베이스를 .sql 덤프 문자열 파일로 내보내기. - + This option lets you export a database to a .sql dump text file. SQL dump files contain all data necessary to recreate the database on most database engines, including MySQL and PostgreSQL. 이 옵션은 데이터베이스를 .sql 덤프 문자열 파일로 내부낼 수 있습니다. SQL 덤프 파일은 MySQL과 PostgreSQL 등 대부분의 데이터베이스 엔진에서 데이터베이스를 재생성하기 위한 모든 필요한 데이터를 포함하고 있습니다. @@ -2271,12 +3107,12 @@ 테이블을 CSV 파일로 저장하기... - + Export a database table as a comma separated text file. 데이터베이스 테이블을 CSV(콤마로 분리된 문자열 파일)로 내보내기. - + Export a database table as a comma separated text file, ready to be imported into other database or spreadsheet applications. 데이터베이스 테이블을 CSV(콤마로 분리된 문자열 파일)로 내보내기. 다른 데이터베이스나 스프래드시트 애플리케이션(엑셀 등)에서 가져와서 사용할 수 있습니다. @@ -2285,7 +3121,7 @@ 테이블 생성... - + Open the Create Table wizard, where it is possible to define the name and fields for a new table in the database 테이블 생성 마법사를 사용하여 데이터베이스에서 새 테이블을 위한 이름과 필드를 정의할 수 있습니다 @@ -2294,14 +3130,13 @@ 테이블을 삭제... - - - + + Delete Table 테이블 삭제하기 - + Open the Delete Table wizard, where you can select a database table to be dropped. 테이블 삭제 마법사를 사용하여 선택한 데이터베이스 테이블을 삭제할 수 있습니다. @@ -2310,7 +3145,7 @@ 테이블을 수정... - + Open the Modify Table wizard, where it is possible to rename an existing table. It is also possible to add or delete fields form a table, as well as modify field names and types. 테이블 편집 마법사를 사용하여 기존 테이블의 이름을 변경하거나 테이블의 필드를 추가, 삭제, 필드명 변경 및 타입 변경을 할 수 있습니다. @@ -2319,28 +3154,28 @@ 인덱스 생성하기... - + Open the Create Index wizard, where it is possible to define a new index on an existing database table. 인덱스 생성 마법사를 사용하여 기존 데이터베이스 테이블에 새 인덱스를 정의할 수 있습니다. - + &Preferences... 환경설정(&P)... - - + + Open the preferences window. 환경설정창을 엽니다. - + &DB Toolbar DB 툴바 - + Shows or hides the Database toolbar. 데이터베이스 툴바를 보이거나 숨깁니다. @@ -2349,28 +3184,27 @@ 이 프로그램은? - + Shift+F1 Shift+F1 - &About... - 정보(&A)... + 정보(&A)... - + &Recently opened 최근 열었던 파일들(&R) - + Open &tab 탭 열기(&T) - - + + Ctrl+T Ctrl+T @@ -2380,122 +3214,567 @@ 데이터베이스 구조 - + + This is the structure of the opened database. +You can drag SQL statements from an object row and drop them into other applications or into another instance of 'DB Browser for SQLite'. + + + + + Browse Data 데이터 보기 - - <html><head/><body><p>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Clicking this button navigates up to the end in the table view above.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</p></body></html> - <html><head/><body><p>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;테이블 뷰의 끝으로 갈려면 버튼을 클릭하세요.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</p></body></html> + + Refresh the data in the selected table + - - Edit Pragmas - Pragma 수정 + + This button clears all the filters set in the header input fields for the currently browsed table. + - - Execute SQL - SQL 실행 + + Save the table as currently displayed + - Edit Database Cell - 데이터베이스 셀 수정 + + <html><head/><body><p>This popup menu provides the following options applying to the currently browsed and filtered table:</p><ul style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;"><li style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Export to CSV: this option exports the data of the browsed table as currently displayed (after filters, display formats and order column) to a CSV file.</li><li style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Save as view: this option saves the current setting of the browsed table (filters, display formats and order column) as an SQL view that you can later browse or use in SQL statements.</li></ul></body></html> + - - SQL &Log - SQL 로그 + + ... + ... - - Show S&QL submitted by - 실행된 SQL 보기(&) by + + Print currently browsed table data + - - &Plot - 플롯 + + Print currently browsed table data. Print selection if more than one cell is selected. + - - &Revert Changes + + <html><head/><body><p>This button creates a new record in the database. Hold the mouse button to open a pop-up menu of different options:</p><ul><li><span style=" font-weight:600;">New Record</span>: insert a new record with default values in the database.</li><li><span style=" font-weight:600;">Insert Values...</span>: open a dialog for entering values before they are inserted in the database. This allows to enter values acomplishing the different constraints. This dialog is also open if the <span style=" font-weight:600;">New Record</span> option fails due to these constraints.</li></ul></body></html> + + + + + This button deletes the record or records currently selected in the table + + + + + This is the database table view. You can do the following actions: + - Start writing for editing inline the value. + - Double-click any record to edit its contents in the cell editor window. + - Alt+Del for deleting the cell content to NULL. + - Ctrl+" for duplicating the current record. + - Ctrl+' for copying the value from the cell above. + - Standard selection and copy/paste operations. + + + + + <html><head/><body><p>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Clicking this button navigates up to the end in the table view above.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</p></body></html> + <html><head/><body><p>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;테이블 뷰의 끝으로 갈려면 버튼을 클릭하세요.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</p></body></html> + + + + Edit Pragmas + Pragma 수정 + + + + <html><head/><body><p><a href="https://www.sqlite.org/pragma.html#pragma_case_sensitive_like">Case Sensitive Like</a></p></body></html> + + + + + Warning: this pragma is not readable and this value has been inferred. Writing the pragma might overwrite a redefined LIKE provided by an SQLite extension. + + + + + Execute SQL + SQL 실행 + + + + Compact &Database... + + + + + Execute all/selected SQL + + + + + This button executes the currently selected SQL statements. If no text is selected, all SQL statements are executed. + + + + + &Load Extension... + + + + + &Wiki + + + + + Bug &Report... + + + + + Feature Re&quest... + + + + + Web&site + + + + + &Donate on Patreon... + + + + + Sa&ve Project... + + + + + This button lets you save all the settings associated to the open DB to a DB4S project file + + + + + Open &Project... + + + + + This button lets you open a DB4S project file + + + + + &Attach Database... + + + + + + Add another database file to the current database connection + + + + + This button lets you add another database file to the current database connection + + + + + &Set Encryption... + + + + + SQLCipher &FAQ + + + + + Table(&s) to JSON... + + + + + Open Data&base Read Only... + + + + + Save results + + + + + Save the results view + + + + + This button lets you save the results of the last executed query + + + + + Find text in SQL editor + + + + + Find text in SQL editor + + + + + This button opens the search bar of the editor + + + + + Ctrl+F + + + + + Find or replace text in SQL editor + + + + + Find or replace text in SQL editor + + + + + This button opens the find/replace dialog for the current editor tab + + + + + + Export to &CSV + CSV로 내보내기(&C) + + + + + Save as &view + 뷰로 저장하기(&V) + + + + Save as view + 뷰로 저장하기 + + + + Hide column(s) + + + + + Hide selected column(s) + + + + + Show all columns + + + + + Show all columns that were hidden + + + + + Shows or hides the Project toolbar. + + + + + Extra DB Toolbar + + + + + + Export the filtered data to CSV + + + + + This button exports the data of the browsed table as currently displayed (after filters, display formats and order column) as a CSV file. + + + + + + Save the current filter, sort column and display formats as a view + + + + + This button saves the current setting of the browsed table (filters, display formats and order column) as an SQL view that you can later browse or use in SQL statements. + + + + + Insert Values... + + + + + + Open a dialog for inserting values in a new record + + + + + + Insert new record using default values in browsed table + + + + + New In-&Memory Database + + + + + Drag && Drop Qualified Names + + + + + + Use qualified names (e.g. "Table"."Field") when dragging the objects and dropping them into the editor + + + + + Drag && Drop Enquoted Names + + + + + + Use escaped identifiers (e.g. "Table1") when dragging the objects and dropping them into the editor + + + + + &Integrity Check + + + + + Runs the integrity_check pragma over the opened database and returns the results in the Execute SQL tab. This pragma does an integrity check of the entire database. + + + + + &Foreign-Key Check + + + + + Runs the foreign_key_check pragma over the opened database and returns the results in the Execute SQL tab + + + + + &Quick Integrity Check + + + + + Run a quick integrity check over the open DB + + + + + Runs the quick_check pragma over the opened database and returns the results in the Execute SQL tab. This command does most of the checking of PRAGMA integrity_check but runs much faster. + + + + + &Optimize + + + + + Attempt to optimize the database + + + + + Runs the optimize pragma over the opened database. This pragma might perform optimizations that will improve the performance of future queries. + + + + + + Print + + + + + Print text from current SQL editor tab + + + + + Open a dialog for printing the text in the current SQL editor tab + + + + + Print the structure of the opened database + + + + + Open a dialog for printing the structure of the opened database + + + + Edit Database Cell + 데이터베이스 셀 수정 + + + + SQL &Log + SQL 로그 + + + + Show S&QL submitted by + 실행된 SQL 보기(&) by + + + + &Plot + 플롯 + + + + + Project Toolbar + + + + + Extra DB toolbar + + + + + + + Close the current database file + + + + + &Revert Changes 변경사항 취소하기(&R) - + &Write Changes 변경사항 저장하기(&W) - Compact &Database - 데이터베이스 용량 줄이기(&D) + 데이터베이스 용량 줄이기(&D) - + &Database from SQL file... SQL 파일로부터 데이터베이스 가져오기(&D)... - + &Table from CSV file... CSV 파일에서 테이블 가져오기(&T)... - + &Database to SQL file... 데이터베이스를 SQL로 내보내기(&D)... - + &Table(s) as CSV file... 테이블을 CSV 파일로 내보내기(&T)... - + &Create Table... 테이블 생성하기(&C)... - + &Delete Table... 테이블 삭제하기(&D)... - + &Modify Table... 테이블 수정하기(&M)... - + Create &Index... 인덱스 생성하기(&I) - + W&hat's This? 이건 무엇인가요? - + + &About + + + + + This button opens a new tab for the SQL editor + + + + &Execute SQL SQL 실행하기(&E) - Execute SQL [F5, Ctrl+Return] - SQL 실행하기 [F5, Ctrl+엔터] + Execute SQL + SQL 실행하기 - + Open SQL file SQL 파일 열기 - - - + + This button opens a file containing SQL statements and loads it in a new editor tab + + + + + + Save SQL file SQL 파일 저장하기 @@ -2504,51 +3783,48 @@ 확장기능 불러오기 - + Execute current line 현재 행 실행하기 - Execute current line [Ctrl+E] - 현재 행 실행하기 [Ctrl+E] + Execute current line + 현재 행 실행하기 - + Ctrl+E Ctrl+E - + Export as CSV file CSV 파일로 내보내기 - + Export table as comma separated values file 테이블을 CSV 파일로 내보내기 - &Wiki... - 위키(&W)... + 위키(&W)... - Bug &report... - 버그 신고(&R)... + 버그 신고(&R)... - Web&site... - 웹사이트(&S)... + 웹사이트(&S)... Save Project 프로젝트 저장하기 - - + + Save the current session to a file 현재 세션을 파일로 저장하기 @@ -2557,94 +3833,98 @@ 프로젝트 열기 - - + + Load a working session from a file 파일에서 작업 세션 불러오기 - &Attach Database - 데이터베이스 연결하기(&Attach) + 데이터베이스 연결하기(&Attach) Set Encryption 암호화 - - + + Save SQL file as SQL 파일 다름이름으로 저장하기 - + + This button saves the content of the current SQL editor tab to a file + + + + &Browse Table 테이블 보기(&B) - + Copy Create statement 생성 구문 복사하기 - + Copy the CREATE statement of the item to the clipboard 항목의 생성 구문을 클립보드에 복사합니다 - + Ctrl+Return Ctrl+리턴 - + Ctrl+L Ctrl+L - + Ctrl+P Ctrl+P - + Ctrl+D Ctrl+D - + Ctrl+I Ctrl+I - + Encrypted 암호화됨 - + Read only 읽기전용 - + Database file is read only. Editing the database is disabled. 데이터베이스 파일이 읽기 전용입니다. 데이터베이스 수정기능을 사용할 수 없습니다. - + Database encoding 데이터베이스 인코딩 - + Database is encrypted using SQLCipher 데이터베이스는 SQLCipher를 사용해서 암호화됩니다 - - + + Choose a database file 데이터베이스 파일을 선택하세요 @@ -2657,53 +3937,50 @@ 올바르지 않은 파일 포맷입니다. - - - + + + Choose a filename to save under 저장하려는 파일명을 고르세요 - Error adding record: - 레코드 추가 에러: + 레코드 추가 에러: - + Error deleting record: %1 레코드 추가 에러: %1 - + Please select a record first 레코드를 먼저 선택하세요 - + %1 - %2 of %3 %1 - %2 of %3 - - + + There is no database opened. Please open or create a new database file. 데이터베이스가 열려있지 않습니다. 데이터베이스를 열던가 새 데이터베이스 파일을 생성하세요. - Are you sure you want to delete the %1 '%2'? All data associated with the %1 will be lost. - %1 '%2'를 정말로 삭제하나요? + %1 '%2'를 정말로 삭제하나요? %1와 관련된 모든 데이터가 삭제됩니다. - Error: could not delete the %1. Message from database engine: %2 - 에러: %1을(를) 삭제할 수 없습니다. 메시지: + 에러: %1을(를) 삭제할 수 없습니다. 메시지: %2 @@ -2715,45 +3992,41 @@ %3에서 %1 행이 리턴되었습니다.(%2ms 걸림) - Error executing query: %1 - 쿼리 실행 에러: %1 + 쿼리 실행 에러: %1 Query executed successfully: %1 (took %2ms) 쿼리가 성공적으로 실행되었습니다: %1 (%2ms 걸림) - %1 rows returned in %2ms from: %3 - %3에서 %2ms의 시간이 걸려서 %1 행이 리턴되었습니다 + %3에서 %2ms의 시간이 걸려서 %1 행이 리턴되었습니다 - + , %1 rows affected , %1 행이 영향받았습니다 - Query executed successfully: %1 (took %2ms%3) - 질의가 성공적으로 실행되었습니다: %1 (%2ms%3 걸렸습니다.) + 질의가 성공적으로 실행되었습니다: %1 (%2ms%3 걸렸습니다.) Choose a text file 문자열 파일을 고르세요 - + Text files(*.csv *.txt);;All files(*) 문자열 파일(*.csv *.txt);;모든 파일(*) - Import completed - 가져오기가 완료되었습니다 + 가져오기가 완료되었습니다 - + Error while saving the database file. This means that not all changes to the database were saved. You need to resolve the following error first. %1 @@ -2762,183 +4035,373 @@ %1 - + Are you sure you want to undo all changes made to the database file '%1' since the last save? 정말로 데이터베이스 파일 '%1'의 모든 변경 사항을 마지막 저장된 상태로 되돌립니까? - + Choose a file to import 가져올 파일을 고르세요 - - - + + + Text files(*.sql *.txt);;All files(*) 문자열 파일(*.sql *.txt);;모든 파일(*) - + Do you want to create a new database file to hold the imported data? If you answer no we will attempt to import the data in the SQL file to the current database. 데이터를 가져와서 새 데이터베이스 파일을 생성하고 싶은가요? 아니라면 SQL 파일의 데이터를 현재 데이터베이스로 가져오기를 할 것입니다. - + File %1 already exists. Please choose a different name. 파일 %1이 이미 존재합니다. 다른 파일명을 고르세요. - + Error importing data: %1 데이터 가져오기 에러: %1 - + Import completed. 가져오기가 완료되었습니다. - - + Delete View 뷰 삭제하기 - - + Modify View 뷰 수정하기 - - + Delete Trigger 트리거 삭제하기 - - + Modify Trigger 트리거 수정하기 - - + Delete Index 인덱스 삭제하기 - - + Modify Index 인덱스 수정하기 - - + Modify Table 테이블 수정하기 - + &%1 %2 &%1 %2 - + + Choose a project file to open + + + + + This project file is using an old file format because it was created using DB Browser for SQLite version 3.10 or lower. Loading this file format is still fully supported but we advice you to convert all your project files to the new file format because support for older formats might be dropped at some point in the future. You can convert your files by simply opening and re-saving them. + + + + + Duplicate records + + + + + Ctrl+" + + + + Please enter a pseudo-primary key in order to enable editing on this view. This should be the name of a unique column in the view. 이 뷰에서 수정을 활성화하기 위하여 pseudo-primary key를 입력하시기 바랍니다. 이것은 뷰에서 유일한 이름이어야 합니다. - + Setting PRAGMA values will commit your current transaction. Are you sure? PRAGMA 설정을 변경하려면 여러분의 현재 트랜잭션을 커밋해야합니다. 동의하십니까? - + Could not open database file. Reason: %1 데이터베이스 파일을 열 수 없습니다. 원인: %1 - + + In-Memory database + + + + + determining row count... + + + + + %1 - %2 of >= %3 + + + + + Are you sure you want to delete the table '%1'? +All data associated with the table will be lost. + + + + + Are you sure you want to delete the view '%1'? + + + + + Are you sure you want to delete the trigger '%1'? + + + + + Are you sure you want to delete the index '%1'? + + + + + Error: could not delete the table. + + + + + Error: could not delete the view. + + + + + Error: could not delete the trigger. + + + + + Error: could not delete the index. + + + + + Message from database engine: +%1 + + + + + Editing the table requires to save all pending changes now. +Are you sure you want to save the database? + + + + + -- EXECUTING SELECTION IN '%1' +-- + + + + + -- EXECUTING LINE IN '%1' +-- + + + + + -- EXECUTING ALL IN '%1' +-- + + + + Setting PRAGMA values or vacuuming will commit your current transaction. Are you sure? PRAGMA 값을 지정하지 않으면 현재 트랜잭션에 DB파일 축소작업(Vacuum)이 커밋됩니다. 진행할까요? - + Execution aborted by user 사용자에 의해서 실행이 취소되었습니다 - + + executing query + + + + + %1 rows returned in %2ms + + + + + query executed successfully. Took %1ms%2 + + + + + -- At line %1: +%4 +-- Result: %3 + + + + Choose text files 텍스트 파일 선택 + Import completed. Some foreign key constraints are violated. Please fix them before saving. + + + + Select SQL file to open 열 SQL 파일을 선택하세요 - + Couldn't read file: %1. 파일을 읽을 수 없습니다: %1. - + Couldn't save file: %1. 파일을 저장할 수 없습니다: %1. - + Select file name 파일 이름을 선택하세요 - + Select extension file 파일 확장자를 선택하세요 - + Extensions(*.so *.dll);;All files(*) 확장기능 파일들(*.so *.dll);;모든 파일(*) - + Extension successfully loaded. 확장기능을 성공적으로 불러왔습니다. - - + Error loading extension: %1 확장기능을 불러오기 에러: %1 - + + Don't show again 다시 보지 않기 - + New version available. 이용 가능한 새 버전이 있습니다. - + A new DB Browser for SQLite version is available (%1.%2.%3).<br/><br/>Please download at <a href='%4'>%4</a>. 이용 가능한 새 버전이 있습니다 (%1.%2.%3).<br/><br/><a href='%4'>%4</a>에서 다운로드하세요. + + Collation needed! Proceed? + 콜레이션이 필요합니다! 진행할까요? + + + + A table in this database requires a special collation function '%1' that this application can't provide without further knowledge. +If you choose to proceed, be aware bad things can happen to your database. +Create a backup! + 이 데이터베이스의 테이블은 이 애플리케이션에서 잘 알지못하는 특별한 함수 '%1'가 필요합니다. +이대로 계속 진행할 수는 있습니다만 여러분의 데이터베이스에 나쁜 영향이 갈 수도 있습니다. +백업을 생성하세요! + + + + creating collation + + + + + Set a new name for the SQL tab. Use the '&&' character to allow using the following character as a keyboard shortcut. + + + + + Please specify the view name + 뷰 이름을 지정해주세요 + + + + There is already an object with that name. Please choose a different name. + 이지 같은 이름의 객체가 존재합니다. 다른 이름을 고르세요. + + + + View successfully created. + 뷰 생성 성공. + + + + Error creating view: %1 + 뷰 생성 에러: %1 + + + + There is no filter set for this table. View will not be created. + + + + + Delete Records + + + + + This action will open a new SQL tab for running: + + + + + Press Help for opening the corresponding SQLite reference page. + + + Choose a axis color 축의 색깔을 고르세요 @@ -2951,34 +4414,43 @@ 데이터베이스 파일을 저장하기 위한 URL을 입력해주세요. - Choose a file to open - 불러올 파일을 선택하세요 + 불러올 파일을 선택하세요 - - + + DB Browser for SQLite project file (*.sqbpro) DB Browser for SQLite 프로젝트 파일 (*.sqbpro) - + Please choose a new encoding for this table. 이 테이블에 적용할 새 인코딩을 선택하세요 - + Please choose a new encoding for all tables. 모든 테이블에 설정 할 새 인코딩을 선택하세요 - + + Error checking foreign keys after table modification. The changes will be reverted. + + + + + This table did not pass a foreign-key check.<br/>You should run 'Tools | Foreign-Key Check' and fix the reported issues. + + + + %1 Leave the field empty for using the database encoding. 데이터베이스 인코딩을 사용하기위해 필드를 비워둡니다 - + This encoding is either not valid or not supported. 이 인코딩은 올바르지 않거나 지원되지 않습니다. @@ -2988,6 +4460,19 @@ + NullLineEdit + + + Set to NULL + NULL로 변경하기 + + + + Alt+Del + + + + PlotDock @@ -2995,182 +4480,271 @@ 플롯 - + + <html><head/><body><p>This pane shows the list of columns of the currently browsed table or the just executed query. You can select the columns that you want to be used as X or Y axis for the plot pane below. The table shows detected axis type that will affect the resulting plot. For the Y axis you can only select numeric columns, but for the X axis you will be able to select:</p><ul style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;"><li style=" margin-top:12px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Date/Time</span>: strings with format &quot;yyyy-MM-dd hh:mm:ss&quot; or &quot;yyyy-MM-ddThh:mm:ss&quot;</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Date</span>: strings with format &quot;yyyy-MM-dd&quot;</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Time</span>: strings with format &quot;hh:mm:ss&quot;</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Label</span>: other string formats. Selecting this column as X axis will produce a Bars plot with the column values as labels for the bars</li><li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Numeric</span>: integer or real values</li></ul><p>Double-clicking the Y cells you can change the used color for that graph.</p></body></html> + + + + Columns 필드 - + X X - + Y Y - _ - _ + _ + + + + Axis Type + + + + + Here is a plot drawn when you select the x and y values above. + +Click on points to select them in the plot and in the table. Ctrl+Click for selecting a range of points. + +Use mouse-wheel for zooming and mouse drag for changing the axis range. + +Select the axes or axes labels to drag and zoom only in that orientation. + - + Line type: 행 타입: - - + + None 사용하지 않음 - + Line - + StepLeft 왼쪽으로 - + StepRight 오른쪽으로 - + StepCenter 중앙으로 - + Impulse 임펄스 - + Point shape: 포인트 모양: - + Cross 십자가 - + Plus 더하기 - + Circle - + Disc 디스크 - + Square 정사각형 - + Diamond 마름모 - + Star - + Triangle 삼각형 - + TriangleInverted 역삼각형 - + CrossSquare CrossSquare - + PlusSquare PlusSquare - + CrossCircle CrossCircle - + PlusCircle PlusCircle - + Peace Peace - + <html><head/><body><p>Save current plot...</p><p>File format chosen by extension (png, jpg, pdf, bmp)</p></body></html> <html><head/><body><p>현재 플롯 저장하기...</p><p>파일 포맷 확장자를 고르세요 (png, jpg, pdf, bmp)</p></body></html> - + Save current plot... 현재 플롯 저장하기... - + + + Load all data and redraw plot + + + Load all data. This has only an effect if not all data has been fetched from the table yet due to the partial fetch mechanism. - 모든 데이터를 불러옵니다. 이 기능은 부분만 가져오는 메카니즘으로 인하여 테이블에서 모든 데이터가 가져오지 않았을 때에만 작동합니다. + 모든 데이터를 불러옵니다. 이 기능은 부분만 가져오는 메카니즘으로 인하여 테이블에서 모든 데이터가 가져오지 않았을 때에만 작동합니다. - - - + + + Row # 행 # - Choose a axis color - 축의 색깔을 고르세요 + 축의 색깔을 고르세요 - + + Copy + 복사 + + + + Print... + + + + + Show legend + + + + + Stacked bars + + + + + Date/Time + + + + + Date + + + + + Time + + + + + + Numeric + + + + + Label + + + + + Invalid + + + + + Load all data and redraw plot. +Warning: not all data has been fetched from the table yet due to the partial fetch mechanism. + + + + + Choose an axis color + + + + Choose a filename to save under 저장하려는 파일명을 고르세요 - + PNG(*.png);;JPG(*.jpg);;PDF(*.pdf);;BMP(*.bmp);;All Files(*) PNG(*.png);;JPG(*.jpg);;PDF(*.pdf);;BMP(*.bmp);;모든 파일(*) - + + There are curves in this plot and the selected line style can only be applied to graphs sorted by X. Either sort the table or query by X to remove curves or select one of the styles supported by curves: None or Line. + + + Fetching all data... - 모든 데이터 가져오는 중... + 모든 데이터 가져오는 중... - Cancel - 취소 + 취소 @@ -3202,8 +4776,8 @@ - - + + ... ... @@ -3218,42 +4792,44 @@ 언어(&G) - + Automatic &updates 자동 업데이트(&U) - - - - - - + + + + + + + + enabled 사용하기 - + Show remote options 원격 옵션 보기 - + &Database 데이터베이스(&D) - + Database &encoding 데이터베이스 인코딩(&E) - + Open databases with foreign keys enabled. 외래키 기능을 사용하며 데이터베이스를 엽니다. - + &Foreign keys 외래키(&F) @@ -3266,40 +4842,38 @@ 프리패치(&Prefetch) 블록 사이즈 - + Data &Browser 데이터 보기(&B) - NULL fields - NULL 필드 + NULL 필드 Text &colour 글자색(&C) - &Text - 문자열(&T) + 문자열(&T) Bac&kground colour 배경색(&K) - + Remove line breaks in schema &view 스키마 뷰에서 개행을 제거합니다(&V) - + Prefetch block si&ze 프리패치 할 블럭 크기(&Z) - + Advanced 고급 @@ -3308,261 +4882,417 @@ 데이터베이스 파일을 연 후에 실행 할 SQL - + SQ&L to execute after opening database 데이터베이스를 연 후 SQL을 실행(&L) - + Default field type 기본 필드 타입 - + Font 폰트 - + &Font 폰트(&F) - Font si&ze: - 폰트 크기(&Z) + 폰트 크기(&Z) - + Content 내용 - - Symbol limit in cell - 셀 안 심볼 한계 + + Symbol limit in cell + 셀 안 심볼 한계 + + + Field colors + 폰트 색깔 + + + + NULL + NULL + + + + Regular + 보통 + + + Text + 문자열 + + + + Binary + 바이너리 + + + + Background + 배경색 + + + + Filters + 필터 + + + + Toolbar style + + + + + Only display the icon + + + + + Only display the text + + + + + The text appears beside the icon + + + + + The text appears under the icon + + + + + Follow the style + + + + + DB file extensions + + + + + Manage + + + + + When enabled, the line breaks in the Schema column of the DB Structure tab, dock and printed output are removed. + + + + + Font si&ze + - - Field colors - 폰트 색깔 + + + This is the maximum number of rows in a table for enabling the value completion based on current values in the column. +Can be set to 0 for disabling completion. + - - NULL - NULL + + Row count threshold for completion + - - Regular - 보통 + + Field display + - - Text - 문자열 + + Displayed &text + - - Binary - 바이너리 + + Text color + - - Background - 배경색 + + Background color + - - Filters - 필터 + + Preview only (N/A) + - + Escape character 이스케이프 문자 - + Delay time (&ms) 대기 시간 - + Set the waiting time before a new filter value is applied. Can be set to 0 for disabling waiting. 새로운 필터 값을 적용하기 전에 대기할 시간을 설정하세요. 대기 시간을 0으로 하면 대기하지 않습니다. - + &SQL &SQL - + Settings name 설정 이름 - + Context 내용 - + Colour 색깔 - + Bold 볼드 - + Italic 이탤릭 - + Underline 밑줄 - + Keyword 키워드 - function - 기능 + 기능 - + Function 함수 - + Table 테이블 - + Comment 주석 - + Identifier 식별자 - + String 문자열 - currentline - 현재행 + 현재행 - + Current line 현재 행 - + SQL &editor font size SQL 에디터 폰트 크기(&E) - SQL &log font size - SQL 로그 폰트 크기(&E) + SQL 로그 폰트 크기(&E) - + Tab size 탭 크기 - + + &Wrap lines + + + + + Never + + + + + At word boundaries + + + + + At character boundaries + + + + + At whitespace boundaries + + + + + &Quotes for identifiers + + + + + Choose the quoting mechanism used by the application for identifiers in SQL code. + + + + + "Double quotes" - Standard SQL (recommended) + + + + + `Grave accents` - Traditional MySQL quotes + + + + + [Square brackets] - Traditional MS SQL Server quotes + + + + + Keywords in &UPPER CASE + + + + + When set, the SQL keywords are completed in UPPER CASE letters. + + + + + When set, the SQL code lines that caused errors during the last execution are highlighted and the results frame indicates the error in the background + + + + + <html><head/><body><p>SQLite provides an SQL function for loading extensions from a shared library file. Activate this if you want to use the <span style=" font-style:italic;">load_extension()</span> function from SQL code.</p><p>For security reasons, extension loading is turned off by default and must be enabled through this setting. You can always load extensions through the GUI, even though this option is disabled.</p></body></html> + + + + + Allow loading extensions from SQL code + + + + Remote 원격 - + CA certificates CA 증명서 - - + + Subject CN 제목 CN - + Common Name 일반 이름 - + Subject O 제목 O - + Organization 기관 - - + + Valid from 유효날짜(시작) - - + + Valid to 유효날짜(끝) - - + + Serial number 시리얼 넘버 - + Your certificates 당신의 증명서 - + File 파일 - + Subject Common Name 주제 일반 이름 - + Issuer CN 이슈 등록자 CN - + Issuer Common Name 이슈 등록자 일반 이름 - + Clone databases into 데이터베이스 복제하기 @@ -3571,211 +5301,252 @@ 탭 크기: - + SQL editor &font SQL 편집기 폰트(&F) - + Error indicators 에러 표시 - Enabling error indicators highlights the SQL code lines that caused errors during the last execution - 에러 표시를 사용하면 가장 최근에 실행하여 에러가 난 SQL 코드 행을 하이라이트 해줍니다 + 에러 표시를 사용하면 가장 최근에 실행하여 에러가 난 SQL 코드 행을 하이라이트 해줍니다 - + Hori&zontal tiling 화면 수평 나누기(&Z) - + If enabled the SQL code editor and the result table view are shown side by side instead of one over the other. SQL 코드 에디터와 결과 테이블 뷰가 나란히 표시됩니다. - + Code co&mpletion 코드 완성(&M) - + + Foreground + + + + + SQL &results font size + + + + &Extensions 확장기능(&E) - + Select extensions to load for every database: 불러올 확장기능을 선택하세요(확장기능은 모든 데이터베이스에 반영됩니다): - + Add extension 확장기능 추가 - + Remove extension 확장기능 제거 - + <html><head/><body><p>While supporting the REGEXP operator SQLite doesn't implement any regular expression<br/>algorithm but calls back the running application. DB Browser for SQLite implements this<br/>algorithm for you to let you use REGEXP out of the box. However, as there are multiple possible<br/>implementations of this and you might want to use another one, you're free to disable the<br/>application's implementation and load your own by using an extension. Requires restart of the application.</p></body></html> <html><head/><body><p>SQLite에서는 기본적으로 정규표현식 기능을 제공하지 않습니다만 애플리케이션을 실행하여 호출하는 것은 가능합니다. DB Browser for SQLite에서는 이 알고리즘을 박스 밖에서도 정규표현식을 사용할 수 있도록 이 알고리즘을 구현해줍니다. 하지만 확장기능을 사용하여 외부에서 만든 알고리즘 구현을 사용하고자 한다면 DB Browser for SQLite에서 제공하는 구현 사용을 자유롭게 끌 수 있습니다. 이 기능은 애플리케이션을 재시작해야 합니다.</p></body></html> - + Disable Regular Expression extension 정규식표현식 확장기능 끄기 - - + + Choose a directory 디렉토리를 정하세요 - + The language will change after you restart the application. 언어 변경은 애플리케이션을 재시작해야 반영됩니다. - + Select extension file 확장기능 파일을 선택하세요 - + Extensions(*.so *.dll);;All files(*) 확장기능파일(*.so *.dll);;모든 파일(*) - + Import certificate file 인증서 파일 가져오기 - + No certificates found in this file. 이 파일에는 인증서가 없습니다. - + Are you sure you want do remove this certificate? All certificate data will be deleted from the application settings! 정말로 이 인증서를 삭제하겠습니까? 애플리케이션 설정에서 모든 증명 데이터가 삭제될 것입니다! + + + Are you sure you want to clear all the saved settings? +All your preferences will be lost and default values will be used. + + QObject - + Error importing data 데이터 가져오기 에러 - + from record number %1 레코드 넘버: %1 - + . %1 . %1 - + + Importing CSV file... + + + Decoding CSV file... - CSV 파일 디코딩중... + CSV 파일 디코딩중... - + Cancel 취소 - Collation needed! Proceed? - 콜레이션이 필요합니다! 진행할까요? + 콜레이션이 필요합니다! 진행할까요? - A table in this database requires a special collation function '%1' that this application can't provide without further knowledge. If you choose to proceed, be aware bad things can happen to your database. Create a backup! - 이 데이터베이스의 테이블은 이 애플리케이션에서 잘 알지못하는 특별한 함수 '%1'가 필요합니다. + 이 데이터베이스의 테이블은 이 애플리케이션에서 잘 알지못하는 특별한 함수 '%1'가 필요합니다. 이대로 계속 진행할 수는 있습니다만 여러분의 데이터베이스에 나쁜 영향이 갈 수도 있습니다. 백업을 생성하세요! - SQLite database files (*.db *.sqlite *.sqlite3 *.db3);;All files (*) - SQLite 데이터베이스 파일(*.db *.sqlite *.sqlite3 *.db3);;모든 파일 (*) + SQLite 데이터베이스 파일(*.db *.sqlite *.sqlite3 *.db3);;모든 파일 (*) + + + + All files (*) + + + + + SQLite database files (*.db *.sqlite *.sqlite3 *.db3) + RemoteDatabase - + Error when connecting to %1. %2 %1 에 연결할 때 에러가 발생했습니다. - + Error opening remote file at %1. %2 %1 에 있는 원격 파일을 열 때 에러가 발생했습니다. - + Error: Invalid client certificate specified. 에러: 올바르지 않은 클라이언트 인증서입니다. - + Please enter the passphrase for this client certificate in order to authenticate. 인증을 위한 클라이언트 인증서 암호를 입력해주세요. - + Cancel 취소 - + + Uploading remote database to +%1 + %2 로 원격 데이터베이스 업로드 중입니다. {1?} + + + + Downloading remote database from +%1 + %1 에서 원격 데이터베이스 다운로드 중입니다. {1?} + + + + The remote database has been updated since the last checkout. Do you want to update the local database to the newest version? Note that this discards any changes you have made locally! If you don't want to lose local changes, click No to open the local version. + + + Uploading remote database to %1. - %2 로 원격 데이터베이스 업로드 중입니다. + %2 로 원격 데이터베이스 업로드 중입니다. - Downloading remote database from %1. - %1 에서 원격 데이터베이스 다운로드 중입니다. + %1 에서 원격 데이터베이스 다운로드 중입니다. - - + + Error: The network is not accessible. 에러: 네트워크가 접근할 수 없습니다. - + Error: Cannot open the file for sending. 에러: 보낼 파일을 열 수 없습니다. - + Error opening local databases list. %1 지역 데이터베이스 목록을 열 때 에러가 발생했습니다. %1 - + Error creating local databases list. %1 지역 데이터베이스 목록을 생성할 때 에러가 발생했습니다. %1 @@ -3803,14 +5574,24 @@ + Connect to the remote server using the currently selected identity. The correct server is taken from the identity as well. + + + + Go 이동 - + Push currently opened database to server 현재 열린 데이베이스를 서버로 반영(Push)하기 + + + <html><head/><body><p>In this pane, remote databases from dbhub.io website can be added to DB4S. First you need an identity:</p><ol style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;"><li style=" margin-top:12px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Login to the dbhub.io website (use your GitHub credentials or whatever you want)</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Click the button to create a DB4S certificate (that's your identity). That'll give you a certificate file (save it to your local disk).</li><li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Go to the Remote tab in DB4S Preferences. Click the button to add a new certificate to DB4S and choose the just downloaded certificate file.</li></ol><p>Now the Remote panel shows your identity and you can add remote databases.</p></body></html> + + RemoteModel @@ -3857,12 +5638,12 @@ 푸시할 데이터베이스 이름 - + Commit message 커밋 메시지 - + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } @@ -3875,27 +5656,42 @@ <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p></body></html> - + Database licence 데이터베이스 라이센스 - + Public 공개 - + + Branch + + + + + Force push + + + + Database will be public. Everyone has read access to it. 공개 데이터베이스로 지정합니다. 누구나 읽기 접근이 가능합니다. - + Database will be private. Only you have access to it. 비공개 데이터베이스로 지정합니다. 당신만 접근할 수 있습니다. - + + Use with care. This can cause remote commits to be deleted. + + + + Unspecified 미지정 @@ -3908,314 +5704,500 @@ - + + Find previous match [Shift+F3] + + + + + Find previous match with mapping + + + + + Shift+F3 + Shift+F3 + + + + The found pattern must be a whole word + + + + + Whole Words + + + + + Text pattern to find considering the checks in this frame + + + + + Find in editor + + + + + The found pattern must match in letter case + + + + + Case Sensitive + + + + + Find next match [Enter, F3] + + + + + Find next match with wrapping + + + + + F3 + F3 + + + + Interpret search pattern as a regular expression + + + + + <html><head/><body><p>When checked, the pattern to find is interpreted as a UNIX regular expression. See <a href="https://en.wikibooks.org/wiki/Regular_Expressions">Regular Expression in Wikibooks</a>.</p></body></html> + + + + + Regular Expression + + + + + + Close Find Bar + + + + + Results of the last executed statements 가장 최근 실행 구문 결과 - + This field shows the results and status codes of the last executed statements. 이 필드는 가장 최근이 실행된 구문의 결과와 상태 코드를 보여줍니다. - Export to &CSV - CSV로 내보내기(&C) + CSV로 내보내기(&C) - Save as &view - 뷰로 저장하기(&V) + 뷰로 저장하기(&V) - Save as view - 뷰로 저장하기 + 뷰로 저장하기 - Please specify the view name - 뷰 이름을 지정해주세요 + 뷰 이름을 지정해주세요 - There is already an object with that name. Please choose a different name. - 이지 같은 이름의 객체가 존재합니다. 다른 이름을 고르세요. + 이지 같은 이름의 객체가 존재합니다. 다른 이름을 고르세요. - View successfully created. - 뷰 생성 성공. + 뷰 생성 성공. - Error creating view: %1 - 뷰 생성 에러: %1 + 뷰 생성 에러: %1 SqlUiLexer - + (X) The abs(X) function returns the absolute value of the numeric argument X. (X) abs(X) 함수는 숫자 매개변수 X의 절대값을 리턴합니다. - + () The changes() function returns the number of database rows that were changed or inserted or deleted by the most recently completed INSERT, DELETE, or UPDATE statement. () changes() 함수는 가장 최근에 실행된 INSERT, DELETE, UPDATE 구문에서 데이터베이스에서 변경되거나 추가되거나 삭제된 행 수를 리턴합니다. - + (X1,X2,...) The char(X1,X2,...,XN) function returns a string composed of characters having the unicode code point values of integers X1 through XN, respectively. (X1,X2,...) char(X1,X2,...,XN) 함수는 각각의 X1에서 XN 숫자 값의 유니코드 포인트 값을 가진 문자들로 구성된 문자열을 리턴합니다. - + (X,Y,...) The coalesce() function returns a copy of its first non-NULL argument, or NULL if all arguments are NULL (X,Y,...) coalesce() 함수는 첫번째 NULL이 아닌 인자값의 사본을 리턴합니다. 만약 인자값이 모두 NULL이라면 NULL을 리턴합니다 - + (X,Y) The glob(X,Y) function is equivalent to the expression "Y GLOB X". (X,Y) glob(X,Y) 함수는 "Y GLOB X" 표현식과 같습니다. - + (X,Y) The ifnull() function returns a copy of its first non-NULL argument, or NULL if both arguments are NULL. (X,Y) ifnull() 함수는 첫번째 NULL이 아닌 인자값의 사본을 리턴합니다. 만약 인자값 둘 다 NULL이라면 NULL을 리턴합니다. - + (X,Y) The instr(X,Y) function finds the first occurrence of string Y within string X and returns the number of prior characters plus 1, or 0 if Y is nowhere found within X. (X,Y) instr(X,Y) 함수는 문자열 X에서 문자열 Y가 있다면 첫 글자 위치 + 1 값을 리턴합니다. 만약 문자열 X에서 문자열 Y가 발견되지 않는다면 0을 리턴합니다. - + (X) The hex() function interprets its argument as a BLOB and returns a string which is the upper-case hexadecimal rendering of the content of that blob. (X) hex() 함수는 매개변수를 BLOB으로 변환한 후 blob의 내용을 대문자 16진수 문자열로 변환하여 리턴합니다. - + () The last_insert_rowid() function returns the ROWID of the last row insert from the database connection which invoked the function. () last_insert_rowid() 함수는 함수가 호출된 데이터베이스 연결에서 가장 최근이 추가된 행의 ROWID를 리턴합니다. - + (X) For a string value X, the length(X) function returns the number of characters (not bytes) in X prior to the first NUL character. (X) 문자열 변수 X를 위한 것으로 length(X) 함수는 첫 번째 NUL 문자를 만날 때 까지의 (바이트 수가 아닌)문자 수를 리턴합니다. - + (X,Y) The like() function is used to implement the "Y LIKE X" expression. (X,Y) like() 함수는 "Y LIKE X" 표현식을 구현하기위해 사용합니다. - + (X,Y,Z) The like() function is used to implement the "Y LIKE X ESCAPE Z" expression. (X,Y,Z) like() 함수는 "Y LIKE X ESCAPE Z" 표현식을 구현하기위해 사용합니다. - (X) The load_extension(X) function loads SQLite extensions out of the shared library file named X. - (X) load_extention(X) 함수는 SQLite 확장기능을 사용하기 위하여 X라 이름지어진 공유라이브러리 파일을 외부에서 불러올 때 사용합니다. + (X) load_extention(X) 함수는 SQLite 확장기능을 사용하기 위하여 X라 이름지어진 공유라이브러리 파일을 외부에서 불러올 때 사용합니다. - (X,Y) The load_extension(X) function loads SQLite extensions out of the shared library file named X using the entry point Y. - (X, Y) load_extention(X) 함수는 SQLite 확장기능을 사용하기 위하여 X라 이름지어진 공유라이브러리 파일을 엔트리 포인트 Y를 사용하여 외부에서 불러올 때 사용합니다. + (X, Y) load_extention(X) 함수는 SQLite 확장기능을 사용하기 위하여 X라 이름지어진 공유라이브러리 파일을 엔트리 포인트 Y를 사용하여 외부에서 불러올 때 사용합니다. - + + (X) The load_extension(X) function loads SQLite extensions out of the shared library file named X. +Use of this function must be authorized from Preferences. + + + + + (X,Y) The load_extension(X) function loads SQLite extensions out of the shared library file named X using the entry point Y. +Use of this function must be authorized from Preferences. + + + + (X) The lower(X) function returns a copy of string X with all ASCII characters converted to lower case. (X) lower(X) 함수는 문자열 X에서 모든 ASCII 문자를 소문자로 변경한 문자열 사본을 리턴합니다. - + (X) ltrim(X) removes spaces from the left side of X. (X) ltrim(X) 함수는 X의 좌측의 공백여백을 제거합니다. - + (X,Y) The ltrim(X,Y) function returns a string formed by removing any and all characters that appear in Y from the left side of X. (X,Y) ltrim(X,Y) 함수는 X의 좌측에서 Y에 있는 모든 문자를 제거한 문자열을 리턴합니다. - + (X,Y,...) The multi-argument max() function returns the argument with the maximum value, or return NULL if any argument is NULL. (X,Y,...) 다중 인자를 제공하는 max() 함수는 주어진 인자값 중에서 가장 큰 값을 리턴합니다. 만약 주어진 인자 중에 NULL이 하나라도 있으면 NULL을 리턴합니다. - + (X,Y,...) The multi-argument min() function returns the argument with the minimum value. (X,Y,...) 다중 인자를 제공하는 min() 함수는 주어진 인자값 중에서 가장 작은 값을 리턴합니다. - + (X,Y) The nullif(X,Y) function returns its first argument if the arguments are different and NULL if the arguments are the same. Y) nullif(X,Y) 함수는 두 인자값이 서로 다르면 X를 리턴하고 두 인자값이 같으면 NULL을 리턴합니다. - + (FORMAT,...) The printf(FORMAT,...) SQL function works like the sqlite3_mprintf() C-language function and the printf() function from the standard C library. (FORMAT,...) printf(FORMAT,...) SQL 함수는 sqlite3_mprintf() C-언어 함수와 표준 C 라이브러리에서의 printf() 함수처럼 동작합니다. - + (X) The quote(X) function returns the text of an SQL literal which is the value of its argument suitable for inclusion into an SQL statement. (X) quote(X) 함수는 X를 SQL문 안에 포함되기에 적절하도록 SQL 리터럴 문자열로 리턴합니다. - + () The random() function returns a pseudo-random integer between -9223372036854775808 and +9223372036854775807. () random() 함수는 -9223372036854775808와 +9223372036854775807 사이의 pseudo-랜덤 정수를 리턴합니다. - + (N) The randomblob(N) function return an N-byte blob containing pseudo-random bytes. (N) randomblob(N) 함수는 psedo-랜덤 바이트를 포함한 N-바이트 blob을 리턴합니다. - + (X,Y,Z) The replace(X,Y,Z) function returns a string formed by substituting string Z for every occurrence of string Y in string X. (X,Y,Z) replace(X,Y,Z) 함수는 문자열 X에 있는 모든 문자열 Y를 Z로 치환한 문자열을 리턴합니다. - + (X) The round(X) function returns a floating-point value X rounded to zero digits to the right of the decimal point. (X) round(X) 함수는 부동소수점 값 X를 0의 자리에서 반올림한 값을 리턴합니다. - + (X,Y) The round(X,Y) function returns a floating-point value X rounded to Y digits to the right of the decimal point. (X,Y) round(X,Y) 함수는 부동소수점 값 X를 소수점 우측에서 Y자리에서 반올림한 값을 리턴합니다. - + (X) rtrim(X) removes spaces from the right side of X. (X) rtrim(X)은 X의 우측 공백을 제거합니다. - + (X,Y) The rtrim(X,Y) function returns a string formed by removing any and all characters that appear in Y from the right side of X. (X,Y) rtrim(X,Y) 함수는 X의 우측에서 Y에 있는 모든 문자를 삭제한 문자열을 리턴합니다. - + (X) The soundex(X) function returns a string that is the soundex encoding of the string X. (X) soundex(X) 함수는 문자열 X의 사운덱스 인코딩 문자열을 리턴합니다. - + (X,Y) substr(X,Y) returns all characters through the end of the string X beginning with the Y-th. (X,Y) substr(X,Y) 함수는 문자열 X에서 Y번째부터 끝까지 모든 문자열을 리턴합니다. - + (X,Y,Z) The substr(X,Y,Z) function returns a substring of input string X that begins with the Y-th character and which is Z characters long. (X,Y,Z) substr(X,Y,Z) 함수는 문자열 X에서 Y번째 문자부터 Z문자 수만큼 리턴합니다. - + () The total_changes() function returns the number of row changes caused by INSERT, UPDATE or DELETE statements since the current database connection was opened. () total_changes() 함수는 현재 데이터베이스 연결이 열린 후 INSERT, UPDATE, DELETE 구문에 의해서 변경된 레코드 행 수를 리턴합니다. - + (X) trim(X) removes spaces from both ends of X. (X) trim(X) 함수는 X의 양쪽 공백을 제거합니다. - + (X,Y) The trim(X,Y) function returns a string formed by removing any and all characters that appear in Y from both ends of X. (X,Y) trim(X,Y) 함수는 X의 양끝에서 Y에 해당하는 문자들을 삭제한 문자열을 리턴합니다. - + (X) The typeof(X) function returns a string that indicates the datatype of the expression X. (X) typeof(X) 함수는 표현식 X의 데이터타입을 나타내는 문자열을 리턴합니다. - + (X) The unicode(X) function returns the numeric unicode code point corresponding to the first character of the string X. (X) unicode(X) 함수는 문자열 X의 첫 글자에 해당하는 숫자 유니코드 포인트를 리턴합니다. - + (X) The upper(X) function returns a copy of input string X in which all lower-case ASCII characters are converted to their upper-case equivalent. (X) upper(X) 함수는 입력 문자열 X에서 ASCII 문자에 해당하는 글자를 대문자로 변경한 문자열 사본을 리턴합니다. - + (N) The zeroblob(N) function returns a BLOB consisting of N bytes of 0x00. (N) zeroblob(N) 함수는 N 바이트의 0x00으로 이루어진 BLOB을 구성하여 리턴합니다. - - - - + + + + (timestring,modifier,modifier,...) (timestring,modifier,modifier,...) - + (format,timestring,modifier,modifier,...) (format,timestring,modifier,modifier,...) - + (X) The avg() function returns the average value of all non-NULL X within a group. (X) avg() 함수는 그룹에서 모든 NULL이 아닌 X의 값의 평균을 리턴합니다. - + (X) The count(X) function returns a count of the number of times that X is not NULL in a group. (X) count(X) 함수는 그룹에서 NULL이 아닌 개수를 세어 리턴합니다. - + (X) The group_concat() function returns a string which is the concatenation of all non-NULL values of X. (X) group_concat() 함수는 X의 모든 NULL이 아닌 값들의 문자열로 합쳐서 리턴합니다. - + (X,Y) The group_concat() function returns a string which is the concatenation of all non-NULL values of X. If parameter Y is present then it is used as the separator between instances of X. (X,Y) group_concat() 함수는 X의 모든 NULL이 아닌 값들의 문자열로 합쳐서 리턴합니다. 만약 매개변수 Y가 있다면 값들을 문자열로 합칠 때 구분자로 사용합니다. - + (X) The max() aggregate function returns the maximum value of all values in the group. (X) max() 집계 함수는 그룹에서 모든 값들 중 가장 큰 값을 리턴합니다. - + (X) The min() aggregate function returns the minimum non-NULL value of all values in the group. (X) min() 집계 함수는 그룹에서 NULL이 아 닌모든 값들 중 가장 작은 값을 리턴합니다. - - + + (X) The sum() and total() aggregate functions return sum of all non-NULL values in the group. (X) sum(x)과 total() 집계 함수는 그룹의 모든 NULL이 아닌 값들의 합을 리턴합니다. + + + () The number of the row within the current partition. Rows are numbered starting from 1 in the order defined by the ORDER BY clause in the window definition, or in arbitrary order otherwise. + + + + + () The row_number() of the first peer in each group - the rank of the current row with gaps. If there is no ORDER BY clause, then all rows are considered peers and this function always returns 1. + + + + + () The number of the current row's peer group within its partition - the rank of the current row without gaps. Partitions are numbered starting from 1 in the order defined by the ORDER BY clause in the window definition. If there is no ORDER BY clause, then all rows are considered peers and this function always returns 1. + + + + + () Despite the name, this function always returns a value between 0.0 and 1.0 equal to (rank - 1)/(partition-rows - 1), where rank is the value returned by built-in window function rank() and partition-rows is the total number of rows in the partition. If the partition contains only one row, this function returns 0.0. + + + + + () The cumulative distribution. Calculated as row-number/partition-rows, where row-number is the value returned by row_number() for the last peer in the group and partition-rows the number of rows in the partition. + + + + + (N) Argument N is handled as an integer. This function divides the partition into N groups as evenly as possible and assigns an integer between 1 and N to each group, in the order defined by the ORDER BY clause, or in arbitrary order otherwise. If necessary, larger groups occur first. This function returns the integer value assigned to the group that the current row is a part of. + + + + + (expr) Returns the result of evaluating expression expr against the previous row in the partition. Or, if there is no previous row (because the current row is the first), NULL. + + + + + (expr,offset) If the offset argument is provided, then it must be a non-negative integer. In this case the value returned is the result of evaluating expr against the row offset rows before the current row within the partition. If offset is 0, then expr is evaluated against the current row. If there is no row offset rows before the current row, NULL is returned. + + + + + + (expr,offset,default) If default is also provided, then it is returned instead of NULL if the row identified by offset does not exist. + + + + + (expr) Returns the result of evaluating expression expr against the next row in the partition. Or, if there is no next row (because the current row is the last), NULL. + + + + + (expr,offset) If the offset argument is provided, then it must be a non-negative integer. In this case the value returned is the result of evaluating expr against the row offset rows after the current row within the partition. If offset is 0, then expr is evaluated against the current row. If there is no row offset rows after the current row, NULL is returned. + + + + + (expr) This built-in window function calculates the window frame for each row in the same way as an aggregate window function. It returns the value of expr evaluated against the first row in the window frame for each row. + + + + + (expr) This built-in window function calculates the window frame for each row in the same way as an aggregate window function. It returns the value of expr evaluated against the last row in the window frame for each row. + + + + + (expr,N) This built-in window function calculates the window frame for each row in the same way as an aggregate window function. It returns the value of expr evaluated against the row N of the window frame. Rows are numbered within the window frame starting from 1 in the order defined by the ORDER BY clause if one is present, or in arbitrary order otherwise. If there is no Nth row in the partition, then NULL is returned. + + SqliteTableModel - References %1(%2) Hold Ctrl+Shift and click to jump there - 참조 %1(%2) + 참조 %1(%2) Ctrl+Shift를 누른 상태에서 점프하고자 하는 곳을 클릭하세요 - + + reading rows + + + + + loading... + + + + + References %1(%2) +Hold %3Shift and click to jump there + + + + Error changing data: %1 데이터 수정 에러: %1 + + + retrieving list of columns + + + + + Fetching data... + + + + + Cancel + 취소 + VacuumDialog @@ -4226,13 +6208,21 @@ - Warning: Compacting the database will commit all changes you made. - 주의: 데이터베이스 크기 줄이기를 하면 저장되지 않은 모든 수정사항이 반영됩니다. + Warning: Compacting the database will commit all of your changes. + + Please select the databases to co&mpact: + + + + Warning: Compacting the database will commit all changes you made. + 주의: 데이터베이스 크기 줄이기를 하면 저장되지 않은 모든 수정사항이 반영됩니다. + + Please select the objects to compact: - 크기를 줄일 객체를 선택하세요: + 크기를 줄일 객체를 선택하세요: diff -Nru sqlitebrowser-3.10.100ubuntu1/src/translations/sqlb_pl.ts sqlitebrowser-3.11.1/src/translations/sqlb_pl.ts --- sqlitebrowser-3.10.100ubuntu1/src/translations/sqlb_pl.ts 1970-01-01 00:00:00.000000000 +0000 +++ sqlitebrowser-3.11.1/src/translations/sqlb_pl.ts 2019-02-19 23:51:34.000000000 +0000 @@ -0,0 +1,5457 @@ + + + + + AboutDialog + + + About DB Browser for SQLite + O Przeglądarce baz danych dla SQLite + + + + Version + Wersja + + + + <html><head/><body><p>DB Browser for SQLite is an open source, freeware visual tool used to create, design and edit SQLite database files.</p><p>It is bi-licensed under the Mozilla Public License Version 2, as well as the GNU General Public License Version 3 or later. You can modify or redistribute it under the conditions of these licenses.</p><p>See <a href="http://www.gnu.org/licenses/gpl.html">http://www.gnu.org/licenses/gpl.html</a> and <a href="https://www.mozilla.org/MPL/2.0/index.txt">https://www.mozilla.org/MPL/2.0/index.txt</a> for details.</p><p>For more information on this program please visit our website at: <a href="http://sqlitebrowser.org">http://sqlitebrowser.org</a></p><p><span style=" font-size:small;">This software uses the GPL/LGPL Qt Toolkit from </span><a href="http://qt-project.org/"><span style=" font-size:small;">http://qt-project.org/</span></a><span style=" font-size:small;"><br/>See </span><a href="http://qt-project.org/doc/qt-5/licensing.html"><span style=" font-size:small;">http://qt-project.org/doc/qt-5/licensing.html</span></a><span style=" font-size:small;"> for licensing terms and information.</span></p><p><span style=" font-size:small;">It also uses the Silk icon set by Mark James licensed under a Creative Commons Attribution 2.5 and 3.0 license.<br/>See </span><a href="http://www.famfamfam.com/lab/icons/silk/"><span style=" font-size:small;">http://www.famfamfam.com/lab/icons/silk/</span></a><span style=" font-size:small;"> for details.</span></p></body></html> + <html><head/><body><p>Preglądarka Bazy Danych dla SQLite jest darmowym otwartym oprogramowaniem przeznaczonym do wizualnej edycji i kreacji plików bazy danych SQLite.</p><p>Program podlega podwójnej licencji użytkowania: Publiczna licencja Mozilli Wersja 2 jak również Powszechna Licencja Publiczna GNU wersja 3 i poźniejsza. Możesz modyfikować i rozpowszechniać program pod warunkami zawartymi w tych licencjach.</p><p>Zobacz <a href="http://www.gnu.org/licenses/gpl.html">http://www.gnu.org/licenses/gpl.html</a> i <a href="https://www.mozilla.org/MPL/2.0/index.txt">https://www.mozilla.org/MPL/2.0/index.txt</a> dla szczegołów.</p><p>Odwiedź naszą stronę internetową aby zapoznać się z informacją na temat diałania tego programu: <a href="http://sqlitebrowser.org">http://sqlitebrowser.org</a></p><p><span style=" font-size:small;">To oprogramowanie używa GPL/LGPL Qt Toolkit z: </span><a href="http://qt-project.org/"><span style=" font-size:small;">http://qt-project.org/</span></a><span style=" font-size:small;"><br/>Zobacz </span><a href="http://qt-project.org/doc/qt-5/licensing.html"><span style=" font-size:small;">http://qt-project.org/doc/qt-5/licensing.html</span></a><span style=" font-size:small;"> na temat licancji i użytkowania.</span></p><p><span style=" font-size:small;">Używany również jest zestaw ikon Silk stworzony przez Mark James pod licencjią Creative Commons Attribution 2.5 i 3.0.<br/>Zobacz </span><a href="http://www.famfamfam.com/lab/icons/silk/"><span style=" font-size:small;">http://www.famfamfam.com/lab/icons/silk/</span></a><span style=" font-size:small;"> dla dalszej informacji.</span></p></body></html> + + + + (based on SQLite %1) + + + + + Version + Wersja + + + + Qt Version + Wersja Qt + + + + SQLCipher Version + Wersja SQLCipher + + + + SQLite Version + Wersja SQLite + + + + AddRecordDialog + + + Add New Record + Nowy rekord + + + + Enter values for the new record considering constraints. Fields in bold are mandatory. + Podaj wartości dla nowego rekordu zwracając uwagę na ograniczenia.Pola wytłusczone są obowiązkowe. + + + + In the Value column you can specify the value for the field identified in the Name column. The Type column indicates the type of the field. Default values are displayed in the same style as NULL values. + W kolumnie Wartość możesz podać wartość dla pola identyfikowanego w kolumnie Nazwa. Kolumna Rodzaj wskazuje rodzaj pola. Wartości domyślne są wyświetlane w tym samym stylu, co wartości NULL. + + + + Name + Nazwa + + + + Type + Rodzaj + + + + Value + Wartość + + + + Values to insert. Pre-filled default values are inserted automatically unless they are changed. + Wartości do wstawienia. Pola wypełnione są automatycznie domyślnymi wartościami wtedy tylko gdy te wartości nie są ręcznie zmienione. + + + + When you edit the values in the upper frame, the SQL query for inserting this new record is shown here. You can edit manually the query before saving. + Tutaj pokazana jest kwerenda SQL dla dodania nowego rekordu zawierającego wartości wprowadzone w górnej ramce. Możesz ją ręcznie zmienić przed zapisem rekordu. + + + + <html><head/><body><p><span style=" font-weight:600;">Save</span> will submit the shown SQL statement to the database for inserting the new record.</p><p><span style=" font-weight:600;">Restore Defaults</span> will restore the initial values in the <span style=" font-weight:600;">Value</span> column.</p><p><span style=" font-weight:600;">Cancel</span> will close this dialog without executing the query.</p></body></html> + <html><head/><body><p><span style=" font-weight:600;">Zapisz</span> przekarze wyświetlone zapytanie SQL do bazy danych w celu zapisania nowego rekordu</p><p><span style=" font-weight:600;">Przywróć domyślne</span> przywróci wstępne wartości domyślne w kolumnie<span style=" font-weight:600;">Wartość</span></p><p><span style=" font-weight:600;">Anuluj</span> zamyka to okno bez robienia zmian.</p></body></html> + + + + Auto-increment + + + + + + Unique constraint + + Unikat + + + + + Check constraint: %1 + + Weryfikator: %1 + + + + + Foreign key: %1 + + Klucz obcy: %1 + + + + + Default value: %1 + + Wartość domyślna: %1 + + + + + Error adding record. Message from database engine: + +%1 + Wystąpił błąd podczas dodawania rekordu. Baza danych podała następujący komunikat: + +%1 + + + + Are you sure you want to restore all the entered values to their defaults? + Jesteś pewien że chcesz przywrócić domyślne wartości dla wszystich wpisów? + + + + Application + + + Usage: %1 [options] [db] + + Użycie: %1 [opcje] [baza danych] + + + + + Possible command line arguments: + Dozwolone agrumenty wiersza poleceń: + + + + -h, --help Show command line options + -h, --help Wyświetla opcje wiersza poleceń + + + + -q, --quit Exit application after running scripts + -q, --quit Zamyka aplikację po wykonaniu skryptów + + + + -s, --sql [file] Execute this SQL file after opening the DB + -s, --sql [plik] Wykonuje plik SQL po otworzeniu bazy danych + + + + -t, --table [table] Browse this table after opening the DB + -t, --table [tabela] Wyświetla tę tabelę po otworzeniu bazy danych + + + + -R, --read-only Open database in read-only mode + -R, --read-only Otwiera bazę danych w trybie tylko do odczytu + + + + -o, --option [group/setting=value] Run application with this setting temporarily set to value + + + + + -v, --version Display the current version + -v, --version Wyświetla obecną wersję + + + + [file] Open this SQLite database + [plik] Otwiera bazę danych SQLite + + + + This is DB Browser for SQLite version %1. + Oto Przeglądarka baz danych dla SQLite w wersji %1. + + + + The -s/--sql option requires an argument + Opcja -s/--sql wymaga argumentu + + + + The file %1 does not exist + Plik %1 nie istnieje + + + + The -t/--table option requires an argument + Opcja -t/--table wymaga argumentu + + + + The -o/--option option requires an argument in the form group/setting=value + + + + + Invalid option/non-existant file: %1 + Nieprawidłowa opcja lub nieistniejący plik: %1 + + + + CipherDialog + + + SQLCipher encryption + Szyfrowanie SQLCipher + + + + &Password + &Hasło + + + + &Reenter password + Powtó&rz hasło + + + + Page si&ze + Ro&zmiar strony + + + + Passphrase + Hasło + + + + Raw key + Klucz + + + + Please set a key to encrypt the database. +Note that if you change any of the other, optional, settings you'll need to re-enter them as well every time you open the database file. +Leave the password fields empty to disable the encryption. +The encryption process might take some time and you should have a backup copy of your database! Unsaved changes are applied before modifying the encryption. + Proszę podaj klucz do zaszyfrowania bazy danych. +Zwróć uwagę na to że wszelkie zmiany wprowadzone tutaj do opcjonalnych ustawień bedą wymagane przy każdym otwarciu pliku. +W celu deaktywacji szyfrowania pozostaw pola klucza puste. +Proces szyfrowania może zabrać dużo czasu w zależności od wielkości bazy danych. Zaleca się aby przed rozpoczęciem tego procesu zrobić kopię zapasową pliku. Wszelkie nie zapisane zmiany będą wprowadzone do bazy danych zanim szyfrowanie się rozpocznie. + + + + Please enter the key used to encrypt the database. +If any of the other settings were altered for this database file you need to provide this information as well. + Proszę podać hasło do zaszyfrowania bazy danych. +Jeśli zostały zmienione jakiekolwiek dodatkowe ustawienia dla pliku tej bazy danych będziesz musiał również podać tą informację. + + + + ColumnDisplayFormatDialog + + + Choose display format + Wybierz format wyświetlania + + + + Display format + Format wyświetlania + + + + Choose a display format for the column '%1' which is applied to each value prior to showing it. + Wybierz domyślny format wyświetlania dla kolumny '%1', który jest zastosowany dla każdej wartości zanim ona zostanie pokazana. + + + + Default + Domyślny + + + + Decimal number + Zapis dziesiętny + + + + Exponent notation + Postać wykładnika + + + + Hex blob + Blob szestnastkowy + + + + Hex number + Numer szestnastkowy + + + + Octal number + Numer ósemkowy + + + + Round number + Liczba zaokrąglona + + + + Apple NSDate to date + Apple NSDate do daty + + + + Java epoch (milliseconds) to date + Java epoch (milisekundy) do daty + + + + Julian day to date + Data Juliańska do daty + + + + Unix epoch to date + Unix epoch do daty + + + + Unix epoch to local time + Unix epoch do czasu lokalnego + + + + Windows DATE to date + Windows DATE do daty + + + + Date as dd/mm/yyyy + Data w formacie dd/mm/rrrr + + + + Lower case + Małe litery + + + + Upper case + Duże litery + + + + Custom + Niestandardowy + + + + DBBrowserDB + + + This database has already been attached. Its schema name is '%1'. + Baza danych została już załączona. Nazwa jej schematu to '%1'. + + + + Please specify the database name under which you want to access the attached database + Proszę podaj nazwę bazy danych za pomocą której chcesz uzyskać dostęp do załączonej bazy + + + + Invalid file format + Nieprawidłowy format pliku + + + + Do you really want to close this temporary database? All data will be lost. + Czy na pewno chcesz zamknąć tę tymczasową bazę danych? Wszelkie zmiany bedą zapomniane. + + + + Do you want to save the changes made to the database file %1? + Czy na pewno chcesz zapisać zmiany dokonane w pliku bazy danych %1? + + + + The database is currently busy: + Baza danych jest obecnie zajęta: + + + + Do you want to abort that other operation? + Czy na pewno chcesz przerwać tą inną operację? + + + + Exporting database to SQL file... + Eksportowanie bazy danych do pliku SQL… + + + + + Cancel + Anuluj + + + + + No database file opened + Plik z bazą danych nie jest obecnie otwarty + + + + Executing SQL... + Wykonywanie SQL… + + + + Action cancelled. + Anulowano akcję. + + + + + Error in statement #%1: %2. +Aborting execution%3. + Błąd w poleceniu #%1: %2. +Przerywam wykonywanie%3. + + + + + and rolling back + i przywracam + + + + Cannot delete this object + Nie można usunąć tego obiektu + + + + Cannot set data on this object + Nie można ustawić danych na tym objekcie + + + + A table with the name '%1' already exists in schema '%2'. + Tabela o nazwie '%1' już istnieje w schemacie '%2'. + + + + renameColumn: cannot find column %1. + renameColumn(zmiana nazwy kolumny): nie można odnaleźć kolumny %1. + + + + renameColumn: creating savepoint failed. DB says: %1 + renameColumn(zmiana nazwy kolumny): błąd przy zapisie. Baza Danych zwraca: %1 + + + + renameColumn: creating new table failed. DB says: %1 + renameColumn(zmiana nazwy kolumny): tworzenie nowej tabeli nie powiodło się. Baza danych zwróciła: %1 + + + + renameColumn: copying data to new table failed. DB says: +%1 + renameColumn(zmiana nazwy kolumny): kopiowanie danych do nowej tabeli nie powiodło się. Baza danych zwróciła: +%1 + + + + renameColumn: deleting old table failed. DB says: %1 + renameColumn(zmiana nazwy kolumny): usuwanie starej tabeli nie powiodło się. Baza danych zwróciła: %1 + + + + Restoring some of the objects associated with this table failed. This is most likely because some column names changed. Here's the SQL statement which you might want to fix and execute manually: + + + Wystąpił błąd przy odtworzeniu niektórych obiektów powiązanych z tą bazą danych. Błędy tego rodzaju występują za zwyczaj w przypadku zmiany nazw niektórych kolumn. Sprawdź dokładnie następującą kwerendę SQL. Po dokonaniu zmian możesz ją ręcznie uruchomić: + + + + + + renameColumn: releasing savepoint failed. DB says: %1 + renameColumn(zmiana nazwy kolumny): Wystąpił błąd podczas odłączenia punktu zapisu. Baza danych podała następujący komunikat: %1 + + + + Error renaming table '%1' to '%2'.Message from database engine: +%3 + Błąd podczas zmiany nazwy tabeli '%1' na '%2'. Wiadomość z silnika bazy danych: +%3 + + + + ... <string can not be logged, contains binary data> ... + ... <string nie można zalogować zawiera dane w postaci binarnej> ... + + + + could not get list of db objects: %1, %2 + nie mogę pobrać listy obiektów bazy danych: %1, %2 + + + + could not get list of databases: %1 + nie mogę odczytać listy baz danych: %1 + + + + didn't receive any output from pragma %1 + nie otrzymałem żadnego wyniku od pragmy %1 + + + + could not execute pragma command: %1, %2 + nie mogłem wykonać polecenia pragmy: %1, %2 + + + + Error setting pragma %1 to %2: %3 + Błąd przy ustawianiu pragmy %1 do %2: %3 + + + + File not found. + Nie znaleziono pliku. + + + + Error loading extension: %1 + Wystąpił błąd przy ładownaniu rozszerzenia: %1 + + + + could not get column information + nie można uzyskać informacji o kolumnie + + + + DbStructureModel + + + Name + Nazwa + + + + Object + Obiekt + + + + Type + Typ + + + + Schema + Schemat + + + + Database + Baza danych + + + + Browsables + Obiekty do przeglądania + + + + All + Wszystkie + + + + Temporary + Tymczasowa + + + + Tables (%1) + Tabele (%1) + + + + Indices (%1) + Indeksy (%1) + + + + Views (%1) + Wyświetlenia (%1) + + + + Triggers (%1) + Uruchomienia (%1) + + + + EditDialog + + + Edit database cell + Edytuj komórkę bazy danych + + + + Mode: + Tryb: + + + + This is the list of supported modes for the cell editor. Choose a mode for viewing or editing the data of the current cell. + To jest lista dostępnych trybów dla edytora komórek. Wybierz tryb do wyświetlania lub edycji danych dla tej komórki. + + + + Text + Tekst + + + + Binary + Wartość binarna + + + + Image + Obraz + + + + JSON + JSON + + + + XML + XML + + + + + Automatically adjust the editor mode to the loaded data type + Automatycznie dostosuj tryb edytora w zależności od załadowanych danych + + + + This checkable button enables or disables the automatic switching of the editor mode. When a new cell is selected or new data is imported and the automatic switching is enabled, the mode adjusts to the detected data type. You can then change the editor mode manually. If you want to keep this manually switched mode while moving through the cells, switch the button off. + + + + + Auto-switch + Automatyczny przełącznik + + + + + Auto-format: pretty print on loading, compact on saving. + Auto-formatowanie: upiększa tekst przy ładowaniu i kompaktuje przy zapisywaniu. + + + + When enabled, the auto-format feature formats the data on loading, breaking the text in lines and indenting it for maximum readability. On data saving, the auto-format feature compacts the data removing end of lines, and unnecessary whitespace. + + + + + Autoformat + Automatyczne formatowanie + + + + Import from file + Importuj z pliku + + + + Opens a file dialog used to import any kind of data to this database cell. + Otwiera okno wyboru pliku z danymi do zaimportowania w tej komórce. + + + + &Import + &Importuj + + + + Export to file + Eksportuj do pliku + + + + Opens a file dialog used to export the contents of this database cell to a file. + Otwiera okno pozwalające na wyeksportowanie zawartości komórki do pliku. + + + + &Export + &Eksportuj + + + + Set this cell to NULL + Ustaw zawartość tej komórki jako NULL + + + + Erases the contents of the cell + Czyści zawartość komórki + + + + Set as &NULL + Ustaw jako &NULL + + + + This area displays information about the data present in this database cell + Tutaj wyświetlane są informacje o danych obecnych w tej komórce + + + + This editor mode lets you edit JSON or XML data with syntax highlighting, automatic formatting and validation before saving. + +Errors are indicated with a red squiggle underline. + + + + + Type of data currently in cell + Rodzaj danych obecnie znajdujących się w komórce + + + + Size of data currently in table + Rozmiar danych znajdujących się obecnie w tabeli + + + + Apply data to cell + Zapisz dane w komórce + + + + This button saves the changes performed in the cell editor to the database cell. + Ten przycisk zapisuje zmiany wykonane w edytorze komórki w komórce bazy danych. + + + + Apply + Zastosuj + + + + + Print... + Drukuj... + + + + Open preview dialog for printing displayed image + Otwórz podgląd wydruku dla aktualnie wyświetlonego obrazu + + + + + Ctrl+P + Ctrl+P + + + + Open preview dialog for printing displayed text + + + + + Copy Hex and ASCII + Kopiuj Hex i ASCII + + + + Copy selected hexadecimal and ASCII columns to the clipboard + + + + + Ctrl+Shift+C + Ctrl+Shift+C + + + + + Image data can't be viewed in this mode. + Obrazy nie mogą zostać wyświetlone w tym trybie. + + + + + Try switching to Image or Binary mode. + Przejdź do trybu obrazu lub wartości binarnej. + + + + + Binary data can't be viewed in this mode. + Wartość binarna nie może być wyświetlona w tym trybie. + + + + + Try switching to Binary mode. + Przejdź do trybu wartości binarnej. + + + + + + + Text files (*.txt) + Pliki Tekstowe (*.txt) + + + + + + JSON files (*.json) + Pliki JSON (*.json) + + + + + + + XML files (*.xml) + Pliki XML (*.xml) + + + + + Image files (%1) + Piki graficzne (%1) + + + + + + Binary files (*.bin) + Pliki Binarne (*.bin) + + + + + All files (*) + Wszystkie pliki (*) + + + + Choose a file to import + Wybierz plik do zaimportowania + + + + %1 Image + %1 Grafika + + + + SVG files (*.svg) + Pliki SVG (*.svg) + + + + + Hex dump files (*.txt) + Plik szesnastkowy (*.txt) + + + Text files (*.txt);;Image files (%1);;JSON files (*.json);;XML files (*.xml);;Binary files (*.bin);;All files (*) + Pliki tekstowe (*.txt);;Pliki obrazów (%1);;Pliki JSON (*.json);;Pliki XML (*.xml);;Pliki binarne (*.bin);;Wszystkie pliki (*) + + + Binary files(*.bin);;All files(*) + Pliki binarne(*.bin);;Wszystkie pliki(*) + + + Text files(*.txt);;All files(*) + Pliki tekstowe(*.txt);;Wszystkie pliki(*) + + + JSON files(*.json);;All files(*) + Pliki JSON(*.json);;Wszystkie pliki(*) + + + SVG files(*.svg);;All files(*) + Pliki SVG(*.svg);;Wszystkie pliki(*) + + + + Choose a filename to export data + Wybierz nazwę pliku dla wyeksportowanych danych + + + + Invalid data for this mode + Nieprawidłowe dane w tym trybie + + + + The cell contains invalid %1 data. Reason: %2. Do you really want to apply it to the cell? + + + + + + Type of data currently in cell: Text / Numeric + Rodzaj danych obecnie znajdujących się w komórce: Tekst/Liczba + + + + + + %n char(s) + + %n znak + %n znaki + %n znaków + + + + + Type of data currently in cell: %1 Image + Rodzaj danych obecnie znajdujących się w komórce: Obraz %1 + + + + %1x%2 pixel(s) + %1x%2 piksel(e) + + + + Type of data currently in cell: NULL + Rodzaj danych obecnie znajdujących się w komórce: NULL + + + + + %n byte(s) + + %n bajt + %n bajty + %n bajtów + + + + + Type of data currently in cell: Valid JSON + Rodzaj danych obecnie znajdujących się w komórce: Prawidłowy JSON + + + + Type of data currently in cell: Binary + Rodzaj danych obecnie znajdujących się w komórce: Wartość binarna + + + + EditIndexDialog + + + Edit Index Schema + Edytuj Schemat Indeksu + + + + &Name + &Nazwa + + + + &Table + &Tabela + + + + &Unique + &Unikalny + + + + For restricting the index to only a part of the table you can specify a WHERE clause here that selects the part of the table that should be indexed + + + + + Partial inde&x clause + + + + + Colu&mns + Kolu&mny + + + + Table column + Kolumna tabeli + + + + Type + Rodzaj + + + + Add a new expression column to the index. Expression columns contain SQL expression rather than column names. + + + + + Index column + Kolumna indeksu + + + + Order + Porządek + + + + Deleting the old index failed: +%1 + Usuwanie starego indeksu nie powiodło się: +%1 + + + + Creating the index failed: +%1 + Tworzenie indeksu nie powiodło się: +%1 + + + + EditTableDialog + + + Edit table definition + Edytuj definicję tabeli + + + + Table + Tabela + + + + Advanced + Zaawansowane + + + + Database schema + Schemat bazy danych + + + + Without Rowid + Bez ID rzędu + + + + Make this a 'WITHOUT rowid' table. Setting this flag requires a field of type INTEGER with the primary key flag set and the auto increment flag unset. + + + + + Fields + Pola + + + + Add field + Dodaj pole + + + + Remove field + Usuń pole + + + + Move field up + Przesuń pole w górę + + + + Move field down + Przesuń pole w dół + + + + Name + Nazwa + + + + Type + Rodzaj + + + + NN + NN + + + + Not null + Nie pusty + + + + PK + PK + + + + Primary key + + + + + AI + AI + + + + Autoincrement + + + + + U + U + + + + Unique + Unikatowy + + + + Default + Domyślny + + + + Default value + Domyślna wartość + + + + Check + Sprawdź + + + + Check constraint + + + + + Foreign Key + + + + + <html><head/><body><p><span style=" font-weight:600; color:#ff0000;">Warning: </span>There is something with this table definition that our parser doesn't fully understand. Modifying and saving this table might result in problems.</p></body></html> + + + + + Error creating table. Message from database engine: +%1 + + + + + There already is a field with that name. Please rename it first or choose a different name for this field. + + + + + This column is referenced in a foreign key in table %1 and thus its name cannot be changed. + + + + + There is at least one row with this field set to NULL. This makes it impossible to set this flag. Please change the table data first. + + + + + There is at least one row with a non-integer value in this field. This makes it impossible to set the AI flag. Please change the table data first. + + + + + Column '%1' has no unique data. + + Kolumna '%1' nie zawiera unikatowych danych. + + + + + This makes it impossible to set this flag. Please change the table data first. + + + + + Modifying this column failed. Error returned from database: +%1 + Modyfikowanie kolumny nie powiodło się. Otrzymany błąd: +%1 + + + + Are you sure you want to delete the field '%1'? +All data currently stored in this field will be lost. + + + + + Please add a field which meets the following criteria before setting the without rowid flag: + - Primary key flag set + - Auto increment disabled + + + + + Setting the rowid column for the table failed. Error message: +%1 + + + + + Changing the table schema failed. Error message: +%1 + Zmiana schematu tabeli nie powiodła się. Wiadomość o błędzie: +%1 + + + + ExportDataDialog + + + Export data as CSV + Eksportuj dane jako CSV + + + + Tab&le(s) + Tabe&la/e + + + + Colu&mn names in first line + Nazwy kolu&mn w pierwszym wierszu + + + + Fie&ld separator + Znak oddzie&lający pola + + + + , + , + + + + ; + ; + + + + Tab + Tab + + + + | + | + + + + + + Other + Inny + + + + &Quote character + &Znak cytatu + + + + " + " + + + + ' + ' + + + + New line characters + Znak nowej linii + + + + Windows: CR+LF (\r\n) + Windows: CR+LF (\r\n) + + + + Unix: LF (\n) + Unix: LF (\n) + + + + Pretty print + Upiększ wydruk + + + + Export data as JSON + Eksportuj dane jako JSON + + + + exporting CSV + eksportowanie CSV + + + + + Could not open output file: %1 + Nie można otworzyć pliku wyjściowego: %1 + + + + exporting JSON + eksportowanie JSON + + + + Text files(*.csv *.txt) + Pliki tekstowe(*.csv *.txt) + + + + Text files(*.json *.js *.txt) + Pliki tekstowe(*.json *.js *.txt) + + + + + Choose a filename to export data + Wybierz nazwę pliku dla eksportowanych danych + + + + Please select at least 1 table. + Wybierz przynajmniej jedną tabelę. + + + + Choose a directory + Wybierz położenie + + + + Export completed. + Eksportowanie zakończone. + + + + ExportSqlDialog + + + Export SQL... + Eksportuj SQL… + + + + Tab&le(s) + Tabel&a/e + + + + Select All + Zaznacz wszystkie + + + + Deselect All + Odznacz wszystkie + + + + &Options + &Opcje + + + + Keep column names in INSERT INTO + Pozostaw nazwy kolumn w INSERT INTO + + + + Multiple rows (VALUES) per INSERT statement + Wiele rzędów (Wartości) dla polecenia INSERT + + + + Export everything + Eksportuj wszystko + + + + Export schema only + Eksportuj tylko schemat + + + + Export data only + Eksportuj tylko dane + + + + Keep old schema (CREATE TABLE IF NOT EXISTS) + Zachowaj poprzedni schemat (CREATE TABLE IF NOT EXISTS) + + + + Overwrite old schema (DROP TABLE, then CREATE TABLE) + Zastąp poprzedni schemat (DROP TABLE, then CREATE TABLE) + + + + Please select at least one table. + Wybierz przynajmniej jedną tabelę. + + + + Choose a filename to export + Wybierz nazwę eksportowanego pliku + + + + Text files(*.sql *.txt) + Pliki tekstowe(*.sql *.txt) + + + + Export completed. + Eksportowanie zakończono. + + + + Export cancelled or failed. + Eksportowanie nie powiodło się lub zostało anulowane. + + + + ExtendedScintilla + + + + Ctrl+H + Ctrl+H + + + + + Ctrl+P + Ctrl+P + + + + Find and Replace... + Znajdź i zamień… + + + + Print... + Drukuj... + + + + ExtendedTableWidget + + + Use as Exact Filter + + + + + Containing + + + + + Not equal to + + + + + Greater than + + + + + Less than + + + + + Greater or equal + + + + + Less or equal + + + + + Between this and... + + + + + Set to NULL + Ustaw jako NULL + + + + Copy + Kopiuj + + + + Copy with Headers + + + + + Copy as SQL + + + + + Paste + Wklej + + + + Print... + + + + + Use in Filter Expression + + + + Use as Filter + Użyj jako filtru + + + + Alt+Del + Alt+Del + + + + Ctrl+Shift+C + Ctrl+Shift+C + + + + Ctrl+Alt+C + + + + + The content of the clipboard is bigger than the range selected. +Do you want to insert it anyway? + + + + + FileExtensionManager + + Dialog + Okno dialogowe + + + + File Extension Manager + Menadżer Rozszerzeń Plików + + + + &Up + &W górę + + + + &Down + W &dół + + + + &Add + Dod&aj + + + + &Remove + &Usuń + + + + + Description + Opis + + + + Extensions + Rozszerzenia + + + + *.extension + *.extension + + + + FilterLineEdit + + + Filter + Filtr + + + + These input fields allow you to perform quick filters in the currently selected table. +By default, the rows containing the input text are filtered out. +The following operators are also supported: +% Wildcard +> Greater than +< Less than +>= Equal to or greater +<= Equal to or less += Equal to: exact match +<> Unequal: exact inverse match +x~y Range: values between x and y + + + + + Set Filter Expression + + + + + What's This? + + + + + Is NULL + + + + + Is not NULL + + + + + Is empty + + + + + Is not empty + + + + + Equal to... + + + + + Not equal to... + + + + + Greater than... + + + + + Less than... + + + + + Greater or equal... + + + + + Less or equal... + + + + + In range... + + + + + FindReplaceDialog + + + Find and Replace + Znajdź i zastąp + + + + Fi&nd text: + Z&najdź tekst: + + + + Re&place with: + Zamień &z: + + + + Match &exact case + + + + + Match &only whole words + + + + + When enabled, the search continues from the other end when it reaches one end of the page + + + + + &Wrap around + + + + + When set, the search goes backwards from cursor position, otherwise it goes forward + + + + + Search &backwards + Szukaj &na odwrót + + + + <html><head/><body><p>When checked, the pattern to find is interpreted as a UNIX regular expression. See <a href="https://en.wikibooks.org/wiki/Regular_Expressions">Regular Expression in Wikibooks</a>.</p></body></html> + + + + + Use regular e&xpressions + + + + + Find the next occurrence from the cursor position and in the direction set by "Search backwards" + + + + + &Find Next + Z&najdź następne + + + + &Replace + &Zastąp + + + + Highlight all the occurrences of the text in the page + Podświetl wszystkie wystąpienia tekstu na stronie + + + + F&ind All + Znajdź wszystk&ie + + + + Replace all the occurrences of the text in the page + Zastąp wszystkie wystąpienia w tekście na stronie + + + + Replace &All + Z&amień wszystkie + + + + The searched text was not found + Nie znaleziono szukanego tekstu + + + + + The searched text was not found. + Nie znaleziono szukanego tekstu. + + + + The searched text was found one time. + Szukany tekst został znaleziony raz. + + + + The searched text was found %1 times. + Szukany tekst został znaleziony %1 razy. + + + + The searched text was replaced one time. + Szukany tekst został zamieniony raz. + + + + The searched text was replaced %1 times. + Szukany tekst został zamieniony %1 razy. + + + + ForeignKeyEditor + + + &Reset + &Resetuj + + + + Foreign key clauses (ON UPDATE, ON DELETE etc.) + + + + + ImportCsvDialog + + + Import CSV file + Importuj plik CSV + + + + Table na&me + &Nazwa tabeli + + + + &Column names in first line + &Nazwy kolumn w pierwszej linii + + + + Field &separator + &Znak oddzielający pola + + + + , + , + + + + ; + ; + + + + + Tab + Tab + + + + | + | + + + + + + Other + Inny + + + + &Quote character + Znak &cytatów + + + + " + " + + + + ' + ' + + + + &Encoding + Kodowani&e + + + + UTF-8 + UTF-8 + + + + UTF-16 + UTF-16 + + + + ISO-8859-1 + ISO-8859-1 + + + + Trim fields? + Przycinać pola? + + + + Separate tables + Oddzielaj tabele + + + + Advanced + Zaawansowane + + + + When importing an empty value from the CSV file into an existing table with a default value for this column, that default value is inserted. Activate this option to insert an empty value instead. + + + + + Ignore default &values + Ignoruj domyślne &wartości + + + + Activate this option to stop the import when trying to import an empty value into a NOT NULL column without a default value. + + + + + Fail on missing values + + + + + Disable data type detection + Wyłącz wykrywanie rodzajów danych + + + + Disable the automatic data type detection when creating a new table. + Wyłącz automatyczne wykrywanie rodzaju danych przy tworzeniu nowej tabeli. + + + + + Deselect All + Odznacz wszystkie + + + + Match Similar + + + + + Import completed + Zakończono importowanie + + + + Select All + Zaznacz wszystkie + + + + There is already a table named '%1' and an import into an existing table is only possible if the number of columns match. + Tabela o nazwie '%1' już istnieje i importowanie do istniejącej tabeli jest możliwe tylko gdy liczba kolumn zgadza się. + + + + There is already a table named '%1'. Do you want to import the data into it? + Tabela o nazwie '%1' już istnieje. Czy chcesz zaimportować dane do niej? + + + + Creating restore point failed: %1 + + + + + Creating the table failed: %1 + Tworzenie tabeli nie powiodło się: %1 + + + + importing CSV + importowanie CSV + + + + Inserting row failed: %1 + Wstawianie rzędu nie powiodło się: %1 + + + + Importing the file '%1' took %2ms. Of this %3ms were spent in the row function. + + + + + MainWindow + + + DB Browser for SQLite + Przeglądarka baz danych dla SQLite + + + + Database Structure + Struktura bazy danych + + + + <html><head/><body><p>This button creates a new record in the database. Hold the mouse button to open a pop-up menu of different options:</p><ul><li><span style=" font-weight:600;">New Record</span>: insert a new record with default values in the database.</li><li><span style=" font-weight:600;">Insert Values...</span>: open a dialog for entering values before they are inserted in the database. This allows to enter values acomplishing the different constraints. This dialog is also open if the <span style=" font-weight:600;">New Record</span> option fails due to these constraints.</li></ul></body></html> + + + + + This is the database table view. You can do the following actions: + - Start writing for editing inline the value. + - Double-click any record to edit its contents in the cell editor window. + - Alt+Del for deleting the cell content to NULL. + - Ctrl+" for duplicating the current record. + - Ctrl+' for copying the value from the cell above. + - Standard selection and copy/paste operations. + + + + + <html><head/><body><p><a href="https://www.sqlite.org/pragma.html#pragma_case_sensitive_like">Case Sensitive Like</a></p></body></html> + + + + + Warning: this pragma is not readable and this value has been inferred. Writing the pragma might overwrite a redefined LIKE provided by an SQLite extension. + + + + + toolBar1 + toolBar1 + + + + This is the structure of the opened database. +You can drag SQL statements from an object row and drop them into other applications or into another instance of 'DB Browser for SQLite'. + + + + + + Browse Data + Przeglądaj dane + + + + &Table: + &Tabela: + + + + Select a table to browse data + Wybierz tabelę aby przeglądać dane + + + + Use this list to select a table to be displayed in the database view + Użyj tej listy aby zaznaczyć tabelę wyświetlaną w widoku bazy danych + + + + Refresh the data in the selected table + Odśwież dane w zaznaczonej tabeli + + + + This button refreshes the data in the currently selected table. + Ten przycisk odświeża dane w obecnie zaznaczonej tabeli. + + + + Clear all filters + Wyczyść wszystkie filtry + + + + This button clears all the filters set in the header input fields for the currently browsed table. + + + + + Save the table as currently displayed + Zapisz tabelę tak, jak jest widoczna + + + + <html><head/><body><p>This popup menu provides the following options applying to the currently browsed and filtered table:</p><ul style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;"><li style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Export to CSV: this option exports the data of the browsed table as currently displayed (after filters, display formats and order column) to a CSV file.</li><li style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Save as view: this option saves the current setting of the browsed table (filters, display formats and order column) as an SQL view that you can later browse or use in SQL statements.</li></ul></body></html> + + + + + ... + + + + + Insert a new record in the current table + Umieść nowy rekord w obecnej tabeli + + + This button creates a new, empty record in the database + Ten przycisk tworzy nowy, pusty rekord w bazie danych + + + + + New Record + Nowy rekord + + + + Delete the current record + Usuń obecny rekord + + + + This button deletes the record or records currently selected in the table + Ten przycisk usuwa obecnie zazanczony rekord lub rekordy z tabeli + + + + + Delete Record + Usuń rekord + + + This is the database view. You can double-click any record to edit its contents in the cell editor window. + To jest widok bazy danych. Możesz nacisnąć dwukrotnie na rekord, aby zedytować jego zawartość w oknie edytora komórek. + + + + <html><head/><body><p>Scroll to the beginning</p></body></html> + <html><head/><body><p>Przewiń na początek</p></body></html> + + + + <html><head/><body><p>Clicking this button navigates to the beginning in the table view above.</p></body></html> + <html><head/><body><p>Naciśnięcie tego przycisku kieruje na początek powyższego widoku tabeli.</p></body></html> + + + + |< + |< + + + + Scroll one page upwards + Przewiń jedną stronę w górę + + + + <html><head/><body><p>Clicking this button navigates one page of records upwards in the table view above.</p></body></html> + <html><head/><body><p>Naciśnięcie tego przycisku przenosi o jedną stronę wyżej w powyższym widoku tabeli.</p></body></html> + + + + < + < + + + + 0 - 0 of 0 + 0 - 0 z 0 + + + + Scroll one page downwards + Przewiń jedną stronę w dół + + + + <html><head/><body><p>Clicking this button navigates one page of records downwards in the table view above.</p></body></html> + <html><head/><body><p>Naciśnięcie tego przycisku przenosi o jedną stronę niżej w powyższym widoku tabeli.</p></body></html> + + + + > + > + + + + Scroll to the end + Przewiń na koniec + + + + <html><head/><body><p>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Clicking this button navigates up to the end in the table view above.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</p></body></html> + <html><head/><body><p>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Naciśnięcie tego przycisku przenosi na koniec powyższego widoku tabeli.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</p></body></html> + + + + >| + >| + + + + <html><head/><body><p>Click here to jump to the specified record</p></body></html> + <html><head/><body><p>Naciśnij tutaj aby przejść do określonego rekordu</p></body></html> + + + + <html><head/><body><p>This button is used to navigate to the record number specified in the Go to area.</p></body></html> + + + + + Go to: + Przejdź do: + + + + Enter record number to browse + Wprowadź numer rekordu do przeglądania + + + + Type a record number in this area and click the Go to: button to display the record in the database view + + + + + 1 + 1 + + + + Edit Pragmas + + + + None + Brak + + + Delete + Usuń + + + Normal + Normalne + + + Default + Domyślnie + + + File + Plik + + + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_user_version">User Version</a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_user_version">Wersja użytkownika</a></p></body></html> + + + + Execute SQL + Wykonaj SQL + + + + &File + &Plik + + + + &Import + &Importuj + + + + &Export + &Eksportuj + + + + &Edit + &Edytuj + + + + &View + &Widok + + + + &Help + Po&moc + + + + &Tools + + + + + DB Toolbar + Pasek zadań bazy danych + + + + Edit Database &Cell + Edytuj &komórkę bazy danych + + + + SQL &Log + Dziennik SQ&L + + + + Show S&QL submitted by + + + + + User + Użytkownika + + + + Application + Aplikację + + + + This button clears the contents of the SQL logs + Ten przycisk czyści zawartość logów SQL + + + + &Clear + Wy&czyść + + + + This panel lets you examine a log of all SQL commands issued by the application or by yourself + + + + + &Plot + + + + + DB Sche&ma + Sche&mat bazy danych + + + + &Remote + + + + + + Project Toolbar + Pasek zadań projektu + + + + Extra DB toolbar + Dodatkowy pasek zadań bazy danych + + + + + + Close the current database file + Zamknij obecny plik bazy danych + + + + &New Database... + &Nowa baza danych… + + + + + Create a new database file + Utwórz nowy plik bazy danych + + + + This option is used to create a new database file. + Ta opcja jest wykorzystywana do tworzenia nowego pliku bazy danych. + + + + Ctrl+N + Ctrl+N + + + + + &Open Database... + &Otwórz bazę danych… + + + + + + + + Open an existing database file + Otwórz istniejącą bazę danych + + + + + + This option is used to open an existing database file. + Ta opcja otwiera istniejący plik bazy danych. + + + + + Ctrl+O + Ctrl+O + + + + &Close Database + Zamknij bazę dany&ch + + + + This button closes the connection to the currently open database file + Ten przycisk kończy połączenie z obecnie otwartym plikiem bazy danych + + + + Ctrl+W + Ctrl+W + + + + &Revert Changes + Odw&róć zmiany + + + + + Revert database to last saved state + Przywróć bazę danych do ostatniego zapisanego stanu + + + + This option is used to revert the current database file to its last saved state. All changes made since the last save operation are lost. + + + + + &Write Changes + &Zapisz zmiany + + + + + Write changes to the database file + Zapisz zmiany w pliku bazy danych + + + + This option is used to save changes to the database file. + Ta opcja zapisuje zmiany w pliku bazy danych. + + + + Ctrl+S + Ctrl+S + + + + This is the structure of the opened database. +You can drag multiple object names from the Name column and drop them into the SQL editor and you can adjust the properties of the dropped names using the context menu. This would help you in composing SQL statements. +You can drag SQL statements from the Schema column and drop them into the SQL editor or into other applications. + + + + + + Print currently browsed table data + + + + + Print currently browsed table data. Print selection if more than one cell is selected. + + + + + Compact &Database... + + + + + Compact the database file, removing space wasted by deleted records + + + + + + Compact the database file, removing space wasted by deleted records. + + + + + E&xit + &Wyjdź + + + + Ctrl+Q + Ctrl+Q + + + + &Database from SQL file... + Baza &danych z pliku SQL… + + + + Import data from an .sql dump text file into a new or existing database. + + + + + This option lets you import data from an .sql dump text file into a new or existing database. SQL dump files can be created on most database engines, including MySQL and PostgreSQL. + + + + + &Table from CSV file... + &Tabela z pliku CSV… + + + + Open a wizard that lets you import data from a comma separated text file into a database table. + + + + + Open a wizard that lets you import data from a comma separated text file into a database table. CSV files can be created on most database and spreadsheet applications. + + + + + &Database to SQL file... + Baza &danych fo pliku SQL… + + + + Export a database to a .sql dump text file. + + + + + This option lets you export a database to a .sql dump text file. SQL dump files contain all data necessary to recreate the database on most database engines, including MySQL and PostgreSQL. + + + + + &Table(s) as CSV file... + &Tabela/e jako plik CSV… + + + + Export a database table as a comma separated text file. + Eksportuje tabelę bazy danych jako plik tekstowy, oddzielając wartości przecinkami. + + + + Export a database table as a comma separated text file, ready to be imported into other database or spreadsheet applications. + Eksportuje tabelę bazy danych jako plik tekstowym który można zaimportować w innych aplikacjach bazodanowych lub arkuszach kalkulacyjnych; oddzielając wartości przecinkami. + + + + &Create Table... + &Utwórz tabelę… + + + + Open the Create Table wizard, where it is possible to define the name and fields for a new table in the database + Otwiera okno tworzenia tabel, gdzie można zdefiniować nazwę i pola w nowej tabeli w bazie danych + + + + &Delete Table... + U&suń tabelę… + + + + + Delete Table + Usuń tabelę + + + + Open the Delete Table wizard, where you can select a database table to be dropped. + + + + + &Modify Table... + &Modyfikuj tabelę… + + + + Open the Modify Table wizard, where it is possible to rename an existing table. It is also possible to add or delete fields form a table, as well as modify field names and types. + + + + + Create &Index... + Utwórz &indeks… + + + + Open the Create Index wizard, where it is possible to define a new index on an existing database table. + + + + + &Preferences... + &Preferencje… + + + + + Open the preferences window. + Otwiera okno preferencji. + + + + &DB Toolbar + Pasek narzędzi bazy &danych + + + + Shows or hides the Database toolbar. + Pokazuje lub ukrywa pasek narzędzi Baza danych + + + + + Ctrl+T + Ctrl+T + + + + W&hat's This? + &Co to jest? + + + + Shift+F1 + Shift+F1 + + + + &About + + + + + &Load Extension... + + + + + &Wiki + + + + + Bug &Report... + + + + + Feature Re&quest... + + + + + Web&site + + + + + &Donate on Patreon... + + + + + Sa&ve Project... + + + + + Open &Project... + + + + + &Attach Database... + + + + + &Set Encryption... + + + + + This button saves the content of the current SQL editor tab to a file + + + + + SQLCipher &FAQ + + + + + Insert Values... + + + + + + Open a dialog for inserting values in a new record + + + + + + Insert new record using default values in browsed table + + + + + New In-&Memory Database + + + + + Drag && Drop Qualified Names + + + + + + Use qualified names (e.g. "Table"."Field") when dragging the objects and dropping them into the editor + + + + + Drag && Drop Enquoted Names + + + + + + Use escaped identifiers (e.g. "Table1") when dragging the objects and dropping them into the editor + + + + + &Integrity Check + + + + + Runs the integrity_check pragma over the opened database and returns the results in the Execute SQL tab. This pragma does an integrity check of the entire database. + + + + + &Foreign-Key Check + + + + + Runs the foreign_key_check pragma over the opened database and returns the results in the Execute SQL tab + + + + + &Quick Integrity Check + + + + + Run a quick integrity check over the open DB + + + + + Runs the quick_check pragma over the opened database and returns the results in the Execute SQL tab. This command does most of the checking of PRAGMA integrity_check but runs much faster. + + + + + &Optimize + + + + + Attempt to optimize the database + + + + + Runs the optimize pragma over the opened database. This pragma might perform optimizations that will improve the performance of future queries. + + + + + + Print + + + + + Print text from current SQL editor tab + + + + + Open a dialog for printing the text in the current SQL editor tab + + + + + Print the structure of the opened database + + + + + Open a dialog for printing the structure of the opened database + + + + &About... + O progr&amie… + + + + &Recently opened + Ostatnio otwie&rane + + + + Open &tab + Otwórz kar&tę + + + + This button opens a new tab for the SQL editor + Ten przycisk otwiera nową tabelę w edytorze SQL + + + + &Execute SQL + &Wykonaj SQL + + + + Execute all/selected SQL + Wykonaj wszystkie/zaznaczone SQL + + + + This button executes the currently selected SQL statements. If no text is selected, all SQL statements are executed. + + + + + Open SQL file + Otwórz plik SQL + + + + This button opens a file containing SQL statements and loads it in a new editor tab + + + + + + + Save SQL file + Zapisz plik SQL + + + &Load extension + &Załaduj rozszerzenie + + + + Execute current line + Wykonaj obecny wiersz + + + + Execute current line + Wykonaj obecny wiersz + + + + This button executes the SQL statement present in the current editor line + Ten przycisk wykonuje polecenie SQL z obecnego wiersza edytora + + + + Shift+F5 + Shift+F5 + + + + Export as CSV file + Eksportuj jako plik CSV + + + + Export table as comma separated values file + Eksportuj tabelę jako plik z wartościami oddzielonymi przecinkami + + + &Wiki... + &Wiki… + + + Bug &report... + &Zgłoś błędy… + + + Web&site... + &Strona internetowa… + + + Sa&ve Project + &Zapisz projekt + + + + + Save the current session to a file + Zapisz obecną sesję do pliku + + + + This button lets you save all the settings associated to the open DB to a DB4S project file + + + + Open &Project + Otwórz &projekt + + + + + Load a working session from a file + + + + + This button lets you open a DB4S project file + + + + &Attach Database + Z&ałącz bazę danych + + + + + Add another database file to the current database connection + + + + + This button lets you add another database file to the current database connection + + + + &Set Encryption + U&staw szyfrowanie + + + + + Save SQL file as + Zapisz plik SQL jako + + + + &Browse Table + &Przeglądaj tabelę + + + + Copy Create statement + + + + + Copy the CREATE statement of the item to the clipboard + + + + + Edit display format + Edytuj format wyświetlania + + + + Edit the display format of the data in this column + + + + + Show rowid column + + + + + Toggle the visibility of the rowid column + + + + + + Set encoding + Ustaw kodowanie + + + + Change the encoding of the text in the table cells + + + + + Set encoding for all tables + + + + + Change the default encoding assumed for all tables in the database + + + + SQLCipher &FAQ... + &FAQ SQLCipher… + + + + Opens the SQLCipher FAQ in a browser window + Otwiera FAQ SQLCipher w oknie przeglądarki + + + + Table(&s) to JSON... + Tabela/e do J&SON… + + + + Export one or more table(s) to a JSON file + Eksportuj jedną lub więcej tabel do pliku JSON + + + + Refresh + Odśwież + + + + F5 + F5 + + + + Open Data&base Read Only... + Otwórz &bazę danych tylko do odczytu… + + + + Open an existing database file in read only mode + Otwórz istniejący plik bazy danych w trybie tylko do odczytu + + + + Unlock view editing + + + + + This unlocks the current view for editing. However, you will need appropriate triggers for editing. + + + + + Save results + Zapisz wyniki + + + + Save the results view + + + + + This button lets you save the results of the last executed query + + + + + Find text in SQL editor + Znajdź tekst w edytorze SQL + + + + Find text in SQL editor + Znajdź tekst w edytorze SQL + + + + This button opens the search bar of the editor + + + + + Ctrl+F + Ctrl+F + + + + Find or replace text in SQL editor + Znajdź lub zastąp tekst w edytorze SQL + + + + Find or replace text in SQL editor + Znajdź lub zastąp tekst w edytorze SQL + + + + This button opens the find/replace dialog for the current editor tab + + + + + + Export to &CSV + Eksportuj do &CSV + + + + + Save as &view + Zapisz jako &widok + + + + Save as view + Zapisz jako widok + + + + Hide column(s) + Ukryj kolumnę/y + + + + Hide selected column(s) + Ukryj zaznaczoną/e kolumnę/y + + + + Show all columns + Pokaż wszystkie kolumny + + + + Show all columns that were hidden + Pokaż wszystkie ukryte kolumny + + + + Shows or hides the Project toolbar. + Pokazuje lub ukrywa pasek narzędzi Projekt. + + + + Extra DB Toolbar + Dodatkowy pasek narzędzi bazy danych + + + + + Export the filtered data to CSV + Eksportuj przefiltrowane dane do CSV + + + + This button exports the data of the browsed table as currently displayed (after filters, display formats and order column) as a CSV file. + + + + + + Save the current filter, sort column and display formats as a view + + + + + This button saves the current setting of the browsed table (filters, display formats and order column) as an SQL view that you can later browse or use in SQL statements. + + + + + Ctrl+Return + Ctrl+Return + + + + Ctrl+L + Ctrl+L + + + + Ctrl+P + Ctrl+P + + + + Ctrl+D + Ctrl+D + + + + Ctrl+I + Ctrl+I + + + + Ctrl+E + Ctrl+E + + + + Encrypted + Szyfrowana + + + + Database is encrypted using SQLCipher + Baza danych jest zaszyfrowana z użyciem SQLCipher + + + + Read only + Tylko do odczytu + + + + Database file is read only. Editing the database is disabled. + Plik bazy danych jest tylko do odczytu. Edytowanie bazy danych jest wyłączone. + + + + Database encoding + Kodowanie bazy danych + + + + + Choose a database file + Wybierz plik bazy danych + + + + Could not open database file. +Reason: %1 + Nie można otworzyć pliku bazy danych. +Powód: %1 + + + + + + Choose a filename to save under + Wybierz nazwę pliku do zapisu + + + Error adding record: + + Błąd podczas dodawania rekordu: + + + + + Error deleting record: +%1 + Błąd podczas usuwania rekordu: +%1 + + + + Please select a record first + Najpierw wybierz rekord + + + + determining row count... + określanie liczby rzędów… + + + + %1 - %2 of >= %3 + %1 - %2 z >= %3 + + + + %1 - %2 of %3 + %1 - %2 z %3 + + + + + There is no database opened. Please open or create a new database file. + Brak otwartych baz danych. Otwórz lub utwórz nowy plik bazy danych. + + + Are you sure you want to delete the %1 '%2'? +All data associated with the %1 will be lost. + Czy na pewno chcesz usunąć %1 '%2'? +Wszystkie dane powiązane z %1 zostaną utracone. + + + Error: could not delete the %1. Message from database engine: +%2 + Błąd: nie można usunąć %1. Wiadomość z silnika bazy danych: +%2 + + + + Setting PRAGMA values or vacuuming will commit your current transaction. +Are you sure? + + + + + Execution aborted by user + Wykonywanie przerwane przez użytkownika + + + + executing query + + + + + , %1 rows affected + + + + + In-Memory database + + + + + Are you sure you want to delete the table '%1'? +All data associated with the table will be lost. + + + + + Are you sure you want to delete the view '%1'? + + + + + Are you sure you want to delete the trigger '%1'? + + + + + Are you sure you want to delete the index '%1'? + + + + + Error: could not delete the table. + + + + + Error: could not delete the view. + + + + + Error: could not delete the trigger. + + + + + Error: could not delete the index. + + + + + Message from database engine: +%1 + + + + + Editing the table requires to save all pending changes now. +Are you sure you want to save the database? + + + + + Error checking foreign keys after table modification. The changes will be reverted. + + + + + This table did not pass a foreign-key check.<br/>You should run 'Tools | Foreign-Key Check' and fix the reported issues. + + + + + -- EXECUTING SELECTION IN '%1' +-- + + + + + -- EXECUTING LINE IN '%1' +-- + + + + + -- EXECUTING ALL IN '%1' +-- + + + + + %1 rows returned in %2ms + + + + + query executed successfully. Took %1ms%2 + + + + + -- At line %1: +%4 +-- Result: %3 + + + + + Choose text files + Wybierz pliki tekstowe + + + + Text files(*.csv *.txt);;All files(*) + Pliki tekstowe(*.csv *.txt);;Wszystkie pliki(*) + + + + Error while saving the database file. This means that not all changes to the database were saved. You need to resolve the following error first. + +%1 + + + + + Are you sure you want to undo all changes made to the database file '%1' since the last save? + + + + + Choose a file to import + Wybierz pliki do zaimportowania + + + + + + Text files(*.sql *.txt);;All files(*) + Pliki tekstowe(*.sql *.txt);;Wszystkie pliki(*) + + + + Do you want to create a new database file to hold the imported data? +If you answer no we will attempt to import the data in the SQL file to the current database. + + + + + File %1 already exists. Please choose a different name. + Plik %1 już istnieje. Wybierz inną nazwę. + + + + Error importing data: %1 + Błąd importowania danych: %1 + + + + Import completed. Some foreign key constraints are violated. Please fix them before saving. + + + + + Import completed. + Importowanie zakończone. + + + + Delete View + Usuń widok + + + + Modify View + Modyfikuj widok + + + + Delete Trigger + + + + + Modify Trigger + + + + + Delete Index + Usuń indeks + + + + Modify Index + Modyfikuj indeks + + + + Modify Table + Modyfikuj tabelę + + + + &%1 %2 + &%1 %2 + + + + Setting PRAGMA values will commit your current transaction. +Are you sure? + + + + + Select SQL file to open + Wybierz plik SQL do otworzenia + + + + Couldn't read file: %1. + Nie można odczytać pliku: %1. + + + + Couldn't save file: %1. + Nie można zapisać pliku: %1. + + + + Select file name + Wybierz nazwę pliku + + + + Select extension file + Wybierz plik rozszerzenia + + + + Extensions(*.so *.dll);;All files(*) + Rozszerzenia(*.so *.dll);;Wszystkie pliki(*) + + + + Extension successfully loaded. + Pomyślnie załadowano rozszerzenie. + + + + Error loading extension: %1 + Błąd ładowania rozszerzenia: %1 + + + + + Don't show again + Nie pokazuj ponownie + + + + New version available. + Nowa wersja jest dostępna. + + + + A new DB Browser for SQLite version is available (%1.%2.%3).<br/><br/>Please download at <a href='%4'>%4</a>. + + + + + Choose a project file to open + Wybierz plik projektu do otworzenia + + + + + DB Browser for SQLite project file (*.sqbpro) + Plik projektu Przeglądarki baz danych SQLite (*.sqbpro) + + + + This project file is using an old file format because it was created using DB Browser for SQLite version 3.10 or lower. Loading this file format is still fully supported but we advice you to convert all your project files to the new file format because support for older formats might be dropped at some point in the future. You can convert your files by simply opening and re-saving them. + + + + + Duplicate records + + + + + Duplicate record + + + + + Ctrl+" + Ctrl+" + + + + Please choose a new encoding for all tables. + Wybierz nowe kodowanie dla wszystkich tabel. + + + + Please choose a new encoding for this table. + Wybierz kodowanie dla tej tabeli + + + + %1 +Leave the field empty for using the database encoding. + + + + + This encoding is either not valid or not supported. + To kodowanie jest nieprawidłowe lub nieobsługiwane + + + + Please enter a pseudo-primary key in order to enable editing on this view. This should be the name of a unique column in the view. + + + + + Collation needed! Proceed? + + + + + A table in this database requires a special collation function '%1' that this application can't provide without further knowledge. +If you choose to proceed, be aware bad things can happen to your database. +Create a backup! + + + + + creating collation + + + + + Set a new name for the SQL tab. Use the '&&' character to allow using the following character as a keyboard shortcut. + + + + + Please specify the view name + Określ nazwę widoku + + + + There is already an object with that name. Please choose a different name. + + + + + View successfully created. + Pomyślnie utworzono widok. + + + + Error creating view: %1 + Błąd tworzenia widoku: %1 + + + + There is no filter set for this table. View will not be created. + Nie ustawiono filtru dla tej tabeli. Widok nie zostanie utworzony. + + + + Delete Records + Usuń rekordy + + + + This action will open a new SQL tab for running: + + + + + Press Help for opening the corresponding SQLite reference page. + + + + + NullLineEdit + + + Set to NULL + Ustaw jako NULL + + + + Alt+Del + Alt+Del + + + + PlotDock + + + Plot + Wykres + + + + <html><head/><body><p>This pane shows the list of columns of the currently browsed table or the just executed query. You can select the columns that you want to be used as X or Y axis for the plot pane below. The table shows detected axis type that will affect the resulting plot. For the Y axis you can only select numeric columns, but for the X axis you will be able to select:</p><ul style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;"><li style=" margin-top:12px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Date/Time</span>: strings with format &quot;yyyy-MM-dd hh:mm:ss&quot; or &quot;yyyy-MM-ddThh:mm:ss&quot;</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Date</span>: strings with format &quot;yyyy-MM-dd&quot;</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Time</span>: strings with format &quot;hh:mm:ss&quot;</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Label</span>: other string formats. Selecting this column as X axis will produce a Bars plot with the column values as labels for the bars</li><li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Numeric</span>: integer or real values</li></ul><p>Double-clicking the Y cells you can change the used color for that graph.</p></body></html> + + + + + Columns + Kolumny + + + + X + + + + + Y + Y + + + + Axis Type + Rodzaj osi + + + + Here is a plot drawn when you select the x and y values above. + +Click on points to select them in the plot and in the table. Ctrl+Click for selecting a range of points. + +Use mouse-wheel for zooming and mouse drag for changing the axis range. + +Select the axes or axes labels to drag and zoom only in that orientation. + + + + + Line type: + Rodzaj linii: + + + + + None + Brak + + + + Line + Linia + + + + StepLeft + + + + + StepRight + + + + + StepCenter + + + + + Impulse + Impuls + + + + Point shape: + Kształt punktu: + + + + Cross + Krzyż + + + + Plus + Plus + + + + Circle + Kółko + + + + Disc + Dysk + + + + Square + Kwadrat + + + + Diamond + Diament + + + + Star + Gwiazda + + + + Triangle + Trójkąt + + + + TriangleInverted + + + + + CrossSquare + + + + + PlusSquare + + + + + CrossCircle + + + + + PlusCircle + + + + + Peace + + + + + <html><head/><body><p>Save current plot...</p><p>File format chosen by extension (png, jpg, pdf, bmp)</p></body></html> + + + + + Save current plot... + Zapisz obecny wykres… + + + + + Load all data and redraw plot + + + + + Copy + Kopiuj + + + + Print... + + + + + Show legend + + + + + Stacked bars + + + + + Date/Time + Data/Czas + + + + Date + Data + + + + Time + Czas + + + + + Numeric + + + + + Label + Podpis + + + + Invalid + Nieprawidłowy + + + + + + Row # + Rząd # + + + + Load all data and redraw plot. +Warning: not all data has been fetched from the table yet due to the partial fetch mechanism. + + + + + Choose an axis color + Wybierz kolor osi + + + + Choose a filename to save under + Wybierz nazwę pliku do zapisu + + + + PNG(*.png);;JPG(*.jpg);;PDF(*.pdf);;BMP(*.bmp);;All Files(*) + PNG(*.png);;JPG(*.jpg);;PDF(*.pdf);;BMP(*.bmp);;Wszystkie pliki(*) + + + + There are curves in this plot and the selected line style can only be applied to graphs sorted by X. Either sort the table or query by X to remove curves or select one of the styles supported by curves: None or Line. + + + + + PreferencesDialog + + + Preferences + Preferencje + + + + &General + &Ogólne + + + + Default &location + Domyś&lne położenie + + + + Remember last location + Pamiętaj ostatnie położenie + + + + Always use this location + Zawsze używaj tego położenia + + + + Remember last location for session only + Pamiętaj ostatnie położenie tylko przez jedną sesję + + + + + + ... + + + + + Lan&guage + &Język + + + + Toolbar style + Styl paska narzędzi + + + + Only display the icon + Wyświetlaj tylko ikonę + + + + Only display the text + Wyświetlaj tylko tekst + + + + The text appears beside the icon + Tekst obok ikony + + + + The text appears under the icon + Tekst pod ikoną + + + + Follow the style + Zgodnie ze stylem + + + + Show remote options + + + + + + + + + + + + enabled + + + + + Automatic &updates + A&utomatyczne aktualizacje + + + + DB file extensions + Rozszerzenia plików bazy danych + + + + Manage + Zarządzaj + + + + &Database + Baza &danych + + + + Database &encoding + Kodowani&e bazy danych + + + + Open databases with foreign keys enabled. + + + + + &Foreign keys + + + + + Remove line breaks in schema &view + + + + + When enabled, the line breaks in the Schema column of the DB Structure tab, dock and printed output are removed. + + + + + Prefetch block si&ze + + + + + Advanced + Zaawansowane + + + + SQ&L to execute after opening database + SQ&L do wykonania po otworzeniu bazy danych + + + + Default field type + Domyślny rodzaj typu + + + + Data &Browser + &Przeglądarka danych + + + + Font + Czcionka + + + + &Font + &Czcionka + + + + Font si&ze + Ro&zmiar czcionki + + + + Content + Zawartość + + + + Symbol limit in cell + Limit znaków w komórce + + + + + This is the maximum number of rows in a table for enabling the value completion based on current values in the column. +Can be set to 0 for disabling completion. + + + + + Row count threshold for completion + + + + + Field display + Wyświetlanie pola + + + + Displayed &text + Wyświetlany &tekst + + + + Binary + Wartość binarna + + + + NULL + NULL + + + + Regular + + + + + Text color + Kolor tekstu + + + + Background color + Kolor tła + + + + Preview only (N/A) + + + + + Filters + Filtry + + + + Escape character + Znak wyjścia + + + + Delay time (&ms) + Czas odstępu (&ms) + + + + Set the waiting time before a new filter value is applied. Can be set to 0 for disabling waiting. + + + + + &SQL + &SQL + + + + Settings name + Nazwa ustawienia + + + + Context + Kontekst + + + + Colour + + + + + Bold + Pogrubienie + + + + Italic + Pochylenie + + + + Underline + Podkreślenie + + + + Keyword + Słowo kluczowe + + + + Function + Funkcja + + + + Table + Tabela + + + + Comment + Komentarz + + + + Identifier + Identyfikator + + + + String + Ciąg znaków + + + + Current line + Obecny wiersz + + + + Background + Tło + + + + Foreground + Pierwszy plan + + + + SQL &editor font size + Rozmiar czcionki &edytora SQL + + + + SQL &results font size + &Rozmiar czcionki wyników SQL + + + + Tab size + Rozmiar tabulatora + + + + SQL editor &font + &Czcionka edytora SQL + + + + &Wrap lines + + + + + &Quotes for identifiers + + + + + Choose the quoting mechanism used by the application for identifiers in SQL code. + + + + + "Double quotes" - Standard SQL (recommended) + + + + + `Grave accents` - Traditional MySQL quotes + + + + + [Square brackets] - Traditional MS SQL Server quotes + + + + + Code co&mpletion + Uzupełnianie &kodu + + + + Keywords in &UPPER CASE + + + + + When set, the SQL keywords are completed in UPPER CASE letters. + + + + + Error indicators + Wskaźniki błędów + + + + When set, the SQL code lines that caused errors during the last execution are highlighted and the results frame indicates the error in the background + + + + + Hori&zontal tiling + + + + + If enabled the SQL code editor and the result table view are shown side by side instead of one over the other. + + + + + Never + Nigdy + + + + At word boundaries + + + + + At character boundaries + + + + + At whitespace boundaries + + + + Wrap lines + Zawijaj wiersze + + + + &Extensions + Rozsz&erzenia + + + + Select extensions to load for every database: + Wybierz rozszerzenia ładowane w każdej bazie danych: + + + + Add extension + Dodaj rozszerzenie + + + + Remove extension + Usuń rozszerzenie + + + + <html><head/><body><p>While supporting the REGEXP operator SQLite doesn't implement any regular expression<br/>algorithm but calls back the running application. DB Browser for SQLite implements this<br/>algorithm for you to let you use REGEXP out of the box. However, as there are multiple possible<br/>implementations of this and you might want to use another one, you're free to disable the<br/>application's implementation and load your own by using an extension. Requires restart of the application.</p></body></html> + + + + + Disable Regular Expression extension + Wyłącz rozszerzenie wyrażeń regularnych + + + + <html><head/><body><p>SQLite provides an SQL function for loading extensions from a shared library file. Activate this if you want to use the <span style=" font-style:italic;">load_extension()</span> function from SQL code.</p><p>For security reasons, extension loading is turned off by default and must be enabled through this setting. You can always load extensions through the GUI, even though this option is disabled.</p></body></html> + + + + + Allow loading extensions from SQL code + + + + + Remote + Zdalne działania + + + + CA certificates + Certyfikaty CA + + + + + Subject CN + Temat CN + + + + Common Name + + + + + Subject O + + + + + Organization + Organizacja + + + + + Valid from + Ważny od + + + + + Valid to + Ważny do + + + + + Serial number + Numer seryjny + + + + Your certificates + Twoje certyfikaty + + + + File + Plik + + + + Subject Common Name + + + + + Issuer CN + + + + + Issuer Common Name + + + + + Clone databases into + Klonuj bazy danych do + + + + + Choose a directory + Wybierz katalog + + + + The language will change after you restart the application. + Język zmieni się po ponownym uruchomieniu aplikacji. + + + + Select extension file + Wybierz plik rozszerzenia + + + + Extensions(*.so *.dll);;All files(*) + Rozszerzenia(*.so *.dll);;Wszystkie pliki(*) + + + + Import certificate file + Importuj plik certyfikatu + + + + No certificates found in this file. + Nie znaleziono certyfikatów w tym pliku. + + + + Are you sure you want do remove this certificate? All certificate data will be deleted from the application settings! + + + + + Are you sure you want to clear all the saved settings? +All your preferences will be lost and default values will be used. + + + + + QObject + + + All files (*) + Wszystkie pliki (*) + + + + Error importing data + Błąd importowania danych + + + + from record number %1 + z rekordu o numerze %1 + + + + . +%1 + . +%1 + + + + Importing CSV file... + Importowanie pliku CSV… + + + + Cancel + Anuluj + + + + SQLite database files (*.db *.sqlite *.sqlite3 *.db3) + Pliki bazy danych SQLite (*.db *.sqlite *.sqlite3 *.db3) + + + + RemoteDatabase + + + Error when connecting to %1. +%2 + Wystąpił błąd podczas łączenia z %1. %2 + + + + Error opening remote file at %1. +%2 + Wystąpił błąd podczas otwierania zdalnego pliku w %1. +%2 + + + + Error: Invalid client certificate specified. + + + + + Please enter the passphrase for this client certificate in order to authenticate. + + + + + Cancel + Anuluj + + + + Uploading remote database to +%1 + + + + + Downloading remote database from +%1 + + + + + + Error: The network is not accessible. + + + + + Error: Cannot open the file for sending. + + + + + Error opening local databases list. +%1 + + + + + Error creating local databases list. +%1 + + + + + The remote database has been updated since the last checkout. Do you want to update the local database to the newest version? Note that this discards any changes you have made locally! If you don't want to lose local changes, click No to open the local version. + + + + + RemoteDock + + + Remote + Zdalne działania + + + + Identity + + + + + Connect to the remote server using the currently selected identity. The correct server is taken from the identity as well. + + + + + Go + Przejdź + + + + Push currently opened database to server + + + + + <html><head/><body><p>In this pane, remote databases from dbhub.io website can be added to DB4S. First you need an identity:</p><ol style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;"><li style=" margin-top:12px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Login to the dbhub.io website (use your GitHub credentials or whatever you want)</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Click the button to create a DB4S certificate (that's your identity). That'll give you a certificate file (save it to your local disk).</li><li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Go to the Remote tab in DB4S Preferences. Click the button to add a new certificate to DB4S and choose the just downloaded certificate file.</li></ol><p>Now the Remote panel shows your identity and you can add remote databases.</p></body></html> + + + + + RemoteModel + + + Name + Nazwa + + + + Commit + + + + + Last modified + Ostatnia modyfikacja + + + + Size + Rozmiar + + + + bytes + bajty + + + + RemotePushDialog + + + Push database + + + + + Database na&me to push to + + + + + Commit message + + + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Oxygen-Sans'; font-size:10pt; font-weight:400; font-style:normal;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p></body></html> + + + + + Database licence + Licencja bazy danych + + + + Public + Publiczna + + + + Branch + Gałąź + + + + Force push + + + + + Database will be public. Everyone has read access to it. + Baza danych będzie publiczna. Każdy będzie mógł uzyskać do niej dostęp. + + + + Database will be private. Only you have access to it. + Baza danych będzie prywatna. Tylko Ty będziesz mieć do niej dostęp. + + + + Use with care. This can cause remote commits to be deleted. + + + + + Unspecified + Nieokreślona + + + + SqlExecutionArea + + + Form + Formularz + + + + Find previous match [Shift+F3] + Znajdź poprzednie trafienie [Shift+F3] + + + + Find previous match with mapping + + + + + Shift+F3 + Shift+F3 + + + + The found pattern must be a whole word + + + + + Whole Words + Całe słowa + + + + Text pattern to find considering the checks in this frame + + + + + Find in editor + Znajdź w edytorze + + + + The found pattern must match in letter case + + + + + Case Sensitive + Rozróżniaj wielkość znaków + + + + Find next match [Enter, F3] + Znajdź następne trafienie [Enter, F3] + + + + Find next match with wrapping + + + + + F3 + F3 + + + + Interpret search pattern as a regular expression + + + + + <html><head/><body><p>When checked, the pattern to find is interpreted as a UNIX regular expression. See <a href="https://en.wikibooks.org/wiki/Regular_Expressions">Regular Expression in Wikibooks</a>.</p></body></html> + + + + + Regular Expression + Wyrażenie regularne + + + + + Close Find Bar + + + + + + Results of the last executed statements + + + + + This field shows the results and status codes of the last executed statements. + + + + + SqlUiLexer + + + (X) The abs(X) function returns the absolute value of the numeric argument X. + + + + + () The changes() function returns the number of database rows that were changed or inserted or deleted by the most recently completed INSERT, DELETE, or UPDATE statement. + + + + + (X1,X2,...) The char(X1,X2,...,XN) function returns a string composed of characters having the unicode code point values of integers X1 through XN, respectively. + + + + + (X,Y,...) The coalesce() function returns a copy of its first non-NULL argument, or NULL if all arguments are NULL + + + + + (X,Y) The glob(X,Y) function is equivalent to the expression "Y GLOB X". + + + + + (X,Y) The ifnull() function returns a copy of its first non-NULL argument, or NULL if both arguments are NULL. + + + + + (X,Y) The instr(X,Y) function finds the first occurrence of string Y within string X and returns the number of prior characters plus 1, or 0 if Y is nowhere found within X. + + + + + (X) The hex() function interprets its argument as a BLOB and returns a string which is the upper-case hexadecimal rendering of the content of that blob. + + + + + () The last_insert_rowid() function returns the ROWID of the last row insert from the database connection which invoked the function. + + + + + (X) For a string value X, the length(X) function returns the number of characters (not bytes) in X prior to the first NUL character. + + + + + (X,Y) The like() function is used to implement the "Y LIKE X" expression. + + + + + (X,Y,Z) The like() function is used to implement the "Y LIKE X ESCAPE Z" expression. + + + + + (X) The load_extension(X) function loads SQLite extensions out of the shared library file named X. +Use of this function must be authorized from Preferences. + + + + + (X,Y) The load_extension(X) function loads SQLite extensions out of the shared library file named X using the entry point Y. +Use of this function must be authorized from Preferences. + + + + + (X) The lower(X) function returns a copy of string X with all ASCII characters converted to lower case. + + + + + (X) ltrim(X) removes spaces from the left side of X. + + + + + (X,Y) The ltrim(X,Y) function returns a string formed by removing any and all characters that appear in Y from the left side of X. + + + + + (X,Y,...) The multi-argument max() function returns the argument with the maximum value, or return NULL if any argument is NULL. + + + + + (X,Y,...) The multi-argument min() function returns the argument with the minimum value. + + + + + (X,Y) The nullif(X,Y) function returns its first argument if the arguments are different and NULL if the arguments are the same. + + + + + (FORMAT,...) The printf(FORMAT,...) SQL function works like the sqlite3_mprintf() C-language function and the printf() function from the standard C library. + + + + + (X) The quote(X) function returns the text of an SQL literal which is the value of its argument suitable for inclusion into an SQL statement. + + + + + () The random() function returns a pseudo-random integer between -9223372036854775808 and +9223372036854775807. + + + + + (N) The randomblob(N) function return an N-byte blob containing pseudo-random bytes. + + + + + (X,Y,Z) The replace(X,Y,Z) function returns a string formed by substituting string Z for every occurrence of string Y in string X. + + + + + (X) The round(X) function returns a floating-point value X rounded to zero digits to the right of the decimal point. + + + + + (X,Y) The round(X,Y) function returns a floating-point value X rounded to Y digits to the right of the decimal point. + + + + + (X) rtrim(X) removes spaces from the right side of X. + + + + + (X,Y) The rtrim(X,Y) function returns a string formed by removing any and all characters that appear in Y from the right side of X. + + + + + (X) The soundex(X) function returns a string that is the soundex encoding of the string X. + + + + + (X,Y) substr(X,Y) returns all characters through the end of the string X beginning with the Y-th. + + + + + (X,Y,Z) The substr(X,Y,Z) function returns a substring of input string X that begins with the Y-th character and which is Z characters long. + + + + + () The total_changes() function returns the number of row changes caused by INSERT, UPDATE or DELETE statements since the current database connection was opened. + + + + + (X) trim(X) removes spaces from both ends of X. + + + + + (X,Y) The trim(X,Y) function returns a string formed by removing any and all characters that appear in Y from both ends of X. + + + + + (X) The typeof(X) function returns a string that indicates the datatype of the expression X. + + + + + (X) The unicode(X) function returns the numeric unicode code point corresponding to the first character of the string X. + + + + + (X) The upper(X) function returns a copy of input string X in which all lower-case ASCII characters are converted to their upper-case equivalent. + + + + + (N) The zeroblob(N) function returns a BLOB consisting of N bytes of 0x00. + + + + + + + + (timestring,modifier,modifier,...) + + + + + (format,timestring,modifier,modifier,...) + + + + + (X) The avg() function returns the average value of all non-NULL X within a group. + + + + + (X) The count(X) function returns a count of the number of times that X is not NULL in a group. + + + + + (X) The group_concat() function returns a string which is the concatenation of all non-NULL values of X. + + + + + (X,Y) The group_concat() function returns a string which is the concatenation of all non-NULL values of X. If parameter Y is present then it is used as the separator between instances of X. + + + + + (X) The max() aggregate function returns the maximum value of all values in the group. + + + + + (X) The min() aggregate function returns the minimum non-NULL value of all values in the group. + + + + + + (X) The sum() and total() aggregate functions return sum of all non-NULL values in the group. + + + + + () The number of the row within the current partition. Rows are numbered starting from 1 in the order defined by the ORDER BY clause in the window definition, or in arbitrary order otherwise. + + + + + () The row_number() of the first peer in each group - the rank of the current row with gaps. If there is no ORDER BY clause, then all rows are considered peers and this function always returns 1. + + + + + () The number of the current row's peer group within its partition - the rank of the current row without gaps. Partitions are numbered starting from 1 in the order defined by the ORDER BY clause in the window definition. If there is no ORDER BY clause, then all rows are considered peers and this function always returns 1. + + + + + () Despite the name, this function always returns a value between 0.0 and 1.0 equal to (rank - 1)/(partition-rows - 1), where rank is the value returned by built-in window function rank() and partition-rows is the total number of rows in the partition. If the partition contains only one row, this function returns 0.0. + + + + + () The cumulative distribution. Calculated as row-number/partition-rows, where row-number is the value returned by row_number() for the last peer in the group and partition-rows the number of rows in the partition. + + + + + (N) Argument N is handled as an integer. This function divides the partition into N groups as evenly as possible and assigns an integer between 1 and N to each group, in the order defined by the ORDER BY clause, or in arbitrary order otherwise. If necessary, larger groups occur first. This function returns the integer value assigned to the group that the current row is a part of. + + + + + (expr) Returns the result of evaluating expression expr against the previous row in the partition. Or, if there is no previous row (because the current row is the first), NULL. + + + + + (expr,offset) If the offset argument is provided, then it must be a non-negative integer. In this case the value returned is the result of evaluating expr against the row offset rows before the current row within the partition. If offset is 0, then expr is evaluated against the current row. If there is no row offset rows before the current row, NULL is returned. + + + + + + (expr,offset,default) If default is also provided, then it is returned instead of NULL if the row identified by offset does not exist. + + + + + (expr) Returns the result of evaluating expression expr against the next row in the partition. Or, if there is no next row (because the current row is the last), NULL. + + + + + (expr,offset) If the offset argument is provided, then it must be a non-negative integer. In this case the value returned is the result of evaluating expr against the row offset rows after the current row within the partition. If offset is 0, then expr is evaluated against the current row. If there is no row offset rows after the current row, NULL is returned. + + + + + (expr) This built-in window function calculates the window frame for each row in the same way as an aggregate window function. It returns the value of expr evaluated against the first row in the window frame for each row. + + + + + (expr) This built-in window function calculates the window frame for each row in the same way as an aggregate window function. It returns the value of expr evaluated against the last row in the window frame for each row. + + + + + (expr,N) This built-in window function calculates the window frame for each row in the same way as an aggregate window function. It returns the value of expr evaluated against the row N of the window frame. Rows are numbered within the window frame starting from 1 in the order defined by the ORDER BY clause if one is present, or in arbitrary order otherwise. If there is no Nth row in the partition, then NULL is returned. + + + + + SqliteTableModel + + + reading rows + + + + + loading... + ładowanie… + + + + References %1(%2) +Hold %3Shift and click to jump there + + + + + Error changing data: +%1 + Wystąpił błąd podczas zmiany danych: +%1 + + + + retrieving list of columns + uzyskiwanie listy kolumn + + + + Fetching data... + Uzyskiwanie danych… + + + + Cancel + Anuluj + + + + VacuumDialog + + + Compact Database + + + + + Warning: Compacting the database will commit all of your changes. + + + + + Please select the databases to co&mpact: + + + + diff -Nru sqlitebrowser-3.10.100ubuntu1/src/translations/sqlb_pt_BR.ts sqlitebrowser-3.11.1/src/translations/sqlb_pt_BR.ts --- sqlitebrowser-3.10.100ubuntu1/src/translations/sqlb_pt_BR.ts 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/src/translations/sqlb_pt_BR.ts 2019-02-19 23:51:34.000000000 +0000 @@ -4,46 +4,168 @@ AboutDialog + About DB Browser for SQLite Sobre DB Browser para SQLite + Version Versão - <html><head/><body><p>DB Browser for SQLite is an open source, freeware visual tool used to create, design and edit SQLite database files.</p><p>It is bi-licensed under the Mozilla Public License Version 2, as well as the GNU General Public License Version 3 or later. You can modify or redistribute it under the conditions of these licenses.</p><p>See <a href="http://www.gnu.org/licenses/gpl.html"><span style=" text-decoration: underline; color:#0000ff;">http://www.gnu.org/licenses/gpl.html</span></a> and <a href="https://www.mozilla.org/MPL/2.0/index.txt"><span style=" text-decoration: underline; color:#0000ff;">https://www.mozilla.org/MPL/2.0/index.txt</span></a> for details.</p><p>For more information on this program please visit our website at: <a href="http://sqlitebrowser.org"><span style=" text-decoration: underline; color:#0000ff;">http://sqlitebrowser.org</span></a></p><p><span style=" font-size:small;">This software uses the GPL/LGPL Qt Toolkit from </span><a href="http://qt-project.org/"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://qt-project.org/</span></a><span style=" font-size:small;"><br/>See </span><a href="http://qt-project.org/doc/qt-5/licensing.html"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://qt-project.org/doc/qt-5/licensing.html</span></a><span style=" font-size:small;"> for licensing terms and information.</span></p><p><span style=" font-size:small;">It also uses the Silk icon set by Mark James licensed under a Creative Commons Attribution 2.5 and 3.0 license.<br/>See </span><a href="http://www.famfamfam.com/lab/icons/silk/"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://www.famfamfam.com/lab/icons/silk/</span></a><span style=" font-size:small;"> for details.</span></p></body></html> - <html><head/><body><p>DB Browser para SQLite é uma ferramenta visual gratuita utilizada para criar, desenhar e editar bancos de dados SQLite.</p><p>É bilicenciada sob a Mozilla Public License Version 2 e a GNU General Public License Version 3 ou posterior. Você pode modificar ou redistribuí-la sob as condições dessas licenças.</p><p>Veja <a href="http://www.gnu.org/licenses/gpl.html"><span style=" text-decoration: underline; color:#0000ff;">http://www.gnu.org/licenses/gpl.html</span></a> e <a href="https://www.mozilla.org/MPL/2.0/index.txt"><span style=" text-decoration: underline; color:#0000ff;">https://www.mozilla.org/MPL/2.0/index.txt</span></a> para mais detalhes.</p><p>Para mais informação sobre esse programa visite nosso website: <a href="http://sqlitebrowser.org"><span style=" text-decoration: underline; color:#0000ff;">http://sqlitebrowser.org</span></a></p><p><span style=" font-size:small;">Esse software utiliza o GPL/LGPL Qt Toolkit de </span><a href="http://qt-project.org/"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://qt-project.org/</span></a><span style=" font-size:small;"><br/>Veja </span><a href="http://qt-project.org/doc/qt-5/licensing.html"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://qt-project.org/doc/qt-5/licensing.html</span></a><span style=" font-size:small;"> para termos de licença e informação.</span></p><p><span style=" font-size:small;">Também utiliza o Silk icon set de Mark James licenciado sob uma licença Creative Commons Attribution 2.5 e 3.0.<br/>Veja </span><a href="http://www.famfamfam.com/lab/icons/silk/"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://www.famfamfam.com/lab/icons/silk/</span></a><span style=" font-size:small;"> para mais detalhes.</span></p></body></html> + <html><head/><body><p>DB Browser for SQLite is an open source, freeware visual tool used to create, design and edit SQLite database files.</p><p>It is bi-licensed under the Mozilla Public License Version 2, as well as the GNU General Public License Version 3 or later. You can modify or redistribute it under the conditions of these licenses.</p><p>See <a href="http://www.gnu.org/licenses/gpl.html"><span style=" text-decoration: underline; color:#0000ff;">http://www.gnu.org/licenses/gpl.html</span></a> and <a href="https://www.mozilla.org/MPL/2.0/index.txt"><span style=" text-decoration: underline; color:#0000ff;">https://www.mozilla.org/MPL/2.0/index.txt</span></a> for details.</p><p>For more information on this program please visit our website at: <a href="https://sqlitebrowser.org"><span style=" text-decoration: underline; color:#0000ff;">https://sqlitebrowser.org</span></a></p><p><span style=" font-size:small;">This software uses the GPL/LGPL Qt Toolkit from </span><a href="http://qt-project.org/"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://qt-project.org/</span></a><span style=" font-size:small;"><br/>See </span><a href="http://qt-project.org/doc/qt-5/licensing.html"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://qt-project.org/doc/qt-5/licensing.html</span></a><span style=" font-size:small;"> for licensing terms and information.</span></p><p><span style=" font-size:small;">It also uses the Silk icon set by Mark James licensed under a Creative Commons Attribution 2.5 and 3.0 license.<br/>See </span><a href="http://www.famfamfam.com/lab/icons/silk/"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://www.famfamfam.com/lab/icons/silk/</span></a><span style=" font-size:small;"> for details.</span></p></body></html> + <html><head/><body><p>DB Browser para SQLite é uma ferramenta visual gratuita utilizada para criar, desenhar e editar bancos de dados SQLite.</p><p>É bilicenciada sob a Mozilla Public License Version 2 e a GNU General Public License Version 3 ou posterior. Você pode modificar ou redistribuí-la sob as condições dessas licenças.</p><p>Veja <a href="http://www.gnu.org/licenses/gpl.html"><span style=" text-decoration: underline; color:#0000ff;">http://www.gnu.org/licenses/gpl.html</span></a> e <a href="https://www.mozilla.org/MPL/2.0/index.txt"><span style=" text-decoration: underline; color:#0000ff;">https://www.mozilla.org/MPL/2.0/index.txt</span></a> para mais detalhes.</p><p>Para mais informação sobre esse programa visite nosso website: <a href="https://sqlitebrowser.org"><span style=" text-decoration: underline; color:#0000ff;">https://sqlitebrowser.org</span></a></p><p><span style=" font-size:small;">Esse software utiliza o GPL/LGPL Qt Toolkit de </span><a href="http://qt-project.org/"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://qt-project.org/</span></a><span style=" font-size:small;"><br/>Veja </span><a href="http://qt-project.org/doc/qt-5/licensing.html"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://qt-project.org/doc/qt-5/licensing.html</span></a><span style=" font-size:small;"> para termos de licença e informação.</span></p><p><span style=" font-size:small;">Também utiliza o Silk icon set de Mark James licenciado sob uma licença Creative Commons Attribution 2.5 e 3.0.<br/>Veja </span><a href="http://www.famfamfam.com/lab/icons/silk/"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://www.famfamfam.com/lab/icons/silk/</span></a><span style=" font-size:small;"> para mais detalhes.</span></p></body></html> + Version Versão + + Built for + + + + Qt Version Versão do Qt + SQLCipher Version Versão do SQLCipher + SQLite Version Versão do SQLite + + + <html><head/><body><p>DB Browser for SQLite is an open source, freeware visual tool used to create, design and edit SQLite database files.</p><p>It is bi-licensed under the Mozilla Public License Version 2, as well as the GNU General Public License Version 3 or later. You can modify or redistribute it under the conditions of these licenses.</p><p>See <a href="http://www.gnu.org/licenses/gpl.html">http://www.gnu.org/licenses/gpl.html</a> and <a href="https://www.mozilla.org/MPL/2.0/index.txt">https://www.mozilla.org/MPL/2.0/index.txt</a> for details.</p><p>For more information on this program please visit our website at: <a href="http://sqlitebrowser.org">http://sqlitebrowser.org</a></p><p><span style=" font-size:small;">This software uses the GPL/LGPL Qt Toolkit from </span><a href="http://qt-project.org/"><span style=" font-size:small;">http://qt-project.org/</span></a><span style=" font-size:small;"><br/>See </span><a href="http://qt-project.org/doc/qt-5/licensing.html"><span style=" font-size:small;">http://qt-project.org/doc/qt-5/licensing.html</span></a><span style=" font-size:small;"> for licensing terms and information.</span></p><p><span style=" font-size:small;">It also uses the Silk icon set by Mark James licensed under a Creative Commons Attribution 2.5 and 3.0 license.<br/>See </span><a href="http://www.famfamfam.com/lab/icons/silk/"><span style=" font-size:small;">http://www.famfamfam.com/lab/icons/silk/</span></a><span style=" font-size:small;"> for details.</span></p></body></html> + <html><head/><body><p>DB Browser para SQLite é uma ferramenta de código livre gratuita usada para criar, projetar e editar bancos de dados SQLite.</p><p>Ela é bi-licensiada sob a Mozilla Public License Version 2 e sob a GNU General Public License Version 3 ou posterior. Você pode modificar ou redistribuir ela sob as condições de qualquer uma dessas licenças.</p><p>Veja <a href="http://www.gnu.org/licenses/gpl.html">http://www.gnu.org/licenses/gpl.html</a> e <a href="https://www.mozilla.org/MPL/2.0/index.txt">https://www.mozilla.org/MPL/2.0/index.txt</a> para mais detalhes.</p><p>Para mais informações sobre esse programa visite nosso site em: <a href="http://sqlitebrowser.org">http://sqlitebrowser.org</a></p><p><span style=" font-size:small;">Esse software usa o GPL/LGPL Qt Toolkit de </span><a href="http://qt-project.org/"><span style=" font-size:small;">http://qt-project.org/</span></a><span style=" font-size:small;"><br/>Veja </span><a href="http://qt-project.org/doc/qt-5/licensing.html"><span style=" font-size:small;">http://qt-project.org/doc/qt-5/licensing.html</span></a><span style=" font-size:small;"> para termos de licença e informação.</span></p><p><span style=" font-size:small;">Ele também usa o conjunto de ícones Silk por Mark James licenciado sob a Creative Commons Attribution 2.5 e 3.0.<br/>Veja </span><a href="http://www.famfamfam.com/lab/icons/silk/"><span style=" font-size:small;">http://www.famfamfam.com/lab/icons/silk/</span></a><span style=" font-size:small;"> para detalhes.</span></p></body></html> + + + + (based on SQLite %1) + (baseado no SQLite %1) + + + + AddRecordDialog + + + Add New Record + Adicionar novo registro + + + + Enter values for the new record considering constraints. Fields in bold are mandatory. + Entre valores para o novo registro considerando as restriões. Campos em negrito são obrigatórios. + + + + In the Value column you can specify the value for the field identified in the Name column. The Type column indicates the type of the field. Default values are displayed in the same style as NULL values. + Na coluna Valor você pode especificar o valor para o campo identificado na coluna Nome. A coluna Tipo indica qual o tipo do campo. Valores padrão são exibidos no mesmo estilo que valores nulos. + + + + Name + Nome + + + + Type + Tipo + + + + Value + Valor + + + + Values to insert. Pre-filled default values are inserted automatically unless they are changed. + Valores para inserir. Valores padrão pré-preenchidos são inseridos automaticamente a não ser que sejam alterados. + + + + When you edit the values in the upper frame, the SQL query for inserting this new record is shown here. You can edit manually the query before saving. + Quando você edita os valores no frame acima, a consulta SQL para inserir esse novo registro é exibida aqui. Você pode editar manualmente a consulta antes de salvar. + + + + <html><head/><body><p><span style=" font-weight:600;">Save</span> will submit the shown SQL statement to the database for inserting the new record.</p><p><span style=" font-weight:600;">Restore Defaults</span> will restore the initial values in the <span style=" font-weight:600;">Value</span> column.</p><p><span style=" font-weight:600;">Cancel</span> will close this dialog without executing the query.</p></body></html> + <html><head/><body><p><span style=" font-weight:600;">Salvar</span> irá enviar o comando SQL exibido para o banco de dados para a inserção do novo registro.</p><p><span style=" font-weight:600;">Restaurar Padrões</span> irá restaurar os valores iniciais na coluna <span style=" font-weight:600;">Valor</span>.</p><p><span style=" font-weight:600;">Cancelar</span> irá fechar esse diálogo sem executar a consulta.</p></body></html> + + + + Auto-increment + + Auto-incremento + + + + + Unique constraint + + Restrição de unicidade + + + + + Check constraint: %1 + + Restrição de condição %1 + + + + + Foreign key: %1 + + Chave estrangeira: %1 + + + + + Default value: %1 + + Valor padrão: %1 + + + + + Error adding record. Message from database engine: + +%1 + Erro adicionando registro. Mensagem do banco de dados: + +%1 + + + + Are you sure you want to restore all the entered values to their defaults? + Você tem certeza que deseja restaurar todos os valores inseridos para os seus valores padrão? + Application + Usage: %1 [options] [db] - Uso: %1 [opções] [bd] + Uso: %1 [opções] [bd] + + Possible command line arguments: Possíveis argumentos da linha de comando: + -h, --help Show command line options -h, --help Mostrar opções da linha de comando @@ -52,61 +174,124 @@ -s, -sql [arquivo] Executar esse arquivo de SQL após abrir o BD + -q, --quit Exit application after running scripts -q, --quit Sair do programa após executar os scripts + [file] Open this SQLite database [arquivo] Abrir esse banco de dados SQLite + The -s/--sql option requires an argument A opção -s/--sql requer um argumento + The file %1 does not exist O arquivo %1 não existe + Invalid option/non-existant file: %1 Opção inválida/arquivo inexistente: %1 + -s, --sql [file] Execute this SQL file after opening the DB -s, -sql [arquivo] Executar esse arquivo de SQL após abrir o banco de dados + -t, --table [table] Browse this table after opening the DB -t, --table [tabela] Navegar essa tabela após abrir o banco de dados + The -t/--table option requires an argument A opção -t/--table requer um argumento + -v, --version Display the current version + -v, -versão Exibir a versão atual + + + + -R, --read-only Open database in read-only mode + -R, --somente-leitura Abrir o banco de dados em modo somente leitura + + + + This is DB Browser for SQLite version %1. + Este é o DB Browser para SQLite versão %1. + + + + -o, --option [group/setting=value] Run application with this setting temporarily set to value - This is DB Browser for SQLite version %1%2. + + The -o/--option option requires an argument in the form group/setting=value CipherDialog + SQLCipher encryption Encriptação SQLCipher + &Password &Senha + &Reenter password &Entre a senha novamente + + Encr&yption settings + + + + + SQLCipher &3 defaults + + + + + SQLCipher &4 defaults + + + + + Custo&m + + + + + &KDF iterations + + + + + HMAC algorithm + + + + + KDF algorithm + + + Page &size &Tamanho da página @@ -121,12 +306,14 @@ O processo de encriptação pode demorar alguns minutos e você deve ter um backup do seu banco de dados! Alterações não salvas são aplicadas antes de se modificar a encriptação. + Please enter the key used to encrypt the database. If any of the other settings were altered for this database file you need to provide this information as well. Por favor, entre a chave usada para encriptar o banco de dados. Se quaisquer das outras configurações foram alteradas você terá de prover essas informações também. + Please set a key to encrypt the database. Note that if you change any of the other, optional, settings you'll need to re-enter them as well every time you open the database file. Leave the password fields empty to disable the encryption. @@ -137,14 +324,17 @@ O processo de encriptação pode demorar alguns minutos e você deve ter um backup do seu banco de dados! Alterações não salvas são aplicadas antes de se modificar a encriptação. + Page si&ze &Tamanho da página + Passphrase Palavra chave + Raw key Chave desencriptada @@ -152,73 +342,105 @@ ColumnDisplayFormatDialog + Choose display format Escolha um formato de exibição + Display format Formato de exibição + Choose a display format for the column '%1' which is applied to each value prior to showing it. Escolha um formato de exibição para a coluna '%1' que será aplicado a cada valor antes de exibí-lo. + Default Padrão + Decimal number Número decimal + Exponent notation Notação exponencial + Hex blob BLOB hexadecimal + Hex number Número hexadecimal + Julian day to date Dia juliano para data + Lower case Caixa baixa + Octal number Octal + Round number Número arredondado + Unix epoch to date Era unix para data + Upper case Caixa alta + Windows DATE to date DATE do Windows para data + Custom Personalizado + Apple NSDate to date NSDate da Apple para date + + + Java epoch (milliseconds) to date + Época Java (ms) para data + + + + Unix epoch to local time + Época Unix para tempo local + + + + Date as dd/mm/yyyy + Data como dd/mm/yyyy + DBBrowserDB @@ -227,26 +449,33 @@ Nenhum erro + Please specify the database name under which you want to access the attached database Por favor, especifique o nome do banco de dados sob o qual você quer acessar o banco de dados anexado + Do you want to save the changes made to the database file %1? Você quer salvar as alterações feitas ao arquivo de banco de dados %1? + Exporting database to SQL file... Exportando banco de dados para arquivo SQL... + + Cancel Cancelar + Executing SQL... Executando SQL... + Action cancelled. Ação cancelada. @@ -262,26 +491,27 @@ renameColumn: cannot find column %1. - renameColumn: não consegue encontrar a coluna %1. + renameColumn: não consegue encontrar a coluna %1. renameColumn: creating savepoint failed. DB says: %1 - renameColumn: criação de savepoint falhou. Banco de dados diz: %1 + renameColumn: criação de savepoint falhou. Banco de dados diz: %1 renameColumn: creating new table failed. DB says: %1 - renameColumn: criação de nova tabela falhou. Banco de dados diz: %1 + renameColumn: criação de nova tabela falhou. Banco de dados diz: %1 renameColumn: copying data to new table failed. DB says: %1 - renameColumn: cópia de dados para nova tabela falhou. Banco de dados diz: %1 + renameColumn: cópia de dados para nova tabela falhou. Banco de dados diz: %1 renameColumn: deleting old table failed. DB says: %1 - renameColumn: deleção de tabela falhou. Banco de dados diz: %1 + renameColumn: deleção de tabela falhou. Banco de dados diz: %1 + Restoring some of the objects associated with this table failed. This is most likely because some column names changed. Here's the SQL statement which you might want to fix and execute manually: @@ -291,15 +521,17 @@ renameColumn: releasing savepoint failed. DB says: %1 - renameColumn: liberar savepoint falhou. Banco de dados diz: %1 + renameColumn: liberar savepoint falhou. Banco de dados diz: %1 + Error renaming table '%1' to '%2'.Message from database engine: %3 Erro renomeando tabela '%1' para '%2'. Mensagem do banco de dados: %3 + ... <string can not be logged, contains binary data> ... ... <string não pode ser logada, contém dados binários> ... @@ -308,6 +540,7 @@ Tipo de objeto desconhecido %1 + could not get list of db objects: %1, %2 Não pôde obter lista de objetos de banco de dados: %1, %2 @@ -317,121 +550,265 @@ didn't receive any output from pragma %1 - Não recebeu qualquer saída do pragma %1 + Não recebeu qualquer saída do pragma %1 could not execute pragma command: %1, %2 - Não conseguiu executar comando pragma: %1, %2 + Não conseguiu executar comando pragma: %1, %2 + Error setting pragma %1 to %2: %3 Erro definindo pragma %1 para %2: %3 + File not found. Arquivo não encontrado. + Invalid file format Formato de arquivo inválido + + Error in statement #%1: %2. Aborting execution%3. Erro no comando #%1: %2. Aborting execution%3. + + and rolling back e revertendo + Cannot set data on this object Não se pode definir dados nesse objeto + could not get column information não pôde obter informação sobre a coluna + + + This database has already been attached. Its schema name is '%1'. + Esse banco de dados já foi anexado. O seu nome de esquema e '%1'. + + + + Do you really want to close this temporary database? All data will be lost. + Você realmente quer fechar esse banco de dados temporário? Todos os dados serão perdidos. + + + + Database didn't close correctly, probably still busy + + + + + The database is currently busy: + O banco de dados está ocupado: + + + + Do you want to abort that other operation? + Você quer abortar a outra operação? + + + + + No database file opened + Não há um arquivo de banco de dados aberto + + + + didn't receive any output from %1 + + + + + could not execute command: %1 + + + + + Cannot delete this object + Não pode deletar esse objeto + + + + + A table with the name '%1' already exists in schema '%2'. + Uma tabela com o nome '%1' já existe no esquema '%2'. + + + + No table with name '%1' exists in schema '%2'. + + + + + + Cannot find column %1. + + + + + Creating savepoint failed. DB says: %1 + + + + + Renaming the column failed. DB says: +%1 + + + + + + Releasing savepoint failed. DB says: %1 + + + + + Creating new table failed. DB says: %1 + + + + + Copying data to new table failed. DB says: +%1 + + + + + Deleting old table failed. DB says: %1 + + + + + could not get list of databases: %1 + não pôde obter a lista de bancos de dados: %1 + + + + Error loading extension: %1 + Erro carregado extensão: %1 + DbStructureModel + Name Nome + Object Objeto + Type Tipo + Schema Esquema + Tables (%1) Tabelas (%1) + Indices (%1) Índices (%1) + Views (%1) Vistas (%1) + Triggers (%1) Gatilhos (%1) Browsables (%1) - Navegáveis (%1) + Navegáveis (%1) + All Todos + + + Database + Banco de dados + + + + Browsables + Navegáveis + + + + Temporary + Temporário + EditDialog + Edit database cell Editar célula Import text - Importar texto + Importar texto Opens a file dialog used to import text to this database cell. - Abre uma janela usada para importar texto para essa célula de banco de dados. + Abre uma janela usada para importar texto para essa célula de banco de dados. + &Import &Importar Export text - Exportar texto + Exportar texto Opens a file dialog used to export the contents of this database cell to a text file. - Abre um diálogo de arquivo usado para exportar os conteúdos dessa célula para um arquivo de texto. + Abre um diálogo de arquivo usado para exportar os conteúdos dessa célula para um arquivo de texto. + &Export &Exportar + Text Texto + Binary Binário @@ -440,6 +817,7 @@ Limpar dados de célula + Erases the contents of the cell Apaga os conteúdos da célula @@ -452,42 +830,51 @@ <html><head/><body><p><span style=" font-weight:600; color:#c00000;">Aviso: editar conteúdo binário em modo de texto pode corromper dados!</span></p></body></html> + This area displays information about the data present in this database cell Essa área exibe informação sobre os dados presentes nessa célula + Type of data currently in cell Tipo de dados atualmente na célula + Size of data currently in table Tamanho dos dados atualmente na célula Choose a file - Escolha um arquivo + Escolha um arquivo Text files(*.txt);;Image files(%1);;All files(*) - Arquivos de texto(*.txt);;Imagens(%1);;Todos os arquivos(*) + Arquivos de texto(*.txt);;Imagens(%1);;Todos os arquivos(*) + Choose a filename to export data Escolha um arquivo para exportar dados Text files(*.txt);;All files(*) - Arquivos de texto(*.txt);;Todos os arquivos(*) + Arquivos de texto(*.txt);;Todos os arquivos(*) Type of data currently in cell: Null Tipo de dados atualmente na célula: Null + + Type of data currently in cell: Text / Numeric Tipo de dados atualmente na célula: Texto / Numérico + + + %n char(s) %n char @@ -503,10 +890,13 @@ %1x%2 pixel + Type of data currently in cell: Binary Tipo de dados atualmente na célula: Binário + + %n byte(s) %n byte @@ -514,44 +904,277 @@ + Mode: Modo: + Image Imagem + Set this cell to NULL Definir esta célula como NULL + Set as &NULL Definir como &NULL + Apply Aplicar + Type of data currently in cell: %1 Image Tipo de dado atualmente na célula: %1 Imagem + %1x%2 pixel(s) %1x%2 pixel(s) + Type of data currently in cell: NULL Tipo de dado atualmente na célula: NULL Image data can't be viewed with the text editor - Dados de imagem não podem ser exibidos pelo editor de texto + Dados de imagem não podem ser exibidos pelo editor de texto Binary data can't be viewed with the text editor - Dados binários não podem ser exibidos pelo editor de texto + Dados binários não podem ser exibidos pelo editor de texto + + + + This is the list of supported modes for the cell editor. Choose a mode for viewing or editing the data of the current cell. + Essa é a lista de modos suportados pelo editor de célula. Escolha um modo para visualizar ou editar os dados da célula atual. + + + + JSON + JSON + + + + XML + XML + + + + + Automatically adjust the editor mode to the loaded data type + Automaticamente ajustar o modo do editor para o tipo de dado carregado + + + + This checkable button enables or disables the automatic switching of the editor mode. When a new cell is selected or new data is imported and the automatic switching is enabled, the mode adjusts to the detected data type. You can then change the editor mode manually. If you want to keep this manually switched mode while moving through the cells, switch the button off. + Esse botão assinalável ativa ou desativa a troca automática do modo do editor. Quando uma nova célula é selecionado ou novos dados são importados e a troca automática está habilitada, o modo ajusta para o tipo detectado. Você pode então mudar o modo do editor manualmente. Se você quer manter o modo manualmente escolhido enquanto movendo pelas células, desmarque essa opção. + + + + Auto-switch + Auto-trocar + + + + + Auto-format: pretty print on loading, compact on saving. + Auto-formatar: exibir formatado ao carregar, compactar ao salvar. + + + + When enabled, the auto-format feature formats the data on loading, breaking the text in lines and indenting it for maximum readability. On data saving, the auto-format feature compacts the data removing end of lines, and unnecessary whitespace. + Quando ativado, a funcionalidade de auto-formatar formata os dados ao carregar, quebrando o texto em linhas e indentando ele para melhor legibilidade. Ao salvar os dados, o auto-formatador compacta os dados removendo espaços em branco desnecessários. + + + + Autoformat + Autoformatar + + + + Import from file + Importar do arquivo + + + + Opens a file dialog used to import any kind of data to this database cell. + Abre um seletor de arquivos usado para importar qualquer tipo de dado para essa célula. + + + + Export to file + Exportar para arquivo + + + + Opens a file dialog used to export the contents of this database cell to a file. + Abre um seletor de arquivo para exportar os conteúdos dessa célula para um arquivo. + + + + This editor mode lets you edit JSON or XML data with syntax highlighting, automatic formatting and validation before saving. + +Errors are indicated with a red squiggle underline. + Esse modo de editor deixa você editar JSON ou XML com realce de sintaxe, formatação automática e validação antes de salvar. + +Erros são indicados com um ondulado vermelho. + + + + Apply data to cell + Aplicar dados à célula + + + + This button saves the changes performed in the cell editor to the database cell. + Esse botão salva as modificações realizadas no editor da célula para a célula do banco de dados. + + + + + Image data can't be viewed in this mode. + Dados de imagem não podem ser visualizados nesse modo. + + + + + Try switching to Image or Binary mode. + Tente mudar para modo de Imagem ou Binário. + + + + + Binary data can't be viewed in this mode. + Dados binários não podem ser visualizados nesse modo. + + + + + Try switching to Binary mode. + Tente mudar para modo binário. + + + + + + + Text files (*.txt) + Arquivos texto (*.txt) + + + + + + JSON files (*.json) + Arquivos JSON (*.json) + + + + + + + XML files (*.xml) + Arquivos XML (*.xml) + + + + + Image files (%1) + Arquivos de imagem (%1) + + + + + + Binary files (*.bin) + Arquivos binários (*.bin) + + + + + All files (*) + Todos arquivos (*) + + + + Choose a file to import + Escolha um arquivo para importar + + + + %1 Image + %1 Imagem + + + + SVG files (*.svg) + Arquivos SVG (*.svg) + + + + Invalid data for this mode + Dados inválidos para esse modo + + + + The cell contains invalid %1 data. Reason: %2. Do you really want to apply it to the cell? + A célula contém dados inválidos %1. Motivo: %2. Você realmente quer aplicar isso? + + + + Type of data currently in cell: Valid JSON + Tipo de dados atualmente na célula: JSON válido + + + + + Print... + Imprimir... + + + + Open preview dialog for printing displayed image + Abrir diálogo de prévia para imprimir imagem exibida + + + + + Ctrl+P + Ctrl+P + + + + Open preview dialog for printing displayed text + Abrir diálogo de prévia para imprimir texto exibido + + + + Copy Hex and ASCII + Copiar Hex e ASCII + + + + Copy selected hexadecimal and ASCII columns to the clipboard + Copiar colunas hexadecimal e ASCII selecionadas para a área de transferência + + + + Ctrl+Shift+C + Ctrl+Shift+C + + + + + Hex dump files (*.txt) + Arquivos de dump hexadecimal (*.txt) @@ -561,6 +1184,7 @@ Criar novo índice + &Name &Nome @@ -577,56 +1201,69 @@ Usar no Índice + Order Ordem + &Table &Tabela + &Unique &Único + Creating the index failed: %1 Criação de índice falhou: %1 + Edit Index Schema - Editar Schema do Índice + Editar esquema do índice + For restricting the index to only a part of the table you can specify a WHERE clause here that selects the part of the table that should be indexed Para restringir o índice para somente uma parte da tabela você pode especificar uma cláusula WHERE aqui que seleciona a parte da tabela que deveria ser indexada + Partial inde&x clause Cláusula de índi&ce parcial + Colu&mns Colu&nas + Table column Coluna da tabela + Type Tipo + Add a new expression column to the index. Expression columns contain SQL expression rather than column names. Adicionar uma nova coluna de expressão para o índice. Colunas de expressão contêm expressões SQL em vez de nomes de coluna. + Index column Indexar coluna + Deleting the old index failed: %1 Deletar o índice antigo falhou: @@ -636,125 +1273,164 @@ EditTableDialog + Edit table definition Editar definição da tabela + Table Tabela + Advanced Avançado + Make this a 'WITHOUT rowid' table. Setting this flag requires a field of type INTEGER with the primary key flag set and the auto increment flag unset. Fazer dessa uma tabela 'SEM rowid'. Definir essa flag requer um campo do tipo INTEGER com a primary key flag definida e a auto increment flag não. + Without Rowid Sem Rowid + Fields Campos + Add field Adicionar campo + Remove field Remover campo + Move field up Mover campo para cima + Move field down Mover campo para baixo + Name Nome + Type Tipo + Not null Não null + PK PK + Primary key Primary key + AI AI + Autoincrement Autoincrement + U U + Unique Unique + Default Default + Default value Default value + Check Check + Check constraint Check constraint + Foreign Key Foreign Key + Error creating table. Message from database engine: %1 - Erro criando tabela. Mensagem do DB: + Erro criando tabela. Mensagem da engine do banco de dados: %1 + There is at least one row with this field set to NULL. This makes it impossible to set this flag. Please change the table data first. Há pelo menos uma linha com esse campo definido NULL. Logo, é impossível definir essa flag. Por favor, mude os dados da tabela primeiro. + There is at least one row with a non-integer value in this field. This makes it impossible to set the AI flag. Please change the table data first. Há pelo menos uma linha com um valor não-inteiro nesse campo. Logo, é impossível definir essa flag. Por favor, mude os dados da tabela primeiro. + + Column '%1' has duplicate data. + + + + + + This makes it impossible to enable the 'Unique' flag. Please remove the duplicate data, which will allow the 'Unique' flag to then be enabled. + + + Column `%1` has no unique data. Coluna `%1` não possui dados únicos. This makes it impossible to set this flag. Please change the table data first. - Logo, é impossível definir essa flag. Por favor, mude os dados da tabela primeiro. + Logo, é impossível definir essa flag. Por favor, mude os dados da tabela primeiro. + Are you sure you want to delete the field '%1'? All data currently stored in this field will be lost. Você tem certeza de que deseja deletar o campo '%1? @@ -769,6 +1445,7 @@ - Auto increment desativado + There already is a field with that name. Please rename it first or choose a different name for this field. Já existe um campo com este nome. Por favor, renomeie-o primeiro ou escolha um nome diferente para esse campo. @@ -779,10 +1456,11 @@ Column '%1' has no unique data. - Coluna '%1' não possui dados únicos. + Coluna '%1' não possui dados únicos. + Please add a field which meets the following criteria before setting the without rowid flag: - Primary key flag set - Auto increment disabled @@ -795,43 +1473,62 @@ <html><head/><body><p><span style=" font-weight:600; color:#ff0000;">Aviso: </span>Há algo com essa definição de tabela que nosso parser não entende. Modificar e salvar essa tabela pode resultar em problemas.</p></body></html> + This column is referenced in a foreign key in table %1 and thus its name cannot be changed. Essa coluna é referenciada em uma chave estrangeira na tabela %1 e portanto seu nome não pode ser alterado. Modifying this column failed. Error returned from database: %1 - Modificar essa coluna falhou: Erro retornado do banco de dados: + Modificar essa coluna falhou: Erro retornado do banco de dados: %1 Setting the rowid column for the table failed. Error message: %1 - Editar a coluna rowid para a tabela falhou. Mensagem de erro: + Editar a coluna rowid para a tabela falhou. Mensagem de erro: %1 Set this to create a temporary table that is deleted when closing the database. - Marque isso para criar uma tabela temporária que será deletada quando o banco de dados for fechado. + Marque isso para criar uma tabela temporária que será deletada quando o banco de dados for fechado. Temporary table - Tabela temporária + Tabela temporária Setting the temporary flag for the table failed. Error message: %1 - Definindo a flag temporária para a tabela falhou. Mensagem de erro: + Definindo a flag temporária para a tabela falhou. Mensagem de erro: %1 + <html><head/><body><p><span style=" font-weight:600; color:#ff0000;">Warning: </span>There is something with this table definition that our parser doesn't fully understand. Modifying and saving this table might result in problems.</p></body></html> - + <html><head/><body><p><span style=" font-weight:600; color:#ff0000;">Alerta: </span>Nosso parser não entende algo dessa definição de tabela. Modificar e salvar essa tabela pode causar problemas.</p></body></html> + + + + Database schema + Esquema do banco de dados + + + + NN + NN + + + Changing the table schema failed. Error message: +%1 + Modificar o esquema falhou. Erro: +%1 ExportDataDialog + Export data as CSV Exportar dados como CSV @@ -848,101 +1545,139 @@ &Separador de campos + , , + ; ; + Tab Tab + | | + + + Other Outro + &Quote character &Áspas + " " + ' ' + + Could not open output file: %1 Não pôde abrir arquivo de saída: %1 + + Choose a filename to export data Escolha um arquivo para exportar dados + Text files(*.csv *.txt) Arquivos de texto(*.csv *.txt) + Please select at least 1 table. Por favor, selecione pelo menos uma tabela. + Choose a directory Escolha um diretório + Export completed. Exportação completa. + New line characters Caracteres de nova linha + Windows: CR+LF (\r\n) Windows: CR+LF (\r\n) + Unix: LF (\n) Unix: LF (\n) + Tab&le(s) Tabe&las(s) + Colu&mn names in first line &Nomes das colunas na primeira linha + Fie&ld separator Se&parador de campo + Pretty print Otimizar para leitura humana + Text files(*.json *.js *.txt) Arquivos de texto (*.json *.js *.txt) + Export data as JSON Exportar dados como JSON + + + exporting CSV + exportando CSV + + + + exporting JSON + exportando JSON + ExportSqlDialog + Export SQL... Exportar SQL... @@ -951,10 +1686,12 @@ &Tabela(s) + &Options &Opções + Keep column names in INSERT INTO Manter nomes de colunas em INSERT INTO @@ -963,60 +1700,103 @@ Nova sintaxe de INSERT INTO (múltiplas linhas em VALUES) + Export schema only - Exportar somente schema + Exportar somente esquema Please select at least 1 table. - Por favor, selecione pelo menos uma tabela. + Por favor, selecione pelo menos uma tabela. + Choose a filename to export Escolha um arquivo para exportar + Text files(*.sql *.txt) Arquivos de texto(*.sql *.txt) + Export completed. Exportação completa. + Export cancelled or failed. Exportação falhou ou foi cancelada. + Tab&le(s) Tabe&las(s) + Select All Selecionar tudo + Deselect All Limpar seleção + Multiple rows (VALUES) per INSERT statement Múltiplas linhas (VALUES) por INSERT + Export everything Exportar tudo + Export data only Exportar somente dados + Keep old schema (CREATE TABLE IF NOT EXISTS) - Manter schema antigo (CREATE TABLE IF NOT EXISTS) + Manter esquema antigo (CREATE TABLE IF NOT EXISTS) + Overwrite old schema (DROP TABLE, then CREATE TABLE) - Sobrescrever schema antigo (DROP TABLE, then CREATE TABLE) + Sobrescrever esquema antigo (DROP TABLE, then CREATE TABLE) + + + + Please select at least one table. + Por favor selecione pelo menos uma tabela. + + + + ExtendedScintilla + + + + Ctrl+H + Ctrl+H + + + + + Ctrl+P + Ctrl+P + + + + Find and Replace... + Encontrar e substituir... + + + + Print... + Imprimir... @@ -1028,23 +1808,117 @@ Deseja inserir mesmo assim? + Set to NULL Definir como NULL + Copy Copiar + Paste Colar + The content of the clipboard is bigger than the range selected. Do you want to insert it anyway? O conteúdo da área de transferência é maior do que o intervalo selecionado. Deseja inserir mesmo assim? + + + Use as Exact Filter + Usar como filtro exato + + + + Containing + Contendo + + + + Not containing + + + + + Not equal to + Diferente de + + + + Greater than + Maior que + + + + Less than + Menor que + + + + Greater or equal + Maior ou igual a + + + + Less or equal + Menor ou igual a + + + + Between this and... + Entre isso e... + + + + Regular expression + + + + + Copy with Headers + Copiar com cabeçalhos + + + + Copy as SQL + Copiar como SQL + + + + Print... + Imprimir... + + + + Use in Filter Expression + Usar na expressão de filtro + + + + Alt+Del + Alt+Del + + + + Ctrl+Shift+C + Ctrl+Shift+C + + + + Ctrl+Alt+C + Ctrl+Alt+C + + + + <p>Not all data has been loaded. <b>Do you want to load all data before selecting all the rows?</b><p><p>Answering <b>No</b> means that no more data will be loaded and the selection will not be performed.<br/>Answering <b>Yes</b> might take some time while the data is loaded but the selection will be complete.</p>Warning: Loading all the data might require a great amount of memory for big tables. + + FileDialog @@ -1054,15 +1928,319 @@ + FileExtensionManager + + + File Extension Manager + Gerenciador de extensão de arquivo + + + + &Up + &Subir + + + + &Down + &Descer + + + + &Add + &Adicionar + + + + &Remove + &Remover + + + + + Description + Descrição + + + + Extensions + Extensões + + + + *.extension + *.extensão + + + FilterLineEdit + Filter Filtro + + These input fields allow you to perform quick filters in the currently selected table. +By default, the rows containing the input text are filtered out. +The following operators are also supported: +% Wildcard +> Greater than +< Less than +>= Equal to or greater +<= Equal to or less += Equal to: exact match +<> Unequal: exact inverse match +x~y Range: values between x and y + Esses campos de entrada permitem você realizar filtros rápidos na tabela atualmente selecionada. +Por padrão, as linhas contendo o texto de entrada são filtradas. +Os seguintes operadores também são suportados: +% Curinga +> Maior que +< Menor que +>= Igual a ou maior que +<= Igual a ou menor que += Igual a +<> Diferente +x~y Intervalo: valores entre x e y + + + + These input fields allow you to perform quick filters in the currently selected table. +By default, the rows containing the input text are filtered out. +The following operators are also supported: +% Wildcard +> Greater than +< Less than +>= Equal to or greater +<= Equal to or less += Equal to: exact match +<> Unequal: exact inverse match +x~y Range: values between x and y +/regexp/ Values matching the regular expression + + + + + Clear All Conditional Formats + + + + + Use for Conditional Format + + + + + Set Filter Expression + Definir expressão de filtro + + + + What's This? + O que é isso? + + + + Is NULL + É NULL + + + + Is not NULL + Não é NULL + + + + Is empty + É vazio + + + + Is not empty + Não é vazio + + + + Not containing... + + + + + Equal to... + Igual a... + + + + Not equal to... + Diferente de... + + + + Greater than... + Maior que... + + + + Less than... + Menor que... + + + + Greater or equal... + Maior ou igual... + + + + Less or equal... + Menor ou igual... + + + + In range... + No intervalo... + + + + Regular expression... + + + + + FindReplaceDialog + + + Find and Replace + Encontrar e substituir + + + + Fi&nd text: + E&ncontrar texto: + + + + Re&place with: + Su&bstituir com: + + + + Match &exact case + Casar caixa &exata + + + + Match &only whole words + Casar s&omente palavras inteiras + + + + When enabled, the search continues from the other end when it reaches one end of the page + Quando ativado, a busca continua do outro fim quando ela atinge um fim da página + + + + &Wrap around + &Envolver em torno + + + + When set, the search goes backwards from cursor position, otherwise it goes forward + Quando ativado, a busca retrocede a partir do cursor em vez de ir para frente + + + + Search &backwards + Buscar para &trás + + + + <html><head/><body><p>When checked, the pattern to find is searched only in the current selection.</p></body></html> + + + + + &Selection only + + + + + <html><head/><body><p>When checked, the pattern to find is interpreted as a UNIX regular expression. See <a href="https://en.wikibooks.org/wiki/Regular_Expressions">Regular Expression in Wikibooks</a>.</p></body></html> + <html><head/><body><p>Quando selecionado, o padrão a ser encontrado é interpretado como uma expressão regular UNIX. Veja <a href="https://en.wikibooks.org/wiki/Regular_Expressions">Regular Expression nos Wikibooks</a>.</p></body></html> + + + + Use regular e&xpressions + Usar e&xpressões regulares + + + + Find the next occurrence from the cursor position and in the direction set by "Search backwards" + Encontrar a próxima ocorrência a partir da posição do cursor na direção selecionada por "Buscar para trás" + + + + &Find Next + &Encontrar próximo + + + + &Replace + &Substituir + + + + Highlight all the occurrences of the text in the page + Realçar todas as ocorrências do texto na página + + + + F&ind All + Encontrar &todos + + + + Replace all the occurrences of the text in the page + Substituir todas as ocorrências do texto na página + + + + Replace &All + Substituir &todos + + + + The searched text was not found + O texto procurado não foi encontrado + + + + The searched text was not found. + O texto procurado não foi encontrado. + + + + The searched text was found one time. + O texto procurado foi encontrado uma vez. + + + + The searched text was found %1 times. + O texto procurado foi encontrado %1 vezes. + + + + The searched text was replaced one time. + O texto procurado foi substituído uma vez. + + + + The searched text was replaced %1 times. + O texto procurado foi substituído %1 vezes. + ForeignKeyEditor + &Reset &Resetar @@ -1071,132 +2249,251 @@ (cláusulas de chave estrangeira (ON UPDATE, ON DELETE etc.) + Foreign key clauses (ON UPDATE, ON DELETE etc.) - + Cláusulas de chave estrangeira (ON UPDATE, ON DELETE etc.) ImportCsvDialog + Import CSV file Importar arquivo CSV &Table name - &Nome da tabela + &Nome da tabela + &Column names in first line Nomes das &colunas na primeira linha + Field &separator &Separador de campos + , , + ; ; + + Tab Tab + | | + + + Other Outro + &Quote character &Áspas + " " + ' ' + &Encoding &Encoding + UTF-8 UTF-8 + UTF-16 UTF-16 + ISO-8859-1 ISO-8859-1 + Trim fields? Trim fields? Inserting data... - Inserindo dados... + Inserindo dados... Cancel - Cancelar + Cancelar There is already a table of that name and an import into an existing table is only possible if the number of columns match. - Já existe uma tabela com esse nome e importar em uma tabela existente apenas é possível se o número de colunas for o mesmo. + Já existe uma tabela com esse nome e importar em uma tabela existente apenas é possível se o número de colunas for o mesmo. There is already a table of that name. Do you want to import the data into it? - Já existe uma tabela com esse nome. Você quer importar os dados nela? + Já existe uma tabela com esse nome. Você quer importar os dados nela? + Creating restore point failed: %1 Criação de ponto de restauração falhou: %1 + Creating the table failed: %1 Criação de tabela falhou: %1 Missing field for record %1 - Campo ou registro faltando %1 + Campo ou registro faltando %1 + Inserting row failed: %1 Inserir linha falhou: %1 + Separate tables Tabelas separadas + + When importing into an existing table with a primary key, unique constraints or a unique index there is a chance for a conflict. This option allows you to select a strategy for that case: By default the import is aborted and rolled back but you can also choose to ignore and not import conflicting rows or to replace the existing row in the table. + + + + + Abort import + + + + + Ignore row + + + + + Replace existing row + + + + + Conflict strategy + + + + + Deselect All Limpar seleção + Match Similar Detectar similares + Select All Selecionar tudo + + + Table na&me + No&me da tabela + + + + Advanced + Avançado + + + + When importing an empty value from the CSV file into an existing table with a default value for this column, that default value is inserted. Activate this option to insert an empty value instead. + Quando importando um valor em branco do arquivo CSV em uma tabela existente com um valor padrão para essa coluna, aquele valor padrão é inserido. Ative essa opção para inserir um valor em branco em vez. + + + + Ignore default &values + Ignorar &valores padrão + + + + Activate this option to stop the import when trying to import an empty value into a NOT NULL column without a default value. + Ative essa opção para parar a importação quando tentando importar um valor em branco em uma coluna NOT NULL sem um valor padrão. + + + + Fail on missing values + Falhar em valores faltando + + + + Disable data type detection + Desativar detecção de tipo de dados + + + + Disable the automatic data type detection when creating a new table. + Desativa a detecção automática de tipo de dados quando criando uma nova tabela. + + + + Import completed + Importação completa + + + + There is already a table named '%1' and an import into an existing table is only possible if the number of columns match. + Já existe uma tabela chamada '%1' e uma importação em uma tabela existente só é possível se o número de colunas bate. + + + + There is already a table named '%1'. Do you want to import the data into it? + Já existe uma tabela chamada '%1'. Você quer importar os dados nela? + + + + importing CSV + Importando CSV + + + + Importing the file '%1' took %2ms. Of this %3ms were spent in the row function. + Importando o arquivo '%1' levou %2 ms. Desses, %3 ms foram gastos na função da linha. + MainWindow + DB Browser for SQLite DB Browser para SQLite @@ -1205,6 +2502,7 @@ &Estrutura do banco de dados + toolBar1 toolBar1 @@ -1217,66 +2515,80 @@ Tabela: + Select a table to browse data Selecione uma tabela para navegar + Use this list to select a table to be displayed in the database view Use esta lista para selecionar uma tabela para ser exibida na vista do banco de dados Refresh the data in the selected table. - Atualiza os dados na tabela selecionada. + Atualiza os dados na tabela selecionada. + This button refreshes the data in the currently selected table. Este botão atualiza os dados na tabela atualmente selecionada. + F5 F5 + Clear all filters Limpar todos os filtros + Insert a new record in the current table Inserir um novo registro na tabela atual This button creates a new, empty record in the database - Este botão cria um novo registro em branco no banco de dados + Este botão cria um novo registro em branco no banco de dados + + New Record Novo registro + Delete the current record Deletar o registro atual This button deletes the record currently selected in the database - Este botão deleta o registro atualmente selecionado no banco de dados + Este botão deleta o registro atualmente selecionado no banco de dados + + Delete Record Deletar registro This is the database view. You can double-click any record to edit its contents in the cell editor window. - Esta é a vista do banco de dados. Você pode clicar duas vezes em qualquer registro para editar seus conteúdos na janela de edição de célula. + Esta é a vista do banco de dados. Você pode clicar duas vezes em qualquer registro para editar seus conteúdos na janela de edição de célula. + <html><head/><body><p>Scroll to the beginning</p></body></html> <html><head/><body><p>Rolar para o começo</p></body></html> + <html><head/><body><p>Clicking this button navigates to the beginning in the table view above.</p></body></html> <html><head/><body><p>Clicar nesse botão navega até o começo da vista de tabela acima.</p></body></html> + |< |< @@ -1289,10 +2601,12 @@ <html><head/><body><p>Clicar nesse botão navega 100 registros para cima na vista de tabela acima.</p></body></html> + < < + 0 - 0 of 0 0 - 0 de 0 @@ -1305,42 +2619,52 @@ <html><head/><body><p>Clicar nesse botão navega 100 registros para baixo na vista de tabela acima.</p></body></html> + > > + Scroll to the end Rolar para o fim + <html><head/><body><p>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Clicking this button navigates up to the end in the table view above.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</p></body></html> <html><head/><body><p>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Clicar nesse botão navega até o fim da vista de tabela acima.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</p></body></html> + >| >| + <html><head/><body><p>Click here to jump to the specified record</p></body></html> <html><head/><body><p>Clique aqui para pular para o registro especificado</p></body></html> + <html><head/><body><p>This button is used to navigate to the record number specified in the Go to area.</p></body></html> <html><head/><body><p>Esse botão navega para o registro especificado na área Ir para.</p></body></html> + Go to: Ir para: + Enter record number to browse Entre o número do registro para navegar + Type a record number in this area and click the Go to: button to display the record in the database view Digite o número de um registro nessa área e clique no botão Ir para: para exibir o registro na vista do banco de dados + 1 1 @@ -1349,156 +2673,151 @@ Editar &Pragmas - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_auto_vacuum"><span style=" text-decoration: underline; color:#0000ff;">Auto Vacuum</span></a></p></body></html> - - - None - None + None Full - Full + Full Incremental - Incremental + Incremental <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_automatic_index"><span style=" text-decoration: underline; color:#0000ff;">Automatic Index</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_automatic_index"><span style=" text-decoration: underline; color:#0000ff;">Automatic Index</span></a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_automatic_index"><span style=" text-decoration: underline; color:#0000ff;">Automatic Index</span></a></p></body></html> <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_checkpoint_fullfsync"><span style=" text-decoration: underline; color:#0000ff;">Checkpoint Full FSYNC</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_checkpoint_fullfsync"><span style=" text-decoration: underline; color:#0000ff;">Checkpoint Full FSYNC</span></a></p></body></html> - - - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_foreign_keys"><span style=" text-decoration: underline; color:#0000ff;">Foreign Keys</span></a></p></body></html> - + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_checkpoint_fullfsync"><span style=" text-decoration: underline; color:#0000ff;">Checkpoint Full FSYNC</span></a></p></body></html> <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_fullfsync"><span style=" text-decoration: underline; color:#0000ff;">Full FSYNC</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_fullfsync"><span style=" text-decoration: underline; color:#0000ff;">Full FSYNC</span></a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_fullfsync"><span style=" text-decoration: underline; color:#0000ff;">Full FSYNC</span></a></p></body></html> <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_ignore_check_constraints"><span style=" text-decoration: underline; color:#0000ff;">Ignore Check Constraints</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_ignore_check_constraints"><span style=" text-decoration: underline; color:#0000ff;">Ignore Check Constraints</span></a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_ignore_check_constraints"><span style=" text-decoration: underline; color:#0000ff;">Ignore Check Constraints</span></a></p></body></html> <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_journal_mode"><span style=" text-decoration: underline; color:#0000ff;">Journal Mode</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_journal_mode"><span style=" text-decoration: underline; color:#0000ff;">Journal Mode</span></a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_journal_mode"><span style=" text-decoration: underline; color:#0000ff;">Journal Mode</span></a></p></body></html> Delete - Delete + Delete Truncate - Truncate + Truncate Persist - Persist + Persist Memory - Memory + Memory WAL - WAL + WAL Off - Off + Off <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_journal_size_limit"><span style=" text-decoration: underline; color:#0000ff;">Journal Size Limit</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_journal_size_limit"><span style=" text-decoration: underline; color:#0000ff;">Journal Size Limit</span></a></p></body></html> - - - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_locking_mode"><span style=" text-decoration: underline; color:#0000ff;">Locking Mode</span></a></p></body></html> - + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_journal_size_limit"><span style=" text-decoration: underline; color:#0000ff;">Journal Size Limit</span></a></p></body></html> Normal - Normal + Normal Exclusive - Exclusive + Exclusive <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_max_page_count"><span style=" text-decoration: underline; color:#0000ff;">Max Page Count</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_max_page_count"><span style=" text-decoration: underline; color:#0000ff;">Max Page Count</span></a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_max_page_count"><span style=" text-decoration: underline; color:#0000ff;">Max Page Count</span></a></p></body></html> <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_page_size"><span style=" text-decoration: underline; color:#0000ff;">Page Size</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_page_size"><span style=" text-decoration: underline; color:#0000ff;">Page Size</span></a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_page_size"><span style=" text-decoration: underline; color:#0000ff;">Page Size</span></a></p></body></html> <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_recursive_triggers"><span style=" text-decoration: underline; color:#0000ff;">Recursive Triggers</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_recursive_triggers"><span style=" text-decoration: underline; color:#0000ff;">Recursive Triggers</span></a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_recursive_triggers"><span style=" text-decoration: underline; color:#0000ff;">Recursive Triggers</span></a></p></body></html> <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_secure_delete"><span style=" text-decoration: underline; color:#0000ff;">Secure Delete</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_secure_delete"><span style=" text-decoration: underline; color:#0000ff;">Secure Delete</span></a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_secure_delete"><span style=" text-decoration: underline; color:#0000ff;">Secure Delete</span></a></p></body></html> <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_synchronous"><span style=" text-decoration: underline; color:#0000ff;">Synchronous</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_synchronous"><span style=" text-decoration: underline; color:#0000ff;">Synchronous</span></a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_synchronous"><span style=" text-decoration: underline; color:#0000ff;">Synchronous</span></a></p></body></html> <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_temp_store"><span style=" text-decoration: underline; color:#0000ff;">Temp Store</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_temp_store"><span style=" text-decoration: underline; color:#0000ff;">Temp Store</span></a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_temp_store"><span style=" text-decoration: underline; color:#0000ff;">Temp Store</span></a></p></body></html> Default - Default + Default File - File + File <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_user_version"><span style=" text-decoration: underline; color:#0000ff;">User Version</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_user_version"><span style=" text-decoration: underline; color:#0000ff;">User Version</span></a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_user_version"><span style=" text-decoration: underline; color:#0000ff;">User Version</span></a></p></body></html> <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_wal_autocheckpoint"><span style=" text-decoration: underline; color:#0000ff;">WAL Auto Checkpoint</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_wal_autocheckpoint"><span style=" text-decoration: underline; color:#0000ff;">WAL Auto Checkpoint</span></a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_wal_autocheckpoint"><span style=" text-decoration: underline; color:#0000ff;">WAL Auto Checkpoint</span></a></p></body></html> E&xecute SQL &Executar SQL + &File &Arquivo + &Import &Importar + &Export E&xportar + &Edit &Editar + &View &Exibir + &Help A&juda + DB Toolbar - DB Toolbar + Barra de ferramentas do banco de dados SQL Log @@ -1509,14 +2828,17 @@ E&xibir SQL enviado por + User Usuário + Application Aplicativo + &Clear &Limpar @@ -1553,42 +2875,60 @@ Esquema do banco de dados + &New Database... &Novo banco de dados... + + Create a new database file Criar um novo arquivo de banco de dados + This option is used to create a new database file. Essa opção e utilizada para criar um novo arquivo de banco de dados. + Ctrl+N Ctrl+N + + &Open Database... &Abrir banco de dados... + + + + + Open an existing database file Abre um arquivo de banco de dados existente + + + This option is used to open an existing database file. Esta opção abre um arquivo de banco de dados existente. + Ctrl+O Ctrl+O + &Close Database &Fechar banco de dados + Ctrl+W Ctrl+W @@ -1597,10 +2937,13 @@ Reverter mudanças + + Revert database to last saved state Reverter banco de dados para o último estado salvo + This option is used to revert the current database file to its last saved state. All changes made since the last save operation are lost. Essa opção é usada para reverter o atual arquivo de banco de dados para seu último estado salvo. Todas as modificações feitas desde a última operação de salvamento são perdidas. @@ -1609,14 +2952,18 @@ Escrever Alterações + + Write changes to the database file Salva modificações para o arquivo de banco de dados + This option is used to save changes to the database file. Essa opção é usada para salvar modificações para o arquivo de banco de dados. + Ctrl+S Ctrl+S @@ -1625,18 +2972,23 @@ Compactar Banco de Dados + Compact the database file, removing space wasted by deleted records Compactar o arquivo do banco de dados, removendo espaço desperdiçado por registros deletados + + Compact the database file, removing space wasted by deleted records. Compactar o arquivo do banco de dados, removendo espaço desperdiçado por registros deletados. + E&xit &Sair + Ctrl+Q Ctrl+Q @@ -1645,10 +2997,12 @@ Banco de dados a partir de um arquivo SQL... + Import data from an .sql dump text file into a new or existing database. Importar dados de um arquivo de texto .sql em um banco de dados. + This option lets you import data from an .sql dump text file into a new or existing database. SQL dump files can be created on most database engines, including MySQL and PostgreSQL. Essa opção deixa você importar dados de um arquivo SQL em um banco de dados. Arquivos de SQL podem ser criados na maioria dos bancos de dados, como MySQL e PostgreSQL. @@ -1657,10 +3011,12 @@ Tabela a partir de um arquivo CSV... + Open a wizard that lets you import data from a comma separated text file into a database table. Abre um assistente que permite você importar dados de um arquivo CSV em uma tabela de banco de dados. + Open a wizard that lets you import data from a comma separated text file into a database table. CSV files can be created on most database and spreadsheet applications. Abre um assistente que permite você importar dados de um arquivo CSV em uma tabela de banco de dados. Arquivos CSV podem ser criados pela maioria dos programas de banco de dados e planilhas. @@ -1669,10 +3025,12 @@ Banco de dados para arquivo SQL... + Export a database to a .sql dump text file. Exportar o banco de dados para um arquivo de texto .sql. + This option lets you export a database to a .sql dump text file. SQL dump files contain all data necessary to recreate the database on most database engines, including MySQL and PostgreSQL. Essa opção permite você exportar um banco de dados para um arquivo de texto .sql. Arquivos de despejo SQL contêm todos os dados necessários para recriar o banco de dados na maioria dos motores de banco de dados, incluindo MySQL e PostgreSQL. @@ -1681,10 +3039,12 @@ Tabela(s) como arquivo CSV... + Export a database table as a comma separated text file. Exportar uma tabela de banco de dados como um arquivo CSV. + Export a database table as a comma separated text file, ready to be imported into other database or spreadsheet applications. Exportar uma tabela de banco de dados como um arquivo CSV, pronto para ser importado por outro banco de dados ou planilhas. @@ -1693,6 +3053,7 @@ Criar Tabela... + Open the Create Table wizard, where it is possible to define the name and fields for a new table in the database Abre o assistente de criação de tabelas, em que é possível definir o nome e os campos para uma nova tabela no banco de dados @@ -1701,10 +3062,13 @@ Deletar Tabela... + + Delete Table Deletar tabela + Open the Delete Table wizard, where you can select a database table to be dropped. Abre o assistente de deleção de tabelas, em que você pode selecionar uma tabela para ser eliminada. @@ -1713,6 +3077,7 @@ Modificar Tabela... + Open the Modify Table wizard, where it is possible to rename an existing table. It is also possible to add or delete fields form a table, as well as modify field names and types. Abre o assistente de modificação de tabelas, em que você pode renomear uma tabela existente. Também é possível adicionar ou deletar campos de uma tabela, assim como modificar nomes e tipos de campos. @@ -1721,22 +3086,28 @@ Criar Índice... + Open the Create Index wizard, where it is possible to define a new index on an existing database table. Abre o assistente de criação de índice, em que é possível definir um novo índice em um tabela de banco de dados já existente. + &Preferences... &Configurações... + + Open the preferences window. Abre a janela de configurações. + &DB Toolbar Barra de ferramentas do banco de &dados + Shows or hides the Database toolbar. Exibe ou oculta a barra de ferramentas do banco de dados. @@ -1745,38 +3116,50 @@ O que é isso? + Shift+F1 Shift+F1 &About... - &Sobre... + &Sobre... + &Recently opened &Recentemente aberto + Open &tab Abrir &aba + Ctrl+T Ctrl+T + &Execute SQL &Executar SQL - Execute SQL [F5, Ctrl+Return] - Executar SQL [F5, Ctrl+Return] + + + Execute SQL + This has to be equal to the tab title in all the main tabs + Executar SQL + Open SQL file Abrir arquivo SQL + + + Save SQL file Salvar arquivo SQL @@ -1785,42 +3168,45 @@ Carregar extensão + + Execute current line Executar linha atual - Execute current line [Ctrl+E] - Executar linha atual [Ctrl+E] - - + Ctrl+E Ctrl+E + Export as CSV file Exportar como arquivo CSV + Export table as comma separated values file Exportar tabela como CSV &Wiki... - &Wiki... + &Wiki... Bug &report... - &Reportar bug... + &Reportar bug... Web&site... - Web&site... + Web&site... Save Project Salvar Projeto + + Save the current session to a file Salvar a atual sessão para um arquivo @@ -1829,63 +3215,100 @@ Abrir Projeto + + Load a working session from a file Carregar uma sessão de um arquivo &Attach Database Microsoft uses "anexar", thought it was good enough a translation. - &Anexar banco de dados + &Anexar banco de dados Set Encryption Definir encriptação + + Save SQL file as Salvar arquivo SQL como + &Browse Table &Navegar tabela + Copy Create statement Copiar comando Create + Copy the CREATE statement of the item to the clipboard Copia o comando CREATE do item para a área de transferência + Ctrl+Return Ctrl+ENTER + Ctrl+L Ctrl+L + + Ctrl+P Ctrl+P + Ctrl+D Ctrl+D + Ctrl+I Ctrl+I + + Reset Window Layout + + + + + Alt+0 + + + + + The database is currenctly busy. + + + + + Click here to interrupt the currently running query. + + + + Database encoding Codificação do banco de dados + Database is encrypted using SQLCipher Banco de dados encriptado usando SQLCipher + + Choose a database file Escolha um arquivo de banco de dados @@ -1898,42 +3321,50 @@ Formato de arquivo inválido. + + + Choose a filename to save under Escolha um nome de arquivo para salvar Error adding record: - Erro adicionando registro: + Erro adicionando registro: + Error deleting record: %1 Erro adicionando registro: %1 + Please select a record first Por favor, selecione um registro primeiro + %1 - %2 of %3 %1 - %2 de %3 + + There is no database opened. Please open or create a new database file. Não há banco de dados aberta. Por favor, abra ou crie um novo arquivo de banco de dados. Are you sure you want to delete the %1 '%2'? All data associated with the %1 will be lost. - Você tem certeza de que deseja deletar %1 '%2'? + Você tem certeza de que deseja deletar %1 '%2'? Todos os dados associados com %1 serão perdidos. Error: could not delete the %1. Message from database engine: %2 - Erro: não pôde deletar %1. Mensagem do banco de dados: + Erro: não pôde deletar %1. Mensagem do banco de dados: %2 @@ -1946,7 +3377,7 @@ Error executing query: %1 - Erro executando requisição: %1 + Erro executando requisição: %1 Query executed successfully: %1 (took %2ms) @@ -1957,98 +3388,122 @@ Escolha um arquivo de texto + Text files(*.csv *.txt);;All files(*) - Arquivos de texto(*.txt);;Todos os arquivos(*) + Arquivos de texto(*.csv *.txt);;Todos os arquivos(*) Import completed - Importação completa + Importação completa + Are you sure you want to undo all changes made to the database file '%1' since the last save? Você tem certeza de que deseja desfazer todas as modificações feitas no arquivo de banco de dados '%1' desde o último salvamento? + Choose a file to import Escolha um arquivo para importar + + + Text files(*.sql *.txt);;All files(*) - Arquivos de texto(*.txt);;Todos os arquivos(*) + Arquivos de texto(*.sql *.txt);;Todos os arquivos(*) + Do you want to create a new database file to hold the imported data? If you answer no we will attempt to import the data in the SQL file to the current database. Você deseja criar um novo arquivo de banco de dados para armazenar os dados importados? Se você disser que não, tentaremos importar os dados do arquivo SQL para o banco de dados atual. + File %1 already exists. Please choose a different name. Arquivo %1 já existe. Por favor, escolha um nome diferente. + Error importing data: %1 Erro importando dados: %1 + Import completed. Importação completa. + Delete View Deletar vista + Delete Trigger Deletar gatilho + Delete Index Deletar índice + &%1 %2 &%1 %2 + Setting PRAGMA values will commit your current transaction. Are you sure? Definir valores de PRAGMA vai cometer sua transação atual. Você tem certeza? + Select SQL file to open Selecione arquivo SQL para abrir + Select file name Selecione o nome do arquivo + Select extension file Selecione o arquivo de extensão Extensions(*.so *.dll);;All files(*) - Extensões(*.so *.dll);;Todos os arquivos(*) + Extensões(*.so *.dll);;Todos os arquivos(*) + Extension successfully loaded. Extensão carregada com sucesso. + Error loading extension: %1 Erro carregado extensão: %1 + + Don't show again Não mostrar novamente + New version available. Nova versão disponível. + A new DB Browser for SQLite version is available (%1.%2.%3).<br/><br/>Please download at <a href='%4'>%4</a>. Uma nova vesão do DB Browser para SQLite está disponível (%1.%2.%3)<br/><br/>Por favor, baixe em <a href='%4'>%4</a>. @@ -2062,9 +3517,11 @@ Choose a file to open - Escolha um arquivo para abrir + Escolha um arquivo para abrir + + DB Browser for SQLite project file (*.sqbpro) Arquivo de projeto DB Browser para SQLite (*.sqbpro) @@ -2073,14 +3530,17 @@ Editar célula do banco de dados + SQL &Log - SQL &Log + &Log do SQL + Show S&QL submitted by Exibir S&QL enviado por + &Plot &Plotar @@ -2173,164 +3633,218 @@ Carregar todos os dados. Isso somente tem efeito se nem todos os dados já foram obtidos da tabela devido ao mecanismo de carregamento parcial. + &Revert Changes &Reverter modificações + &Write Changes &Escrever modificações Compact &Database - &Compactar banco de dados + &Compactar banco de dados + &Database from SQL file... &Banco de dados a partir de arquivo SQL... + &Table from CSV file... &Tabela a partir de arquivo CSV... + &Database to SQL file... &Banco de dados para arquivo SQL... + &Table(s) as CSV file... &Tabela para arquivo CSV... + &Create Table... &Criar tabela... + &Delete Table... &Deletar tabela... + &Modify Table... &Modificar tabela... + Create &Index... &Criar índice... + W&hat's This? O &que é isso? &Load extension - &Carregar extensão + &Carregar extensão Sa&ve Project - &Salvar projeto + &Salvar projeto Open &Project - Abrir &projeto + Abrir &projeto &Set Encryption - &Configurar encriptação + &Configurar encriptação + Edit display format Editar formato de exibição + Edit the display format of the data in this column Editar o formato de exibição dos dados nessa coluna + Show rowid column Mostrar coluna rowid + Toggle the visibility of the rowid column Alternar a visibilidade da coluna rowid + + Set encoding Definir codificação + Change the encoding of the text in the table cells Modificar a codificação do texto nas células da tabela + Set encoding for all tables Modificar codificação para todas as tabelas + Change the default encoding assumed for all tables in the database Modificar a codificação padrão assumida para todas as tabelas no banco de dados + Duplicate record - Duplicar registro + Duplicar registro + Encrypted Encriptado + Read only Somente leitura + Database file is read only. Editing the database is disabled. Arquivo de banco de dados é somente leitura. Edição do banco de dados está desativada. %1 rows returned in %2ms from: %3 - %1 linhas retornadas em %2ms de: %3 + %1 linhas retornadas em %2ms de: %3 , %1 rows affected - , %1 linhas afetadas + , %1 linhas afetadas Query executed successfully: %1 (took %2ms%3) - Consulta executada com sucesso: %1 (durou %2ms%3) + Consulta executada com sucesso: %1 (durou %2ms%3) + Please choose a new encoding for this table. Por favor, escolha uma nova codificação para essa tabela. + Please choose a new encoding for all tables. Por favor, escolha uma nova codificação para todas tabelas. - %1 -Leave the field empty for using the database encoding. - %1 -Deixe o campo em branco para usar a codificação do banco de dados. + + -- At line %1: +%3 +-- Result: %2 + -- Na linha %1: +%4 +-- Resultado: %2 {1:?} {3 +?} - This encoding is either not valid or not supported. - Essa codificação é inválida ou não é suportada. + + Execution finished with errors. + + + Execution finished without errors. + + + + + %1 +Leave the field empty for using the database encoding. + %1 +Deixe o campo em branco para usar a codificação do banco de dados. + + + + This encoding is either not valid or not supported. + Essa codificação é inválida ou não é suportada. + + + + Database Structure + This has to be equal to the tab title in all the main tabs Estrutura do banco de dados + + Browse Data + This has to be equal to the tab title in all the main tabs Navegar dados + + Edit Pragmas + This has to be equal to the tab title in all the main tabs Editar pragmas - Execute SQL - Executar SQL - - + &Table: &Tabela: @@ -2339,38 +3853,35 @@ Remoto + Edit Database &Cell Editar &célula do banco de dados + DB Sche&ma - Sche&ma do BD - - - Execute SQL [F5, Ctrl+Return, Ctrl+R] - Executar SQL [F5, Ctrl+Return, Ctrl+R] - - - Execute current line [Shift+F5] - Executar linha atual [Shift+F5] + Esque&ma do banco de dados + Shift+F5 Shift+F5 SQLCipher &FAQ... - SQLCipher &FAQ... + SQLCipher &FAQ... + Opens the SQLCipher FAQ in a browser window Abre o FAQ do SQLCipher em uma janela do navegador Table(s) to JSON... - Tabela(s) para JSON... + Tabela(s) para JSON... + Export one or more table(s) to a JSON file Exporta uma ou mais tabela(s) para um arquivo JSON @@ -2379,10 +3890,12 @@ Salvar para remoto + Refresh Atualizar + Error while saving the database file. This means that not all changes to the database were saved. You need to resolve the following error first. %1 @@ -2399,26 +3912,31 @@ Cancelar + &Remote &Remoto &Open Database Read Only... - &Abrir banco de dados somente leitura... + &Abrir banco de dados somente leitura... + Open an existing database file in read only mode Abre um banco de dados existente em modo somente leitura + Unlock view editing Liberar edição da vista + This unlocks the current view for editing. However, you will need appropriate triggers for editing. Isso libera a vista atual para edição. Todavia, você vai precisar dos gatilhos apropriados para editar. + Could not open database file. Reason: %1 Não pôde abrir arquivo do banco de dados. @@ -2426,264 +3944,1207 @@ Execution aborted by user - Execução abortada pelo usuário + Execução abortada pelo usuário + Choose text files Escolha arquivos de texto + Modify View Modificar vista + Modify Trigger Modificar gatilho + Modify Index Modificar índice + Modify Table Modificar tabela + Couldn't read file: %1. Não pôde ler arquivo: %1. + Couldn't save file: %1. Não pôde salvar arquivo: %1. + Please enter a pseudo-primary key in order to enable editing on this view. This should be the name of a unique column in the view. Por favor, entre uma pseudo-chave primária para habilitar edição nessa vista. Isso deveria ser o nome de uma coluna única na vista. + Scroll one page upwards - + Rolar uma página para cima + <html><head/><body><p>Clicking this button navigates one page of records upwards in the table view above.</p></body></html> - + <html><head/><body><p>Clicando nesse botão navega uma página de registros para cima.</p></body></html> + Scroll one page downwards - + Rolar uma página para baixo + <html><head/><body><p>Clicking this button navigates one page of records downwards in the table view above.</p></body></html> - + <html><head/><body><p>Clicando nesse botão navega uma página de registros para baixo.</p></body></html> + Setting PRAGMA values or vacuuming will commit your current transaction. Are you sure? + Definir valores de PRAGMA ou fazer vacuum irá commitar sua transação atual. +Deseja continuar? + + + + This is the structure of the opened database. +You can drag SQL statements from an object row and drop them into other applications or into another instance of 'DB Browser for SQLite'. + + Essa é a estrutura do banco de dados aberto. +Você pode arrastar comandos SQL de uma linha e soltá-los em outras aplicações ou em outra instância do DB Browser para SQLite. + + + + + Refresh the data in the selected table + Atualizar os dados na tabela selecionada + + + + This button clears all the filters set in the header input fields for the currently browsed table. + Esse botão limpa todos os filtros definidos no cabeçalho para a tabela atualmente navegada. + + + + Save the table as currently displayed + Salva a tabela como atualmente exibida + + + + <html><head/><body><p>This popup menu provides the following options applying to the currently browsed and filtered table:</p><ul style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;"><li style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Export to CSV: this option exports the data of the browsed table as currently displayed (after filters, display formats and order column) to a CSV file.</li><li style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Save as view: this option saves the current setting of the browsed table (filters, display formats and order column) as an SQL view that you can later browse or use in SQL statements.</li></ul></body></html> + <html><head/><body><p>Esse Menu provê as seguintes opções para a tabela atual:</p><ul style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;"><li style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Exportar para CSV: essa opção exporta os dados como estão exibidos para um arquivo CSV.</li><li style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Salvar como vista: essa opção salva a configuração atual da tabela como uma vista SQL que você depois pode consultar em comandos SQL.</li></ul></body></html> + + + + ... + ... + + + + <html><head/><body><p>This button creates a new record in the database. Hold the mouse button to open a pop-up menu of different options:</p><ul><li><span style=" font-weight:600;">New Record</span>: insert a new record with default values in the database.</li><li><span style=" font-weight:600;">Insert Values...</span>: open a dialog for entering values before they are inserted in the database. This allows to enter values acomplishing the different constraints. This dialog is also open if the <span style=" font-weight:600;">New Record</span> option fails due to these constraints.</li></ul></body></html> + <html><head/><body><p>Esse botão cria um novo registro no banco de dados. Segure o botão do mouse para abrir um menu de opções diferentes:</p><ul><li><span style=" font-weight:600;">Novo Registro</span>: insere um novo registro com valores padrão no banco de dados.</li><li><span style=" font-weight:600;">Inserir Valores...</span>: abre um diálogo para novos valores antes de serem inseridos no banco de dados. Isso permite a entrada de valores de acordo com as restrições. Esse diálogo também é abaerto se a opção<span style=" font-weight:600;">Novo Registro</span> falha devido a essas restrições.</li></ul></body></html> + + + + This button deletes the record or records currently selected in the table + Esse botão deleta o registro ou registros selecionados + + + + This is the database table view. You can do the following actions: + - Start writing for editing inline the value. + - Double-click any record to edit its contents in the cell editor window. + - Alt+Del for deleting the cell content to NULL. + - Ctrl+" for duplicating the current record. + - Ctrl+' for copying the value from the cell above. + - Standard selection and copy/paste operations. + Essa é a vista de tabela do banco de dados. Você pode fazer as seguintes ações: + - Começar a escrever para editar o valor. + - Clicar duas vezes em qualquer registro para editar seus conteúdos no editor de célula. + - Alt+Del para deletar o conteúdo da célula para NULL. + - Ctrl+" para duplicar o registro atual. + - Ctrl+' para copiar o valor da célula de cima. + - Seleção normal para copiar e colar. + + + <html><head/><body><p><a href="https://www.sqlite.org/pragma.html#pragma_case_sensitive_like">Case Sensitive Like</a></p></body></html> + <html><head/><body><p><a href="https://www.sqlite.org/pragma.html#pragma_case_sensitive_like">Case Sensitive Like</a></p></body></html> + + + + Warning: this pragma is not readable and this value has been inferred. Writing the pragma might overwrite a redefined LIKE provided by an SQLite extension. + Alerta: esse pragma não é legível e esse valor foi inferido. Escrever o pragma pode sobrescrever um LIKE redefinido provido por uma extensão SQL. + + + + &Tools + Ferramen&tas + + + + This button clears the contents of the SQL logs + Esse botão limpa os logs do SQL + + + + This panel lets you examine a log of all SQL commands issued by the application or by yourself + Esse painel deixa você examinar um log de todos os comandos SQL dados pela aplicação ou por você + + + + This is the structure of the opened database. +You can drag multiple object names from the Name column and drop them into the SQL editor and you can adjust the properties of the dropped names using the context menu. This would help you in composing SQL statements. +You can drag SQL statements from the Schema column and drop them into the SQL editor or into other applications. + + Essa é a estrutura do banco de dados aberto. +Você pode arrastar múltiplos nomes de objetos da coluna Nome e largá-los no editor SQL e você pode ajustar as propriedades dos nomes largados usando o menu de contexto. Isso ajudaria você a compor comandos SQL. +Você pode arrastar comandos SQL da coluna Esquema e largá-los no editor SQL ou em outras aplicações. + + + + + + Project Toolbar + Barra de ferramentas do projeto + + + + Extra DB toolbar + Barra de ferramentas do banco de dados extra + + + + + + Close the current database file + Fechar o arquivo de banco de dados aberto + + + + This button closes the connection to the currently open database file + Esse botão fecha a conexão com o arquivo aberto + + + + Compact &Database... + Compactar banco de &dados... + + + + &About + &Sobre + + + + This button opens a new tab for the SQL editor + Esse botão abre uma nova aba para o editor SQL + + + + Execute all/selected SQL + Executar todo/selecionado SQL + + + + This button executes the currently selected SQL statements. If no text is selected, all SQL statements are executed. + Esse botão executa o SQL selecionado. Se não existe SQL selecionado, todo o SQL é executado. + + + + This button opens a file containing SQL statements and loads it in a new editor tab + Esse botão abre um arquivo contendo SQL e carrega ele numa nova aba do editor + + + + &Load Extension... + &Carregar extensão... + + + + This button executes the SQL statement present in the current editor line + Esse botão executa o comando SQL presente na linha atual do editor + + + + &Wiki + &Wiki + + + + Bug &Report... + &Reportar bug... + + + + Feature Re&quest... + Re&quisitar feature... + + + + Web&site + &Site + + + + &Donate on Patreon... + &Doar no Patreon... + + + + Sa&ve Project... + Sal&var projeto... + + + + This button lets you save all the settings associated to the open DB to a DB4S project file + Esse botão deixa você salvar todas as configurações associadas ao banco de dados aberto a um projeto do DB4S + + + + Open &Project... + Abrir &projeto... + + + + This button lets you open a DB4S project file + Esse botão deixa você abrir um projeto do DB4S + + + + &Attach Database... + &Anexar banco de dados... + + + + + Add another database file to the current database connection + Adiciona outro arquivo de banco de dados para a conexão atual + + + + This button lets you add another database file to the current database connection + Esse botão deixa você adicionar outro banco de dados para a conexão atual com o banco de dados + + + + &Set Encryption... + Definir en&criptação... + + + + This button saves the content of the current SQL editor tab to a file + Esse botão salva o conteúdo do editor SQL para um arquivo + + + + SQLCipher &FAQ + &FAQ do SQLCipher + + + + Table(&s) to JSON... + Tabela(&s) para JSON... + + + + Open Data&base Read Only... + Abrir &banco de dados somente leitura... + + + + Save results + Salvar resultados + + + + Save the results view + Salvar a vista de resultados + + + + This button lets you save the results of the last executed query + Esse botão deixa você salvar os resultados da última consulta executada + + + + + Find text in SQL editor + Encontrar texto no editor SQL + + + + This button opens the search bar of the editor + Esse botão abre a barra de busca do editor + + + + Ctrl+F + Ctrl+F + + + + + Find or replace text in SQL editor + Encontrar ou substituir texto no editor SQL + + + + This button opens the find/replace dialog for the current editor tab + Esse botão abre o diálogo de encontrar/substituir para a aba atual do editor + + + + Ctrl+H + Ctrl+H + + + + + Export to &CSV + Exportar para &CSV + + + + + Save as &view + Salvar como &vista + + + + Save as view + Salvar como vista + + + + Hide column(s) + Ocultar coluna(s) + + + + Hide selected column(s) + Ocultar coluna(s) selecionada(s) + + + + Show all columns + Mostrar todas as colunas + + + + Show all columns that were hidden + Mostrar todas as colunas ocultas + + + + Shows or hides the Project toolbar. + Mostra ou oculta a barra de ferramentos do Projeto. + + + + Extra DB Toolbar + Barra de ferramentas do banco de dados extra + + + + + Export the filtered data to CSV + Exportar dados filtrados para CSV + + + + This button exports the data of the browsed table as currently displayed (after filters, display formats and order column) as a CSV file. + Esse botão exporta os dados da tabela como atualmente exibidos como um arquivo CSV. + + + + + Save the current filter, sort column and display formats as a view + Salva o filtro, ordenação e formato como uma vista + + + + This button saves the current setting of the browsed table (filters, display formats and order column) as an SQL view that you can later browse or use in SQL statements. + Esse botão salva as configurações da tabela exibida como uma vista SQL que você pode utilizar em comandos SQL depois. + + + + Insert Values... + Inserir Valores... + + + + + Open a dialog for inserting values in a new record + Abre um diálogo para inserir valores em um novo registro + + + + + Insert new record using default values in browsed table + Inserir novo registro usando valores padrão na tabela + + + + New In-&Memory Database + Nova tabela em &memória + + + + Drag && Drop Qualified Names + Arrastar e soltar nomes qualificados + + + + + Use qualified names (e.g. "Table"."Field") when dragging the objects and dropping them into the editor + Use nomes qualificados (p.e. "Tabela"."Campo") quando arrastando objetos e soltando eles no editor + + + + Drag && Drop Enquoted Names + Arrastar e soltar nomes entre áspas + + + + + Use escaped identifiers (e.g. "Table1") when dragging the objects and dropping them into the editor + Use identificadores escapados (p.e. "Tabela1") quando arrastando e soltando objetos no editor + + + + &Integrity Check + Teste de &integridade + + + + Runs the integrity_check pragma over the opened database and returns the results in the Execute SQL tab. This pragma does an integrity check of the entire database. + Roda o teste de integridade sobre o banco de dados aberto e retorna os resultados na aba Executar SQL. + + + + &Foreign-Key Check + Teste de chave &estrangeira + + + + Runs the foreign_key_check pragma over the opened database and returns the results in the Execute SQL tab + Roda o teste de chave estrangeira sobre o banco de dados aberto e retorna os resultados na aba Executar SQL + + + + &Quick Integrity Check + Teste de integridade &rápido + + + + Run a quick integrity check over the open DB + Roda um teste de integridade rápido sobre o banco de dados aberto + + + + Runs the quick_check pragma over the opened database and returns the results in the Execute SQL tab. This command does most of the checking of PRAGMA integrity_check but runs much faster. + Roda um outro pragma para a verificação de integridade do banco de dados. Faz quase tantos testes quando o outro PRAGMA mas executa muito mais rápido. + + + + &Optimize + &Otimizar + + + + Attempt to optimize the database + Tenta otimizar o banco de dados + + + + Runs the optimize pragma over the opened database. This pragma might perform optimizations that will improve the performance of future queries. + Roda o pragma de otimização sobre o banco de dados aberto. Esse pragma pode realizar otimizações que vão melhorar a performance de consultas futuras. + + + + + Print + Imprimir + + + + Print text from current SQL editor tab + Imprimir texto do editor SQL + + + + Open a dialog for printing the text in the current SQL editor tab + Abre um diálogo para imprimir o texto na aba atual do editor SQL + + + + Print the structure of the opened database + Imprime a estrutura do banco de dados aberto + + + + Open a dialog for printing the structure of the opened database + Abre um diálogo para imprimir a estrutura do banco de dados aberto + + + + Un/comment block of SQL code + + + + + Comment or uncomment current line or selected block of code + + + + + Comment or uncomment the selected lines or the current line, when there is no selection. All the block is toggled according to the first line. + + + + + Ctrl+/ + + + + + Stop SQL execution + + + + + Stop the currently running SQL script + + + + + In-Memory database + Banco de dados em memória + + + + You are still executing SQL statements. When closing the database now the execution will be stopped. maybe leaving the database in an incosistent state. Are you sure you want to close the database? + + + + + determining row count... + determinando número de linhas... + + + + %1 - %2 of >= %3 + %1 - %2 de >= %3 + + + + Are you sure you want to delete the table '%1'? +All data associated with the table will be lost. + Você tem certeza de que deseja deletar a tabela '%1'? +Todos os dados associados com a tabela serão perdidos. + + + + Are you sure you want to delete the view '%1'? + Você tem certeza que deseja deletar a vista '%1'? + + + + Are you sure you want to delete the trigger '%1'? + Você tem certeza que deseja deletar o gatilho '%1'? + + + + Are you sure you want to delete the index '%1'? + Você tem certeza que deseja deletar o índice '%1'? + + + + Error: could not delete the table. + Erro: não pôde deletar a tabela. + + + + Error: could not delete the view. + Erro: não pôde deletar a vista. + + + + Error: could not delete the trigger. + Erro: não pôde deletar o gatilho. + + + + Error: could not delete the index. + Erro: não pôde deletar o índice. + + + + Message from database engine: +%1 + Mensagem do banco de dados: +%1 + + + + Editing the table requires to save all pending changes now. +Are you sure you want to save the database? + Editar a tabela requer salvar todas as mudanças pendentes agora. +Você tem certeza que quer salvar o banco de dados? + + + + You are already executing SQL statements. Do you want to stop them in order to execute the current statements instead? Note that this might leave the database in an inconsistent state. + + + + + -- EXECUTING SELECTION IN '%1' +-- + -- EXECUTANDO SELEÇÃO EM '%1' +-- + + + + -- EXECUTING LINE IN '%1' +-- + -- EXECUTANDO LINHA EM '%1' +-- + + + + -- EXECUTING ALL IN '%1' +-- + -- EXECUTANDO TUDO EM '%1' +-- + + + executing query + executando consulta + + + + %1 rows returned in %2ms + %1 linhas retornadas em %2 ms + + + query executed successfully. Took %1ms%2 + consulta executada com sucesso. Levou %1 ms%2 + + + -- At line %1: +%4 +-- Result: %3 + -- Na linha %1: +%4 +-- Resultado: %3 + + + + Import completed. Some foreign key constraints are violated. Please fix them before saving. + Importação completa. Algumas chaves estrangeiras são violadas. Por favor corrija-as antes de salvar. + + + + The statements in this tab are still executing. Closing the tab will stop the execution. This might leave the database in an inconsistent state. Are you sure you want to close the tab? + + + + + Extensions(*.so *.dylib *.dll);;All files(*) + + + + + Choose a project file to open + Escolha um arquivo de projeto para abrir + + + + This project file is using an old file format because it was created using DB Browser for SQLite version 3.10 or lower. Loading this file format is still fully supported but we advice you to convert all your project files to the new file format because support for older formats might be dropped at some point in the future. You can convert your files by simply opening and re-saving them. + Esse arquivo de projeto está usando um formato de arquivo mais velho porque ele foi criado usando DB Browser para SQLite versão 3.10 ou menor. Esse arquivo é suportado mas nós aconselhamos converter todos os projetos para o novo formato de arquivos porque o suporte para arquivos antigos pode ser abandonado no futuro. Você pode converter seus arquivos simplesmente abrindo e salvando eles. + + + + Duplicate records + Duplicar registros + + + + Ctrl+" + Ctrl+" + + + + Collation needed! Proceed? + Função de comparação necessária! Proceder? + + + + A table in this database requires a special collation function '%1' that this application can't provide without further knowledge. +If you choose to proceed, be aware bad things can happen to your database. +Create a backup! + Uma tabela nesse banco de dados requer uma função de comparação especial '%1' que esse aplicativo não pode prover. +So você optar por proceder, esteja avisado de que coisas ruins podem acontecer para o seu banco de dados. +Faça um backup! + + + + creating collation + criando função de comparação + + + + Set a new name for the SQL tab. Use the '&&' character to allow using the following character as a keyboard shortcut. + Defina um novo nome para a aba de SQL. Use o caractere '&&' para poder usar o seguinte caractere como um atalho de teclado. + + + + Please specify the view name + Por favor, especifique o nome da vista + + + + There is already an object with that name. Please choose a different name. + Já existe um objeto com esse nome. Por favor, escolha um nome diferente. + + + + View successfully created. + Vista criada com sucesso. + + + + Error creating view: %1 + Erro criando vista: %1 + + + + There is no filter set for this table. View will not be created. + Não há filtro para essa tabela. Vista não será criada. + + + + Delete Records + Deletar Registros + + + + This action will open a new SQL tab for running: + Essa ação irá abrir uma nova aba SQL para rodar: + + + + Press Help for opening the corresponding SQLite reference page. + Pressione Help para abrir a página de referência SQL correspondente. + + + + Busy (%1) + + + Print currently browsed table data + Imprimir dados da tabela atual + + + + Print currently browsed table data. Print selection if more than one cell is selected. + Imprimir dados da tabela atual. Imprime a seleção se mais de uma célula está selecionada. + + + + Error checking foreign keys after table modification. The changes will be reverted. + Erro verificando as chaves estrangeiras após modificação. Mudanças serão revertidas. + + + + This table did not pass a foreign-key check.<br/>You should run 'Tools | Foreign-Key Check' and fix the reported issues. + Essa tabela não passou um teste de chave estrangeira.<br/>Você deveria rodar 'Ferramentas | Teste de Chave Estrangeira| e corrigir os problemas reportados. + + + + NullLineEdit + + + Set to NULL + Definir como NULL + + + + Alt+Del + Alt+Del + PlotDock + Plot Plotar + Columns Colunas + X X + Y Y _ - _ + _ + Line type: Tipo da linha: + + None Nenhum + Line Linha + StepLeft Passo à esquerda + StepRight Passo à direita + StepCenter Passo centralizado + Impulse Impulso + Point shape: Ponto: + Cross Cruz + Plus Mais + Circle Círculo + Disc Disco + Square Quadrado + Diamond Diamante + Star Estrela + Triangle Triângulo + TriangleInverted Triângulo Invertido + CrossSquare Cruz Quadrado + PlusSquare Mais Quadrado + CrossCircle Cruz Círculo + PlusCircle Mais Círculo + Peace Paz + <html><head/><body><p>Save current plot...</p><p>File format chosen by extension (png, jpg, pdf, bmp)</p></body></html> <html><head/><body><p>Salvar plotagem atual...</p><p>Formato de arquivo definido pela extensão (png, jpg, pdf, bmp)</p></body></html> - Save current plot... - Salvar plotagem atual... + + Save current plot... + Salvar plotagem atual... + + + Load all data. This has only an effect if not all data has been fetched from the table yet due to the partial fetch mechanism. + Carregar todos os dados. Isso somente tem efeito se nem todos os dados já foram obtidos da tabela devido ao mecanismo de carregamento parcial. + + + + + + Row # + Coluna # + + + Choose a axis color + Escolha uma cor para o eixo + + + + Choose a filename to save under + Escolha um nome de arquivo para salvar + + + + PNG(*.png);;JPG(*.jpg);;PDF(*.pdf);;BMP(*.bmp);;All Files(*) + PNG(*.png);;JPG(*.jpg);;PDF(*.pdf);;BMP(*.bmp);;Todos os arquivos(*) + + + Fetching all data... + Obtendo todos os dados... + + + Cancel + Cancelar + + + + <html><head/><body><p>This pane shows the list of columns of the currently browsed table or the just executed query. You can select the columns that you want to be used as X or Y axis for the plot pane below. The table shows detected axis type that will affect the resulting plot. For the Y axis you can only select numeric columns, but for the X axis you will be able to select:</p><ul style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;"><li style=" margin-top:12px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Date/Time</span>: strings with format &quot;yyyy-MM-dd hh:mm:ss&quot; or &quot;yyyy-MM-ddThh:mm:ss&quot;</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Date</span>: strings with format &quot;yyyy-MM-dd&quot;</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Time</span>: strings with format &quot;hh:mm:ss&quot;</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Label</span>: other string formats. Selecting this column as X axis will produce a Bars plot with the column values as labels for the bars</li><li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Numeric</span>: integer or real values</li></ul><p>Double-clicking the Y cells you can change the used color for that graph.</p></body></html> + <html><head/><body><p>Esse painel mostra a lista de colunas da tabela atualmente exibida ou a consulta recém executada. Você pode selecionar as colunas que você quer que sejam utilizadas como os eixos X e Y para o painel de plotagem abaixo. A tabela mostra o tipo detectado de exio que será utilizado na plotagem. For o eixo Y você só pode selecionar colunas numéricas, mas para o eixo X você pode selecionar:</p><ul style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;"><li style=" margin-top:12px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Data/Hora</span>: strings com o formato &quot;yyyy-MM-dd hh:mm:ss&quot; ou &quot;yyyy-MM-ddThh:mm:ss&quot;</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Data</span>: strings com o formato &quot;yyyy-MM-dd&quot;</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Hora</span>: strings com o formato &quot;hh:mm:ss&quot;</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Rótulo</span>: outros formatos de string. Selecionando essa coluna como X vai produzir um gráfico de barras com as colunas como rótulos para as barras</li><li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Numérico</span>: valores inteiros ou reais</li></ul><p>Clicando duas vezes nas células Y você pode mudar a cor usada para aquele gráfico.</p></body></html> + + + + Axis Type + Tipo do eixo + + + + Here is a plot drawn when you select the x and y values above. + +Click on points to select them in the plot and in the table. Ctrl+Click for selecting a range of points. + +Use mouse-wheel for zooming and mouse drag for changing the axis range. + +Select the axes or axes labels to drag and zoom only in that orientation. + Aqui está um gráfico feito quando você seleciona os valores X e Y acima. + +Clique nos pontos para selecioná-los no gráfico e na tabela. Ctrl+Clique para selecionar um intervalo de pontos. + +Use o scroll do mouse para dar zoom e arraste o mouse para alterar o intervalo dos eixos. + +Selecione os eixos ou rótulos dos eixos para arrastar e dar zoom somente naquela orientação. + + + + + Load all data and redraw plot + Carregar todos os dados e plotar de novo + + + + Copy + Copiar + + + + Show legend + Mostrar legenda + + + + Stacked bars + Barras empilhadas + + + + Date/Time + Data/Hora + + + + Date + Data + + + + Time + Hora - Load all data. This has only an effect if not all data has been fetched from the table yet due to the partial fetch mechanism. - Carregar todos os dados. Isso somente tem efeito se nem todos os dados já foram obtidos da tabela devido ao mecanismo de carregamento parcial. + + + Numeric + Numérico - Row # - Coluna # + + Label + Rótulo - Choose a axis color - Escolha uma cor para o eixo + + Invalid + Inválido - Choose a filename to save under - Escolha um nome de arquivo para salvar + + Load all data and redraw plot. +Warning: not all data has been fetched from the table yet due to the partial fetch mechanism. + Carregar todos os dados e plotar de novo. +Aviso: nem todos os dados foram obtidos da tabela ainda devido ao mecanismo de obtenção parcial. - PNG(*.png);;JPG(*.jpg);;PDF(*.pdf);;BMP(*.bmp);;All Files(*) - PNG(*.png);;JPG(*.jpg);;PDF(*.pdf);;BMP(*.bmp);;Todos os arquivos(*) + + Choose an axis color + Escolher a cor do eixo - Fetching all data... - Obtendo todos os dados... + + There are curves in this plot and the selected line style can only be applied to graphs sorted by X. Either sort the table or query by X to remove curves or select one of the styles supported by curves: None or Line. + Existem curvas nesse gráfico e o estilo de linha selecionado só pode ser aplicado para gráficos ordenados por X. Ou ordene a tabela ou consulte por X para remover curvas ou selecione um dos estilos suportados por curvas: Nenhum ou Linha. - Cancel - Cancelar + + Print... + Imprimir... PreferencesDialog + Preferences Configurações + &General &Geral + Remember last location Lembrar do último diretório + Always use this location Sempre usar esse diretório + Remember last location for session only Lembrar do último diretório somente nessa sessão + + + ... ... + Default &location Diretório &padrão + Lan&guage &Idioma + Automatic &updates &Atualizações automáticas + + + + + + + + enabled ativado + &Database &Banco de dados + Database &encoding &Codificação do banco de dados + Open databases with foreign keys enabled. Abrir bancos de dados com chaves estrangeiras ativado. + &Foreign keys &Chaves estrangeiras @@ -2696,12 +5157,13 @@ &Prefetch block size + Data &Browser Navegador de &dados NULL fields - Campos nulos + Campos nulos Text &colour @@ -2709,141 +5171,175 @@ &Text - &Texto + &Texto Bac&kground colour Cor de &fundo + &SQL &SQL + Settings name Settings name + Context Context + Colour Cor + Bold Negrito + Italic Itálico + Underline Underline + Keyword Palavra-chave function - função + função + Function Função + Table Tabela + Comment Comentário + Identifier Identificador + String String currentline - currentline + currentline + Current line Linha atual + SQL &editor font size Tamanho da fonte do &editor de SQL SQL &log font size - Tamanho da fonte do &log de SQL + Tamanho da fonte do &log de SQL Tab size: Tab size: + SQL editor &font &Fonte do editor de SQL + &Extensions &Extensões + Select extensions to load for every database: Selecione extensões para carregar para todos os bancos de dados: + Add extension Adicionar extensão + Remove extension Remover extensão + <html><head/><body><p>While supporting the REGEXP operator SQLite doesn't implement any regular expression<br/>algorithm but calls back the running application. DB Browser for SQLite implements this<br/>algorithm for you to let you use REGEXP out of the box. However, as there are multiple possible<br/>implementations of this and you might want to use another one, you're free to disable the<br/>application's implementation and load your own by using an extension. Requires restart of the application.</p></body></html> <html><head/><body><p>Embora suporte o operador REGEXP, SQLite não implementa expressões regulares mas recorre ao aplicativo em execução.<br/>DB Browser para SQLite implementa esse algoritmo para você poder utilizar REGEXP.<br/>Todavia, como existem múltiplas implementações possíveis desse algoritmo e você pode querer usar outra, você pode desativar a implementação do aplicativo e carregar a sua própria implementação através de uma extensão.<br/>Requer que o programa seja reiniciado.</p></body></html> + Disable Regular Expression extension Desativar extensão de expressões regulares + + Choose a directory Escolha um diretório + The language will change after you restart the application. A linguagem mudará após reiniciar o programa. + Select extension file Selecione arquivo de extensão + + Extensions(*.so *.dylib *.dll);;All files(*) + + + Extensions(*.so *.dll);;All files(*) - Extensões(*.so *.dll);;Todos os arquivos(*) + Extensões(*.so *.dll);;Todos os arquivos(*) + Remove line breaks in schema &view Remover quebras de linhas em &vista de esquema + Prefetch block si&ze &Tamanho de bloco de prefetch + Advanced Avançado @@ -2852,185 +5348,410 @@ SQL para executar após abrir o banco de dados + Default field type Tipo padrão de campo + Font Fonte + &Font &Fonte Font si&ze: - &Tamanho da fonte: + &Tamanho da fonte: Field colors - Cores do campo + Cores do campo + NULL NULL + Regular Regular Text - Texto + Texto + Binary Binário + Background Fundo + Filters Filtros + Escape character Caractere de escape + Delay time (&ms) Tempo de delay (&ms) + Set the waiting time before a new filter value is applied. Can be set to 0 for disabling waiting. Definir o tempo de espera antes de aplicar um novo filtro de valor. Pode ser definido para zero para desativar espera. + Tab size Tamanho de tabulação + Error indicators Indicadores de erro Enabling error indicators highlights the SQL code lines that caused errors during the last execution - Ativar indicadores de erro destaca as linhas de SQL que causaram erros durante a última execução + Ativar indicadores de erro destaca as linhas de SQL que causaram erros durante a última execução + Hori&zontal tiling Disposição &horizontal + If enabled the SQL code editor and the result table view are shown side by side instead of one over the other. Se ativados, o editor de SQL e a tabela de resultados são exibidos lado a lado em vez de um sobre o outro. + Code co&mpletion Co&mpletação de código + Show remote options Mostrar opções remotas + SQ&L to execute after opening database SQ&L para executar após abrir o banco de dados + Content Conteúdo + Symbol limit in cell Limite de símbolos na célula + Remote Remoto + CA certificates Certificados CA + + Subject CN - Nome Comum do sujeito + Nome comum do sujeito + Common Name - Nome Comum + Nome comum + Subject O O do sujeito + Organization Organização + + Valid from Válido de + + Valid to Válido para + + Serial number Número serial + Your certificates Seus certificados + File Arquivo + Subject Common Name - Nome Comum do sujeito + Nome comum do sujeito + Issuer CN CN do emissor + Issuer Common Name Nome Comum do emissor + Import certificate file Importar certificado + No certificates found in this file. Nem um certificado encontrado nesse arquivo. + Are you sure you want do remove this certificate? All certificate data will be deleted from the application settings! Você tem certeza de que deseja remover esse certificado? Todos os dados do certificado serão deletados das configurações da aplicação! + Clone databases into Clonar bancos de dados em + + + Toolbar style + Estilo da barra de ferramentas + + + + Only display the icon + Exibir apenas o ícone + + + + Only display the text + Exibir apenas o texto + + + + The text appears beside the icon + O texto aparece ao lado do ícone + + + + The text appears under the icon + O texto aparece sob o ícone + + + + Follow the style + Seguir o estilo + + + + DB file extensions + Extensões de arquivo de bancos de dados + + + + Manage + Gerenciar + + + + Font si&ze + &Tamanho da fonte + + + + + This is the maximum number of rows in a table for enabling the value completion based on current values in the column. +Can be set to 0 for disabling completion. + Esse é o número máximo de linhas na tabela para preencher baseado nos valores atualmente na coluna. +Pode ser 0 para desabilitar preenchimento. + + + + Row count threshold for completion + Limite de contagem de linhas para preencher + + + + Field display + Exibição do campo + + + + Displayed &text + &Texto exibido + + + + Text color + Cor do texto + + + + Background color + Cor do plano de fundo + + + + Preview only (N/A) + Somente prévia (N/D) + + + + Foreground + Plano de frente + + + + SQL &results font size + Tamanho da fonte dos &resultados do SQL + + + + &Wrap lines + &Quebra de linhas + + + + Never + Nunca + + + + At word boundaries + Nos limites de palavras + + + + At character boundaries + Nos limites de caractere + + + + At whitespace boundaries + Nos limites de espaço em branco + + + + &Quotes for identifiers + Áspas &para identificadores + + + + Choose the quoting mechanism used by the application for identifiers in SQL code. + Escolha as áspas utilizadas pela aplicação para identificadores no código SQL. + + + + "Double quotes" - Standard SQL (recommended) + "Áspas duplas" - SQL Padrão (recomendado) + + + + `Grave accents` - Traditional MySQL quotes + `Crases`- MySQL tradicional + + + + [Square brackets] - Traditional MS SQL Server quotes + [Colchetes] - MS SQL Server tradicional + + + + Keywords in &UPPER CASE + Palavras-chave em &CAIXA ALTA + + + + When set, the SQL keywords are completed in UPPER CASE letters. + Quando definido, as palavras-chave SQL serão completadas em CAIXA ALTA. + + + + When set, the SQL code lines that caused errors during the last execution are highlighted and the results frame indicates the error in the background + Quando definido, as linhas de código SQL que causaram erros durante a última execução são destacadas e os resultados indicam os erros no fundo + + + + Are you sure you want to clear all the saved settings? +All your preferences will be lost and default values will be used. + Você tem certeza que deseja limpar as configurações salvas? +Todas as suas preferências serão perdidas e os valores padrão serão utilizados. + + + + When enabled, the line breaks in the Schema column of the DB Structure tab, dock and printed output are removed. + Quando ativado, as quebras de linha na coluna Esquema da aba Estrutura do banco de dados e nas saídas impressas são removidas. + + + + <html><head/><body><p>SQLite provides an SQL function for loading extensions from a shared library file. Activate this if you want to use the <span style=" font-style:italic;">load_extension()</span> function from SQL code.</p><p>For security reasons, extension loading is turned off by default and must be enabled through this setting. You can always load extensions through the GUI, even though this option is disabled.</p></body></html> + + + + + Allow loading extensions from SQL code + + QObject + Error importing data Erro importando dados + from record number %1 a partir de registro número %1 + . %1 . @@ -3038,91 +5759,137 @@ Decoding CSV file... - Decodificando arquivo CSV... + Decodificando arquivo CSV... + Cancel Cancelar Collation needed! Proceed? - Função de comparação necessária! Proceder? + Função de comparação necessária! Proceder? A table in this database requires a special collation function '%1' that this application can't provide without further knowledge. If you choose to proceed, be aware bad things can happen to your database. Create a backup! - Uma tabela nesse banco de dados requer uma função de comparação especial '%1' que esse aplicativo não pode prover. + Uma tabela nesse banco de dados requer uma função de comparação especial '%1' que esse aplicativo não pode prover. So você optar por proceder, esteja avisado de que coisas ruins podem acontecer para o seu banco de dados. Faça um backup! SQLite database files (*.db *.sqlite *.sqlite3 *.db3);;All files (*) - Arquivos de banco de dados SQL (*.db *.sqlite *.sqlite3 *.db3);;Todos os arquivos (*) + Arquivos de banco de dados SQL (*.db *.sqlite *.sqlite3 *.db3);;Todos os arquivos (*) + + + + All files (*) + Todos arquivos (*) + + + + Importing CSV file... + Importando arquivo CSV... + + + + SQLite database files (*.db *.sqlite *.sqlite3 *.db3) + Bancos de dados SQLite (*.db *.sqlite *.sqlite3 *.db3) RemoteDatabase + Error: Invalid client certificate specified. Erro: Certificado de cliente inválido especificado. + Please enter the passphrase for this client certificate in order to authenticate. Por favor entre a frase chave para esse certificado de cliente para se autenticar. + Cancel Cancelar Uploading remote database to %1. - Enviando banco de dados remoto para + Enviando banco de dados remoto para %1. Downloading remote database from %1. - Baixando banco de dados remoto de + Baixando banco de dados remoto de %1. + + Error: The network is not accessible. Erro: A rede não é acessível. + Error: Cannot open the file for sending. Erro: Não pôde abrir o arquivo para envio. + Error when connecting to %1. %2 Erro quando conectando com %1. %2 + Error opening remote file at %1. %2 Erro abrindo arquivo remoto em %1. %2 + Error opening local databases list. %1 Erro abrindo lista local de bancos de dados. %1 + Error creating local databases list. %1 Erro criando lista local de bancos de dados. %1 + + + Uploading remote database to +%1 + Enviando banco de dados remoto para +%1 + + + + Downloading remote database from +%1 + Baixando banco de dados remoto de +%1 + + + + The remote database has been updated since the last checkout. Do you want to update the local database to the newest version? Note that this discards any changes you have made locally! If you don't want to lose local changes, click No to open the local version. + O banco de dados remoto foi atualizado desde o último checkout. Você deseja atualizar o banco de dados local para a versão mais nova? Note que isso descarta quaisquer mudanças que você fez localmente! Se você não quer perder essas alterações, clique Não para abrir a versão local. + RemoteDock + Remote Remoto @@ -3135,21 +5902,40 @@ Local + Identity Identidade + Go Ir + Push currently opened database to server + Enviar o banco de dados aberto para o servidor + + + + <html><head/><body><p>No DBHub.io account yet? <a href="https://dbhub.io/"><span style=" text-decoration: underline; color:#007af4;">Create one now</span></a> and import your certificate <a href="#preferences"><span style=" text-decoration: underline; color:#007af4;">here</span></a> to share your databases.</p><p>For online help visit <a href="https://dbhub.io/about"><span style=" text-decoration: underline; color:#007af4;">here</span></a>.</p></body></html> + + + Connect to the remote server using the currently selected identity. The correct server is taken from the identity as well. + Conectar com o servidor remoto usando a identidade atualmente selecionada. O servidor correto é obtido a partir da identidade também. + + + + <html><head/><body><p>In this pane, remote databases from dbhub.io website can be added to DB4S. First you need an identity:</p><ol style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;"><li style=" margin-top:12px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Login to the dbhub.io website (use your GitHub credentials or whatever you want)</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Click the button to create a DB4S certificate (that's your identity). That'll give you a certificate file (save it to your local disk).</li><li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Go to the Remote tab in DB4S Preferences. Click the button to add a new certificate to DB4S and choose the just downloaded certificate file.</li></ol><p>Now the Remote panel shows your identity and you can add remote databases.</p></body></html> + <html><head/><body><p>Nesse painel, bancos de dados remotos do dbhub.io podem ser adicionados ao DB4S. Primeiro você precisa de uma identidade:</p><ol style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;"><li style=" margin-top:12px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Entre no dbhub.io</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Clique no botão para criar um certificado do DB4S (a sua identidade). Isso irá dar um arquivo de certificado que você deve salvar para o disco local</li><li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Vá para a aba Remoto nas preferências do DB4S. Clique o botão para adicionar um novo certificado ao DB4S e escolha o arquivo recém baixado.</li></ol><p>Agora o painel Remoto mostra a sua identidade e você pode adicionar bancos de dados remotos.</p></body></html> + RemoteModel + Name Nome @@ -3158,306 +5944,580 @@ Versão + Last modified Última modificação + Size Tamanho + bytes bytes + Commit - + Commit RemotePushDialog + Push database - + Enviar banco de dados + Database na&me to push to - + No&me do banco de dados para enviar + Commit message - + Mensagem de commit + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Oxygen-Sans'; font-size:10pt; font-weight:400; font-style:normal;"> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p></body></html> - + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Oxygen-Sans'; font-size:10pt; font-weight:400; font-style:normal;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p></body></html> + Database licence - + Licença do banco de dados + Public - + Público + Database will be public. Everyone has read access to it. - + Banco de dados será público. Todos poderão lê-lo. + Database will be private. Only you have access to it. - + Banco de dados será privado. Somente você terá acesso a ele. + Unspecified - + Não especificado + + + + Branch + Ramo + + + + Force push + Forçar envio + + + + Use with care. This can cause remote commits to be deleted. + Use com cuidado. Isso pode causar a perda de commits remotos. + + + + RunSql + + + Execution aborted by user + Execução abortada pelo usuário + + + + , %1 rows affected + , %1 linhas afetadas + + + + query executed successfully. Took %1ms%2 + consulta executada com sucesso. Levou %1 ms%2 + + + + executing query + executando consulta SqlExecutionArea + Form Formulário + + Results of the last executed statements Resultados dos últimos comandos executados + This field shows the results and status codes of the last executed statements. Esse campo mostra os resultados e códigos de status dos últimos comandos executados. Export to &CSV - Exportar para &CSV + Exportar para &CSV Save as &view - Salvar como &vista + Salvar como &vista Save as view - Salvar como vista + Salvar como vista Please specify the view name - Por favor, especifique o nome da vista + Por favor, especifique o nome da vista There is already an object with that name. Please choose a different name. - Já existe um objeto com esse nome. Por favor, escolha um nome diferente. + Já existe um objeto com esse nome. Por favor, escolha um nome diferente. View successfully created. - Vista criada com sucesso. + Vista criada com sucesso. Error creating view: %1 - Erro criando vista: %1 + Erro criando vista: %1 + + + + Find previous match [Shift+F3] + Encontrar resultado anterior [Shift+F3] + + + + Find previous match with mapping + Encontrar resultado anterior com mapeamento + + + + Shift+F3 + Shift+F3 + + + + The found pattern must be a whole word + O padrão encontrado precisa ser uma palavra inteira + + + + Whole Words + Palavras inteiras + + + + Text pattern to find considering the checks in this frame + Padrão de texto para encontrar considerando os testes nesse frame + + + + Find in editor + Encontrar no editor + + + + The found pattern must match in letter case + O padrão encontrado precisa casar em capitalização + + + + Case Sensitive + Sensível à capitalização + + + + Find next match [Enter, F3] + Encontrar próxima correspondência [Enter, F3] + + + + Find next match with wrapping + Encontrar próxima correspondência no arquivo inteiro + + + + F3 + F3 + + + + Interpret search pattern as a regular expression + Interpretar padrão de busca como expressão regular + + + + <html><head/><body><p>When checked, the pattern to find is interpreted as a UNIX regular expression. See <a href="https://en.wikibooks.org/wiki/Regular_Expressions">Regular Expression in Wikibooks</a>.</p></body></html> + <html><head/><body><p>Quando assinalado, o padrão a ser buscado é interpretado como uma expressão regular UNIX. Veja <a href="https://en.wikibooks.org/wiki/Regular_Expressions">Regular Expression nos Wikibooks</a>.</p></body></html> + + + + Regular Expression + Expressão Regular + + + + + Close Find Bar + Fechar barra de busca + + + + SqlTextEdit + + + Ctrl+/ + SqlUiLexer + (X) The abs(X) function returns the absolute value of the numeric argument X. + () The changes() function returns the number of database rows that were changed or inserted or deleted by the most recently completed INSERT, DELETE, or UPDATE statement. + (X1,X2,...) The char(X1,X2,...,XN) function returns a string composed of characters having the unicode code point values of integers X1 through XN, respectively. (X1,X2,...) The char(X1,X2,...,XN) function returns a string composed of characters having the unicode code point values of integers X1 through XN, respectively. + (X,Y,...) The coalesce() function returns a copy of its first non-NULL argument, or NULL if all arguments are NULL (X,Y,...) The coalesce() function returns a copy of its first non-NULL argument, or NULL if all arguments are NULL + (X,Y) The glob(X,Y) function is equivalent to the expression "Y GLOB X". (X,Y) The glob(X,Y) function is equivalent to the expression "Y GLOB X". + (X,Y) The ifnull() function returns a copy of its first non-NULL argument, or NULL if both arguments are NULL. (X,Y) The ifnull() function returns a copy of its first non-NULL argument, or NULL if both arguments are NULL. + (X,Y) The instr(X,Y) function finds the first occurrence of string Y within string X and returns the number of prior characters plus 1, or 0 if Y is nowhere found within X. (X,Y) The instr(X,Y) function finds the first occurrence of string Y within string X and returns the number of prior characters plus 1, or 0 if Y is nowhere found within X. + (X) The hex() function interprets its argument as a BLOB and returns a string which is the upper-case hexadecimal rendering of the content of that blob. (X) The hex() function interprets its argument as a BLOB and returns a string which is the upper-case hexadecimal rendering of the content of that blob. + () The last_insert_rowid() function returns the ROWID of the last row insert from the database connection which invoked the function. () The last_insert_rowid() function returns the ROWID of the last row insert from the database connection which invoked the function. + (X) For a string value X, the length(X) function returns the number of characters (not bytes) in X prior to the first NUL character. + (X,Y) The like() function is used to implement the "Y LIKE X" expression. + (X,Y,Z) The like() function is used to implement the "Y LIKE X ESCAPE Z" expression. - (X) The load_extension(X) function loads SQLite extensions out of the shared library file named X. - - - - (X,Y) The load_extension(X) function loads SQLite extensions out of the shared library file named X using the entry point Y. - - - + (X) The lower(X) function returns a copy of string X with all ASCII characters converted to lower case. + (X) ltrim(X) removes spaces from the left side of X. + (X,Y) The ltrim(X,Y) function returns a string formed by removing any and all characters that appear in Y from the left side of X. + (X,Y,...) The multi-argument max() function returns the argument with the maximum value, or return NULL if any argument is NULL. + (X,Y,...) The multi-argument min() function returns the argument with the minimum value. + (X,Y) The nullif(X,Y) function returns its first argument if the arguments are different and NULL if the arguments are the same. + (FORMAT,...) The printf(FORMAT,...) SQL function works like the sqlite3_mprintf() C-language function and the printf() function from the standard C library. + (X) The quote(X) function returns the text of an SQL literal which is the value of its argument suitable for inclusion into an SQL statement. + () The random() function returns a pseudo-random integer between -9223372036854775808 and +9223372036854775807. + (N) The randomblob(N) function return an N-byte blob containing pseudo-random bytes. + (X,Y,Z) The replace(X,Y,Z) function returns a string formed by substituting string Z for every occurrence of string Y in string X. + (X) The round(X) function returns a floating-point value X rounded to zero digits to the right of the decimal point. + (X,Y) The round(X,Y) function returns a floating-point value X rounded to Y digits to the right of the decimal point. + (X) rtrim(X) removes spaces from the right side of X. + (X,Y) The rtrim(X,Y) function returns a string formed by removing any and all characters that appear in Y from the right side of X. + (X) The soundex(X) function returns a string that is the soundex encoding of the string X. + (X,Y) substr(X,Y) returns all characters through the end of the string X beginning with the Y-th. + (X,Y,Z) The substr(X,Y,Z) function returns a substring of input string X that begins with the Y-th character and which is Z characters long. + () The total_changes() function returns the number of row changes caused by INSERT, UPDATE or DELETE statements since the current database connection was opened. + (X) trim(X) removes spaces from both ends of X. + (X,Y) The trim(X,Y) function returns a string formed by removing any and all characters that appear in Y from both ends of X. + (X) The typeof(X) function returns a string that indicates the datatype of the expression X. + (X) The unicode(X) function returns the numeric unicode code point corresponding to the first character of the string X. + (X) The upper(X) function returns a copy of input string X in which all lower-case ASCII characters are converted to their upper-case equivalent. + (N) The zeroblob(N) function returns a BLOB consisting of N bytes of 0x00. + + + + (timestring,modifier,modifier,...) + (format,timestring,modifier,modifier,...) + (X) The avg() function returns the average value of all non-NULL X within a group. + (X) The count(X) function returns a count of the number of times that X is not NULL in a group. + (X) The group_concat() function returns a string which is the concatenation of all non-NULL values of X. + (X,Y) The group_concat() function returns a string which is the concatenation of all non-NULL values of X. If parameter Y is present then it is used as the separator between instances of X. + (X) The max() aggregate function returns the maximum value of all values in the group. + (X) The min() aggregate function returns the minimum non-NULL value of all values in the group. + + (X) The sum() and total() aggregate functions return sum of all non-NULL values in the group. + + + () The number of the row within the current partition. Rows are numbered starting from 1 in the order defined by the ORDER BY clause in the window definition, or in arbitrary order otherwise. + () O número de linhas dentro da partição atual. Linhas são numeradas de 1 na ordem definida pela cláusula ORDER BY na definição da janela, ou de forma arbitrária. + + + + () The row_number() of the first peer in each group - the rank of the current row with gaps. If there is no ORDER BY clause, then all rows are considered peers and this function always returns 1. + () O row_number() do primeiro elemento de cada grupo - o rank da linha atual com gaps. Se não há uma cláusula ORDER BY, então todas as linhas são consideradas elementos e essa função sempre retorna 1. + + + + () The number of the current row's peer group within its partition - the rank of the current row without gaps. Partitions are numbered starting from 1 in the order defined by the ORDER BY clause in the window definition. If there is no ORDER BY clause, then all rows are considered peers and this function always returns 1. + () O número do grupo de colegas da linha atual dentro da sua partição - o rank da linha atual sem intervalos. Partições são numeradas a partir de 1 na ordem definida pela cláusula ORDER BY na definição. Se não há ORDER BY, então todas as linhas são consideradas colegas e essa função sempre retorna 1. + + + + () Despite the name, this function always returns a value between 0.0 and 1.0 equal to (rank - 1)/(partition-rows - 1), where rank is the value returned by built-in window function rank() and partition-rows is the total number of rows in the partition. If the partition contains only one row, this function returns 0.0. + () Apesar do nome, essa função sempre retorna um valor entre 0.0 e 1.0 igual a (rank - 1)/(linhas-na-partição - 1), onde rank é o valor retornado pela built-in rank() e linhas-na-partição é o número total de linhas na partição. Se a partição contém somente uma linha, essa função retorna 0. + + + + () The cumulative distribution. Calculated as row-number/partition-rows, where row-number is the value returned by row_number() for the last peer in the group and partition-rows the number of rows in the partition. + () A distribuição cumulativa. Calculada como número-da-linha/linhas-na-partição em que número-da-linha é o valor retornado por row_number() para o último elemento do grupo e linhas-na-partição é o número de linhas na partição. + + + + (N) Argument N is handled as an integer. This function divides the partition into N groups as evenly as possible and assigns an integer between 1 and N to each group, in the order defined by the ORDER BY clause, or in arbitrary order otherwise. If necessary, larger groups occur first. This function returns the integer value assigned to the group that the current row is a part of. + (N) Argumento N é interpretado como um inteiro. Essa função divide a partição em N grupos tão igualmente como possível e atribui um inteiro entre 1 e N para cada grupo, na ordem definida pela cláusula ORDER BY, ou em ordem arbitrária. Se necessário, grupos maiores ocorrem primeiro. Essa função retorna o valor inteiro atribuido ao grupo que a linha atual é parte de. + + + + (expr) Returns the result of evaluating expression expr against the previous row in the partition. Or, if there is no previous row (because the current row is the first), NULL. + (expr) Retorna o resultado de avaliar expressão expr contra a linha anterior na partição. Ou, se não há linha anterior, NULL. + + + + (expr,offset) If the offset argument is provided, then it must be a non-negative integer. In this case the value returned is the result of evaluating expr against the row offset rows before the current row within the partition. If offset is 0, then expr is evaluated against the current row. If there is no row offset rows before the current row, NULL is returned. + (expr,offset) Se o offset é fornecido, então ele precisa ser um inteiro não-negativo. Nesse caso, o valor retornado é o resultado de avaliar expr contra a linha offset linhas antes da linha atual dentro da partição. Se offset é 0, então expr é avaliada contra a linha atual. Se não há linha offset linhas antes da linha atual, NULL é retornado. + + + + + (expr,offset,default) If default is also provided, then it is returned instead of NULL if the row identified by offset does not exist. + (expr,offset,default) Se default também é fornecido, ele é retornado em vez de NULL se a linha identificada por offset não existe. + + + + (expr) Returns the result of evaluating expression expr against the next row in the partition. Or, if there is no next row (because the current row is the last), NULL. + (expr) Retorna o resultado de avaliar a expressão expr contra a próxima linha na partição. Ou, se não há próxima linha, NULL. + + + + (expr,offset) If the offset argument is provided, then it must be a non-negative integer. In this case the value returned is the result of evaluating expr against the row offset rows after the current row within the partition. If offset is 0, then expr is evaluated against the current row. If there is no row offset rows after the current row, NULL is returned. + (expr,offset) Se o offset é fornecido, então ele precisa ser um inteiro não-negativo. Nesse caso, o valor retornado é o resultado de avaliar expr contra a linha offset linhas após a linha atual dentro da partição. Se offset é 0, então expr é avaliada contra a linha atual. Se não há linha offset linhas após a linha atual, NULL é retornado. + + + + (expr) This built-in window function calculates the window frame for each row in the same way as an aggregate window function. It returns the value of expr evaluated against the first row in the window frame for each row. + (expr) Essa função de janela built-in calcula o frame da janela para cada linha na mesma forma que uma função de janela agregada. Ela retorna o valor de expr avaliada contra a primeira linha do frame da janela para cada linha. + + + + (expr) This built-in window function calculates the window frame for each row in the same way as an aggregate window function. It returns the value of expr evaluated against the last row in the window frame for each row. + (expr) Essa função de janela built-in calcula o frame da janela para cada linha na mesma forma que uma função de janela agregada. Ela retorna o valor de expr avaliada contra a última linha do frame da janela para cada linha. + + + + (expr,N) This built-in window function calculates the window frame for each row in the same way as an aggregate window function. It returns the value of expr evaluated against the row N of the window frame. Rows are numbered within the window frame starting from 1 in the order defined by the ORDER BY clause if one is present, or in arbitrary order otherwise. If there is no Nth row in the partition, then NULL is returned. + (expr) Essa função de janela built-in calcula o frame da janela para cada linha na mesma forma que uma função de janela agregada. Ela retorna o valor de expr avaliada contra a linha N do frame da janela para cada linha.Linhas são numeradas dentro do frame da janela começando em 1 na ordem definida pela cláusula ORDER BY se uma está presente, ou em ordem arbitrária, caso contrário. Se não há uma N-ésima linha na partição, NULL é retornado. + + + + (X) The load_extension(X) function loads SQLite extensions out of the shared library file named X. +Use of this function must be authorized from Preferences. + + + + + (X,Y) The load_extension(X) function loads SQLite extensions out of the shared library file named X using the entry point Y. +Use of this function must be authorized from Preferences. + + SqliteTableModel + Error changing data: %1 Erro modificando dados: @@ -3466,23 +6526,66 @@ References %1(%2) Hold Ctrl+Shift and click to jump there - Referencia %1(%2) + Referencia %1(%2) Pressione Ctrl+Shift e clique para ir até lá + + + reading rows + lendo linhas + + + + loading... + carregando... + + + + References %1(%2) +Hold %3Shift and click to jump there + Referencia %1(%2) +Segure %3Shift e clique para ir para lá + + + + retrieving list of columns + obtendo lista de colunas + + + + Fetching data... + Obtendo dados... + + + + Cancel + Cancelar + VacuumDialog + Compact Database Compactar banco de dados Warning: Compacting the database will commit all changes you made. - Alerta: compactar o banco de dados confirmará todas as alterações feitas. + Alerta: compactar o banco de dados confirmará todas as alterações feitas. Please select the objects to compact: - Por favor, selecione os objetos que deseja compactar: + Por favor, selecione os objetos que deseja compactar: + + + + Warning: Compacting the database will commit all of your changes. + Alerta: compactando o banco de dados irá confirmar todas as suas modificações. + + + + Please select the databases to co&mpact: + Por favor selecione o banco de dados para co&mpactar: diff -Nru sqlitebrowser-3.10.100ubuntu1/src/translations/sqlb_ru.ts sqlitebrowser-3.11.1/src/translations/sqlb_ru.ts --- sqlitebrowser-3.10.100ubuntu1/src/translations/sqlb_ru.ts 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/src/translations/sqlb_ru.ts 2019-02-19 23:51:34.000000000 +0000 @@ -15,95 +15,216 @@ - <html><head/><body><p>DB Browser for SQLite is an open source, freeware visual tool used to create, design and edit SQLite database files.</p><p>It is bi-licensed under the Mozilla Public License Version 2, as well as the GNU General Public License Version 3 or later. You can modify or redistribute it under the conditions of these licenses.</p><p>See <a href="http://www.gnu.org/licenses/gpl.html"><span style=" text-decoration: underline; color:#0000ff;">http://www.gnu.org/licenses/gpl.html</span></a> and <a href="https://www.mozilla.org/MPL/2.0/index.txt"><span style=" text-decoration: underline; color:#0000ff;">https://www.mozilla.org/MPL/2.0/index.txt</span></a> for details.</p><p>For more information on this program please visit our website at: <a href="http://sqlitebrowser.org"><span style=" text-decoration: underline; color:#0000ff;">http://sqlitebrowser.org</span></a></p><p><span style=" font-size:small;">This software uses the GPL/LGPL Qt Toolkit from </span><a href="http://qt-project.org/"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://qt-project.org/</span></a><span style=" font-size:small;"><br/>See </span><a href="http://qt-project.org/doc/qt-5/licensing.html"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://qt-project.org/doc/qt-5/licensing.html</span></a><span style=" font-size:small;"> for licensing terms and information.</span></p><p><span style=" font-size:small;">It also uses the Silk icon set by Mark James licensed under a Creative Commons Attribution 2.5 and 3.0 license.<br/>See </span><a href="http://www.famfamfam.com/lab/icons/silk/"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://www.famfamfam.com/lab/icons/silk/</span></a><span style=" font-size:small;"> for details.</span></p></body></html> - <html><head/><body><p>Обозреватель для SQLite - это бесплатная программа, с открытым исходным кодом, предназначенная для создания и редактирования баз данных SQLite.</p><p>Программа лицензирована по двум лицензиям: Mozilla Public License Version 2 и GNU General Public License Version 3 or later. Можно изменять или распространять её на условиях этих лицензий.</p><p>Лицензии можно просмотреть по ссылкам <a href="http://www.gnu.org/licenses/gpl.html"><span style=" text-decoration: underline; color:#0000ff;">http://www.gnu.org/licenses/gpl.html</span></a> и <a href="https://www.mozilla.org/MPL/2.0/index.txt"><span style=" text-decoration: underline; color:#0000ff;">https://www.mozilla.org/MPL/2.0/index.txt</span></a>.</p><p>Дополнительную информацию о программе можно узнать на веб-сайте:<br/><a href="http://sqlitebrowser.org"><span style=" text-decoration: underline; color:#0000ff;">http://sqlitebrowser.org</span></a></p><p><span style=" font-size:small;">Это программное обеспечение использует GPL/LGPL Qt Toolkit </span><a href="http://qt-project.org/"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://qt-project.org/</span></a><span style=" font-size:small;"><br/>Условия лицензии на Qt Toolkit </span><a href="http://qt-project.org/doc/qt-5/licensing.html"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://qt-project.org/doc/qt-5/licensing.html</span></a><span style=" font-size:small;">.</span></p><p><span style=" font-size:small;">Эта программа также использует набор иконок Silk от Марка Джеймса (Mark James), лицензированный под лицензией Creative Commons Attribution 2.5 and 3.0.<br/>Подробная информация по адресу </span><a href="http://www.famfamfam.com/lab/icons/silk/"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://www.famfamfam.com/lab/icons/silk/</span></a><span style=" font-size:small;">.</span></p></body></html> + <html><head/><body><p>DB Browser for SQLite is an open source, freeware visual tool used to create, design and edit SQLite database files.</p><p>It is bi-licensed under the Mozilla Public License Version 2, as well as the GNU General Public License Version 3 or later. You can modify or redistribute it under the conditions of these licenses.</p><p>See <a href="http://www.gnu.org/licenses/gpl.html">http://www.gnu.org/licenses/gpl.html</a> and <a href="https://www.mozilla.org/MPL/2.0/index.txt">https://www.mozilla.org/MPL/2.0/index.txt</a> for details.</p><p>For more information on this program please visit our website at: <a href="http://sqlitebrowser.org">http://sqlitebrowser.org</a></p><p><span style=" font-size:small;">This software uses the GPL/LGPL Qt Toolkit from </span><a href="http://qt-project.org/"><span style=" font-size:small;">http://qt-project.org/</span></a><span style=" font-size:small;"><br/>See </span><a href="http://qt-project.org/doc/qt-5/licensing.html"><span style=" font-size:small;">http://qt-project.org/doc/qt-5/licensing.html</span></a><span style=" font-size:small;"> for licensing terms and information.</span></p><p><span style=" font-size:small;">It also uses the Silk icon set by Mark James licensed under a Creative Commons Attribution 2.5 and 3.0 license.<br/>See </span><a href="http://www.famfamfam.com/lab/icons/silk/"><span style=" font-size:small;">http://www.famfamfam.com/lab/icons/silk/</span></a><span style=" font-size:small;"> for details.</span></p></body></html> + <html><head/><body><p>Обозреватель для SQLite - это бесплатная программа, с открытым исходным кодом, предназначенная для создания и редактирования баз данных SQLite.</p><p>Программа лицензирована по двум лицензиям: Mozilla Public License Version 2 и GNU General Public License Version 3 or later. Можно изменять или распространять её на условиях этих лицензий.</p><p>Лицензии можно просмотреть по ссылкам <a href="http://www.gnu.org/licenses/gpl.html"><span style=" text-decoration: underline; color:#0000ff;">http://www.gnu.org/licenses/gpl.html</span></a> и <a href="https://www.mozilla.org/MPL/2.0/index.txt"><span style=" text-decoration: underline; color:#0000ff;">https://www.mozilla.org/MPL/2.0/index.txt</span></a>.</p><p>Дополнительную информацию о программе можно узнать на веб-сайте:<br/><a href="https://sqlitebrowser.org"><span style=" text-decoration: underline; color:#0000ff;">https://sqlitebrowser.org</span></a></p><p><span style=" font-size:small;">Это программное обеспечение использует GPL/LGPL Qt Toolkit </span><a href="http://qt-project.org/"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://qt-project.org/</span></a><span style=" font-size:small;"><br/>Условия лицензии на Qt Toolkit </span><a href="http://qt-project.org/doc/qt-5/licensing.html"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://qt-project.org/doc/qt-5/licensing.html</span></a><span style=" font-size:small;">.</span></p><p><span style=" font-size:small;">Эта программа также использует набор иконок Silk от Марка Джеймса (Mark James), лицензированный под лицензией Creative Commons Attribution 2.5 and 3.0.<br/>Подробная информация по адресу </span><a href="http://www.famfamfam.com/lab/icons/silk/"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://www.famfamfam.com/lab/icons/silk/</span></a><span style=" font-size:small;">.</span></p></body></html> - + <html><head/><body><p>DB Browser for SQLite is an open source, freeware visual tool used to create, design and edit SQLite database files.</p><p>It is bi-licensed under the Mozilla Public License Version 2, as well as the GNU General Public License Version 3 or later. You can modify or redistribute it under the conditions of these licenses.</p><p>See <a href="http://www.gnu.org/licenses/gpl.html"><span style=" text-decoration: underline; color:#0000ff;">http://www.gnu.org/licenses/gpl.html</span></a> and <a href="https://www.mozilla.org/MPL/2.0/index.txt"><span style=" text-decoration: underline; color:#0000ff;">https://www.mozilla.org/MPL/2.0/index.txt</span></a> for details.</p><p>For more information on this program please visit our website at: <a href="https://sqlitebrowser.org"><span style=" text-decoration: underline; color:#0000ff;">https://sqlitebrowser.org</span></a></p><p><span style=" font-size:small;">This software uses the GPL/LGPL Qt Toolkit from </span><a href="http://qt-project.org/"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://qt-project.org/</span></a><span style=" font-size:small;"><br/>See </span><a href="http://qt-project.org/doc/qt-5/licensing.html"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://qt-project.org/doc/qt-5/licensing.html</span></a><span style=" font-size:small;"> for licensing terms and information.</span></p><p><span style=" font-size:small;">It also uses the Silk icon set by Mark James licensed under a Creative Commons Attribution 2.5 and 3.0 license.<br/>See </span><a href="http://www.famfamfam.com/lab/icons/silk/"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://www.famfamfam.com/lab/icons/silk/</span></a><span style=" font-size:small;"> for details.</span></p></body></html> + <html><head/><body><p>Обозреватель для SQLite - это бесплатная программа, с открытым исходным кодом, предназначенная для создания и редактирования баз данных SQLite.</p><p>Программа лицензирована по двум лицензиям: Mozilla Public License Version 2 и GNU General Public License Version 3 or later. Можно изменять или распространять её на условиях этих лицензий.</p><p>Лицензии можно просмотреть по ссылкам <a href="http://www.gnu.org/licenses/gpl.html"><span style=" text-decoration: underline; color:#0000ff;">http://www.gnu.org/licenses/gpl.html</span></a> и <a href="https://www.mozilla.org/MPL/2.0/index.txt"><span style=" text-decoration: underline; color:#0000ff;">https://www.mozilla.org/MPL/2.0/index.txt</span></a>.</p><p>Дополнительную информацию о программе можно узнать на веб-сайте:<br/><a href="https://sqlitebrowser.org"><span style=" text-decoration: underline; color:#0000ff;">https://sqlitebrowser.org</span></a></p><p><span style=" font-size:small;">Это программное обеспечение использует GPL/LGPL Qt Toolkit </span><a href="http://qt-project.org/"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://qt-project.org/</span></a><span style=" font-size:small;"><br/>Условия лицензии на Qt Toolkit </span><a href="http://qt-project.org/doc/qt-5/licensing.html"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://qt-project.org/doc/qt-5/licensing.html</span></a><span style=" font-size:small;">.</span></p><p><span style=" font-size:small;">Эта программа также использует набор иконок Silk от Марка Джеймса (Mark James), лицензированный под лицензией Creative Commons Attribution 2.5 and 3.0.<br/>Подробная информация по адресу </span><a href="http://www.famfamfam.com/lab/icons/silk/"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://www.famfamfam.com/lab/icons/silk/</span></a><span style=" font-size:small;">.</span></p></body></html> + + + + (based on SQLite %1) + (базируется на SQLite %1) + + + Version Версия - + Qt Version Версия Qt - + SQLCipher Version Версия SQLCipher - + SQLite Version Версия SQLite + AddRecordDialog + + + Add New Record + Добавить Новую Запись + + + + Enter values for the new record considering constraints. Fields in bold are mandatory. + Введите значения для новой записи с учетом ограничений. Поля, выделенные жирным шрифтом, являются обязательными. + + + + In the Value column you can specify the value for the field identified in the Name column. The Type column indicates the type of the field. Default values are displayed in the same style as NULL values. + В столбце "Значение" вы можете указать значение для поля, указанного в столбце "Имя". В столбце "Тип" указывается тип поля. Значения по умолчанию отображаются в том же стиле, что и значения NULL. + + + + Name + Имя + + + + Type + Тип + + + + Value + Значение + + + + Values to insert. Pre-filled default values are inserted automatically unless they are changed. + Значения для вставки. Предварительно заполненные значения по умолчанию вставляются автоматически, если они не изменены. + + + + When you edit the values in the upper frame, the SQL query for inserting this new record is shown here. You can edit manually the query before saving. + Когда вы редактируете значения в верхнем фрейме, здесь отображается запрос SQL для вставки этой новой записи. Вы можете вручную отредактировать запрос перед сохранением. + + + + <html><head/><body><p><span style=" font-weight:600;">Save</span> will submit the shown SQL statement to the database for inserting the new record.</p><p><span style=" font-weight:600;">Restore Defaults</span> will restore the initial values in the <span style=" font-weight:600;">Value</span> column.</p><p><span style=" font-weight:600;">Cancel</span> will close this dialog without executing the query.</p></body></html> + <html><head/><body><p><span style=" font-weight:600;">Сохранение</span> отправит показанный оператор SQL в БД для вставки новой записи.</p><p><span style=" font-weight:600;">Восстановить значения по умолчанию</span> восстановит исходные значения в колонке <span style=" font-weight:600;">Значение</span>.</p><p><span style=" font-weight:600;">Отмена</span> закрывает этот диалог без выполнения запросов.</p></body></html> + + + + Auto-increment + + Авто-увеличение + + + + + Unique constraint + + Уникальнось + + + + + Check constraint: %1 + + Проверка: %1 + + + + + Foreign key: %1 + + Внешний ключ: %1 + + + + + Default value: %1 + + Значение по умолчанию: %1 + + + + + Error adding record. Message from database engine: + +%1 + Ошибка добавления записи. Сообщение из базы данных: + +%1 + + + + Are you sure you want to restore all the entered values to their defaults? + Вы действительно хотите восстановить все введенные значения по умолчанию? + + + Application - + Usage: %1 [options] [db] - + Possible command line arguments: - + -h, --help Show command line options - + -s, --sql [file] Execute this SQL file after opening the DB - + -t, --table [table] Browse this table after opening the DB - + + This is DB Browser for SQLite version %1. + + + + -q, --quit Exit application after running scripts - - -v, --version Display the current version + + -R, --read-only Open database in read-only mode + + + + + -o, --option [group/setting=value] Run application with this setting temporarily set to value - - [file] Open this SQLite database + + -v, --version Display the current version - - This is DB Browser for SQLite version %1%2. - + + [file] Open this SQLite database + - + The -s/--sql option requires an argument - + The file %1 does not exist - + The -t/--table option requires an argument - + + The -o/--option option requires an argument in the form group/setting=value + + + + Invalid option/non-existant file: %1 @@ -128,24 +249,24 @@ Page si&ze - + Размер &страницы - + Passphrase - + Фраза - + Raw key - + Ключ Page &size Размер &страницы - + Please set a key to encrypt the database. Note that if you change any of the other, optional, settings you'll need to re-enter them as well every time you open the database file. Leave the password fields empty to disable the encryption. @@ -156,7 +277,7 @@ Процесс может занять некоторое время и настоятельно рекомендуем создать резервную копию перед продолжением! Не сохраненные изменения автоматически будут сохранены. - + Please enter the key used to encrypt the database. If any of the other settings were altered for this database file you need to provide this information as well. Пожалуйста введите ключ для шифрования базы данных. @@ -186,67 +307,82 @@ По умолчанию - + Decimal number Десятичное число - + Exponent notation Экспоненциальная запись - + Hex blob Бинарные данные - + Hex number Шестнадцатеричное число - + Apple NSDate to date - + Apple NSDate дата - + + Java epoch (milliseconds) to date + Java epoch дата + + + Julian day to date Юлианская дата - + + Unix epoch to local time + Unix-время + + + + Date as dd/mm/yyyy + Дата в формате дд/мм/гггг + + + Lower case Нижний регистр - + Octal number Восьмеричное число - + Round number Округленное число - + Unix epoch to date - Unix-время + Unix-дата - + Upper case Верхний регистр - + Windows DATE to date Windows дата - + Custom Мой формат @@ -254,38 +390,38 @@ DBBrowserDB - + Please specify the database name under which you want to access the attached database - + Invalid file format - + Ошибочный формат файла - + Do you want to save the changes made to the database file %1? Сохранить сделанные изменения в файле базы данных %1? - + Exporting database to SQL file... Экспорт базы данных в файл SQL... - - + + Cancel Отменить - + Executing SQL... Выполнить код SQL... - + Action cancelled. Действие отменено. @@ -299,85 +435,134 @@ переименованиеСтолбца: невозможно найти таблицу %1. - - + + This database has already been attached. Its schema name is '%1'. + Эта БД уже присоединена. Имя ее схемы - '%1'. + + + + Do you really want to close this temporary database? All data will be lost. + Вы действительно хотите закрыть эту временную БД? Все данные будут потеряны. + + + + The database is currently busy: + БД занята: + + + + Do you want to abort that other operation? + Вы хотите отменить эту операцию? + + + + + No database file opened + Файл БД не открыт + + + + Error in statement #%1: %2. Aborting execution%3. - + Ошибка в выражении #%1: %2. +Прерываем выполнение%3. - - + + and rolling back - + и отменяем + + + + Cannot delete this object + Не удается удалить этот объект - + Cannot set data on this object - + Невозможно назначить данные для этого объекта + + + + A table with the name '%1' already exists in schema '%2'. + Таблица с именем '%1' уже существует в схеме '%2'. - + renameColumn: cannot find column %1. переименованиеСтолбца: невозможно найти столбец %1. - + renameColumn: creating savepoint failed. DB says: %1 переименованиеСтолбца: ошибка создания точки сохранения. БД говорит: %1 - + renameColumn: creating new table failed. DB says: %1 переименованиеСтолбца: ошибка создания новой таблицы. БД говорит: %1 - + renameColumn: copying data to new table failed. DB says: %1 переименованиеСтолбца: ошибка копирования данных в новую таблицу. БД говорит: %1 - + renameColumn: deleting old table failed. DB says: %1 переименованиеСтолбца: ошибка удаления старой таблицы. БД говорит: %1 - + Restoring some of the objects associated with this table failed. This is most likely because some column names changed. Here's the SQL statement which you might want to fix and execute manually: - Ошибка восстановления некоторых объектов, ассоциированных с этой таблицей. Наиболее вероятная причина этого - изменение имён некоторых столбцов таблицы. Вот SQL оператор, который нужно исправить и выполнить вручную: + Ошибка восстановления некоторых объектов, ассоциированных с этой таблицей. Наиболее вероятная причина этого - изменение имён некоторых столбцов таблицы. Вот SQL оператор, который нужно исправить и выполнить вручную: + + - + renameColumn: releasing savepoint failed. DB says: %1 переименованиеСтолбца: ошибока освобождения точки сохранения. БД говорит: %1 - + Error renaming table '%1' to '%2'.Message from database engine: %3 Ошибка переименования программы '%1' в '%2'.Сообщение от движка БД: %3 - + ... <string can not be logged, contains binary data> ... ... <строка не может быть залогирована, содержит двоичные данные> ... - + + could not get list of databases: %1 + не могу получить список БД: %1 + + + + Error loading extension: %1 + Ошибка загрузки расширения: %1 + + + could not get column information - + не могу полчить информацию о колонке unknown object type %1 неизвестный тип объекта %1 - + could not get list of db objects: %1, %2 невозможно получить список объекто БД: %1, %2 @@ -386,22 +571,22 @@ невозможно получить типы - + didn't receive any output from pragma %1 не принято ни одного выхода из прагмы %1 - + could not execute pragma command: %1, %2 невозможно выполнить комманду-прагму: %1, %2 - + Error setting pragma %1 to %2: %3 Ошибка установки прагмы %1 в %2: %3 - + File not found. Файл не найден. @@ -409,52 +594,66 @@ DbStructureModel - + Name Имя - + Object Объект - + Type Тип - + Schema Схема - Browsables (%1) - Просматриваемые (%1) + Просматриваемые (%1) + + + + Database + База данных + + + + Browsables + Просматриваемые - + All Все - + + Temporary + Временный + + + Tables (%1) Таблицы (%1) - + Indices (%1) Индексы (%1) - + Views (%1) Представления (%1) - + Triggers (%1) Триггеры (%1) @@ -472,140 +671,351 @@ Режим: - - + Image Изображение - Import text - Импортировать текст + Импортировать текст - Opens a file dialog used to import text to this database cell. - Открывается файловый диалог, чтобы импортировать текств эту ячейку базы данных. + Открывается файловый диалог, чтобы импортировать текств эту ячейку базы данных. - + &Import - &Импортировать + &Импорт - Export text - Экспортировать текст + Экспортировать текст - Opens a file dialog used to export the contents of this database cell to a text file. - Открывается файловый диалог, чтобы экспоритровать содержимое этой ячейки базы данных в текстовый файл. + Открывается файловый диалог, чтобы экспоритровать содержимое этой ячейки базы данных в текстовый файл. - + &Export - &Экспортировать + &Экспорт - + Set this cell to NULL Присвоить данной ячейке NULL значение - + Set as &NULL Присвоить &NULL - + + Apply data to cell + Применить данные к ячейке + + + + This button saves the changes performed in the cell editor to the database cell. + Нажав эту кнопку, вы сохраните изменения произведенные в этом редакторе, в соответствующую ячейку БД. + + + Apply Применить - + Text Текст - + + This is the list of supported modes for the cell editor. Choose a mode for viewing or editing the data of the current cell. + Это список поддерживаемых режимов. Выбирете режим для просмотра или редактирования данных текущей ячейки. + + + Binary Двоичные данные - + + JSON + + + + + XML + + + + + + Automatically adjust the editor mode to the loaded data type + Автоматически подбор режима редактора на основе данных + + + + This checkable button enables or disables the automatic switching of the editor mode. When a new cell is selected or new data is imported and the automatic switching is enabled, the mode adjusts to the detected data type. You can then change the editor mode manually. If you want to keep this manually switched mode while moving through the cells, switch the button off. + Эта кнопка позволяет включать или отключать автоматическое переключение режима редактора. Когда выбрана новая ячейка или импортированы новые данные, а автоматическое переключение включено, режим настраивается на обнаруженный тип данных. Вы можете вручную изменить режим редактора. Если вы хотите сохранить этот режим ручного переключения при перемещении по ячейкам, выключите кнопку. + + + + Auto-switch + Автопереключение + + + + + Auto-format: pretty print on loading, compact on saving. + Автоматическое форматирование: стилистическое форматирование при загрузке, компактность - при сохранении. + + + + When enabled, the auto-format feature formats the data on loading, breaking the text in lines and indenting it for maximum readability. On data saving, the auto-format feature compacts the data removing end of lines, and unnecessary whitespace. + Когда включено, функция автоматического форматирования форматирует данные по загрузке, разбивая текст в строках и отступы для максимальной читаемости. При сохранении данных функция автоматического форматирования объединяет данные, удаляющие конец строк, и ненужные пробелы. + + + + Autoformat + Автоформатирование + + + + Import from file + Импортировать из файла + + + + Opens a file dialog used to import any kind of data to this database cell. + Открывает диалоговое окно файла, используемое для импорта любых данных в эту ячейку базы данных. + + + + Export to file + Экспортировать в файл + + + + Opens a file dialog used to export the contents of this database cell to a file. + Открывает диалоговое окно файла, используемое для экспорта содержимого этой ячейки базы данных в файл. + + + Erases the contents of the cell Очищается содержимое ячейки - + This area displays information about the data present in this database cell Эта область отображает информацию о данных, находящихся в этой ячейке базы данных - + + This editor mode lets you edit JSON or XML data with syntax highlighting, automatic formatting and validation before saving. + +Errors are indicated with a red squiggle underline. + Этот режим редактора позволяет редактировать данные JSON или XML с подсветкой синтаксиса, автоматическим форматированием и проверкой перед сохранением. + +Ошибки обозначаются красным подчеркиванием. + + + Type of data currently in cell Тип данных в ячейке - + Size of data currently in table Размер данных в таблице - + + + Print... + Печать... + + + + Open preview dialog for printing displayed image + Открыть диалоговое окно предварительного просмотра для печати отображаемого изображения + + + + + Ctrl+P + Ctrl+P + + + + Open preview dialog for printing displayed text + Открыть диалоговое окно предварительного просмотра для печати отображаемого текста + + + + Copy Hex and ASCII + Копировать HEX и ASCII + + + + Copy selected hexadecimal and ASCII columns to the clipboard + Копировать выбранные HEX и ASCII столбцы в буфер обмена + + + + Ctrl+Shift+C + + + Choose a file - Выбрать файл + Выбрать файл - Text files(*.txt);;Image files(%1);;All files(*) - Текстовые файлы(*.txt);;Файлы изображений(%1);;Все файлы(*) + Текстовые файлы(*.txt);;Файлы изображений(%1);;Все файлы(*) - + Choose a filename to export data Выбрать имя файла для экспорта данных - Text files(*.txt);;All files(*) - Текстовые файлы(*.txt);;Все файлы(*) + Текстовые файлы(*.txt);;Все файлы(*) - Image data can't be viewed with the text editor - Изображение не может быть отображено в текстовом редакторе + Изображение не может быть отображено в текстовом редакторе - Binary data can't be viewed with the text editor - Бинарные данные не могут быть отображены в текстовом редакторе + Бинарные данные не могут быть отображены в текстовом редакторе - + Type of data currently in cell: %1 Image Тип данных в ячейке: %1 Изображение - + %1x%2 pixel(s) %1x%2 пикселей - + Type of data currently in cell: NULL Тип данных в ячейке: NULL - - + + Type of data currently in cell: Text / Numeric Тип данных в ячейке: Текст / Числовое + + + + Image data can't be viewed in this mode. + Изображение не может быть отображено в этом режиме. + + + + + Try switching to Image or Binary mode. + Попробуйте переключиться в Бинарный режим или режим Изображения. + + + + + Binary data can't be viewed in this mode. + Бинарные данные не могут быть отображены в этом режиме. + + + + + Try switching to Binary mode. + Попробуйте переключиться в Бинарный режим. + + + + + + + Text files (*.txt) + Текстовые файлы (*.txt) + + + + + + JSON files (*.json) + JSON файлы (*.json) + + + + + + + XML files (*.xml) + XML файлы (*.xml) + + + + + Image files (%1) + Файлы изображений (%1) + + + + + + Binary files (*.bin) + Бинарные файлы (*.bin) + + + + + All files (*) + Все файлы (*) + + + + Choose a file to import + Выбрать файл для импорта + + + + %1 Image + %1 Изображение + + + + SVG files (*.svg) + SVG файлы (*.svg) + + + + + Hex dump files (*.txt) + Файлы дампов (*.txt) + + + + Invalid data for this mode + Ошибочные данные для этого режима + + + + The cell contains invalid %1 data. Reason: %2. Do you really want to apply it to the cell? + Ячейка содержит ошибочные %1 данные. Причина: %2. Вы действительно хотите применить их? + - - + + + %n char(s) %n символ @@ -614,13 +1024,18 @@ - + + Type of data currently in cell: Valid JSON + Тип данных в ячейке: JSON + + + Type of data currently in cell: Binary Тип данных в ячейке: Двоичные данные - - + + %n byte(s) %n байт @@ -665,7 +1080,7 @@ Edit Index Schema - + Редактирование Индекса @@ -675,46 +1090,47 @@ For restricting the index to only a part of the table you can specify a WHERE clause here that selects the part of the table that should be indexed - + Для ограничения индекса только частью таблицы вы можете указать здесь выражение WHERE, которое выбирает часть таблицы, которая должна быть проиндексирована Partial inde&x clause - + &Частичный индекс Colu&mns - + &Колонки Table column - + Колонка таблицы Type - Тип + Тип Add a new expression column to the index. Expression columns contain SQL expression rather than column names. - + Добавить новое колоночное-выражение в индекс. Колоночное выражение может содержкать SQL выражения вместо имен колонок. Index column - + Колонка индекса - + Deleting the old index failed: %1 - + Удаление старого индекса завершилось с ошибкой: +%1 - + Creating the index failed: %1 Ошибка создания индекса: @@ -740,137 +1156,136 @@ + Database schema + Схема БД + + + Make this a 'WITHOUT rowid' table. Setting this flag requires a field of type INTEGER with the primary key flag set and the auto increment flag unset. Чтобы создать таблицу 'без rowid', нужно чтобы в ней был INTEGER первичный ключ с отключенным автоинкрементом. - + Without Rowid Без rowid - - Set this to create a temporary table that is deleted when closing the database. - - - - - Temporary table - - - - + Fields Поля - + Add field Добавить поле - + Remove field Удалить поле - + Move field up Переместить поле вверх - + Move field down Переместить поле вниз - + Name Имя - + Type Тип - - + + NN + НП + + + Not null Не пустое (null) - + PK ПК - + Primary key Первичный ключ - + AI АИ - + Autoincrement Автоинкремент - + U У - + Unique Уникальное - + Default По умолчанию - + Default value Значение по умолчанию - + Check Проверить - + Check constraint Проверить ограничение - + Foreign Key Внешний ключ - + <html><head/><body><p><span style=" font-weight:600; color:#ff0000;">Warning: </span>There is something with this table definition that our parser doesn't fully understand. Modifying and saving this table might result in problems.</p></body></html> - + <html><head/><body><p><span style=" font-weight:600; color:#ff0000;">Внимание: </span>В описании этой таблицы есть что-то, что наш парсер не понимает. Модификация и сохрание этой таблицы может породить проблемы.</p></body></html> <html><head/><body><p><span style=" font-weight:600; color:#ff0000;">Warning: </span>There is something with this table definition that our parser doesn't fully understand. Modifying and saving this table might result it in problems.</p></body></html> <html><head/><body><p><span style=" font-weight:600; color:#ff0000;">Внимание: </span>Определение данной таблицы наш парсер не смог понять. Eё модификация и сохранение может привести к последующим проблемам.</p></body></html> - + Error creating table. Message from database engine: %1 Ошибка создания таблицы. Сообщение от движка базы данных: %1 - + There already is a field with that name. Please rename it first or choose a different name for this field. Поле с таким именем уже существует. Пожалуйста переименуйте его, либо выберите другое имя для данного поля. @@ -879,46 +1294,48 @@ На данную колонку ссылкается внешний ключ в таблице %1, поле %2 поэтому ее имя не может быть изменено. - + This column is referenced in a foreign key in table %1 and thus its name cannot be changed. На данную колонку ссылкается внешний ключ в таблице %1, поэтому ее имя не может быть изменено. - + There is at least one row with this field set to NULL. This makes it impossible to set this flag. Please change the table data first. Существует по крайней мере одна строка, где это поле установлено в NULL. Установить этот флаг нельзя. Сначала измените данные таблицы. - + There is at least one row with a non-integer value in this field. This makes it impossible to set the AI flag. Please change the table data first. Существует по крайней мере одна строка, где это поле содержит нечисловое значение. Установить флаг АИ нельзя. Сначала измените данные таблицы. - + Column '%1' has no unique data. - Столбец '%1" содержит не уникальные данные. + Колонка '%1' не содержит уникальных данных. + - + This makes it impossible to set this flag. Please change the table data first. Невозможно. Для начала, измените данные таблицы. - + Modifying this column failed. Error returned from database: %1 - + Модификация этой колонки завершилась с ошибкой: +%1 - + Are you sure you want to delete the field '%1'? All data currently stored in this field will be lost. Удалить поле '%1'? Все данные, которые в настоящий момент сохранены в этом поле, будут потеряны. - + Please add a field which meets the following criteria before setting the without rowid flag: - Primary key flag set - Auto increment disabled @@ -927,16 +1344,18 @@ - для него отключен автоинкремент - + Setting the rowid column for the table failed. Error message: %1 - + Назначение rowid колонки завершилось с ошибкой: +%1 - - Setting the temporary flag for the table failed. Error message: + + Changing the table schema failed. Error message: %1 - + Изменение схемы таблицы завершилось с ошибкой: +%1 @@ -1036,44 +1455,54 @@ Красивый вывод - - + + Could not open output file: %1 Не удалось открыть выходной файл: %1 - - + + Choose a filename to export data Выберите имя файла для экспорта данных - + Text files(*.csv *.txt) Текстовые файлы(*.csv *.txt) - + Export data as JSON - + Экспортировать данные как JSON + + + + exporting CSV + экспортирование CSV + + + + exporting JSON + экспортирование JSON - + Text files(*.json *.js *.txt) Текстовые файлы (*.json *.js *.txt) - + Please select at least 1 table. Пожалуйста, выберите хотя бы одну таблицу. - + Choose a directory Выберать каталог - + Export completed. Экспорт завершён. @@ -1128,12 +1557,12 @@ Keep old schema (CREATE TABLE IF NOT EXISTS) - + Проверять существоватние таблицы (CREATE TABLE IF NOT EXISTS) Overwrite old schema (DROP TABLE, then CREATE TABLE) - + Удалять старую таблицу перед созданием (DROP TABLE, затем CREATE TABLE) @@ -1141,32 +1570,61 @@ Экспортировать только схему данных - Please select at least 1 table. + Пожалуйста, выберите хотя бы одну таблицу. + + + + Please select at least one table. Пожалуйста, выберите хотя бы одну таблицу. - + Choose a filename to export Выберите имя файла для экспорта - + Text files(*.sql *.txt) Текстовые файлы(*.sql *.txt) - + Export completed. Экспорт завершён. - + Export cancelled or failed. Экспорт отменён или возникли ошибки. + ExtendedScintilla + + + + Ctrl+H + + + + + + Ctrl+P + Ctrl+P + + + + Find and Replace... + Найти и Заменить... + + + + Print... + Печать... + + + ExtendedTableWidget The content of clipboard is bigger than the range selected. @@ -1175,25 +1633,101 @@ Все равно вставить? - + + Use as Exact Filter + Использовать как Точный Фильтр + + + + Containing + Содержит + + + + Not equal to + Не равно + + + + Greater than + Больше чем + + + + Less than + Меньше чем + + + + Greater or equal + Больше или равно + + + + Less or equal + Меньше или равно + + + + Between this and... + Между этим и... + + + Set to NULL - + Сбросить в NULL - + Copy - + Копировать + + + + Copy with Headers + Копировать с заголовками + + + + Copy as SQL + Копировать как SQL - + Paste - + Вставить + + + + Print... + Печать... + + + + Use in Filter Expression + Использовать в Выражении Фильтра + + + + Alt+Del + - + + Ctrl+Shift+C + + + + + Ctrl+Alt+C + + + + The content of the clipboard is bigger than the range selected. Do you want to insert it anyway? - + Содержимое буфера обмена больше чем выделенный диапозон. +Все равно вставить? @@ -1204,24 +1738,282 @@ + FileExtensionManager + + + File Extension Manager + Менеджер расширения файлов + + + + &Up + &Выше + + + + &Down + &Ниже + + + + &Add + &Добавить + + + + &Remove + &Удалить + + + + + Description + Описание + + + + Extensions + Расширения + + + + *.extension + + + + FilterLineEdit - + Filter Фильтр + + + These input fields allow you to perform quick filters in the currently selected table. +By default, the rows containing the input text are filtered out. +The following operators are also supported: +% Wildcard +> Greater than +< Less than +>= Equal to or greater +<= Equal to or less += Equal to: exact match +<> Unequal: exact inverse match +x~y Range: values between x and y + Эти поля ввода позволяют назначить фильтры для текущей таблице. +По умолчанию строки, содержащие входной текст, отфильтровываются. +Поддерживаются также следующие операторы: +% Символ подстановки +> Больше, чем +< Меньше, чем +>= Равно или больше +<= Равно или меньше += Равно: точное совпадение +<> Неравномерно: точное обратное совпадение +x~y Диапазон: значения между x и y + + + + Set Filter Expression + Установить Выражение Фильтра + + + + What's This? + Что Это? + + + + Is NULL + NULL + + + + Is not NULL + не NULL + + + + Is empty + пусто + + + + Is not empty + не пусто + + + + Equal to... + Равно... + + + + Not equal to... + Не равно... + + + + Greater than... + Больше чем... + + + + Less than... + Меньше чем... + + + + Greater or equal... + Больше или равно... + + + + Less or equal... + Меньше или равно... + + + + In range... + В диапазоне... + + + + FindReplaceDialog + + + Find and Replace + Поиск и Замена + + + + Fi&nd text: + &Текст для поиска: + + + + Re&place with: + Текст для &замены: + + + + Match &exact case + Учитывать &регистр + + + + Match &only whole words + Слова &целиком + + + + When enabled, the search continues from the other end when it reaches one end of the page + Когда отмечено, поиск продолжается с другого конца, когда он достигает противоположного конца страницы + + + + &Wrap around + &Закольцевать + + + + When set, the search goes backwards from cursor position, otherwise it goes forward + Когда отмечено, поиск возвращается назад из положения курсора, в противном случае он идет вперед + + + + Search &backwards + Искать в &обратном порядке + + + + <html><head/><body><p>When checked, the pattern to find is interpreted as a UNIX regular expression. See <a href="https://en.wikibooks.org/wiki/Regular_Expressions">Regular Expression in Wikibooks</a>.</p></body></html> + <html><head/><body><p>При проверке шаблон для поиска интерпретируется как регулярное выражение UNIX. <a href="https://en.wikibooks.org/wiki/Regular_Expressions">Узнать больше о Регулярных выражениях на Wikibooks.org</a>.</p></body></html> + + + + Use regular e&xpressions + &Регулярные выражения + + + + Find the next occurrence from the cursor position and in the direction set by "Search backwards" + Найдите следующее вхождение из позиции курсора и в направлении, заданном "Искать назад" + + + + &Find Next + Искать &дальше + + + + &Replace + &Замена + + + + Highlight all the occurrences of the text in the page + Выделить все вхождения текста на странице + + + + F&ind All + Найти &все + + + + Replace all the occurrences of the text in the page + Заменить все вхождения текста на странице + + + + Replace &All + За&менить все + + + + The searched text was not found + Искомый текст не найден + + + + + The searched text was not found. + Искомый текст не найден. + + + + The searched text was found one time. + Искомый текст найден один раз. + + + + The searched text was found %1 times. + Искомый текст найден %1 раз. + + + + The searched text was replaced one time. + Искомый текст заменен один раз. + + + + The searched text was replaced %1 times. + Искомый текст заменен %1 раз. + ForeignKeyEditor &Reset - + &Сброс Foreign key clauses (ON UPDATE, ON DELETE etc.) - + Условия (ON UPDATE, ON DELETE и т.д.) @@ -1232,8 +2024,12 @@ Импортировать файл в формате CSV - &Table name + &Имя таблицы + + + + Table na&me &Имя таблицы @@ -1258,7 +2054,7 @@ - + Tab Табуляция @@ -1317,61 +2113,116 @@ Separate tables - + Отдельные таблицы + + + + Advanced + Дополнительно + + + + When importing an empty value from the CSV file into an existing table with a default value for this column, that default value is inserted. Activate this option to insert an empty value instead. + При импорте пустого значения из файла CSV в существующую таблицу для столбца с указанным значением по умолчанию оно будет вставлено. Активируйте эту опцию, чтобы вместо этого вставить пустое значение. + + + + Ignore default &values + Игнорировать значение &по-умолчанию - + Activate this option to stop the import when trying to import an empty value into a NOT NULL column without a default value. + Активируйте эту опцию чтобы прекратить импорт при попытке импорта пустого значения в NOT NULL колонку без значения по-умолчанию. + + + + Fail on missing values + Ошибка при отсутствии значений + + + + Disable data type detection + Отключить определение типа данных + + + + Disable the automatic data type detection when creating a new table. + Отключить автоматическое определение типа при создании новой таблицы. + + + + Deselect All - Отменить выбор + Отменить Выбор - + Match Similar - + Найти Совпадения - + Select All - Выбрать все + Выбрать Все - Inserting data... - Вставка данных... + Вставка данных... - Cancel - Отменить + Отменить - There is already a table of that name and an import into an existing table is only possible if the number of columns match. - Уже существует таблица с таким же именем, и импорт в существующую таблицу возможен, только если число столбцов совпадает. + Уже существует таблица с таким же именем, и импорт в существующую таблицу возможен, только если число столбцов совпадает. - There is already a table of that name. Do you want to import the data into it? - Уже существует таблица с таким именем. Импортировать данные в неё? + Уже существует таблица с таким именем. Импортировать данные в неё? + + + + Import completed + Импорт завершён + + + + There is already a table named '%1' and an import into an existing table is only possible if the number of columns match. + Уже существует таблица с именем '%1' и импорт в существующую таблицу возможен, только если число столбцов совпадает. - + + There is already a table named '%1'. Do you want to import the data into it? + Уже существует таблица с именем '%1'. Вы хотите импортировать данные в нее? + + + Creating restore point failed: %1 Ошибка сознания точки восстановления: %1 - + Creating the table failed: %1 Ошибка создания таблицы: %1 - + + importing CSV + импортирование CSV + + + + Importing the file '%1' took %2ms. Of this %3ms were spent in the row function. + Импорт файла '%1' занял %2мс. Из них %3мс было потрачено в функции строки. + + Missing field for record %1 - Пропущен столбец для записи %1 + Пропущен столбец для записи %1 - + Inserting row failed: %1 Ошибка вставки строки: %1 @@ -1384,8 +2235,7 @@ Обозреватель для SQLite - - + toolBar1 панельИнструментов1 @@ -1394,112 +2244,581 @@ Таблица: - + Select a table to browse data Выберите таблицу для просмотра данных - + Use this list to select a table to be displayed in the database view Используйте этот список, чтобы выбрать таблицу, которая должна быть отображена в представлении базы данных - Refresh the data in the selected table. - Обновить данные в выбранной таблице. + Обновить данные в выбранной таблице. - + This button refreshes the data in the currently selected table. Эта кнопка отновляет данные выбранной в данный момент таблицы. - - Scroll one page upwards - + + This button clears all the filters set in the header input fields for the currently browsed table. + Эта кнопка очищает все фильтры, установленные в полях ввода заголовка для текущей просматриваемой таблицы. - - <html><head/><body><p>Clicking this button navigates one page of records upwards in the table view above.</p></body></html> - + + Save the table as currently displayed + Сохранить таблицу так как сейчас отображается - - Scroll one page downwards - + + <html><head/><body><p>This popup menu provides the following options applying to the currently browsed and filtered table:</p><ul style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;"><li style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Export to CSV: this option exports the data of the browsed table as currently displayed (after filters, display formats and order column) to a CSV file.</li><li style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Save as view: this option saves the current setting of the browsed table (filters, display formats and order column) as an SQL view that you can later browse or use in SQL statements.</li></ul></body></html> + <html><head/><body><p>Это всплывающее меню предоставляет следующие параметры, применяемые к текущей просматриваемой и отфильтрованной таблице:</p><ul style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;"><li style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Экспортировать ввиде CSV: данные просматриваемой таблицы сохраняется так как отображается (после применения фильтров, форматов отображения и порядка колонок) в CSV файл.</li><li style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Сохранить как вид: эта опция сохраняет настройки текущей отображаемой таблицы (фильтры, форматы отображения и порядок колонок) как SQL вид, который вы позже можете просматривать или использовать в SQL выражениях.</li></ul></body></html> - - <html><head/><body><p>Clicking this button navigates one page of records downwards in the table view above.</p></body></html> - + + ... + ... - - Refresh - + + Print currently browsed table data + Печатать отображаемую таблицу - - F5 - F5 + + Print currently browsed table data. Print selection if more than one cell is selected. + Распечатывайте текущие данные таблицы. Выбор печати, если выбрано несколько ячеек. - - Insert a new record in the current table - Добавить новую запись в текущую таблицу + + <html><head/><body><p>This button creates a new record in the database. Hold the mouse button to open a pop-up menu of different options:</p><ul><li><span style=" font-weight:600;">New Record</span>: insert a new record with default values in the database.</li><li><span style=" font-weight:600;">Insert Values...</span>: open a dialog for entering values before they are inserted in the database. This allows to enter values acomplishing the different constraints. This dialog is also open if the <span style=" font-weight:600;">New Record</span> option fails due to these constraints.</li></ul></body></html> + <html><head/><body><p>Эта кнопка создает новую запись в базе данных. Удерживайте кнопку мыши, чтобы открыть всплывающее меню различных параметров:</p><ul><li><span style=" font-weight:600;">Новая Запись</span>: вставляет новую запись со значениями по умолчанию.</li><li><span style=" font-weight:600;">Вставить Значения...</span>: открывает диалог для ввода значений перед тем, как они будут вставленны в БД. Это позволяет вводить значения, назначая различные ограничения. Этот диалог также открывается, если <span style=" font-weight:600;">Новая Запись</span> опция не срабатывает из-за этих ограничений.</li></ul></body></html> - - &Table: - + + This button deletes the record or records currently selected in the table + Эта кнопка удаляет запись или записи, выбранные в настоящее время в таблице - - This button creates a new, empty record in the database - Эта кнопка создаёт новую, пустую запись в таблице + + This is the database table view. You can do the following actions: + - Start writing for editing inline the value. + - Double-click any record to edit its contents in the cell editor window. + - Alt+Del for deleting the cell content to NULL. + - Ctrl+" for duplicating the current record. + - Ctrl+' for copying the value from the cell above. + - Standard selection and copy/paste operations. + Это представление таблицы БД. Вы можете выполнить следующие действия: + - Начните писать для редактирования, введя значение. + - Дважды щелкните любую запись, чтобы отредактировать ее содержимое в окне редактора ячеек. + - Alt + Del для обнуления содержимого ячейки в NULL. + - Ctrl + " для дублирования текущей записи. + - Ctrl + ' для копирования значения из ячейки выше. + - Стандартные операции выбора и копирования/вставки. - - New Record - Добавить запись + + Scroll one page upwards + Страница вверх - - Delete the current record - Удалить текущую запись + + <html><head/><body><p>Clicking this button navigates one page of records upwards in the table view above.</p></body></html> + <html><head/><body><p>Нажатие этой кнопки перемещает одну страницу записей вверх в виде таблицы выше.</p></body></html> - - This button deletes the record currently selected in the database - Эта кнопка удаляет выбранную запись + + Scroll one page downwards + Страница вниз - - Delete Record - Удалить запись + + <html><head/><body><p>Clicking this button navigates one page of records downwards in the table view above.</p></body></html> + <html><head/><body><p>Нажатие этой кнопки перемещает одну страницу записей вниз в виде таблицы выше.</p></body></html> - - This is the database view. You can double-click any record to edit its contents in the cell editor window. - Это представление базы данных. Сделайте двойной щелчок по любой записи, чтобы отредактировать её содержимое. + + <html><head/><body><p><a href="https://www.sqlite.org/pragma.html#pragma_case_sensitive_like">Case Sensitive Like</a></p></body></html> + - - <html><head/><body><p>Scroll to the beginning</p></body></html> - <html><head/><body><p>Прокрутить к началу</p></body></html> + + Warning: this pragma is not readable and this value has been inferred. Writing the pragma might overwrite a redefined LIKE provided by an SQLite extension. + Предупреждение: эта прагма не читается, и это значение было выведено. Применение прагмы может перезаписать переопределенный LIKE, предоставляемый расширением SQLite. - - <html><head/><body><p>Clicking this button navigates to the beginning in the table view above.</p></body></html> - <html><head/><body><p>Нажатие этой кнопки переводит к началу в таблице выше.</p></body></html> + + &Tools + &Инструменты - - |< - + + This button clears the contents of the SQL logs + Эта кнопка очищает содержимое журналов SQL - Scroll 100 records upwards + + This panel lets you examine a log of all SQL commands issued by the application or by yourself + Эта панель позволяет вам просматривать журнал всех SQL-команд, выданных приложением или вами + + + + This is the structure of the opened database. +You can drag multiple object names from the Name column and drop them into the SQL editor and you can adjust the properties of the dropped names using the context menu. This would help you in composing SQL statements. +You can drag SQL statements from the Schema column and drop them into the SQL editor or into other applications. + + Это структура открытой БД. +Вы можете перетащить несколько имен объектов из столбца "Имя" и отбросить их в редактор SQL, и вы можете настроить свойства сброшенных имен с помощью контекстного меню. Это поможет вам при составлении SQL-инструкций. +Вы можете перетаскивать операторы SQL из столбца "Схема" и переносить их в редактор SQL или в другие приложения. + + + + + + Project Toolbar + Панель Инструментов Проекта + + + + Extra DB toolbar + Дополнительная Панель Инструментов БД + + + + + + Close the current database file + Закрыть файл текущей БД + + + + &About + О &программе + + + + This button opens a new tab for the SQL editor + Эта кнопка открывает новую вкладку для редактора SQL + + + + Execute all/selected SQL + Выполнить все/выбранный SQL + + + + This button executes the currently selected SQL statements. If no text is selected, all SQL statements are executed. + Эта кнопка выполняет текущие выбранные операторы SQL. Если в текстовом редакторе ничего не выбрано , все инструкции SQL выполняются. + + + + This button opens a file containing SQL statements and loads it in a new editor tab + Эта кнопка открывает файл, содержащий инструкции SQL, и загружает его в новой вкладке редактора + + + + &Load Extension... + &Загрузить расширение... + + + + This button executes the SQL statement present in the current editor line + Эта кнопка выполняет оператор SQL, присутствующий в текущей строке редактора + + + + &Wiki + &Вики + + + + Bug &Report... + Баг &репорт... + + + + Feature Re&quest... + Запросить &функцию... + + + + Web&site + &Веб-сайт + + + + &Donate on Patreon... + Сделать &пожертвование в Patreon... + + + + Sa&ve Project... + &Сохранить проект... + + + + This button lets you save all the settings associated to the open DB to a DB4S project file + Эта кнопка позволяет сохранить все настройки, связанные с открытой БД, в файл проекта DB4S + + + + Open &Project... + Открыть &проект... + + + + This button lets you open a DB4S project file + Эта кнопка позволяет открыть файл проекта DB4S + + + + &Attach Database... + &Прикрепить БД... + + + + + Add another database file to the current database connection + Добавить другой файл БД в текущее соединение + + + + This button lets you add another database file to the current database connection + Эта кнопка позволяет добавить другой файл БД в текущее соединение с БД + + + + &Set Encryption... + Назначитть &шифрование... + + + + This button saves the content of the current SQL editor tab to a file + Эта кнопка сохраняет содержимое текущей вкладки редактора SQL в файл + + + + SQLCipher &FAQ + + + + + Table(&s) to JSON... + Таблицы в файл &JSON... + + + + Refresh + Обновить + + + + F5 + F5 + + + + Open Data&base Read Only... + Открыть БД &только для чтения... + + + + Save results + Сохранить результаты + + + + Save the results view + Сохранить результаты + + + + This button lets you save the results of the last executed query + Эта кнопка позволяет сохранить результаты последнего выполненного запроса + + + + Find text in SQL editor + Найти текст в редакторе SQL + + + + Find text in SQL editor + Найти текст в редакторе SQL + + + + This button opens the search bar of the editor + Эта кнопка открывает панель поиска редактора + + + + Ctrl+F + + + + + Find or replace text in SQL editor + Найти или заменить текст в редакторе SQL + + + + Find or replace text in SQL editor + Найти или заменить текст в редакторе SQL + + + + This button opens the find/replace dialog for the current editor tab + Эта кнопка открывает диалог поиска/замены для текущей вкладки редактора + + + + + Export to &CSV + Экспортировать в &CSV + + + + + Save as &view + Сохранить как &представление + + + + Save as view + Сохранить как представление + + + + Hide column(s) + Скрыть колонки + + + + Hide selected column(s) + Скрыть выбранные колонки + + + + Show all columns + Показать все колонки + + + + Show all columns that were hidden + Показать все колонки, которые были скрыты + + + + Shows or hides the Project toolbar. + Показывает или скрывает панель инструментов Проекта. + + + + Extra DB Toolbar + Дополнительная Панель Инструментов БД + + + + + Export the filtered data to CSV + Экспортировать отфильтрованные данные в CSV + + + + This button exports the data of the browsed table as currently displayed (after filters, display formats and order column) as a CSV file. + Эта кнопка экспортирует данные просматриваемой таблицы так как отображается (после обработки фильтрами, форматами отображения и т.д.) в виде файла CSV. + + + + + Save the current filter, sort column and display formats as a view + Сохранить текущие фильтры, столбецы сортировки и форматы отображания в виде представления + + + + This button saves the current setting of the browsed table (filters, display formats and order column) as an SQL view that you can later browse or use in SQL statements. + Эта кнопка сохраняет текущие настройки просматриваемой таблицы (фильтры, форматы отображения и столбец сортировки) в виде представления SQL, которое вы можете впоследствии просмотреть или использовать в операторах SQL. + + + + Insert Values... + Вставить Значения... + + + + + Open a dialog for inserting values in a new record + Открывает диалоговое окно для вставки значений в новую запись + + + + + Insert new record using default values in browsed table + Вставляет новую запись, используя значения по умолчанию в просматриваемой таблице + + + + New In-&Memory Database + Новая БД в &Памяти + + + + Drag && Drop Qualified Names + Квалифицированные имена при перетакскивании + + + + + Use qualified names (e.g. "Table"."Field") when dragging the objects and dropping them into the editor + Квалифицированные имена (например, "Table"."Field") при перетаскивании объектов в редактор + + + + Drag && Drop Enquoted Names + Экранированные имена при перетаскивании + + + + + Use escaped identifiers (e.g. "Table1") when dragging the objects and dropping them into the editor + Экранировать имена идентификаторов (например, "Table1"), когда перетаскиваются объекты в редактор + + + + &Integrity Check + Проверка &Целостности + + + + Runs the integrity_check pragma over the opened database and returns the results in the Execute SQL tab. This pragma does an integrity check of the entire database. + Выполняет прагму integrity_check для открытой БД и возвращает результаты во вкладке "SQL". Эта прагма выполняет проверку целостности всей базы данных. + + + + &Foreign-Key Check + Проверка &Внешних ключей + + + + Runs the foreign_key_check pragma over the opened database and returns the results in the Execute SQL tab + Запускает прагму foreign_key_check для открытой БД и возвращает результаты во вкладке "SQL" + + + + &Quick Integrity Check + &Быстрая Проверка Целостности + + + + Run a quick integrity check over the open DB + Запуск быстрой проверки целостности для открытый БД + + + + Runs the quick_check pragma over the opened database and returns the results in the Execute SQL tab. This command does most of the checking of PRAGMA integrity_check but runs much faster. + Запускает прагму quick_check для открытой БД и возвращает результаты во вкладке "SQL". Эта команда выполняет большую часть проверки PRAGMA integrity_check, но работает намного быстрее. + + + + &Optimize + &Оптимизация + + + + Attempt to optimize the database + Попытка оптимизации БД + + + + Runs the optimize pragma over the opened database. This pragma might perform optimizations that will improve the performance of future queries. + Выполняет прагму optimize для открытой БД. Эта прагма может выполнять оптимизацию, которая улучшит производительность будущих запросов. + + + + + Print + Печать + + + + Print text from current SQL editor tab + Печать текста изтекущей вкладки редактора SQL + + + + Open a dialog for printing the text in the current SQL editor tab + Открывает диалоговое окно для печати текста из текущей вкладки редактора SQL + + + + Print the structure of the opened database + Печать структуры открытой БД + + + + Open a dialog for printing the structure of the opened database + Открывает диалоговое окно для печати структуры текущей БД + + + + Insert a new record in the current table + Добавить новую запись в текущую таблицу + + + + &Table: + &Таблица: + + + This button creates a new, empty record in the database + Эта кнопка создаёт новую, пустую запись в таблице + + + + + New Record + Добавить запись + + + + Delete the current record + Удалить текущую запись + + + This button deletes the record currently selected in the database + Эта кнопка удаляет выбранную запись + + + + + Delete Record + Удалить запись + + + This is the database view. You can double-click any record to edit its contents in the cell editor window. + Это представление базы данных. Сделайте двойной щелчок по любой записи, чтобы отредактировать её содержимое. + + + + <html><head/><body><p>Scroll to the beginning</p></body></html> + <html><head/><body><p>Прокрутить к началу</p></body></html> + + + + <html><head/><body><p>Clicking this button navigates to the beginning in the table view above.</p></body></html> + <html><head/><body><p>Нажатие этой кнопки переводит к началу в таблице выше.</p></body></html> + + + + |< + + + + Scroll 100 records upwards Прокрутить на 100 записей вверх @@ -1507,12 +2826,12 @@ <html><head/><body><p>Нажатие этой кнопки к перемещению на 100 записей вверх в табличном представлении выше</p></body></html> - + < < - + 0 - 0 of 0 0 - 0 из 0 @@ -1525,222 +2844,188 @@ <html><head/><body><p>Нажатие этой кнопки к перемещению на 100 записей вниз в табличном представлении выше</p></body></html> - + > > - + Scroll to the end Прокрутить к концу - + <html><head/><body><p>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Clicking this button navigates up to the end in the table view above.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</p></body></html> <html><head/><body><p>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Нажатие этой кнопки перемещает в конец таблицы выше.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</p></body></html> - + >| - + <html><head/><body><p>Click here to jump to the specified record</p></body></html> <html><head/><body><p>Нажмите здесь, чтобы перейти к указанной записи</p></body></html> - + <html><head/><body><p>This button is used to navigate to the record number specified in the Go to area.</p></body></html> <html><head/><body><p>Эта кнопка используется, чтобы переместиться к записи, номер которой указан в области Перейти к</p></body></html> - + Go to: Перейти к: - + Enter record number to browse Введите номер записи для просмотра - + Type a record number in this area and click the Go to: button to display the record in the database view Напечатайте номер записи в этой области и нажмите кнопку Перейти к:, чтобы отобразить запись в представлении базы данных - + 1 1 - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_auto_vacuum"><span style=" text-decoration: underline; color:#0000ff;">Auto Vacuum</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_auto_vacuum"><span style=" text-decoration: underline; color:#0000ff;">Auto Vacuum</span></a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_auto_vacuum"><span style=" text-decoration: underline; color:#0000ff;">Auto Vacuum</span></a></p></body></html> - None - Нет + Нет - - Full Полный, целый - Full + Full - Incremental - Incremental + Incremental - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_automatic_index"><span style=" text-decoration: underline; color:#0000ff;">Automatic Index</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_automatic_index"><span style=" text-decoration: underline; color:#0000ff;">Automatic Index</span></a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_automatic_index"><span style=" text-decoration: underline; color:#0000ff;">Automatic Index</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_checkpoint_fullfsync"><span style=" text-decoration: underline; color:#0000ff;">Checkpoint Full FSYNC</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_checkpoint_fullfsync"><span style=" text-decoration: underline; color:#0000ff;">Checkpoint Full FSYNC</span></a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_checkpoint_fullfsync"><span style=" text-decoration: underline; color:#0000ff;">Checkpoint Full FSYNC</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_foreign_keys"><span style=" text-decoration: underline; color:#0000ff;">Foreign Keys</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_foreign_keys"><span style=" text-decoration: underline; color:#0000ff;">Foreign Keys</span></a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_foreign_keys"><span style=" text-decoration: underline; color:#0000ff;">Foreign Keys</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_fullfsync"><span style=" text-decoration: underline; color:#0000ff;">Full FSYNC</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_fullfsync"><span style=" text-decoration: underline; color:#0000ff;">Full FSYNC</span></a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_fullfsync"><span style=" text-decoration: underline; color:#0000ff;">Full FSYNC</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_ignore_check_constraints"><span style=" text-decoration: underline; color:#0000ff;">Ignore Check Constraints</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_ignore_check_constraints"><span style=" text-decoration: underline; color:#0000ff;">Ignore Check Constraints</span></a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_ignore_check_constraints"><span style=" text-decoration: underline; color:#0000ff;">Ignore Check Constraints</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_journal_mode"><span style=" text-decoration: underline; color:#0000ff;">Journal Mode</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_journal_mode"><span style=" text-decoration: underline; color:#0000ff;">Journal Mode</span></a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_journal_mode"><span style=" text-decoration: underline; color:#0000ff;">Journal Mode</span></a></p></body></html> - Delete - Delete + Delete - Truncate - Truncate + Truncate - Persist - Persist + Persist - - Memory - Memory + Memory - WAL - WAL + WAL - - Off - Off + Off - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_journal_size_limit"><span style=" text-decoration: underline; color:#0000ff;">Journal Size Limit</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_journal_size_limit"><span style=" text-decoration: underline; color:#0000ff;">Journal Size Limit</span></a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_journal_size_limit"><span style=" text-decoration: underline; color:#0000ff;">Journal Size Limit</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_locking_mode"><span style=" text-decoration: underline; color:#0000ff;">Locking Mode</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_locking_mode"><span style=" text-decoration: underline; color:#0000ff;">Locking Mode</span></a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_locking_mode"><span style=" text-decoration: underline; color:#0000ff;">Locking Mode</span></a></p></body></html> - - Normal - Normal + Normal - Exclusive - Exclusive + Exclusive - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_max_page_count"><span style=" text-decoration: underline; color:#0000ff;">Max Page Count</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_max_page_count"><span style=" text-decoration: underline; color:#0000ff;">Max Page Count</span></a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_max_page_count"><span style=" text-decoration: underline; color:#0000ff;">Max Page Count</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_page_size"><span style=" text-decoration: underline; color:#0000ff;">Page Size</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_page_size"><span style=" text-decoration: underline; color:#0000ff;">Page Size</span></a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_page_size"><span style=" text-decoration: underline; color:#0000ff;">Page Size</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_recursive_triggers"><span style=" text-decoration: underline; color:#0000ff;">Recursive Triggers</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_recursive_triggers"><span style=" text-decoration: underline; color:#0000ff;">Recursive Triggers</span></a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_recursive_triggers"><span style=" text-decoration: underline; color:#0000ff;">Recursive Triggers</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_secure_delete"><span style=" text-decoration: underline; color:#0000ff;">Secure Delete</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_secure_delete"><span style=" text-decoration: underline; color:#0000ff;">Secure Delete</span></a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_secure_delete"><span style=" text-decoration: underline; color:#0000ff;">Secure Delete</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_synchronous"><span style=" text-decoration: underline; color:#0000ff;">Synchronous</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_synchronous"><span style=" text-decoration: underline; color:#0000ff;">Synchronous</span></a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_synchronous"><span style=" text-decoration: underline; color:#0000ff;">Synchronous</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_temp_store"><span style=" text-decoration: underline; color:#0000ff;">Temp Store</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_temp_store"><span style=" text-decoration: underline; color:#0000ff;">Temp Store</span></a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_temp_store"><span style=" text-decoration: underline; color:#0000ff;">Temp Store</span></a></p></body></html> - Default - Default + Default - File - File + File - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_user_version"><span style=" text-decoration: underline; color:#0000ff;">User Version</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_user_version"><span style=" text-decoration: underline; color:#0000ff;">User Version</span></a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_user_version"><span style=" text-decoration: underline; color:#0000ff;">User Version</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_wal_autocheckpoint"><span style=" text-decoration: underline; color:#0000ff;">WAL Auto Checkpoint</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_wal_autocheckpoint"><span style=" text-decoration: underline; color:#0000ff;">WAL Auto Checkpoint</span></a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_wal_autocheckpoint"><span style=" text-decoration: underline; color:#0000ff;">WAL Auto Checkpoint</span></a></p></body></html> - + &File &Файл - + &Import &Импорт - + &Export &Экспорт @@ -1749,152 +3034,134 @@ Удаленный сервер - + &Edit &Редактирование - + &View &Вид - + &Help &Справка - + DB Toolbar Панель инструментов БД - + Edit Database &Cell Редактирование &ячейки БД - + DB Sche&ma Схе&ма БД - + &Remote - - - - - Execute SQL [F5, Ctrl+Return, Ctrl+R] - + &Удаленный сервер - &Load extension - Загрузить &расширение + Загрузить &расширение - - Execute current line [Shift+F5] - Выполнить текущую строку [Shift+F5] + + Execute current line + Выполнить текущую строку - + Shift+F5 Shift+F5 - Sa&ve Project - &Сохранить проект + &Сохранить проект - Open &Project - Открыть &проект + Открыть &проект - + Edit display format Формат отображения - + Edit the display format of the data in this column Редактирование формата отображения для данных из этой колонки - + Show rowid column Отображать колонку rowid - + Toggle the visibility of the rowid column - - + + Set encoding Кодировка - + Change the encoding of the text in the table cells Изменение кодировки текста в данной таблице - + Set encoding for all tables Установить кодировку для всех таблиц - + Change the default encoding assumed for all tables in the database Изменить кодировку по умолчанию для всех таблиц в базе данных - - &Open Database Read Only... - - - - + Open an existing database file in read only mode - + Открыть существующий файл базы данных в режиме только для чтения - + Unlock view editing - + Разблокировать возможность редактирования - + This unlocks the current view for editing. However, you will need appropriate triggers for editing. - + Разблокировать текущий вид для редактирования. Однако для редактирования вам понадобятся соответствующие триггеры. + Duplicate record - Дубликат записи - - - - SQLCipher &FAQ... - + Дубликат записи - + Opens the SQLCipher FAQ in a browser window Открыть SQLCiphier FAQ в браузере - Table(s) to JSON... - Таблицы в файл JSON... + Таблицы в файл JSON... - + Export one or more table(s) to a JSON file Экспортировать таблицы в JSON файл @@ -1907,38 +3174,37 @@ Сохранить в облако - &Attach Database - &Прикрепить базу данных + &Прикрепить базу данных - - + + Save SQL file as Сохранить файл SQL как - + &Browse Table Пр&осмотр данных - + Clear all filters Очистить все фильтры - + User Пользователем - + Application Приложением - + &Clear О&чистить @@ -2059,209 +3325,225 @@ Схема БД - + &New Database... &Новая база данных... - - + + Create a new database file Создать новый файл базы данных - + This option is used to create a new database file. Эта опция используется, чтобы создать новый файл базы данных. - + Ctrl+N Ctrl+N - + + &Open Database... &Открыть базу данных... - - - + + + + + Open an existing database file Открыть существующий файл базы данных - - + + + This option is used to open an existing database file. Эта опция используется, чтобы открыть существующий файл базы данных. - + + Ctrl+O Ctrl+O - + &Close Database &Закрыть базу данных - + + This button closes the connection to the currently open database file + Эта кнопка закрывает соединение с текущим файлом БД + + + Ctrl+W Ctrl+W - + + Revert database to last saved state Вернуть базу данных в последнее сохранённое состояние - + This option is used to revert the current database file to its last saved state. All changes made since the last save operation are lost. Эта опция используется, чтобы вернуть текущий файл базы данных в его последнее сохранённое состояние. Все изменения, сделаные с последней операции сохранения теряются. - + + Write changes to the database file Записать изменения в файл базы данных - + This option is used to save changes to the database file. Эта опция используется, чтобы сохранить изменения в файле базы данных. - + Ctrl+S Ctrl+S - + + Compact &Database... + &Уплотнить базу данных... + + + Compact the database file, removing space wasted by deleted records Уплотнить базу данных, удаляя пространство, занимаемое удалёнными записями - - + + Compact the database file, removing space wasted by deleted records. Уплотнить базу данных, удаляя пространство, занимаемое удалёнными записями. - + E&xit &Выход - + Ctrl+Q Ctrl+Q - + Import data from an .sql dump text file into a new or existing database. Импортировать данные из текстового файла sql в новую или существующую базу данных. - + This option lets you import data from an .sql dump text file into a new or existing database. SQL dump files can be created on most database engines, including MySQL and PostgreSQL. Эта опция позволяет импортировать данные из текстового файла sql в новую или существующую базу данных. Файл SQL может быть создан на большинстве движков баз данных, включая MySQL и PostgreSQL. - + Open a wizard that lets you import data from a comma separated text file into a database table. Открыть мастер, который позволяет импортировать данные из файла CSV в таблицу базы данных. - + Open a wizard that lets you import data from a comma separated text file into a database table. CSV files can be created on most database and spreadsheet applications. Открыть мастер, который позволяет импортировать данные из файла CSV в таблицу базы данных. Файлы CSV могут быть созданы в большинстве приложений баз данных и электронных таблиц. - + Export a database to a .sql dump text file. Экспортировать базу данных в текстовый файл .sql. - + This option lets you export a database to a .sql dump text file. SQL dump files contain all data necessary to recreate the database on most database engines, including MySQL and PostgreSQL. Эта опция позволяет экспортировать базу данных в текстовый файл .sql. Файлы SQL содержат все данные, необходимые для создания базы данных в большистве движков баз данных, включая MySQL и PostgreSQL. - + Export a database table as a comma separated text file. Экспортировать таблицу базы данных как CSV текстовый файл. - + Export a database table as a comma separated text file, ready to be imported into other database or spreadsheet applications. Экспортировать таблицу базы данных как CSV текстовый файл, готовый для импортирования в другие базы данных или приложения электронных таблиц. - + Open the Create Table wizard, where it is possible to define the name and fields for a new table in the database Открыть мастер создания таблиц, где возможно определить имя и поля для новой таблиы в базе данных - + Open the Delete Table wizard, where you can select a database table to be dropped. Открыть мастер удаления таблицы, где можно выбрать таблицу базы данных для удаления. - + Open the Modify Table wizard, where it is possible to rename an existing table. It is also possible to add or delete fields form a table, as well as modify field names and types. Открыть мастер изменения таблицы, где возможно переименовать существующую таблиц. Можно добавить или удалить поля таблицы, так же изменять имена полей и типы. - + Open the Create Index wizard, where it is possible to define a new index on an existing database table. Открыть мастер создания интекса, в котором можно определить новый индекс для существующей таблиц базы данных. - + &Preferences... &Настройки... - - + + Open the preferences window. Открыть окно настроек. - + &DB Toolbar &Панель инструментов БД - + Shows or hides the Database toolbar. Показать или скрыть панель инструментов База данных. - + Shift+F1 Shift+F1 - &About... - О &программе... + О &программе... - + &Recently opened &Недавно открываемые - + Open &tab Открыть &вкладку - - + + Ctrl+T Ctrl+T @@ -2271,17 +3553,31 @@ Структура БД - + + This is the structure of the opened database. +You can drag SQL statements from an object row and drop them into other applications or into another instance of 'DB Browser for SQLite'. + + Это структура открытой БД. +Вы можете перетаскивать операторы SQL из строки "объект" и переносить их в другие приложения или в другой экземпляр "Обозреватель для SQLite". + + + + Browse Data Данные - + + Refresh the data in the selected table + Обновить данные в выбранной таблице + + + Edit Pragmas Прагмы - + Execute SQL SQL @@ -2290,426 +3586,442 @@ Редактирование ячейки БД - + SQL &Log &Журнал SQL - + Show S&QL submitted by По&казывать SQL, выполненный - + &Plot &График - + &Revert Changes &Отменить изменения - + &Write Changes &Записать изменения - Compact &Database - &Уплотнить базу данных + &Уплотнить базу данных - + &Database from SQL file... &База данных из файла SQL... - + &Table from CSV file... &Таблицы из файла CSV... - + &Database to SQL file... Базу &данных в файл SQL... - + &Table(s) as CSV file... &Таблицы в файл CSV... - + &Create Table... &Создать таблицу... - + &Delete Table... &Удалить таблицу... - + &Modify Table... &Изменить таблицу... - + Create &Index... Создать и&ндекс... - + W&hat's This? Что &это такое? - + &Execute SQL В&ыполнить код SQL - Execute SQL [F5, Ctrl+Return] - Выполнить код SQL [F5, Ctrl+Return] + Execute SQL + Выполнить код SQL - + Open SQL file Открыть файл SQL - - - + + + Save SQL file Сохранить файл SQL - + Execute current line Выполнить текущую строку - Execute current line [Ctrl+E] - Выполнить текущую строку [Ctrl+E] + Execute current line + Выполнить текущую строку - + Ctrl+E Ctrl+E - + Export as CSV file Экспортировать в файл CSV - + Export table as comma separated values file Экспортировать таблицу как CSV файл - &Wiki... - В&ики... + В&ики... - Bug &report... - &Отчёт об ошибке... + &Отчёт об ошибке... - Web&site... - &Веб-сайт... + &Веб-сайт... - - + + Save the current session to a file Сохранить текущее состояние в файл - - + + Load a working session from a file Загрузить рабочее состояние из файла - &Set Encryption - Ши&фрование + Ши&фрование - + Copy Create statement Копировать CREATE выражение - + Copy the CREATE statement of the item to the clipboard Копировать CREATE выражение элемента в буффер обмена - + Ctrl+Return Ctrl+Return - + Ctrl+L Ctrl+L - + Ctrl+P Ctrl+P - + Ctrl+D - + Ctrl+I - + Encrypted Зашифровано - + Read only Только для чтения - + Database file is read only. Editing the database is disabled. База данных только для чтения. Редактирование запрещено. - + Database encoding Кодировка базы данных - + Database is encrypted using SQLCipher База данных зашифрована с использованием SQLCipher - - + + Choose a database file Выбрать файл базы данных - + Could not open database file. Reason: %1 - + Не удалось открыть файл базы данных. +Причина:%1 - - - + + + Choose a filename to save under Выбрать имя, под которым сохранить данные - Error adding record: - Ошибка добавления записи: + Ошибка добавления записи: - + Error deleting record: %1 Ошибка удаления записи: %1 - + Please select a record first Сначала выберите запись - + %1 - %2 of %3 %1 - %2 из %3 - - + + There is no database opened. Please open or create a new database file. Нет открытой базы данных. Откройте или создайте файл новой базы данных. - Are you sure you want to delete the %1 '%2'? All data associated with the %1 will be lost. - Хотите удалить %1 '%2'? + Хотите удалить %1 '%2'? Все данные, связанные с %1, будут потеряны. - Error: could not delete the %1. Message from database engine: %2 - Ошибка: невозмножно удалить %1. Сообщение из движка базы данных: %2 + Ошибка: невозмножно удалить %1. Сообщение из движка базы данных: %2 There is no database opened. Нет открытой базы данных. - + A new DB Browser for SQLite version is available (%1.%2.%3).<br/><br/>Please download at <a href='%4'>%4</a>. Вышла новая версия Обозревателя для SQLite (%1.%2.%3).<br/><br/>Она доступна для скачивания по адресу <a href='%4'>%4</a>. - - + + DB Browser for SQLite project file (*.sqbpro) Файл проекта Обозревателя для SQLite (*.sqbpro) - Error executing query: %1 - Ошибка выполнения запроса: %1 + Ошибка выполнения запроса: %1 - %1 rows returned in %2ms from: %3 - %1 строки возвращены за %2мс из: %3 + %1 строки возвращены за %2мс из: %3 - + , %1 rows affected , %1 строк изменено - Query executed successfully: %1 (took %2ms%3) - Запрос успешно выполнен: %1 (заняло %2мс%3) + Запрос успешно выполнен: %1 (заняло %2мс%3) Choose a text file Выбрать текстовый файл - + Text files(*.csv *.txt);;All files(*) Текстовые файлы(*.csv *.txt);;Все файлы(*) - Import completed - Импорт завершён + Импорт завершён - + Error while saving the database file. This means that not all changes to the database were saved. You need to resolve the following error first. %1 - + Ошибка при сохранении файла базы данных. Это означает, что не все изменения в базе данных были сохранены. Сначала вам необходимо разрешить следующую ошибку. + +%1 - + Are you sure you want to undo all changes made to the database file '%1' since the last save? Отменить все изменения, сделанные в файле базы данных '%1' после последнего сохранения? - + Choose a file to import Выберать файл для импорта - - - + + + Text files(*.sql *.txt);;All files(*) Текстовые файлы(*.sql *.txt);;Все файлы(*) - + Do you want to create a new database file to hold the imported data? If you answer no we will attempt to import the data in the SQL file to the current database. Создать новый файл базы данных, чтобы сохранить импортированные данные? Если ответить Нет, будет выполнена попытка импортировать данные файла SQL в текущую базу данных. - + File %1 already exists. Please choose a different name. Файл %1 уже существует. Выберите другое имя. - + Error importing data: %1 Ошибка импортирования данных: %1 - + Import completed. Импорт завершён. - - + Delete View Удалить представление - - + Modify View - + Модифицировать представление - - + Delete Trigger Удалить триггер - - + Modify Trigger - + Модифицировать триггер - - + Delete Index Удалить индекс - + + Choose a project file to open + Выберите файл проекта для открытия + + + + This project file is using an old file format because it was created using DB Browser for SQLite version 3.10 or lower. Loading this file format is still fully supported but we advice you to convert all your project files to the new file format because support for older formats might be dropped at some point in the future. You can convert your files by simply opening and re-saving them. + Этот файл проекта использует старый формат файла, потому что он был создан с использованием DB Browser для SQLite версии 3.10 или ниже. Загрузка этого формата по-прежнему полностью поддерживается, но мы советуем вам преобразовать все ваши файлы проекта в новый формат файла, поскольку поддержка более старых форматов может быть удалена в какой-то момент в будущем. Вы можете конвертировать ваши файлы, просто открывая и повторно сохраняя их. + + + + Duplicate records + Дублированные записи + + + + Ctrl+" + + + + Please enter a pseudo-primary key in order to enable editing on this view. This should be the name of a unique column in the view. - + Пожалуйста, введите псевдо-первичный ключ, чтобы разрешить редактирование в этом представлении. Это должно быть имя уникального столбца в представлении. - + Please choose a new encoding for this table. Пожалуйста выбирите новую кодировку для данной таблицы. - + + Error checking foreign keys after table modification. The changes will be reverted. + Ошибка проверки внешних ключей после изменения таблицы. Изменения будут отменены. + + + + This table did not pass a foreign-key check.<br/>You should run 'Tools | Foreign-Key Check' and fix the reported issues. + Эта таблица не прошла проверку внешнего ключа. <br/> Вы должны запустить "Инструменты | Проверка внешнего ключа"и исправить сообщенные проблемы. + + + Please choose a new encoding for all tables. Пожалуйста выбирите новую кодировку для всех таблиц. - + %1 Leave the field empty for using the database encoding. %1 Оставьте это поле пустым если хотите чтобы использовалась кодировка по умолчанию. - + This encoding is either not valid or not supported. Неверная кодировка либо она не поддерживается. @@ -2718,103 +4030,286 @@ Отменить - - - + + Delete Table Удалить таблицу - + &%1 %2 &%1 %2 - + Setting PRAGMA values will commit your current transaction. Are you sure? Установка значений PRAGMA завершит текущую транзакцию. Установить значения? - + Execution aborted by user - + Выполнение прервано пользователем + + + + In-Memory database + БД в памяти + + + + determining row count... + определяем количество строк... + + + + %1 - %2 of >= %3 + %1 - %2 из >= %3 + Are you sure you want to delete the table '%1'? +All data associated with the table will be lost. + Вы действительно хотите удалить таблицу '%1'? +Все данные, связанные с таблицей, будут потеряны. + + + + Are you sure you want to delete the view '%1'? + Вы действительно хотите удалить представление '%1'? + + + + Are you sure you want to delete the trigger '%1'? + Вы действительно хотите удалить триггер '%1'? + + + + Are you sure you want to delete the index '%1'? + Вы действительно хотите удалить индекс '%1'? + + + + Error: could not delete the table. + Ошибка: не удалось удалить таблицу. + + + + Error: could not delete the view. + Ошибка: не удалось удалить представление. + + + + Error: could not delete the trigger. + Ошибка: не удалось удалить триггер. + + + + Error: could not delete the index. + Ошибка: не удалось удалить индекс. + + + + Message from database engine: +%1 + Сообщение от СУБД: +%1 + + + + Editing the table requires to save all pending changes now. +Are you sure you want to save the database? + Для редактирования таблицы необходимо сохранить все ожидающие изменения сейчас. +Вы действительно хотите сохранить БД? + + + + -- EXECUTING SELECTION IN '%1' +-- + -- ВЫПОЛНЕНИЕ ВЫБОРКИ В '%1' +-- + + + + -- EXECUTING LINE IN '%1' +-- + -- ВЫПОЛНЕНИЕ СТРОКИ В '%1' +-- + + + + -- EXECUTING ALL IN '%1' +-- + -- ВЫПОЛНЕНИЕ ВСЕ В '%1' +-- + + + Setting PRAGMA values or vacuuming will commit your current transaction. Are you sure? - + Установка значений PRAGMA или вакуумирования приведет к фиксации текущей транзакции. +Уверены ли вы? + + + + executing query + + + + + %1 rows returned in %2ms + %1 строк возвращено за %2мс + + + + query executed successfully. Took %1ms%2 + запрос успешно выполнен. Заняло %1мс%2 + + + + -- At line %1: +%4 +-- Result: %3 + -- Строка %1: +%4 +-- Результат: %3 - + Choose text files - + Выберите текстовые файлы - - + + Import completed. Some foreign key constraints are violated. Please fix them before saving. + Импорт завершен. Нарушены некоторые ограничения внешних ключей. Пожалуйста, исправьте их перед сохранением. + + + Modify Index - + Модифицировать Индекс - - + Modify Table - + Модифицировать Таблицу - + Select SQL file to open Выбрать файл SQL для октрытия - + Couldn't read file: %1. - + Не удалось прочитать файл:%1. - + Couldn't save file: %1. - + Не удалось сохранить файл:%1. - + Select file name Выбрать имя файла - + Select extension file Выбрать расширение файла - + Extensions(*.so *.dll);;All files(*) Расширения(*.so *.dll);;Все файлы(*) - + Extension successfully loaded. Расширение успешно загружено. - - + Error loading extension: %1 Ошибка загрузки расширения: %1 - + + Don't show again Не показывать снова - + New version available. Доступна новая версия. + + Collation needed! Proceed? + Нужно выполнить сопоставление! Продолжить? + + + + A table in this database requires a special collation function '%1' that this application can't provide without further knowledge. +If you choose to proceed, be aware bad things can happen to your database. +Create a backup! + Таблица в базе данных требует выполнения специальной функции сопоставления '%1'. +Если вы продолжите, то возможна порча вашей базы данных. +Создайте резервную копию! + + + + creating collation + + + + + Set a new name for the SQL tab. Use the '&&' character to allow using the following character as a keyboard shortcut. + Задайте новое имя для вкладки SQL. Используйте символ '&&', чтобы разрешить использование следующего символа в качестве сочетания клавиш. + + + + Please specify the view name + Укажите имя представления + + + + There is already an object with that name. Please choose a different name. + Объект с указанным именем уже существует. Выберите другое имя. + + + + View successfully created. + Представление успешно создано. + + + + Error creating view: %1 + Ошибка создания представления: %1 + + + + There is no filter set for this table. View will not be created. + Для этой таблицы не установлен фильтр. Представление не будет создано. + + + + Delete Records + Удалить Записи + + + + This action will open a new SQL tab for running: + Это действие откроет новую вкладку SQL для запуска: + + + + Press Help for opening the corresponding SQLite reference page. + Нажмите "Справка" для открытия соответствующей справочной страницы SQLite. + + Choose a axis color Выбрать цвет осей @@ -2823,9 +4318,8 @@ PNG(*.png);;JPG(*.jpg);;PDF(*.pdf);;BMP(*.bmp);;Все файлы(*) - Choose a file to open - Выбрать файл для открытия + Выбрать файл для открытия Invalid file format. @@ -2833,189 +4327,294 @@ + NullLineEdit + + + Set to NULL + Установить в NULL + + + + Alt+Del + + + + PlotDock Plot - + График + + + + <html><head/><body><p>This pane shows the list of columns of the currently browsed table or the just executed query. You can select the columns that you want to be used as X or Y axis for the plot pane below. The table shows detected axis type that will affect the resulting plot. For the Y axis you can only select numeric columns, but for the X axis you will be able to select:</p><ul style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;"><li style=" margin-top:12px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Date/Time</span>: strings with format &quot;yyyy-MM-dd hh:mm:ss&quot; or &quot;yyyy-MM-ddThh:mm:ss&quot;</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Date</span>: strings with format &quot;yyyy-MM-dd&quot;</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Time</span>: strings with format &quot;hh:mm:ss&quot;</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Label</span>: other string formats. Selecting this column as X axis will produce a Bars plot with the column values as labels for the bars</li><li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Numeric</span>: integer or real values</li></ul><p>Double-clicking the Y cells you can change the used color for that graph.</p></body></html> + <html><head/><body><p>На этой панели отображается список столбцов текущей просматриваемой таблицы или только что выполненного запроса. Вы можете выбрать столбцы, которые вы хотите использовать в качестве оси X или Y для графика ниже. В таблице показан тип обнаруженной оси, который повлияет на итоговый график. Для оси Y вы можете выбирать только числовые столбцы, но для оси X вы можете выбрать:</p><ul style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;"><li style=" margin-top:12px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Дата/Время</span>: строки с форматом &quot;гггг-ММ-дд чч:мм:сс&quot; или &quot;гггг-ММ-ддTчч:мм:сс&quot;</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Дата</span>: строки с форматом &quot;гггг-ММ-дд&quot;</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Время</span>: строки с форматом &quot;чч:мм:сс&quot;</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Текст</span>: строки лубого формата. Выбор этого столбца по оси X приведет к созданию графика Баров, со значениями столбцов в качестве меток для баров</li><li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Числа</span>: целочисленные или вещественные значения</li></ul><p>Дважды щелкните по ячейкам Y, вы можете изменить используемый цвет для этого графика.</p></body></html> - + Columns - Столбцы + Столбцы - + X - X + X - + Y - Y + Y - _ - _ + _ + + + + Axis Type + Ось + + + + Here is a plot drawn when you select the x and y values above. + +Click on points to select them in the plot and in the table. Ctrl+Click for selecting a range of points. + +Use mouse-wheel for zooming and mouse drag for changing the axis range. + +Select the axes or axes labels to drag and zoom only in that orientation. + Вот график, нарисованный, когда вы выбираете значения x и y выше. + +Нажмите на пункты, чтобы выбрать их на графике и в таблице. Ctrl + Click для выбора диапазона точек. + +Используйте колесико мыши для масштабирования и перетаскивания мышью для изменения диапазона осей. + +Выберите метки осей или осей для перетаскивания и масштабирования только в этой ориентации. - + Line type: - Линия: + Линия: - - + + None - Нет + Нет - + Line - Обычная + Обычная - + StepLeft - Ступенчатая, слева + Ступенчатая, слева - + StepRight - Ступенчатая, справа + Ступенчатая, справа - + StepCenter - Ступенчатая, по центру + Ступенчатая, по центру - + Impulse - Импульс + Импульс - + Point shape: - Отрисовка точек: + Отрисовка точек: - + Cross - Крест + Крест - + Plus - Плюс + Плюс - + Circle - Круг + Круг - + Disc - Диск + Диск - + Square - Квадрат + Квадрат - + Diamond - Ромб + Ромб - + Star - Звезда + Звезда - + Triangle - Треугольник + Треугольник - + TriangleInverted - Треугольник перевернутый + Треугольник перевернутый - + CrossSquare - Крест в квадрате + Крест в квадрате - + PlusSquare - Плюс в квадрате + Плюс в квадрате - + CrossCircle - Крест в круге + Крест в круге - + PlusCircle - Плюс в круге + Плюс в круге - + Peace - Мир + Мир - + <html><head/><body><p>Save current plot...</p><p>File format chosen by extension (png, jpg, pdf, bmp)</p></body></html> - <html><head/><body><p>Сохранить текущий график...</p><p>Формат файла выбирается расширением (png, jpg, pdf, bmp)</p></body></html> + <html><head/><body><p>Сохранить текущий график...</p><p>Формат файла выбирается расширением (png, jpg, pdf, bmp)</p></body></html> - + Save current plot... - Сохранить текущий график... + Сохранить текущий график... + + + + + Load all data and redraw plot + Загрузить все данные и перерисовать - Load all data. This has only an effect if not all data has been fetched from the table yet due to the partial fetch mechanism. - Загружать все данные. Имеет эффект лишь если не все данные подгружены. + Загружать все данные. Имеет эффект лишь если не все данные подгружены. - - - + + + Row # - + Строка # - Choose a axis color - Выбрать цвет осей + Выбрать цвет осей + + + + Copy + Копировать + + + + Print... + Печать... + + + + Show legend + Легенда + + + + Stacked bars + + + + + Date/Time + Дата/Время + + + + Date + Дата + + + + Time + Время + + + + + Numeric + Число + + + + Label + Текст + + + + Invalid + Ошибка + + + + Load all data and redraw plot. +Warning: not all data has been fetched from the table yet due to the partial fetch mechanism. + Загружает все данные и перерисовыет график. +Предупреждение: не все данные были получены из таблицы из-за механизма частичной выборки. - + + Choose an axis color + Выберите цвет оси + + + Choose a filename to save under - Выбрать имя, под которым сохранить данные + Выбрать имя файла, под которым сохранить данные - + PNG(*.png);;JPG(*.jpg);;PDF(*.pdf);;BMP(*.bmp);;All Files(*) - PNG(*.png);;JPG(*.jpg);;PDF(*.pdf);;BMP(*.bmp);;Все файлы(*) + PNG(*.png);;JPG(*.jpg);;PDF(*.pdf);;BMP(*.bmp);;Все файлы(*) - - Fetching all data... - + + There are curves in this plot and the selected line style can only be applied to graphs sorted by X. Either sort the table or query by X to remove curves or select one of the styles supported by curves: None or Line. + На этом графике есть кривые, и выбранный стиль линии может применяться только к графикам, отсортированным по X. Либо сортируйте таблицу или запрос по X, чтобы удалить кривые, либо выберите один из стилей, поддерживаемых кривыми: None или Line. - Cancel - Отменить + Отменить @@ -3026,32 +4625,34 @@ Настройки - + &Database &База данных - + Database &encoding &Кодировка базы данных - + Open databases with foreign keys enabled. Открывать базы данных с включенными внешними ключами. - + &Foreign keys &Внешние ключи - - - - - - + + + + + + + + enabled включены @@ -3063,8 +4664,8 @@ - - + + ... ... @@ -3094,37 +4695,35 @@ &Язык - + Automatic &updates &Следить за обновлениями - + SQ&L to execute after opening database - + - + Data &Browser Обозреватель &данных - NULL fields - NULL поля + NULL поля - &Text - &Текст + &Текст - + Remove line breaks in schema &view Удалить переводы строки в &схеме данных - + Show remote options Опции "облака" @@ -3133,12 +4732,12 @@ Сервер - + Prefetch block si&ze Размер блока &упреждающей выборки - + Advanced Дополнительно @@ -3147,467 +4746,662 @@ SQL, который нужно выполнить после открытия БД - + Default field type Тип данных по умолчанию - + Font Шрифт - + &Font &Шрифт - Font si&ze: - Ра&змер шрифта: + Ра&змер шрифта: - + Content Содержимое - + Symbol limit in cell Количество символов в ячейке - Field colors - Цветовое оформление полей + Цветовое оформление полей - + NULL - + Regular Обычные - Text - Текст + Текст - + Binary Двоичные данные - + Background Фон - + Filters Фильтры - + Escape character Символ экранирования - + Delay time (&ms) Время задержки (&мс) - + Set the waiting time before a new filter value is applied. Can be set to 0 for disabling waiting. Время задержки перед применением нового фильтра. Нулевое значение отключает ожидание. - + &SQL Р&едактор SQL - + Settings name Имя настроек - + Context Контекст - + Colour Цвет - + Bold Жирный - + Italic Курсив - + Underline Подчёркивание - + Keyword Ключевое слово - function - функция + функция - + Function Функция - + Table Таблица - + Comment Комментарий - + Identifier Идентификатор - + String Строка - currentline - текущаястрока + текущаястрока - + Current line Текущая строка - + SQL &editor font size Размер шрифта в &редакторе SQL - SQL &log font size - Размер шрифта в &журнале SQL + Размер шрифта в &журнале SQL - + Tab size Размер табуляции - + SQL editor &font &Шрифт в редакторе SQL - + Error indicators Индикаторы ошибок - Enabling error indicators highlights the SQL code lines that caused errors during the last execution - Подсветка в SQL коде строк, выполнение которых привело к ошибкам + Подсветка в SQL коде строк, выполнение которых привело к ошибкам - + Hori&zontal tiling Гори&зонтальное распределение - + If enabled the SQL code editor and the result table view are shown side by side instead of one over the other. Если данная опция включена, то SQL редактор и результат запроса будут расположены рядом по горизонтали. - + Code co&mpletion Авто&дополнение кода - - &Extensions - Р&асширения + + Toolbar style + Стиль тулбара - - Select extensions to load for every database: - Выберите расширения, чтобы загружать их для каждой базы данных: + + Only display the icon + Только иконки - - Add extension - Добавить расширение + + Only display the text + Только текст - - Remove extension - Удалить расширение + + The text appears beside the icon + Текст над иконкой - - <html><head/><body><p>While supporting the REGEXP operator SQLite doesn't implement any regular expression<br/>algorithm but calls back the running application. DB Browser for SQLite implements this<br/>algorithm for you to let you use REGEXP out of the box. However, as there are multiple possible<br/>implementations of this and you might want to use another one, you're free to disable the<br/>application's implementation and load your own by using an extension. Requires restart of the application.</p></body></html> - <html><head/><body><p>Обозреватель для SQLite позволяет использовать оператор REGEXP 'из коробки'. Но тем <br/>не менее, возможны несколько различных вариантов реализаций данного оператора и вы свободны <br/>в выборе какую именно использовать. Можно отключить нашу реализацию и использовать другую - <br/>путем загрузки соответсвующего расширения. В этом случае требуется перезагрузка приложения.</p></body></html> + + The text appears under the icon + Текст под иконкой - - Disable Regular Expression extension - Отключить расширение Регулярных Выражений + + Follow the style + Указано в стиле - - Remote - Удаленный сервер + + DB file extensions + Расширения файлов БД - - CA certificates - + + Manage + Настроить - - - Subject CN - + + When enabled, the line breaks in the Schema column of the DB Structure tab, dock and printed output are removed. + Когда отмечено, переносы строк в столбце 'Схема' во вкладке 'Структура базы данных', 'док' и 'печатный результат' удаляются. - - Common Name - + + Font si&ze + Ра&змер шрифта - - Subject O - + + + This is the maximum number of rows in a table for enabling the value completion based on current values in the column. +Can be set to 0 for disabling completion. + Максимальное количество строк в таблице для включения завершения значения на основе текущих значений в столбце. +Может быть установлено в 0 для отключения завершения. - - Organization - + + Row count threshold for completion + Порог количества строк для начала работы дополнения - - - Valid from - + + Field display + Отображение поля - - - Valid to - + + Displayed &text + Отображаемый &текст - - - Serial number - + + Text color + Цвет текста - - Your certificates - + + Background color + Цвет фона - - File - File + + Preview only (N/A) + Предв. просмотр - - Subject Common Name - + + Foreground + Передний план - - Issuer CN - + + SQL &results font size + &Размер шрифта - + + &Wrap lines + &Перенос строк + + + + Never + Никогда + + + + At word boundaries + На границах слов + + + + At character boundaries + На границах символов + + + + At whitespace boundaries + На границах пробелов + + + + &Quotes for identifiers + Обравмление &идентификаторов + + + + Choose the quoting mechanism used by the application for identifiers in SQL code. + Выберите механизм обрамления, используемый приложением для идентификаторов в коде SQL. + + + + "Double quotes" - Standard SQL (recommended) + "Двойные кавычки" - Cтандартный SQL (рекомендуется) + + + + `Grave accents` - Traditional MySQL quotes + `Гравис` - Традиционные кавычки MySQL + + + + [Square brackets] - Traditional MS SQL Server quotes + [Квадратные скобки] - традиционные кавычки для MS SQL Server + + + + Keywords in &UPPER CASE + Ключевые слова в &ВЕРХНЕМ РЕГИСТРЕ + + + + When set, the SQL keywords are completed in UPPER CASE letters. + Когда отмечено, ключевые слова SQL будут в ВЕРХНЕМ РЕГИСТРЕ. + + + + When set, the SQL code lines that caused errors during the last execution are highlighted and the results frame indicates the error in the background + Когда установлено, строки кода SQL, вызвавшие ошибки во время последнего выполнения, подсвечиваются, а виджет результатов указывает на ошибку в фоновом режиме + + + + &Extensions + Р&асширения + + + + Select extensions to load for every database: + Выберите расширения, чтобы загружать их для каждой базы данных: + + + + Add extension + Добавить расширение + + + + Remove extension + Удалить расширение + + + + <html><head/><body><p>While supporting the REGEXP operator SQLite doesn't implement any regular expression<br/>algorithm but calls back the running application. DB Browser for SQLite implements this<br/>algorithm for you to let you use REGEXP out of the box. However, as there are multiple possible<br/>implementations of this and you might want to use another one, you're free to disable the<br/>application's implementation and load your own by using an extension. Requires restart of the application.</p></body></html> + <html><head/><body><p>Обозреватель для SQLite позволяет использовать оператор REGEXP 'из коробки'. Но тем <br/>не менее, возможны несколько различных вариантов реализаций данного оператора и вы свободны <br/>в выборе какую именно использовать. Можно отключить нашу реализацию и использовать другую - <br/>путем загрузки соответсвующего расширения. В этом случае требуется перезагрузка приложения.</p></body></html> + + + + Disable Regular Expression extension + Отключить расширение Регулярных Выражений + + + + <html><head/><body><p>SQLite provides an SQL function for loading extensions from a shared library file. Activate this if you want to use the <span style=" font-style:italic;">load_extension()</span> function from SQL code.</p><p>For security reasons, extension loading is turned off by default and must be enabled through this setting. You can always load extensions through the GUI, even though this option is disabled.</p></body></html> + + + + + Allow loading extensions from SQL code + + + + + Remote + Удаленный сервер + + + + CA certificates + СА сертификаты + + + + + Subject CN + + + + + Common Name + + + + + Subject O + + + + + Organization + + + + + + Valid from + + + + + + Valid to + + + + + + Serial number + + + + + Your certificates + Ваши сертификаты + + + + File + Файл + + + + Subject Common Name + + + + + Issuer CN + + + + Issuer Common Name - + Clone databases into - + Путь для клонируемых БД - - + + Choose a directory Выберать каталог - + The language will change after you restart the application. Язык будет применен после перезапуска приложения. - + Select extension file Выберать файл расширения - + Extensions(*.so *.dll);;All files(*) Расширения(*.so *.dll);;Все файлы(*) - + Import certificate file - + Импорт файла сертификата - + No certificates found in this file. - + В данном файле не найден сертификат. - + Are you sure you want do remove this certificate? All certificate data will be deleted from the application settings! - + Вы действительно хотите удалить этот сертификат? Все данные сертификата будут удалены из настроек приложения! + + + + Are you sure you want to clear all the saved settings? +All your preferences will be lost and default values will be used. + Вы действительно хотите удалить все сохраненные настройки? +Все ваши предпочтения будут потеряны, и будут использоваться значения по умолчанию. QObject - + Error importing data Ошибка импортирования данных - + from record number %1 с записи номер %1 - + . %1 - + + Importing CSV file... + Импортирование CSV файла... + + + Cancel Отменить - Decoding CSV file... - Расшифровка CSV файла... + Расшифровка CSV файла... - Collation needed! Proceed? - Нужно выполнить сопоставление! Продолжить? + Нужно выполнить сопоставление! Продолжить? - A table in this database requires a special collation function '%1' that this application can't provide without further knowledge. If you choose to proceed, be aware bad things can happen to your database. Create a backup! - Таблица в базе данных требует выполнения специальной функции сопоставления '%1'. + Таблица в базе данных требует выполнения специальной функции сопоставления '%1'. Если вы продолжите, то возможна порча вашей базы данных. Создайте резервную копию! - SQLite database files (*.db *.sqlite *.sqlite3 *.db3);;All files (*) - Файлы SQLite баз данных (*.db *.sqlite *.sqlite3 *.db3);;Все файлы (*) + Файлы SQLite баз данных (*.db *.sqlite *.sqlite3 *.db3);;Все файлы (*) + + + + All files (*) + Все файлы (*) + + + + SQLite database files (*.db *.sqlite *.sqlite3 *.db3) + Файлы SQLite баз данных (*.db *.sqlite *.sqlite3 *.db3) RemoteDatabase - + Error when connecting to %1. %2 - + Ошибка во время подключения к %1. +%2 - + Error opening remote file at %1. %2 - + Ошибка открытия файла %1. +%2 - + Error: Invalid client certificate specified. - + Ошибка: Указан неверный сертификат клиента. - + Please enter the passphrase for this client certificate in order to authenticate. - + Пожалуйста введите ключевую фразу для этого сертификата клиента. - + Cancel - Отменить + Отменить - + Uploading remote database to -%1. - +%1 + Загружается удаленная БД в +%1 - + Downloading remote database from -%1. - +%1 + Скачивается удаленная БД из +%1 - - + + The remote database has been updated since the last checkout. Do you want to update the local database to the newest version? Note that this discards any changes you have made locally! If you don't want to lose local changes, click No to open the local version. + Удаленная БД была обновлена со времени последней загрузки. Вы хотите обновить локальную базу данных до последней версии? Обратите внимание, что это отменяет любые изменения, внесенные вами локально! Если вы не хотите потерять локальные изменения, нажмите «Нет», чтобы открыть локальную версию. + + + + Error: The network is not accessible. - + Ошибка: сеть недоступна. - + Error: Cannot open the file for sending. - + Ошибка: не удается открыть файл для отправки. - + Error opening local databases list. %1 - + Ошибка при открытии списка локальных БД. +%1 - + Error creating local databases list. %1 - + Ошибка при создании списка локальных БД. +%1 @@ -3615,22 +5409,32 @@ Remote - Удаленный сервер + Удаленный сервер Identity - + ID + Connect to the remote server using the currently selected identity. The correct server is taken from the identity as well. + Подключение к удаленному серверу, используя выбранный ID. + + + Go - + Поехали - + Push currently opened database to server - + Отправить текущую БД на сервер + + + + <html><head/><body><p>In this pane, remote databases from dbhub.io website can be added to DB4S. First you need an identity:</p><ol style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;"><li style=" margin-top:12px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Login to the dbhub.io website (use your GitHub credentials or whatever you want)</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Click the button to create a DB4S certificate (that's your identity). That'll give you a certificate file (save it to your local disk).</li><li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Go to the Remote tab in DB4S Preferences. Click the button to add a new certificate to DB4S and choose the just downloaded certificate file.</li></ol><p>Now the Remote panel shows your identity and you can add remote databases.</p></body></html> + <html><head/><body><p>БД с сайта dbhub.io могут быть добавлены в DB4S. Для начала вам нужен ID:</p><ol style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;"><li style=" margin-top:12px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Войдите на сайт dbhub.io (можно использовать аккаунт GitHub или что хотите)</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Нажмите кнопку создать DB4S сертификат (это и есть ваш ID). Будет создан файл сертификата (сохраните его на локальном диске).</li><li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"Перейдите во вкладку Remote в настройках DB4S. Нажмите кнопку, чтобы добавить новый сертификат в DB4S, и выберите только что загруженный файл сертификата.</li></ol><p>Теперь во вкладке Remote должна отображаться ваш ID, и вы можете добавлять удаленные базы данных.</p></body></html> @@ -3638,7 +5442,7 @@ Name - Имя + Имя Version @@ -3647,22 +5451,22 @@ Last modified - + Изменен Size - + Размер Commit - + Коммит bytes - + байт @@ -3670,51 +5474,66 @@ Push database - + Отправить БД Database na&me to push to - + &Имя БД - + Commit message - + Сообщение - + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Oxygen-Sans'; font-size:10pt; font-weight:400; font-style:normal;"> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p></body></html> - + - + Database licence - + Лицензия - + Public - + Публичный + + + + Branch + Ветка - + + Force push + Принудительно + + + Database will be public. Everyone has read access to it. - + БД будет публичной. У каждого будет доступ на чтение к ней. - + Database will be private. Only you have access to it. - + БД будет конфиденциальной. Только у вас будет доступ к ней. - + + Use with care. This can cause remote commits to be deleted. + Используйте с осторожностью. Это может привести к удалению существующих коммитов. + + + Unspecified - + Неуказано @@ -3725,314 +5544,502 @@ Форма - + + Find previous match [Shift+F3] + Найти предыдущее совпадение [Shift+F3] + + + + Find previous match with mapping + Найти предыдущее совпадение, закольцевав поиск + + + + Shift+F3 + Shift+F3 + + + + The found pattern must be a whole word + Найденный шаблон должен быть целым словом + + + + Whole Words + Слова Полностью + + + + Text pattern to find considering the checks in this frame + Шаблон для поиска, учитывая все проверки + + + + Find in editor + Найти в редакторе + + + + The found pattern must match in letter case + У найденного шаблона должен совпадать регистр + + + + Case Sensitive + Учитывать Регистр + + + + Find next match [Enter, F3] + Найти следующее совпдение [Enter, F3] + + + + Find next match with wrapping + Найти следующее совпадение, закольцевав поиск + + + + F3 + F3 + + + + Interpret search pattern as a regular expression + Интерпретировать шаблон поиска как регулярное выражение + + + + <html><head/><body><p>When checked, the pattern to find is interpreted as a UNIX regular expression. See <a href="https://en.wikibooks.org/wiki/Regular_Expressions">Regular Expression in Wikibooks</a>.</p></body></html> + <html><head/><body><p>При проверке шаблон для поиска интерпретируется как регулярное выражение UNIX. <a href="https://en.wikibooks.org/wiki/Regular_Expressions">Узнать больше о Регулярных выражениях на Wikibooks.org</a>.</p></body></html> + + + + Regular Expression + Регулярное выражение + + + + + Close Find Bar + Закрыть Поисковую Панель + + + + Results of the last executed statements Результаты последних выполненных операторов - + This field shows the results and status codes of the last executed statements. - Это поле показывает результаты и коды статусов последних выполненных операторов. + Это поле показывает результаты и коды статусов последних выполненных операторов. - Export to &CSV - Экспортировать в &CSV + Экспортировать в &CSV - Save as &view - Сохранить как &представление + Сохранить как &представление - Save as view - Сохранить как представление + Сохранить как представление - Please specify the view name - Укажите имя представления + Укажите имя представления - There is already an object with that name. Please choose a different name. - Объект с указанным именем уже существует. Выберите другое имя. + Объект с указанным именем уже существует. Выберите другое имя. - View successfully created. - Представление успешно создано. + Представление успешно создано. - Error creating view: %1 - Ошибка создания представления: %1 + Ошибка создания представления: %1 SqlUiLexer - + (X) The abs(X) function returns the absolute value of the numeric argument X. (X) Функция abs(X) возвращает модуль числа аргумента X. - + () The changes() function returns the number of database rows that were changed or inserted or deleted by the most recently completed INSERT, DELETE, or UPDATE statement. () Функция changes() возвращает количество строк в базе данных, которые были изменены, вставлены или удалены после удачного выполнения INSERT, DELETE или UPDATE. - + (X1,X2,...) The char(X1,X2,...,XN) function returns a string composed of characters having the unicode code point values of integers X1 through XN, respectively. (X1,X2,...) Функция char(X1,X2,...,XN) возвращает строку составленную из символов, переданных в качестве аргументов. - + (X,Y,...) The coalesce() function returns a copy of its first non-NULL argument, or NULL if all arguments are NULL (X,Y,...) Функция coalesce() возвращает копию первого аргумента не равного NULL иначе если такого нет то возвращается NULL - + (X,Y) The glob(X,Y) function is equivalent to the expression "Y GLOB X". (X,Y) Функция glob(X,Y) эквивалент выражению "Y GLOB X". - + (X,Y) The ifnull() function returns a copy of its first non-NULL argument, or NULL if both arguments are NULL. (X,Y) Функция ifnull() возвращает копию первого аргумента не равного NULL иначе если оба аргумента равны NULL то возвращает NULL. - + (X,Y) The instr(X,Y) function finds the first occurrence of string Y within string X and returns the number of prior characters plus 1, or 0 if Y is nowhere found within X. (X,Y) Функция instr(X,Y) возвращает количество символов, начиная с которого в строке X найденна подстрока Y или 0 если таковая не обнаружена. - + (X) The hex() function interprets its argument as a BLOB and returns a string which is the upper-case hexadecimal rendering of the content of that blob. (X) Функция hex() интерпретирует аргумент как BLOB и возвращает строку в 16-ричной системе счисления с содержимым аргумента. - + () The last_insert_rowid() function returns the ROWID of the last row insert from the database connection which invoked the function. () Функция last_insert_rowid() возвращает ROWID последней вставленной строки. - + (X) For a string value X, the length(X) function returns the number of characters (not bytes) in X prior to the first NUL character. (X) Для строкового значения X, функция length(X) возвращает количество символов (не байт) от начала строки до первого символа '\0'. - + (X,Y) The like() function is used to implement the "Y LIKE X" expression. (X,Y) Фукнция like() эквивалент выражению "Y LIKE X". - + (X,Y,Z) The like() function is used to implement the "Y LIKE X ESCAPE Z" expression. (X,Y,Z) Функция like() эквивалент выражения "Y LIKE X ESCAPE Z". - (X) The load_extension(X) function loads SQLite extensions out of the shared library file named X. - (X) Функция load_extension(X) загружает расширение SQLite из файла библиотеки динамической компоновки X. + (X) Функция load_extension(X) загружает расширение SQLite из файла библиотеки динамической компоновки X. - (X,Y) The load_extension(X) function loads SQLite extensions out of the shared library file named X using the entry point Y. - (X,Y) Функция load_extension(X,Y) загружает расширение SQLite из файла библиотеки динамической компоновки X, используя точку входа Y. + (X,Y) Функция load_extension(X,Y) загружает расширение SQLite из файла библиотеки динамической компоновки X, используя точку входа Y. - + + (X) The load_extension(X) function loads SQLite extensions out of the shared library file named X. +Use of this function must be authorized from Preferences. + + + + + (X,Y) The load_extension(X) function loads SQLite extensions out of the shared library file named X using the entry point Y. +Use of this function must be authorized from Preferences. + + + + (X) The lower(X) function returns a copy of string X with all ASCII characters converted to lower case. (X) Функция lower(X) возвращает копию строки X, в которой все ACSII символы переведены в нижний регистр. - + (X) ltrim(X) removes spaces from the left side of X. (X) ltrim(X) удаляет символы пробелов слева для строки X. - + (X,Y) The ltrim(X,Y) function returns a string formed by removing any and all characters that appear in Y from the left side of X. (X,Y) Функция ltrim(X,Y) возвращает новую строку путем удаления из строки X слева любого символа из Y. - + (X,Y,...) The multi-argument max() function returns the argument with the maximum value, or return NULL if any argument is NULL. (X,Y,...) Функция max() возвращает аргумент с максимальным значением, либо NULL если хотябы один аргумент равен NULL. - + (X,Y,...) The multi-argument min() function returns the argument with the minimum value. (X,Y,...) Функция min() возвращает аргумент с минимальным значением. - + (X,Y) The nullif(X,Y) function returns its first argument if the arguments are different and NULL if the arguments are the same. (X,Y) Функция nullif(X,Y) возвращает первый аргумент если аргументы различны либо NULL если они одинаковы. - + (FORMAT,...) The printf(FORMAT,...) SQL function works like the sqlite3_mprintf() C-language function and the printf() function from the standard C library. (FORMAT,...) Функция printf(FORMAT,...) работает так же как printf() из стандартной библиотеки языка программирования Си. - + (X) The quote(X) function returns the text of an SQL literal which is the value of its argument suitable for inclusion into an SQL statement. (X) Функция quote(X) возвращает измененную строку X, которую можно использовать в SQL выражениях. - + () The random() function returns a pseudo-random integer between -9223372036854775808 and +9223372036854775807. () Функция random() возвращает псевдо случайное целочисленное значение из диапозона от-9223372036854775808 до +9223372036854775807. - + (N) The randomblob(N) function return an N-byte blob containing pseudo-random bytes. (N) Функция randomblob(N) возвращает N-байтный BLOB, содержащий псевдо случайные байты. - + (X,Y,Z) The replace(X,Y,Z) function returns a string formed by substituting string Z for every occurrence of string Y in string X. (X,Y,Z) Функция replace(X,Y,Z) возвращает новую строку на основе строки X, заменой всех подстрок Y на Z. - + (X) The round(X) function returns a floating-point value X rounded to zero digits to the right of the decimal point. (X) Функция round(X) округляет X до целого значения. - + (X,Y) The round(X,Y) function returns a floating-point value X rounded to Y digits to the right of the decimal point. (X,Y) Функция round(X,Y) округляет X до Y чисел после запятой справа. - + (X) rtrim(X) removes spaces from the right side of X. (X) rtrim(X) удаляет символы пробела справа строки X. - + (X,Y) The rtrim(X,Y) function returns a string formed by removing any and all characters that appear in Y from the right side of X. (X,Y) Функция rtrim(X,Y) возвращает новую строку путем удаления из строки X справа любого символа из строки Y. - + (X) The soundex(X) function returns a string that is the soundex encoding of the string X. (X) Функция soundex(X) возвращает копию строки X, кодированную в формате soundex. - + (X,Y) substr(X,Y) returns all characters through the end of the string X beginning with the Y-th. (X,Y) substr(X,Y) возвращает подстроку из строки X, начиная с Y-го символа. - + (X,Y,Z) The substr(X,Y,Z) function returns a substring of input string X that begins with the Y-th character and which is Z characters long. (X,Y,Z) Функция substr(X,Y,Z) возвращает подстроку из строки X, начиная с Y-го символа, длинной Z-символов. - + () The total_changes() function returns the number of row changes caused by INSERT, UPDATE or DELETE statements since the current database connection was opened. () Функция total_changes() возвращает количество строк измененных с помощью INSERT, UPDATE или DELETE, начиная с того момента как текущее подключение к базе данных было открыто. - + (X) trim(X) removes spaces from both ends of X. (X) trim(X) удаляет пробелы с обоих сторон строки X. - + (X,Y) The trim(X,Y) function returns a string formed by removing any and all characters that appear in Y from both ends of X. (X,Y) Функция trim(X,Y) создает новую строку из X, путем удаления с обоих концов символов, которые присутсвуют в строке Y. - + (X) The typeof(X) function returns a string that indicates the datatype of the expression X. (X) Функция typeof(X) возвращает строку с типом данных выражения X. - + (X) The unicode(X) function returns the numeric unicode code point corresponding to the first character of the string X. (X) Функция unicode(X) возвращает числовое значение UNICODE кода символа. - + (X) The upper(X) function returns a copy of input string X in which all lower-case ASCII characters are converted to their upper-case equivalent. (X) Функция upper(X) возвращает копию строки X, в которой для каждого ASCII символа регистр будет перобразован из нижнего в верхний. - + (N) The zeroblob(N) function returns a BLOB consisting of N bytes of 0x00. (N) Функция zeroblob(N) возвращает BLOB размером N байт со значениями 0x00. - - - - + + + + (timestring,modifier,modifier,...) - + (format,timestring,modifier,modifier,...) - + (X) The avg() function returns the average value of all non-NULL X within a group. (X) Функция avg() возвращает среднее значение для всех не равных NULL значений группы. - + (X) The count(X) function returns a count of the number of times that X is not NULL in a group. (X) Функция count(X) возвращает количество строк, в которых X не равно NULL в группе. - + (X) The group_concat() function returns a string which is the concatenation of all non-NULL values of X. (X) Функция group_concat() возвращает строку из всех значений X не равных NULL. - + (X,Y) The group_concat() function returns a string which is the concatenation of all non-NULL values of X. If parameter Y is present then it is used as the separator between instances of X. (X,Y) Функция group_concat() возвращает строку из всех значений X не равных NULL. Y - разделитель между значениями X. - + (X) The max() aggregate function returns the maximum value of all values in the group. (X) Аггрегатная функция max() возвращает максимальное значение для X. - + (X) The min() aggregate function returns the minimum non-NULL value of all values in the group. (X) Аггрегатная функция min() возвращает минимальное значение для X. - - + + (X) The sum() and total() aggregate functions return sum of all non-NULL values in the group. (X) Аггрегатные функции sum() и total() возвращают сумму всех не NULL значений для X. + + + () The number of the row within the current partition. Rows are numbered starting from 1 in the order defined by the ORDER BY clause in the window definition, or in arbitrary order otherwise. + () Число строк в текущем разделе. Строки нумеруются начиная с 1 в порядке, определенном выражением ORDER BY, или иначе в произвольном порядке. + + + + () The row_number() of the first peer in each group - the rank of the current row with gaps. If there is no ORDER BY clause, then all rows are considered peers and this function always returns 1. + () Функция row_number() возвращает номер первой строки в каждой группе - ранг текущей строки с разрывами. Если не существует выражения ORDER BY, все строки считаются одноранговыми, и эта функция всегда возвращает 1. + + + + () The number of the current row's peer group within its partition - the rank of the current row without gaps. Partitions are numbered starting from 1 in the order defined by the ORDER BY clause in the window definition. If there is no ORDER BY clause, then all rows are considered peers and this function always returns 1. + () Число одноранговой группы текущей строки в своем разделе - ранг текущей строки без пробелов. Разделы нумеруются, начиная с 1 в порядке, определенном выражением ORDER BY в определении окна. Если не существует предложения ORDER BY, все строки считаются одноранговыми, и эта функция всегда возвращает 1. + + + + () Despite the name, this function always returns a value between 0.0 and 1.0 equal to (rank - 1)/(partition-rows - 1), where rank is the value returned by built-in window function rank() and partition-rows is the total number of rows in the partition. If the partition contains only one row, this function returns 0.0. + () Несмотря на имя, эта функция всегда возвращает значение между 0.0 и 1.0, равное (rank-1) / (partition-rows-1), где rank - это значение, возвращаемое встроенной функцией window rank () rows - это общее количество строк в разделе. Если раздел содержит только одну строку, эта функция возвращает 0.0. + + + + () The cumulative distribution. Calculated as row-number/partition-rows, where row-number is the value returned by row_number() for the last peer in the group and partition-rows the number of rows in the partition. + () Кумулятивное распределение. Рассчитывается как номер-строки / строки-раздела, где номер-строки - это значение, возвращаемое row_number() для последнего однорангового узла в группе, а строки-раздела- количество строк в разделе. + + + + (N) Argument N is handled as an integer. This function divides the partition into N groups as evenly as possible and assigns an integer between 1 and N to each group, in the order defined by the ORDER BY clause, or in arbitrary order otherwise. If necessary, larger groups occur first. This function returns the integer value assigned to the group that the current row is a part of. + (N) Аргумент N обрабатывается как целое число. Эта функция делит раздел на N групп как можно более равномерно и назначает целое число от 1 до N каждой группе в порядке, определенном выражением ORDER BY, или в произвольном порядке, при его отсутствии. При необходимости сначала появляются большие группы. Эта функция возвращает целочисленное значение, присвоенное группе, в которой находится текущая строка. + + + + (expr) Returns the result of evaluating expression expr against the previous row in the partition. Or, if there is no previous row (because the current row is the first), NULL. + (expr) Возвращает результат вычисления выражения expr в предыдущей строке раздела. Или, если нет предыдущей строки (поскольку текущая строка является первой), NULL. + + + + (expr,offset) If the offset argument is provided, then it must be a non-negative integer. In this case the value returned is the result of evaluating expr against the row offset rows before the current row within the partition. If offset is 0, then expr is evaluated against the current row. If there is no row offset rows before the current row, NULL is returned. + (expr, offset) Если аргумент offset укзан, то он должен быть неотрицательным целым числом. В этом случае возвращаемое значение является результатом вычисления expr в строках смещения строк до текущей строки в разделе. Если смещение равно 0, то expr вычисляется относительно текущей строки. Если перед текущей строкой нет строк смещения строк, возвращается NULL. + + + + + (expr,offset,default) If default is also provided, then it is returned instead of NULL if the row identified by offset does not exist. + (expr, offset, default) Если задано значение по умолчанию, оно возвращается вместо NULL, если строка, идентифицированная с помощью смещения, не существует. + + + + (expr) Returns the result of evaluating expression expr against the next row in the partition. Or, if there is no next row (because the current row is the last), NULL. + (expr) Возвращает результат вычисления выражения expr в следующей строке раздела. Или, если нет следующей строки (поскольку последняя строка является последней), NULL. + + + + (expr,offset) If the offset argument is provided, then it must be a non-negative integer. In this case the value returned is the result of evaluating expr against the row offset rows after the current row within the partition. If offset is 0, then expr is evaluated against the current row. If there is no row offset rows after the current row, NULL is returned. + (expr, offset) Если аргумент offset указан, то он должен быть неотрицательным целым числом. В этом случае возвращаемое значение является результатом вычисления expr в строках смещения строк после текущей строки в разделе. Если смещение равно 0, то expr вычисляется относительно текущей строки. Если после текущей строки нет строк смещения строки, возвращается NULL. + + + + (expr) This built-in window function calculates the window frame for each row in the same way as an aggregate window function. It returns the value of expr evaluated against the first row in the window frame for each row. + (expr) Эта встроенная Оконная Функция вычисляет Оконный Кадр для каждой строки так же, как Функция Окна агрегата. Она возвращает значение выполнения выражения expr, оцениваемое по отношению к первой строке в оконном фрейме для каждой строки. + + + + (expr) This built-in window function calculates the window frame for each row in the same way as an aggregate window function. It returns the value of expr evaluated against the last row in the window frame for each row. + (expr) Эта встроенная Оконная Функция вычисляет Оконный Кадр для каждой строки так же, как Функция Окна агрегата. Она возвращает значение выполнения выражения expr, оцениваемое по отношению к последней строке в оконном фрейме для каждой строки. + (expr) Эта встроенная функция окна вычисляет оконный кадр для каждой строки так же, как функция окна агрегата. Он возвращает значение expr, оцениваемое по последней строке в оконном фрейме для каждой строки. + + + + (expr,N) This built-in window function calculates the window frame for each row in the same way as an aggregate window function. It returns the value of expr evaluated against the row N of the window frame. Rows are numbered within the window frame starting from 1 in the order defined by the ORDER BY clause if one is present, or in arbitrary order otherwise. If there is no Nth row in the partition, then NULL is returned. + (expr, N) Эта встроенная функция окна вычисляет оконный фрейм для каждой строки так же, как функция окна агрегата. Она возвращает значение выполнения выражения expr, оцениваемое по строке N оконного фрейма. Строки нумеруются в рамке окна, начиная с 1 в порядке, определенном выражением ORDER BY, если оно присутствует, или в произвольном порядке в противном случае. Если в разделе нет N-й строки, возвращается NULL. + SqliteTableModel - References %1(%2) Hold Ctrl+Shift and click to jump there - Ссылается на %1(%2) + Ссылается на %1(%2) Нажмите Ctrl+Shift и клик чтобы переместиться туда - + + reading rows + читаем строки + + + + loading... + загрузка... + + + + References %1(%2) +Hold %3Shift and click to jump there + Ссылается на %1(%2) +Нажмите %3Shift и клик чтобы переместиться туда + + + Error changing data: %1 Ошибка изменения данных: %1 + + + retrieving list of columns + получаем список колонок + + + + Fetching data... + Подгружаем данные... + + + + Cancel + Отменить + VacuumDialog @@ -4044,13 +6051,21 @@ - Warning: Compacting the database will commit all changes you made. + Warning: Compacting the database will commit all of your changes. Предупреждение: Уплотнение базы данных зафиксирует все изменения, которые были сделаны. + Please select the databases to co&mpact: + Выберите объекты для &уплотнения: + + + Warning: Compacting the database will commit all changes you made. + Предупреждение: Уплотнение базы данных зафиксирует все изменения, которые были сделаны. + + Please select the objects to compact: - Выберите объекты для уплотнения: + Выберите объекты для уплотнения: diff -Nru sqlitebrowser-3.10.100ubuntu1/src/translations/sqlb_tr.ts sqlitebrowser-3.11.1/src/translations/sqlb_tr.ts --- sqlitebrowser-3.10.100ubuntu1/src/translations/sqlb_tr.ts 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/src/translations/sqlb_tr.ts 2019-02-19 23:51:34.000000000 +0000 @@ -15,45 +15,144 @@ - <html><head/><body><p>DB Browser for SQLite is an open source, freeware visual tool used to create, design and edit SQLite database files.</p><p>It is bi-licensed under the Mozilla Public License Version 2, as well as the GNU General Public License Version 3 or later. You can modify or redistribute it under the conditions of these licenses.</p><p>See <a href="http://www.gnu.org/licenses/gpl.html"><span style=" text-decoration: underline; color:#0000ff;">http://www.gnu.org/licenses/gpl.html</span></a> and <a href="https://www.mozilla.org/MPL/2.0/index.txt"><span style=" text-decoration: underline; color:#0000ff;">https://www.mozilla.org/MPL/2.0/index.txt</span></a> for details.</p><p>For more information on this program please visit our website at: <a href="http://sqlitebrowser.org"><span style=" text-decoration: underline; color:#0000ff;">http://sqlitebrowser.org</span></a></p><p><span style=" font-size:small;">This software uses the GPL/LGPL Qt Toolkit from </span><a href="http://qt-project.org/"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://qt-project.org/</span></a><span style=" font-size:small;"><br/>See </span><a href="http://qt-project.org/doc/qt-5/licensing.html"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://qt-project.org/doc/qt-5/licensing.html</span></a><span style=" font-size:small;"> for licensing terms and information.</span></p><p><span style=" font-size:small;">It also uses the Silk icon set by Mark James licensed under a Creative Commons Attribution 2.5 and 3.0 license.<br/>See </span><a href="http://www.famfamfam.com/lab/icons/silk/"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://www.famfamfam.com/lab/icons/silk/</span></a><span style=" font-size:small;"> for details.</span></p></body></html> - <html><head/><body><p>SQLite DB Browser, SQLite veritabanlarını tasarlamak ve düzenlemek için kullanılan, açık kaynak kodlu, ücretsiz bir görsel araçtır.</p><p>Bu program 'Mozilla Ortak Lisans Versiyon 2' altında lisanslanmasının yanı sıra 'GNU Genel Ortak Lisansı Versiyon 3 veya üzeri' lisansa sahiptir. Bu programı, lisans koşulları çerçevesinde değiştirebilir ve yeniden dağıtabilirsiniz.</p><p>Detaylı bilgiler için <a href="http://www.gnu.org/licenses/gpl.html"><span style=" text-decoration: underline; color:#0000ff;">http://www.gnu.org/licenses/gpl.html</span></a> ve <a href="https://www.mozilla.org/MPL/2.0/index.txt"><span style=" text-decoration: underline; color:#0000ff;">https://www.mozilla.org/MPL/2.0/index.txt</span></a> adreslerine bakabilirsiniz.</p><p>Program üzerine daha fazla bilgiye ulaşmak için web sitemizi ziyaret edebilirsiniz: <a href="http://sqlitebrowser.org"><span style=" text-decoration: underline; color:#0000ff;">http://sqlitebrowser.org</span></a></p><p><span style=" font-size:small;">Bu program belirtilen adresteki GPL/LGPL Qt Toolkit kullanmaktadır: </span><a href="http://qt-project.org/"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://qt-project.org/</span></a><span style=" font-size:small;"><br/>Lisans koşulları için şurayı ziyaret edin: </span><a href="http://qt-project.org/doc/qt-5/licensing.html"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://qt-project.org/doc/qt-5/licensing.html</span></a><span style=" font-size:small;"></span></p><p><span style=" font-size:small;">Ayrıca bu program, Mark James tarafından sağlanan Creative Commons Attribution 2.5 ve 3.0 lisansına sahip Silk ikon setini kullanmaktadır.<br/>Detaylar için: </span><a href="http://www.famfamfam.com/lab/icons/silk/"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://www.famfamfam.com/lab/icons/silk/</span></a><span style=" font-size:small;"></span></p></body></html> + <html><head/><body><p>DB Browser for SQLite is an open source, freeware visual tool used to create, design and edit SQLite database files.</p><p>It is bi-licensed under the Mozilla Public License Version 2, as well as the GNU General Public License Version 3 or later. You can modify or redistribute it under the conditions of these licenses.</p><p>See <a href="http://www.gnu.org/licenses/gpl.html">http://www.gnu.org/licenses/gpl.html</a> and <a href="https://www.mozilla.org/MPL/2.0/index.txt">https://www.mozilla.org/MPL/2.0/index.txt</a> for details.</p><p>For more information on this program please visit our website at: <a href="http://sqlitebrowser.org">http://sqlitebrowser.org</a></p><p><span style=" font-size:small;">This software uses the GPL/LGPL Qt Toolkit from </span><a href="http://qt-project.org/"><span style=" font-size:small;">http://qt-project.org/</span></a><span style=" font-size:small;"><br/>See </span><a href="http://qt-project.org/doc/qt-5/licensing.html"><span style=" font-size:small;">http://qt-project.org/doc/qt-5/licensing.html</span></a><span style=" font-size:small;"> for licensing terms and information.</span></p><p><span style=" font-size:small;">It also uses the Silk icon set by Mark James licensed under a Creative Commons Attribution 2.5 and 3.0 license.<br/>See </span><a href="http://www.famfamfam.com/lab/icons/silk/"><span style=" font-size:small;">http://www.famfamfam.com/lab/icons/silk/</span></a><span style=" font-size:small;"> for details.</span></p></body></html> + + + + <html><head/><body><p>DB Browser for SQLite is an open source, freeware visual tool used to create, design and edit SQLite database files.</p><p>It is bi-licensed under the Mozilla Public License Version 2, as well as the GNU General Public License Version 3 or later. You can modify or redistribute it under the conditions of these licenses.</p><p>See <a href="http://www.gnu.org/licenses/gpl.html"><span style=" text-decoration: underline; color:#0000ff;">http://www.gnu.org/licenses/gpl.html</span></a> and <a href="https://www.mozilla.org/MPL/2.0/index.txt"><span style=" text-decoration: underline; color:#0000ff;">https://www.mozilla.org/MPL/2.0/index.txt</span></a> for details.</p><p>For more information on this program please visit our website at: <a href="https://sqlitebrowser.org"><span style=" text-decoration: underline; color:#0000ff;">https://sqlitebrowser.org</span></a></p><p><span style=" font-size:small;">This software uses the GPL/LGPL Qt Toolkit from </span><a href="http://qt-project.org/"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://qt-project.org/</span></a><span style=" font-size:small;"><br/>See </span><a href="http://qt-project.org/doc/qt-5/licensing.html"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://qt-project.org/doc/qt-5/licensing.html</span></a><span style=" font-size:small;"> for licensing terms and information.</span></p><p><span style=" font-size:small;">It also uses the Silk icon set by Mark James licensed under a Creative Commons Attribution 2.5 and 3.0 license.<br/>See </span><a href="http://www.famfamfam.com/lab/icons/silk/"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://www.famfamfam.com/lab/icons/silk/</span></a><span style=" font-size:small;"> for details.</span></p></body></html> + <html><head/><body><p>SQLite DB Browser, SQLite veritabanlarını tasarlamak ve düzenlemek için kullanılan, açık kaynak kodlu, ücretsiz bir görsel araçtır.</p><p>Bu program 'Mozilla Ortak Lisans Versiyon 2' altında lisanslanmasının yanı sıra 'GNU Genel Ortak Lisansı Versiyon 3 veya üzeri' lisansa sahiptir. Bu programı, lisans koşulları çerçevesinde değiştirebilir ve yeniden dağıtabilirsiniz.</p><p>Detaylı bilgiler için <a href="http://www.gnu.org/licenses/gpl.html"><span style=" text-decoration: underline; color:#0000ff;">http://www.gnu.org/licenses/gpl.html</span></a> ve <a href="https://www.mozilla.org/MPL/2.0/index.txt"><span style=" text-decoration: underline; color:#0000ff;">https://www.mozilla.org/MPL/2.0/index.txt</span></a> adreslerine bakabilirsiniz.</p><p>Program üzerine daha fazla bilgiye ulaşmak için web sitemizi ziyaret edebilirsiniz: <a href="https://sqlitebrowser.org"><span style=" text-decoration: underline; color:#0000ff;">https://sqlitebrowser.org</span></a></p><p><span style=" font-size:small;">Bu program belirtilen adresteki GPL/LGPL Qt Toolkit kullanmaktadır: </span><a href="http://qt-project.org/"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://qt-project.org/</span></a><span style=" font-size:small;"><br/>Lisans koşulları için şurayı ziyaret edin: </span><a href="http://qt-project.org/doc/qt-5/licensing.html"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://qt-project.org/doc/qt-5/licensing.html</span></a><span style=" font-size:small;"></span></p><p><span style=" font-size:small;">Ayrıca bu program, Mark James tarafından sağlanan Creative Commons Attribution 2.5 ve 3.0 lisansına sahip Silk ikon setini kullanmaktadır.<br/>Detaylar için: </span><a href="http://www.famfamfam.com/lab/icons/silk/"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://www.famfamfam.com/lab/icons/silk/</span></a><span style=" font-size:small;"></span></p></body></html> + + + + (based on SQLite %1) + - + Version Versiyon - + Qt Version Qt Versiyonu - + SQLCipher Version SQLCipher Versiyonu - + SQLite Version SQLite Versiyonu + AddRecordDialog + + + Add New Record + + + + + Enter values for the new record considering constraints. Fields in bold are mandatory. + + + + + In the Value column you can specify the value for the field identified in the Name column. The Type column indicates the type of the field. Default values are displayed in the same style as NULL values. + + + + + Name + İsim + + + + Type + Tip + + + + Value + + + + + Values to insert. Pre-filled default values are inserted automatically unless they are changed. + + + + + When you edit the values in the upper frame, the SQL query for inserting this new record is shown here. You can edit manually the query before saving. + + + + + <html><head/><body><p><span style=" font-weight:600;">Save</span> will submit the shown SQL statement to the database for inserting the new record.</p><p><span style=" font-weight:600;">Restore Defaults</span> will restore the initial values in the <span style=" font-weight:600;">Value</span> column.</p><p><span style=" font-weight:600;">Cancel</span> will close this dialog without executing the query.</p></body></html> + + + + + Auto-increment + + + + + + Unique constraint + + + + + + Check constraint: %1 + + + + + + Foreign key: %1 + + + + + + Default value: %1 + + + + + + Error adding record. Message from database engine: + +%1 + + + + + Are you sure you want to restore all the entered values to their defaults? + + + + Application - + Usage: %1 [options] [db] Kullanım: %1 [options] [db] - + Possible command line arguments: Muhtemel komut satırı argümanları: - + -h, --help Show command line options -h, --help Komut satırı seçeneklerini göster @@ -62,52 +161,67 @@ -s, --sql [file] veritabanını açtıktan sonra SQL dosyasını yürüt - + -s, --sql [file] Execute this SQL file after opening the DB - + -t, --table [table] Browse this table after opening the DB - + -q, --quit Exit application after running scripts -q, --quit Scriptleri çalıştırdıktan sonra programı kapat - + + -R, --read-only Open database in read-only mode + + + + + -o, --option [group/setting=value] Run application with this setting temporarily set to value + + + + -v, --version Display the current version - + [file] Open this SQLite database [file] SQLite veritabanını aç - - This is DB Browser for SQLite version %1%2. + + This is DB Browser for SQLite version %1. - + The -s/--sql option requires an argument -s/--sql opsiyonu argüman gerektirir - + The file %1 does not exist %1 dosyası mevcut değil - + The -t/--table option requires an argument - + + The -o/--option option requires an argument in the form group/setting=value + + + + Invalid option/non-existant file: %1 Geçersiz seçenek veya mevcut olmayan dosya: %1 @@ -135,12 +249,12 @@ - + Passphrase - + Raw key @@ -149,7 +263,7 @@ &Sayfa boyutu - + Please set a key to encrypt the database. Note that if you change any of the other, optional, settings you'll need to re-enter them as well every time you open the database file. Leave the password fields empty to disable the encryption. @@ -161,7 +275,7 @@ - + Please enter the key used to encrypt the database. If any of the other settings were altered for this database file you need to provide this information as well. Lütfen veritabanınızı şifrelemek için kullandığınız anahtarı giriniz. @@ -191,67 +305,82 @@ - + Decimal number - + Exponent notation - + Hex blob - + Hex number - + Apple NSDate to date - + + Java epoch (milliseconds) to date + + + + Julian day to date - + + Unix epoch to local time + + + + + Date as dd/mm/yyyy + + + + Lower case - + Octal number - + Round number - + Unix epoch to date - + Upper case - + Windows DATE to date - + Custom @@ -263,38 +392,38 @@ hata yok - + Please specify the database name under which you want to access the attached database Lütfen veritabanının ismini erişmek istediğiniz bağlı veritabanının altında belirtin - + Invalid file format - + Do you want to save the changes made to the database file %1? %1 veritabanı dosyasında yaptığınız değişiklikleri kaydetmek istiyor musunuz? - + Exporting database to SQL file... veritabanı SQL dosyası olarak dışa aktarılıyor... - - + + Cancel İptal - + Executing SQL... SQL yürütülüyor... - + Action cancelled. İşlem iptal edildi. @@ -308,51 +437,87 @@ Sütunu Yeniden Adlandırma: %1 tablosu bulunamadı. - - + + This database has already been attached. Its schema name is '%1'. + + + + + Do you really want to close this temporary database? All data will be lost. + + + + + The database is currently busy: + + + + + Do you want to abort that other operation? + + + + + + No database file opened + + + + + Error in statement #%1: %2. Aborting execution%3. - - + + and rolling back - + + Cannot delete this object + + + + Cannot set data on this object - + + A table with the name '%1' already exists in schema '%2'. + + + + renameColumn: cannot find column %1. Sütunu Yeniden Adlandırma: %1 sütunu bulunamadı. - + renameColumn: creating savepoint failed. DB says: %1 Sütunu Yeniden Adlandırma: Kayıt noktası oluşturma başarısız. veritabanı mesajı: %1 - + renameColumn: creating new table failed. DB says: %1 Sütunu Yeniden Adlandırma: Yeni tablo oluşturma başarısız. veritabanı mesajı: %1 - + renameColumn: copying data to new table failed. DB says: %1 Sütunu Yeniden Adlandırma: Verileri yeni veritabanına kopyalama başarısız. veritabanı mesajı: %1 - + renameColumn: deleting old table failed. DB says: %1 Sütunu Yeniden Adlandırma: Eski veritabanı silme işlemi başarısız. veritabanı mesajı: %1 - + Restoring some of the objects associated with this table failed. This is most likely because some column names changed. Here's the SQL statement which you might want to fix and execute manually: @@ -361,23 +526,33 @@ - + renameColumn: releasing savepoint failed. DB says: %1 Sütun Yeniden Adlandırma: Kayıt noktası işlemi sonlandırılırken hata oluştu. veritabanı mesajı: %1 - + Error renaming table '%1' to '%2'.Message from database engine: %3 Tablo '%1' isminden '%2' ismine yeniden adlandırılırken hata oluştu. veritabanı motorunun mesajı: %3 - + ... <string can not be logged, contains binary data> ... ... <dize ikili veri içeriyor, günlüğe yazılamadı> ... - + + could not get list of databases: %1 + + + + + Error loading extension: %1 + Eklenti yüklenirken hata oluştu: %1 + + + could not get column information @@ -386,7 +561,7 @@ bilinmeyen nesne tipi %1 - + could not get list of db objects: %1, %2 veritabanı nesnelerinin listesi alınamadı: %1, %2 @@ -395,22 +570,22 @@ tipler alınamadı - + didn't receive any output from pragma %1 %1 pragmasından herhangi bir çıktı alınamadı - + could not execute pragma command: %1, %2 pragma komutu yürütülemedi: %1, %2 - + Error setting pragma %1 to %2: %3 Belirtilen pragma ayarlanırken hata oluştu: %1 > %2: %3 - + File not found. Dosya bulunamadı. @@ -418,52 +593,62 @@ DbStructureModel - + Name İsim - + Object Nesne - + Type Tip - + Schema Şema - - Browsables (%1) + + Database + + + + + Browsables - + All - + + Temporary + + + + Tables (%1) Tablolar (%1) - + Indices (%1) İndeksler (%1) - + Views (%1) Görünümler (%1) - + Triggers (%1) Tetikleyiciler (%1) @@ -481,63 +666,179 @@ - - + + This is the list of supported modes for the cell editor. Choose a mode for viewing or editing the data of the current cell. + + + + Image + + JSON + + + + + XML + + + + + + Automatically adjust the editor mode to the loaded data type + + + - Import text - Metin aktar + This checkable button enables or disables the automatic switching of the editor mode. When a new cell is selected or new data is imported and the automatic switching is enabled, the mode adjusts to the detected data type. You can then change the editor mode manually. If you want to keep this manually switched mode while moving through the cells, switch the button off. + + Auto-switch + + + + + + Auto-format: pretty print on loading, compact on saving. + + + + + When enabled, the auto-format feature formats the data on loading, breaking the text in lines and indenting it for maximum readability. On data saving, the auto-format feature compacts the data removing end of lines, and unnecessary whitespace. + + + + + Autoformat + + + + + Import from file + + + + + Opens a file dialog used to import any kind of data to this database cell. + + + + + Export to file + + + + + Opens a file dialog used to export the contents of this database cell to a file. + + + + + + Print... + + + + + Open preview dialog for printing displayed image + + + + + + Ctrl+P + Ctrl+P + + + + Open preview dialog for printing displayed text + + + + + Copy Hex and ASCII + + + + + Copy selected hexadecimal and ASCII columns to the clipboard + + + + + Ctrl+Shift+C + + + + Import text + Metin aktar + + Opens a file dialog used to import text to this database cell. - veritabanı hücresine metin aktarmak için dosya diyaloğunu açar. + veritabanı hücresine metin aktarmak için dosya diyaloğunu açar. - + &Import &İçe Aktar - Export text - Metni dışa aktar + Metni dışa aktar - Opens a file dialog used to export the contents of this database cell to a text file. - veritabanı hücresindeki metni metin dosyası olarak dışa aktarmak için dosya diyaloğunu açar. + veritabanı hücresindeki metni metin dosyası olarak dışa aktarmak için dosya diyaloğunu açar. - + &Export &Dışa Aktar - + Set this cell to NULL - + Set as &NULL - + + This editor mode lets you edit JSON or XML data with syntax highlighting, automatic formatting and validation before saving. + +Errors are indicated with a red squiggle underline. + + + + + Apply data to cell + + + + + This button saves the changes performed in the cell editor to the database cell. + + + + Apply - + Text Metin - + Binary İkili @@ -546,7 +847,7 @@ Hücredeki veriyi temizle - + Erases the contents of the cell Hücre içeriğini siler @@ -559,107 +860,197 @@ <html><head/><body><p><span style=" font-weight:600; color:#c00000;">Uyarı: İkili veriyi metin modunda düzenlemek verinin bozulmasına neden olabilir!</span></p></body></html> - + This area displays information about the data present in this database cell Bu alan veritabanı hücresinin içindeki içerik hakkında bilgileri görüntüler - + Type of data currently in cell Şuan da hücrenin içinde bulunan verinin tipi - + Size of data currently in table Şuan da tablonun içinde bulunan verinin boyutu - Choose a file - Dosya seçiniz + Dosya seçiniz - Text files(*.txt);;Image files(%1);;All files(*) - Metin dosyaları(*.txt);;Resim dosyaları(%1);;Tüm dosyalar(*) + Metin dosyaları(*.txt);;Resim dosyaları(%1);;Tüm dosyalar(*) - + Choose a filename to export data Veriyi dışa aktarmak için dosya ismi seçiniz - Text files(*.txt);;All files(*) - Metin dosyaları(*.txt);;Tüm dosyalar(*) + Metin dosyaları(*.txt);;Tüm dosyalar(*) - - Image data can't be viewed with the text editor + + + Image data can't be viewed in this mode. - - Binary data can't be viewed with the text editor + + + Try switching to Image or Binary mode. - - Type of data currently in cell: %1 Image + + + Binary data can't be viewed in this mode. - - %1x%2 pixel(s) + + + Try switching to Binary mode. - - Type of data currently in cell: NULL + + + + + Text files (*.txt) - Type of data currently in cell: Null - Şuan da hücresinin içinde bulunan verinin tipi: Boş + + + + JSON files (*.json) + - - - Type of data currently in cell: Text / Numeric - Şuan da hücresinin içinde bulunan verinin tipi: Metin / Nümerik + + + + + XML files (*.xml) + - - - - %n char(s) - - %n karakter - + + + + Image files (%1) + - Type of data currently in cell: Image - Şuan da hücresinin içinde bulunan verinin tipi: Resim + + + + Binary files (*.bin) + - %1x%2 pixel - %1x%2 piksel + + + All files (*) + - - Type of data currently in cell: Binary - Şuan da hücresinin içinde bulunan verinin tipi: İkili Veri + + Choose a file to import + İçe aktarmak için dosya seçiniz - - - - %n byte(s) - - %n bayt - + + + %1 Image + - - - EditIndexDialog + + + SVG files (*.svg) + + + + + + Hex dump files (*.txt) + + + + + Invalid data for this mode + + + + + The cell contains invalid %1 data. Reason: %2. Do you really want to apply it to the cell? + + + + + Type of data currently in cell: %1 Image + + + + + %1x%2 pixel(s) + + + + + Type of data currently in cell: NULL + + + + + Type of data currently in cell: Valid JSON + + + + Type of data currently in cell: Null + Şuan da hücresinin içinde bulunan verinin tipi: Boş + + + + + Type of data currently in cell: Text / Numeric + Şuan da hücresinin içinde bulunan verinin tipi: Metin / Nümerik + + + + + + %n char(s) + + %n karakter + + + + Type of data currently in cell: Image + Şuan da hücresinin içinde bulunan verinin tipi: Resim + + + %1x%2 pixel + %1x%2 piksel + + + + Type of data currently in cell: Binary + Şuan da hücresinin içinde bulunan verinin tipi: İkili Veri + + + + + %n byte(s) + + %n bayt + + + + + EditIndexDialog Create New Index Yeni İndeks Oluştur @@ -737,13 +1128,13 @@ - + Deleting the old index failed: %1 - + Creating the index failed: %1 İndeks oluşturma hatası: %1 @@ -768,143 +1159,142 @@ + Database schema + + + + Make this a 'WITHOUT rowid' table. Setting this flag requires a field of type INTEGER with the primary key flag set and the auto increment flag unset. Tabloyu satır ID'si olmadan ayarlayın. Bu ayar için, Tamsayı(Integer) tipinde otomatik arttır özelliği olmayan ve birincil anahtar olarak ayarlanmış bir alan gerekli. - + Without Rowid Satır ID(Rowid) Kullanma - - Set this to create a temporary table that is deleted when closing the database. - - - - - Temporary table - - - - + Fields Alanlar - + Add field Alan Ekle - + Remove field Alanı kaldır - + Move field up Alanı yukarı taşı - + Move field down Alanı aşağı taşı - + Name İsim - + Type Tip - - + + NN + + + + Not null NULL Olamaz - + PK Birincil Anahtar - + Primary key Birincil Anahtar - + AI Otomatik Arttırma - + Autoincrement Otomatik Arttırma - + U Benzersiz - + Unique Benzersiz - + Default Varsayılan - + Default value Varsayılan değer - + Check Kontrol - + Check constraint Kısıtlama Kontrol - + Foreign Key Yabancı Anahtar - + <html><head/><body><p><span style=" font-weight:600; color:#ff0000;">Warning: </span>There is something with this table definition that our parser doesn't fully understand. Modifying and saving this table might result in problems.</p></body></html> - + Error creating table. Message from database engine: %1 Tablo oluşturma hatası. veritabanı motorunun mesajı: %1 - + There already is a field with that name. Please rename it first or choose a different name for this field. - + There is at least one row with this field set to NULL. This makes it impossible to set this flag. Please change the table data first. Tablonuzun en az bir satırında boş bırakılmış alan var. Bu sebeple bu özelliği etkinleştirmek imkansız. Lütfen ilk önce tablonuzdaki veriyi değiştirin. - + There is at least one row with a non-integer value in this field. This makes it impossible to set the AI flag. Please change the table data first. Tablonuzun en az bir satırında tamsayı dışında değer içeren alan var. Bu sebeğle otomatik arttır özelliğini etkinleştirmek imkansız. Lütfen ilk önce tablonuzdaki veriyi değiştirin. @@ -914,35 +1304,35 @@ `%1` sütununda benzersiz veri yok - + This column is referenced in a foreign key in table %1 and thus its name cannot be changed. - + Column '%1' has no unique data. - + This makes it impossible to set this flag. Please change the table data first. Bu sebeple bu özelliği etkinleştirmek imkansız. Lütfen ilk önce tablonuzdaki veriyi değiştirin. - + Modifying this column failed. Error returned from database: %1 - + Are you sure you want to delete the field '%1'? All data currently stored in this field will be lost. Gerçekten '%1' alanını silmek istediğinize emin misiniz? Bu alanda mevcut bütün verilerinizi kaybedeceksiniz. - + Please add a field which meets the following criteria before setting the without rowid flag: - Primary key flag set - Auto increment disabled @@ -951,14 +1341,14 @@ - Otomatik arttır ayarını devre dışı bırakın - + Setting the rowid column for the table failed. Error message: %1 - - Setting the temporary flag for the table failed. Error message: + + Changing the table schema failed. Error message: %1 @@ -1060,44 +1450,54 @@ - - + + Could not open output file: %1 Oluşturulan dosya açılamadı: %1 - - + + Choose a filename to export data Verileri dışarı aktarmak için dosya ismi seçiniz - + Text files(*.csv *.txt) Metin dosyaları(*.csv *.txt) - + Export data as JSON - + + exporting CSV + + + + + exporting JSON + + + + Text files(*.json *.js *.txt) - + Please select at least 1 table. Lütfen en az 1 tablo seçiniz. - + Choose a directory Dizin seçiniz - + Export completed. Dışa aktarma tamamlandı. @@ -1173,1288 +1573,2101 @@ Sadece şemayı dışa aktar - Please select at least 1 table. - En az 1 tane tablo seçiniz. + En az 1 tane tablo seçiniz. + + + + Please select at least one table. + - + Choose a filename to export Dışa aktarmak için dosya ismi seçiniz - + Text files(*.sql *.txt) Metin dosyaları(*.sql *.txt) - + Export completed. Dışa aktarma tamamlandı. - + Export cancelled or failed. Dışa aktarma iptal edildi veya başarısız. - ExtendedTableWidget + ExtendedScintilla - - Set to NULL + + + Ctrl+H - - Copy - + + + Ctrl+P + Ctrl+P - - Paste + + Find and Replace... - - The content of the clipboard is bigger than the range selected. -Do you want to insert it anyway? + + Print... - FileDialog + ExtendedTableWidget - SQLite database files (*.db *.sqlite *.sqlite3 *.db3);;All files (*) - SQLite veritabanı dosyaları (*.db *.sqlite *.sqlite3 *.db3);;Tüm dosyalar (*) + + Use as Exact Filter + - - - FilterLineEdit - - Filter - Filtre + + Containing + - - - ForeignKeyEditor - - &Reset + + Not equal to - - Foreign key clauses (ON UPDATE, ON DELETE etc.) + + Greater than - - - ImportCsvDialog - - Import CSV file - CSV dosyasını içe aktar + + Less than + - - &Table name - &Tablo ismi + + Greater or equal + - - &Column names in first line - &Sütun isimleri ilk satırda + + Less or equal + - - Field &separator - Alan &ayracı + + Between this and... + - - , - , + + Set to NULL + - - ; - ; + + Copy + - - - Tab - Tab karakteri + + Copy with Headers + - - | - | + + Copy as SQL + - - - - Other - Diğer... + + Paste + - - &Quote character - &Tırnak karakteri + + Print... + - - " - " + + Use in Filter Expression + - - ' - ' + + Alt+Del + - - &Encoding - &Kodlama + + Ctrl+Shift+C + - - UTF-8 - UTF-8 + + Ctrl+Alt+C + - - UTF-16 - UTF-16 + + The content of the clipboard is bigger than the range selected. +Do you want to insert it anyway? + + + + FileDialog - - ISO-8859-1 - ISO-8859-1 + SQLite database files (*.db *.sqlite *.sqlite3 *.db3);;All files (*) + SQLite veritabanı dosyaları (*.db *.sqlite *.sqlite3 *.db3);;Tüm dosyalar (*) + + + FileExtensionManager - - Trim fields? - Alanlar biçimlendirilsin mi? + + File Extension Manager + - - Separate tables + + &Up - - - Deselect All + + &Down - - Match Similar + + &Add - - Select All + + &Remove - - Inserting data... - Veri ekleniyor... + + + Description + - - Cancel - İptal + + Extensions + - - There is already a table of that name and an import into an existing table is only possible if the number of columns match. - Zaten aynı isimde tablo mevcut. Varolan tablonun üstüne yazmak ancak sütunların sayısı eşitse mümkün olabilir. + + *.extension + + + + FilterLineEdit - - There is already a table of that name. Do you want to import the data into it? - Zaten aynı isimde tablo mevcut. Verileri bu tablonun içine aktarmak istiyor musunuz? + + Filter + Filtre - - Creating restore point failed: %1 - Geri yükleme noktası oluşturma başarısız: %1 + + These input fields allow you to perform quick filters in the currently selected table. +By default, the rows containing the input text are filtered out. +The following operators are also supported: +% Wildcard +> Greater than +< Less than +>= Equal to or greater +<= Equal to or less += Equal to: exact match +<> Unequal: exact inverse match +x~y Range: values between x and y + - - Creating the table failed: %1 - Tablo oluşturma başarısız: %1 + + Set Filter Expression + - - Missing field for record %1 - %1 kayıtı için eksik alan + + What's This? + Bu nedir? - - Inserting row failed: %1 - Satır ekleme başarısız: %1 + + Is NULL + - - - MainWindow - - DB Browser for SQLite - SQLite DB Browser + + Is not NULL + - Database &Structure - Veritabanı &Yapısı + + Is empty + - - - toolBar1 - toolBar1 + + Is not empty + - &Browse Data - &Verileri Görüntüle + + Equal to... + - Table: - Tablo: + + Not equal to... + - - Select a table to browse data - Verileri görüntülemek için tablo seçiniz + + Greater than... + - - Use this list to select a table to be displayed in the database view - Veritabanı görünümünde gösterilecek tabloyu seçmek için bu listeyi kullanın + + Less than... + - - Refresh the data in the selected table. - Seçilen tablodaki verileri yenileyin. + + Greater or equal... + - - This button refreshes the data in the currently selected table. - Bu buton, seçilen tablodaki verileri yeniler. + + Less or equal... + - - SQLCipher &FAQ... + + In range... + + + FindReplaceDialog - - Opens the SQLCipher FAQ in a browser window + + Find and Replace - - Table(s) to JSON... + + Fi&nd text: - - Export one or more table(s) to a JSON file + + Re&place with: - - Refresh + + Match &exact case - - F5 - F5 + + Match &only whole words + - - Clear all filters - Tüm filtreleri temizle + + When enabled, the search continues from the other end when it reaches one end of the page + - - &Table: + + &Wrap around - - Insert a new record in the current table - Geçerli tabloya yeni kayıt ekle + + When set, the search goes backwards from cursor position, otherwise it goes forward + - - This button creates a new, empty record in the database - Bu buton, veritabanında yeni bir boş kayıt oluşturur. + + Search &backwards + - - New Record - Yeni Kayıt + + <html><head/><body><p>When checked, the pattern to find is interpreted as a UNIX regular expression. See <a href="https://en.wikibooks.org/wiki/Regular_Expressions">Regular Expression in Wikibooks</a>.</p></body></html> + - - Delete the current record - Geçerli kaydı sil + + Use regular e&xpressions + - - This button deletes the record currently selected in the database - Bu buton, veritabanında seçilen geçerli kayıtları siler + + Find the next occurrence from the cursor position and in the direction set by "Search backwards" + - - Delete Record - Kaydı Sil + + &Find Next + - - This is the database view. You can double-click any record to edit its contents in the cell editor window. - Bu veritabanı görünümüdür. Herhangi kayda çift tıklayarak hücre içeriğini hücre editör penceresinde düzenleyebilirsiniz. + + &Replace + - - <html><head/><body><p>Scroll to the beginning</p></body></html> - <html><head/><body><p>Başa sürükle</p></body></html> + + Highlight all the occurrences of the text in the page + - - <html><head/><body><p>Clicking this button navigates to the beginning in the table view above.</p></body></html> - <html><head/><body><p>Bu butona basıldığında üstteki tablo görünümünün başlangıcına kaydırılır.</p></body></html> + + F&ind All + - - |< - |< + + Replace all the occurrences of the text in the page + - Scroll 100 records upwards - 100 kayıt kadar yukarı kaydır + + Replace &All + - <html><head/><body><p>Clicking this button navigates 100 records upwards in the table view above.</p></body></html> - <html><head/><body><p>Bu butona basıldığında üstteki tablo görünümünün 100 kayıt kadar yukarısına kaydırılır.</p></body></html> + + The searched text was not found + - - < - < + + + The searched text was not found. + - - 0 - 0 of 0 - 0 - 0 / 0 + + The searched text was found one time. + - <html><head/><body><p>Scroll 100 records downwards</p></body></html> - <html><head/><body><p>100 kayıt kadar aşağı kaydır</p></body></html> + + The searched text was found %1 times. + - <html><head/><body><p>Clicking this button navigates 100 records downwards in the table view above.</p></body></html> - <html><head/><body><p>Bu butona basıldığında üstteki tablo görünümünün 100 kayıt kadar aşağısına kaydırılır.</p></body></html> + + The searched text was replaced one time. + - - > - > + + The searched text was replaced %1 times. + + + + ForeignKeyEditor - - Scroll to the end - Sona sürükle + + &Reset + - - <html><head/><body><p>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Clicking this button navigates up to the end in the table view above.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</p></body></html> - <html><head/><body><p>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Bu butona basıldığında üstteki tablo görünümünün en sonuna kaydırılır.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</p></body></html> + + Foreign key clauses (ON UPDATE, ON DELETE etc.) + + + + ImportCsvDialog - - >| - >| + + Import CSV file + CSV dosyasını içe aktar - - <html><head/><body><p>Click here to jump to the specified record</p></body></html> - <html><head/><body><p>İstediğiniz kayda atlamak için buraya tıklayın</p></body></html> + &Table name + &Tablo ismi - - <html><head/><body><p>This button is used to navigate to the record number specified in the Go to area.</p></body></html> - <html><head/><body><p>Bu buton belirtilen kayıt numarasına gitmek için kullanılır.</p></body></html> + + Table na&me + - - Go to: - Bu kayda gidin: + + &Column names in first line + &Sütun isimleri ilk satırda - - Enter record number to browse - Görüntülemek için kayıt numarasını giriniz + + Field &separator + Alan &ayracı - - Type a record number in this area and click the Go to: button to display the record in the database view - Bu alana veritabanı görünümünde görüntülemek istediğiniz kayıt numarasını giriniz ve Bu kayda gidin: butonuna tıklayınız + + , + , - - 1 - 1 + + ; + ; - Edit &Pragmas - &Pragmaları Düzenleyin + + + Tab + Tab karakteri - - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_auto_vacuum"><span style=" text-decoration: underline; color:#0000ff;">Auto Vacuum</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_auto_vacuum"><span style=" text-decoration: underline; color:#0000ff;">Auto Vacuum</span></a></p></body></html> + + | + | - - None - None + + + + Other + Diğer... - - - Full - Full + + &Quote character + &Tırnak karakteri - - Incremental - Incremental + + " + " - - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_automatic_index"><span style=" text-decoration: underline; color:#0000ff;">Automatic Index</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_automatic_index"><span style=" text-decoration: underline; color:#0000ff;">Automatic Index</span></a></p></body></html> + + ' + ' - - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_checkpoint_fullfsync"><span style=" text-decoration: underline; color:#0000ff;">Checkpoint Full FSYNC</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_checkpoint_fullfsync"><span style=" text-decoration: underline; color:#0000ff;">Checkpoint Full FSYNC</span></a></p></body></html> + + &Encoding + &Kodlama - - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_foreign_keys"><span style=" text-decoration: underline; color:#0000ff;">Foreign Keys</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_foreign_keys"><span style=" text-decoration: underline; color:#0000ff;">Foreign Keys</span></a></p></body></html> + + UTF-8 + UTF-8 - - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_fullfsync"><span style=" text-decoration: underline; color:#0000ff;">Full FSYNC</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_fullfsync"><span style=" text-decoration: underline; color:#0000ff;">Full FSYNC</span></a></p></body></html> + + UTF-16 + UTF-16 - - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_ignore_check_constraints"><span style=" text-decoration: underline; color:#0000ff;">Ignore Check Constraints</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_ignore_check_constraints"><span style=" text-decoration: underline; color:#0000ff;">Ignore Check Constraints</span></a></p></body></html> + + ISO-8859-1 + ISO-8859-1 - - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_journal_mode"><span style=" text-decoration: underline; color:#0000ff;">Journal Mode</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_journal_mode"><span style=" text-decoration: underline; color:#0000ff;">Journal Mode</span></a></p></body></html> + + Trim fields? + Alanlar biçimlendirilsin mi? - - Delete - Delete + + Separate tables + - - Truncate - Truncate + + Advanced + Gelişmiş - - Persist - Persist + + When importing an empty value from the CSV file into an existing table with a default value for this column, that default value is inserted. Activate this option to insert an empty value instead. + - - - Memory - Memory + + Ignore default &values + - - WAL - WAL + + Activate this option to stop the import when trying to import an empty value into a NOT NULL column without a default value. + - - - Off - Off + + Fail on missing values + - - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_journal_size_limit"><span style=" text-decoration: underline; color:#0000ff;">Journal Size Limit</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_journal_size_limit"><span style=" text-decoration: underline; color:#0000ff;">Journal Size Limit</span></a></p></body></html> + + Disable data type detection + - - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_locking_mode"><span style=" text-decoration: underline; color:#0000ff;">Locking Mode</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_locking_mode"><span style=" text-decoration: underline; color:#0000ff;">Locking Mode</span></a></p></body></html> + + Disable the automatic data type detection when creating a new table. + - - - Normal - Normal + + + Deselect All + - - Exclusive - Exclusive + + Match Similar + - - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_max_page_count"><span style=" text-decoration: underline; color:#0000ff;">Max Page Count</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_max_page_count"><span style=" text-decoration: underline; color:#0000ff;">Max Page Count</span></a></p></body></html> + + Select All + - - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_page_size"><span style=" text-decoration: underline; color:#0000ff;">Page Size</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_page_size"><span style=" text-decoration: underline; color:#0000ff;">Page Size</span></a></p></body></html> + Inserting data... + Veri ekleniyor... - - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_recursive_triggers"><span style=" text-decoration: underline; color:#0000ff;">Recursive Triggers</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_recursive_triggers"><span style=" text-decoration: underline; color:#0000ff;">Recursive Triggers</span></a></p></body></html> + Cancel + İptal - - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_secure_delete"><span style=" text-decoration: underline; color:#0000ff;">Secure Delete</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_secure_delete"><span style=" text-decoration: underline; color:#0000ff;">Secure Delete</span></a></p></body></html> + There is already a table of that name and an import into an existing table is only possible if the number of columns match. + Zaten aynı isimde tablo mevcut. Varolan tablonun üstüne yazmak ancak sütunların sayısı eşitse mümkün olabilir. - - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_synchronous"><span style=" text-decoration: underline; color:#0000ff;">Synchronous</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_synchronous"><span style=" text-decoration: underline; color:#0000ff;">Synchronous</span></a></p></body></html> + There is already a table of that name. Do you want to import the data into it? + Zaten aynı isimde tablo mevcut. Verileri bu tablonun içine aktarmak istiyor musunuz? - - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_temp_store"><span style=" text-decoration: underline; color:#0000ff;">Temp Store</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_temp_store"><span style=" text-decoration: underline; color:#0000ff;">Temp Store</span></a></p></body></html> + + Import completed + İçe aktarma tamamlandı - - Default - Default + + There is already a table named '%1' and an import into an existing table is only possible if the number of columns match. + - - File - File + + There is already a table named '%1'. Do you want to import the data into it? + - - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_user_version"><span style=" text-decoration: underline; color:#0000ff;">User Version</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_user_version"><span style=" text-decoration: underline; color:#0000ff;">User Version</span></a></p></body></html> + + Creating restore point failed: %1 + Geri yükleme noktası oluşturma başarısız: %1 - - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_wal_autocheckpoint"><span style=" text-decoration: underline; color:#0000ff;">WAL Auto Checkpoint</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_wal_autocheckpoint"><span style=" text-decoration: underline; color:#0000ff;">WAL Auto Checkpoint</span></a></p></body></html> + + Creating the table failed: %1 + Tablo oluşturma başarısız: %1 - - &Open Database Read Only... + + importing CSV - - Open an existing database file in read only mode + + Importing the file '%1' took %2ms. Of this %3ms were spent in the row function. - - Unlock view editing - + Missing field for record %1 + %1 kayıtı için eksik alan - - This unlocks the current view for editing. However, you will need appropriate triggers for editing. - + + Inserting row failed: %1 + Satır ekleme başarısız: %1 + + + MainWindow - E&xecute SQL - SQL Kodunu &Çalıştır + + DB Browser for SQLite + SQLite DB Browser - - &File - &Dosya + Database &Structure + Veritabanı &Yapısı - - &Import - &İçe Aktar + + toolBar1 + toolBar1 - - &Export - &Dışa Aktar + &Browse Data + &Verileri Görüntüle - - &Edit - Düz&enle + Table: + Tablo: - - &View - &Görünüm + + Select a table to browse data + Verileri görüntülemek için tablo seçiniz - - &Help - &Yardım + + Use this list to select a table to be displayed in the database view + Veritabanı görünümünde gösterilecek tabloyu seçmek için bu listeyi kullanın - - DB Toolbar - Veritabanı Araç Çubuğu + Refresh the data in the selected table. + Seçilen tablodaki verileri yenileyin. - - Edit Database &Cell - + + This button refreshes the data in the currently selected table. + Bu buton, seçilen tablodaki verileri yeniler. - - DB Sche&ma + + Opens the SQLCipher FAQ in a browser window - - &Remote + + Export one or more table(s) to a JSON file - - Execute SQL [F5, Ctrl+Return, Ctrl+R] + + Refresh - - &Load extension - + + F5 + F5 - - Execute current line [Shift+F5] + + Clear all filters + Tüm filtreleri temizle + + + + &Table: - - Shift+F5 - Shift+F5 + + Insert a new record in the current table + Geçerli tabloya yeni kayıt ekle - - Sa&ve Project - + This button creates a new, empty record in the database + Bu buton, veritabanında yeni bir boş kayıt oluşturur. - - Open &Project - + + + New Record + Yeni Kayıt - - &Set Encryption - + + Delete the current record + Geçerli kaydı sil - - Edit display format - + This button deletes the record currently selected in the database + Bu buton, veritabanında seçilen geçerli kayıtları siler - - Edit the display format of the data in this column - + + + Delete Record + Kaydı Sil - - Show rowid column - + This is the database view. You can double-click any record to edit its contents in the cell editor window. + Bu veritabanı görünümüdür. Herhangi kayda çift tıklayarak hücre içeriğini hücre editör penceresinde düzenleyebilirsiniz. - - Toggle the visibility of the rowid column - + + <html><head/><body><p>Scroll to the beginning</p></body></html> + <html><head/><body><p>Başa sürükle</p></body></html> - - - Set encoding - + + <html><head/><body><p>Clicking this button navigates to the beginning in the table view above.</p></body></html> + <html><head/><body><p>Bu butona basıldığında üstteki tablo görünümünün başlangıcına kaydırılır.</p></body></html> - - Change the encoding of the text in the table cells - + + |< + |< - - Set encoding for all tables - + Scroll 100 records upwards + 100 kayıt kadar yukarı kaydır - - Change the default encoding assumed for all tables in the database - + <html><head/><body><p>Clicking this button navigates 100 records upwards in the table view above.</p></body></html> + <html><head/><body><p>Bu butona basıldığında üstteki tablo görünümünün 100 kayıt kadar yukarısına kaydırılır.</p></body></html> - SQL Log - SQL Günlüğü + + < + < - &Show SQL submitted by - &Şunun tarafından gönderilen SQL kodunu göster: + + 0 - 0 of 0 + 0 - 0 / 0 - - User - Kullanıcı + <html><head/><body><p>Scroll 100 records downwards</p></body></html> + <html><head/><body><p>100 kayıt kadar aşağı kaydır</p></body></html> - - Application - Uygulama + <html><head/><body><p>Clicking this button navigates 100 records downwards in the table view above.</p></body></html> + <html><head/><body><p>Bu butona basıldığında üstteki tablo görünümünün 100 kayıt kadar aşağısına kaydırılır.</p></body></html> - - &Clear - &Temizle + + > + > - Plot - Plan + + Scroll to the end + Sona sürükle - Columns - Sütun + + <html><head/><body><p>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Clicking this button navigates up to the end in the table view above.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</p></body></html> + <html><head/><body><p>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Bu butona basıldığında üstteki tablo görünümünün en sonuna kaydırılır.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</p></body></html> - X - X + + >| + >| - Y - Y + + <html><head/><body><p>Click here to jump to the specified record</p></body></html> + <html><head/><body><p>İstediğiniz kayda atlamak için buraya tıklayın</p></body></html> - _ - _ + + <html><head/><body><p>This button is used to navigate to the record number specified in the Go to area.</p></body></html> + <html><head/><body><p>Bu buton belirtilen kayıt numarasına gitmek için kullanılır.</p></body></html> - Line type: - Çizgi Tipi: + + Go to: + Bu kayda gidin: - Line - Çizgi + + Enter record number to browse + Görüntülemek için kayıt numarasını giriniz - StepLeft - Sola Basamakla + + Type a record number in this area and click the Go to: button to display the record in the database view + Bu alana veritabanı görünümünde görüntülemek istediğiniz kayıt numarasını giriniz ve Bu kayda gidin: butonuna tıklayınız - StepRight - Sağa Basamakla + + 1 + 1 - StepCenter - Merkeze Basamakla + Edit &Pragmas + &Pragmaları Düzenleyin - Impulse - Kaydırmalı + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_auto_vacuum"><span style=" text-decoration: underline; color:#0000ff;">Auto Vacuum</span></a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_auto_vacuum"><span style=" text-decoration: underline; color:#0000ff;">Auto Vacuum</span></a></p></body></html> - Point shape: - Nokta Şekli: + None + None - Cross - Çarpı + Full + Full - Plus - Artı + Incremental + Incremental - Circle - Daire + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_automatic_index"><span style=" text-decoration: underline; color:#0000ff;">Automatic Index</span></a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_automatic_index"><span style=" text-decoration: underline; color:#0000ff;">Automatic Index</span></a></p></body></html> - Disc - Disk + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_checkpoint_fullfsync"><span style=" text-decoration: underline; color:#0000ff;">Checkpoint Full FSYNC</span></a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_checkpoint_fullfsync"><span style=" text-decoration: underline; color:#0000ff;">Checkpoint Full FSYNC</span></a></p></body></html> - Square - Kare + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_foreign_keys"><span style=" text-decoration: underline; color:#0000ff;">Foreign Keys</span></a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_foreign_keys"><span style=" text-decoration: underline; color:#0000ff;">Foreign Keys</span></a></p></body></html> - Diamond - Elmas + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_fullfsync"><span style=" text-decoration: underline; color:#0000ff;">Full FSYNC</span></a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_fullfsync"><span style=" text-decoration: underline; color:#0000ff;">Full FSYNC</span></a></p></body></html> - Star - Yıldız + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_ignore_check_constraints"><span style=" text-decoration: underline; color:#0000ff;">Ignore Check Constraints</span></a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_ignore_check_constraints"><span style=" text-decoration: underline; color:#0000ff;">Ignore Check Constraints</span></a></p></body></html> - Triangle - Üçgen + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_journal_mode"><span style=" text-decoration: underline; color:#0000ff;">Journal Mode</span></a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_journal_mode"><span style=" text-decoration: underline; color:#0000ff;">Journal Mode</span></a></p></body></html> - TriangleInverted - Ters Üçgen + Delete + Delete - CrossSquare - Çapraz Kare + Truncate + Truncate - PlusSquare - Kare İçinde Artı + Persist + Persist - CrossCircle - Daire İçinde Çarpı + Memory + Memory - PlusCircle - Daire İçinde Artı + WAL + WAL - Peace - Barış Simgesi + Off + Off - <html><head/><body><p>Save current plot...</p><p>File format chosen by extension (png, jpg, pdf, bmp)</p></body></html> - <html><head/><body><p>Geçerli planı kaydedin...</p><p>Dosya formatı eklenti tarafından seçilmiş (png, jpg, pdf, bmp)</p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_journal_size_limit"><span style=" text-decoration: underline; color:#0000ff;">Journal Size Limit</span></a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_journal_size_limit"><span style=" text-decoration: underline; color:#0000ff;">Journal Size Limit</span></a></p></body></html> - Save current plot... - Geçerli planı kaydet... + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_locking_mode"><span style=" text-decoration: underline; color:#0000ff;">Locking Mode</span></a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_locking_mode"><span style=" text-decoration: underline; color:#0000ff;">Locking Mode</span></a></p></body></html> - DB Schema - Veritabanı Şeması + Normal + Normal - - &New Database... - Ye&ni Veritabanı... + Exclusive + Exclusive - - - Create a new database file - Yeni bir veritabanı dosyası oluştur + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_max_page_count"><span style=" text-decoration: underline; color:#0000ff;">Max Page Count</span></a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_max_page_count"><span style=" text-decoration: underline; color:#0000ff;">Max Page Count</span></a></p></body></html> - - This option is used to create a new database file. - Bu seçenek yeni bir veritabanı dosyası oluşturmak için kullanılır. + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_page_size"><span style=" text-decoration: underline; color:#0000ff;">Page Size</span></a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_page_size"><span style=" text-decoration: underline; color:#0000ff;">Page Size</span></a></p></body></html> - - Ctrl+N - Ctrl+N + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_recursive_triggers"><span style=" text-decoration: underline; color:#0000ff;">Recursive Triggers</span></a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_recursive_triggers"><span style=" text-decoration: underline; color:#0000ff;">Recursive Triggers</span></a></p></body></html> - - &Open Database... - &Veritabanı Aç... + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_secure_delete"><span style=" text-decoration: underline; color:#0000ff;">Secure Delete</span></a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_secure_delete"><span style=" text-decoration: underline; color:#0000ff;">Secure Delete</span></a></p></body></html> - - - - Open an existing database file - Mevcut veritabanı dosyasını aç + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_synchronous"><span style=" text-decoration: underline; color:#0000ff;">Synchronous</span></a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_synchronous"><span style=" text-decoration: underline; color:#0000ff;">Synchronous</span></a></p></body></html> - - - This option is used to open an existing database file. - Bu seçenek mevcut veritabanı dosyasını açmak için kullanılır. + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_temp_store"><span style=" text-decoration: underline; color:#0000ff;">Temp Store</span></a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_temp_store"><span style=" text-decoration: underline; color:#0000ff;">Temp Store</span></a></p></body></html> - - Ctrl+O - Ctrl+O + Default + Default - - &Close Database - Veritabanı &Kapat + File + File - - Ctrl+W - Ctrl+W + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_user_version"><span style=" text-decoration: underline; color:#0000ff;">User Version</span></a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_user_version"><span style=" text-decoration: underline; color:#0000ff;">User Version</span></a></p></body></html> - Revert Changes - Değişiklikleri Geri Al + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_wal_autocheckpoint"><span style=" text-decoration: underline; color:#0000ff;">WAL Auto Checkpoint</span></a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_wal_autocheckpoint"><span style=" text-decoration: underline; color:#0000ff;">WAL Auto Checkpoint</span></a></p></body></html> - - Revert database to last saved state - Veritabanını en son kaydedilen duruma döndür + + Open an existing database file in read only mode + - - This option is used to revert the current database file to its last saved state. All changes made since the last save operation are lost. - Bu seçenek veritabanını en son kaydedilen durumuna döndürür. Geçerli kayıttan sonra yaptığınız tüm değişiklikler kaybolacaktır. + + Unlock view editing + - Write Changes - Değişiklikleri Kaydet + + This unlocks the current view for editing. However, you will need appropriate triggers for editing. + - - Write changes to the database file - Değişiklikleri veritabanı dosyasına kaydet + E&xecute SQL + SQL Kodunu &Çalıştır - - This option is used to save changes to the database file. - Bu seçenek değişiklikleri veritabanı dosyasına kaydetmenizi sağlar. + + &File + &Dosya + + + + &Import + &İçe Aktar + + + + &Export + &Dışa Aktar + + + + &Edit + Düz&enle + + + + &View + &Görünüm + + + + &Help + &Yardım + + + + DB Toolbar + Veritabanı Araç Çubuğu + + + + Edit Database &Cell + + + + + DB Sche&ma + + + + + &Remote + + + + + Execute current line + + + + + This button executes the SQL statement present in the current editor line + + + + + Shift+F5 + Shift+F5 + + + + Edit display format + + + + + Edit the display format of the data in this column + + + + + Show rowid column + + + + + Toggle the visibility of the rowid column + + + + + + Set encoding + + + + + Change the encoding of the text in the table cells + + + + + Set encoding for all tables + + + + + Change the default encoding assumed for all tables in the database + + + + SQL Log + SQL Günlüğü + + + &Show SQL submitted by + &Şunun tarafından gönderilen SQL kodunu göster: + + + + User + Kullanıcı + + + + Application + Uygulama + + + + &Clear + &Temizle + + + Plot + Plan + + + Columns + Sütun + + + X + X + + + Y + Y + + + _ + _ + + + Line type: + Çizgi Tipi: + + + Line + Çizgi + + + StepLeft + Sola Basamakla + + + StepRight + Sağa Basamakla + + + StepCenter + Merkeze Basamakla + + + Impulse + Kaydırmalı + + + Point shape: + Nokta Şekli: + + + Cross + Çarpı + + + Plus + Artı + + + Circle + Daire + + + Disc + Disk + + + Square + Kare + + + Diamond + Elmas + + + Star + Yıldız + + + Triangle + Üçgen + + + TriangleInverted + Ters Üçgen + + + CrossSquare + Çapraz Kare + + + PlusSquare + Kare İçinde Artı + + + CrossCircle + Daire İçinde Çarpı + + + PlusCircle + Daire İçinde Artı + + + Peace + Barış Simgesi + + + <html><head/><body><p>Save current plot...</p><p>File format chosen by extension (png, jpg, pdf, bmp)</p></body></html> + <html><head/><body><p>Geçerli planı kaydedin...</p><p>Dosya formatı eklenti tarafından seçilmiş (png, jpg, pdf, bmp)</p></body></html> + + + Save current plot... + Geçerli planı kaydet... + + + DB Schema + Veritabanı Şeması + + + + &New Database... + Ye&ni Veritabanı... + + + + + Create a new database file + Yeni bir veritabanı dosyası oluştur + + + + This option is used to create a new database file. + Bu seçenek yeni bir veritabanı dosyası oluşturmak için kullanılır. + + + + Ctrl+N + Ctrl+N + + + + + &Open Database... + &Veritabanı Aç... + + + + + + + + Open an existing database file + Mevcut veritabanı dosyasını aç + + + + + + This option is used to open an existing database file. + Bu seçenek mevcut veritabanı dosyasını açmak için kullanılır. + + + + + Ctrl+O + Ctrl+O + + + + &Close Database + Veritabanı &Kapat + + + + Ctrl+W + Ctrl+W + + + Revert Changes + Değişiklikleri Geri Al + + + + + Revert database to last saved state + Veritabanını en son kaydedilen duruma döndür + + + + This option is used to revert the current database file to its last saved state. All changes made since the last save operation are lost. + Bu seçenek veritabanını en son kaydedilen durumuna döndürür. Geçerli kayıttan sonra yaptığınız tüm değişiklikler kaybolacaktır. + + + Write Changes + Değişiklikleri Kaydet + + + + + Write changes to the database file + Değişiklikleri veritabanı dosyasına kaydet + + + + This option is used to save changes to the database file. + Bu seçenek değişiklikleri veritabanı dosyasına kaydetmenizi sağlar. + + + + Ctrl+S + Ctrl+S + + + Compact Database + Veritabanını Genişlet + + + + Compact the database file, removing space wasted by deleted records + Veritabanı dosyasını genişletmek, silinen kayıtlardan dolayı meydana gelen boşlukları temizler + + + + + Compact the database file, removing space wasted by deleted records. + Veritabanı dosyasını genişletmek, silinen kayıtlardan dolayı meydana gelen boşlukları temizler. + + + + E&xit + &Çıkış + + + + Ctrl+Q + Ctrl+Q + + + Database from SQL file... + SQL dosyasından veritabanı... + + + + Import data from an .sql dump text file into a new or existing database. + Verileri .sql uzantılı döküm dosyasından varolan veya yeni veritabanına aktarın. + + + + This option lets you import data from an .sql dump text file into a new or existing database. SQL dump files can be created on most database engines, including MySQL and PostgreSQL. + Bu seçenek verileri .sql döküm dosyasından varolan veya yeni veritabanına aktarmanıza olanak sağlar. SQL dosyaları MySQL ve PostgreSQL dahil olmak üzere birçok veritabanı motorları tarafından oluştururlar. + + + Table from CSV file... + CSV dosyasından tablo... + + + + Open a wizard that lets you import data from a comma separated text file into a database table. + Virgülle ayrılmış metin dosyalarını veritabanınızın içine aktarmanızı sağlayan sihirbazı açar. + + + + Open a wizard that lets you import data from a comma separated text file into a database table. CSV files can be created on most database and spreadsheet applications. + Virgülle ayrılmış metin dosyalarını veritabanınızın içine aktarmanızı sağlayan sihirbazı açar. CSV dosyaları çoğu veritabanı motorları ve elektronik tablo uygulamaları tarafından oluştururlar. + + + Database to SQL file... + Veritabanından SQL dosyası... + + + + Export a database to a .sql dump text file. + Veritabanını .sql döküm dosyası olarak dışa aktar. + + + + This option lets you export a database to a .sql dump text file. SQL dump files contain all data necessary to recreate the database on most database engines, including MySQL and PostgreSQL. + Bu seçenek veritabanını .sql döküm dosyası olarak dışa aktarmanızı sağlar. SQL döküm dosyaları veritabanını, MySQL ve PostgreSQL dahil birçok veritabanı motorunda yeniden oluşturmak için gereken verilerin tümünü içerir. + + + Table(s) as CSV file... + Tablo(lar)dan CSV dosyası... + + + + Export a database table as a comma separated text file. + Veritabanı tablosunu virgülle ayrılmış metin dosyası olarak dışa aktar. + + + + Export a database table as a comma separated text file, ready to be imported into other database or spreadsheet applications. + Veritabanını virgülle ayrılmış metin dosyası olarak diğer veritabanı veya elektronik tablo uygulamalarına aktarmaya hazır olacak şekilde dışa aktarın. + + + Create Table... + Tablo Oluşturun... + + + + Open the Create Table wizard, where it is possible to define the name and fields for a new table in the database + Tablo Oluşturma sihirbazı, veritabanı için alanlarını ve ismini ayarlayabileceğiniz, yeni bir tablo oluşturmanızı sağlar. + + + Delete Table... + Tabloyu Sil... + + + + + Delete Table + Tabloyu Sil + + + + Open the Delete Table wizard, where you can select a database table to be dropped. + Tablo Silme sihirbazı, seçtiğiniz tabloları silmenizi sağlar. + + + Modify Table... + Tabloyu Düzenle... + + + + Open the Modify Table wizard, where it is possible to rename an existing table. It is also possible to add or delete fields form a table, as well as modify field names and types. + Tablo Düzenleme sihirbazı, varolan tablonuzu yeniden adlandırmanıza olanak sağlar. Ayrıca yeni alan ekleyebilir, silebilir hatta alanların ismini ve tipini de düzenleyebilirsiniz. + + + Create Index... + İndeks Oluştur... + + + + Open the Create Index wizard, where it is possible to define a new index on an existing database table. + İndeks Oluşturma sihirbazı, varolan veritabanı tablosuna yeni indeks tanımlamanıza olanak sağlar. + + + + &Preferences... + &Tercihler... + + + + + Open the preferences window. + Tercihler penceresini açar. + + + + &DB Toolbar + &Veritabanı Araç Çubuğu + + + + Shows or hides the Database toolbar. + Veritabanı araç çubuğunu gösterir veya gizler. + + + What's This? + Bu nedir? + + + + Shift+F1 + Shift+F1 + + + &About... + &Hakkında... + + + + &Recently opened + En son açılanla&r + + + + Open &tab + Se&kme Aç + + + + + Ctrl+T + Ctrl+T + + + + Database Structure + + + + + This is the structure of the opened database. +You can drag SQL statements from an object row and drop them into other applications or into another instance of 'DB Browser for SQLite'. + + + + + + Browse Data + + + + + Refresh the data in the selected table + + + + + This button clears all the filters set in the header input fields for the currently browsed table. + + + + + Save the table as currently displayed + + + + + <html><head/><body><p>This popup menu provides the following options applying to the currently browsed and filtered table:</p><ul style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;"><li style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Export to CSV: this option exports the data of the browsed table as currently displayed (after filters, display formats and order column) to a CSV file.</li><li style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Save as view: this option saves the current setting of the browsed table (filters, display formats and order column) as an SQL view that you can later browse or use in SQL statements.</li></ul></body></html> + + + + + ... + ... + + + + Print currently browsed table data + + + + + Print currently browsed table data. Print selection if more than one cell is selected. + + + + + <html><head/><body><p>This button creates a new record in the database. Hold the mouse button to open a pop-up menu of different options:</p><ul><li><span style=" font-weight:600;">New Record</span>: insert a new record with default values in the database.</li><li><span style=" font-weight:600;">Insert Values...</span>: open a dialog for entering values before they are inserted in the database. This allows to enter values acomplishing the different constraints. This dialog is also open if the <span style=" font-weight:600;">New Record</span> option fails due to these constraints.</li></ul></body></html> + + + + + This button deletes the record or records currently selected in the table + + + + + This is the database table view. You can do the following actions: + - Start writing for editing inline the value. + - Double-click any record to edit its contents in the cell editor window. + - Alt+Del for deleting the cell content to NULL. + - Ctrl+" for duplicating the current record. + - Ctrl+' for copying the value from the cell above. + - Standard selection and copy/paste operations. + + + + + Scroll one page upwards + + + + + <html><head/><body><p>Clicking this button navigates one page of records upwards in the table view above.</p></body></html> + + + + + Scroll one page downwards + + + + + <html><head/><body><p>Clicking this button navigates one page of records downwards in the table view above.</p></body></html> + + + + + Edit Pragmas + + + + + <html><head/><body><p><a href="https://www.sqlite.org/pragma.html#pragma_case_sensitive_like">Case Sensitive Like</a></p></body></html> + + + + + Warning: this pragma is not readable and this value has been inferred. Writing the pragma might overwrite a redefined LIKE provided by an SQLite extension. + + + + + Execute SQL + + + + + &Tools + + + + + SQL &Log + + + + + Show S&QL submitted by + + + + + This button clears the contents of the SQL logs + + + + + This panel lets you examine a log of all SQL commands issued by the application or by yourself + + + + + &Plot + + + + + This is the structure of the opened database. +You can drag multiple object names from the Name column and drop them into the SQL editor and you can adjust the properties of the dropped names using the context menu. This would help you in composing SQL statements. +You can drag SQL statements from the Schema column and drop them into the SQL editor or into other applications. + + + + + + + Project Toolbar + + + + + Extra DB toolbar + + + + + + + Close the current database file + + + + + This button closes the connection to the currently open database file + + + + + &Revert Changes + + + + + &Write Changes + + + + + Compact &Database... + + + + + Execute all/selected SQL + + + + + This button executes the currently selected SQL statements. If no text is selected, all SQL statements are executed. + + + + + &Load Extension... + + + + + &Wiki + + + + + Bug &Report... + + + + + Feature Re&quest... + + + + + Web&site + + + + + &Donate on Patreon... + + + + + Sa&ve Project... + + + + + This button lets you save all the settings associated to the open DB to a DB4S project file + + + + + Open &Project... + + + + + This button lets you open a DB4S project file + + + + + &Attach Database... + + + + + + Add another database file to the current database connection + - - Ctrl+S - Ctrl+S + + This button lets you add another database file to the current database connection + - Compact Database - Veritabanını Genişlet + + &Set Encryption... + - - Compact the database file, removing space wasted by deleted records - Veritabanı dosyasını genişletmek, silinen kayıtlardan dolayı meydana gelen boşlukları temizler + + SQLCipher &FAQ + - - - Compact the database file, removing space wasted by deleted records. - Veritabanı dosyasını genişletmek, silinen kayıtlardan dolayı meydana gelen boşlukları temizler. + + Table(&s) to JSON... + - - E&xit - &Çıkış + + Open Data&base Read Only... + - - Ctrl+Q - Ctrl+Q + + Save results + - Database from SQL file... - SQL dosyasından veritabanı... + + Save the results view + - - Import data from an .sql dump text file into a new or existing database. - Verileri .sql uzantılı döküm dosyasından varolan veya yeni veritabanına aktarın. + + This button lets you save the results of the last executed query + - - This option lets you import data from an .sql dump text file into a new or existing database. SQL dump files can be created on most database engines, including MySQL and PostgreSQL. - Bu seçenek verileri .sql döküm dosyasından varolan veya yeni veritabanına aktarmanıza olanak sağlar. SQL dosyaları MySQL ve PostgreSQL dahil olmak üzere birçok veritabanı motorları tarafından oluştururlar. + + Find text in SQL editor + - Table from CSV file... - CSV dosyasından tablo... + + Find text in SQL editor + - - Open a wizard that lets you import data from a comma separated text file into a database table. - Virgülle ayrılmış metin dosyalarını veritabanınızın içine aktarmanızı sağlayan sihirbazı açar. + + This button opens the search bar of the editor + - - Open a wizard that lets you import data from a comma separated text file into a database table. CSV files can be created on most database and spreadsheet applications. - Virgülle ayrılmış metin dosyalarını veritabanınızın içine aktarmanızı sağlayan sihirbazı açar. CSV dosyaları çoğu veritabanı motorları ve elektronik tablo uygulamaları tarafından oluştururlar. + + Ctrl+F + - Database to SQL file... - Veritabanından SQL dosyası... + + Find or replace text in SQL editor + - - Export a database to a .sql dump text file. - Veritabanını .sql döküm dosyası olarak dışa aktar. + + Find or replace text in SQL editor + - - This option lets you export a database to a .sql dump text file. SQL dump files contain all data necessary to recreate the database on most database engines, including MySQL and PostgreSQL. - Bu seçenek veritabanını .sql döküm dosyası olarak dışa aktarmanızı sağlar. SQL döküm dosyaları veritabanını, MySQL ve PostgreSQL dahil birçok veritabanı motorunda yeniden oluşturmak için gereken verilerin tümünü içerir. + + This button opens the find/replace dialog for the current editor tab + - Table(s) as CSV file... - Tablo(lar)dan CSV dosyası... + + + Export to &CSV + &CSV dosyası olarak dışa aktar - - Export a database table as a comma separated text file. - Veritabanı tablosunu virgülle ayrılmış metin dosyası olarak dışa aktar. + + + Save as &view + &Görünümü kaydet - - Export a database table as a comma separated text file, ready to be imported into other database or spreadsheet applications. - Veritabanını virgülle ayrılmış metin dosyası olarak diğer veritabanı veya elektronik tablo uygulamalarına aktarmaya hazır olacak şekilde dışa aktarın. + + Save as view + Görünümü kaydet - Create Table... - Tablo Oluşturun... + + Hide column(s) + - - Open the Create Table wizard, where it is possible to define the name and fields for a new table in the database - Tablo Oluşturma sihirbazı, veritabanı için alanlarını ve ismini ayarlayabileceğiniz, yeni bir tablo oluşturmanızı sağlar. + + Hide selected column(s) + - Delete Table... - Tabloyu Sil... + + Show all columns + - - - - Delete Table - Tabloyu Sil + + Show all columns that were hidden + - - Open the Delete Table wizard, where you can select a database table to be dropped. - Tablo Silme sihirbazı, seçtiğiniz tabloları silmenizi sağlar. + + Shows or hides the Project toolbar. + - Modify Table... - Tabloyu Düzenle... + + Extra DB Toolbar + - - Open the Modify Table wizard, where it is possible to rename an existing table. It is also possible to add or delete fields form a table, as well as modify field names and types. - Tablo Düzenleme sihirbazı, varolan tablonuzu yeniden adlandırmanıza olanak sağlar. Ayrıca yeni alan ekleyebilir, silebilir hatta alanların ismini ve tipini de düzenleyebilirsiniz. + + + Export the filtered data to CSV + - Create Index... - İndeks Oluştur... + + This button exports the data of the browsed table as currently displayed (after filters, display formats and order column) as a CSV file. + - - Open the Create Index wizard, where it is possible to define a new index on an existing database table. - İndeks Oluşturma sihirbazı, varolan veritabanı tablosuna yeni indeks tanımlamanıza olanak sağlar. + + + Save the current filter, sort column and display formats as a view + - - &Preferences... - &Tercihler... + + This button saves the current setting of the browsed table (filters, display formats and order column) as an SQL view that you can later browse or use in SQL statements. + - - - Open the preferences window. - Tercihler penceresini açar. + + Insert Values... + - - &DB Toolbar - &Veritabanı Araç Çubuğu + + + Open a dialog for inserting values in a new record + - - Shows or hides the Database toolbar. - Veritabanı araç çubuğunu gösterir veya gizler. + + + Insert new record using default values in browsed table + - What's This? - Bu nedir? + + New In-&Memory Database + - - Shift+F1 - Shift+F1 + + Drag && Drop Qualified Names + - - &About... - &Hakkında... + + + Use qualified names (e.g. "Table"."Field") when dragging the objects and dropping them into the editor + - - &Recently opened - En son açılanla&r + + Drag && Drop Enquoted Names + - - Open &tab - Se&kme Aç + + + Use escaped identifiers (e.g. "Table1") when dragging the objects and dropping them into the editor + - - - Ctrl+T - Ctrl+T + + &Integrity Check + - - Database Structure + + Runs the integrity_check pragma over the opened database and returns the results in the Execute SQL tab. This pragma does an integrity check of the entire database. - - Browse Data + + &Foreign-Key Check - - Scroll one page upwards + + Runs the foreign_key_check pragma over the opened database and returns the results in the Execute SQL tab - - <html><head/><body><p>Clicking this button navigates one page of records upwards in the table view above.</p></body></html> + + &Quick Integrity Check - - Scroll one page downwards + + Run a quick integrity check over the open DB - - <html><head/><body><p>Clicking this button navigates one page of records downwards in the table view above.</p></body></html> + + Runs the quick_check pragma over the opened database and returns the results in the Execute SQL tab. This command does most of the checking of PRAGMA integrity_check but runs much faster. - - Edit Pragmas + + &Optimize - - Execute SQL + + Attempt to optimize the database - - SQL &Log + + Runs the optimize pragma over the opened database. This pragma might perform optimizations that will improve the performance of future queries. - - Show S&QL submitted by + + + Print - - &Plot + + Print text from current SQL editor tab - - &Revert Changes + + Open a dialog for printing the text in the current SQL editor tab - - &Write Changes + + Print the structure of the opened database - - Compact &Database + + Open a dialog for printing the structure of the opened database - + &Database from SQL file... - + &Table from CSV file... - + &Database to SQL file... - + &Table(s) as CSV file... - + &Create Table... - + &Delete Table... - + &Modify Table... - + Create &Index... - + W&hat's This? - + + &About + + + + + This button opens a new tab for the SQL editor + + + + &Execute SQL &SQL kodunu yürüt - Execute SQL [F5, Ctrl+Return] - SQL kodunu yürüt [F5, Ctrl+Enter] + Execute SQL + SQL kodunu yürüt - + Open SQL file SQL dosyası aç - - - + + This button opens a file containing SQL statements and loads it in a new editor tab + + + + + + Save SQL file SQL dosyasını kaydet @@ -2463,51 +3676,48 @@ Eklenti yükle - + Execute current line Geçerli satırı yürüt - Execute current line [Ctrl+E] - Geçerli satırı yürüt [Ctrl+E] + Execute current line + Geçerli satırı yürüt - + Ctrl+E Ctrl+E - + Export as CSV file CSV dosyası olarak dışa aktar - + Export table as comma separated values file Tabloyu virgülle ayrılmış girdiler dosyası olarak dışa aktar - &Wiki... - &Döküman... + &Döküman... - Bug &report... - Hata Bildi&r... + Hata Bildi&r... - Web&site... - Web &Sitesi... + Web &Sitesi... Save Project Projeyi Kaydet - - + + Save the current session to a file Geçerli oturumu dosyaya kaydet @@ -2516,94 +3726,98 @@ Proeje Aç - - + + Load a working session from a file Dosyadan çalışma oturumunu yükle - &Attach Database - Verit&abanını İliştir + Verit&abanını İliştir Set Encryption Şifre Ayarla - - + + Save SQL file as SQL dosyasını bu şekilde kaydet - + + This button saves the content of the current SQL editor tab to a file + + + + &Browse Table &Tabloyu Görüntüle - + Copy Create statement 'Create' ifadesini kopyala - + Copy the CREATE statement of the item to the clipboard Objenin 'Create' ifadesini panoya kopyala - + Ctrl+Return Ctrl+Return - + Ctrl+L Ctrl+L - + Ctrl+P Ctrl+P - + Ctrl+D Ctrl+D - + Ctrl+I Ctrl+I - + Encrypted - + Read only - + Database file is read only. Editing the database is disabled. - + Database encoding Veritabanı kodlaması - + Database is encrypted using SQLCipher Veritabanı SQLCipher kullanılırak şifrelendi - - + + Choose a database file Veritabanı dosyasını seçiniz @@ -2616,52 +3830,49 @@ Geçersiz dosya formatı - - - + + + Choose a filename to save under Kaydetmek için dosya ismi seçiniz - Error adding record: - Kayıt ekleme hatası: + Kayıt ekleme hatası: - + Error deleting record: %1 Kayıt silme hatası: - + Please select a record first Lütfen öncelikle kaydı seçiniz - + %1 - %2 of %3 %1 - %2 / %3 - - + + There is no database opened. Please open or create a new database file. Açılmış veritabanı bulunamadı. Lütfen veritabanı açın veya yeni bir veritabanı oluşturun. - Are you sure you want to delete the %1 '%2'? All data associated with the %1 will be lost. - Gerçekten '%1' türüne ait '%2' nesnesini silmek istediğinize emin misiniz? + Gerçekten '%1' türüne ait '%2' nesnesini silmek istediğinize emin misiniz? '%1' ile ilişkili bütün verileri kaybedeceksiniz. - Error: could not delete the %1. Message from database engine: %2 - Hata: '%1' silinemedi. Veritabanı motorunun mesajı: %2 + Hata: '%1' silinemedi. Veritabanı motorunun mesajı: %2 There is no database opened. @@ -2672,227 +3883,409 @@ %1 tane satır döndürüldü: %3 (yaklaşık %2ms) - Error executing query: %1 - Sorgu yürütme hatası: %1 + Sorgu yürütme hatası: %1 Query executed successfully: %1 (took %2ms) Sorgu başarıyla yürütüldü: %1 (yaklaşık %2ms) - - %1 rows returned in %2ms from: %3 - - - - + , %1 rows affected - - Query executed successfully: %1 (took %2ms%3) - - - Choose a text file Metin dosyası seçiniz - + Text files(*.csv *.txt);;All files(*) Metin dosyaları(*.csv *.txt);;Tüm dosyalar(*) - Import completed - İçe aktarma tamamlandı + İçe aktarma tamamlandı - + Error while saving the database file. This means that not all changes to the database were saved. You need to resolve the following error first. %1 - + Are you sure you want to undo all changes made to the database file '%1' since the last save? Son kayıttan itibaren '%1' dosyasına yaptığınız değişiklikleri geri almak istediğinize emin misiniz? - + Choose a file to import İçe aktarmak için dosya seçiniz - - - + + + Text files(*.sql *.txt);;All files(*) Metin dosyaları(*.sql *.txt);;Tüm dosyalar(*) - + Do you want to create a new database file to hold the imported data? If you answer no we will attempt to import the data in the SQL file to the current database. İçeri aktarılan verileri tutmak için yeni bir veritabanı dosyası oluşturmak istiyor musunuz? Eğer cevabınız hayır ise biz SQL dosyasındaki verileri geçerli veritabanına aktarmaya başlayacağız. - + File %1 already exists. Please choose a different name. %1 dosyası zaten mevcut. Lütfen farklı bir isim seçiniz. - + Error importing data: %1 Dosya içeri aktarılırken hata oluştu: %1 - + Import completed. İçeri aktarma tamamlandı. - - + Delete View Görünümü Sil - - - Modify View + + Modify View + + + + + Delete Trigger + Tetikleyiciyi Sil + + + + Modify Trigger + + + + + Delete Index + İndeksi Sil + + + + Modify Index + + + + + Modify Table + + + + + &%1 %2 + &%1 %2 + + + + Choose a project file to open + + + + + This project file is using an old file format because it was created using DB Browser for SQLite version 3.10 or lower. Loading this file format is still fully supported but we advice you to convert all your project files to the new file format because support for older formats might be dropped at some point in the future. You can convert your files by simply opening and re-saving them. + + + + + Duplicate records + + + + + Duplicate record + + + + + Ctrl+" + + + + + Please enter a pseudo-primary key in order to enable editing on this view. This should be the name of a unique column in the view. + + + + + Setting PRAGMA values will commit your current transaction. +Are you sure? + PRAGMA değerlerini ayarlamak geçerli işleminizi yürütmeye alacaktır. +Bunu yapmak istediğinize emin misiniz? + + + + Could not open database file. +Reason: %1 + + + + + In-Memory database + + + + + determining row count... + + + + + %1 - %2 of >= %3 + + + + + Are you sure you want to delete the table '%1'? +All data associated with the table will be lost. + + + + + Are you sure you want to delete the view '%1'? + + + + + Are you sure you want to delete the trigger '%1'? + + + + + Are you sure you want to delete the index '%1'? + + + + + Error: could not delete the table. + + + + + Error: could not delete the view. + + + + + Error: could not delete the trigger. + + + + + Error: could not delete the index. - - - Delete Trigger - Tetikleyiciyi Sil + + Message from database engine: +%1 + - - - Modify Trigger + + Editing the table requires to save all pending changes now. +Are you sure you want to save the database? - - - Delete Index - İndeksi Sil + + -- EXECUTING SELECTION IN '%1' +-- + - - - Modify Index + + -- EXECUTING LINE IN '%1' +-- - - - Modify Table + + -- EXECUTING ALL IN '%1' +-- - - &%1 %2 - &%1 %2 + + Setting PRAGMA values or vacuuming will commit your current transaction. +Are you sure? + - - Please enter a pseudo-primary key in order to enable editing on this view. This should be the name of a unique column in the view. + + Execution aborted by user - - Setting PRAGMA values will commit your current transaction. -Are you sure? - PRAGMA değerlerini ayarlamak geçerli işleminizi yürütmeye alacaktır. -Bunu yapmak istediğinize emin misiniz? + + executing query + - - Could not open database file. -Reason: %1 + + %1 rows returned in %2ms - - Setting PRAGMA values or vacuuming will commit your current transaction. -Are you sure? + + query executed successfully. Took %1ms%2 - - Execution aborted by user + + -- At line %1: +%4 +-- Result: %3 - + Choose text files + Import completed. Some foreign key constraints are violated. Please fix them before saving. + + + + Select SQL file to open Açmak için SQL dosyasını seçiniz - + Couldn't read file: %1. - + Couldn't save file: %1. - + Select file name Dosya ismi seçiniz - + Select extension file Eklenti dosyasını seçiniz - + Extensions(*.so *.dll);;All files(*) Eklenti dosyaları(*.so *.dll);;Tüm dosyalar(*) - + Extension successfully loaded. Eklenti başarıyla yüklendi. - - + Error loading extension: %1 Eklenti yüklenirken hata oluştu: %1 - + + Don't show again Bir daha gös'terme - + New version available. Yeni sürüm güncellemesi mevcut. - + A new DB Browser for SQLite version is available (%1.%2.%3).<br/><br/>Please download at <a href='%4'>%4</a>. Yeni bir SQLite DB Browser sürümü mevcut (%1.%2.%3).<br/><br/>Lütfen buradan indiriniz: <a href='%4'>%4</a> + + Collation needed! Proceed? + Harmanlama gerekli! Devam edilsin mi? + + + + A table in this database requires a special collation function '%1' that this application can't provide without further knowledge. +If you choose to proceed, be aware bad things can happen to your database. +Create a backup! + Bu veritabanınındaki bir tablo özel '%1' koleksiyon fonksiyonu gerektirmektedir. +Daha fazla bilgi olmadan program bunu sağlayamaz. Eğer bu şekilde devam edecekseniz, veritabanınıza kötü şeyler olabileceğinin farkında olun ve yedek oluşturun. + + + + creating collation + + + + + Set a new name for the SQL tab. Use the '&&' character to allow using the following character as a keyboard shortcut. + + + + + Please specify the view name + Lütfen görünümünün ismini belirtin + + + + There is already an object with that name. Please choose a different name. + Bu isme sahip obje zaten mevcut. Lütfen farklı bir isim seçiniz. + + + + View successfully created. + Görünüm başarıyla oluşturuldu. + + + + Error creating view: %1 + Görünüm oluşturma hatası: %1 + + + + There is no filter set for this table. View will not be created. + + + + + Delete Records + + + + + This action will open a new SQL tab for running: + + + + + Press Help for opening the corresponding SQLite reference page. + + + Choose a axis color Renk eksenini seçiniz @@ -2901,34 +4294,43 @@ PNG(*.png);;JPG(*.jpg);;PDF(*.pdf);;BMP(*.bmp);;Tüm dosyalar(*) - Choose a file to open - Açmak için dosya seçiniz + Açmak için dosya seçiniz - - + + DB Browser for SQLite project file (*.sqbpro) SQLite DB Browser proje dosyası (*.sqbpro) - + Please choose a new encoding for this table. - + Please choose a new encoding for all tables. - + + Error checking foreign keys after table modification. The changes will be reverted. + + + + + This table did not pass a foreign-key check.<br/>You should run 'Tools | Foreign-Key Check' and fix the reported issues. + + + + %1 Leave the field empty for using the database encoding. - + This encoding is either not valid or not supported. @@ -2938,6 +4340,19 @@ + NullLineEdit + + + Set to NULL + + + + + Alt+Del + + + + PlotDock @@ -2945,182 +4360,263 @@ Plan - + + <html><head/><body><p>This pane shows the list of columns of the currently browsed table or the just executed query. You can select the columns that you want to be used as X or Y axis for the plot pane below. The table shows detected axis type that will affect the resulting plot. For the Y axis you can only select numeric columns, but for the X axis you will be able to select:</p><ul style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;"><li style=" margin-top:12px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Date/Time</span>: strings with format &quot;yyyy-MM-dd hh:mm:ss&quot; or &quot;yyyy-MM-ddThh:mm:ss&quot;</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Date</span>: strings with format &quot;yyyy-MM-dd&quot;</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Time</span>: strings with format &quot;hh:mm:ss&quot;</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Label</span>: other string formats. Selecting this column as X axis will produce a Bars plot with the column values as labels for the bars</li><li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Numeric</span>: integer or real values</li></ul><p>Double-clicking the Y cells you can change the used color for that graph.</p></body></html> + + + + Columns Sütun - + X X - + Y Y - _ - _ + _ + + + + Axis Type + + + + + Here is a plot drawn when you select the x and y values above. + +Click on points to select them in the plot and in the table. Ctrl+Click for selecting a range of points. + +Use mouse-wheel for zooming and mouse drag for changing the axis range. + +Select the axes or axes labels to drag and zoom only in that orientation. + - + Line type: Çizgi Tipi: - - + + None None - + Line Çizgi - + StepLeft Sola Basamakla - + StepRight Sağa Basamakla - + StepCenter Merkeze Basamakla - + Impulse Kaydırmalı - + Point shape: Nokta Şekli: - + Cross Çarpı - + Plus Artı - + Circle Daire - + Disc Disk - + Square Kare - + Diamond Elmas - + Star Yıldız - + Triangle Üçgen - + TriangleInverted Ters Üçgen - + CrossSquare Çapraz Kare - + PlusSquare Kare İçinde Artı - + CrossCircle Daire İçinde Çarpı - + PlusCircle Daire İçinde Artı - + Peace Barış Simgesi - + <html><head/><body><p>Save current plot...</p><p>File format chosen by extension (png, jpg, pdf, bmp)</p></body></html> <html><head/><body><p>Geçerli planı kaydedin...</p><p>Dosya formatı eklenti tarafından seçilmiş (png, jpg, pdf, bmp)</p></body></html> - + Save current plot... Geçerli planı kaydet... - - Load all data. This has only an effect if not all data has been fetched from the table yet due to the partial fetch mechanism. + + + Load all data and redraw plot - - - + + + Row # - Choose a axis color - Renk eksenini seçiniz + Renk eksenini seçiniz + + + + Copy + + + + + Print... + + + + + Show legend + + + + + Stacked bars + + + + + Date/Time + + + + + Date + + + + + Time + + + + + + Numeric + - + + Label + + + + + Invalid + + + + + Load all data and redraw plot. +Warning: not all data has been fetched from the table yet due to the partial fetch mechanism. + + + + + Choose an axis color + + + + Choose a filename to save under Kaydetmek için dosya ismi seçiniz - + PNG(*.png);;JPG(*.jpg);;PDF(*.pdf);;BMP(*.bmp);;All Files(*) PNG(*.png);;JPG(*.jpg);;PDF(*.pdf);;BMP(*.bmp);;Tüm dosyalar(*) - - Fetching all data... + + There are curves in this plot and the selected line style can only be applied to graphs sorted by X. Either sort the table or query by X to remove curves or select one of the styles supported by curves: None or Line. - Cancel - İptal + İptal @@ -3152,8 +4648,8 @@ - - + + ... ... @@ -3168,42 +4664,44 @@ Di&l - + Automatic &updates Otomatik - - - - - - + + + + + + + + enabled etkin - + Show remote options - + &Database &Veritabanı - + Database &encoding &Veritabanı kodlaması - + Open databases with foreign keys enabled. Veritabanlarını Yabancı Anahtarlar etkin olacak şekilde aç. - + &Foreign keys &Yabancı Anahtarlar @@ -3216,299 +4714,445 @@ &Önceden getirilecek blok boyutu - + Data &Browser Veri &Görüntüleyici - NULL fields - Geçersiz alanlar + Geçersiz alanlar Text &colour Yazı &rengi - &Text - &Yazı + &Yazı Bac&kground colour Ar&kaplan rengi - + Remove line breaks in schema &view - + Prefetch block si&ze - + Advanced Gelişmiş - + SQ&L to execute after opening database - + Default field type - + Font - + &Font - - Font si&ze: - - - - + Content - + Symbol limit in cell - - Field colors - - - - + NULL - + Regular - Text - Metin + Metin - + Binary İkili - + Background - + Filters - + + Toolbar style + + + + + Only display the icon + + + + + Only display the text + + + + + The text appears beside the icon + + + + + The text appears under the icon + + + + + Follow the style + + + + + DB file extensions + + + + + Manage + + + + + When enabled, the line breaks in the Schema column of the DB Structure tab, dock and printed output are removed. + + + + + Font si&ze + + + + + + This is the maximum number of rows in a table for enabling the value completion based on current values in the column. +Can be set to 0 for disabling completion. + + + + + Row count threshold for completion + + + + + Field display + + + + + Displayed &text + + + + + Text color + + + + + Background color + + + + + Preview only (N/A) + + + + Escape character - + Delay time (&ms) - + Set the waiting time before a new filter value is applied. Can be set to 0 for disabling waiting. - + &SQL &SQL - + Settings name Ayarlar ismi - + Context Özellik - + Colour Renk - + Bold Kalın - + Italic İtalik - + Underline Altı çizili - + Keyword Anahtar Kelime - function - fonksiyon + fonksiyon - + Function Fonksiyon - + Table Tablo - + Comment Yorum - + Identifier Kimlik - + String String - currentline - currentline + currentline - + Current line Geçerli satır - - SQL &editor font size - SQL &Editör yazı boyutu + + SQL &editor font size + SQL &Editör yazı boyutu + + + SQL &log font size + SQL &günlüğü yazı boyutu + + + + Tab size + + + + + &Wrap lines + + + + + Never + + + + + At word boundaries + + + + + At character boundaries + + + + + At whitespace boundaries + + + + + &Quotes for identifiers + + + + + Choose the quoting mechanism used by the application for identifiers in SQL code. + + + + + "Double quotes" - Standard SQL (recommended) + + + + + `Grave accents` - Traditional MySQL quotes + + + + + [Square brackets] - Traditional MS SQL Server quotes + + + + + Keywords in &UPPER CASE + + + + + When set, the SQL keywords are completed in UPPER CASE letters. + + + + + When set, the SQL code lines that caused errors during the last execution are highlighted and the results frame indicates the error in the background + - - SQL &log font size - SQL &günlüğü yazı boyutu + + <html><head/><body><p>SQLite provides an SQL function for loading extensions from a shared library file. Activate this if you want to use the <span style=" font-style:italic;">load_extension()</span> function from SQL code.</p><p>For security reasons, extension loading is turned off by default and must be enabled through this setting. You can always load extensions through the GUI, even though this option is disabled.</p></body></html> + - - Tab size + + Allow loading extensions from SQL code - + Remote - + CA certificates - - + + Subject CN - + Common Name - + Subject O - + Organization - - + + Valid from - - + + Valid to - - + + Serial number - + Your certificates - + File File - + Subject Common Name - + Issuer CN - + Issuer Common Name - + Clone databases into @@ -3517,209 +5161,236 @@ Tab boşluğu: - + SQL editor &font SQL Editör &yazı boyutu - + Error indicators - - Enabling error indicators highlights the SQL code lines that caused errors during the last execution - - - - + Hori&zontal tiling - + If enabled the SQL code editor and the result table view are shown side by side instead of one over the other. - + Code co&mpletion - + + Foreground + + + + + SQL &results font size + + + + &Extensions &Eklentiler - + Select extensions to load for every database: Her veritabanında kullanmak için eklenti seçiniz: - + Add extension Eklenti Ekle - + Remove extension Eklenti Sil - + <html><head/><body><p>While supporting the REGEXP operator SQLite doesn't implement any regular expression<br/>algorithm but calls back the running application. DB Browser for SQLite implements this<br/>algorithm for you to let you use REGEXP out of the box. However, as there are multiple possible<br/>implementations of this and you might want to use another one, you're free to disable the<br/>application's implementation and load your own by using an extension. Requires restart of the application.</p></body></html> <html><head/><body><p>Kurallı ifade(REGEXP) operatörü aktif edildiğinde SQLite, herhangi bir kurallı ifade uygulamaz ama şuan da çalışan uygulamayı geri çağırır. <br/>SQLite DB Browser kurallı ifadeyi kutunun dışında kullanmanıza izin vermek için bu algoritmayı uygular. <br/>Birden çok muhtemel uygulama olduğu gibi sizde farklı birini kullanabilirsiniz.<br/>Programın uygulamalarını devre dışı bırakmakta ve kendi eklentinizle kendi uygulamanızı yüklemekte özgürsünüz.<br/>Ayrıca uygulamayı yeniden başlatmak gerekir.</p></body></html> - + Disable Regular Expression extension Kurallı İfade eklentisini devre dışı bırak - - + + Choose a directory Dizin seçiniz - + The language will change after you restart the application. Seçilen dil uygulama yeniden başlatıldıktan sonra uygulanacaktır. - + Select extension file Eklenti dosyası seçiniz - + Extensions(*.so *.dll);;All files(*) Eklentiler(*.so *.dll);;Tüm dosyalar(*) - + Import certificate file - + No certificates found in this file. - + Are you sure you want do remove this certificate? All certificate data will be deleted from the application settings! + + + Are you sure you want to clear all the saved settings? +All your preferences will be lost and default values will be used. + + QObject - + Error importing data Veriyi içe aktarılırken hata oluştu - + from record number %1 kayıt numarasından: %1 - + . %1 . %1 - + + Importing CSV file... + + + Decoding CSV file... - CSV dosyasının şifresi çözülüyor... + CSV dosyasının şifresi çözülüyor... - + Cancel İptal - Collation needed! Proceed? - Harmanlama gerekli! Devam edilsin mi? + Harmanlama gerekli! Devam edilsin mi? - A table in this database requires a special collation function '%1' that this application can't provide without further knowledge. If you choose to proceed, be aware bad things can happen to your database. Create a backup! - Bu veritabanınındaki bir tablo özel '%1' koleksiyon fonksiyonu gerektirmektedir. + Bu veritabanınındaki bir tablo özel '%1' koleksiyon fonksiyonu gerektirmektedir. Daha fazla bilgi olmadan program bunu sağlayamaz. Eğer bu şekilde devam edecekseniz, veritabanınıza kötü şeyler olabileceğinin farkında olun ve yedek oluşturun. - SQLite database files (*.db *.sqlite *.sqlite3 *.db3);;All files (*) - SQLite veritabanı dosyaları (*.db *.sqlite *.sqlite3 *.db3);;Tüm dosyalar (*) + SQLite veritabanı dosyaları (*.db *.sqlite *.sqlite3 *.db3);;Tüm dosyalar (*) + + + + All files (*) + + + + + SQLite database files (*.db *.sqlite *.sqlite3 *.db3) + RemoteDatabase - + Error when connecting to %1. %2 - + Error opening remote file at %1. %2 - + Error: Invalid client certificate specified. - + Please enter the passphrase for this client certificate in order to authenticate. - + Cancel İptal - + Uploading remote database to -%1. +%1 - + Downloading remote database from -%1. +%1 + + + + + The remote database has been updated since the last checkout. Do you want to update the local database to the newest version? Note that this discards any changes you have made locally! If you don't want to lose local changes, click No to open the local version. - - + + Error: The network is not accessible. - + Error: Cannot open the file for sending. - + Error opening local databases list. %1 - + Error creating local databases list. %1 @@ -3739,14 +5410,24 @@ + Connect to the remote server using the currently selected identity. The correct server is taken from the identity as well. + + + + Go - + Push currently opened database to server + + + <html><head/><body><p>In this pane, remote databases from dbhub.io website can be added to DB4S. First you need an identity:</p><ol style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;"><li style=" margin-top:12px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Login to the dbhub.io website (use your GitHub credentials or whatever you want)</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Click the button to create a DB4S certificate (that's your identity). That'll give you a certificate file (save it to your local disk).</li><li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Go to the Remote tab in DB4S Preferences. Click the button to add a new certificate to DB4S and choose the just downloaded certificate file.</li></ol><p>Now the Remote panel shows your identity and you can add remote databases.</p></body></html> + + RemoteModel @@ -3793,12 +5474,12 @@ - + Commit message - + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } @@ -3807,27 +5488,42 @@ - + Database licence - + Public - + + Branch + + + + + Force push + + + + Database will be public. Everyone has read access to it. - + Database will be private. Only you have access to it. - + + Use with care. This can cause remote commits to be deleted. + + + + Unspecified @@ -3840,312 +5536,493 @@ Form - + + Find previous match [Shift+F3] + + + + + Find previous match with mapping + + + + + Shift+F3 + Shift+F3 + + + + The found pattern must be a whole word + + + + + Whole Words + + + + + Text pattern to find considering the checks in this frame + + + + + Find in editor + + + + + The found pattern must match in letter case + + + + + Case Sensitive + + + + + Find next match [Enter, F3] + + + + + Find next match with wrapping + + + + + F3 + F3 + + + + Interpret search pattern as a regular expression + + + + + <html><head/><body><p>When checked, the pattern to find is interpreted as a UNIX regular expression. See <a href="https://en.wikibooks.org/wiki/Regular_Expressions">Regular Expression in Wikibooks</a>.</p></body></html> + + + + + Regular Expression + + + + + + Close Find Bar + + + + + Results of the last executed statements Son yürütülen ifadenin sonucu - + This field shows the results and status codes of the last executed statements. Bu alan son yürütülen ifadenin durum kodlarını ve sonuçlarını gösterir. - Export to &CSV - &CSV dosyası olarak dışa aktar + &CSV dosyası olarak dışa aktar - Save as &view - &Görünümü kaydet + &Görünümü kaydet - Save as view - Görünümü kaydet + Görünümü kaydet - Please specify the view name - Lütfen görünümünün ismini belirtin + Lütfen görünümünün ismini belirtin - There is already an object with that name. Please choose a different name. - Bu isme sahip obje zaten mevcut. Lütfen farklı bir isim seçiniz. + Bu isme sahip obje zaten mevcut. Lütfen farklı bir isim seçiniz. - View successfully created. - Görünüm başarıyla oluşturuldu. + Görünüm başarıyla oluşturuldu. - Error creating view: %1 - Görünüm oluşturma hatası: %1 + Görünüm oluşturma hatası: %1 SqlUiLexer - + (X) The abs(X) function returns the absolute value of the numeric argument X. (X) abs(X) fonksiyonu X sayısal argümanının mutlak değerini döndürür. - + () The changes() function returns the number of database rows that were changed or inserted or deleted by the most recently completed INSERT, DELETE, or UPDATE statement. () changes() fonksiyonu en son yürütülen INSERT, DELETE veya UPDATE ifadesinden etkilenen veritabanı satırlarının sayısını döndürür. - + (X1,X2,...) The char(X1,X2,...,XN) function returns a string composed of characters having the unicode code point values of integers X1 through XN, respectively. (X1,X2,...) char(X1,X2,...,XN) fonksiyonu sırasıyla X1'den XN'e kadar olan tamsayıların unicode karakter karşılıklarından oluşan dizeyi döndürür. - + (X,Y,...) The coalesce() function returns a copy of its first non-NULL argument, or NULL if all arguments are NULL (X,Y,...) coalesce() fonksiyonu NULL olmayan ilk argümanı döndürür. Eğer tüm argümanlar NULL ise NULL değerini döndürür. - + (X,Y) The glob(X,Y) function is equivalent to the expression "Y GLOB X". (X,Y) glob(X,Y) fonksiyonu "Y GLOB X" ifadesinin eşdeğerini döndürür. - + (X,Y) The ifnull() function returns a copy of its first non-NULL argument, or NULL if both arguments are NULL. (X,Y) ifnull() fonksiyonu NULL olmayan ilk argümanı döndürür. Eğer her iki argüman da NULL ise NULL değerini döndürür. - + (X,Y) The instr(X,Y) function finds the first occurrence of string Y within string X and returns the number of prior characters plus 1, or 0 if Y is nowhere found within X. (X,Y) instr(X,Y) fonksiyonu ilk önce X dizesinin içinde Y dizesinin içeriğini arar ve eşleşen yerden önceki karakterlerin sayısının 1 fazlasını döndürür. Eğer Y, X içerisinde bulunmazsa 0 değerini döndürür. - + (X) The hex() function interprets its argument as a BLOB and returns a string which is the upper-case hexadecimal rendering of the content of that blob. (X) hex() fonksiyonu argümanı BLOB olarak yorumlar ve BLOB içeriğinin büyük harf onaltılık kısmını dize olarak döndürür. - + () The last_insert_rowid() function returns the ROWID of the last row insert from the database connection which invoked the function. () last_insert_rowid() fonksiyonu çağrılan veritabanı bağlantısından en son eklenen satırın ROWID değerini döndürür. - + (X) For a string value X, the length(X) function returns the number of characters (not bytes) in X prior to the first NUL character. (X) length() fonksiyonu X dize değeri için NULL ifadesine kadar olan karakter sayısını döndürür (bayt olarak değil). - + (X,Y) The like() function is used to implement the "Y LIKE X" expression. (X,Y) like() fonksiyonu "Y LIKE X" ifadesini uygulamak için kullanılır. - + (X,Y,Z) The like() function is used to implement the "Y LIKE X ESCAPE Z" expression. (X,Y,Z) like() fonksiyonu "Y LIKE X ESCAPE Z" ifadesini uygulamak için kullanılır. - (X) The load_extension(X) function loads SQLite extensions out of the shared library file named X. - (X) load_extension(X) fonksiyonu SQLite eklentilerini paylaşılan kitaplık dışına X ismiyle yükler. + (X) load_extension(X) fonksiyonu SQLite eklentilerini paylaşılan kitaplık dışına X ismiyle yükler. - (X,Y) The load_extension(X) function loads SQLite extensions out of the shared library file named X using the entry point Y. - (X,Y) load_extension(X) fonksiyonu Y başlangıç noktasını kullanarak SQLite eklentilerini paylaşılan kitaplık dışına X ismiyle yükler. + (X,Y) load_extension(X) fonksiyonu Y başlangıç noktasını kullanarak SQLite eklentilerini paylaşılan kitaplık dışına X ismiyle yükler. - + + (X) The load_extension(X) function loads SQLite extensions out of the shared library file named X. +Use of this function must be authorized from Preferences. + + + + + (X,Y) The load_extension(X) function loads SQLite extensions out of the shared library file named X using the entry point Y. +Use of this function must be authorized from Preferences. + + + + (X) The lower(X) function returns a copy of string X with all ASCII characters converted to lower case. (X) lower(X) fonksiyonu tüm X dizesinin tüm ASCII karakterlerinin küçük harfe dönüştürülmüş karşılığını döndürür. - + (X) ltrim(X) removes spaces from the left side of X. (X) ltrim(X) fonksiyonu X'in sol tarafındaki boşlukları siler. - + (X,Y) The ltrim(X,Y) function returns a string formed by removing any and all characters that appear in Y from the left side of X. (X,Y) ltrim(X,Y) fonksiyonu X'in sol tarafındaki Y'de bulunan tüm karakterlerin silinmiş halini dize halinde döndürür. - + (X,Y,...) The multi-argument max() function returns the argument with the maximum value, or return NULL if any argument is NULL. (X,Y,...) Çok argümanlı max() fonksiyonu en büyük değere sahip argümanı döndürür. Eğer herhangi bir argüman NULL ise NULL değerini döndürür. - + (X,Y,...) The multi-argument min() function returns the argument with the minimum value. (X,Y,...) Çok argümanlı min() fonksiyonu en küçük değere sahip argümanı döndürür. - + (X,Y) The nullif(X,Y) function returns its first argument if the arguments are different and NULL if the arguments are the same. (X,Y) nullif(X,Y) fonksiyonu eğer argümanlar farklı ise ilk argümanı, eğer argümanlar aynı ise NULL döndürür. - + (FORMAT,...) The printf(FORMAT,...) SQL function works like the sqlite3_mprintf() C-language function and the printf() function from the standard C library. (FORMAT,...) printf(FORMAT,...) SQL fonksiyonu C dilindeki sqlite3_mprintf() fonksiyonu ve standard C kütüphanesindeki printf() fonksiyonu ile aynı mantıkta çalışır. - + (X) The quote(X) function returns the text of an SQL literal which is the value of its argument suitable for inclusion into an SQL statement. (X) quote(X) fonksiyonu girilen argümanlardan SQL ifadesi olarak tam anlamıyla dahil edilmeye uygun olanları döndürür. - + () The random() function returns a pseudo-random integer between -9223372036854775808 and +9223372036854775807. () random() fonksiyonu -9223372036854775808 ve +9223372036854775807 tamsayı değerli arasında rastgele değer döndürür. - + (N) The randomblob(N) function return an N-byte blob containing pseudo-random bytes. (N) randomblob(N) fonksiyonu rastgele bayt içeren N-byte türünde blob döndürür. - + (X,Y,Z) The replace(X,Y,Z) function returns a string formed by substituting string Z for every occurrence of string Y in string X. (X,Y,Z) replace(X,Y,Z) fonksiyonu X içindeki her Y argümanını, Z argümanıyla değiştirmesiyle oluşan dizeyi döndürür. - + (X) The round(X) function returns a floating-point value X rounded to zero digits to the right of the decimal point. (X) round(X) fonksiyonu X ondalıklı sayısının ondalıklı kısmın sıfıra yuvarlanmasıyla oluşan değeri döndürür. - + (X,Y) The round(X,Y) function returns a floating-point value X rounded to Y digits to the right of the decimal point. (X,Y) round(X,Y) fonksiyonu X ondalıklı sayısının Y kadar sağındaki ondalıklı kısmı sıfıra yuvarlanmasıyla oluşan değeri döndürür. - + (X) rtrim(X) removes spaces from the right side of X. (X) rtrim(X) fonksiyonu X'in sağ tarafındaki boşlukları siler. - + (X,Y) The rtrim(X,Y) function returns a string formed by removing any and all characters that appear in Y from the right side of X. (X,Y) rtrim(X,Y) fonksiyonu X'in sağ tarafındaki Y'de bulunan tüm karakterlerin silinmiş halini dize halinde döndürür. - + (X) The soundex(X) function returns a string that is the soundex encoding of the string X. (X) soundex(X) fonksiyonu X dizesinin soundex kodlamasını string olarak döndürür. - + (X,Y) substr(X,Y) returns all characters through the end of the string X beginning with the Y-th. (X,Y) substr(X,Y) fonksiyonu X dizesinin başlangıcından Y. indekse kadar olan string bölümünü döndürür. - + (X,Y,Z) The substr(X,Y,Z) function returns a substring of input string X that begins with the Y-th character and which is Z characters long. (X,Y,Z) substr(X,Y,Z) fonksiyonu X dizesinin Y. indeksinden başlayarak Z uzunluğu kadar olan string bölümünü döndürür. - + () The total_changes() function returns the number of row changes caused by INSERT, UPDATE or DELETE statements since the current database connection was opened. () total_changes() fonksiyonu geçerli veritabanı bağlantısı açıldığından itibaren INSERT, UPDATE veya DELETE ifadelerinden etkilenen toplam satır sayısını döndürür. - + (X) trim(X) removes spaces from both ends of X. (X) trim(X) fonksiyonu X'in içinde bulunan boşlukları siler. - + (X,Y) The trim(X,Y) function returns a string formed by removing any and all characters that appear in Y from both ends of X. (X,Y) trim(X,Y) fonksiyonu X'in içindeki Y'de bulunan tüm karakterlerin silinmiş halini dize halinde döndürür. - + (X) The typeof(X) function returns a string that indicates the datatype of the expression X. (X) typeof(X) fonksiyonu X ifadesinin veri tipini gösteren dizeyi döndürür. - + (X) The unicode(X) function returns the numeric unicode code point corresponding to the first character of the string X. (X) unicode(X) fonksiyonu X'in ilk karakterine karşılık gelen unicode kod noktasını döndürür. - + (X) The upper(X) function returns a copy of input string X in which all lower-case ASCII characters are converted to their upper-case equivalent. (X) upper(X) fonksiyonu tüm X dizesinin tüm küçük ASCII karakterlerinin büyük harf karşılığına çevrilmiş kopyasını döndürür. - + (N) The zeroblob(N) function returns a BLOB consisting of N bytes of 0x00. (N) zeroblob(N) fonksiyonu 0x00'ın N bayt kadar meydana gelmiş halini BLOB olarak döndürür. - - - - + + + + (timestring,modifier,modifier,...) - + (format,timestring,modifier,modifier,...) - + (X) The avg() function returns the average value of all non-NULL X within a group. (X) avg() fonksiyonu bir gruptaki NULL olmayan tüm X değerlerinin ortalama değerini döndürür. - + (X) The count(X) function returns a count of the number of times that X is not NULL in a group. (X) count(X) fonksiyonu bir gruptaki X'in kaç kere NULL olmadığının sayısını döndürür. - + (X) The group_concat() function returns a string which is the concatenation of all non-NULL values of X. (X) group_concat() fonksiyonu X'in NULL olmayan tüm değerlerle birleşimini dize olarak döndürür. - + (X,Y) The group_concat() function returns a string which is the concatenation of all non-NULL values of X. If parameter Y is present then it is used as the separator between instances of X. (X,Y) group_concat() fonksiyonu X'in NULL olmayan tüm değerlerle birleşimini dize olarak döndürür. Eğer Y parametresi mevcutsa X'in örnekleri arasında ayraç olarak kullanılır. - + (X) The max() aggregate function returns the maximum value of all values in the group. (X) max() küme fonksiyonu gruptaki tüm değerler arasından en büyük değeri döndürür. - + (X) The min() aggregate function returns the minimum non-NULL value of all values in the group. (X) min() küme fonksiyonu gruptaki NULL olmayan tüm değerler arasından en küçük değeri döndürür. - - + + (X) The sum() and total() aggregate functions return sum of all non-NULL values in the group. (X) sum() ve total() küme fonksiyonları gruptaki NULL olmayan tüm değerlerin toplamını döndürür. + + + () The number of the row within the current partition. Rows are numbered starting from 1 in the order defined by the ORDER BY clause in the window definition, or in arbitrary order otherwise. + + + + + () The row_number() of the first peer in each group - the rank of the current row with gaps. If there is no ORDER BY clause, then all rows are considered peers and this function always returns 1. + + + + + () The number of the current row's peer group within its partition - the rank of the current row without gaps. Partitions are numbered starting from 1 in the order defined by the ORDER BY clause in the window definition. If there is no ORDER BY clause, then all rows are considered peers and this function always returns 1. + + + + + () Despite the name, this function always returns a value between 0.0 and 1.0 equal to (rank - 1)/(partition-rows - 1), where rank is the value returned by built-in window function rank() and partition-rows is the total number of rows in the partition. If the partition contains only one row, this function returns 0.0. + + + + + () The cumulative distribution. Calculated as row-number/partition-rows, where row-number is the value returned by row_number() for the last peer in the group and partition-rows the number of rows in the partition. + + + + + (N) Argument N is handled as an integer. This function divides the partition into N groups as evenly as possible and assigns an integer between 1 and N to each group, in the order defined by the ORDER BY clause, or in arbitrary order otherwise. If necessary, larger groups occur first. This function returns the integer value assigned to the group that the current row is a part of. + + + + + (expr) Returns the result of evaluating expression expr against the previous row in the partition. Or, if there is no previous row (because the current row is the first), NULL. + + + + + (expr,offset) If the offset argument is provided, then it must be a non-negative integer. In this case the value returned is the result of evaluating expr against the row offset rows before the current row within the partition. If offset is 0, then expr is evaluated against the current row. If there is no row offset rows before the current row, NULL is returned. + + + + + + (expr,offset,default) If default is also provided, then it is returned instead of NULL if the row identified by offset does not exist. + + + + + (expr) Returns the result of evaluating expression expr against the next row in the partition. Or, if there is no next row (because the current row is the last), NULL. + + + + + (expr,offset) If the offset argument is provided, then it must be a non-negative integer. In this case the value returned is the result of evaluating expr against the row offset rows after the current row within the partition. If offset is 0, then expr is evaluated against the current row. If there is no row offset rows after the current row, NULL is returned. + + + + + (expr) This built-in window function calculates the window frame for each row in the same way as an aggregate window function. It returns the value of expr evaluated against the first row in the window frame for each row. + + + + + (expr) This built-in window function calculates the window frame for each row in the same way as an aggregate window function. It returns the value of expr evaluated against the last row in the window frame for each row. + + + + + (expr,N) This built-in window function calculates the window frame for each row in the same way as an aggregate window function. It returns the value of expr evaluated against the row N of the window frame. Rows are numbered within the window frame starting from 1 in the order defined by the ORDER BY clause if one is present, or in arbitrary order otherwise. If there is no Nth row in the partition, then NULL is returned. + + SqliteTableModel - + + reading rows + + + + + loading... + + + + References %1(%2) -Hold Ctrl+Shift and click to jump there +Hold %3Shift and click to jump there - + Error changing data: %1 Veri değiştirme hatası: %1 + + + retrieving list of columns + + + + + Fetching data... + + + + + Cancel + İptal + VacuumDialog @@ -4156,13 +6033,21 @@ - Warning: Compacting the database will commit all changes you made. - Uyarı: Veritabanını genişletmek bütün yaptığınız değişiklikleri işleyecektir. + Warning: Compacting the database will commit all of your changes. + + Please select the databases to co&mpact: + + + + Warning: Compacting the database will commit all changes you made. + Uyarı: Veritabanını genişletmek bütün yaptığınız değişiklikleri işleyecektir. + + Please select the objects to compact: - Lütfen genişletilecek objeyi seçiniz: + Lütfen genişletilecek objeyi seçiniz: diff -Nru sqlitebrowser-3.10.100ubuntu1/src/translations/sqlb_uk_UA.ts sqlitebrowser-3.11.1/src/translations/sqlb_uk_UA.ts --- sqlitebrowser-3.10.100ubuntu1/src/translations/sqlb_uk_UA.ts 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/src/translations/sqlb_uk_UA.ts 2019-02-19 23:51:34.000000000 +0000 @@ -15,8 +15,12 @@ - <html><head/><body><p>DB Browser for SQLite is an open source, freeware visual tool used to create, design and edit SQLite database files.</p><p>It is bi-licensed under the Mozilla Public License Version 2, as well as the GNU General Public License Version 3 or later. You can modify or redistribute it under the conditions of these licenses.</p><p>See <a href="http://www.gnu.org/licenses/gpl.html"><span style=" text-decoration: underline; color:#0000ff;">http://www.gnu.org/licenses/gpl.html</span></a> and <a href="https://www.mozilla.org/MPL/2.0/index.txt"><span style=" text-decoration: underline; color:#0000ff;">https://www.mozilla.org/MPL/2.0/index.txt</span></a> for details.</p><p>For more information on this program please visit our website at: <a href="http://sqlitebrowser.org"><span style=" text-decoration: underline; color:#0000ff;">http://sqlitebrowser.org</span></a></p><p><span style=" font-size:small;">This software uses the GPL/LGPL Qt Toolkit from </span><a href="http://qt-project.org/"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://qt-project.org/</span></a><span style=" font-size:small;"><br/>See </span><a href="http://qt-project.org/doc/qt-5/licensing.html"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://qt-project.org/doc/qt-5/licensing.html</span></a><span style=" font-size:small;"> for licensing terms and information.</span></p><p><span style=" font-size:small;">It also uses the Silk icon set by Mark James licensed under a Creative Commons Attribution 2.5 and 3.0 license.<br/>See </span><a href="http://www.famfamfam.com/lab/icons/silk/"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://www.famfamfam.com/lab/icons/silk/</span></a><span style=" font-size:small;"> for details.</span></p></body></html> - <html><head/><body><p>Оглядач БД для SQLite - це безкоштовна програма з відкритим вихідним кодом, призначена для створення і редагування баз даних SQLite.</p><p>Програма має дозволи за двома ліцензіями: Mozilla Public License Version 2 та GNU General Public License Version 3 або пізніші. Можна змінювати або розповсюджувати її за умовами цих ліцензій.</p><p>Посилання <a href="http://www.gnu.org/licenses/gpl.html"><span style="text-decoration: underline; color:#0000ff;">http://www.gnu.org/licenses/gpl.html</span></a> та <a href="https://www.mozilla.org/MPL/2.0/index.txt"><span style=" text-decoration: underline; color:#0000ff;">https://www.mozilla.org/MPL/2.0/index.txt</span></a> для детальної інформації.</p><p>Більше інформації про програму можна отримати на веб-сайті: <a href="http://sqlitebrowser.org"><span style=" text-decoration: underline; color:#0000ff;">http://sqlitebrowser.org</span></a></p><p><span style=" font-size:small;">Це програмне забезпечення використовує GPL/LGPL Qt Toolkit </span><a href="http://qt-project.org/"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://qt-project.org/</span></a><span style=" font-size:small;"><br/>Посилання </span><a href="http://qt-project.org/doc/qt-5/licensing.html"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://qt-project.org/doc/qt-5/licensing.html</span></a><span style=" font-size:small;"> для перегляду інформації про умови ліцензії.</span></p><p><span style=" font-size:small;">Ця програма також використовує набір значків Silk від Марка Джеймса (Mark James) з ліцензіями Creative Commons Attribution 2.5 та 3.0.<br />Посилання </span><a href="http://www.famfamfam.com/lab/icons/silk/"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://www.famfamfam.com/lab/icons/silk/</span></a><span style=" font-size:small;"> для детальної інформації.</span></p> <p><span style="font-size: small;">Переклад українською здійснив Андрій Кондратьєв <a href="mailto:inbox@kondratyev.dp.ua">inbox@kondratyev.dp.ua</a><br /> Зв'язок з автором: </span><a href="https://www.facebook.com/a.s.kondratyev"><span style="font-size: small; text-decoration: underline; color: #0000ff;">https://www.facebook.com/a.s.kondratyev</span></a><span style="font-size:small;">. </p><p> Редактор - Genyk <a href="mailto:Genyk95@gmail.com">Genyk95@gmail.com</a><br/> </span></p> </body></html> + <html><head/><body><p>DB Browser for SQLite is an open source, freeware visual tool used to create, design and edit SQLite database files.</p><p>It is bi-licensed under the Mozilla Public License Version 2, as well as the GNU General Public License Version 3 or later. You can modify or redistribute it under the conditions of these licenses.</p><p>See <a href="http://www.gnu.org/licenses/gpl.html">http://www.gnu.org/licenses/gpl.html</a> and <a href="https://www.mozilla.org/MPL/2.0/index.txt">https://www.mozilla.org/MPL/2.0/index.txt</a> for details.</p><p>For more information on this program please visit our website at: <a href="http://sqlitebrowser.org">http://sqlitebrowser.org</a></p><p><span style=" font-size:small;">This software uses the GPL/LGPL Qt Toolkit from </span><a href="http://qt-project.org/"><span style=" font-size:small;">http://qt-project.org/</span></a><span style=" font-size:small;"><br/>See </span><a href="http://qt-project.org/doc/qt-5/licensing.html"><span style=" font-size:small;">http://qt-project.org/doc/qt-5/licensing.html</span></a><span style=" font-size:small;"> for licensing terms and information.</span></p><p><span style=" font-size:small;">It also uses the Silk icon set by Mark James licensed under a Creative Commons Attribution 2.5 and 3.0 license.<br/>See </span><a href="http://www.famfamfam.com/lab/icons/silk/"><span style=" font-size:small;">http://www.famfamfam.com/lab/icons/silk/</span></a><span style=" font-size:small;"> for details.</span></p></body></html> + + + + <html><head/><body><p>DB Browser for SQLite is an open source, freeware visual tool used to create, design and edit SQLite database files.</p><p>It is bi-licensed under the Mozilla Public License Version 2, as well as the GNU General Public License Version 3 or later. You can modify or redistribute it under the conditions of these licenses.</p><p>See <a href="http://www.gnu.org/licenses/gpl.html"><span style=" text-decoration: underline; color:#0000ff;">http://www.gnu.org/licenses/gpl.html</span></a> and <a href="https://www.mozilla.org/MPL/2.0/index.txt"><span style=" text-decoration: underline; color:#0000ff;">https://www.mozilla.org/MPL/2.0/index.txt</span></a> for details.</p><p>For more information on this program please visit our website at: <a href="https://sqlitebrowser.org"><span style=" text-decoration: underline; color:#0000ff;">https://sqlitebrowser.org</span></a></p><p><span style=" font-size:small;">This software uses the GPL/LGPL Qt Toolkit from </span><a href="http://qt-project.org/"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://qt-project.org/</span></a><span style=" font-size:small;"><br/>See </span><a href="http://qt-project.org/doc/qt-5/licensing.html"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://qt-project.org/doc/qt-5/licensing.html</span></a><span style=" font-size:small;"> for licensing terms and information.</span></p><p><span style=" font-size:small;">It also uses the Silk icon set by Mark James licensed under a Creative Commons Attribution 2.5 and 3.0 license.<br/>See </span><a href="http://www.famfamfam.com/lab/icons/silk/"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://www.famfamfam.com/lab/icons/silk/</span></a><span style=" font-size:small;"> for details.</span></p></body></html> + <html><head/><body><p>Оглядач БД для SQLite - це безкоштовна програма з відкритим вихідним кодом, призначена для створення і редагування баз даних SQLite.</p><p>Програма має дозволи за двома ліцензіями: Mozilla Public License Version 2 та GNU General Public License Version 3 або пізніші. Можна змінювати або розповсюджувати її за умовами цих ліцензій.</p><p>Посилання <a href="http://www.gnu.org/licenses/gpl.html"><span style="text-decoration: underline; color:#0000ff;">http://www.gnu.org/licenses/gpl.html</span></a> та <a href="https://www.mozilla.org/MPL/2.0/index.txt"><span style=" text-decoration: underline; color:#0000ff;">https://www.mozilla.org/MPL/2.0/index.txt</span></a> для детальної інформації.</p><p>Більше інформації про програму можна отримати на веб-сайті: <a href="https://sqlitebrowser.org"><span style=" text-decoration: underline; color:#0000ff;">https://sqlitebrowser.org</span></a></p><p><span style=" font-size:small;">Це програмне забезпечення використовує GPL/LGPL Qt Toolkit </span><a href="http://qt-project.org/"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://qt-project.org/</span></a><span style=" font-size:small;"><br/>Посилання </span><a href="http://qt-project.org/doc/qt-5/licensing.html"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://qt-project.org/doc/qt-5/licensing.html</span></a><span style=" font-size:small;"> для перегляду інформації про умови ліцензії.</span></p><p><span style=" font-size:small;">Ця програма також використовує набір значків Silk від Марка Джеймса (Mark James) з ліцензіями Creative Commons Attribution 2.5 та 3.0.<br />Посилання </span><a href="http://www.famfamfam.com/lab/icons/silk/"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://www.famfamfam.com/lab/icons/silk/</span></a><span style=" font-size:small;"> для детальної інформації.</span></p> <p><span style="font-size: small;">Переклад українською здійснив Андрій Кондратьєв <a href="mailto:inbox@kondratyev.dp.ua">inbox@kondratyev.dp.ua</a><br /> Зв'язок з автором: </span><a href="https://www.facebook.com/a.s.kondratyev"><span style="font-size: small; text-decoration: underline; color: #0000ff;">https://www.facebook.com/a.s.kondratyev</span></a><span style="font-size:small;">. </p><p> Редактор - Genyk <a href="mailto:Genyk95@gmail.com">Genyk95@gmail.com</a><br/> </span></p> </body></html> @@ -32,86 +36,196 @@ Версія SQLite - + + (based on SQLite %1) + + + + Version Версія - + Qt Version Версія Qt - + SQLCipher Version Версія SQLCipher - + SQLite Version Версія SQLite + AddRecordDialog + + + Add New Record + + + + + Enter values for the new record considering constraints. Fields in bold are mandatory. + + + + + In the Value column you can specify the value for the field identified in the Name column. The Type column indicates the type of the field. Default values are displayed in the same style as NULL values. + + + + + Name + Ім'я + + + + Type + Тип + + + + Value + + + + + Values to insert. Pre-filled default values are inserted automatically unless they are changed. + + + + + When you edit the values in the upper frame, the SQL query for inserting this new record is shown here. You can edit manually the query before saving. + + + + + <html><head/><body><p><span style=" font-weight:600;">Save</span> will submit the shown SQL statement to the database for inserting the new record.</p><p><span style=" font-weight:600;">Restore Defaults</span> will restore the initial values in the <span style=" font-weight:600;">Value</span> column.</p><p><span style=" font-weight:600;">Cancel</span> will close this dialog without executing the query.</p></body></html> + + + + + Auto-increment + + + + + + Unique constraint + + + + + + Check constraint: %1 + + + + + + Foreign key: %1 + + + + + + Default value: %1 + + + + + + Error adding record. Message from database engine: + +%1 + + + + + Are you sure you want to restore all the entered values to their defaults? + + + + Application - + Usage: %1 [options] [db] Використання: %1 [options] [db] - + Possible command line arguments: Доступні ключі командного рядку: - + -h, --help Show command line options -h, --help Показати довідку - + -s, --sql [file] Execute this SQL file after opening the DB -s, --sql [file] Виконати цей SQL-файл після відкриття БД - + -t, --table [table] Browse this table after opening the DB -t, --table [table] Переглянути цю таблицю після відкриття БД - + + This is DB Browser for SQLite version %1. + + + + -q, --quit Exit application after running scripts -q, --quit Вийти з програми після виконання скриптів - - -v, --version Display the current version + + -R, --read-only Open database in read-only mode - - [file] Open this SQLite database - [file] Відкрити SQLite БД + + -o, --option [group/setting=value] Run application with this setting temporarily set to value + - - This is DB Browser for SQLite version %1%2. + + -v, --version Display the current version - + + [file] Open this SQLite database + [file] Відкрити SQLite БД + + + The -s/--sql option requires an argument -s/--sql опція вимагає аргумент - + The -t/--table option requires an argument -t/--table параметр таблиці вимагає аргумент - + + The -o/--option option requires an argument in the form group/setting=value + + + + Invalid option/non-existant file: %1 Невірна опція/файл не існує: %1 @@ -136,7 +250,7 @@ [file] Відкрити SQLite БД - + The file %1 does not exist Файл %1 не існує @@ -168,12 +282,12 @@ &Розмір сторінки - + Passphrase Парольна фраза - + Raw key Необроблений ключ @@ -182,7 +296,7 @@ Розмір &сторінки - + Please set a key to encrypt the database. Note that if you change any of the other, optional, settings you'll need to re-enter them as well every time you open the database file. Leave the password fields empty to disable the encryption. @@ -193,7 +307,7 @@ Процес може тривати деякий час. Рекомендується створити резервну копію перед продовженням! Всі незбережені зміни збережуться автоматично. - + Please enter the key used to encrypt the database. If any of the other settings were altered for this database file you need to provide this information as well. Будь ласка, введіть ключ для шифрування бази даних. @@ -223,67 +337,82 @@ За замовчуванням - + Decimal number Десяткове число - + Exponent notation Експоненціальний запис - + Hex blob Бінарні дані - + Hex number Шістнадцяткове число - + Apple NSDate to date Дата Apple NSDate - + + Java epoch (milliseconds) to date + + + + Julian day to date Дата за Юліанським календарем - + + Unix epoch to local time + + + + + Date as dd/mm/yyyy + + + + Lower case Нижній регістр - + Octal number Вісімкове число - + Round number Округлене число - + Unix epoch to date Unix-час - + Upper case Верхній регістр - + Windows DATE to date Windows дата - + Custom Мій формат @@ -291,86 +420,132 @@ DBBrowserDB - + + This database has already been attached. Its schema name is '%1'. + + + + Please specify the database name under which you want to access the attached database Будь ласка, вкажіть ім'я бази даних, під яким Ви хочете отримати доступ до під'єднаних баз даних - + Invalid file format Неправильний формат файлу - + + Do you really want to close this temporary database? All data will be lost. + + + + Do you want to save the changes made to the database file %1? Зберегти зроблені зміни у файлі бази даних %1? - + + The database is currently busy: + + + + + Do you want to abort that other operation? + + + + Exporting database to SQL file... Експорт бази даних у файл SQL... - - + + Cancel Скасувати - + + + No database file opened + + + + Executing SQL... Виконати код SQL... - + Action cancelled. Дію скасовано. - - + + Error in statement #%1: %2. Aborting execution%3. Помилка в операторі #%1: %2. Виконання скасовано%3. - - + + and rolling back і відкочено - + + Cannot delete this object + + + + Cannot set data on this object Не вдається встановити дані в цей об'єкт - + + A table with the name '%1' already exists in schema '%2'. + + + + renameColumn: cannot find column %1. renameColumn: не вдається знайти стовпець %1. - + Restoring some of the objects associated with this table failed. This is most likely because some column names changed. Here's the SQL statement which you might want to fix and execute manually: Не вдалося скасувати видалення деяких об'єктів, асоційованих із цією таблицею. Найімовірніша причина цього - зміна імен деяких стовпців таблиці. Ось SQL оператор, який потрібно виправити і виконати вручну: - + Error renaming table '%1' to '%2'.Message from database engine: %3 Помилка перейменування таблиці '%1' в '%2'. Повідомлення від ядра БД: %3 - + ... <string can not be logged, contains binary data> ... ... <рядок не можна записати в лог-файл, який містить двійкові дані> ... - + + could not get list of databases: %1 + + + + + Error loading extension: %1 + Помилка завантаження розширення: %1 + + + could not get column information неможливо отримати інформацію про стовпець @@ -388,24 +563,24 @@ renameColumn: неможливо знайти стовпець %1. - + renameColumn: creating savepoint failed. DB says: %1 renameColumn: помилка створення точки збереження. БД говорить: %1 - + renameColumn: creating new table failed. DB says: %1 renameColumn: помилка створення нової таблиці. БД говорить: %1 - + renameColumn: copying data to new table failed. DB says: %1 renameColumn: помилка копіювання даних у нову таблицю. БД говорить: %1 - + renameColumn: deleting old table failed. DB says: %1 renameColumn: помилка видалення старої таблиці. БД говорить: %1 @@ -415,7 +590,7 @@ Не вдалося скасувати видалення деяких об'єктів, асоційованих із цією таблицею. Найбільш імовірна причина цього - зміна імен деяких стовпців таблиці. Ось SQL оператор, який потрібно виправити і виконати вручну: - + renameColumn: releasing savepoint failed. DB says: %1 renameColumn: помилка звільнення точки збереження. БД говорить: %1 @@ -434,7 +609,7 @@ невідомий тип об'єкту %1 - + could not get list of db objects: %1, %2 неможливо отримати список об'єктів БД: %1, %2 @@ -443,22 +618,22 @@ неможливо отримати типи - + didn't receive any output from pragma %1 не отримано жодного виходу з Прагма %1 - + could not execute pragma command: %1, %2 неможливо виконати комманду-прагму: %1, %2 - + Error setting pragma %1 to %2: %3 Помилка встановлення Прагми %1 в %2: %3 - + File not found. Файл не знайдено. @@ -466,52 +641,66 @@ DbStructureModel - + Name Ім'я - + Object Об'єкт - + Type Тип - + Schema Схема - Browsables (%1) - Можна переглянути (%1) + Можна переглянути (%1) + + + + Database + + + + + Browsables + - + All Все - + + Temporary + + + + Tables (%1) Таблиці (%1) - + Indices (%1) Індекси (%1) - + Views (%1) Перегляди (%1) - + Triggers (%1) Тригери (%1) @@ -529,172 +718,386 @@ Режим: - - + + This is the list of supported modes for the cell editor. Choose a mode for viewing or editing the data of the current cell. + + + + Image Зображення + + JSON + + + + + XML + + + + + + Automatically adjust the editor mode to the loaded data type + + + - Import text - Імпортувати текст + This checkable button enables or disables the automatic switching of the editor mode. When a new cell is selected or new data is imported and the automatic switching is enabled, the mode adjusts to the detected data type. You can then change the editor mode manually. If you want to keep this manually switched mode while moving through the cells, switch the button off. + + Auto-switch + + + + + + Auto-format: pretty print on loading, compact on saving. + + + + + When enabled, the auto-format feature formats the data on loading, breaking the text in lines and indenting it for maximum readability. On data saving, the auto-format feature compacts the data removing end of lines, and unnecessary whitespace. + + + + + Autoformat + + + + + Import from file + + + + + Opens a file dialog used to import any kind of data to this database cell. + + + + + Export to file + + + + + Opens a file dialog used to export the contents of this database cell to a file. + + + + + + Print... + + + + + Open preview dialog for printing displayed image + + + + + + Ctrl+P + Ctrl+P + + + + Open preview dialog for printing displayed text + + + + + Copy Hex and ASCII + + + + + Copy selected hexadecimal and ASCII columns to the clipboard + + + + + Ctrl+Shift+C + + + + Import text + Імпортувати текст + + Opens a file dialog used to import text to this database cell. - Відкривається файловий діалог, щоб імпортувати текст у цю комірку бази даних. + Відкривається файловий діалог, щоб імпортувати текст у цю комірку бази даних. - + &Import &Імпортувати - Export text - Експортувати текст + Експортувати текст Opens a file dialog used to export the contents of this database cell to a text file . Відкриває файловий діалог, щоб експортувати вміст цієї комірки бази даних у текстовий файл. - + &Export &Експортувати - + Set this cell to NULL Присвоїти цій комірці значення NULL - + Set as &NULL Присвоїти &NULL - + + This editor mode lets you edit JSON or XML data with syntax highlighting, automatic formatting and validation before saving. + +Errors are indicated with a red squiggle underline. + + + + + Apply data to cell + + + + + This button saves the changes performed in the cell editor to the database cell. + + + + Apply Застосувати - + Text Текст - + Binary Двійкові дані - Opens a file dialog used to export the contents of this database cell to a text file. - Відкриває файловий діалог, щоб експортувати вміст цієї комірки бази даних у текстовий файл + Відкриває файловий діалог, щоб експортувати вміст цієї комірки бази даних у текстовий файл - + Erases the contents of the cell Очищення вмісту комірки - + This area displays information about the data present in this database cell Ця зона показує інформацію про дані, що є в цій комірці бази даних - + Type of data currently in cell Тип даних у комірці - + Size of data currently in table Розмір даних у таблиці - Choose a file - Обрати файл + Обрати файл - Text files(*.txt);;Image files(%1);;All files(*) - Текстові файли(*.txt);;Файли зображень(%1);;Всі файли(*) + Текстові файли(*.txt);;Файли зображень(%1);;Всі файли(*) - + Choose a filename to export data Вибрати ім'я файлу для експорту даних - Text files(*.txt);;All files(*) - Текстові файли(*.txt);;Всі файли(*) + Текстові файли(*.txt);;Всі файли(*) - Image data can't be viewed with the text editor - Зображення не можна показати в текстовому редакторі + Зображення не можна показати в текстовому редакторі - Binary data can't be viewed with the text editor - Бінарні дані не можна показати в текстовому редакторі + Бінарні дані не можна показати в текстовому редакторі - + Type of data currently in cell: %1 Image Тип даних у комірці: %1 Зображення - + %1x%2 pixel(s) %1x%2 пікселів - + Type of data currently in cell: NULL Тип даних у комірці: NULL - - + + Type of data currently in cell: Text / Numeric Тип даних у комірці: Текст / Числове - - - - %n char(s) - - %n символ - %n символу - %n символів - - - - Type of data currently in cell: Binary - Тип даних у комірці: Двійкові дані + + + Image data can't be viewed in this mode. + - - - - %n byte(s) - - %n байт - %n байта - %n байтів - + + + + Try switching to Image or Binary mode. + - - - EditIndexDialog - Create New Index - Створення нового індексу + + + Binary data can't be viewed in this mode. + + + + + + Try switching to Binary mode. + + + + + + + + Text files (*.txt) + + + + + + + JSON files (*.json) + + + + + + + + XML files (*.xml) + + + + + + Image files (%1) + + + + + + + Binary files (*.bin) + + + + + + All files (*) + + + + + Choose a file to import + Оберіть файл для імпорту + + + + %1 Image + + + + + SVG files (*.svg) + + + + + + Hex dump files (*.txt) + + + + + Invalid data for this mode + + + + + The cell contains invalid %1 data. Reason: %2. Do you really want to apply it to the cell? + + + + + + + %n char(s) + + %n символ + %n символу + %n символів + + + + + Type of data currently in cell: Valid JSON + + + + + Type of data currently in cell: Binary + Тип даних у комірці: Двійкові дані + + + + + %n byte(s) + + %n байт + %n байта + %n байтів + + + + + EditIndexDialog + + Create New Index + Створення нового індексу @@ -775,14 +1178,14 @@ %1 - + Deleting the old index failed: %1 Невдале видалення старого індексу: %1 - + Creating the index failed: %1 Невдале створення індексу @@ -807,122 +1210,129 @@ + Database schema + + + + Make this a 'WITHOUT rowid' table. Setting this flag requires a field of type INTEGER with the primary key flag set and the auto increment flag unset. Щоб створити таблицю 'WITHOUT rowid', потрібно, щоб у ній був первинний ключ INTEGER з відімкненим автоінкрементом. - + Without Rowid Без ідентифікатора - Set this to create a temporary table that is deleted when closing the database. - Встановіть це, щоб створити тимчасову таблицю, яка видалиться після закриття бази даних. + Встановіть це, щоб створити тимчасову таблицю, яка видалиться після закриття бази даних. - Temporary table - Тимчасова таблиця + Тимчасова таблиця - + Fields Поля - + Add field Додати поле - + Remove field Видалити поле - + Move field up Перемістити поле вгору - + Move field down Перемістити поле вниз - + Name Ім'я - + Type Тип - - + + NN + + + + Not null Не (null) - + PK ПК - + Primary key Первинний ключ - + AI АІ - + Autoincrement Автоінкремент - + U У - + Unique Унікальне - + Default За замовчуванням - + Default value Значення за замовчуванням - + Check Перевірити - + Check constraint Перевірити обмеження - + Foreign Key Зовнішній ключ - + <html><head/><body><p><span style=" font-weight:600; color:#ff0000;">Warning: </span>There is something with this table definition that our parser doesn't fully understand. Modifying and saving this table might result in problems.</p></body></html> @@ -937,7 +1347,7 @@ %1 - + There already is a field with that name. Please rename it first or choose a different name for this field. Поле з таким ім'ям уже існує. Будь ласка, переіменуйте його або виберіть інше ім'я для цього поля. @@ -950,54 +1360,54 @@ На цей стовпець посилається зовнішній ключ у таблиці %1, тому її ім'я неможливо змінити. - + Error creating table. Message from database engine: %1 Помилка створення таблиці. Повідомлення від ядра бази даних: %1 - + This column is referenced in a foreign key in table %1 and thus its name cannot be changed. На цей стовпець посилається зовнішній ключ у таблиці %1, тому її ім'я неможливо змінити. - + There is at least one row with this field set to NULL. This makes it impossible to set this flag. Please change the table data first. Існує принаймні один рядок, де це поле встановлено в NULL. Встановити цей прапорець неможливо. Спочатку змініть дані таблиці. - + There is at least one row with a non-integer value in this field. This makes it impossible to set the AI flag. Please change the table data first. Існує принаймні один рядок, де це поле містить нечислове значення. Встановити прапорець АІ неможливо. Спочатку змініть дані таблиці. - + Column '%1' has no unique data. Стовпець '%1" не містить унікальних даних. - + This makes it impossible to set this flag. Please change the table data first. Неможливо поставити цей прапорець. Спочатку змініть табличні дані. - + Modifying this column failed. Error returned from database: %1 Неможливо змінити цей рядок. Повідомлення про помилку від БД: %1 - + Are you sure you want to delete the field '%1'? All data currently stored in this field will be lost. Ви впевнені, що хочете видалити поле '%1'? Всі дані, які містяться в цьому полі, будуть втрачені. - + Please add a field which meets the following criteria before setting the without rowid flag: - Primary key flag set - Auto increment disabled @@ -1006,10 +1416,15 @@ - відімкнений автоінкремент - + + Changing the table schema failed. Error message: +%1 + + + Setting the temporary flag for the table failed. Error message: %1 - Не вдалося встановити тимчасовий прапорець. Повідомлення помилки: + Не вдалося встановити тимчасовий прапорець. Повідомлення помилки: Please add a field which meets the following criteria before setting the without rowid flag: @@ -1020,7 +1435,7 @@ - відімкнений автоінкремент - + Setting the rowid column for the table failed. Error message: %1 Не вдалося встановити rowid стовпець для таблиці. Повідомлення помилки: @@ -1123,44 +1538,54 @@ Гарний висновок - - + + Could not open output file: %1 Не вдалося відкрити вихідний файл: %1 - - + + Choose a filename to export data Виберіть ім'я файлу для експорту даних - + Text files(*.csv *.txt) Текстові файли(*.csv *.txt) - + Export data as JSON Експортувати дані у форматі JSON - + + exporting CSV + + + + + exporting JSON + + + + Text files(*.json *.js *.txt) Текстові файли(*.json *.js *.txt) - + Please select at least 1 table. Будь ласка, оберіть хоча б 1 таблицю. - + Choose a directory Оберіть каталог - + Export completed. Експорт завершено. @@ -1228,32 +1653,61 @@ Експортувати тільки схему даних - Please select at least 1 table. - Будь ласка, оберіть хоча б 1 таблицю. + Будь ласка, оберіть хоча б 1 таблицю. - + + Please select at least one table. + + + + Choose a filename to export Оберіть ім'я файлу для експорту - + Text files(*.sql *.txt) Текстові файли(*.sql *.txt) - + Export completed. Експорт завершено. - + Export cancelled or failed. Експорт скасовано або виникла помилка. + ExtendedScintilla + + + + Ctrl+H + + + + + + Ctrl+P + Ctrl+P + + + + Find and Replace... + + + + + Print... + + + + ExtendedTableWidget The content of clipboard is bigger than the range selected. @@ -1262,22 +1716,97 @@ Все одно вставити? - + + Use as Exact Filter + + + + + Containing + + + + + Not equal to + + + + + Greater than + + + + + Less than + + + + + Greater or equal + + + + + Less or equal + + + + + Between this and... + + + + Set to NULL Встановити в NULL - + Copy Копіювати - + + Copy with Headers + + + + + Copy as SQL + + + + Paste Вставити - + + Print... + + + + + Use in Filter Expression + + + + + Alt+Del + + + + + Ctrl+Shift+C + + + + + Ctrl+Alt+C + + + + The content of the clipboard is bigger than the range selected. Do you want to insert it anyway? Вміст буфера обміну більше ніж обраний діапазон. @@ -1292,178 +1821,485 @@ - FilterLineEdit + FileExtensionManager - - Filter - Фільтр + + File Extension Manager + - - - ForeignKeyEditor - - &Reset - &Скинути + + &Up + - - Foreign key clauses (ON UPDATE, ON DELETE etc.) + + &Down - (foreign key clauses(ON UPDATE, ON DELETE etc.) - (типи зовнішніх ключів(ON UPDATE, ON DELETE тощо) + + &Add + - - - ImportCsvDialog - - Import CSV file - Імпортувати файл у форматі CSV + + &Remove + - - &Table name - &Ім'я таблиці + + + Description + - - &Column names in first line - І&мена стовпців у першому рядку + + Extensions + - - Field &separator - &Роздільник полів + + *.extension + + + + FilterLineEdit - - , - , + + Filter + Фільтр - - ; - ; + + These input fields allow you to perform quick filters in the currently selected table. +By default, the rows containing the input text are filtered out. +The following operators are also supported: +% Wildcard +> Greater than +< Less than +>= Equal to or greater +<= Equal to or less += Equal to: exact match +<> Unequal: exact inverse match +x~y Range: values between x and y + - - - Tab - Табуляція + + Set Filter Expression + - - | - | + + What's This? + - - - - Other - Інший + + Is NULL + - - &Quote character - &Символ лапок + + Is not NULL + - - " - " + + Is empty + - - ' - ' + + Is not empty + - - &Encoding - &Кодування + + Equal to... + - - UTF-8 - UTF-8 + + Not equal to... + - - UTF-16 - UTF-16 + + Greater than... + - - ISO-8859-1 - ISO-8859-1 + + Less than... + - - Trim fields? - Обрізати поля? + + Greater or equal... + - - Separate tables - Розділити таблиці + + Less or equal... + - - - Deselect All - Скасувати вибір + + In range... + + + + FindReplaceDialog - + + Find and Replace + + + + + Fi&nd text: + + + + + Re&place with: + + + + + Match &exact case + + + + + Match &only whole words + + + + + When enabled, the search continues from the other end when it reaches one end of the page + + + + + &Wrap around + + + + + When set, the search goes backwards from cursor position, otherwise it goes forward + + + + + Search &backwards + + + + + <html><head/><body><p>When checked, the pattern to find is interpreted as a UNIX regular expression. See <a href="https://en.wikibooks.org/wiki/Regular_Expressions">Regular Expression in Wikibooks</a>.</p></body></html> + + + + + Use regular e&xpressions + + + + + Find the next occurrence from the cursor position and in the direction set by "Search backwards" + + + + + &Find Next + + + + + &Replace + + + + + Highlight all the occurrences of the text in the page + + + + + F&ind All + + + + + Replace all the occurrences of the text in the page + + + + + Replace &All + + + + + The searched text was not found + + + + + + The searched text was not found. + + + + + The searched text was found one time. + + + + + The searched text was found %1 times. + + + + + The searched text was replaced one time. + + + + + The searched text was replaced %1 times. + + + + + ForeignKeyEditor + + + &Reset + &Скинути + + + + Foreign key clauses (ON UPDATE, ON DELETE etc.) + + + + (foreign key clauses(ON UPDATE, ON DELETE etc.) + (типи зовнішніх ключів(ON UPDATE, ON DELETE тощо) + + + + ImportCsvDialog + + + Import CSV file + Імпортувати файл у форматі CSV + + + &Table name + &Ім'я таблиці + + + + Table na&me + + + + + &Column names in first line + І&мена стовпців у першому рядку + + + + Field &separator + &Роздільник полів + + + + , + , + + + + ; + ; + + + + + Tab + Табуляція + + + + | + | + + + + + + Other + Інший + + + + &Quote character + &Символ лапок + + + + " + " + + + + ' + ' + + + + &Encoding + &Кодування + + + + UTF-8 + UTF-8 + + + + UTF-16 + UTF-16 + + + + ISO-8859-1 + ISO-8859-1 + + + + Trim fields? + Обрізати поля? + + + + Separate tables + Розділити таблиці + + + + Advanced + Додатково + + + + When importing an empty value from the CSV file into an existing table with a default value for this column, that default value is inserted. Activate this option to insert an empty value instead. + + + + + Ignore default &values + + + + + Activate this option to stop the import when trying to import an empty value into a NOT NULL column without a default value. + + + + + Fail on missing values + + + + + Disable data type detection + + + + + Disable the automatic data type detection when creating a new table. + + + + + + Deselect All + Скасувати вибір + + + Match Similar Співпадіння - + Select All Обрати все - Inserting data... - Вставлення даних... + Вставлення даних... - Cancel - Скасувати + Скасувати - There is already a table of that name and an import into an existing table is only possible if the number of columns match. - Таблиця з таким ім'ям уже існує, імпорт в існуючу таблицю можливий тільки якщо число стовпців збігається. + Таблиця з таким ім'ям уже існує, імпорт в існуючу таблицю можливий тільки якщо число стовпців збігається. - There is already a table of that name. Do you want to import the data into it? - Таблиця з таким ім'ям уже існує. Імпортувати дані в неї? + Таблиця з таким ім'ям уже існує. Імпортувати дані в неї? + + + + Import completed + Імпорт завершено + + + + There is already a table named '%1' and an import into an existing table is only possible if the number of columns match. + - + + There is already a table named '%1'. Do you want to import the data into it? + + + + Creating restore point failed: %1 Помилка створення точки відновлення: %1 - + Creating the table failed: %1 Помилка створення таблиці: %1 - + + importing CSV + + + + + Importing the file '%1' took %2ms. Of this %3ms were spent in the row function. + + + Missing field for record %1 - Пропущено стовпець для запису %1 + Пропущено стовпець для запису %1 - + Inserting row failed: %1 Помилка вставки рядка: %1 @@ -1476,8 +2312,7 @@ Оглядач для SQLite - - + toolBar1 панельІнструментів1 @@ -1486,207 +2321,187 @@ Таблиця: - + Select a table to browse data Оберіть таблицю для перегляду даних - + Use this list to select a table to be displayed in the database view Використовуйте цей список, щоб вибрати таблицю, яку буде показано в переглядачі баз даних - Refresh the data in the selected table. - Оновити дані в обраній таблиці. + Оновити дані в обраній таблиці. - + This button refreshes the data in the currently selected table. Ця кнопка оновлює дані обраної на цей момент таблиці. - + Scroll one page upwards - + <html><head/><body><p>Clicking this button navigates one page of records upwards in the table view above.</p></body></html> - + Scroll one page downwards - + <html><head/><body><p>Clicking this button navigates one page of records downwards in the table view above.</p></body></html> - + <html><head/><body><p>Click here to jump to the specified record</p></body></html> <html><head/><body><p>Натисніть тут, щоб перейти до зазначеного запису</p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_auto_vacuum"><span style=" text-decoration: underline; color:#0000ff;">Auto Vacuum</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_auto_vacuum"><span style=" text-decoration: underline; color:#0000ff;">Автовакум</span></a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_auto_vacuum"><span style=" text-decoration: underline; color:#0000ff;">Автовакум</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_automatic_index"><span style=" text-decoration: underline; color:#0000ff;">Automatic Index</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_automatic_index"><span style=" text-decoration: underline; color:#0000ff;">Автоматичний індекс</span></a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_automatic_index"><span style=" text-decoration: underline; color:#0000ff;">Автоматичний індекс</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_checkpoint_fullfsync"><span style=" text-decoration: underline; color:#0000ff;">Checkpoint Full FSYNC</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_checkpoint_fullfsync"><span style=" text-decoration: underline; color:#0000ff;">Повна контрольна точка FSYNC</span></a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_checkpoint_fullfsync"><span style=" text-decoration: underline; color:#0000ff;">Повна контрольна точка FSYNC</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_foreign_keys"><span style=" text-decoration: underline; color:#0000ff;">Foreign Keys</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_foreign_keys"><span style=" text-decoration: underline; color:#0000ff;">Зовнішні ключі</span></a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_foreign_keys"><span style=" text-decoration: underline; color:#0000ff;">Зовнішні ключі</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_fullfsync"><span style=" text-decoration: underline; color:#0000ff;">Full FSYNC</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_fullfsync"><span style=" text-decoration: underline; color:#0000ff;">Повний FSYNC</span></a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_fullfsync"><span style=" text-decoration: underline; color:#0000ff;">Повний FSYNC</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_ignore_check_constraints"><span style=" text-decoration: underline; color:#0000ff;">Ignore Check Constraints</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_ignore_check_constraints"><span style=" text-decoration: underline; color:#0000ff;">Ігнорувати перевірку обмежень</span></a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_ignore_check_constraints"><span style=" text-decoration: underline; color:#0000ff;">Ігнорувати перевірку обмежень</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_journal_mode"><span style=" text-decoration: underline; color:#0000ff;">Journal Mode</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_journal_mode"><span style=" text-decoration: underline; color:#0000ff;">Режим журналу</span></a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_journal_mode"><span style=" text-decoration: underline; color:#0000ff;">Режим журналу</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_journal_size_limit"><span style=" text-decoration: underline; color:#0000ff;">Journal Size Limit</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_journal_size_limit"><span style=" text-decoration: underline; color:#0000ff;">Обмеження розміру журналу</span></a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_journal_size_limit"><span style=" text-decoration: underline; color:#0000ff;">Обмеження розміру журналу</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_locking_mode"><span style=" text-decoration: underline; color:#0000ff;">Locking Mode</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_locking_mode"><span style=" text-decoration: underline; color:#0000ff;">Режим блокування</span></a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_locking_mode"><span style=" text-decoration: underline; color:#0000ff;">Режим блокування</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_max_page_count"><span style=" text-decoration: underline; color:#0000ff;">Max Page Count</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_max_page_count"><span style=" text-decoration: underline; color:#0000ff;">Максимальна кількість сторінок</span></a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_max_page_count"><span style=" text-decoration: underline; color:#0000ff;">Максимальна кількість сторінок</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_page_size"><span style=" text-decoration: underline; color:#0000ff;">Page Size</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_page_size"><span style=" text-decoration: underline; color:#0000ff;">Розміри сторінки</span></a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_page_size"><span style=" text-decoration: underline; color:#0000ff;">Розміри сторінки</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_recursive_triggers"><span style=" text-decoration: underline; color:#0000ff;">Recursive Triggers</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_recursive_triggers"><span style=" text-decoration: underline; color:#0000ff;">Рекурсивні тригери</span></a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_recursive_triggers"><span style=" text-decoration: underline; color:#0000ff;">Рекурсивні тригери</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_secure_delete"><span style=" text-decoration: underline; color:#0000ff;">Secure Delete</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_secure_delete"><span style=" text-decoration: underline; color:#0000ff;">Безпечне видалення</span></a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_secure_delete"><span style=" text-decoration: underline; color:#0000ff;">Безпечне видалення</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_synchronous"><span style=" text-decoration: underline; color:#0000ff;">Synchronous</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_synchronous"><span style=" text-decoration: underline; color:#0000ff;">Одночасно</span></a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_synchronous"><span style=" text-decoration: underline; color:#0000ff;">Одночасно</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_temp_store"><span style=" text-decoration: underline; color:#0000ff;">Temp Store</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_temp_store"><span style=" text-decoration: underline; color:#0000ff;">Тимчасове сховище</span></a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_temp_store"><span style=" text-decoration: underline; color:#0000ff;">Тимчасове сховище</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_user_version"><span style=" text-decoration: underline; color:#0000ff;">User Version</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_user_version"><span style=" text-decoration: underline; color:#0000ff;">Користувацька версія</span></a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_user_version"><span style=" text-decoration: underline; color:#0000ff;">Користувацька версія</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_wal_autocheckpoint"><span style=" text-decoration: underline; color:#0000ff;">WAL Auto Checkpoint</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_wal_autocheckpoint"><span style=" text-decoration: underline; color:#0000ff;">WAL автоматична контрольна точка</span></a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_wal_autocheckpoint"><span style=" text-decoration: underline; color:#0000ff;">WAL автоматична контрольна точка</span></a></p></body></html> - + &Remote &Віддалений - Web&site... - Веб-&сайт + Веб-&сайт - + Refresh Оновити - + F5 F5 - + Insert a new record in the current table Додати новий запис у поточну таблицю - + &Table: &Таблиця: - This button creates a new, empty record in the database - Ця кнопка створює новий, порожній запис у таблиці + Ця кнопка створює новий, порожній запис у таблиці - + + New Record Додати запис - + Delete the current record Видалити поточний запис - This button deletes the record currently selected in the database - Ця кнопка видаляє обраний запис із БД + Ця кнопка видаляє обраний запис із БД - + + Delete Record Видалити запис - This is the database view. You can double-click any record to edit its contents in the cell editor window. - Це переглядач баз даних. Зробіть подвійне клацання по будь-якому запису щоб відредагувати його вміст. + Це переглядач баз даних. Зробіть подвійне клацання по будь-якому запису щоб відредагувати його вміст. - + <html><head/><body><p>Scroll to the beginning</p></body></html> <html><head/><body><p>Прокрутити на початок</p></body></html> - + <html><head/><body><p>Clicking this button navigates to the beginning in the table view above.</p></body></html> <html><head/><body><p>Натискання цієї кнопки переміщує до початку таблиці.</p></body></html> - + |< |< @@ -1699,12 +2514,12 @@ <html><head/><body><p>Натискання цієї кнопки переміщує на 100 записів вгору у таблиці</p></body></html> - + < < - + 0 - 0 of 0 0 - 0 з 0 @@ -1717,22 +2532,22 @@ <html><head/><body><p>Натискання цієї кнопки переміщує на 100 записів вниз у таблиці</p></body></html> - + > > - + Scroll to the end Прокрутити до кінця - + <html><head/><body><p>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Clicking this button navigates up to the end in the table view above.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</p></body></html> <html><head/><body><p>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Натискання цієї кнопки переміщує в кінець таблиці.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</p></body></html> - + >| >| @@ -1741,27 +2556,27 @@ <html><head/><body><p>Натисніть тут, щоб перейти до зазначеного запису</p></body></html> - + <html><head/><body><p>This button is used to navigate to the record number specified in the Go to area.</p></body></html> <html><head/><body><p>Ця кнопка використовується, щоб переміститися до запису, номер якого зазначений в зоні Перейти до </p></body></html> - + Go to: Перейти до: - + Enter record number to browse Введіть номер запису для перегляду - + Type a record number in this area and click the Go to: button to display the record in the database view Надрукуйте номер запису в цій зоні й натисніть кнопку Перейти до:, щоб показати запис у базі даних - + 1 1 @@ -1770,21 +2585,17 @@ <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_auto_vacuum"><span style="text-decoration: underline; color: #0000ff;">Auto Vacuum</span></a></p></body></html> - None - Ні + Ні - - Full Повний, цілий - Full + Full - Incremental - Incremental + Incremental <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_automatic_index"><span style="text-decoration: underline; color: #0000ff;">Automatic Index</span></a></p></body></html> @@ -1811,36 +2622,28 @@ <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_journal_mode"><span style="text-decoration: underline; color: #0000ff;">Journal Mode</span></a></p></body></html> - Delete - Видалити + Видалити - Truncate - Усічення + Усічення - Persist - Продовжити + Продовжити - - Memory - Пам'ять + Пам'ять - WAL - WAL + WAL - - Off - Вимкнути + Вимкнути <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_journal_size_limit"><span style="text-decoration: underline; color: #0000ff;">Journal Size Limit</span></a></p></body></html> @@ -1851,15 +2654,12 @@ <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_locking_mode"><span style="text-decoration: underline; color: #0000ff;">Locking Mode</span></a></p></body></html> - - Normal - Нормально + Нормально - Exclusive - Вибірково + Вибірково <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_max_page_count"><span style="text-decoration: underline; color: #0000ff;">Max Page Count</span></a></p></body></html> @@ -1886,14 +2686,12 @@ <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_temp_store"><span style="text-decoration: underline; color: #0000ff;">Temp Store</span></a></p></body></html> - Default - За замовчуванням + За замовчуванням - File - Файл + Файл <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_user_version"><span style="text-decoration: underline; color: #0000ff;">User Version</span></a></p></body></html> @@ -1904,17 +2702,17 @@ <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_wal_autocheckpoint"><span style="text-decoration: underline; color: #0000ff;">WAL Auto Checkpoint</span></a></p></body></html> - + &File &Файл - + &Import &Імпорт - + &Export &Експорт @@ -1923,127 +2721,142 @@ Віддалений сервер - + &Edit &Редагування - + &View &Вид - + &Help &Довідка - + + &Tools + + + + DB Toolbar Панель інструментів БД - + Edit Database &Cell Редагування &комірки БД - - DB Sche&ma - Схе&ма БД + + This button clears the contents of the SQL logs + - - Execute SQL [F5, Ctrl+Return, Ctrl+R] - Виконати SQL [F5, Ctrl+Return, Ctrl+R] + + This panel lets you examine a log of all SQL commands issued by the application or by yourself + + + + + DB Sche&ma + Схе&ма БД + + + Execute SQL + Виконати SQL - &Load extension - Завантажити &розширення + Завантажити &розширення - - Execute current line [Shift+F5] - Виконати поточний рядок [Shift+F5] + + Execute current line + Виконати поточний рядок + + + + This button executes the SQL statement present in the current editor line + - + Shift+F5 Shift+F5 - Sa&ve Project - &Зберегти проект + &Зберегти проект - Open &Project - Відкрити &проект + Відкрити &проект - + Edit display format Формат показу - + Edit the display format of the data in this column Редагування формату показу для даних у цьому стовпці - + Show rowid column Показати стовпець rowid - + Toggle the visibility of the rowid column Змінити видимість стовпця rowid - - + + Set encoding Кодування - + Change the encoding of the text in the table cells Змінити кодування тексту в цій комірці таблиці - + Set encoding for all tables Встановити кодування для всіх таблиць - + Change the default encoding assumed for all tables in the database Змінити кодування за замовчуванням для всіх таблиць у базі даних + Duplicate record - Дублікат запису + Дублікат запису - SQLCipher &FAQ... - SQLCipher & ЧаПи... + SQLCipher & ЧаПи... - + Opens the SQLCipher FAQ in a browser window Відкрити SQLCiphier ЧаПи в браузері - Table(s) to JSON... - Таблиці в файл JSON... + Таблиці в файл JSON... - + Export one or more table(s) to a JSON file Експортувати таблиці в JSON файл @@ -2056,38 +2869,42 @@ Зберегти в хмару - &Attach Database - &Прикріпити базу даних + &Прикріпити базу даних - - + + Save SQL file as Зберегти файл SQL як - + + This button saves the content of the current SQL editor tab to a file + + + + &Browse Table Пе&регляд таблиці - + Clear all filters Очистити всі фільтри - + User Користувачем - + Application Додатком - + &Clear О&чистити @@ -2208,234 +3025,569 @@ Схема БД - + &New Database... &Нова база даних... - - + + Create a new database file Створити новий файл бази даних - + This option is used to create a new database file. Ця опція використовується щоб створити новий файл бази даних. - + Ctrl+N Ctrl+N - + + &Open Database... &Відкрити базу даних... - - - + + + + + Open an existing database file Відкрити існуючий файл бази даних - - + + + This option is used to open an existing database file. Ця опція використовується, щоб відкрити існуючий файл бази даних. - + + Ctrl+O Ctrl+O - + &Close Database &Закрити базу даних - + + This button closes the connection to the currently open database file + + + + Ctrl+W Ctrl+W - + + Revert database to last saved state Повернути базу даних до останнього збереженого стану - + This option is used to revert the current database file to its last saved state. All changes made since the last save operation are lost. Ця опція використовується, щоб повернути поточний файл бази даних до його останнього збереженого стану. Всі зміни, зроблені з останньої операції збереження, буде втрачено. - + + Write changes to the database file Записати зміни у файл бази даних - + This option is used to save changes to the database file. Ця опція використовується, щоб зберегти зміни у файлі бази даних. - + Ctrl+S Ctrl+S - + + Compact &Database... + + + + Compact the database file, removing space wasted by deleted records Ущільнити базу даних, видаливши простір, зайнятий видаленими записами - - + + Compact the database file, removing space wasted by deleted records. Ущільнити базу даних, видаливши простір, зайнятий видаленими записами. - + E&xit &Вихід - + Ctrl+Q Ctrl+Q - + Import data from an .sql dump text file into a new or existing database. Імпортувати дані з текстового файлу .sql в нову або існуючу базу даних. - + This option lets you import data from an .sql dump text file into a new or existing database. SQL dump files can be created on most database engines, including MySQL and PostgreSQL. Ця опція дає змогу імпортувати дані з текстового файлу .sql у нову або існуючу базу даних. Файл SQL можна створити на більшості двигунів баз даних, включно з MySQL і PostgreSQL. - + Open a wizard that lets you import data from a comma separated text file into a database table. Відкрити майстер, який дає змогу імпортувати дані з файлу CSV у таблицю бази даних. - + Open a wizard that lets you import data from a comma separated text file into a database table. CSV files can be created on most database and spreadsheet applications. Відкрити майстер, який дає змогу імпортувати дані з файлу CSV у таблицю бази даних. Файли CSV можна створити в більшості програм баз даних і електронних таблиць. - + Export a database to a .sql dump text file. Експортувати базу даних у текстовий файл .sql. - + This option lets you export a database to a .sql dump text file. SQL dump files contain all data necessary to recreate the database on most database engines, including MySQL and PostgreSQL. Ця опція дає змогу експортувати базу даних у текстовий файл .sql. Файли SQL містять всі дані, необхідні для створення бази даних у більшості движків баз даних, включно з MySQL і PostgreSQL. - + &Table(s) as CSV file... Таблиці у файл CSV... - + Export a database table as a comma separated text file. Експортувати таблицю бази даних як CSV текстовий файл. - + Export a database table as a comma separated text file, ready to be imported into other database or spreadsheet applications. Експортувати таблицю бази даних як CSV текстовий файл, готовий для імпортування в інші бази даних або програми електронних таблиць. - + Open the Create Table wizard, where it is possible to define the name and fields for a new table in the database Відкрити майстер створення таблиць, де можливо визначити ім'я і поля для нової таблиці в базі даних - + Open the Delete Table wizard, where you can select a database table to be dropped. Відкрити майстер видалення таблиці, де можна вибрати таблицю бази даних для видалення. - + Open the Modify Table wizard, where it is possible to rename an existing table. It is also possible to add or delete fields form a table, as well as modify field names and types. Відкрити майстер зміни таблиці, де можливо перейменувати існуючу таблиць. Можна додати або видалити поля таблиці, так само змінювати імена полів і типи. - + Open the Create Index wizard, where it is possible to define a new index on an existing database table. Відкрити майстер створення Індексу, в якому можна визначити новий індекс для існуючої таблиці бази даних. - + &Preferences... &Налаштування... - - + + Open the preferences window. Відкрити вікно налаштувань. - + &DB Toolbar &Панель інструментів БД - + Shows or hides the Database toolbar. Показати або приховати панель інструментів БД. - + Shift+F1 Shift+F1 - + + Execute all/selected SQL + + + + + This button executes the currently selected SQL statements. If no text is selected, all SQL statements are executed. + + + + + &Wiki + + + + + Bug &Report... + + + + + Feature Re&quest... + + + + + Web&site + + + + + &Donate on Patreon... + + + + + Sa&ve Project... + + + + + This button lets you open a DB4S project file + + + + + &Attach Database... + + + + + + Add another database file to the current database connection + + + + + This button lets you add another database file to the current database connection + + + + + &Set Encryption... + + + + + SQLCipher &FAQ + + + + + Table(&s) to JSON... + + + + + Open Data&base Read Only... + + + + + Save results + + + + + Save the results view + + + + + This button lets you save the results of the last executed query + + + + + Find text in SQL editor + + + + + Find text in SQL editor + + + + + This button opens the search bar of the editor + + + + + Ctrl+F + + + + + Find or replace text in SQL editor + + + + + Find or replace text in SQL editor + + + + + This button opens the find/replace dialog for the current editor tab + + + + + + Export to &CSV + Експортувати в &CSV + + + + + Save as &view + Зберегти як &вигляд + + + + Save as view + Зберегти як вигляд + + + + Hide column(s) + + + + + Hide selected column(s) + + + + + Show all columns + + + + + Show all columns that were hidden + + + + + Shows or hides the Project toolbar. + + + + + Extra DB Toolbar + + + + + + Export the filtered data to CSV + + + + + This button exports the data of the browsed table as currently displayed (after filters, display formats and order column) as a CSV file. + + + + + + Save the current filter, sort column and display formats as a view + + + + + This button saves the current setting of the browsed table (filters, display formats and order column) as an SQL view that you can later browse or use in SQL statements. + + + + + Insert Values... + + + + + + Open a dialog for inserting values in a new record + + + + + + Insert new record using default values in browsed table + + + + + New In-&Memory Database + + + + + Drag && Drop Qualified Names + + + + + + Use qualified names (e.g. "Table"."Field") when dragging the objects and dropping them into the editor + + + + + Drag && Drop Enquoted Names + + + + + + Use escaped identifiers (e.g. "Table1") when dragging the objects and dropping them into the editor + + + + + &Integrity Check + + + + + Runs the integrity_check pragma over the opened database and returns the results in the Execute SQL tab. This pragma does an integrity check of the entire database. + + + + + &Foreign-Key Check + + + + + Runs the foreign_key_check pragma over the opened database and returns the results in the Execute SQL tab + + + + + &Quick Integrity Check + + + + + Run a quick integrity check over the open DB + + + + + Runs the quick_check pragma over the opened database and returns the results in the Execute SQL tab. This command does most of the checking of PRAGMA integrity_check but runs much faster. + + + + + &Optimize + + + + + Attempt to optimize the database + + + + + Runs the optimize pragma over the opened database. This pragma might perform optimizations that will improve the performance of future queries. + + + + + + Print + + + + + Print text from current SQL editor tab + + + + + Open a dialog for printing the text in the current SQL editor tab + + + + + Print the structure of the opened database + + + + + Open a dialog for printing the structure of the opened database + + + &About... - Про &програму... + Про &програму... - + &Recently opened &Недавно відкриті - + Open &tab Відкрити &вкладку - &Open Database Read Only... - &Відкрити БД тільки для читання... + &Відкрити БД тільки для читання... - + Open an existing database file in read only mode Відкрити існуючий файл БД у режимі тільки для читання - + Unlock view editing Розблокувати редагування вигляду - + This unlocks the current view for editing. However, you will need appropriate triggers for editing. Це розблоковує поточний вигляд для редагування. Проте вам необхідно виділити тригери для редагування - - + + Ctrl+T Ctrl+T @@ -2445,17 +3597,90 @@ Структура БД - + + This is the structure of the opened database. +You can drag SQL statements from an object row and drop them into other applications or into another instance of 'DB Browser for SQLite'. + + + + + Browse Data Переглянути дані - + + Refresh the data in the selected table + + + + + This button clears all the filters set in the header input fields for the currently browsed table. + + + + + Save the table as currently displayed + + + + + <html><head/><body><p>This popup menu provides the following options applying to the currently browsed and filtered table:</p><ul style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;"><li style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Export to CSV: this option exports the data of the browsed table as currently displayed (after filters, display formats and order column) to a CSV file.</li><li style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Save as view: this option saves the current setting of the browsed table (filters, display formats and order column) as an SQL view that you can later browse or use in SQL statements.</li></ul></body></html> + + + + + ... + ... + + + + Print currently browsed table data + + + + + Print currently browsed table data. Print selection if more than one cell is selected. + + + + + <html><head/><body><p>This button creates a new record in the database. Hold the mouse button to open a pop-up menu of different options:</p><ul><li><span style=" font-weight:600;">New Record</span>: insert a new record with default values in the database.</li><li><span style=" font-weight:600;">Insert Values...</span>: open a dialog for entering values before they are inserted in the database. This allows to enter values acomplishing the different constraints. This dialog is also open if the <span style=" font-weight:600;">New Record</span> option fails due to these constraints.</li></ul></body></html> + + + + + This button deletes the record or records currently selected in the table + + + + + This is the database table view. You can do the following actions: + - Start writing for editing inline the value. + - Double-click any record to edit its contents in the cell editor window. + - Alt+Del for deleting the cell content to NULL. + - Ctrl+" for duplicating the current record. + - Ctrl+' for copying the value from the cell above. + - Standard selection and copy/paste operations. + + + + Edit Pragmas Редагувати прагму - + + <html><head/><body><p><a href="https://www.sqlite.org/pragma.html#pragma_case_sensitive_like">Case Sensitive Like</a></p></body></html> + + + + + Warning: this pragma is not readable and this value has been inferred. Writing the pragma might overwrite a redefined LIKE provided by an SQLite extension. + + + + Execute SQL Виконати SQL @@ -2464,47 +3689,72 @@ Редагування комірки БД - + SQL &Log &Журнал SQL - + Show S&QL submitted by По&казати SQL, який виконано - + &Plot &Графік - + + This is the structure of the opened database. +You can drag multiple object names from the Name column and drop them into the SQL editor and you can adjust the properties of the dropped names using the context menu. This would help you in composing SQL statements. +You can drag SQL statements from the Schema column and drop them into the SQL editor or into other applications. + + + + + + + Project Toolbar + + + + + Extra DB toolbar + + + + + + + Close the current database file + + + + &Revert Changes &Скасувати зміни - + &Write Changes &Записати зміни - Compact &Database - &Ущільнити базу даних + &Ущільнити базу даних - + &Database from SQL file... &База даних з файлу SQL... - + &Table from CSV file... &Таблиці з файлу CSV... - + &Database to SQL file... Базу &даних в файл SQL... @@ -2513,221 +3763,256 @@ &Таблиці в файл CSV... - + &Create Table... &Створити таблицю... - + &Delete Table... &Видалити таблицю... - + &Modify Table... &Змінити таблицю... - + Create &Index... Створити і&ндекс... - + W&hat's This? Що &це таке? - + + &About + + + + + This button opens a new tab for the SQL editor + + + + &Execute SQL Ви&конати код SQL - Execute SQL [F5, Ctrl+Return] - Виконати код SQL [F5, Ctrl+Return] + Execute SQL + Виконати код SQL - + Open SQL file Відкрити файл SQL - - - + + This button opens a file containing SQL statements and loads it in a new editor tab + + + + + + Save SQL file Зберегти файл SQL - + + &Load Extension... + + + + Execute current line Виконати поточний рядок - Execute current line [Ctrl+E] - Виконати поточний рядок [Ctrl+E] + Execute current line + Виконати поточний рядок - + Ctrl+E Ctrl+E - + Export as CSV file Експортувати у файл CSV - + Export table as comma separated values file Експортувати таблицю як CSV файл - &Wiki... - В&ікі... + В&ікі... - Bug &report... - &Звіт про помилку... + &Звіт про помилку... Web &site... &Веб-сайт... - - + + Save the current session to a file Зберегти поточний стан у файл - - + + This button lets you save all the settings associated to the open DB to a DB4S project file + + + + + Open &Project... + + + + + Load a working session from a file Завантажити робочий стан із файлу - &Set Encryption - Ши&фрування + Ши&фрування - + Copy Create statement Копіювати CREATE вираз - + Copy the CREATE statement of the item to the clipboard Копіювати CREATE вираз елемента в буффер обміну - + Ctrl+Return Ctrl+Return - + Ctrl+L Ctrl+L - + Ctrl+P Ctrl+P - + Ctrl+D Ctrl+D - + Ctrl+I Ctrl+I - + Encrypted Зашифрований - + Read only Тільки для читання - + Database file is read only. Editing the database is disabled. База даних тільки для читання. Редагування заборонене. - + Database encoding Кодування бази даних - + Database is encrypted using SQLCipher База даних зашифрована з використанням SQLCipher - - + + Choose a database file Вибрати файл бази даних - + Could not open database file. Reason: %1 Неможливо відкрити файл бази даних. Причина: %1 - - - + + + Choose a filename to save under Вибрати ім'я, під яким зберегти дані - Error adding record: - Помилка додавання запису: + Помилка додавання запису: - + Error deleting record: %1 Помилка видалення запису: %1 - + Please select a record first Будь ласка, спочатку оберіть запис - + + determining row count... + + + + + %1 - %2 of >= %3 + + + + %1 - %2 of %3 %1 - %2 з %3 - - + + There is no database opened. Please open or create a new database file. Немає відкритої бази даних. Відкрийте або створіть файл нової бази даних. - Are you sure you want to delete the %1 '%2'? All data associated with the %1 will be lost. - Ви точно хочете видалити %1 '%2'? + Ви точно хочете видалити %1 '%2'? Всі дані, пов'язані з %1, будуть втрачені. @@ -2741,198 +4026,386 @@ Немає відкритої бази даних. - + A new DB Browser for SQLite version is available (%1.%2.%3).<br/><br/>Please download at <a href='%4'>%4</a>. Вийшла нова версія оглядача для SQLite (%1.%2.%3).<br/><br/>Вона доступна для скачування за посиланням <a href='%4'>%4</a>. - - + + DB Browser for SQLite project file (*.sqbpro) Файл проекту оглядача для SQLite (*.sqbpro) - Error executing query: %1 - Помилка виконання запиту: %1 + Помилка виконання запиту: %1 - %1 rows returned in %2ms from: %3 - %1 рядків повернуто за %2мс з: %3 + %1 рядків повернуто за %2мс з: %3 + + + ,%1 rows affected + ,%1 рядків змінено + + + Query executed successfully: %1 (took %2ms %3) + Запит успішно виконано: %1 (тривало %2мс %3) + + + Choose a text file + Вибрати текстовий файл + + + Text files (*.csv *.txt);;All files (*) + Текстові файли (*.csv *.txt);;Всі файли (*) + + + Import completed + Імпорт завершено + + + Error while saving the database file. This means that not all changes to the database were saved. You need to resolve the following error first. +%1 + Помилка під час збереження файлу бази даних. Це означає, що не всі зміни в базу даних було збережено. Спочатку Вам потрібно розв'язати наступну помилку. + + + + Are you sure you want to undo all changes made to the database file '%1' since the last save? + Скасувати всі зміни, зроблені у файлі бази даних '%1' після останнього збереження? + + + + Choose a file to import + Оберіть файл для імпорту + + + Text files (*.sql *.txt);;All files (*) + Текстові файли (*.sql *.txt);;Всі файли (*) + + + + Do you want to create a new database file to hold the imported data? +If you answer no we will attempt to import the data in the SQL file to the current database. + Створити новий файл бази даних для збереження імпортованих даних? +Якщо відповідь Ні, то здійсниться спроба імпортувати дані файлу SQL в поточну базу даних. + + + + File %1 already exists. Please choose a different name. + Файл %1 вже існує. Оберіть інше ім'я. + + + + Error importing data: %1 + Помилка імпортування даних: %1 + + + + Import completed. + Імпорт завершено. + + + + Delete View + Видалити перегляд + + + + Delete Trigger + Видалити тригер + + + + Delete Index + Видалити індекс + + + Please enter the URL of the database file to open. + Введіть URL файлу БД для його відкриття. + + + Please enter the URL of the database file to save. + Введіть URL файлу БД для його збереження. + + + + Please choose a new encoding for this table. + Оберіть нову систему кодування для цієї таблиці. + + + + Please choose a new encoding for all tables. + Оберіть нову систему кодування для всіх таблиць. + + + + In-Memory database + + + + + Are you sure you want to delete the table '%1'? +All data associated with the table will be lost. + + + + + Are you sure you want to delete the view '%1'? + + + + + Are you sure you want to delete the trigger '%1'? + + + + + Are you sure you want to delete the index '%1'? + + + + + Error: could not delete the table. + + + + + Error: could not delete the view. + + + + + Error: could not delete the trigger. + + + + + Error: could not delete the index. + + + + + Message from database engine: +%1 + + + + + Editing the table requires to save all pending changes now. +Are you sure you want to save the database? + + + + + Error checking foreign keys after table modification. The changes will be reverted. + + + + + This table did not pass a foreign-key check.<br/>You should run 'Tools | Foreign-Key Check' and fix the reported issues. + + + + + -- EXECUTING SELECTION IN '%1' +-- + + + + + -- EXECUTING LINE IN '%1' +-- + + + + + -- EXECUTING ALL IN '%1' +-- + + + + + executing query + - ,%1 rows affected - ,%1 рядків змінено + + %1 rows returned in %2ms + - Query executed successfully: %1 (took %2ms %3) - Запит успішно виконано: %1 (тривало %2мс %3) + + query executed successfully. Took %1ms%2 + - Choose a text file - Вибрати текстовий файл + + -- At line %1: +%4 +-- Result: %3 + - Text files (*.csv *.txt);;All files (*) - Текстові файли (*.csv *.txt);;Всі файли (*) + + Import completed. Some foreign key constraints are violated. Please fix them before saving. + - - Import completed - Імпорт завершено + + Choose a project file to open + - Error while saving the database file. This means that not all changes to the database were saved. You need to resolve the following error first. -%1 - Помилка під час збереження файлу бази даних. Це означає, що не всі зміни в базу даних було збережено. Спочатку Вам потрібно розв'язати наступну помилку. + + This project file is using an old file format because it was created using DB Browser for SQLite version 3.10 or lower. Loading this file format is still fully supported but we advice you to convert all your project files to the new file format because support for older formats might be dropped at some point in the future. You can convert your files by simply opening and re-saving them. + - - Are you sure you want to undo all changes made to the database file '%1' since the last save? - Скасувати всі зміни, зроблені у файлі бази даних '%1' після останнього збереження? + + Duplicate records + - - Choose a file to import - Оберіть файл для імпорту + + Ctrl+" + - Text files (*.sql *.txt);;All files (*) - Текстові файли (*.sql *.txt);;Всі файли (*) + + %1 +Leave the field empty for using the database encoding. + %1 +Залиште це поле порожнім якщо хочете, щоб використовувалося кодування за замовчуванням. - - Do you want to create a new database file to hold the imported data? -If you answer no we will attempt to import the data in the SQL file to the current database. - Створити новий файл бази даних для збереження імпортованих даних? -Якщо відповідь Ні, то здійсниться спроба імпортувати дані файлу SQL в поточну базу даних. + + This encoding is either not valid or not supported. + Кодування невірне або не підтримується. - - File %1 already exists. Please choose a different name. - Файл %1 вже існує. Оберіть інше ім'я. + + Collation needed! Proceed? + Потрібно виконати зіставлення! Продовжити? - - Error importing data: %1 - Помилка імпортування даних: %1 + + A table in this database requires a special collation function '%1' that this application can't provide without further knowledge. +If you choose to proceed, be aware bad things can happen to your database. +Create a backup! + Таблиця в базі даних вимагає виконання спеціальної функції зіставлення '%1'. +Якщо Ви продовжите, то можливе псування Вашої бази даних. +Створіть резервну копію! - - Import completed. - Імпорт завершено. + + creating collation + - - - Delete View - Видалити перегляд + + Set a new name for the SQL tab. Use the '&&' character to allow using the following character as a keyboard shortcut. + - - - Delete Trigger - Видалити тригер + + Please specify the view name + Вкажіть ім'я вигляду - - - Delete Index - Видалити індекс + + There is already an object with that name. Please choose a different name. + Об'єкт із зазначеним ім'ям уже існує. Виберіть інше ім'я. - Please enter the URL of the database file to open. - Введіть URL файлу БД для його відкриття. + + View successfully created. + Вигляд успішно створений. - Please enter the URL of the database file to save. - Введіть URL файлу БД для його збереження. + + Error creating view: %1 + Помилка створення вигляду: %1 - - Please choose a new encoding for this table. - Оберіть нову систему кодування для цієї таблиці. + + There is no filter set for this table. View will not be created. + - - Please choose a new encoding for all tables. - Оберіть нову систему кодування для всіх таблиць. + + Delete Records + - - %1 -Leave the field empty for using the database encoding. - %1 -Залиште це поле порожнім якщо хочете, щоб використовувалося кодування за замовчуванням. + + This action will open a new SQL tab for running: + - - This encoding is either not valid or not supported. - Кодування невірне або не підтримується. + + Press Help for opening the corresponding SQLite reference page. + Cancel Скасувати - - - + + Delete Table Видалити таблицю - + &%1 %2 &%1 %2 - + Setting PRAGMA values will commit your current transaction. Are you sure? Встановлення значень PRAGMA завершить поточну транзакцію. Встановити значення? - Error: could not delete the %1. Message from database engine: %2 - Помилка: неможливо видалити %1. Повідомлення від движка БД: + Помилка: неможливо видалити %1. Повідомлення від движка БД: %2 - + Setting PRAGMA values or vacuuming will commit your current transaction. Are you sure? - + Execution aborted by user Виконання скасовано користувачем - + , %1 rows affected , %1 рядків постраждало - Query executed successfully: %1 (took %2ms%3) - Запит виконано успішно: %1 (тривало %2мс%3) + Запит виконано успішно: %1 (тривало %2мс%3) - + Choose text files Оберіть текстові файли - + Text files(*.csv *.txt);;All files(*) Текстові файли(*.csv *.txt);;Всі файли(*) - + Error while saving the database file. This means that not all changes to the database were saved. You need to resolve the following error first. %1 @@ -2941,89 +4414,85 @@ %1 - - - + + + Text files(*.sql *.txt);;All files(*) Текстові файли(*.sql *.txt);;Всі файли(*) - - + Modify View Змінити вид - - + Modify Trigger Змінити тригер - - + Modify Index Змінити індекс - - + Modify Table Змінити таблицю - + Select SQL file to open Обрати файл SQL для відкривання - + Couldn't read file: %1. Неможливо прочитати файл: %1. - + Couldn't save file: %1. Неможливо зберегти файл: %1. - + Select file name Обрати ім'я файлу - + Select extension file Обрати розширення файлу - + Extensions(*.so *.dll);;All files(*) Розширення(*.so *.dll);;Всі файли(*) - + Extension successfully loaded. Розширення успішно завантажено. - - + Error loading extension: %1 Помилка завантаження розширення: %1 - + + Don't show again Не показувати наступного разу - + New version available. Доступна нова версія. - + Please enter a pseudo-primary key in order to enable editing on this view. This should be the name of a unique column in the view. Будь ласка, введіть псевдо-первинний ключ для можливості редагування у цьому виді. Це має бути і'мя унікального стовпця у виді @@ -3036,9 +4505,8 @@ PNG(*.png);;JPG(*.jpg);;PDF(*.pdf);;BMP(*.bmp);;Всі файли(*) - Choose a file to open - Вибрати файл для відкривання + Вибрати файл для відкривання Invalid file format. @@ -3046,6 +4514,19 @@ + NullLineEdit + + + Set to NULL + Встановити в NULL + + + + Alt+Del + + + + PlotDock @@ -3053,182 +4534,271 @@ Графік - + + <html><head/><body><p>This pane shows the list of columns of the currently browsed table or the just executed query. You can select the columns that you want to be used as X or Y axis for the plot pane below. The table shows detected axis type that will affect the resulting plot. For the Y axis you can only select numeric columns, but for the X axis you will be able to select:</p><ul style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;"><li style=" margin-top:12px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Date/Time</span>: strings with format &quot;yyyy-MM-dd hh:mm:ss&quot; or &quot;yyyy-MM-ddThh:mm:ss&quot;</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Date</span>: strings with format &quot;yyyy-MM-dd&quot;</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Time</span>: strings with format &quot;hh:mm:ss&quot;</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Label</span>: other string formats. Selecting this column as X axis will produce a Bars plot with the column values as labels for the bars</li><li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Numeric</span>: integer or real values</li></ul><p>Double-clicking the Y cells you can change the used color for that graph.</p></body></html> + + + + Columns Стовпці - + X X - + Y Y - _ - _ + _ + + + + Axis Type + + + + + Here is a plot drawn when you select the x and y values above. + +Click on points to select them in the plot and in the table. Ctrl+Click for selecting a range of points. + +Use mouse-wheel for zooming and mouse drag for changing the axis range. + +Select the axes or axes labels to drag and zoom only in that orientation. + - + Line type: Тип лінії: - - + + None Ні - + Line Звичайна - + StepLeft Ступенева, зліва - + StepRight Ступенева, справа - + StepCenter Ступенева, по центру - + Impulse Імпульс - + Point shape: Форма точок: - + Cross Хрест - + Plus Плюс - + Circle Коло - + Disc Диск - + Square Квадрат - + Diamond Ромб - + Star Зірка - + Triangle Трикутник - + TriangleInverted Трикутник перевернутий - + CrossSquare Хрест у квадраті - + PlusSquare Плюс у квадраті - + CrossCircle Хрест у колі - + PlusCircle Плюс у колі - + Peace Світ - + <html><head/><body><p>Save current plot...</p><p>File format chosen by extension (png, jpg, pdf, bmp)</p></body></html> <html><head/><body><p>Зберегти поточний графік...</p><p>Формат файлу вибирається розширенням (png, jpg, pdf, bmp)</p></body></html> - + Save current plot... Зберегти поточний графік... - + + + Load all data and redraw plot + + + Load all data. This has only an effect if not all data has been fetched from the table yet due to the partial fetch mechanism. - Отримати всі дані. Діє, якщо не всі дані довантажено. + Отримати всі дані. Діє, якщо не всі дані довантажено. - - - + + + Row # Рядок # - Choose a axis color - Вибрати колір осей + Вибрати колір осей + + + + Copy + Копіювати + + + + Print... + + + + + Show legend + + + + + Stacked bars + + + + + Date/Time + + + + + Date + + + + + Time + + + + + + Numeric + + + + + Label + + + + + Invalid + + + + + Load all data and redraw plot. +Warning: not all data has been fetched from the table yet due to the partial fetch mechanism. + + + + + Choose an axis color + - + Choose a filename to save under Вибрати ім'я, під яким зберегти дані - + PNG(*.png);;JPG(*.jpg);;PDF(*.pdf);;BMP(*.bmp);;All Files(*) PNG(*.png);;JPG(*.jpg);;PDF(*.pdf);;BMP(*.bmp);;Всі файли(*) - + + There are curves in this plot and the selected line style can only be applied to graphs sorted by X. Either sort the table or query by X to remove curves or select one of the styles supported by curves: None or Line. + + + Fetching all data... - Отримання всіх даних... + Отримання всіх даних... - Cancel - Відмінити + Відмінити @@ -3239,32 +4809,34 @@ Налаштування - + &Database &База даних - + Database &encoding &Кодування бази даних - + Open databases with foreign keys enabled. Відкривати бази даних з увімкненими зовнішніми ключами. - + &Foreign keys &Зовнішні ключі - - - - - - + + + + + + + + enabled увімкнені @@ -3275,8 +4847,8 @@ - - + + ... ... @@ -3306,37 +4878,75 @@ &Мова - + + Toolbar style + + + + + Only display the icon + + + + + Only display the text + + + + + The text appears beside the icon + + + + + The text appears under the icon + + + + + Follow the style + + + + Automatic &updates &Стежити за оновленнями - + + DB file extensions + + + + + Manage + + + + SQ&L to execute after opening database SQ&L,який треба виконання після відкривання бази даних - + Data &Browser Оглядач &даних - NULL fields - NULL поля + NULL поля - &Text - &Текст + &Текст - + Remove line breaks in schema &view Видалити розрив рядка в &схемі даних - + Show remote options Показати віддалені опції @@ -3345,12 +4955,12 @@ Сервер - + Prefetch block si&ze Розмір блоку &вибірки - + Advanced Додатково @@ -3359,92 +4969,89 @@ SQL, який потрібно виконати після відкриття БД - + Default field type Тип даних за замовчуванням - + Font Шрифт - + &Font &Шрифт - Font si&ze: - Ро&змір шрифту: + Ро&змір шрифту: - + Content Вміст - + Symbol limit in cell Кількість символів у осередку - Field colors - Кольорове оформлення полів + Кольорове оформлення полів - + NULL NULL - + Regular Звичайні - Text - Текст + Текст - + Binary Двійкові дані - + Background Фон - + Filters Фільтри - + Escape character Символ екранування - + Delay time (&ms) Час затримки (&мс) - + Set the waiting time before a new filter value is applied. Can be set to 0 for disabling waiting. Час затримки перед застосуванням нового фільтра. Нульове значення припиняє очікування. - + &SQL Р&едактор SQL - + Settings name Ім'я налаштувань @@ -3453,147 +5060,275 @@ Контекст - + Context Контекст - + Colour Колір - + Bold Жирний - + Italic Курсив - + Underline Підкреслення - + Keyword Ключове слово - function - функція + функція - + Function Функція - + Table Таблиця - + Comment Коментар - + Identifier Ідентифікатор - + String Рядок - currentline - поточний рядок + поточний рядок - + Current line Поточна рядок - + SQL &editor font size Розмір шрифту в &редакторі SQL - SQL &log font size - Розмір шрифту в &журналі SQL + Розмір шрифту в &журналі SQL - + Tab size Розмір табуляції - + SQL editor &font &Шрифт у редакторі SQL - + Error indicators Індикатори помилок - Enabling error indicators highlights the SQL code lines that caused errors during the last execution - Підсвічування в SQL коді рядків, виконання яких призвело до помилок + Підсвічування в SQL коді рядків, виконання яких призвело до помилок - + Hori&zontal tiling Гори&зонтальний розподіл - + If enabled the SQL code editor and the result table view are shown side by side instead of one over the other. Якщо ця опція увімкнена, то SQL редактор і результат запиту будуть розташовані поруч по горизонталі. - + Code co&mpletion Авто&доповнення коду - + + When enabled, the line breaks in the Schema column of the DB Structure tab, dock and printed output are removed. + + + + + Font si&ze + + + + + + This is the maximum number of rows in a table for enabling the value completion based on current values in the column. +Can be set to 0 for disabling completion. + + + + + Row count threshold for completion + + + + + Field display + + + + + Displayed &text + + + + + Text color + + + + + Background color + + + + + Preview only (N/A) + + + + + Foreground + + + + + SQL &results font size + + + + + &Wrap lines + + + + + Never + + + + + At word boundaries + + + + + At character boundaries + + + + + At whitespace boundaries + + + + + &Quotes for identifiers + + + + + Choose the quoting mechanism used by the application for identifiers in SQL code. + + + + + "Double quotes" - Standard SQL (recommended) + + + + + `Grave accents` - Traditional MySQL quotes + + + + + [Square brackets] - Traditional MS SQL Server quotes + + + + + Keywords in &UPPER CASE + + + + + When set, the SQL keywords are completed in UPPER CASE letters. + + + + + When set, the SQL code lines that caused errors during the last execution are highlighted and the results frame indicates the error in the background + + + + &Extensions Р&озширення - + Select extensions to load for every database: Оберіть розширення, щоб завантажувати їх для кожної бази даних: - + Add extension Додати розширення - + Remove extension Видалити розширення - + <html><head/><body><p>While supporting the REGEXP operator SQLite doesn't implement any regular expression<br/>algorithm but calls back the running application. DB Browser for SQLite implements this<br/>algorithm for you to let you use REGEXP out of the box. However, as there are multiple possible<br/>implementations of this and you might want to use another one, you're free to disable the<br/>application's implementation and load your own by using an extension. Requires restart of the application.</p></body></html> <html><head/><body><p>Оглядач для SQLite дає змогу використовувати оператор REGEXP 'з коробки'. Але попри<br/>це, можливі кілька різних варіантів реалізацій цього оператора й Ви вільні<br/>у виборі, який саме використовувати. Можна відімкнути нашу реалізацію та використовувати іншу -<br/>шляхом завантаження відповідного розширення. В цьому випадку потрібно перезавантажити програму.</p></body></html> - + + <html><head/><body><p>SQLite provides an SQL function for loading extensions from a shared library file. Activate this if you want to use the <span style=" font-style:italic;">load_extension()</span> function from SQL code.</p><p>For security reasons, extension loading is turned off by default and must be enabled through this setting. You can always load extensions through the GUI, even though this option is disabled.</p></body></html> + + + + + Allow loading extensions from SQL code + + + + Clone databases into Клонувати бази даних до @@ -3602,120 +5337,126 @@ <html><head/><body><p>Оглядач для SQLite дозволяє використовувати оператор REGEXP 'з коробки'. Але тим<br/>не менше, можливі кілька різних варіантів реалізацій даного оператора і Ви вільні<br/>у виборі яку саме використовувати. Можна відключити нашу реалізацію і використовувати іншу -<br/>шляхом завантаження відповідного розширення. В цьому випадку потрібно перезавантажити програму.</p></body></html> - + Disable Regular Expression extension Відімкнути розширення Регулярних Виразів - + Remote Віддалений сервер - + CA certificates СА-сертифікати - - + + Subject CN Об'єкт CN - + Common Name Звичайне ім'я - + Subject O Об'єкт O - + Organization Організація - - + + Valid from Дійсний з - - + + Valid to Дійсний до - - + + Serial number Серійний номер - + Your certificates Ваш сертифікат - + File Файл - + Subject Common Name Звичайне ім'я об'єкта - + Issuer CN Розповсюдник CN - + Issuer Common Name Звичайне ім'я розповсюдника - - + + Choose a directory Оберіть каталог - + The language will change after you restart the application. Мова зміниться після перезапуску програми. - + Select extension file Обираємо файл розширення - + Extensions(*.so *.dll);;All files(*) Розширення(*.so *.dll);;Всі файли(*) - + Import certificate file Імпортувати файл сертифіката - + No certificates found in this file. Для цього файлу не знайдено сертифікатів. - + Are you sure you want do remove this certificate? All certificate data will be deleted from the application settings! Ви впевнені, що хочете видалити цей сертифікат? Всі дані сертифіката видаляться з налаштувань програми! + + + Are you sure you want to clear all the saved settings? +All your preferences will be lost and default values will be used. + + QObject @@ -3728,117 +5469,145 @@ з запису номер %1 - + Error importing data Помилка імпортування даних - + from record number %1 з запису номер %1 - + . %1 . %1 - + + Importing CSV file... + + + + Cancel Скасувати - Decoding CSV file... - Розшифровка CSV файлу... + Розшифровка CSV файлу... - Collation needed! Proceed? - Потрібно виконати зіставлення! Продовжити? + Потрібно виконати зіставлення! Продовжити? - A table in this database requires a special collation function '%1' that this application can't provide without further knowledge. If you choose to proceed, be aware bad things can happen to your database. Create a backup! - Таблиця в базі даних вимагає виконання спеціальної функції зіставлення '%1'. + Таблиця в базі даних вимагає виконання спеціальної функції зіставлення '%1'. Якщо Ви продовжите, то можливе псування Вашої бази даних. Створіть резервну копію! - SQLite database files (*.db *.sqlite *.sqlite3 *.db3);;All files (*) - Файли SQLite баз даних (*.db *.sqlite *.sqlite3 *.db3);;Всі файли (*) + Файли SQLite баз даних (*.db *.sqlite *.sqlite3 *.db3);;Всі файли (*) + + + + All files (*) + + + + + SQLite database files (*.db *.sqlite *.sqlite3 *.db3) + RemoteDatabase - + Error when connecting to %1. %2 Помилка під час під'єднання до %1. %2 - + Error opening remote file at %1. %2 Помилка під час відкривання віддаленого файлу %1. %2 - + Error: Invalid client certificate specified. Помилка: Вказано неправильний сертифікат клієнта. - + Please enter the passphrase for this client certificate in order to authenticate. Будь ласка, введіть парольну фразу для цього сертифіката клієнта, для автентифікації - + Cancel Скасувати - + + Uploading remote database to +%1 + Вивантаження віддаленої бази даних до +%1. {1?} + + + + Downloading remote database from +%1 + Завантаження віддаленої бази даних із +%1. {1?} + + + + The remote database has been updated since the last checkout. Do you want to update the local database to the newest version? Note that this discards any changes you have made locally! If you don't want to lose local changes, click No to open the local version. + + + Uploading remote database to %1. - Вивантаження віддаленої бази даних до + Вивантаження віддаленої бази даних до %1. - Downloading remote database from %1. - Завантаження віддаленої бази даних із + Завантаження віддаленої бази даних із %1. - - + + Error: The network is not accessible. Помилка: Мережа не доступна. - + Error: Cannot open the file for sending. Помилка: Неможливо відкрити файл для відправлення. - + Error opening local databases list. %1 Помилка відкривання списку локальних баз даних. %1 - + Error creating local databases list. %1 Помилка створення списку локальних баз даних. @@ -3867,14 +5636,24 @@ + Connect to the remote server using the currently selected identity. The correct server is taken from the identity as well. + + + + Go Перейти - + Push currently opened database to server + + + <html><head/><body><p>In this pane, remote databases from dbhub.io website can be added to DB4S. First you need an identity:</p><ol style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;"><li style=" margin-top:12px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Login to the dbhub.io website (use your GitHub credentials or whatever you want)</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Click the button to create a DB4S certificate (that's your identity). That'll give you a certificate file (save it to your local disk).</li><li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Go to the Remote tab in DB4S Preferences. Click the button to add a new certificate to DB4S and choose the just downloaded certificate file.</li></ol><p>Now the Remote panel shows your identity and you can add remote databases.</p></body></html> + + RemoteModel @@ -3921,12 +5700,12 @@ - + Commit message - + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } @@ -3935,27 +5714,42 @@ - + Database licence - + Public - + + Branch + + + + + Force push + + + + Database will be public. Everyone has read access to it. - + Database will be private. Only you have access to it. - + + Use with care. This can cause remote commits to be deleted. + + + + Unspecified @@ -3968,60 +5762,135 @@ Форма - + + Find previous match [Shift+F3] + + + + + Find previous match with mapping + + + + + Shift+F3 + Shift+F3 + + + + The found pattern must be a whole word + + + + + Whole Words + + + + + Text pattern to find considering the checks in this frame + + + + + Find in editor + + + + + The found pattern must match in letter case + + + + + Case Sensitive + + + + + Find next match [Enter, F3] + + + + + Find next match with wrapping + + + + + F3 + F3 + + + + Interpret search pattern as a regular expression + + + + + <html><head/><body><p>When checked, the pattern to find is interpreted as a UNIX regular expression. See <a href="https://en.wikibooks.org/wiki/Regular_Expressions">Regular Expression in Wikibooks</a>.</p></body></html> + + + + + Regular Expression + + + + + + Close Find Bar + + + + + Results of the last executed statements Результати останніх виконаних операторів - + This field shows the results and status codes of the last executed statements. Це поле показує результати та коди статусів останніх виконаних операторів. - Export to &CSV - Експортувати в &CSV + Експортувати в &CSV - Save as &view - Зберегти як &вигляд + Зберегти як &вигляд - Save as view - Зберегти як вигляд + Зберегти як вигляд - Please specify the view name - Вкажіть ім'я вигляду + Вкажіть ім'я вигляду - There is already an object with that name. Please choose a different name. - Об'єкт із зазначеним ім'ям уже існує. Виберіть інше ім'я. + Об'єкт із зазначеним ім'ям уже існує. Виберіть інше ім'я. - View successfully created. - Вигляд успішно створений. + Вигляд успішно створений. - Error creating view: %1 - Помилка створення вигляду: %1 + Помилка створення вигляду: %1 SqlUiLexer - + (X) The abs(X) function returns the absolute value of the numeric argument X. (X) Функція abs(X) повертає модуль числа аргументу X. - + () The changes() function returns the number of database rows that were changed or inserted or deleted by the most recently completed INSERT, DELETE, or UPDATE statement. () Функція changes() повертає кількість рядків у базі даних, які було змінено, вставлено або видалено після вдалого виконання INSERT, DELETE або UPDATE. @@ -4030,7 +5899,7 @@ (X1,X2,...) Функція char(X1,X2,...,XN) повертає рядок складений із символів, переданих в якості аргументів. - + (X,Y,...) The coalesce() function returns a copy of its first non-NULL argument, or NULL if all arguments are NULL (X,Y,...) Функція coalesce() повертає копію першого аргументу не-NULL, якщо такого немає, то повертає NULL @@ -4039,56 +5908,55 @@ (X,Y) Функція glob (X,Y) еквівалентна виразу "Y GLOB X". - + (X,Y) The ifnull() function returns a copy of its first non-NULL argument, or NULL if both arguments are NULL. (X,Y) Функція ifnull() повертає копію першого аргументу не-NULL, або якщо обидва аргумента NULL, то повертає NULL. - + (X,Y) The instr(X,Y) function finds the first occurrence of string Y within string X and returns the number of prior characters plus 1, or 0 if Y is nowhere found within X. (X,Y) Функція instr(X,Y) повертає кількість символів, починаючи з якого в рядку X знайдено підрядок Y, або 0, якщо такого не знайдено. - + (X) The hex() function interprets its argument as a BLOB and returns a string which is the upper-case hexadecimal rendering of the content of that blob. (X) Функція hex() інтерпретує аргумент як BLOB і повертає рядок в 16-ричній системі числення із вмістом аргументу. - + () The last_insert_rowid() function returns the ROWID of the last row insert from the database connection which invoked the function. () Функція last_insert_rowid() повертає ROWID останнього вставленого рядка. - + (X) For a string value X, the length(X) function returns the number of characters (not bytes) in X prior to the first NUL character. (X) Для строкового значення X, функція length(X) повертає кількість символів (НЕ байтів) від початку рядка до першого символу '\0'. - + (X,Y) The like() function is used to implement the "Y LIKE X" expression. (X,Y) фукнція like() еквівалентна виразу "Y LIKE X". - + (X,Y,Z) The like() function is used to implement the "Y LIKE X ESCAPE Z" expression. (X,Y,Z) Функція like() еквівалент вираження "Y LIKE X ESCAPE Z". - (X) The load_extension(X) function loads SQLite extensions out of the shared library file named X. - (X) Функція load_extension(X) завантажує розширення SQLite з файлу бібліотеки динамічного компонування X. + (X) Функція load_extension(X) завантажує розширення SQLite з файлу бібліотеки динамічного компонування X. (X,Y) The load_extension(X,Y) function loads SQLite extensions out of the shared library file named X using the entry point Y. (X,Y) Функція load_extension (X,Y) завантажує розширення SQLite з файлу бібліотеки динамічного компонування X, використовуючи точку входу Y. - + (X) The lower(X) function returns a copy of string X with all ASCII characters converted to lower case. (X) Функція lower(X) повертає копію рядка X, в якій усі ACSII символи переведені в нижній регістр. - + (X) ltrim(X) removes spaces from the left side of X. (X) ltrim(X) видаляє символи пробілів зліва для рядка X. @@ -4097,185 +5965,267 @@ (X,Y) Функція ltrim (X,Y) повертає новий рядок шляхом видалення з рядка X зліва будь-якого символу з Y. - + (X1,X2,...) The char(X1,X2,...,XN) function returns a string composed of characters having the unicode code point values of integers X1 through XN, respectively. (X1,X2,...) Функція char(X1,X2,...,XN) повертає рядок, складений із символів, переданих як аргументи. - + (X,Y) The glob(X,Y) function is equivalent to the expression "Y GLOB X". (X,Y) функція glob(X,Y) еквівалент вираження "Y GLOB X". - (X,Y) The load_extension(X) function loads SQLite extensions out of the shared library file named X using the entry point Y. - (X,Y) функція load_extension(X) завантажує розширення SQLite з файлу бібліотеки динамічного компонування X використовуючи точку входу Y. + (X,Y) функція load_extension(X) завантажує розширення SQLite з файлу бібліотеки динамічного компонування X використовуючи точку входу Y. - + + (X) The load_extension(X) function loads SQLite extensions out of the shared library file named X. +Use of this function must be authorized from Preferences. + + + + + (X,Y) The load_extension(X) function loads SQLite extensions out of the shared library file named X using the entry point Y. +Use of this function must be authorized from Preferences. + + + + (X,Y) The ltrim(X,Y) function returns a string formed by removing any and all characters that appear in Y from the left side of X. (X,Y) Функція ltrim (X,Y) повертає новий рядок шляхом видалення з рядка X зліва будь-якого символу з Y. - + (X,Y,...) The multi-argument max() function returns the argument with the maximum value, or return NULL if any argument is NULL. (X,Y,...) Функція max() повертає аргумент з максимальним значенням, або NULL, якщо хоча б один аргумент дорівнює NULL. - + (X,Y,...) The multi-argument min() function returns the argument with the minimum value. (X,Y,...) Функція min() повертає аргумент з мінімальним значенням. - + (X,Y) The nullif(X,Y) function returns its first argument if the arguments are different and NULL if the arguments are the same. (X,Y) Функція nullif(X,Y) повертає перший аргумент, якщо аргументи різні, або NULL, якщо вони однакові. - + (FORMAT,...) The printf(FORMAT,...) SQL function works like the sqlite3_mprintf() C-language function and the printf() function from the standard C library. (FORMAT,...) Функція printf(FORMAT,...) працює так само, як printf() зі стандартної бібліотеки мови програмування Сі. - + (X) The quote(X) function returns the text of an SQL literal which is the value of its argument suitable for inclusion into an SQL statement. (X) Функція quote(X) повертає змінений рядок X, який можна використовувати в SQL виразах. - + () The random() function returns a pseudo-random integer between -9223372036854775808 and +9223372036854775807. () Функція random() повертає псевдовипадкове цілочисельне значення з діапозона від -9223372036854775808 до +9223372036854775807. - + (N) The randomblob(N) function return an N-byte blob containing pseudo-random bytes. (N) Функція randomblob(N) повертає N-байтний BLOB, що містить псевдовипадкові байти. - + (X,Y,Z) The replace(X,Y,Z) function returns a string formed by substituting string Z for every occurrence of string Y in string X. (X,Y,Z) Функція replace(X,Y,Z) повертає новий рядок на основі рядка X, заміною всіх підрядків Y на Z. - + (X) The round(X) function returns a floating-point value X rounded to zero digits to the right of the decimal point. (X) Функція round(X) округлює X до цілого значення. - + (X,Y) The round(X,Y) function returns a floating-point value X rounded to Y digits to the right of the decimal point. (X,Y) Функція round(X,Y) округлює X до Y чисел після коми праворуч. - + (X) rtrim(X) removes spaces from the right side of X. (X) rtrim(X) видаляє символи пробілу праворуч від рядка X. - + (X,Y) The rtrim(X,Y) function returns a string formed by removing any and all characters that appear in Y from the right side of X. (X,Y) Функція rtrim(X,Y) повертає новий рядок шляхом видалення з рядка X праворуч будь-якого символу з рядка Y. - - - - + + + + (timestring,modifier,modifier,...) (timestring,modifier,modifier,...) - + (format,timestring,modifier,modifier,...) (format,timestring,modifier,modifier,...) + + () The number of the row within the current partition. Rows are numbered starting from 1 in the order defined by the ORDER BY clause in the window definition, or in arbitrary order otherwise. + + + + + () The row_number() of the first peer in each group - the rank of the current row with gaps. If there is no ORDER BY clause, then all rows are considered peers and this function always returns 1. + + + + + () The number of the current row's peer group within its partition - the rank of the current row without gaps. Partitions are numbered starting from 1 in the order defined by the ORDER BY clause in the window definition. If there is no ORDER BY clause, then all rows are considered peers and this function always returns 1. + + + + + () Despite the name, this function always returns a value between 0.0 and 1.0 equal to (rank - 1)/(partition-rows - 1), where rank is the value returned by built-in window function rank() and partition-rows is the total number of rows in the partition. If the partition contains only one row, this function returns 0.0. + + + + + () The cumulative distribution. Calculated as row-number/partition-rows, where row-number is the value returned by row_number() for the last peer in the group and partition-rows the number of rows in the partition. + + + + + (N) Argument N is handled as an integer. This function divides the partition into N groups as evenly as possible and assigns an integer between 1 and N to each group, in the order defined by the ORDER BY clause, or in arbitrary order otherwise. If necessary, larger groups occur first. This function returns the integer value assigned to the group that the current row is a part of. + + + + + (expr) Returns the result of evaluating expression expr against the previous row in the partition. Or, if there is no previous row (because the current row is the first), NULL. + + + + + (expr,offset) If the offset argument is provided, then it must be a non-negative integer. In this case the value returned is the result of evaluating expr against the row offset rows before the current row within the partition. If offset is 0, then expr is evaluated against the current row. If there is no row offset rows before the current row, NULL is returned. + + + + + + (expr,offset,default) If default is also provided, then it is returned instead of NULL if the row identified by offset does not exist. + + + + + (expr) Returns the result of evaluating expression expr against the next row in the partition. Or, if there is no next row (because the current row is the last), NULL. + + + + + (expr,offset) If the offset argument is provided, then it must be a non-negative integer. In this case the value returned is the result of evaluating expr against the row offset rows after the current row within the partition. If offset is 0, then expr is evaluated against the current row. If there is no row offset rows after the current row, NULL is returned. + + + + + (expr) This built-in window function calculates the window frame for each row in the same way as an aggregate window function. It returns the value of expr evaluated against the first row in the window frame for each row. + + + + + (expr) This built-in window function calculates the window frame for each row in the same way as an aggregate window function. It returns the value of expr evaluated against the last row in the window frame for each row. + + + + + (expr,N) This built-in window function calculates the window frame for each row in the same way as an aggregate window function. It returns the value of expr evaluated against the row N of the window frame. Rows are numbered within the window frame starting from 1 in the order defined by the ORDER BY clause if one is present, or in arbitrary order otherwise. If there is no Nth row in the partition, then NULL is returned. + + + (X,Y) The rtrim (X,Y) function returns a string formed by removing any and all characters that appear in Y from the right side of X. (X,Y) Функція rtrim(X,Y) повертає новий рядок шляхом видалення з рядка X праворуч будь-якого символу з рядка Y. - + (X) The soundex(X) function returns a string that is the soundex encoding of the string X. (X) Функція soundex(X) повертає копію рядка X, кодовану в форматі soundex. - + (X,Y) substr(X,Y) returns all characters through the end of the string X beginning with the Y-th. (X,Y) substr(X,Y) повертає підрядок з рядка X, починаючи з Y-го символу. - + (X,Y,Z) The substr(X,Y,Z) function returns a substring of input string X that begins with the Y-th character and which is Z characters long. (X,Y,Z) Функція substr(X,Y,Z) повертає підрядок з рядка X, починаючи з Y-го символу, завдовжки Z-символів. - + () The total_changes() function returns the number of row changes caused by INSERT, UPDATE or DELETE statements since the current database connection was opened. () Функція total_changes() повертає кількість рядків, змінених за допомогою INSERT, UPDATE або DELETE, починаючи з того моменту, коли під'єднання до бази даних було відкрито. - + (X) trim(X) removes spaces from both ends of X. (X) trim(X) видаляє пробіли з обох сторін рядка X. - + (X,Y) The trim(X,Y) function returns a string formed by removing any and all characters that appear in Y from both ends of X. (X,Y) Функція trim(X,Y) створює новий рядок з X шляхом видалення з обох кінців символів, які присутні в рядку Y. - + (X) The typeof(X) function returns a string that indicates the datatype of the expression X. (X) Функція typeof(X) повертає рядок із типом даних вираження X. - + (X) The unicode(X) function returns the numeric unicode code point corresponding to the first character of the string X. (X) Функція unicode(X) повертає числове значення UNICODE коду символу. - + (X) The upper(X) function returns a copy of input string X in which all lower-case ASCII characters are converted to their upper-case equivalent. (X) Функція upper(X) повертає копію рядка X, в якій для кожного ASCII символу регістр буде перетворений з нижнього у верхній. - + (N) The zeroblob(N) function returns a BLOB consisting of N bytes of 0x00. (N) Функція zeroblob(N) повертає BLOB розміром N байт зі значеннями 0x00. - + (X) The avg() function returns the average value of all non-NULL X within a group. (X) Функція avg() повертає середнє значення для всіх не-NULL значень групи. - + (X) The count(X) function returns a count of the number of times that X is not NULL in a group. (X) Функція count(X) повертає кількість рядків, у яких X не-NULL у групі. - + (X) The group_concat() function returns a string which is the concatenation of all non-NULL values of X. (X) Функція group_concat() повертає рядок з усіх значень X не-NULL. - + (X,Y) The group_concat() function returns a string which is the concatenation of all non-NULL values of X. If parameter Y is present then it is used as the separator between instances of X. (X,Y) Функція group_concat() повертає рядок з усіх значень X не-NULL. Y - роздільник між значеннями X. - + (X) The max() aggregate function returns the maximum value of all values in the group. (X) Агрегатна функція max() повертає максимальне значення для X. - + (X) The min() aggregate function returns the minimum non-NULL value of all values in the group. (X) Агрегатна функція min() повертає мінімальне не-NULL значення для X. - - + + (X) The sum() and total() aggregate functions return sum of all non-NULL values in the group. (X) Агрегатні функції sum() і total() повертають суму всіх не-NULL значень для X. @@ -4289,19 +6239,49 @@ Натисніть Ctrl+Shift і клік щоб переміститися туди - References %1(%2) Hold Ctrl+Shift and click to jump there - Налаштування %1(%2) + Налаштування %1(%2) Затисніть Ctrl+Shift і клік, щоб переміститися туди - + + reading rows + + + + + loading... + + + + + References %1(%2) +Hold %3Shift and click to jump there + + + + Error changing data: %1 Помилка зміни даних: %1 + + + retrieving list of columns + + + + + Fetching data... + + + + + Cancel + + VacuumDialog @@ -4313,13 +6293,21 @@ - Warning: Compacting the database will commit all changes you made. - Попередження: Ущільнення бази даних зафіксує всі зміни, які було зроблено. + Warning: Compacting the database will commit all of your changes. + + Please select the databases to co&mpact: + + + + Warning: Compacting the database will commit all changes you made. + Попередження: Ущільнення бази даних зафіксує всі зміни, які було зроблено. + + Please select the objects to compact: - Виберіть об'єкти для ущільнення: + Виберіть об'єкти для ущільнення: diff -Nru sqlitebrowser-3.10.100ubuntu1/src/translations/sqlb_zh.ts sqlitebrowser-3.11.1/src/translations/sqlb_zh.ts --- sqlitebrowser-3.10.100ubuntu1/src/translations/sqlb_zh.ts 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/src/translations/sqlb_zh.ts 2019-02-19 23:51:34.000000000 +0000 @@ -15,96 +15,221 @@ - <html><head/><body><p>DB Browser for SQLite is an open source, freeware visual tool used to create, design and edit SQLite database files.</p><p>It is bi-licensed under the Mozilla Public License Version 2, as well as the GNU General Public License Version 3 or later. You can modify or redistribute it under the conditions of these licenses.</p><p>See <a href="http://www.gnu.org/licenses/gpl.html"><span style=" text-decoration: underline; color:#0000ff;">http://www.gnu.org/licenses/gpl.html</span></a> and <a href="https://www.mozilla.org/MPL/2.0/index.txt"><span style=" text-decoration: underline; color:#0000ff;">https://www.mozilla.org/MPL/2.0/index.txt</span></a> for details.</p><p>For more information on this program please visit our website at: <a href="http://sqlitebrowser.org"><span style=" text-decoration: underline; color:#0000ff;">http://sqlitebrowser.org</span></a></p><p><span style=" font-size:small;">This software uses the GPL/LGPL Qt Toolkit from </span><a href="http://qt-project.org/"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://qt-project.org/</span></a><span style=" font-size:small;"><br/>See </span><a href="http://qt-project.org/doc/qt-5/licensing.html"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://qt-project.org/doc/qt-5/licensing.html</span></a><span style=" font-size:small;"> for licensing terms and information.</span></p><p><span style=" font-size:small;">It also uses the Silk icon set by Mark James licensed under a Creative Commons Attribution 2.5 and 3.0 license.<br/>See </span><a href="http://www.famfamfam.com/lab/icons/silk/"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://www.famfamfam.com/lab/icons/silk/</span></a><span style=" font-size:small;"> for details.</span></p></body></html> - <html><head/><body><p>DB Browser for SQLite 是一个开源的免费可视化工具,用于创建、设计和编辑 SQLite 数据库文件。</p><p>它是以第 2 版 Mozilla 公共许可,以及第 3 版及之后版本的 GNU 通用许可方式授权。你可以在遵循这些许可的条件下修改或重新发布它。</p><p>参阅 <a href="http://www.gnu.org/licenses/gpl.html"><span style=" text-decoration: underline; color:#0000ff;">http://www.gnu.org/licenses/gpl.html</span></a> 和 <a href="https://www.mozilla.org/MPL/2.0/index.txt"><span style=" text-decoration: underline; color:#0000ff;">https://www.mozilla.org/MPL/2.0/index.txt</span></a> 了解细节。</p><p>要获得本程序的更多信息,请访问我们的网站: <a href="http://sqlitebrowser.org"><span style=" text-decoration: underline; color:#0000ff;">http://sqlitebrowser.org</span></a></p><p><span style=" font-size:small;">这个软件使用了 GPL/LGPL Qt Toolkit: </span><a href="http://qt-project.org/"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://qt-project.org/</span></a><span style=" font-size:small;"><br/>参阅 </span><a href="http://qt-project.org/doc/qt-5/licensing.html"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://qt-project.org/doc/qt-5/licensing.html</span></a><span style=" font-size:small;"> 了解许可条款和信息。</span></p><p><span style=" font-size:small;">它还是用了由 Mark James 提供的 Silk 图标集,以第 2.5 和 3.0 版知识共享署名(CCA)许可方式授权。<br/>参阅 </span><a href="http://www.famfamfam.com/lab/icons/silk/"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://www.famfamfam.com/lab/icons/silk/</span></a><span style=" font-size:small;"> 了解细节。</span></p></body></html> + <html><head/><body><p>DB Browser for SQLite is an open source, freeware visual tool used to create, design and edit SQLite database files.</p><p>It is bi-licensed under the Mozilla Public License Version 2, as well as the GNU General Public License Version 3 or later. You can modify or redistribute it under the conditions of these licenses.</p><p>See <a href="http://www.gnu.org/licenses/gpl.html">http://www.gnu.org/licenses/gpl.html</a> and <a href="https://www.mozilla.org/MPL/2.0/index.txt">https://www.mozilla.org/MPL/2.0/index.txt</a> for details.</p><p>For more information on this program please visit our website at: <a href="http://sqlitebrowser.org">http://sqlitebrowser.org</a></p><p><span style=" font-size:small;">This software uses the GPL/LGPL Qt Toolkit from </span><a href="http://qt-project.org/"><span style=" font-size:small;">http://qt-project.org/</span></a><span style=" font-size:small;"><br/>See </span><a href="http://qt-project.org/doc/qt-5/licensing.html"><span style=" font-size:small;">http://qt-project.org/doc/qt-5/licensing.html</span></a><span style=" font-size:small;"> for licensing terms and information.</span></p><p><span style=" font-size:small;">It also uses the Silk icon set by Mark James licensed under a Creative Commons Attribution 2.5 and 3.0 license.<br/>See </span><a href="http://www.famfamfam.com/lab/icons/silk/"><span style=" font-size:small;">http://www.famfamfam.com/lab/icons/silk/</span></a><span style=" font-size:small;"> for details.</span></p></body></html> + <html><head/><body><p>DB Browser for SQLite 是一个开源的免费可视化工具,用于创建、设计和编辑 SQLite 数据库文件。</p><p>它以第 2 版 Mozilla 公共许可,以及第 3 版及之后版本的 GNU 通用许可方式授权。你可以在遵循这些许可的条件下修改或重新发布它。</p><p>参阅 <a href="http://www.gnu.org/licenses/gpl.html"><span style=" text-decoration: underline; color:#0000ff;">http://www.gnu.org/licenses/gpl.html</span></a> and <a href="https://www.mozilla.org/MPL/2.0/index.txt"><span style=" text-decoration: underline; color:#0000ff;">https://www.mozilla.org/MPL/2.0/index.txt</span></a> for details.</p><p>For more information on this program please visit our website at: <a href="https://sqlitebrowser.org"><span style=" text-decoration: underline; color:#0000ff;">https://sqlitebrowser.org</span></a></p><p><span style=" font-size:small;">This software uses the GPL/LGPL Qt Toolkit from </span><a href="http://qt-project.org/"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://qt-project.org/</span></a><span style=" font-size:small;"><br/>See </span><a href="http://qt-project.org/doc/qt-5/licensing.html"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://qt-project.org/doc/qt-5/licensing.html</span></a><span style=" font-size:small;"> for licensing terms and information.</span></p><p><span style=" font-size:small;">It also uses the Silk icon set by Mark James licensed under a Creative Commons Attribution 2.5 and 3.0 license.<br/>See </span><a href="http://www.famfamfam.com/lab/icons/silk/"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://www.famfamfam.com/lab/icons/silk/</span></a><span style=" font-size:small;"> for details.</span></p></body></html> - + <html><head/><body><p>DB Browser for SQLite is an open source, freeware visual tool used to create, design and edit SQLite database files.</p><p>It is bi-licensed under the Mozilla Public License Version 2, as well as the GNU General Public License Version 3 or later. You can modify or redistribute it under the conditions of these licenses.</p><p>See <a href="http://www.gnu.org/licenses/gpl.html"><span style=" text-decoration: underline; color:#0000ff;">http://www.gnu.org/licenses/gpl.html</span></a> and <a href="https://www.mozilla.org/MPL/2.0/index.txt"><span style=" text-decoration: underline; color:#0000ff;">https://www.mozilla.org/MPL/2.0/index.txt</span></a> for details.</p><p>For more information on this program please visit our website at: <a href="https://sqlitebrowser.org"><span style=" text-decoration: underline; color:#0000ff;">https://sqlitebrowser.org</span></a></p><p><span style=" font-size:small;">This software uses the GPL/LGPL Qt Toolkit from </span><a href="http://qt-project.org/"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://qt-project.org/</span></a><span style=" font-size:small;"><br/>See </span><a href="http://qt-project.org/doc/qt-5/licensing.html"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://qt-project.org/doc/qt-5/licensing.html</span></a><span style=" font-size:small;"> for licensing terms and information.</span></p><p><span style=" font-size:small;">It also uses the Silk icon set by Mark James licensed under a Creative Commons Attribution 2.5 and 3.0 license.<br/>See </span><a href="http://www.famfamfam.com/lab/icons/silk/"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://www.famfamfam.com/lab/icons/silk/</span></a><span style=" font-size:small;"> for details.</span></p></body></html> + <html><head/><body><p>DB Browser for SQLite 是一个开源的免费可视化工具,用于创建、设计和编辑 SQLite 数据库文件。</p><p>它是以第 2 版 Mozilla 公共许可,以及第 3 版及之后版本的 GNU 通用许可方式授权。你可以在遵循这些许可的条件下修改或重新发布它。</p><p>参阅 <a href="http://www.gnu.org/licenses/gpl.html"><span style=" text-decoration: underline; color:#0000ff;">http://www.gnu.org/licenses/gpl.html</span></a> 和 <a href="https://www.mozilla.org/MPL/2.0/index.txt"><span style=" text-decoration: underline; color:#0000ff;">https://www.mozilla.org/MPL/2.0/index.txt</span></a> 了解细节。</p><p>要获得本程序的更多信息,请访问我们的网站: <a href="https://sqlitebrowser.org"><span style=" text-decoration: underline; color:#0000ff;">https://sqlitebrowser.org</span></a></p><p><span style=" font-size:small;">这个软件使用了 GPL/LGPL Qt Toolkit: </span><a href="http://qt-project.org/"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://qt-project.org/</span></a><span style=" font-size:small;"><br/>参阅 </span><a href="http://qt-project.org/doc/qt-5/licensing.html"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://qt-project.org/doc/qt-5/licensing.html</span></a><span style=" font-size:small;"> 了解许可条款和信息。</span></p><p><span style=" font-size:small;">它还是用了由 Mark James 提供的 Silk 图标集,以第 2.5 和 3.0 版知识共享署名(CCA)许可方式授权。<br/>参阅 </span><a href="http://www.famfamfam.com/lab/icons/silk/"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://www.famfamfam.com/lab/icons/silk/</span></a><span style=" font-size:small;"> 了解细节。</span></p></body></html> + + + + (based on SQLite %1) + (基于 SQLite %1) + + + Version 版本 - + Qt Version Qt 版本 - + SQLCipher Version SQLCipher 版本 - + SQLite Version SQLite 版本 + AddRecordDialog + + + Add New Record + 新增记录 + + + + Enter values for the new record considering constraints. Fields in bold are mandatory. + 为新增的记录填写满足约束的值。加粗的字段必须填写。 + + + + In the Value column you can specify the value for the field identified in the Name column. The Type column indicates the type of the field. Default values are displayed in the same style as NULL values. + 在值列,你可以选择给对应名字列的值。类型列显示了字段的类型。默认值的显示样式和 NULL 值一样。 + + + + Name + 名称 + + + + Type + 类型 + + + + Value + + + + + Values to insert. Pre-filled default values are inserted automatically unless they are changed. + 要插入的值。如果没有修改,就会插入事先填好的默认值。 + + + + When you edit the values in the upper frame, the SQL query for inserting this new record is shown here. You can edit manually the query before saving. + 当你在上面编辑值时,这里会显示插入新记录所用的 SQL 语句。你可以在保存前手动修改这些语句。 + + + + <html><head/><body><p><span style=" font-weight:600;">Save</span> will submit the shown SQL statement to the database for inserting the new record.</p><p><span style=" font-weight:600;">Restore Defaults</span> will restore the initial values in the <span style=" font-weight:600;">Value</span> column.</p><p><span style=" font-weight:600;">Cancel</span> will close this dialog without executing the query.</p></body></html> + <html><head/><body><p><span style=" font-weight:600;">保存</span> 将会把显示的 SQL 语句提交到数据库以插入新记录。</p><p><span style=" font-weight:600;">恢复默认</span> 将会把 <span style=" font-weight:600;">值</span> 恢复成默认值。</p><p><span style=" font-weight:600;">取消</span> 将会关闭此界面,不执行 SQL 语句。</p></body></html> + + + + Auto-increment + + 自增 + + + + + Unique constraint + + 唯一约束 + + + + + Check constraint: %1 + + 检查约束: %1 + + + + + Foreign key: %1 + + 外键: %1 + + + + + Default value: %1 + + 默认值: %1 + + + + + Error adding record. Message from database engine: + +%1 + 添加记录失败。来自数据库引擎的消息: + +%1 + + + + Are you sure you want to restore all the entered values to their defaults? + 你确定要把输入的所有值都恢复成默认值吗? + + + Application - + Usage: %1 [options] [db] 用法: %1 [选项] [数据库] - + Possible command line arguments: 可用命令行参数: - + -h, --help Show command line options -h, --help 显示命令行选项 - + -s, --sql [file] Execute this SQL file after opening the DB -s, --sql [文件] 在打开数据库后执行此 SQL 文件 - + -t, --table [table] Browse this table after opening the DB -t, --table [表] 在打开数据库后浏览此表 - + + -o, --option [group/setting=value] Run application with this setting temporarily set to value + + + + + This is DB Browser for SQLite version %1. + 这是 DB Browser for SQLite 版本 %1%2. {1.?} + + + -q, --quit Exit application after running scripts -q, --quit 在运行脚本后退出应用程序 - + + -R, --read-only Open database in read-only mode + -R, --read-only 用只读模式打开数据库 + + + -v, --version Display the current version -v, --version 显示当前版本 - + [file] Open this SQLite database [文件] 打开这个 SQLite 数据库 - This is DB Browser for SQLite version %1%2. - 这是 DB Browser for SQLite 版本 %1%2. + 这是 DB Browser for SQLite 版本 %1%2. - + The -s/--sql option requires an argument -s/--sql 选项需要一个参数 - + The file %1 does not exist 文件 %1 不存在 - + The -t/--table option requires an argument -t/--table 选项需要一个参数 - + + The -o/--option option requires an argument in the form group/setting=value + + + + Invalid option/non-existant file: %1 无效选项/不存在的文件: %1 @@ -132,12 +257,12 @@ 页大小(&z) - + Passphrase 口令 - + Raw key @@ -146,7 +271,7 @@ 页大小(&S) - + Please set a key to encrypt the database. Note that if you change any of the other, optional, settings you'll need to re-enter them as well every time you open the database file. Leave the password fields empty to disable the encryption. @@ -157,7 +282,7 @@ 加密过程将花费一些时间,您应该在加密之前备份数据库!修改加密前,未保存的更改将会被应用。 - + Please enter the key used to encrypt the database. If any of the other settings were altered for this database file you need to provide this information as well. 请输入加密数据库的密码。 @@ -187,67 +312,82 @@ 默认 - + Decimal number 十进制数 - + Exponent notation 指数 - + Hex blob 十六进制大型对象 - + Hex number 十六进制数 - + Apple NSDate to date 苹果 NSDate 到日期 - + + Java epoch (milliseconds) to date + Java 时间戳(毫秒)到日期 + + + Julian day to date 儒略日 (Julian day) 到日期 - + + Unix epoch to local time + Unix 时间戳到本地时间 + + + + Date as dd/mm/yyyy + 日期,格式为 dd/mm/yyyy + + + Lower case 小写 - + Octal number 八进制数 - + Round number 取整数 - + Unix epoch to date Unix 时间到日期 - + Upper case 大写 - + Windows DATE to date Windows 日期到日期 - + Custom 自定义 @@ -255,38 +395,38 @@ DBBrowserDB - + Please specify the database name under which you want to access the attached database 请指明想要附加的数据库名 - + Invalid file format 无效的文件格式 - + Do you want to save the changes made to the database file %1? 您是否想保存对数据库文件 %1 做出的更改? - + Exporting database to SQL file... 正在导出数据库到 SQL 文件... - - + + Cancel 取消 - + Executing SQL... 正在执行 SQL... - + Action cancelled. 操作已取消。 @@ -301,53 +441,89 @@ 重命名列: 不能查找表 %1。 - - + + This database has already been attached. Its schema name is '%1'. + 此数据库已被附加。它的架构名是 '%1'. + + + + Do you really want to close this temporary database? All data will be lost. + 你确定要关闭此临时数据库吗?所有数据都会丢失。 + + + + The database is currently busy: + 数据库正忙: + + + + Do you want to abort that other operation? + 确定要放弃操作吗? + + + + + No database file opened + 没有打开数据库文件 + + + + Error in statement #%1: %2. Aborting execution%3. 错误在语句 #%1: %2. 正在放弃执行%3. - - + + and rolling back 并回滚 - + + Cannot delete this object + 无法删除此对象 + + + Cannot set data on this object 不能为此数据设置对象 - + + A table with the name '%1' already exists in schema '%2'. + 一个与 '%1' 同名的表已经存在于架构 '%2' 中。 + + + renameColumn: cannot find column %1. 重命名列: 不能查找列 %1。 - + renameColumn: creating savepoint failed. DB says: %1 重命名列: 创建保存点时失败。DB 说: %1 - + renameColumn: creating new table failed. DB says: %1 重命名列: 创建新表时失败。DB 说: %1 - + renameColumn: copying data to new table failed. DB says: %1 重命名列: 复制数据到新表时失败。DB 说: %1 - + renameColumn: deleting old table failed. DB says: %1 重命名列: 删除旧表失败。DB 说: %1 - + Restoring some of the objects associated with this table failed. This is most likely because some column names changed. Here's the SQL statement which you might want to fix and execute manually: @@ -356,24 +532,34 @@ - + renameColumn: releasing savepoint failed. DB says: %1 重命名列: 释放保存点时失败。DB 说: %1 - + Error renaming table '%1' to '%2'.Message from database engine: %3 重命名表 '%1' 为 '%2' 时失败。来自数据库引擎的消息: %3 - + ... <string can not be logged, contains binary data> ... ... <字符串不能记录,包含二进制数据> ... - + + could not get list of databases: %1 + 无法获取数据库列表: %1 + + + + Error loading extension: %1 + 加载扩展时出错: %1 + + + could not get column information 无法获取列信息 @@ -382,7 +568,7 @@ 未知对象类型 %1 - + could not get list of db objects: %1, %2 不能获取数据库对象的列表: %1, %2 @@ -391,22 +577,22 @@ 不能获取类型 - + didn't receive any output from pragma %1 没有接收到来自杂注 %1 的任何输出 - + could not execute pragma command: %1, %2 不能执行杂注命令: %1, %2 - + Error setting pragma %1 to %2: %3 设置杂注 %1 为 %2 时出错: %3 - + File not found. 文件找不到。 @@ -414,52 +600,66 @@ DbStructureModel - + Name 名称 - + Object 对象 - + Type 类型 - + Schema 架构 - Browsables (%1) - 可浏览的 (%1) + 可浏览的 (%1) + + + + Database + 数据库 + + + + Browsables + 可浏览的 - + All 所有 - + + Temporary + 临时的 + + + Tables (%1) 表 (%1) - + Indices (%1) 索引 (%1) - + Views (%1) 视图 (%1) - + Triggers (%1) 触发器 (%1) @@ -477,153 +677,369 @@ 模式: - - + Image 图像 - Import text - 导入文本 + 导入文本 - Opens a file dialog used to import text to this database cell. - 打开一个文件对话框用于导入文本到这个数据库单元格。 + 打开一个文件对话框用于导入文本到这个数据库单元格。 - + &Import 导入(&I) - Export text - 导出文本 + 导出文本 - Opens a file dialog used to export the contents of this database cell to a text file. - 打开一个文件对话框用于导出这个数据库单元格的内容到一个文本文件。 + 打开一个文件对话框用于导出这个数据库单元格的内容到一个文本文件。 - + &Export 导出(&E) - + Set this cell to NULL 设置此单元格为空 - + Set as &NULL 设为&空 - + + Apply data to cell + 将数据应用到单元格 + + + + This button saves the changes performed in the cell editor to the database cell. + 此按钮把单元格编辑器中的修改应用到数据库单元格中。 + + + Apply 应用 - + Text 文本 - + + This is the list of supported modes for the cell editor. Choose a mode for viewing or editing the data of the current cell. + 这是单元格编辑器支持的模式列表。选择一种模式以查看或编辑当前单元格的数据。 + + + Binary 二进制 - + + JSON + + + + + XML + + + + + + Automatically adjust the editor mode to the loaded data type + 自动调整编辑器模式为加载的数据的类型 + + + + This checkable button enables or disables the automatic switching of the editor mode. When a new cell is selected or new data is imported and the automatic switching is enabled, the mode adjusts to the detected data type. You can then change the editor mode manually. If you want to keep this manually switched mode while moving through the cells, switch the button off. + 此复选按钮可启用或禁用编辑器模式的自动切换。当新单元格被选中或新数据被导入时,如果启用了自动切换,模式会调整为检测到的数据类型。之后你也手动切换编辑器的模式。如果你希望浏览各单元格的时候都保持手动选择的模式,请把此按钮切到关闭状态。 + + + + Auto-switch + 自动切换 + + + + + Auto-format: pretty print on loading, compact on saving. + 自动格式: 读取时格式化,存储时紧凑化。 + + + + When enabled, the auto-format feature formats the data on loading, breaking the text in lines and indenting it for maximum readability. On data saving, the auto-format feature compacts the data removing end of lines, and unnecessary whitespace. + 当启用时,自动格式特性将在数据加载时格式化数据,增加换行并缩进以提高可读性。在保存数据时,自动格式特性会通过删除换行、不必要的空白字符的方式来紧凑化数据。 + + + + Autoformat + 自动格式 + + + + Import from file + 从文件导入 + + + + Opens a file dialog used to import any kind of data to this database cell. + 打开文件选择对话框,导入任何类型的数据到此数据库单元格。 + + + + Export to file + 导出到文件 + + + + Opens a file dialog used to export the contents of this database cell to a file. + 打开文件选择对话框,导出此数据库单元格的内容到一个文件里。 + + + Erases the contents of the cell 删除单元格的内容 - + This area displays information about the data present in this database cell 这个区域显示存在于这个数据库单元格中的数据的相关信息 - + + This editor mode lets you edit JSON or XML data with syntax highlighting, automatic formatting and validation before saving. + +Errors are indicated with a red squiggle underline. + 此编辑器模式允许你在有语法高亮的情况下编辑 JSON 或 XML 数据,并在保存前自动格式化与验证。 + +错误会用红色波浪下划线标出。 + + + Type of data currently in cell 当前在单元格中的数据的类型 - + Size of data currently in table 当前在表中的数据的大小 - + + + Print... + 打印... + + + + Open preview dialog for printing displayed image + 打开打印预览对话框,预览图像 + + + + + Ctrl+P + Ctrl+P + + + + Open preview dialog for printing displayed text + 打开打印预览对话框,预览文本 + + + + Copy Hex and ASCII + 拷贝十六进制和 ASCII + + + + Copy selected hexadecimal and ASCII columns to the clipboard + 拷贝选中的十六进制和 ASCII 列到剪贴板中 + + + + Ctrl+Shift+C + + + Choose a file - 选择一个文件 + 选择一个文件 - Text files(*.txt);;Image files(%1);;All files(*) - 文本文件(*.txt);;图像文件(%1);;所有文件(*) + 文本文件(*.txt);;图像文件(%1);;所有文件(*) - + Choose a filename to export data 选择一个导出数据的文件名 - Text files(*.txt);;All files(*) - 文本文件(*.txt);;所有文件(*) + 文本文件(*.txt);;所有文件(*) - Image data can't be viewed with the text editor - 图像数据不能用文本编辑器查看 + 图像数据不能用文本编辑器查看 - Binary data can't be viewed with the text editor - 二进制数据不能用文本编辑器查看 + 二进制数据不能用文本编辑器查看 - + Type of data currently in cell: %1 Image 当前在单元格中的数据的类型: %1 图像 - + %1x%2 pixel(s) %1x%2 像素 - + Type of data currently in cell: NULL 当前在单元格中的数据的类型: 空 - - + + Type of data currently in cell: Text / Numeric 当前在单元格中的数据的类型: 文本/ 数值 + + + + Image data can't be viewed in this mode. + 此模式下无法查看图像数据。 + + + + + Try switching to Image or Binary mode. + 尝试切换到图像或二进制模式。 + + + + + Binary data can't be viewed in this mode. + 此模式下无法查看二进制数据。 + + + + + Try switching to Binary mode. + 尝试切换到二进制模式。 + + + + + + + Text files (*.txt) + 文本文件 (*.txt) + + + + + + JSON files (*.json) + JSON 文件 (*.json) + + + + + + + XML files (*.xml) + XML 文件 (*.xml) + + + + + Image files (%1) + 图像文件 (%1) + + + + + + Binary files (*.bin) + 二进制文件 (*.bin) + + + + + All files (*) + 所有文件 (*) + + + + Choose a file to import + 选择一个要导入的文件 + + + + %1 Image + %1 图像 + + + + SVG files (*.svg) + SVG 文件 (*.svg) + + + + + Hex dump files (*.txt) + 十六进制转储文件 (*.txt) + + + + Invalid data for this mode + 数据对此模式非法 + + + + The cell contains invalid %1 data. Reason: %2. Do you really want to apply it to the cell? + 单元格中包含非法的 %1 数据。原因: %2. 你确实想把它应用到单元格中吗? + - - + + + %n char(s) %n 个字符 - + + Type of data currently in cell: Valid JSON + 单元格中当前的数据: 合法的 JSON + + + Type of data currently in cell: Binary 当前在单元格中的数据的类型: Binary 二进制 - - + + %n byte(s) %n 字节 @@ -709,14 +1125,14 @@ 索引列 - + Deleting the old index failed: %1 删除旧索引失败: %1 - + Creating the index failed: %1 创建索引时失败: @@ -742,134 +1158,141 @@ + Database schema + 数据库架构 + + + Make this a 'WITHOUT rowid' table. Setting this flag requires a field of type INTEGER with the primary key flag set and the auto increment flag unset. 让表'没有 rowid'。设置此标志需要有一个 INTEGER 类型并被设为主键、非自增的字段。 - + Without Rowid 无 Rowid - Set this to create a temporary table that is deleted when closing the database. - 设置以创建一个临时表,临时表在关闭数据库时会被删除。 + 设置以创建一个临时表,临时表在关闭数据库时会被删除。 - Temporary table - 临时表 + 临时表 - + Fields 字段 - + Add field 添加字段 - + Remove field 删除字段 - + Move field up 上移字段 - + Move field down 下移字段 - + Name 名称 - + Type 类型 - - + + NN + + + + Not null 非空 - + PK PK - + Primary key 主键 - + AI AI - + Autoincrement 自动增值 - + U U - + Unique 唯一 - + Default 默认 - + Default value 默认值 - + Check 检查 - + Check constraint 检查约束条件 - + Foreign Key 外键 - + <html><head/><body><p><span style=" font-weight:600; color:#ff0000;">Warning: </span>There is something with this table definition that our parser doesn't fully understand. Modifying and saving this table might result in problems.</p></body></html> <html><head/><body><p><span style=" font-weight:600; color:#ff0000;">警告: </span>表中有一些无法解析的定义。编辑并保存表可能会带来问题。</p></body></html> - + Error creating table. Message from database engine: %1 创建表时出错。来自数据库引擎的消息: %1 - + There already is a field with that name. Please rename it first or choose a different name for this field. 已存在同名字段。请先重命名已有字段,或为此字段选一个不同的名字。 @@ -878,47 +1301,47 @@ 此列是表 %1, 列 %2 的外键,因此它的名字不能改变。 - + This column is referenced in a foreign key in table %1 and thus its name cannot be changed. 此列是表 %1 的外键,因此它的名字不能改变。 - + There is at least one row with this field set to NULL. This makes it impossible to set this flag. Please change the table data first. 至少有一行带本字段的记录被设为空。这使得它不可能设置这个标志。请首先更改表数据。 - + There is at least one row with a non-integer value in this field. This makes it impossible to set the AI flag. Please change the table data first. 在这个字段中至少有一行带有一个非整数的值。这使得它不可能设置自增标志。请首先更改表数据。 - + Column '%1' has no unique data. 列 '%1' 中存在不唯一的数据。 - + This makes it impossible to set this flag. Please change the table data first. 这导致无法设置此标志。请先修改表中数据。 - + Modifying this column failed. Error returned from database: %1 修改此列失败。数据库返回的错误: %1 - + Are you sure you want to delete the field '%1'? All data currently stored in this field will be lost. 您是否确认您想删除字段 '%1'? 当前存储在这个字段中的所有数据将会丢失。 - + Please add a field which meets the following criteria before setting the without rowid flag: - Primary key flag set - Auto increment disabled @@ -927,17 +1350,23 @@ - 禁止自增 - + Setting the rowid column for the table failed. Error message: %1 设置表的 rowid 列失败。错误信息: %1 - + + Changing the table schema failed. Error message: +%1 + 修改表格架构失败。错误信息: +%1 + + Setting the temporary flag for the table failed. Error message: %1 - 将表标记为临时时失败。错误信息: + 将表标记为临时时失败。错误信息: %1 @@ -1038,44 +1467,54 @@ 美化输出 - - + + Could not open output file: %1 打不开输出文件: %1 - - + + Choose a filename to export data 选择导出数据的文件名 - + Text files(*.csv *.txt) 文本文件(*.csv *.txt) - + Export data as JSON 导出为 JSON - + + exporting CSV + 导出 CSV + + + + exporting JSON + 导出 JSON + + + Text files(*.json *.js *.txt) 文本文件(*.json *.js *.txt) - + Please select at least 1 table. 请至少选1个表 - + Choose a directory 选择一个目录 - + Export completed. 导出完成。 @@ -1143,56 +1582,160 @@ 覆盖旧架构 (DROP TABLE, 然后 CREATE TABLE) - Please select at least 1 table. - 请至少选1个表 + 请至少选1个表 - + + Please select at least one table. + 请至少选一个表。 + + + Choose a filename to export 选择要导出的文件名 - + Text files(*.sql *.txt) 文本文件(*.sql *.txt) - + Export completed. 导出完成。 - + Export cancelled or failed. 导出被取消或失败。 - ExtendedTableWidget + ExtendedScintilla - The content of clipboard is bigger than the range selected. -Do you want to insert it anyway? - 剪贴板中的内容比所选范围更大。 -您是否依然要插入? + + + Ctrl+H + - - Set to NULL - 设置为 NULL + + + Ctrl+P + Ctrl+P - - Copy - 复制 + + Find and Replace... + 查找并替换... - + + Print... + 打印... + + + + ExtendedTableWidget + + The content of clipboard is bigger than the range selected. +Do you want to insert it anyway? + 剪贴板中的内容比所选范围更大。 +您是否依然要插入? + + + + Use as Exact Filter + 用于精确过滤 + + + + Containing + 包含 + + + + Not equal to + 不等于 + + + + Greater than + 大于 + + + + Less than + 小于 + + + + Greater or equal + 大于等于 + + + + Less or equal + 小于等于 + + + + Between this and... + 在此值和...之间 + + + + Set to NULL + 设置为 NULL + + + + Copy + 复制 + + + + Copy with Headers + 带表头一起拷贝 + + + + Copy as SQL + 拷贝为 SQL + + + Paste 粘贴 - + + Print... + 打印... + + + + Use in Filter Expression + 在过滤器表达式中使用 + + + + Alt+Del + + + + + Ctrl+Shift+C + + + + + Ctrl+Alt+C + + + + The content of the clipboard is bigger than the range selected. Do you want to insert it anyway? 剪贴板中的数据范围超过了选择的范围。 @@ -1207,12 +1750,270 @@ + FileExtensionManager + + + File Extension Manager + 文件扩展名管理器 + + + + &Up + 上(&U) + + + + &Down + 下(&D) + + + + &Add + 添加(&A) + + + + &Remove + 删除(&R) + + + + + Description + 描述 + + + + Extensions + 扩展名 + + + + *.extension + + + + FilterLineEdit - + Filter 过滤 + + + These input fields allow you to perform quick filters in the currently selected table. +By default, the rows containing the input text are filtered out. +The following operators are also supported: +% Wildcard +> Greater than +< Less than +>= Equal to or greater +<= Equal to or less += Equal to: exact match +<> Unequal: exact inverse match +x~y Range: values between x and y + 这些输入框能让你快速在当前所选表中进行过滤。 +默认情况下,包含输入文本的行会被过滤出来。 +以下操作也支持: +% 通配符 +> 大于 +< 小于 +>= 大于等于 +<= 小于等于 += 等于: 精确匹配 +<> 不等于: 精确反向匹配 +x~y 范围: 值在 x 和 y 之间 + + + + Set Filter Expression + 设置过滤表达式 + + + + What's This? + 这是什么? + + + + Is NULL + 为 NULL + + + + Is not NULL + 非 NULL + + + + Is empty + 为空 + + + + Is not empty + 非空 + + + + Equal to... + 等于... + + + + Not equal to... + 不等于... + + + + Greater than... + 大于... + + + + Less than... + 小于... + + + + Greater or equal... + 大于等于... + + + + Less or equal... + 小于等于... + + + + In range... + 在范围内... + + + + FindReplaceDialog + + + Find and Replace + 查找并替换 + + + + Fi&nd text: + 查找文本(&N): + + + + Re&place with: + 替换为(&{): + + + + Match &exact case + 精确匹配(&E) + + + + Match &only whole words + 全词匹配(&O) + + + + When enabled, the search continues from the other end when it reaches one end of the page + 启用时,搜索到页结尾时,搜索会继续从另一边开始。 + + + + &Wrap around + 循环查找(&W) + + + + When set, the search goes backwards from cursor position, otherwise it goes forward + 设置时,搜索从当前位置往回进行。否则向前搜索。 + + + + Search &backwards + 反向查找(&B) + + + + <html><head/><body><p>When checked, the pattern to find is interpreted as a UNIX regular expression. See <a href="https://en.wikibooks.org/wiki/Regular_Expressions">Regular Expression in Wikibooks</a>.</p></body></html> + <html><head/><body><p>选中时,要查找的模式被解释为 UNIX 正则表达式。参阅 <a href="https://en.wikibooks.org/wiki/Regular_Expressions"> Wikibooks 中的正则表达式</a>.</p></body></html> + + + + Use regular e&xpressions + 使用正则表达式(&X) + + + + Find the next occurrence from the cursor position and in the direction set by "Search backwards" + 从当前位置查找下一出现的位置,按 "反向查找" 处所选的方向进行查找。 + + + + &Find Next + 查找下一个(&F) + + + + &Replace + 替换(&R) + + + + Highlight all the occurrences of the text in the page + 高亮本页中所有出现的文本 + + + + F&ind All + 全部高亮(&I) + + + + Replace all the occurrences of the text in the page + 替换本页中所有出现的文本 + + + + Replace &All + 全部替换(&A) + + + + The searched text was not found + 无法找到要搜索的文本 + + + + + The searched text was not found. + 无法找到要搜索的文本。 + + + + The searched text was found one time. + 搜索的文本找到了一次。 + + + + The searched text was found %1 times. + 搜索的文本找到了 %1 次。 + + + + The searched text was replaced one time. + 搜索的文本被替换了一次。 + + + + The searched text was replaced %1 times. + 搜索的文本被替换了 %1 次。 + ForeignKeyEditor @@ -1235,9 +2036,13 @@ 导入 CSV 文件 - &Table name - 表名称(&T) + 表名称(&T) + + + + Table na&me + 表名称(&M) @@ -1261,7 +2066,7 @@ - + Tab Tab @@ -1323,58 +2128,113 @@ 分离表 + + Advanced + 高级 + + + + When importing an empty value from the CSV file into an existing table with a default value for this column, that default value is inserted. Activate this option to insert an empty value instead. + 当从 CSV 文件导入空值到已有表中,并且该列有默认值时,默认值会被插入。选中此项以在这种情况下插入空值。 + + + + Ignore default &values + 忽略默认值(&V) + + - + Activate this option to stop the import when trying to import an empty value into a NOT NULL column without a default value. + 选中此项以在往没有默认值的非 NULL 列导入空值时终止导入。 + + + + Fail on missing values + 缺值时失败 + + + + Disable data type detection + 禁用类型检测 + + + + Disable the automatic data type detection when creating a new table. + 禁止在创建新表时自动检测数据类型。 + + + + Deselect All 全不选 - + Match Similar 匹配相似 - + Select All 全选 - Inserting data... - 正在插入数据... + 正在插入数据... - Cancel - 取消 + 取消 - There is already a table of that name and an import into an existing table is only possible if the number of columns match. - 已有同名的表,并且导入只有在列数匹配的情况下才能导入到一个现有的表。 + 已有同名的表,并且导入只有在列数匹配的情况下才能导入到一个现有的表。 - There is already a table of that name. Do you want to import the data into it? - 已有同名的表。您是否想导入数据到其中? + 已有同名的表。您是否想导入数据到其中? - + + Import completed + 导入完成 + + + + There is already a table named '%1' and an import into an existing table is only possible if the number of columns match. + 已经有一张叫做 '%1' 的表。只有列数匹配时,才能导入到已经存在的表中。 + + + + There is already a table named '%1'. Do you want to import the data into it? + 已经有一张叫做 '%1' 的表。你想把数据导入到此表中吗? + + + Creating restore point failed: %1 创建还原点失败: %1 - + Creating the table failed: %1 创建表失败: %1 - + + importing CSV + 导入 CSV + + + + Importing the file '%1' took %2ms. Of this %3ms were spent in the row function. + 导入文件 '%1' 用时 %2ms. 其中 %3ms 用在行方程上。 + + Missing field for record %1 - 记录 %1 缺字段 + 记录 %1 缺字段 - + Inserting row failed: %1 插入行失败: %1 @@ -1387,8 +2247,7 @@ DB Browser for SQLite - - + toolBar1 @@ -1397,87 +2256,166 @@ 表: - + Select a table to browse data 选择一个表以浏览数据 - + Use this list to select a table to be displayed in the database view 使用这个列表选择一个要显示在数据库视图中的表 - Refresh the data in the selected table. - 刷新选择的表中的数据。 + 刷新选择的表中的数据。 - + This button refreshes the data in the currently selected table. 这个按钮刷新在当前选择的表中的数据。 - + + &Wiki + + + + + Bug &Report... + Bug 上报(&R)... + + + + Feature Re&quest... + 特性请求(&Q)... + + + + Web&site + 网站(&S) + + + + &Donate on Patreon... + 在 Patreon 上捐赠(&D)... + + + + Sa&ve Project... + 保存工程(&V)... + + + + This button lets you save all the settings associated to the open DB to a DB4S project file + 此按钮能保存与打开的数据库有关的所有设置到一个 DB4S 工程文件中 + + + + Open &Project... + 打开工程(&P)... + + + + This button lets you open a DB4S project file + 此按钮能打开 DB4S 工程文件 + + + + &Attach Database... + 附加数据库(&A)... + + + + + Add another database file to the current database connection + 添加另一个数据库到当前的数据库连接中 + + + + This button lets you add another database file to the current database connection + 此按钮能添加另一个数据库到当前的数据库连接中 + + + + &Set Encryption... + 设置加密(&S)... + + + + This button saves the content of the current SQL editor tab to a file + 此按钮把当前 SQL 编辑器页的内容保存到一个文件 + + + + SQLCipher &FAQ + SQLCipher 常见问题(&F)... + + + + Table(&s) to JSON... + 表到 JSON (&S)... + + + Export one or more table(s) to a JSON file 导出一个或多个表到 JSON 文件 - + Refresh 刷新 - + F5 F5 - + Insert a new record in the current table 在当前表中插入一条新记录 - This button creates a new, empty record in the database - 这个按钮在数据库中创建一条新的空白记录 + 这个按钮在数据库中创建一条新的空白记录 - + + New Record 新建记录 - + Delete the current record 删除当前记录 - This button deletes the record currently selected in the database - 这个按钮删除在数据库中当前选择的记录 + 这个按钮删除在数据库中当前选择的记录 - + + Delete Record 删除记录 - This is the database view. You can double-click any record to edit its contents in the cell editor window. - 这是数据库视图。您可以双击任何记录,在单元格编辑器窗口中编辑记录内容。 + 这是数据库视图。您可以双击任何记录,在单元格编辑器窗口中编辑记录内容。 - + < < - + 0 - 0 of 0 0 - 0 / 0 - + > > @@ -1486,27 +2424,27 @@ 上滚 100 条记录 - + &Table: 表(&T): - + Clear all filters 清除所有过滤 - + <html><head/><body><p>Scroll to the beginning</p></body></html> <html><head/><body><p>滚动到开始</p></body></html> - + <html><head/><body><p>Clicking this button navigates to the beginning in the table view above.</p></body></html> <html><head/><body><p>点击这个按钮在上面的表视图中导航到最前。</p></body></html> - + |< |< @@ -1523,216 +2461,182 @@ <html><head/><body><p>点击这个按钮在上面的表视图中向下导航 100 条记录。</p></body></html> - + Scroll to the end 滚动到结束 - + <html><head/><body><p>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Clicking this button navigates up to the end in the table view above.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</p></body></html> <html><head/><body><p>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;点击这个按钮在上面的表视图中导航到最后。&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</p></body></html> - + >| >| - + <html><head/><body><p>Click here to jump to the specified record</p></body></html> <html><head/><body><p>点击这里跳到指定的记录</p></body></html> - + <html><head/><body><p>This button is used to navigate to the record number specified in the Go to area.</p></body></html> <html><head/><body><p>这个按钮用于导航到在“转到”区域中指定的记录号。</p></body></html> - + Go to: 转到: - + Enter record number to browse 输入要浏览的记录号 - + Type a record number in this area and click the Go to: button to display the record in the database view 在这个区域中输入一个记录号,并点击“转到:”按钮以在数据库视图中显示记录 - + 1 1 - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_auto_vacuum"><span style=" text-decoration: underline; color:#0000ff;">Auto Vacuum</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_auto_vacuum"><span style=" text-decoration: underline; color:#0000ff;">自动真空</span></a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_auto_vacuum"><span style=" text-decoration: underline; color:#0000ff;">自动真空</span></a></p></body></html> - None - + - - Full - 完整 + 完整 - Incremental - 增加 + 增加 - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_automatic_index"><span style=" text-decoration: underline; color:#0000ff;">Automatic Index</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_automatic_index"><span style=" text-decoration: underline; color:#0000ff;">自动化索引</span></a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_automatic_index"><span style=" text-decoration: underline; color:#0000ff;">自动化索引</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_checkpoint_fullfsync"><span style=" text-decoration: underline; color:#0000ff;">Checkpoint Full FSYNC</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_checkpoint_fullfsync"><span style=" text-decoration: underline; color:#0000ff;">检查点完全 FSYNC</span></a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_checkpoint_fullfsync"><span style=" text-decoration: underline; color:#0000ff;">检查点完全 FSYNC</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_foreign_keys"><span style=" text-decoration: underline; color:#0000ff;">Foreign Keys</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_foreign_keys"><span style=" text-decoration: underline; color:#0000ff;">外键</span></a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_foreign_keys"><span style=" text-decoration: underline; color:#0000ff;">外键</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_fullfsync"><span style=" text-decoration: underline; color:#0000ff;">Full FSYNC</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_fullfsync"><span style=" text-decoration: underline; color:#0000ff;">完全 FSYNC</span></a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_fullfsync"><span style=" text-decoration: underline; color:#0000ff;">完全 FSYNC</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_ignore_check_constraints"><span style=" text-decoration: underline; color:#0000ff;">Ignore Check Constraints</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_ignore_check_constraints"><span style=" text-decoration: underline; color:#0000ff;">忽略检查约束</span></a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_ignore_check_constraints"><span style=" text-decoration: underline; color:#0000ff;">忽略检查约束</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_journal_mode"><span style=" text-decoration: underline; color:#0000ff;">Journal Mode</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_journal_mode"><span style=" text-decoration: underline; color:#0000ff;">日志模式</span></a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_journal_mode"><span style=" text-decoration: underline; color:#0000ff;">日志模式</span></a></p></body></html> - Delete - 删除 + 删除 - Truncate - 裁截 + 裁截 - Persist - 永久 + 永久 - - Memory - 内存 + 内存 - WAL - WAL + WAL - - Off - + - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_journal_size_limit"><span style=" text-decoration: underline; color:#0000ff;">Journal Size Limit</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_journal_size_limit"><span style=" text-decoration: underline; color:#0000ff;">日志大小限制</span></a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_journal_size_limit"><span style=" text-decoration: underline; color:#0000ff;">日志大小限制</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_locking_mode"><span style=" text-decoration: underline; color:#0000ff;">Locking Mode</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_locking_mode"><span style=" text-decoration: underline; color:#0000ff;">锁定模式</span></a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_locking_mode"><span style=" text-decoration: underline; color:#0000ff;">锁定模式</span></a></p></body></html> - - Normal - 正常 + 正常 - Exclusive - 独占 + 独占 - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_max_page_count"><span style=" text-decoration: underline; color:#0000ff;">Max Page Count</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_max_page_count"><span style=" text-decoration: underline; color:#0000ff;">最大页数</span></a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_max_page_count"><span style=" text-decoration: underline; color:#0000ff;">最大页数</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_page_size"><span style=" text-decoration: underline; color:#0000ff;">Page Size</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_page_size"><span style=" text-decoration: underline; color:#0000ff;">页面大小</span></a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_page_size"><span style=" text-decoration: underline; color:#0000ff;">页面大小</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_recursive_triggers"><span style=" text-decoration: underline; color:#0000ff;">Recursive Triggers</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_recursive_triggers"><span style=" text-decoration: underline; color:#0000ff;">递归触发器</span></a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_recursive_triggers"><span style=" text-decoration: underline; color:#0000ff;">递归触发器</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_secure_delete"><span style=" text-decoration: underline; color:#0000ff;">Secure Delete</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_secure_delete"><span style=" text-decoration: underline; color:#0000ff;">安全删除</span></a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_secure_delete"><span style=" text-decoration: underline; color:#0000ff;">安全删除</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_synchronous"><span style=" text-decoration: underline; color:#0000ff;">Synchronous</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_synchronous"><span style=" text-decoration: underline; color:#0000ff;">同步</span></a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_synchronous"><span style=" text-decoration: underline; color:#0000ff;">同步</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_temp_store"><span style=" text-decoration: underline; color:#0000ff;">Temp Store</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_temp_store"><span style=" text-decoration: underline; color:#0000ff;">临时存储</span></a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_temp_store"><span style=" text-decoration: underline; color:#0000ff;">临时存储</span></a></p></body></html> - Default - 默认 + 默认 - File - 文件 + 文件 - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_user_version"><span style=" text-decoration: underline; color:#0000ff;">User Version</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_user_version"><span style=" text-decoration: underline; color:#0000ff;">用户版本</span></a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_user_version"><span style=" text-decoration: underline; color:#0000ff;">用户版本</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_wal_autocheckpoint"><span style=" text-decoration: underline; color:#0000ff;">WAL Auto Checkpoint</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_wal_autocheckpoint"><span style=" text-decoration: underline; color:#0000ff;">WAL 自动检查点</span></a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_wal_autocheckpoint"><span style=" text-decoration: underline; color:#0000ff;">WAL 自动检查点</span></a></p></body></html> - + &File 文件(&F) - + &Import 导入(&I) - + &Export 导出(&E) @@ -1741,142 +2645,163 @@ 远程 - + &Edit 编辑(&E) - + &View 查看(&V) - + &Help 帮助(&H) - + &Remote 远程(&R) - + + Execute all/selected SQL + 执行所有/选中的 SQL + + + + This button executes the currently selected SQL statements. If no text is selected, all SQL statements are executed. + 此按钮执行当前选中的 SQL 语句。如果没有选中文本,就执行所有的 SQL 语句。 + + + + This button opens a file containing SQL statements and loads it in a new editor tab + 此按钮打开一个包含 SQL 语句的文件,并加载到一个新的编辑器标签中 + + + + &Load Extension... + 加载扩展(&L)... + + + + This button executes the SQL statement present in the current editor line + 此按钮执行编辑器当前行中的 SQL 语句 + + + Shift+F5 Shift+F5 - Sa&ve Project - 保存工程(&V) + 保存工程(&V) - Open &Project - 打开工程(&P) + 打开工程(&P) - &Attach Database - 附加数据库(&A) + 附加数据库(&A) - &Set Encryption - 设置加密(&S) + 设置加密(&S) - - + + Save SQL file as SQL 文件另存为 - + &Browse Table 浏览表 - + Copy Create statement 复制 Create 语句 - + Copy the CREATE statement of the item to the clipboard 复制选中项的 CREATE 语句到剪贴板 - + Edit display format 编辑显示格式 - + Edit the display format of the data in this column 编辑列中数据的显示格式 - + Show rowid column 显示 rowid 列 - + Toggle the visibility of the rowid column 切换 rowid 列的可见性 - - + + Set encoding 设置编码 - + Change the encoding of the text in the table cells 更改表单元格中文本的编码 - + Set encoding for all tables 设置所有表的编码 - + Change the default encoding assumed for all tables in the database 修改数据库中所有表的默认编码 - &Open Database Read Only... - 只读方式打开数据库(&O)... + 只读方式打开数据库(&O)... - + Open an existing database file in read only mode 用只读方式打开一个已有的数据库文件 - + Unlock view editing 解锁视图编辑 - + This unlocks the current view for editing. However, you will need appropriate triggers for editing. 解锁当前视图以编辑。然而,你需要合适的触发器来编辑。 + Duplicate record - 重复的记录 + 重复的记录 SQLCipher FAQ... SQLCipher 常见问题... - + Opens the SQLCipher FAQ in a browser window 用浏览器窗口打开 SQLCipher 常见问题 @@ -1889,17 +2814,17 @@ 保存到远端 - + User 用户 - + Application 应用程序 - + &Clear 清除(&C) @@ -2016,137 +2941,149 @@ 数据库架构 - + DB Sche&ma 数据库架构(&M) - + &New Database... 新建数据库(&N)... - - + + Create a new database file 创建一个新的数据库文件 - + This option is used to create a new database file. 这个选项用于创建一个新的数据库文件。 - + Ctrl+N Ctrl+N - + + &Open Database... 打开数据库(&O)... - - - + + + + + Open an existing database file 打开一个现有的数据库文件 - - + + + This option is used to open an existing database file. 这个选项用于打开一个现有的数据库文件。 - + + Ctrl+O Ctrl+O - + &Close Database 关闭数据库(&C) - + Ctrl+W Ctrl+W - + + Revert database to last saved state 把数据库会退到先前保存的状态 - + This option is used to revert the current database file to its last saved state. All changes made since the last save operation are lost. 这个选项用于倒退当前的数据库文件为它最后的保存状态。从最后保存操作开始做出的所有更改将会丢失。 - + + Write changes to the database file 把更改写入到数据库文件 - + This option is used to save changes to the database file. 这个选项用于保存更改到数据库文件。 - + Ctrl+S Ctrl+S - + + Compact &Database... + 压缩数据库(&D)... + + + Compact the database file, removing space wasted by deleted records 压缩数据库文件,通过删除记录去掉浪费的空间 - - + + Compact the database file, removing space wasted by deleted records. 压缩数据库文件,通过删除记录去掉浪费的空间。 - + E&xit 退出(&X) - + Ctrl+Q Ctrl+Q - + Import data from an .sql dump text file into a new or existing database. 从一个 .sql 转储文本文件中导入数据到一个新的或已有的数据库。 - + This option lets you import data from an .sql dump text file into a new or existing database. SQL dump files can be created on most database engines, including MySQL and PostgreSQL. 这个选项让你从一个 .sql 转储文本文件中导入数据到一个新的或现有的数据库。SQL 转储文件可以在大多数数据库引擎上创建,包括 MySQL 和 PostgreSQL。 - + Open a wizard that lets you import data from a comma separated text file into a database table. 打开一个向导让您从一个逗号间隔的文本文件导入数据到一个数据库表中。 - + Open a wizard that lets you import data from a comma separated text file into a database table. CSV files can be created on most database and spreadsheet applications. 打开一个向导让您从一个逗号间隔的文本文件导入数据到一个数据库表中。CSV 文件可以在大多数数据库和电子表格应用程序上创建。 - + Export a database to a .sql dump text file. 导出一个数据库导一个 .sql 转储文本文件。 - + This option lets you export a database to a .sql dump text file. SQL dump files contain all data necessary to recreate the database on most database engines, including MySQL and PostgreSQL. 这个选项让你导出一个数据库导一个 .sql 转储文本文件。SQL 转储文件包含在大多数数据库引擎上(包括 MySQL 和 PostgreSQL)重新创建数据库所需的所有数据。 @@ -2155,79 +3092,78 @@ 表为 CSV 文件(&T)... - + Export a database table as a comma separated text file. 导出一个数据库表为逗号间隔的文本文件。 - + Export a database table as a comma separated text file, ready to be imported into other database or spreadsheet applications. 导出一个数据库表为逗号间隔的文本文件,准备好被导入到其他数据库或电子表格应用程序。 - + Open the Create Table wizard, where it is possible to define the name and fields for a new table in the database 打开“创建表”向导,在那里可以定义在数据库中的一个新表的名称和字段 - + Open the Delete Table wizard, where you can select a database table to be dropped. 打开“删除表”向导,在那里你可以选择要丢弃的一个数据库表。 - + Open the Modify Table wizard, where it is possible to rename an existing table. It is also possible to add or delete fields form a table, as well as modify field names and types. 打开“修改表”向导,在其中可以重命名一个现有的表。也可以从一个表中添加或删除字段,以及修改字段名称和类型。 - + Open the Create Index wizard, where it is possible to define a new index on an existing database table. 打开“创建索引”向导,在那里可以在一个现有的数据库表上定义一个新索引。 - + &Preferences... 首选项(&P)... - - + + Open the preferences window. 打开首选项窗口。 - + &DB Toolbar 数据库工具栏(&D) - + Shows or hides the Database toolbar. 显示或隐藏数据库工具栏。 - + Shift+F1 Shift+F1 - &About... - 关于(&A)... + 关于(&A)... - + &Recently opened 最近打开(&R) - + Open &tab 打开标签页(&T) - - + + Ctrl+T Ctrl+T @@ -2237,179 +3173,554 @@ 数据库结构 - - Browse Data - 浏览数据 - + + This is the structure of the opened database. +You can drag SQL statements from an object row and drop them into other applications or into another instance of 'DB Browser for SQLite'. + + 这是打开的数据库的结构。 +你可以从一个对象行中拖动 SQL 语句,然后拖到其他应用中,或者拖到其他 'DB Browser for SQLite' 的实例中。 + + + + + Browse Data + 浏览数据 + + + + Refresh the data in the selected table + 刷新选中表中的数据 + + + + This button clears all the filters set in the header input fields for the currently browsed table. + 此按钮将清除当前浏览表的所有在头部输入区的过滤器。 + + + + Save the table as currently displayed + 按当前显示的样子保存表 + + + + <html><head/><body><p>This popup menu provides the following options applying to the currently browsed and filtered table:</p><ul style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;"><li style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Export to CSV: this option exports the data of the browsed table as currently displayed (after filters, display formats and order column) to a CSV file.</li><li style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Save as view: this option saves the current setting of the browsed table (filters, display formats and order column) as an SQL view that you can later browse or use in SQL statements.</li></ul></body></html> + <html><head/><body><p>此菜单提供以下可应用到当前浏览、过滤的表的选项:</p><ul style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;"><li style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">导出到CSV: 导出当前浏览、过滤的表的数据 (过滤后,显示格式和列的顺序) 到一个CSV文件。</li><li style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">保存为视图: 此选项保存当前浏览表格的设置 (过滤,显示格式和列的顺序) 为SQL视图,之后可以再用SQL语句浏览。</li></ul></body></html> + + + + ... + ... + + + + Print currently browsed table data + 打印当前浏览表中的数据 + + + + Print currently browsed table data. Print selection if more than one cell is selected. + 打印当前正在浏览的表中的数据。如果选中了多于一个的单元格,就打印选中区域。 + + + + <html><head/><body><p>This button creates a new record in the database. Hold the mouse button to open a pop-up menu of different options:</p><ul><li><span style=" font-weight:600;">New Record</span>: insert a new record with default values in the database.</li><li><span style=" font-weight:600;">Insert Values...</span>: open a dialog for entering values before they are inserted in the database. This allows to enter values acomplishing the different constraints. This dialog is also open if the <span style=" font-weight:600;">New Record</span> option fails due to these constraints.</li></ul></body></html> + <html><head/><body><p>此按钮在数据库中创建新记录。按住鼠标按钮以打开菜单选择不同选项:</p><ul><li><span style=" font-weight:600;">新记录</span>: 用默认值插入一条新记录到数据库中。</li><li><span style=" font-weight:600;">插入值...</span>: 打开对话框编辑要插入的值。可以输入满足约束的值。如果 <span style=" font-weight:600;">新记录</span> 选项失败,对话框也会打开。</li></ul></body></html> + + + + This button deletes the record or records currently selected in the table + 此按钮删除表里当前选中的记录 + + This is the database table view. You can do the following actions: + - Start writing for editing inline the value. + - Double-click any record to edit its contents in the cell editor window. + - Alt+Del for deleting the cell content to NULL. + - Ctrl+" for duplicating the current record. + - Ctrl+' for copying the value from the cell above. + - Standard selection and copy/paste operations. + 这是数据库表视图。你可以进行以下操作: + - 直接打字以在这里直接编辑。 + - 双击记录以打开单元格编辑窗口。 + - Alt+Del 删除单元格内容,变成NULL。 + - Ctrl+" 重复一份当前记录。 + - Ctrl+' 从上面的单元格拷贝。 + - 标准的复制/粘贴操作。 + + + Scroll one page upwards 上翻一页 - + <html><head/><body><p>Clicking this button navigates one page of records upwards in the table view above.</p></body></html> <html><head/><body><p>点击按钮将表中显示的记录向上翻一页。</p></body></html> - + Scroll one page downwards 下翻一页 - + <html><head/><body><p>Clicking this button navigates one page of records downwards in the table view above.</p></body></html> <html><head/><body><p>点击按钮将表中显示的记录向下翻一页。</p></body></html> - + Edit Pragmas 编辑杂注 - + + <html><head/><body><p><a href="https://www.sqlite.org/pragma.html#pragma_case_sensitive_like">Case Sensitive Like</a></p></body></html> + <html><head/><body><p><a href="https://www.sqlite.org/pragma.html#pragma_case_sensitive_like">LIKE表达式的大小写敏感</a></p></body></html> + + + + Warning: this pragma is not readable and this value has been inferred. Writing the pragma might overwrite a redefined LIKE provided by an SQLite extension. + 警告: 此杂注无法读取,此值为推断得到。编辑杂注可能会覆盖由 SQLite 扩展重定义的 LIKE。 + + + Execute SQL 执行 SQL - + + &Tools + 工具(&T) + + + DB Toolbar 数据库工具栏 - + Edit Database &Cell 编辑数据库单元格(&C) - + SQL &Log SQL 日志(&L) - + Show S&QL submitted by 显示 SQL 提交自(&Q) - + + This button clears the contents of the SQL logs + 此按钮清除 SQL 日志的内容 + + + + This panel lets you examine a log of all SQL commands issued by the application or by yourself + 此面板可以让你自行检查本应用程序执行的所有 SQL 命令的日志。 + + + &Plot 图表(&P) - + + This is the structure of the opened database. +You can drag multiple object names from the Name column and drop them into the SQL editor and you can adjust the properties of the dropped names using the context menu. This would help you in composing SQL statements. +You can drag SQL statements from the Schema column and drop them into the SQL editor or into other applications. + + 这是当前打开的数据库的结构。 +你可以从名字列拖拽多个对象名字到 SQL 编辑器中,可以用菜单调节拖拽名字的属性。这可以帮助你构建 SQL 语句。 +你可以从架构列拖拽 SQL 语句到 SQL 编辑器或其他应用中。 + + + + + Project Toolbar + 工程工具栏 + + + + Extra DB toolbar + 其他数据库工具栏 + + + + + + Close the current database file + 关闭当前数据库文件 + + + + This button closes the connection to the currently open database file + 此按钮关闭到当前打开的数据库文件的连接 + + + &Revert Changes 倒退更改(&R) - + &Write Changes 写入更改(&W) - + + Open Data&base Read Only... + 只读打开数据库(&B)... + + + + Save results + 保存结果 + + + + Save the results view + 保存结果视图 + + + + This button lets you save the results of the last executed query + 此按钮让你保存上次执行的查询的结果 + + + + Find text in SQL editor + 在 SQL 编辑器中查找文本 + + + + Find text in SQL editor + 在 SQL 编辑器中查找文本 + + + + This button opens the search bar of the editor + 此按钮打开编辑器的搜索栏 + + + + Ctrl+F + + + + + Find or replace text in SQL editor + 在 SQL 编辑器中查找或替换文本 + + + + Find or replace text in SQL editor + 在 SQL 编辑器中查找或替换文本 + + + + This button opens the find/replace dialog for the current editor tab + 此按钮为当前的编辑器标签页打开查找/替换对话框 + + + + + Export to &CSV + 导出到 &CSV + + + + + Save as &view + 保存为视图(&V) + + + + Save as view + 保存为视图 + + + + Hide column(s) + 隐藏列 + + + + Hide selected column(s) + 隐藏选中的列 + + + + Show all columns + 显示所有列 + + + + Show all columns that were hidden + 显示所有被隐藏的列 + + + + Shows or hides the Project toolbar. + 显示或隐藏工程工具栏 + + + + Extra DB Toolbar + 其他数据库工具栏 + + + + + Export the filtered data to CSV + 导出过滤的数据到 CSV + + + + This button exports the data of the browsed table as currently displayed (after filters, display formats and order column) as a CSV file. + 此按钮导出当前浏览、过滤的表的数据 (过滤后,显示格式和列的顺序) 到一个CSV文件。 + + + + + Save the current filter, sort column and display formats as a view + 保存当前过滤,列排序和显示格式为视图 + + + + This button saves the current setting of the browsed table (filters, display formats and order column) as an SQL view that you can later browse or use in SQL statements. + 此按钮保存当前浏览表格的设置 (过滤,显示格式和列的顺序) 为SQL视图,之后可以再用SQL语句浏览。 + + + + Insert Values... + 插入值... + + + + + Open a dialog for inserting values in a new record + 打开对话框以插入值到新记录中 + + + + + Insert new record using default values in browsed table + 用默认值插入一条新记录到当前浏览的表中 + + + + New In-&Memory Database + 新建内存数据库(&M) + + + + Drag && Drop Qualified Names + 拖拽限定名称 + + + + + Use qualified names (e.g. "Table"."Field") when dragging the objects and dropping them into the editor + 当拖拽对象到编辑器中时,使用限定名称 (例如 "Table"."Field") + + + + Drag && Drop Enquoted Names + 拖拽引用名字 + + + + + Use escaped identifiers (e.g. "Table1") when dragging the objects and dropping them into the editor + 当拖拽对象到编辑器中时,使用转移标识符 (例如 "Table1") + + + + &Integrity Check + 完全性检查(&I) + + + + Runs the integrity_check pragma over the opened database and returns the results in the Execute SQL tab. This pragma does an integrity check of the entire database. + 对打开的数据库运行 integrity_check 杂注并在执行 SQL 标签页返回结果。此杂注对整个数据库进行完全性检查。 + + + + &Foreign-Key Check + 外键检查(&F) + + + + Runs the foreign_key_check pragma over the opened database and returns the results in the Execute SQL tab + 对打开的数据库运行 foreign_key_check 杂注并在执行 SQL 标签页返回结果。 + + + + &Quick Integrity Check + 快速完全性检查(&Q) + + + + Run a quick integrity check over the open DB + 对打开的数据库执行快速完全性检查 + + + + Runs the quick_check pragma over the opened database and returns the results in the Execute SQL tab. This command does most of the checking of PRAGMA integrity_check but runs much faster. + 对打开的数据库运行 quick_check 杂注并在执行 SQL 标签页返回结果。此命令会执行 integrity_check 的多数检查,但是要快得多。 + + + + &Optimize + 优化(&O) + + + + Attempt to optimize the database + 尝试优化数据库 + + + + Runs the optimize pragma over the opened database. This pragma might perform optimizations that will improve the performance of future queries. + 对打开的数据库运行 optimize 杂注。可能会执行对未来查询性能有帮助的优化。 + + + + + Print + 打印 + + + + Print text from current SQL editor tab + 从当前的 SQL 编辑器标签页打印文本 + + + + Open a dialog for printing the text in the current SQL editor tab + 打开对话框以从当前的 SQL 编辑器标签页打印文 + + + + Print the structure of the opened database + 打印当前打开的数据库的结构 + + + + Open a dialog for printing the structure of the opened database + 打开对话框以打印当前打开的数据库的结构 + + Compact &Database - 压缩数据库(&D) + 压缩数据库(&D) - + &Database from SQL file... 从 SQL 文件导入数据库(&D)... - + &Table from CSV file... 从 CSV 文件导入表(&T)... - + &Database to SQL file... 导出数据库到 SQL 文件(&D)... - + &Table(s) as CSV file... 导出表到 CSV 文件(&T)... - SQLCipher &FAQ... - SQLCipher &FAQ... + SQLCipher &FAQ... - Table(s) to JSON... - 导出表到 JSON 文件(&T)... + 导出表到 JSON 文件(&T)... - + &Create Table... 创建表(&C)... - + &Delete Table... 删除表(&D)... - + &Modify Table... 修改表(&M)... - + Create &Index... 创建索引(&I)... - + W&hat's This? 这是什么(&W)? - + + &About + 关于(&A) + + + + This button opens a new tab for the SQL editor + 此按钮打开一个 SQL 编辑器的新标签页 + + + &Execute SQL 执行 SQL(&E) - - Execute SQL [F5, Ctrl+Return, Ctrl+R] - 执行 SQL [F5, Ctrl+回车, Ctrl+R] + Execute SQL + 执行 SQL - &Load extension - 加载扩展(&L) + 加载扩展(&L) - &Wiki... - 维基(&W)... + 维基(&W)... - Bug &report... - 错误报告(&R)... + 错误报告(&R)... - Web&site... - 网站(&S)... + 网站(&S)... - - + + Save the current session to a file 保存当前会话到一个文件 - - + + Load a working session from a file 从一个文件加载工作会话 - + Open SQL file 打开 SQL 文件 @@ -2418,159 +3729,157 @@ <html><head/><body><p>保存当前图表...</p><p>文件格式按扩展名选择(png, jpg, pdf, bmp)</p></body></html> - - - + + + Save SQL file 保存 SQL 文件 - + Execute current line 执行当前行 - - Execute current line [Shift+F5] - 执行当前行 [Shift+F5] + + Execute current line + 执行当前行 - + Ctrl+E Ctrl+E - + Export as CSV file 导出为 CSV 文件 - + Export table as comma separated values file 导出表为逗号间隔值文件 - + Ctrl+L Ctrl+L - + Ctrl+P Ctrl+P - + Database encoding 数据库编码 - - + + Choose a database file 选择一个数据库文件 - + Ctrl+Return Ctrl+回车 - + Ctrl+D Ctrl+D - + Ctrl+I Ctrl+I - + Encrypted 加密的 - + Database is encrypted using SQLCipher 数据库使用 SQLCipher 进行了加密 - + Read only 只读 - + Database file is read only. Editing the database is disabled. 数据库是只读的。编辑被禁止。 - + Could not open database file. Reason: %1 无法打开数据库文件。 原因: %1 - - - + + + Choose a filename to save under 选择一个文件名保存 - Error adding record: - 添加记录时出错: + 添加记录时出错: - + Error deleting record: %1 删除记录时出错: %1 - + Please select a record first 请首先选择一条记录 - + %1 - %2 of %3 %1 - %2 / %3 - - + + There is no database opened. Please open or create a new database file. 没有打开数据库。请打开或创建一个新的数据库文件。 - Are you sure you want to delete the %1 '%2'? All data associated with the %1 will be lost. - 您是否确认您想删除 %1 '%2'? + 您是否确认您想删除 %1 '%2'? 所有和 %1 关联的数据将会丢失。 - Error: could not delete the %1. Message from database engine: %2 - 错误: 不能删除 %1。消息来自数据库引擎: + 错误: 不能删除 %1。消息来自数据库引擎: %2 - + Setting PRAGMA values or vacuuming will commit your current transaction. Are you sure? - + 设置或清除杂注值会提交你的当前事务。 +你确定吗? - + Please enter a pseudo-primary key in order to enable editing on this view. This should be the name of a unique column in the view. 请输入一个伪主键以在当前视图启用编辑。这需要是视图中的一个满足唯一性的列的名字。 @@ -2579,22 +3888,20 @@ 没有数据库打开。 - %1 rows returned in %2ms from: %3 - %1 行数据在 %2ms 内返回自: %3 + %1 行数据在 %2ms 内返回自: %3 - + , %1 rows affected %1 行数据受影响 - Query executed successfully: %1 (took %2ms%3) - 查询执行成功: %1 (耗时 %2ms%3) + 查询执行成功: %1 (耗时 %2ms%3) - + Error while saving the database file. This means that not all changes to the database were saved. You need to resolve the following error first. %1 @@ -2603,7 +3910,7 @@ %1 - + A new DB Browser for SQLite version is available (%1.%2.%3).<br/><br/>Please download at <a href='%4'>%4</a>. 有新版本的 DB Browser for SQLite (%1.%2.%3)可用。<br/><br/>请从 <a href='%4'>%4</a> 下载。 @@ -2612,30 +3919,60 @@ 请输入要保存的数据库文件的 URL. - - + + DB Browser for SQLite project file (*.sqbpro) DB Browser for SQLite 工程文件 (*.sqbpro) - + Please choose a new encoding for this table. 请为此表选择新的编码 - + Please choose a new encoding for all tables. 请为所有表选择新的编码 - + + Error checking foreign keys after table modification. The changes will be reverted. + 修改表格后的外键检查错误。修改会被回退。 + + + + This table did not pass a foreign-key check.<br/>You should run 'Tools | Foreign-Key Check' and fix the reported issues. + 此表格没有通过外键检查。<br/>你需要执行 '工具 | 外键检查' 并修复发现的问题。 + + + + Choose a project file to open + 选择一个要打开的工程文件 + + + + This project file is using an old file format because it was created using DB Browser for SQLite version 3.10 or lower. Loading this file format is still fully supported but we advice you to convert all your project files to the new file format because support for older formats might be dropped at some point in the future. You can convert your files by simply opening and re-saving them. + 此工程文件使用了旧的文件格式,因为它是由 DB Browser for SQLite version 3.10 或更低版本创建的。加载此文件格式依然完全支持,但我们建议你把工程转换到新的格式,因为旧格式支持将来可能会失效。你可以通过打开并重新保存的方式来转换。 + + + + Duplicate records + 重复记录 + + + + Ctrl+" + + + + %1 Leave the field empty for using the database encoding. %1 留空此字段以使用数据库默认编码。 - + This encoding is either not valid or not supported. 这种编码非法或者不支持。 @@ -2644,186 +3981,361 @@ 取消 - Error executing query: %1 - 执行查询时出错: %1 + 执行查询时出错: %1 Choose a text file 选择一个文本文件 - + Text files(*.csv *.txt);;All files(*) 文本文件(*.csv *.txt);;所有文件(*) - Import completed - 导入完成 + 导入完成 - + Are you sure you want to undo all changes made to the database file '%1' since the last save? 您是否确认您想撤销从上次保存以来对数据库文件‘%1’做出的所有更改。? - + Choose a file to import 选择要导入的一个文件 - - - + + + Text files(*.sql *.txt);;All files(*) 文本文件(*.sql *.txt);;所有文件(*) - + Do you want to create a new database file to hold the imported data? If you answer no we will attempt to import the data in the SQL file to the current database. 您是否确认您想创建一个新的数据库文件用来存放导入的数据? 如果您会到“否”的话,我们将尝试导入 SQL 文件中的数据到当前数据库。 - + File %1 already exists. Please choose a different name. 文件 %1 已存在。请选择一个不同的名称。 - + Error importing data: %1 导入数据时出错: %1 - + Import completed. 导入完成。 - - + Delete View 删除视图 - - + Modify View 修改视图 - - + Delete Trigger 删除触发器 - - + Modify Trigger 修改触发器 - - + Delete Index 删除索引 - - - + + Delete Table 删除表 - + &%1 %2 &%1 %2 - + Setting PRAGMA values will commit your current transaction. Are you sure? 设置 PRAGMA 值将会提交您的当前事务。. 您确认吗? - + Execution aborted by user 操作被用户终止 - + + In-Memory database + 内存数据库 + + + + determining row count... + 正在决定行数... + + + + %1 - %2 of >= %3 + + + + + Are you sure you want to delete the table '%1'? +All data associated with the table will be lost. + 你确定要删除表 '%1' 吗? +所有关联的数据都会丢失。 + + + + Are you sure you want to delete the view '%1'? + 你确定要删除视图 '%1' 吗? + + + + Are you sure you want to delete the trigger '%1'? + 你确定要删除触发器 '%1' 吗? + + + + Are you sure you want to delete the index '%1'? + 你确定要删除索引 '%1' 吗? + + + + Error: could not delete the table. + 错误: 无法删除表。 + + + + Error: could not delete the view. + 错误: 无法删除视图。 + + + + Error: could not delete the trigger. + 错误: 无法删除触发器。 + + + + Error: could not delete the index. + 错误: 无法删除索引。 + + + + Message from database engine: +%1 + 来自数据库引擎的消息: +%1 + + + + Editing the table requires to save all pending changes now. +Are you sure you want to save the database? + 编辑表格之前需要立刻保存所有修改。 +你确定要保存数据库吗? + + + + -- EXECUTING SELECTION IN '%1' +-- + -- 执行 '%1' 中所选 +-- + + + + -- EXECUTING LINE IN '%1' +-- + -- 执行 '%1' 中的行 +-- + + + + -- EXECUTING ALL IN '%1' +-- + -- 执行 '%1' 中所有 +-- + + + + executing query + 执行查询 + + + + %1 rows returned in %2ms + %1 行返回,耗时 %2ms + + + + query executed successfully. Took %1ms%2 + 查询执行成功。耗时 %1ms%2 + + + + -- At line %1: +%4 +-- Result: %3 + -- 在行号 %1: +%4 +-- 结果: %3 + + + Choose text files 选择文本文件 - - + + Import completed. Some foreign key constraints are violated. Please fix them before saving. + 导入完成。一些外键约束被违反了。请在保存之前修复。 + + + Modify Index 修改索引 - - + Modify Table 修改表 - + Select SQL file to open 选择要打开的 SQL 文件 - + Couldn't read file: %1. 无法读取文件: %1 - + Couldn't save file: %1. 无法保存文件: %1 - + Select file name 选择文件名 - + Select extension file 选择扩展文件 - + Extensions(*.so *.dll);;All files(*) 扩展(*.so *.dll);;所有文件(*) - + Extension successfully loaded. 扩展成功加载。 - - + Error loading extension: %1 加载扩展时出错: %1 - + + Don't show again 不再显示 - + New version available. 新版本可用。 + + Collation needed! Proceed? + 需要整理! 继续? + + + + A table in this database requires a special collation function '%1' that this application can't provide without further knowledge. +If you choose to proceed, be aware bad things can happen to your database. +Create a backup! + 数据库中的一个表需要特定的整理方法 '%1' 但本应用程序不了解故无法提供。 +如果您选择继续,小心可能会有不好的事情发生。 +记得备份! + + + + creating collation + 创建整理 + + + + Set a new name for the SQL tab. Use the '&&' character to allow using the following character as a keyboard shortcut. + 为 SQL 标签页设置新名称。使用 '&&' 字符来允许它作为键盘快捷键。 + + + + Please specify the view name + 请指定视图名称 + + + + There is already an object with that name. Please choose a different name. + 已有同名的对象。请选择一个不同的名称。 + + + + View successfully created. + 视图成功创建。 + + + + Error creating view: %1 + 创建视图时出错: %1 + + + + There is no filter set for this table. View will not be created. + 此表没有过滤。视图不会被创建。 + + + + Delete Records + 删除记录 + + + + This action will open a new SQL tab for running: + 此动作会打开新的 SQL 标签页以运行: + + + + Press Help for opening the corresponding SQLite reference page. + 按下帮助以打开对应的 SQLite 参考页。 + + Choose a axis color 选择一个轴的颜色 @@ -2832,9 +4344,8 @@ PNG(*.png);;JPG(*.jpg);;PDF(*.pdf);;BMP(*.bmp);;所有文件(*) - Choose a file to open - 选择要打开的一个文件 + 选择要打开的一个文件 Invalid file format. @@ -2842,6 +4353,19 @@ + NullLineEdit + + + Set to NULL + 设置为 NULL + + + + Alt+Del + + + + PlotDock @@ -2849,182 +4373,278 @@ 绘图 - + + <html><head/><body><p>This pane shows the list of columns of the currently browsed table or the just executed query. You can select the columns that you want to be used as X or Y axis for the plot pane below. The table shows detected axis type that will affect the resulting plot. For the Y axis you can only select numeric columns, but for the X axis you will be able to select:</p><ul style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;"><li style=" margin-top:12px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Date/Time</span>: strings with format &quot;yyyy-MM-dd hh:mm:ss&quot; or &quot;yyyy-MM-ddThh:mm:ss&quot;</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Date</span>: strings with format &quot;yyyy-MM-dd&quot;</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Time</span>: strings with format &quot;hh:mm:ss&quot;</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Label</span>: other string formats. Selecting this column as X axis will produce a Bars plot with the column values as labels for the bars</li><li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Numeric</span>: integer or real values</li></ul><p>Double-clicking the Y cells you can change the used color for that graph.</p></body></html> + <html><head/><body><p>此面板显示当前表或者刚刚执行的查询的列。你可以选择列用做在下面画图时的 X 轴和 Y 轴。表中显示检测到的会影响绘图结果的轴类型。Y 轴只允许选择数值类型,但 X 轴可以选择:</p><ul style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;"><li style=" margin-top:12px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">日期/时间</span>: 格式化的字符串 &quot;yyyy-MM-dd hh:mm:ss&quot; 或 &quot;yyyy-MM-ddThh:mm:ss&quot;</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">日期</span>: 格式化的字符串 &quot;yyyy-MM-dd&quot;</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">时间</span>: 格式化的字符串 &quot;hh:mm:ss&quot;</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">标签</span>: 其他格式的字符串。选这项作为x轴,会绘制条形图,并用值作为条形的标签</li><li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">数值</span>: 整数或实数值</li></ul><p>双击 Y 单元格可以改变图中所用的颜色。</p></body></html> + + + Columns - + X X - + Y Y - _ - _ + _ + + + + Axis Type + 轴类型 - + + Here is a plot drawn when you select the x and y values above. + +Click on points to select them in the plot and in the table. Ctrl+Click for selecting a range of points. + +Use mouse-wheel for zooming and mouse drag for changing the axis range. + +Select the axes or axes labels to drag and zoom only in that orientation. + 这是在你在上面选择 x 和 y 值后绘制出的图。 + +点击点可以在图和表格中选中它们。Ctrl+点击以选中一批点。 + +使用鼠标滚轮可以缩放,鼠标拖拽可以改变坐标轴的范围。 + +选择轴或者轴上的标签并拖拽可以缩放此方向。 + + + Line type: 线形: - - + + None - + Line 折线 - + StepLeft 左阶梯 - + StepRight 右阶梯 - + StepCenter 中阶梯 - + Impulse 脉冲 - + Point shape: 点形: - + Cross - + Plus - + Circle - + Disc 实心点 - + Square 方形 - + Diamond 菱形 - + Star - + Triangle 三角 - + TriangleInverted 倒三角 - + CrossSquare 叉与方形 - + PlusSquare 加与方形 - + CrossCircle 叉与圈 - + PlusCircle 加与圈 - + Peace 和平符号 - + <html><head/><body><p>Save current plot...</p><p>File format chosen by extension (png, jpg, pdf, bmp)</p></body></html> <html><head/><body><p>保存当前图表...</p><p>文件格式按扩展名选择(png, jpg, pdf, bmp)</p></body></html> - + Save current plot... 保存当前图表... - + + + Load all data and redraw plot + 载入所有数据并重新绘图 + + Load all data. This has only an effect if not all data has been fetched from the table yet due to the partial fetch mechanism. - 载入所有数据。仅在不是所有数据都已经从表中取出时有效果。 + 载入所有数据。仅在不是所有数据都已经从表中取出时有效果。 - - - + + + Row # 行 # - Choose a axis color - 选择一个轴的颜色 + 选择一个轴的颜色 + + + + Copy + 复制 + + + + Print... + 打印... + + + + Show legend + 显示图例 + + + + Stacked bars + 堆叠的条形 + + + + Date/Time + 日期/时间 + + + + Date + 日期 + + + + Time + 时间 + + + + + Numeric + 数值 + + + + Label + 标签 + + + + Invalid + 无效的 + + + + Load all data and redraw plot. +Warning: not all data has been fetched from the table yet due to the partial fetch mechanism. + 载入所有数据并重新绘图。 +警告:由于部分加载机制,现在并没有加载所有的数据。 - + + Choose an axis color + 选一个坐标轴颜色 + + + Choose a filename to save under 选择一个文件名保存 - + PNG(*.png);;JPG(*.jpg);;PDF(*.pdf);;BMP(*.bmp);;All Files(*) PNG(*.png);;JPG(*.jpg);;PDF(*.pdf);;BMP(*.bmp);;所有文件(*) - + + There are curves in this plot and the selected line style can only be applied to graphs sorted by X. Either sort the table or query by X to remove curves or select one of the styles supported by curves: None or Line. + 图中有曲线,选择的线形只能用到按 X 排列的图中。要么对表排序或者用 X 查询,要么选一种曲线支持的线形:无或者折线。 + + Fetching all data... - 读取所有数据... + 读取所有数据... - Cancel - 取消 + 取消 @@ -3060,37 +4680,39 @@ 语言(&G) - + Automatic &updates 自动更新(&A) - + &Database 数据库(&D) - + Database &encoding 数据库编码(&E) - + Open databases with foreign keys enabled. 打开启用了外键的数据库。 - + &Foreign keys 外键(&F) - - - - - - + + + + + + + + enabled 启用 @@ -3101,18 +4723,18 @@ - - + + ... ... - + Remove line breaks in schema &view 删除架构视图中的换行(&V) - + Show remote options 显示远程选项 @@ -3121,12 +4743,12 @@ 远程服务器 - + Prefetch block si&ze 预取块尺寸(&Z) - + Advanced 高级 @@ -3135,489 +4757,688 @@ 打开数据库后执行的 SQL - + SQ&L to execute after opening database 打开数据库后执行的 SQL(&L) - + Default field type 默认字段类型 - + Data &Browser 数据浏览器(&B) - + Font 字体 - + &Font 字体(&F) - Font si&ze: - 字号(&Z) + 字号(&Z) - + Content 内容 - + Symbol limit in cell 单元格符号数限制 - NULL fields - 空字段 + 空字段 - &Text - 文本(&T) + 文本(&T) - Field colors - 字段颜色 + 字段颜色 - + NULL - + Regular 常规 - Text - 文本 + 文本 - + Binary 二进制 - + Background 背景 - + Filters 过滤 - + Escape character 转义字符 - + Delay time (&ms) 延时 (&ms) - + Set the waiting time before a new filter value is applied. Can be set to 0 for disabling waiting. 设置应用新过滤值前的等待时间。设为0以禁用等待。 - + &SQL &SQL - + Settings name 设置名称 - + Context 上下文 - + Colour 颜色 - + Bold 粗体 - + Italic 斜体 - + Underline 下划线 - + Keyword 关键字 - function - 函数 + 函数 - + Function 函数 - + Table - + Comment 注释 - + Identifier 识别符 - - String - 字符串 + + String + 字符串 + + + currentline + 当前行 + + + + Current line + 当前行 + + + + SQL &editor font size + SQL 编辑器字体大小(&E) + + + SQL &log font size + SQL 日志字体大小(&L) + + + + Tab size + Tab 长度 + + + + SQL editor &font + SQL 编辑器字体(&F) + + + + Error indicators + 错误指示器 + + + Enabling error indicators highlights the SQL code lines that caused errors during the last execution + 启用错误指示器将高亮 SQL 代码中导致最近一次执行出错的行 + + + + Hori&zontal tiling + 水平平铺(&Z) + + + + If enabled the SQL code editor and the result table view are shown side by side instead of one over the other. + 如果启用,SQL 编辑器和结果表视图将并排显示,而不是上下显示。 + + + + Code co&mpletion + 代码完成(&M) + + + + Toolbar style + 工具栏风格 + + + + Only display the icon + 仅显示图标 + + + + Only display the text + 仅显示文本 + + + + The text appears beside the icon + 文本在图标旁 + + + + The text appears under the icon + 文本在图标下 + + + + Follow the style + 遵循风格 + + + + DB file extensions + 数据库文件扩展 + + + + Manage + 管理 + + + + When enabled, the line breaks in the Schema column of the DB Structure tab, dock and printed output are removed. + 当启用时,数据库结构标签页中的架构列里的换行,显示、打印时被移除。 + + + + Font si&ze + 字体大小(amp;Z) + + + + + This is the maximum number of rows in a table for enabling the value completion based on current values in the column. +Can be set to 0 for disabling completion. + 这是表启用根据当前值的自动补完的最大的列数量。 +设置成0以禁用补完。 + + + + Row count threshold for completion + 自动补完的列数阈值 + + + + Field display + 字段显示 + + + + Displayed &text + 显示的文本(&T) + + + + Text color + 文本颜色 + + + + Background color + 背景颜色 + + + + Preview only (N/A) + 仅预览 (N/A) + + + + Foreground + 前景 + + + + SQL &results font size + SQL 结果的字体大小(&R) + + + + &Wrap lines + 换行(&W) + + + + Never + 永不 - - currentline - 当前行 + + At word boundaries + 按照词边界 - - Current line - 当前行 + + At character boundaries + 按照字母边界 - - SQL &editor font size - SQL 编辑器字体大小(&E) + + At whitespace boundaries + 按照空白字符边界 - - SQL &log font size - SQL 日志字体大小(&L) + + &Quotes for identifiers + 标识转义(&Q) - - Tab size - Tab 长度 + + Choose the quoting mechanism used by the application for identifiers in SQL code. + 选择 SQL 代码中标识的转义方式。 - - SQL editor &font - SQL 编辑器字体(&F) + + "Double quotes" - Standard SQL (recommended) + "双引号" - 标准 SQL (推荐) - - Error indicators - 错误指示器 + + `Grave accents` - Traditional MySQL quotes + `重音符` - 经典的 MySQL 转义 - - Enabling error indicators highlights the SQL code lines that caused errors during the last execution - 启用错误指示器将高亮 SQL 代码中导致最近一次执行出错的行 + + [Square brackets] - Traditional MS SQL Server quotes + [方括号] - 经典的 MS SQL Server 转义 - - Hori&zontal tiling - 水平平铺(&Z) + + Keywords in &UPPER CASE + 关键字大写(&U) - - If enabled the SQL code editor and the result table view are shown side by side instead of one over the other. - 如果启用,SQL 编辑器和结果表视图将并排显示,而不是上下显示。 + + When set, the SQL keywords are completed in UPPER CASE letters. + 设置时,SQL 关键字被自动补全为大写字母。 - - Code co&mpletion - 代码完成(&M) + + When set, the SQL code lines that caused errors during the last execution are highlighted and the results frame indicates the error in the background + 设置时,导致上次执行出错的 SQL 代码行会被高亮。 - + &Extensions 扩展(&E) - + Select extensions to load for every database: 选择每个数据库要加载的扩展: - + Add extension 添加扩展 - + Remove extension 删除扩展 - + <html><head/><body><p>While supporting the REGEXP operator SQLite doesn't implement any regular expression<br/>algorithm but calls back the running application. DB Browser for SQLite implements this<br/>algorithm for you to let you use REGEXP out of the box. However, as there are multiple possible<br/>implementations of this and you might want to use another one, you're free to disable the<br/>application's implementation and load your own by using an extension. Requires restart of the application.</p></body></html> <html><head/><body><p>虽然支持 REGEXP 运算符,但是 SQLite 并没有实现任何正则表达式算法,<br/>而是回调应用程序。DB Browser for SQLite 为您实现了算法,以便您可以<br/>打破常规使用 REGEXP。由于算法有多种可能的实现,您可能想用其他的,<br/>所以您可以禁用算法实现并通过扩展加载您的实现。需要重启应用程序。</p></body></html> - + Disable Regular Expression extension 禁用正则表达式扩展 - + + <html><head/><body><p>SQLite provides an SQL function for loading extensions from a shared library file. Activate this if you want to use the <span style=" font-style:italic;">load_extension()</span> function from SQL code.</p><p>For security reasons, extension loading is turned off by default and must be enabled through this setting. You can always load extensions through the GUI, even though this option is disabled.</p></body></html> + + + + + Allow loading extensions from SQL code + + + + Remote 远程 - + CA certificates CA 证书 - - + + Subject CN 主题 CN (Subject CN) - + Common Name 公用名称 (Common Name) - + Subject O 主题 O (Subject O) - + Organization 组织 (Organization) - - + + Valid from 有效期从 - - + + Valid to 有效期到 - - + + Serial number 序列号 - + Your certificates 您的证书 - + File 文件 - + Subject Common Name 主题公用名称 (Subject Common Name) - + Issuer CN 签发人 CN (Issuer CN) - + Issuer Common Name 签发人公用名称 (Issuer Common Name) - + Clone databases into 克隆数据库信息 - - + + Choose a directory 选择一个目录 - + The language will change after you restart the application. 语言将在重启应用程序后改变。 - + Select extension file 选择扩展文件 - + Extensions(*.so *.dll);;All files(*) 扩展(*.so *.dll);;所有文件(*) - + Import certificate file 导入证书文件 - + No certificates found in this file. 在文件中找不到证书。 - + Are you sure you want do remove this certificate? All certificate data will be deleted from the application settings! 您确定要删除此证书吗?所有的证书数据都会被从应用设置中删除! + + + Are you sure you want to clear all the saved settings? +All your preferences will be lost and default values will be used. + 你确定要清除所有保存的设置吗? +所有你做的设置都会丢失,并使用默认值。 + QObject - + Error importing data 导入数据时出错 - + from record number %1 自记录编号 %1 - + . %1 - + + Importing CSV file... + 导入CSV文件... + + + Cancel 取消 - Decoding CSV file... - 正在解码 CSV 文件... + 正在解码 CSV 文件... - Collation needed! Proceed? - 需要整理! 继续? + 需要整理! 继续? - A table in this database requires a special collation function '%1' that this application can't provide without further knowledge. If you choose to proceed, be aware bad things can happen to your database. Create a backup! - 数据库中的一个表需要特定的整理方法 '%1' 但本应用程序不了解故无法提供。 + 数据库中的一个表需要特定的整理方法 '%1' 但本应用程序不了解故无法提供。 如果您选择继续,小心可能会有不好的事情发生。 记得备份! - SQLite database files (*.db *.sqlite *.sqlite3 *.db3);;All files (*) - SQLite 数据库文件 (*.db *.sqlite *.sqlite3 *.db3);;所有文件 (*) + SQLite 数据库文件 (*.db *.sqlite *.sqlite3 *.db3);;所有文件 (*) + + + + All files (*) + 所有文件 (*) + + + + SQLite database files (*.db *.sqlite *.sqlite3 *.db3) + SQLite 数据库文件 (*.db *.sqlite *.sqlite3 *.db3) RemoteDatabase - + Error when connecting to %1. %2 连接到 %1 时出错. %2 - + Error opening remote file at %1. %2 在 %1 打开远程文件时出错. %2 - + Error: Invalid client certificate specified. 错误: 指定了错误的客户端证书。 - + Please enter the passphrase for this client certificate in order to authenticate. 请输入客户端证书的口令以进行身份认证。 - + Cancel 取消 - + Uploading remote database to -%1. +%1 正在上传远程数据库到 +%1. {1?} + + + + Downloading remote database from +%1 + 正在下载远程数据库于 +%1. {1?} + + + + The remote database has been updated since the last checkout. Do you want to update the local database to the newest version? Note that this discards any changes you have made locally! If you don't want to lose local changes, click No to open the local version. + 从上次检入以后,远程数据库已更新。你想把本地数据库更新到最新版本吗?注意这将会丢弃你在本地做的所有修改!如果你不希望丢掉本地修改,选择否以使用本地版本。 + + + Uploading remote database to +%1. + 正在上传远程数据库到 %1. - Downloading remote database from %1. - 正在下载远程数据库于 + 正在下载远程数据库于 %1. - - + + Error: The network is not accessible. 错误: 网络无法访问。 - + Error: Cannot open the file for sending. 错误: 无法打开文件用于发送。 - + Error opening local databases list. %1 打开本地数据库列表时出错。 %1 - + Error creating local databases list. %1 创建本地数据库列表时出错。 @@ -3646,14 +5467,24 @@ + Connect to the remote server using the currently selected identity. The correct server is taken from the identity as well. + 用当前所选身份连接远程服务器。正确的服务器也来自此身份。 + + + Go - + Push currently opened database to server 推送当前打开的数据库到服务器 + + + <html><head/><body><p>In this pane, remote databases from dbhub.io website can be added to DB4S. First you need an identity:</p><ol style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;"><li style=" margin-top:12px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Login to the dbhub.io website (use your GitHub credentials or whatever you want)</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Click the button to create a DB4S certificate (that's your identity). That'll give you a certificate file (save it to your local disk).</li><li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Go to the Remote tab in DB4S Preferences. Click the button to add a new certificate to DB4S and choose the just downloaded certificate file.</li></ol><p>Now the Remote panel shows your identity and you can add remote databases.</p></body></html> + <html><head/><body><p>在此面板,来自 dbhub.io 网站的远程数据库可以被添加到 DB4S。首先你需要一个身份:</p><ol style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;"><li style=" margin-top:12px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">登录 dbhub.io 网站 (使用你的 GitHub 认证或其他什么)</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">点击按钮创建 DB4S 证书 (那是你的身份)。 这会给你一个证书文件 (保存到你的本地硬盘里)。</li><li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">前往 DB4S 的设置中的远程选项卡。点击添加证书,选择刚才下载的文件。</li></ol><p>这样,远程面板就会显示你的身份,之后可以添加远程数据库。</p></body></html> + RemoteModel @@ -3700,12 +5531,12 @@ 推送的数据库名(&m) - + Commit message 提交信息 - + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } @@ -3714,27 +5545,42 @@ - + Database licence 数据库许可协议 - + Public 公有 - + + Branch + 分支 + + + + Force push + 强制推送 + + + Database will be public. Everyone has read access to it. 数据库将是公有的。所有人都可以读取它。 - + Database will be private. Only you have access to it. 数据库将是私有的。只有您可以访问它。 - + + Use with care. This can cause remote commits to be deleted. + 小心使用。这可能会导致远程提交被删除。 + + + Unspecified 未指定的 @@ -3747,314 +5593,493 @@ 表单 - + + Find previous match [Shift+F3] + 查找上一个 [Shift+F3] + + + + Find previous match with mapping + 按顺序查找上一项 + + + + Shift+F3 + Shift+F3 + + + + The found pattern must be a whole word + 找到的必须是一个完整的词 + + + + Whole Words + 全词 + + + + Text pattern to find considering the checks in this frame + 搜索的文本符合这里的选择 + + + + Find in editor + 在编辑器中搜索 + + + + The found pattern must match in letter case + 搜索必须大小写匹配 + + + + Case Sensitive + 大小写敏感 + + + + Find next match [Enter, F3] + 查找下一个 [Enter, F3] + + + + Find next match with wrapping + 循环查找下一个 + + + + F3 + F3 + + + + Interpret search pattern as a regular expression + 解析查找目标为正则表达式 + + + + <html><head/><body><p>When checked, the pattern to find is interpreted as a UNIX regular expression. See <a href="https://en.wikibooks.org/wiki/Regular_Expressions">Regular Expression in Wikibooks</a>.</p></body></html> + <html><head/><body><p>选中时,要查找的模式被解释为 UNIX 正则表达式。参阅 <a href="https://en.wikibooks.org/wiki/Regular_Expressions">Wikibooks 中的正则表达式</a>.</p></body></html> + + + + Regular Expression + 正则表达式 + + + + + Close Find Bar + 关闭查找栏 + + + + Results of the last executed statements 上次执行语句的结果 - + This field shows the results and status codes of the last executed statements. 这个字段显示最后执行的语句的结果和状态码。 - Export to &CSV - 导出到 &CSV + 导出到 &CSV - Save as &view - 保存为视图(&V) + 保存为视图(&V) - Save as view - 保存为视图 + 保存为视图 - Please specify the view name - 请指定视图名称 + 请指定视图名称 - There is already an object with that name. Please choose a different name. - 已有同名的对象。请选择一个不同的名称。 + 已有同名的对象。请选择一个不同的名称。 - View successfully created. - 视图成功创建。 + 视图成功创建。 - Error creating view: %1 - 创建视图时出错: %1 + 创建视图时出错: %1 SqlUiLexer - + (X) The abs(X) function returns the absolute value of the numeric argument X. - + () The changes() function returns the number of database rows that were changed or inserted or deleted by the most recently completed INSERT, DELETE, or UPDATE statement. - + (X1,X2,...) The char(X1,X2,...,XN) function returns a string composed of characters having the unicode code point values of integers X1 through XN, respectively. - + (X,Y,...) The coalesce() function returns a copy of its first non-NULL argument, or NULL if all arguments are NULL - + (X,Y) The glob(X,Y) function is equivalent to the expression "Y GLOB X". - + (X,Y) The ifnull() function returns a copy of its first non-NULL argument, or NULL if both arguments are NULL. - + (X,Y) The instr(X,Y) function finds the first occurrence of string Y within string X and returns the number of prior characters plus 1, or 0 if Y is nowhere found within X. - + (X) The hex() function interprets its argument as a BLOB and returns a string which is the upper-case hexadecimal rendering of the content of that blob. - + () The last_insert_rowid() function returns the ROWID of the last row insert from the database connection which invoked the function. - + (X) For a string value X, the length(X) function returns the number of characters (not bytes) in X prior to the first NUL character. - + (X,Y) The like() function is used to implement the "Y LIKE X" expression. - + (X,Y,Z) The like() function is used to implement the "Y LIKE X ESCAPE Z" expression. - - (X) The load_extension(X) function loads SQLite extensions out of the shared library file named X. + + (X) The load_extension(X) function loads SQLite extensions out of the shared library file named X. +Use of this function must be authorized from Preferences. - - (X,Y) The load_extension(X) function loads SQLite extensions out of the shared library file named X using the entry point Y. + + (X,Y) The load_extension(X) function loads SQLite extensions out of the shared library file named X using the entry point Y. +Use of this function must be authorized from Preferences. - + (X) The lower(X) function returns a copy of string X with all ASCII characters converted to lower case. - + (X) ltrim(X) removes spaces from the left side of X. - + (X,Y) The ltrim(X,Y) function returns a string formed by removing any and all characters that appear in Y from the left side of X. - + (X,Y,...) The multi-argument max() function returns the argument with the maximum value, or return NULL if any argument is NULL. - + (X,Y,...) The multi-argument min() function returns the argument with the minimum value. - + (X,Y) The nullif(X,Y) function returns its first argument if the arguments are different and NULL if the arguments are the same. - + (FORMAT,...) The printf(FORMAT,...) SQL function works like the sqlite3_mprintf() C-language function and the printf() function from the standard C library. - + (X) The quote(X) function returns the text of an SQL literal which is the value of its argument suitable for inclusion into an SQL statement. - + () The random() function returns a pseudo-random integer between -9223372036854775808 and +9223372036854775807. - + (N) The randomblob(N) function return an N-byte blob containing pseudo-random bytes. - + (X,Y,Z) The replace(X,Y,Z) function returns a string formed by substituting string Z for every occurrence of string Y in string X. - + (X) The round(X) function returns a floating-point value X rounded to zero digits to the right of the decimal point. - + (X,Y) The round(X,Y) function returns a floating-point value X rounded to Y digits to the right of the decimal point. - + (X) rtrim(X) removes spaces from the right side of X. - + (X,Y) The rtrim(X,Y) function returns a string formed by removing any and all characters that appear in Y from the right side of X. - + (X) The soundex(X) function returns a string that is the soundex encoding of the string X. - + (X,Y) substr(X,Y) returns all characters through the end of the string X beginning with the Y-th. - + (X,Y,Z) The substr(X,Y,Z) function returns a substring of input string X that begins with the Y-th character and which is Z characters long. - + () The total_changes() function returns the number of row changes caused by INSERT, UPDATE or DELETE statements since the current database connection was opened. - + (X) trim(X) removes spaces from both ends of X. - + (X,Y) The trim(X,Y) function returns a string formed by removing any and all characters that appear in Y from both ends of X. - + (X) The typeof(X) function returns a string that indicates the datatype of the expression X. - + (X) The unicode(X) function returns the numeric unicode code point corresponding to the first character of the string X. - + (X) The upper(X) function returns a copy of input string X in which all lower-case ASCII characters are converted to their upper-case equivalent. - + (N) The zeroblob(N) function returns a BLOB consisting of N bytes of 0x00. - - - - + + + + (timestring,modifier,modifier,...) - + (format,timestring,modifier,modifier,...) - + (X) The avg() function returns the average value of all non-NULL X within a group. - + (X) The count(X) function returns a count of the number of times that X is not NULL in a group. - + (X) The group_concat() function returns a string which is the concatenation of all non-NULL values of X. - + (X,Y) The group_concat() function returns a string which is the concatenation of all non-NULL values of X. If parameter Y is present then it is used as the separator between instances of X. - + (X) The max() aggregate function returns the maximum value of all values in the group. - + (X) The min() aggregate function returns the minimum non-NULL value of all values in the group. - - + + (X) The sum() and total() aggregate functions return sum of all non-NULL values in the group. + + + () The number of the row within the current partition. Rows are numbered starting from 1 in the order defined by the ORDER BY clause in the window definition, or in arbitrary order otherwise. + + + + + () The row_number() of the first peer in each group - the rank of the current row with gaps. If there is no ORDER BY clause, then all rows are considered peers and this function always returns 1. + + + + + () The number of the current row's peer group within its partition - the rank of the current row without gaps. Partitions are numbered starting from 1 in the order defined by the ORDER BY clause in the window definition. If there is no ORDER BY clause, then all rows are considered peers and this function always returns 1. + + + + + () Despite the name, this function always returns a value between 0.0 and 1.0 equal to (rank - 1)/(partition-rows - 1), where rank is the value returned by built-in window function rank() and partition-rows is the total number of rows in the partition. If the partition contains only one row, this function returns 0.0. + + + + + () The cumulative distribution. Calculated as row-number/partition-rows, where row-number is the value returned by row_number() for the last peer in the group and partition-rows the number of rows in the partition. + + + + + (N) Argument N is handled as an integer. This function divides the partition into N groups as evenly as possible and assigns an integer between 1 and N to each group, in the order defined by the ORDER BY clause, or in arbitrary order otherwise. If necessary, larger groups occur first. This function returns the integer value assigned to the group that the current row is a part of. + + + + + (expr) Returns the result of evaluating expression expr against the previous row in the partition. Or, if there is no previous row (because the current row is the first), NULL. + + + + + (expr,offset) If the offset argument is provided, then it must be a non-negative integer. In this case the value returned is the result of evaluating expr against the row offset rows before the current row within the partition. If offset is 0, then expr is evaluated against the current row. If there is no row offset rows before the current row, NULL is returned. + + + + + + (expr,offset,default) If default is also provided, then it is returned instead of NULL if the row identified by offset does not exist. + + + + + (expr) Returns the result of evaluating expression expr against the next row in the partition. Or, if there is no next row (because the current row is the last), NULL. + + + + + (expr,offset) If the offset argument is provided, then it must be a non-negative integer. In this case the value returned is the result of evaluating expr against the row offset rows after the current row within the partition. If offset is 0, then expr is evaluated against the current row. If there is no row offset rows after the current row, NULL is returned. + + + + + (expr) This built-in window function calculates the window frame for each row in the same way as an aggregate window function. It returns the value of expr evaluated against the first row in the window frame for each row. + + + + + (expr) This built-in window function calculates the window frame for each row in the same way as an aggregate window function. It returns the value of expr evaluated against the last row in the window frame for each row. + + + + + (expr,N) This built-in window function calculates the window frame for each row in the same way as an aggregate window function. It returns the value of expr evaluated against the row N of the window frame. Rows are numbered within the window frame starting from 1 in the order defined by the ORDER BY clause if one is present, or in arbitrary order otherwise. If there is no Nth row in the partition, then NULL is returned. + + SqliteTableModel - References %1(%2) Hold Ctrl+Shift and click to jump there - 引用 %1(%2) + 引用 %1(%2) 按住 Ctrl+Shift 并点击以跳转 - + + reading rows + 读取行 + + + + loading... + 正在加载... + + + + References %1(%2) +Hold %3Shift and click to jump there + 引用 %1(%2) +按住 %3Shift 并点击以跳转 + + + Error changing data: %1 更改数据库时出错: %1 + + + retrieving list of columns + 正在检索列的列表 + + + + Fetching data... + 正在拉取数据... + + + + Cancel + 取消 + VacuumDialog @@ -4065,13 +6090,21 @@ - Warning: Compacting the database will commit all changes you made. - 警告: 压缩数据库将会提交您做出的所有更改。 + Warning: Compacting the database will commit all of your changes. + 警告: 压缩数据库会提交你的所有修改。 + Please select the databases to co&mpact: + 请选择要压缩的数据库(&M) + + + Warning: Compacting the database will commit all changes you made. + 警告: 压缩数据库将会提交您做出的所有更改。 + + Please select the objects to compact: - 请选择要压缩的对象: + 请选择要压缩的对象: diff -Nru sqlitebrowser-3.10.100ubuntu1/src/translations/sqlb_zh_TW.ts sqlitebrowser-3.11.1/src/translations/sqlb_zh_TW.ts --- sqlitebrowser-3.10.100ubuntu1/src/translations/sqlb_zh_TW.ts 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/src/translations/sqlb_zh_TW.ts 2019-02-19 23:51:34.000000000 +0000 @@ -19,7 +19,7 @@ - <html><head/><body><p>DB Browser for SQLite is an open source, freeware visual tool used to create, design and edit SQLite database files.</p><p>It is bi-licensed under the Mozilla Public License Version 2, as well as the GNU General Public License Version 3 or later. You can modify or redistribute it under the conditions of these licenses.</p><p>See <a href="http://www.gnu.org/licenses/gpl.html"><span style=" text-decoration: underline; color:#0000ff;">http://www.gnu.org/licenses/gpl.html</span></a> and <a href="https://www.mozilla.org/MPL/2.0/index.txt"><span style=" text-decoration: underline; color:#0000ff;">https://www.mozilla.org/MPL/2.0/index.txt</span></a> for details.</p><p>For more information on this program please visit our website at: <a href="http://sqlitebrowser.org"><span style=" text-decoration: underline; color:#0000ff;">http://sqlitebrowser.org</span></a></p><p><span style=" font-size:small;">This software uses the GPL/LGPL Qt Toolkit from </span><a href="http://qt-project.org/"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://qt-project.org/</span></a><span style=" font-size:small;"><br/>See </span><a href="http://qt-project.org/doc/qt-5/licensing.html"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://qt-project.org/doc/qt-5/licensing.html</span></a><span style=" font-size:small;"> for licensing terms and information.</span></p><p><span style=" font-size:small;">It also uses the Silk icon set by Mark James licensed under a Creative Commons Attribution 2.5 and 3.0 license.<br/>See </span><a href="http://www.famfamfam.com/lab/icons/silk/"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://www.famfamfam.com/lab/icons/silk/</span></a><span style=" font-size:small;"> for details.</span></p></body></html> + <html><head/><body><p>DB Browser for SQLite is an open source, freeware visual tool used to create, design and edit SQLite database files.</p><p>It is bi-licensed under the Mozilla Public License Version 2, as well as the GNU General Public License Version 3 or later. You can modify or redistribute it under the conditions of these licenses.</p><p>See <a href="http://www.gnu.org/licenses/gpl.html">http://www.gnu.org/licenses/gpl.html</a> and <a href="https://www.mozilla.org/MPL/2.0/index.txt">https://www.mozilla.org/MPL/2.0/index.txt</a> for details.</p><p>For more information on this program please visit our website at: <a href="http://sqlitebrowser.org">http://sqlitebrowser.org</a></p><p><span style=" font-size:small;">This software uses the GPL/LGPL Qt Toolkit from </span><a href="http://qt-project.org/"><span style=" font-size:small;">http://qt-project.org/</span></a><span style=" font-size:small;"><br/>See </span><a href="http://qt-project.org/doc/qt-5/licensing.html"><span style=" font-size:small;">http://qt-project.org/doc/qt-5/licensing.html</span></a><span style=" font-size:small;"> for licensing terms and information.</span></p><p><span style=" font-size:small;">It also uses the Silk icon set by Mark James licensed under a Creative Commons Attribution 2.5 and 3.0 license.<br/>See </span><a href="http://www.famfamfam.com/lab/icons/silk/"><span style=" font-size:small;">http://www.famfamfam.com/lab/icons/silk/</span></a><span style=" font-size:small;"> for details.</span></p></body></html> @@ -31,41 +31,136 @@ SQLite 版本 - <html><head/><body><p>SQLite Database Browser is an open source, freeware visual tool used to create, design and edit SQLite database files.</p><p>It is bi-licensed under the Mozilla Public License Version 2, as well as the GNU General Public License Version 3 or later. You can modify or redistribute it under the conditions of these licenses.</p><p>See <a href="http://www.gnu.org/licenses/gpl.html"><span style=" text-decoration: underline; color:#0000ff;">http://www.gnu.org/licenses/gpl.html</span></a> and <a href="https://www.mozilla.org/MPL/2.0/index.txt"><span style=" text-decoration: underline; color:#0000ff;">https://www.mozilla.org/MPL/2.0/index.txt</span></a> for details.</p><p>For more information on this program please visit our website at: <a href="http://sqlitebrowser.org"><span style=" text-decoration: underline; color:#0000ff;">http://sqlitebrowser.org</span></a></p><p><span style=" font-size:small;">This software uses the GPL/LGPL Qt Toolkit from </span><a href="http://qt-project.org/"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://qt-project.org/</span></a><span style=" font-size:small;"><br/>See </span><a href="http://qt-project.org/doc/qt-5/licensing.html"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://qt-project.org/doc/qt-5/licensing.html</span></a><span style=" font-size:small;"> for licensing terms and information.</span></p><p><span style=" font-size:small;">It also uses the Silk icon set by Mark James licensed under a Creative Commons Attribution 2.5 and 3.0 license.<br/>See </span><a href="http://www.famfamfam.com/lab/icons/silk/"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://www.famfamfam.com/lab/icons/silk/</span></a><span style=" font-size:small;"> for details.</span></p></body></html> - <html><head/><body><p>SQLite Database Browser 是一個開放原始碼的免費視覺化工具,用於建立、設計和編輯 SQLite 資料庫檔案。</p><p>它是以第 2 版 Mozilla 公共許可,以及第 3 版及之後版本的 GNU 通用許可方式授權。你可以在遵循這些許可的條件下修改或重新發佈它。</p><p>參閱 <a href="http://www.gnu.org/licenses/gpl.html"><span style=" text-decoration: underline; color:#0000ff;">http://www.gnu.org/licenses/gpl.html</span></a> 和 <a href="https://www.mozilla.org/MPL/2.0/index.txt"><span style=" text-decoration: underline; color:#0000ff;">https://www.mozilla.org/MPL/2.0/index.txt</span></a> 瞭解細節。</p><p>要獲得本程式的更多資訊,請訪問我們的網站: <a href="http://sqlitebrowser.org"><span style=" text-decoration: underline; color:#0000ff;">http://sqlitebrowser.org</span></a></p><p><span style=" font-size:small;">這個軟體使用了 GPL/LGPL Qt Toolkit: </span><a href="http://qt-project.org/"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://qt-project.org/</span></a><span style=" font-size:small;"><br/>參閱 </span><a href="http://qt-project.org/doc/qt-5/licensing.html"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://qt-project.org/doc/qt-5/licensing.html</span></a><span style=" font-size:small;"> 瞭解許可條款和資訊。</span></p><p><span style=" font-size:small;">它還是用了由 Mark James 提供的 Silk 圖示集,以第 2.5 和 3.0 版知識共用署名(CCA)許可方式授權。<br/>參閱 </span><a href="http://www.famfamfam.com/lab/icons/silk/"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://www.famfamfam.com/lab/icons/silk/</span></a><span style=" font-size:small;"> 瞭解細節。</span></p></body></html> + <html><head/><body><p>SQLite Database Browser is an open source, freeware visual tool used to create, design and edit SQLite database files.</p><p>It is bi-licensed under the Mozilla Public License Version 2, as well as the GNU General Public License Version 3 or later. You can modify or redistribute it under the conditions of these licenses.</p><p>See <a href="http://www.gnu.org/licenses/gpl.html"><span style=" text-decoration: underline; color:#0000ff;">http://www.gnu.org/licenses/gpl.html</span></a> and <a href="https://www.mozilla.org/MPL/2.0/index.txt"><span style=" text-decoration: underline; color:#0000ff;">https://www.mozilla.org/MPL/2.0/index.txt</span></a> for details.</p><p>For more information on this program please visit our website at: <a href="https://sqlitebrowser.org"><span style=" text-decoration: underline; color:#0000ff;">https://sqlitebrowser.org</span></a></p><p><span style=" font-size:small;">This software uses the GPL/LGPL Qt Toolkit from </span><a href="http://qt-project.org/"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://qt-project.org/</span></a><span style=" font-size:small;"><br/>See </span><a href="http://qt-project.org/doc/qt-5/licensing.html"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://qt-project.org/doc/qt-5/licensing.html</span></a><span style=" font-size:small;"> for licensing terms and information.</span></p><p><span style=" font-size:small;">It also uses the Silk icon set by Mark James licensed under a Creative Commons Attribution 2.5 and 3.0 license.<br/>See </span><a href="http://www.famfamfam.com/lab/icons/silk/"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://www.famfamfam.com/lab/icons/silk/</span></a><span style=" font-size:small;"> for details.</span></p></body></html> + <html><head/><body><p>SQLite Database Browser 是一個開放原始碼的免費視覺化工具,用於建立、設計和編輯 SQLite 資料庫檔案。</p><p>它是以第 2 版 Mozilla 公共許可,以及第 3 版及之後版本的 GNU 通用許可方式授權。你可以在遵循這些許可的條件下修改或重新發佈它。</p><p>參閱 <a href="http://www.gnu.org/licenses/gpl.html"><span style=" text-decoration: underline; color:#0000ff;">http://www.gnu.org/licenses/gpl.html</span></a> 和 <a href="https://www.mozilla.org/MPL/2.0/index.txt"><span style=" text-decoration: underline; color:#0000ff;">https://www.mozilla.org/MPL/2.0/index.txt</span></a> 瞭解細節。</p><p>要獲得本程式的更多資訊,請訪問我們的網站: <a href="https://sqlitebrowser.org"><span style=" text-decoration: underline; color:#0000ff;">https://sqlitebrowser.org</span></a></p><p><span style=" font-size:small;">這個軟體使用了 GPL/LGPL Qt Toolkit: </span><a href="http://qt-project.org/"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://qt-project.org/</span></a><span style=" font-size:small;"><br/>參閱 </span><a href="http://qt-project.org/doc/qt-5/licensing.html"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://qt-project.org/doc/qt-5/licensing.html</span></a><span style=" font-size:small;"> 瞭解許可條款和資訊。</span></p><p><span style=" font-size:small;">它還是用了由 Mark James 提供的 Silk 圖示集,以第 2.5 和 3.0 版知識共用署名(CCA)許可方式授權。<br/>參閱 </span><a href="http://www.famfamfam.com/lab/icons/silk/"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">http://www.famfamfam.com/lab/icons/silk/</span></a><span style=" font-size:small;"> 瞭解細節。</span></p></body></html> - + + (based on SQLite %1) + + + + Version - + Qt Version - + SQLCipher Version - + SQLite Version + AddRecordDialog + + + Add New Record + + + + + Enter values for the new record considering constraints. Fields in bold are mandatory. + + + + + In the Value column you can specify the value for the field identified in the Name column. The Type column indicates the type of the field. Default values are displayed in the same style as NULL values. + + + + + Name + 名稱 + + + + Type + 類型 + + + + Value + + + + + Values to insert. Pre-filled default values are inserted automatically unless they are changed. + + + + + When you edit the values in the upper frame, the SQL query for inserting this new record is shown here. You can edit manually the query before saving. + + + + + <html><head/><body><p><span style=" font-weight:600;">Save</span> will submit the shown SQL statement to the database for inserting the new record.</p><p><span style=" font-weight:600;">Restore Defaults</span> will restore the initial values in the <span style=" font-weight:600;">Value</span> column.</p><p><span style=" font-weight:600;">Cancel</span> will close this dialog without executing the query.</p></body></html> + + + + + Auto-increment + + + + + + Unique constraint + + + + + + Check constraint: %1 + + + + + + Foreign key: %1 + + + + + + Default value: %1 + + + + + + Error adding record. Message from database engine: + +%1 + + + + + Are you sure you want to restore all the entered values to their defaults? + + + + Application - + Usage: %1 [options] [db] 用法: %1 [選項] [資料庫] - + Possible command line arguments: 可用命令列參數: @@ -86,57 +181,72 @@ [檔] 打開這個 SQLite 資料庫 - + -h, --help Show command line options - + -s, --sql [file] Execute this SQL file after opening the DB - + -t, --table [table] Browse this table after opening the DB - + -q, --quit Exit application after running scripts - + + -R, --read-only Open database in read-only mode + + + + + -o, --option [group/setting=value] Run application with this setting temporarily set to value + + + + -v, --version Display the current version - + [file] Open this SQLite database - - This is DB Browser for SQLite version %1%2. + + This is DB Browser for SQLite version %1. - + The -s/--sql option requires an argument -s/--sql 選項需要一個參數 - + The file %1 does not exist 檔案 %1 不存在 - + The -t/--table option requires an argument - + + The -o/--option option requires an argument in the form group/setting=value + + + + Invalid option/non-existant file: %1 無效選項/不存在的檔案: %1 @@ -164,17 +274,17 @@ - + Passphrase - + Raw key - + Please set a key to encrypt the database. Note that if you change any of the other, optional, settings you'll need to re-enter them as well every time you open the database file. Leave the password fields empty to disable the encryption. @@ -182,7 +292,7 @@ - + Please enter the key used to encrypt the database. If any of the other settings were altered for this database file you need to provide this information as well. @@ -211,67 +321,82 @@ 預設 - + Decimal number - + Exponent notation - + Hex blob - + Hex number - + Apple NSDate to date - + + Java epoch (milliseconds) to date + + + + Julian day to date - + + Unix epoch to local time + + + + + Date as dd/mm/yyyy + + + + Lower case - + Octal number - + Round number - + Unix epoch to date - + Upper case - + Windows DATE to date - + Custom @@ -279,38 +404,38 @@ DBBrowserDB - + Please specify the database name under which you want to access the attached database - + Invalid file format - + Do you want to save the changes made to the database file %1? 您是否想儲存對資料庫檔案 %1 做出的修改? - + Exporting database to SQL file... 正在匯出資料庫到 SQL 檔案... - - + + Cancel 取消 - + Executing SQL... 正在執行 SQL... - + Action cancelled. 操作已取消。 @@ -325,52 +450,88 @@ renameColumn: 無法查閱資料資料表 %1。 - - + + This database has already been attached. Its schema name is '%1'. + + + + + Do you really want to close this temporary database? All data will be lost. + + + + + The database is currently busy: + + + + + Do you want to abort that other operation? + + + + + + No database file opened + + + + + Error in statement #%1: %2. Aborting execution%3. - - + + and rolling back - + + Cannot delete this object + + + + Cannot set data on this object - + + A table with the name '%1' already exists in schema '%2'. + + + + renameColumn: cannot find column %1. renameColumn: 無法查詢列 %1。 - + renameColumn: creating savepoint failed. DB says: %1 renameColumn: 建立保存點時失敗。DB 說: %1 - + renameColumn: creating new table failed. DB says: %1 renameColumn: 建立新資料表時失敗。DB 說: %1 - + renameColumn: copying data to new table failed. DB says: %1 renameColumn: 複製資料到新資料表時失敗。DB 說: %1 - + renameColumn: deleting old table failed. DB says: %1 renameColumn: 刪除舊資料表失敗。DB 說: %1 - + Restoring some of the objects associated with this table failed. This is most likely because some column names changed. Here's the SQL statement which you might want to fix and execute manually: @@ -379,24 +540,34 @@ - + renameColumn: releasing savepoint failed. DB says: %1 renameColumn: 釋放保存點時失敗。DB 說: %1 - + Error renaming table '%1' to '%2'.Message from database engine: %3 重命名資料表 '%1' 為 '%2'時失敗。消息來自資料庫引擎: %3 - + ... <string can not be logged, contains binary data> ... ... <字串無法記錄,包含二進位資料> ... - + + could not get list of databases: %1 + + + + + Error loading extension: %1 + 載入擴充套件時出現錯誤: %1 + + + could not get column information @@ -405,7 +576,7 @@ 未知對象類型 %1 - + could not get list of db objects: %1, %2 無法取得資料庫物件的列表: %1, %2 @@ -414,22 +585,22 @@ 無法取得類型 - + didn't receive any output from pragma %1 無法接受來自雜注 %1 的任何輸出 - + could not execute pragma command: %1, %2 無法執行雜注命令: %1, %2 - + Error setting pragma %1 to %2: %3 設定雜注 %1 為 %2 時出現錯誤: %3 - + File not found. 找不到檔案。 @@ -437,52 +608,62 @@ DbStructureModel - + Name 名稱 - + Object 對象 - + Type 類型 - + Schema 架構 - - Browsables (%1) + + Database + + + + + Browsables - + All - + + Temporary + + + + Tables (%1) 資料表 (%1) - + Indices (%1) 索引 (%1) - + Views (%1) 視圖 (%1) - + Triggers (%1) 觸發器 (%1) @@ -500,63 +681,179 @@ - - + + This is the list of supported modes for the cell editor. Choose a mode for viewing or editing the data of the current cell. + + + + Image + + JSON + + + + + XML + + + + + + Automatically adjust the editor mode to the loaded data type + + + - Import text - 匯入純文字檔案 + This checkable button enables or disables the automatic switching of the editor mode. When a new cell is selected or new data is imported and the automatic switching is enabled, the mode adjusts to the detected data type. You can then change the editor mode manually. If you want to keep this manually switched mode while moving through the cells, switch the button off. + + Auto-switch + + + + + + Auto-format: pretty print on loading, compact on saving. + + + + + When enabled, the auto-format feature formats the data on loading, breaking the text in lines and indenting it for maximum readability. On data saving, the auto-format feature compacts the data removing end of lines, and unnecessary whitespace. + + + + + Autoformat + + + + + Import from file + + + + + Opens a file dialog used to import any kind of data to this database cell. + + + + + Export to file + + + + + Opens a file dialog used to export the contents of this database cell to a file. + + + + + + Print... + + + + + Open preview dialog for printing displayed image + + + + + + Ctrl+P + Ctrl+P + + + + Open preview dialog for printing displayed text + + + + + Copy Hex and ASCII + + + + + Copy selected hexadecimal and ASCII columns to the clipboard + + + + + Ctrl+Shift+C + + + + Import text + 匯入純文字檔案 + + Opens a file dialog used to import text to this database cell. - 打開一個檔對話方塊用於匯入純文字檔案到這個資料庫儲存格。 + 打開一個檔對話方塊用於匯入純文字檔案到這個資料庫儲存格。 - + &Import 匯入(&I) - Export text - 匯出純文字檔案 + 匯出純文字檔案 - Opens a file dialog used to export the contents of this database cell to a text file. - 打開一個檔對話方塊用於匯出這個資料庫儲存格的內容到一個文字檔案。 + 打開一個檔對話方塊用於匯出這個資料庫儲存格的內容到一個文字檔案。 - + &Export 匯出(&E) - + Set this cell to NULL - + Set as &NULL - + + This editor mode lets you edit JSON or XML data with syntax highlighting, automatic formatting and validation before saving. + +Errors are indicated with a red squiggle underline. + + + + + Apply data to cell + + + + + This button saves the changes performed in the cell editor to the database cell. + + + + Apply - + Text 純文字檔案 - + Binary 二進位 @@ -565,7 +862,7 @@ 清除儲存格資料 - + Erases the contents of the cell 刪除儲存格的內容 @@ -578,109 +875,199 @@ <html><head/><body><p><span style=" font-weight:600; color:#c00000;">警告: 在文字模式中編輯二進位內容可能會導致資料損壞!</span></p></body></html> - + This area displays information about the data present in this database cell 這個區域顯示存在於這個資料庫儲存格中的資料的相關資訊 - + Type of data currently in cell 目前在儲存格中的資料的類型 - + Size of data currently in table 目前在資料表中的資料的大小 - Choose a file - 選擇一個檔案 + 選擇一個檔案 - Text files(*.txt);;Image files(%1);;All files(*) - 文字檔案(*.txt);;影像檔案(%1);;所有擋檔案(*) + 文字檔案(*.txt);;影像檔案(%1);;所有擋檔案(*) - + Choose a filename to export data 選擇一個匯出資料的檔案名稱 - Text files(*.txt);;All files(*) - 文字檔案(*.txt);;所有擋檔案(*) - - - - Image data can't be viewed with the text editor - - - - - Binary data can't be viewed with the text editor - + 文字檔案(*.txt);;所有擋檔案(*) - + Type of data currently in cell: %1 Image - + %1x%2 pixel(s) - + Type of data currently in cell: NULL - - + + Type of data currently in cell: Text / Numeric 目前在儲存格中的資料的類型: Text 純文字檔案/ Numeric 數值 - - - - %n char(s) - - %n 個字元 - + + + + Image data can't be viewed in this mode. + - Type of data currently in cell: Image - 目前在儲存格中的資料的類型: Image 圖像 + + + Try switching to Image or Binary mode. + - %1x%2 pixel - %1x%2 圖元 + + + Binary data can't be viewed in this mode. + - - Type of data currently in cell: Binary - 目前在儲存格中的資料的類型: Binary 二進位 + + + Try switching to Binary mode. + - - - - %n byte(s) - - %n 位元組 - + + + + + + Text files (*.txt) + - - - EditIndexDialog - Create New Index - 建立新索引 + + + + JSON files (*.json) + - + + + + + XML files (*.xml) + + + + + + Image files (%1) + + + + + + + Binary files (*.bin) + + + + + + All files (*) + + + + + Choose a file to import + 選擇要匯入的一個檔案 + + + + %1 Image + + + + + SVG files (*.svg) + + + + + + Hex dump files (*.txt) + + + + + Invalid data for this mode + + + + + The cell contains invalid %1 data. Reason: %2. Do you really want to apply it to the cell? + + + + + + + %n char(s) + + %n 個字元 + + + + + Type of data currently in cell: Valid JSON + + + + Type of data currently in cell: Image + 目前在儲存格中的資料的類型: Image 圖像 + + + %1x%2 pixel + %1x%2 圖元 + + + + Type of data currently in cell: Binary + 目前在儲存格中的資料的類型: Binary 二進位 + + + + + %n byte(s) + + %n 位元組 + + + + + EditIndexDialog + + Create New Index + 建立新索引 + + + &Name 名稱(&N) @@ -752,13 +1139,13 @@ - + Deleting the old index failed: %1 - + Creating the index failed: %1 建立索引時失敗: @@ -784,192 +1171,191 @@ - Make this a 'WITHOUT rowid' table. Setting this flag requires a field of type INTEGER with the primary key flag set and the auto increment flag unset. - - - - - Without Rowid + Database schema - - Set this to create a temporary table that is deleted when closing the database. + + Make this a 'WITHOUT rowid' table. Setting this flag requires a field of type INTEGER with the primary key flag set and the auto increment flag unset. - Temporary table + Without Rowid - + Fields 欄位 - + Add field 加入欄位 - + Remove field 刪除欄位 - + Move field up 上移欄位 - + Move field down 下移欄位 - + Name 名稱 - + Type 類型 - - + + NN + + + + Not null 非空 - + PK PK - + Primary key 主鍵 - + AI AI - + Autoincrement 自動增值 - + U - + Unique - + Default 預設 - + Default value 預設值 - + Check 檢查 - + Check constraint 檢查約束條件 - + Foreign Key - + <html><head/><body><p><span style=" font-weight:600; color:#ff0000;">Warning: </span>There is something with this table definition that our parser doesn't fully understand. Modifying and saving this table might result in problems.</p></body></html> - + Error creating table. Message from database engine: %1 建立資料表時出現錯誤。來自資料庫引擎的消息: %1 - + There already is a field with that name. Please rename it first or choose a different name for this field. - + There is at least one row with this field set to NULL. This makes it impossible to set this flag. Please change the table data first. 至少有一行帶本欄位的記錄被設為空。這使得它不可能設定這個標誌。請首先修改資料表資料。 - + There is at least one row with a non-integer value in this field. This makes it impossible to set the AI flag. Please change the table data first. 在這個欄位中至少有一行帶有一個非整數的值。這使得它不可能設定 AI 標誌。請首先修改資料表資料。 - + This column is referenced in a foreign key in table %1 and thus its name cannot be changed. - + Column '%1' has no unique data. - + This makes it impossible to set this flag. Please change the table data first. - + Modifying this column failed. Error returned from database: %1 - + Are you sure you want to delete the field '%1'? All data currently stored in this field will be lost. 您是否確認您想刪除欄位 '%1'? 目前存儲在這個欄位中的所有資料將會遺失。 - + Please add a field which meets the following criteria before setting the without rowid flag: - Primary key flag set - Auto increment disabled - + Setting the rowid column for the table failed. Error message: %1 - - Setting the temporary flag for the table failed. Error message: + + Changing the table schema failed. Error message: %1 @@ -1071,44 +1457,54 @@ - - + + Could not open output file: %1 - - + + Choose a filename to export data 選擇匯出資料的檔案名稱 - + Text files(*.csv *.txt) 文字檔案(*.csv *.txt) - + Export data as JSON - + + exporting CSV + + + + + exporting JSON + + + + Text files(*.json *.js *.txt) - + Please select at least 1 table. - + Choose a directory 選擇一個目錄 - + Export completed. 匯出完成。 @@ -1180,1236 +1576,2039 @@ - - Please select at least 1 table. + + Please select at least one table. - + Choose a filename to export 選擇要匯出的檔案名稱 - + Text files(*.sql *.txt) 文字檔案(*.sql *.txt) - + Export completed. 匯出完成。 - + Export cancelled or failed. 匯出取消或失敗。 - ExtendedTableWidget + ExtendedScintilla - - Set to NULL + + + Ctrl+H - - Copy - + + + Ctrl+P + Ctrl+P - - Paste + + Find and Replace... - - The content of the clipboard is bigger than the range selected. -Do you want to insert it anyway? + + Print... - FilterLineEdit + ExtendedTableWidget - - Filter - 過濾 + + Use as Exact Filter + - - - FilterTableHeader - Filter - 過濾 + + Containing + - - - ForeignKeyEditor - - &Reset + + Not equal to - - Foreign key clauses (ON UPDATE, ON DELETE etc.) + + Greater than - - - ImportCsvDialog - - Import CSV file - 匯入 CSV 檔案 + + Less than + - - &Table name - 資料表名稱(&T) + + Greater or equal + - - &Column names in first line - 列名在首行(&C) + + Less or equal + - - Field &separator - 欄位分隔符號(&S) + + Between this and... + - - , - , + + Set to NULL + - - ; - ; + + Copy + - - - Tab - Tab + + Copy with Headers + - - | - ; + + Copy as SQL + - - - - Other - 其它 + + Paste + - - &Quote character - 引號(&Q) + + Print... + - - " - ; + + Use in Filter Expression + - - ' - ' + + Alt+Del + - - &Encoding + + Ctrl+Shift+C - - UTF-8 + + Ctrl+Alt+C - - UTF-16 + + The content of the clipboard is bigger than the range selected. +Do you want to insert it anyway? + + + FileExtensionManager - - ISO-8859-1 + + File Extension Manager - - Trim fields? + + &Up - - Separate tables + + &Down - - - Deselect All + + &Add - - Match Similar + + &Remove - - Select All + + + Description - - Inserting data... - 正在插入資料... + + Extensions + - - Cancel - 取消 + + *.extension + + + + FilterLineEdit - - There is already a table of that name and an import into an existing table is only possible if the number of columns match. - 已有同名的資料表,並且匯入只有在列數相符的情況下才能匯入到一個現有的資料表。 + + Filter + 過濾 - - There is already a table of that name. Do you want to import the data into it? - 已有同名的資料表。您是否想匯入資料到其中? + + These input fields allow you to perform quick filters in the currently selected table. +By default, the rows containing the input text are filtered out. +The following operators are also supported: +% Wildcard +> Greater than +< Less than +>= Equal to or greater +<= Equal to or less += Equal to: exact match +<> Unequal: exact inverse match +x~y Range: values between x and y + - - Creating restore point failed: %1 + + Set Filter Expression - - Creating the table failed: %1 + + What's This? + 這是什麼? + + + + Is NULL - - Missing field for record %1 + + Is not NULL - - Inserting row failed: %1 + + Is empty - - - MainWindow - SQLiteBrowser - SQLiteBrowser + + Is not empty + - Database &Structure - 資料庫結構(&S) + + Equal to... + - - - toolBar1 - + + Not equal to... + - &Browse Data - 瀏覽資料(&B) + + Greater than... + - Table: - 資料表: + + Less than... + - - Select a table to browse data - 選擇一個資料表以瀏覽資料 + + Greater or equal... + - - Use this list to select a table to be displayed in the database view - 使用這個清單選擇一個要顯示在資料庫視圖中的資料表 + + Less or equal... + - - Refresh the data in the selected table. - 更新選擇的資料表中的資料。 + + In range... + + + + FilterTableHeader - - This button refreshes the data in the currently selected table. - 這個按鈕更新在目前選擇的資料表中的資料。 + Filter + 過濾 + + + FindReplaceDialog - - SQLCipher &FAQ... + + Find and Replace - - Opens the SQLCipher FAQ in a browser window + + Fi&nd text: - - Table(s) to JSON... + + Re&place with: - - Export one or more table(s) to a JSON file + + Match &exact case - - Refresh + + Match &only whole words - - F5 - F5 + + When enabled, the search continues from the other end when it reaches one end of the page + - - Insert a new record in the current table - 在目前資料表中插入一條新記錄 + + &Wrap around + - - This button creates a new, empty record in the database - 這個按鈕在資料庫中建立一條新的空白記錄 + + When set, the search goes backwards from cursor position, otherwise it goes forward + - + + Search &backwards + + + + + <html><head/><body><p>When checked, the pattern to find is interpreted as a UNIX regular expression. See <a href="https://en.wikibooks.org/wiki/Regular_Expressions">Regular Expression in Wikibooks</a>.</p></body></html> + + + + + Use regular e&xpressions + + + + + Find the next occurrence from the cursor position and in the direction set by "Search backwards" + + + + + &Find Next + + + + + &Replace + + + + + Highlight all the occurrences of the text in the page + + + + + F&ind All + + + + + Replace all the occurrences of the text in the page + + + + + Replace &All + + + + + The searched text was not found + + + + + + The searched text was not found. + + + + + The searched text was found one time. + + + + + The searched text was found %1 times. + + + + + The searched text was replaced one time. + + + + + The searched text was replaced %1 times. + + + + + ForeignKeyEditor + + + &Reset + + + + + Foreign key clauses (ON UPDATE, ON DELETE etc.) + + + + + ImportCsvDialog + + + Import CSV file + 匯入 CSV 檔案 + + + &Table name + 資料表名稱(&T) + + + + Table na&me + + + + + &Column names in first line + 列名在首行(&C) + + + + Field &separator + 欄位分隔符號(&S) + + + + , + , + + + + ; + ; + + + + + Tab + Tab + + + + | + ; + + + + + + Other + 其它 + + + + &Quote character + 引號(&Q) + + + + " + ; + + + + ' + ' + + + + &Encoding + + + + + UTF-8 + + + + + UTF-16 + + + + + ISO-8859-1 + + + + + Trim fields? + + + + + Separate tables + + + + + Advanced + + + + + When importing an empty value from the CSV file into an existing table with a default value for this column, that default value is inserted. Activate this option to insert an empty value instead. + + + + + Ignore default &values + + + + + Activate this option to stop the import when trying to import an empty value into a NOT NULL column without a default value. + + + + + Fail on missing values + + + + + Disable data type detection + + + + + Disable the automatic data type detection when creating a new table. + + + + + + Deselect All + + + + + Match Similar + + + + + Select All + + + + Inserting data... + 正在插入資料... + + + Cancel + 取消 + + + There is already a table of that name and an import into an existing table is only possible if the number of columns match. + 已有同名的資料表,並且匯入只有在列數相符的情況下才能匯入到一個現有的資料表。 + + + There is already a table of that name. Do you want to import the data into it? + 已有同名的資料表。您是否想匯入資料到其中? + + + + Import completed + 匯入完成 + + + + There is already a table named '%1' and an import into an existing table is only possible if the number of columns match. + + + + + There is already a table named '%1'. Do you want to import the data into it? + + + + + Creating restore point failed: %1 + + + + + Creating the table failed: %1 + + + + + importing CSV + + + + + Importing the file '%1' took %2ms. Of this %3ms were spent in the row function. + + + + + Inserting row failed: %1 + + + + + MainWindow + + SQLiteBrowser + SQLiteBrowser + + + Database &Structure + 資料庫結構(&S) + + + + toolBar1 + + + + &Browse Data + 瀏覽資料(&B) + + + Table: + 資料表: + + + + Select a table to browse data + 選擇一個資料表以瀏覽資料 + + + + Use this list to select a table to be displayed in the database view + 使用這個清單選擇一個要顯示在資料庫視圖中的資料表 + + + Refresh the data in the selected table. + 更新選擇的資料表中的資料。 + + + + This button refreshes the data in the currently selected table. + 這個按鈕更新在目前選擇的資料表中的資料。 + + + + Opens the SQLCipher FAQ in a browser window + + + + + Export one or more table(s) to a JSON file + + + + + Refresh + + + + + F5 + F5 + + + + Insert a new record in the current table + 在目前資料表中插入一條新記錄 + + + This button creates a new, empty record in the database + 這個按鈕在資料庫中建立一條新的空白記錄 + + + + New Record 新建記錄 - - Delete the current record - 刪除目前記錄 + + Delete the current record + 刪除目前記錄 + + + This button deletes the record currently selected in the database + 這個按鈕刪除在資料庫中目前選擇的記錄 + + + + + Delete Record + 刪除記錄 + + + This is the database view. You can double-click any record to edit its contents in the cell editor window. + 這是資料庫視圖。您可以按兩下任何記錄,在儲存格編輯器視窗中編輯記錄內容。 + + + + < + < + + + + 0 - 0 of 0 + 0 - 0 / 0 + + + + > + > + + + Scroll 100 records upwards + 上滾 100 條記錄 + + + + DB Browser for SQLite + + + + + &Table: + + + + + Clear all filters + + + + + <html><head/><body><p>Scroll to the beginning</p></body></html> + + + + + <html><head/><body><p>Clicking this button navigates to the beginning in the table view above.</p></body></html> + + + + + |< + + + + <html><head/><body><p>Clicking this button navigates 100 records upwards in the table view above.</p></body></html> + <html><head/><body><p>點擊這個按鈕在上面的資料表視圖中向上導航 100 條記錄。</p></body></html> + + + <html><head/><body><p>Scroll 100 records downwards</p></body></html> + <html><head/><body><p>下滾 100 條記錄</p></body></html> + + + <html><head/><body><p>Clicking this button navigates 100 records downwards in the table view above.</p></body></html> + <html><head/><body><p>點擊這個按鈕在上面的資料表視圖中向下導航 100 條記錄。</p></body></html> + + + + Scroll to the end + + + + + <html><head/><body><p>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Clicking this button navigates up to the end in the table view above.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</p></body></html> + + + + + >| + + + + + <html><head/><body><p>Click here to jump to the specified record</p></body></html> + <html><head/><body><p>點擊這裡跳到指定的記錄</p></body></html> + + + + <html><head/><body><p>This button is used to navigate to the record number specified in the Go to area.</p></body></html> + <html><head/><body><p>這個按鈕用於導航到在“轉到”區域中指定的記錄編號。</p></body></html> + + + + Go to: + 轉到: + + + + Enter record number to browse + 輸入要瀏覽的記錄編號 + + + + Type a record number in this area and click the Go to: button to display the record in the database view + 在這個區域中輸入一個記錄編號,並點擊“轉到:”按鈕以在資料庫視圖中顯示記錄 + + + + 1 + 1 + + + Edit &Pragmas + 編輯雜注(&P) + + + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_auto_vacuum"><span style=" text-decoration: underline; color:#0000ff;">Auto Vacuum</span></a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_auto_vacuum"><span style=" text-decoration: underline; color:#0000ff;">自動真空</span></a></p></body></html> + + + None + + + + Full + 完整 + + + Incremental + 增加 + + + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_automatic_index"><span style=" text-decoration: underline; color:#0000ff;">Automatic Index</span></a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_automatic_index"><span style=" text-decoration: underline; color:#0000ff;">自動化索引</span></a></p></body></html> + + + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_checkpoint_fullfsync"><span style=" text-decoration: underline; color:#0000ff;">Checkpoint Full FSYNC</span></a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_checkpoint_fullfsync"><span style=" text-decoration: underline; color:#0000ff;">檢查點完全 FSYNC</span></a></p></body></html> + + + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_foreign_keys"><span style=" text-decoration: underline; color:#0000ff;">Foreign Keys</span></a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_foreign_keys"><span style=" text-decoration: underline; color:#0000ff;">外鍵</span></a></p></body></html> + + + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_fullfsync"><span style=" text-decoration: underline; color:#0000ff;">Full FSYNC</span></a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_fullfsync"><span style=" text-decoration: underline; color:#0000ff;">完全 FSYNC</span></a></p></body></html> + + + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_ignore_check_constraints"><span style=" text-decoration: underline; color:#0000ff;">Ignore Check Constraints</span></a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_ignore_check_constraints"><span style=" text-decoration: underline; color:#0000ff;">忽略檢查約束</span></a></p></body></html> + + + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_journal_mode"><span style=" text-decoration: underline; color:#0000ff;">Journal Mode</span></a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_journal_mode"><span style=" text-decoration: underline; color:#0000ff;">日誌模式</span></a></p></body></html> + + + Delete + 刪除 + + + Truncate + 裁截 + + + Persist + 永久 - - This button deletes the record currently selected in the database - 這個按鈕刪除在資料庫中目前選擇的記錄 + Memory + 記憶體 - - Delete Record - 刪除記錄 + WAL + WAL - - This is the database view. You can double-click any record to edit its contents in the cell editor window. - 這是資料庫視圖。您可以按兩下任何記錄,在儲存格編輯器視窗中編輯記錄內容。 + Off + - - < - < + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_journal_size_limit"><span style=" text-decoration: underline; color:#0000ff;">Journal Size Limit</span></a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_journal_size_limit"><span style=" text-decoration: underline; color:#0000ff;">日誌大小限制</span></a></p></body></html> - - 0 - 0 of 0 - 0 - 0 / 0 + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_locking_mode"><span style=" text-decoration: underline; color:#0000ff;">Locking Mode</span></a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_locking_mode"><span style=" text-decoration: underline; color:#0000ff;">鎖定模式</span></a></p></body></html> - - > - > + Normal + 正常 - Scroll 100 records upwards - 上滾 100 條記錄 + Exclusive + 獨佔 - - DB Browser for SQLite + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_max_page_count"><span style=" text-decoration: underline; color:#0000ff;">Max Page Count</span></a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_max_page_count"><span style=" text-decoration: underline; color:#0000ff;">最大頁數</span></a></p></body></html> + + + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_page_size"><span style=" text-decoration: underline; color:#0000ff;">Page Size</span></a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_page_size"><span style=" text-decoration: underline; color:#0000ff;">頁面大小</span></a></p></body></html> + + + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_recursive_triggers"><span style=" text-decoration: underline; color:#0000ff;">Recursive Triggers</span></a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_recursive_triggers"><span style=" text-decoration: underline; color:#0000ff;">遞迴觸發器</span></a></p></body></html> + + + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_secure_delete"><span style=" text-decoration: underline; color:#0000ff;">Secure Delete</span></a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_secure_delete"><span style=" text-decoration: underline; color:#0000ff;">安全刪除</span></a></p></body></html> + + + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_synchronous"><span style=" text-decoration: underline; color:#0000ff;">Synchronous</span></a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_synchronous"><span style=" text-decoration: underline; color:#0000ff;">同步</span></a></p></body></html> + + + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_temp_store"><span style=" text-decoration: underline; color:#0000ff;">Temp Store</span></a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_temp_store"><span style=" text-decoration: underline; color:#0000ff;">臨時存儲</span></a></p></body></html> + + + Default + 預設 + + + File + 檔案 + + + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_user_version"><span style=" text-decoration: underline; color:#0000ff;">User Version</span></a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_user_version"><span style=" text-decoration: underline; color:#0000ff;">用戶版本</span></a></p></body></html> + + + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_wal_autocheckpoint"><span style=" text-decoration: underline; color:#0000ff;">WAL Auto Checkpoint</span></a></p></body></html> + <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_wal_autocheckpoint"><span style=" text-decoration: underline; color:#0000ff;">WAL 自動檢查點</span></a></p></body></html> + + + + Open an existing database file in read only mode - - &Table: + + Unlock view editing - - Clear all filters + + This unlocks the current view for editing. However, you will need appropriate triggers for editing. - - <html><head/><body><p>Scroll to the beginning</p></body></html> + E&xecute SQL + 執行 SQL(&X) + + + + &File + 檔案(&F) + + + + &Import + 匯入(&I) + + + + &Export + 匯出(&E) + + + + &Edit + 編輯(&E) + + + + &View + 查看(&V) + + + + &Help + 幫助(&H) + + + + Edit Database &Cell - - <html><head/><body><p>Clicking this button navigates to the beginning in the table view above.</p></body></html> + + DB Sche&ma - - |< + + &Remote - <html><head/><body><p>Clicking this button navigates 100 records upwards in the table view above.</p></body></html> - <html><head/><body><p>點擊這個按鈕在上面的資料表視圖中向上導航 100 條記錄。</p></body></html> + + Execute current line + - <html><head/><body><p>Scroll 100 records downwards</p></body></html> - <html><head/><body><p>下滾 100 條記錄</p></body></html> + + This button executes the SQL statement present in the current editor line + - <html><head/><body><p>Clicking this button navigates 100 records downwards in the table view above.</p></body></html> - <html><head/><body><p>點擊這個按鈕在上面的資料表視圖中向下導航 100 條記錄。</p></body></html> + + Shift+F5 + Shift+F5 - - Scroll to the end + + + Save SQL file as - - <html><head/><body><p>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Clicking this button navigates up to the end in the table view above.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</p></body></html> + + This button saves the content of the current SQL editor tab to a file - - >| + + &Browse Table - - <html><head/><body><p>Click here to jump to the specified record</p></body></html> - <html><head/><body><p>點擊這裡跳到指定的記錄</p></body></html> + + Copy Create statement + - - <html><head/><body><p>This button is used to navigate to the record number specified in the Go to area.</p></body></html> - <html><head/><body><p>這個按鈕用於導航到在“轉到”區域中指定的記錄編號。</p></body></html> + + Copy the CREATE statement of the item to the clipboard + - - Go to: - 轉到: + + Edit display format + - - Enter record number to browse - 輸入要瀏覽的記錄編號 + + Edit the display format of the data in this column + - - Type a record number in this area and click the Go to: button to display the record in the database view - 在這個區域中輸入一個記錄編號,並點擊“轉到:”按鈕以在資料庫視圖中顯示記錄 + + Show rowid column + - - 1 - 1 + + Toggle the visibility of the rowid column + - Edit &Pragmas - 編輯雜注(&P) + + + Set encoding + - - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_auto_vacuum"><span style=" text-decoration: underline; color:#0000ff;">Auto Vacuum</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_auto_vacuum"><span style=" text-decoration: underline; color:#0000ff;">自動真空</span></a></p></body></html> + + Change the encoding of the text in the table cells + + + + + Set encoding for all tables + + + + + Change the default encoding assumed for all tables in the database + + + + toolBar + toolBar + + + SQL Log + SQL 日誌 + + + &Show SQL submitted by + 顯示 SQL 提交自(&S) + + + + User + 用戶 + + + + Application + 應用程式 + + + + &Clear + 清除(&C) + + + Plot + 圖表 + + + Columns + 列列 + + + X + X + + + Y + Y + + + _ + _ + + + Save current plot... + 儲存目前圖表... + + + + &New Database... + 新建資料庫(&N)... + + + + + Create a new database file + 建立一個新的資料庫檔 + + + + This option is used to create a new database file. + 這個選項用於建立一個新的資料庫檔案。 + + + + Ctrl+N + Ctrl+N + + + + + &Open Database... + 打開資料庫(&O)... + + + + + + + + Open an existing database file + 打開一個現有的資料庫檔 + + + + + + This option is used to open an existing database file. + 這個選項用於打開一個現有的資料庫檔案。 + + + + + Ctrl+O + Ctrl+O + + + + &Close Database + 關閉資料庫(&C) + + + + Ctrl+W + Ctrl+W + + + Revert Changes + 復原修改 + + + + + Revert database to last saved state + 把資料庫退回到先前儲存的狀態 + + + + This option is used to revert the current database file to its last saved state. All changes made since the last save operation are lost. + 這個選項用於倒退目前的資料庫檔為它最後的儲存狀態。從最後儲存操作開始做出的所有修改將會遺失。 - - None - + Write Changes + 寫入修改 - - - Full - 完整 + + + Write changes to the database file + 把修改寫入到資料庫檔 - - Incremental - 增加 + + This option is used to save changes to the database file. + 這個選項用於儲存修改到資料庫檔案。 - - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_automatic_index"><span style=" text-decoration: underline; color:#0000ff;">Automatic Index</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_automatic_index"><span style=" text-decoration: underline; color:#0000ff;">自動化索引</span></a></p></body></html> + + Ctrl+S + Ctrl+S - - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_checkpoint_fullfsync"><span style=" text-decoration: underline; color:#0000ff;">Checkpoint Full FSYNC</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_checkpoint_fullfsync"><span style=" text-decoration: underline; color:#0000ff;">檢查點完全 FSYNC</span></a></p></body></html> + Compact Database + 壓縮資料庫 - - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_foreign_keys"><span style=" text-decoration: underline; color:#0000ff;">Foreign Keys</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_foreign_keys"><span style=" text-decoration: underline; color:#0000ff;">外鍵</span></a></p></body></html> + + Compact the database file, removing space wasted by deleted records + 壓縮資料庫檔,通過刪除記錄去掉浪費的空間 - - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_fullfsync"><span style=" text-decoration: underline; color:#0000ff;">Full FSYNC</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_fullfsync"><span style=" text-decoration: underline; color:#0000ff;">完全 FSYNC</span></a></p></body></html> + + + Compact the database file, removing space wasted by deleted records. + 壓縮資料庫檔,通過刪除記錄去掉浪費的空間。 - - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_ignore_check_constraints"><span style=" text-decoration: underline; color:#0000ff;">Ignore Check Constraints</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_ignore_check_constraints"><span style=" text-decoration: underline; color:#0000ff;">忽略檢查約束</span></a></p></body></html> + + E&xit + 退出(&X) - - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_journal_mode"><span style=" text-decoration: underline; color:#0000ff;">Journal Mode</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_journal_mode"><span style=" text-decoration: underline; color:#0000ff;">日誌模式</span></a></p></body></html> + + Ctrl+Q + Ctrl+Q - - Delete - 刪除 + Database from SQL file... + 來自 SQL 檔案的資料庫... - - Truncate - 裁截 + + Import data from an .sql dump text file into a new or existing database. + 從一個 .sql 轉儲文字檔中匯入資料到一個新的或已有的資料庫。 - - Persist - 永久 + + This option lets you import data from an .sql dump text file into a new or existing database. SQL dump files can be created on most database engines, including MySQL and PostgreSQL. + 這個選項讓你從一個 .sql 轉儲文字檔中匯入資料到一個新的或現有的資料庫。SQL 轉儲檔可以在大多數資料庫引擎上建立,包括 MySQL 和 PostgreSQL。 - - - Memory - 記憶體 + Table from CSV file... + 資料表來自 CSV 檔案... - - WAL - WAL + + Open a wizard that lets you import data from a comma separated text file into a database table. + 打開一個引導精靈讓您從一個逗號間隔的文字檔匯入資料到一個資料庫資料表中。 - - - Off - + + Open a wizard that lets you import data from a comma separated text file into a database table. CSV files can be created on most database and spreadsheet applications. + 打開一個引導精靈讓您從一個逗號間隔的文字檔匯入資料到一個資料庫資料表中。CSV 檔可以在大多數資料庫和試算資料表應用程式上建立。 - - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_journal_size_limit"><span style=" text-decoration: underline; color:#0000ff;">Journal Size Limit</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_journal_size_limit"><span style=" text-decoration: underline; color:#0000ff;">日誌大小限制</span></a></p></body></html> + Database to SQL file... + 資料庫到 SQL 檔案... - - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_locking_mode"><span style=" text-decoration: underline; color:#0000ff;">Locking Mode</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_locking_mode"><span style=" text-decoration: underline; color:#0000ff;">鎖定模式</span></a></p></body></html> + + Export a database to a .sql dump text file. + 匯出一個資料庫導一個 .sql 轉儲文字檔案。 - - - Normal - 正常 + + This option lets you export a database to a .sql dump text file. SQL dump files contain all data necessary to recreate the database on most database engines, including MySQL and PostgreSQL. + 這個選項讓你匯出一個資料庫導一個 .sql 轉儲文字檔案。SQL 轉儲檔包含在大多數資料庫引擎上(包括 MySQL 和 PostgreSQL)重新建立資料庫所需的所有資料。 - - Exclusive - 獨佔 + Table as CSV file... + 資料表為 CSV 檔案... - - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_max_page_count"><span style=" text-decoration: underline; color:#0000ff;">Max Page Count</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_max_page_count"><span style=" text-decoration: underline; color:#0000ff;">最大頁數</span></a></p></body></html> + + Export a database table as a comma separated text file. + 匯出一個資料庫資料表為逗號間隔的文字檔案。 - - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_page_size"><span style=" text-decoration: underline; color:#0000ff;">Page Size</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_page_size"><span style=" text-decoration: underline; color:#0000ff;">頁面大小</span></a></p></body></html> + + Export a database table as a comma separated text file, ready to be imported into other database or spreadsheet applications. + 匯出一個資料庫資料表為逗號間隔的文字檔,準備好被匯入到其他資料庫或試算資料表應用程式。 - - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_recursive_triggers"><span style=" text-decoration: underline; color:#0000ff;">Recursive Triggers</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_recursive_triggers"><span style=" text-decoration: underline; color:#0000ff;">遞迴觸發器</span></a></p></body></html> + Create Table... + 建立資料表... - - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_secure_delete"><span style=" text-decoration: underline; color:#0000ff;">Secure Delete</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_secure_delete"><span style=" text-decoration: underline; color:#0000ff;">安全刪除</span></a></p></body></html> + + Open the Create Table wizard, where it is possible to define the name and fields for a new table in the database + 打開“建立資料表”引導精靈,在那裡可以定義在資料庫中的一個新資料表的名稱和欄位 - - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_synchronous"><span style=" text-decoration: underline; color:#0000ff;">Synchronous</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_synchronous"><span style=" text-decoration: underline; color:#0000ff;">同步</span></a></p></body></html> + Delete Table... + 刪除資料表... - - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_temp_store"><span style=" text-decoration: underline; color:#0000ff;">Temp Store</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_temp_store"><span style=" text-decoration: underline; color:#0000ff;">臨時存儲</span></a></p></body></html> + + Open the Delete Table wizard, where you can select a database table to be dropped. + 打開“刪除資料表”引導精靈,在那裡你可以選擇要丟棄的一個資料庫資料表。 - - Default - 預設 + Modify Table... + 修改資料表... - - File - 檔案 + + Open the Modify Table wizard, where it is possible to rename an existing table. It is also possible to add or delete fields form a table, as well as modify field names and types. + 打開“修改資料表”引導精靈,在其中可以重命名一個現有的資料表。也可以從一個資料表中加入或刪除欄位,以及修改欄位名稱和類型。 - - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_user_version"><span style=" text-decoration: underline; color:#0000ff;">User Version</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_user_version"><span style=" text-decoration: underline; color:#0000ff;">用戶版本</span></a></p></body></html> + Create Index... + 建立索引... - - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_wal_autocheckpoint"><span style=" text-decoration: underline; color:#0000ff;">WAL Auto Checkpoint</span></a></p></body></html> - <html><head/><body><p><a href="http://www.sqlite.org/pragma.html#pragma_wal_autocheckpoint"><span style=" text-decoration: underline; color:#0000ff;">WAL 自動檢查點</span></a></p></body></html> + + Open the Create Index wizard, where it is possible to define a new index on an existing database table. + 打開“建立索引”引導精靈,在那裡可以在一個現有的資料庫資料表上定義一個新索引。 - - &Open Database Read Only... - + + &Preferences... + 偏好選項(&P)... - - Open an existing database file in read only mode - + + + Open the preferences window. + 打開首選項視窗。 - - Unlock view editing - + + &DB Toolbar + 資料庫工具列(&D) - - This unlocks the current view for editing. However, you will need appropriate triggers for editing. - + + Shows or hides the Database toolbar. + 顯示或隱藏資料庫工具列。 - E&xecute SQL - 執行 SQL(&X) + What's This? + 這是什麼? - - &File - 檔案(&F) + + Shift+F1 + Shift+F1 - - &Import - 匯入(&I) + &About... + 關於(&A)... - - &Export - 匯出(&E) + + &Recently opened + 最近打開(&R) - - &Edit - 編輯(&E) + + Open &tab + 打開標籤頁(&T) - - &View - 查看(&V) + + + Ctrl+T + Ctrl+T - - &Help - 幫助(&H) + + Database Structure + - - Edit Database &Cell + + This is the structure of the opened database. +You can drag SQL statements from an object row and drop them into other applications or into another instance of 'DB Browser for SQLite'. + - - DB Sche&ma + + Browse Data - - &Remote + + Refresh the data in the selected table - - Execute SQL [F5, Ctrl+Return, Ctrl+R] + + This button clears all the filters set in the header input fields for the currently browsed table. - - Execute current line [Shift+F5] + + Save the table as currently displayed - - Shift+F5 - Shift+F5 + + <html><head/><body><p>This popup menu provides the following options applying to the currently browsed and filtered table:</p><ul style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;"><li style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Export to CSV: this option exports the data of the browsed table as currently displayed (after filters, display formats and order column) to a CSV file.</li><li style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Save as view: this option saves the current setting of the browsed table (filters, display formats and order column) as an SQL view that you can later browse or use in SQL statements.</li></ul></body></html> + - - Sa&ve Project - + + ... + ... - - Open &Project + + Print currently browsed table data - - &Attach Database + + Print currently browsed table data. Print selection if more than one cell is selected. - - &Set Encryption + + <html><head/><body><p>This button creates a new record in the database. Hold the mouse button to open a pop-up menu of different options:</p><ul><li><span style=" font-weight:600;">New Record</span>: insert a new record with default values in the database.</li><li><span style=" font-weight:600;">Insert Values...</span>: open a dialog for entering values before they are inserted in the database. This allows to enter values acomplishing the different constraints. This dialog is also open if the <span style=" font-weight:600;">New Record</span> option fails due to these constraints.</li></ul></body></html> - - - Save SQL file as + + This button deletes the record or records currently selected in the table - - &Browse Table + + This is the database table view. You can do the following actions: + - Start writing for editing inline the value. + - Double-click any record to edit its contents in the cell editor window. + - Alt+Del for deleting the cell content to NULL. + - Ctrl+" for duplicating the current record. + - Ctrl+' for copying the value from the cell above. + - Standard selection and copy/paste operations. - - Copy Create statement + + Scroll one page upwards - - Copy the CREATE statement of the item to the clipboard + + <html><head/><body><p>Clicking this button navigates one page of records upwards in the table view above.</p></body></html> - - Edit display format + + Scroll one page downwards - - Edit the display format of the data in this column + + <html><head/><body><p>Clicking this button navigates one page of records downwards in the table view above.</p></body></html> - - Show rowid column + + Edit Pragmas - - Toggle the visibility of the rowid column + + <html><head/><body><p><a href="https://www.sqlite.org/pragma.html#pragma_case_sensitive_like">Case Sensitive Like</a></p></body></html> - - - Set encoding + + Warning: this pragma is not readable and this value has been inferred. Writing the pragma might overwrite a redefined LIKE provided by an SQLite extension. - - Change the encoding of the text in the table cells + + Execute SQL - - Set encoding for all tables + + &Tools - - Change the default encoding assumed for all tables in the database + + DB Toolbar - toolBar - toolBar + + SQL &Log + - SQL Log - SQL 日誌 + + Show S&QL submitted by + - &Show SQL submitted by - 顯示 SQL 提交自(&S) + + This button clears the contents of the SQL logs + - - User - 用戶 + + This panel lets you examine a log of all SQL commands issued by the application or by yourself + - - Application - 應用程式 + + &Plot + - - &Clear - 清除(&C) + + This is the structure of the opened database. +You can drag multiple object names from the Name column and drop them into the SQL editor and you can adjust the properties of the dropped names using the context menu. This would help you in composing SQL statements. +You can drag SQL statements from the Schema column and drop them into the SQL editor or into other applications. + + - Plot - 圖表 + + + Project Toolbar + - Columns - 列列 + + Extra DB toolbar + - X - X + + + + Close the current database file + - Y - Y + + This button closes the connection to the currently open database file + - _ - _ + + &Revert Changes + - Save current plot... - 儲存目前圖表... + + &Write Changes + - - &New Database... - 新建資料庫(&N)... + + Compact &Database... + - - - Create a new database file - 建立一個新的資料庫檔 + + Execute all/selected SQL + - - This option is used to create a new database file. - 這個選項用於建立一個新的資料庫檔案。 + + This button executes the currently selected SQL statements. If no text is selected, all SQL statements are executed. + - - Ctrl+N - Ctrl+N + + This button opens a file containing SQL statements and loads it in a new editor tab + - - &Open Database... - 打開資料庫(&O)... + + &Load Extension... + - - - - Open an existing database file - 打開一個現有的資料庫檔 + + &Wiki + - - - This option is used to open an existing database file. - 這個選項用於打開一個現有的資料庫檔案。 + + Bug &Report... + - - Ctrl+O - Ctrl+O + + Feature Re&quest... + - - &Close Database - 關閉資料庫(&C) + + Web&site + - - Ctrl+W - Ctrl+W + + &Donate on Patreon... + - Revert Changes - 復原修改 + + Sa&ve Project... + - - Revert database to last saved state - 把資料庫退回到先前儲存的狀態 + + This button lets you save all the settings associated to the open DB to a DB4S project file + - - This option is used to revert the current database file to its last saved state. All changes made since the last save operation are lost. - 這個選項用於倒退目前的資料庫檔為它最後的儲存狀態。從最後儲存操作開始做出的所有修改將會遺失。 + + Open &Project... + - Write Changes - 寫入修改 + + This button lets you open a DB4S project file + - - Write changes to the database file - 把修改寫入到資料庫檔 + + &Attach Database... + - - This option is used to save changes to the database file. - 這個選項用於儲存修改到資料庫檔案。 + + + Add another database file to the current database connection + - - Ctrl+S - Ctrl+S + + This button lets you add another database file to the current database connection + - Compact Database - 壓縮資料庫 + + &Set Encryption... + - - Compact the database file, removing space wasted by deleted records - 壓縮資料庫檔,通過刪除記錄去掉浪費的空間 + + SQLCipher &FAQ + - - - Compact the database file, removing space wasted by deleted records. - 壓縮資料庫檔,通過刪除記錄去掉浪費的空間。 + + Table(&s) to JSON... + - - E&xit - 退出(&X) + + Open Data&base Read Only... + - - Ctrl+Q - Ctrl+Q + + Save results + - Database from SQL file... - 來自 SQL 檔案的資料庫... + + Save the results view + - - Import data from an .sql dump text file into a new or existing database. - 從一個 .sql 轉儲文字檔中匯入資料到一個新的或已有的資料庫。 + + This button lets you save the results of the last executed query + - - This option lets you import data from an .sql dump text file into a new or existing database. SQL dump files can be created on most database engines, including MySQL and PostgreSQL. - 這個選項讓你從一個 .sql 轉儲文字檔中匯入資料到一個新的或現有的資料庫。SQL 轉儲檔可以在大多數資料庫引擎上建立,包括 MySQL 和 PostgreSQL。 + + Find text in SQL editor + - Table from CSV file... - 資料表來自 CSV 檔案... + + Find text in SQL editor + - - Open a wizard that lets you import data from a comma separated text file into a database table. - 打開一個引導精靈讓您從一個逗號間隔的文字檔匯入資料到一個資料庫資料表中。 + + This button opens the search bar of the editor + - - Open a wizard that lets you import data from a comma separated text file into a database table. CSV files can be created on most database and spreadsheet applications. - 打開一個引導精靈讓您從一個逗號間隔的文字檔匯入資料到一個資料庫資料表中。CSV 檔可以在大多數資料庫和試算資料表應用程式上建立。 + + Ctrl+F + - Database to SQL file... - 資料庫到 SQL 檔案... + + Find or replace text in SQL editor + - - Export a database to a .sql dump text file. - 匯出一個資料庫導一個 .sql 轉儲文字檔案。 + + Find or replace text in SQL editor + - - This option lets you export a database to a .sql dump text file. SQL dump files contain all data necessary to recreate the database on most database engines, including MySQL and PostgreSQL. - 這個選項讓你匯出一個資料庫導一個 .sql 轉儲文字檔案。SQL 轉儲檔包含在大多數資料庫引擎上(包括 MySQL 和 PostgreSQL)重新建立資料庫所需的所有資料。 + + This button opens the find/replace dialog for the current editor tab + - Table as CSV file... - 資料表為 CSV 檔案... + + + Export to &CSV + 匯出到 &CSV - - Export a database table as a comma separated text file. - 匯出一個資料庫資料表為逗號間隔的文字檔案。 + + + Save as &view + 儲存為視圖(&V) - - Export a database table as a comma separated text file, ready to be imported into other database or spreadsheet applications. - 匯出一個資料庫資料表為逗號間隔的文字檔,準備好被匯入到其他資料庫或試算資料表應用程式。 + + Save as view + 儲存為視圖 - Create Table... - 建立資料表... + + Hide column(s) + - - Open the Create Table wizard, where it is possible to define the name and fields for a new table in the database - 打開“建立資料表”引導精靈,在那裡可以定義在資料庫中的一個新資料表的名稱和欄位 + + Hide selected column(s) + - Delete Table... - 刪除資料表... + + Show all columns + - - Open the Delete Table wizard, where you can select a database table to be dropped. - 打開“刪除資料表”引導精靈,在那裡你可以選擇要丟棄的一個資料庫資料表。 + + Show all columns that were hidden + - Modify Table... - 修改資料表... + + Shows or hides the Project toolbar. + - - Open the Modify Table wizard, where it is possible to rename an existing table. It is also possible to add or delete fields form a table, as well as modify field names and types. - 打開“修改資料表”引導精靈,在其中可以重命名一個現有的資料表。也可以從一個資料表中加入或刪除欄位,以及修改欄位名稱和類型。 + + Extra DB Toolbar + - Create Index... - 建立索引... + + + Export the filtered data to CSV + - - Open the Create Index wizard, where it is possible to define a new index on an existing database table. - 打開“建立索引”引導精靈,在那裡可以在一個現有的資料庫資料表上定義一個新索引。 + + This button exports the data of the browsed table as currently displayed (after filters, display formats and order column) as a CSV file. + - - &Preferences... - 偏好選項(&P)... + + + Save the current filter, sort column and display formats as a view + - - - Open the preferences window. - 打開首選項視窗。 + + This button saves the current setting of the browsed table (filters, display formats and order column) as an SQL view that you can later browse or use in SQL statements. + - - &DB Toolbar - 資料庫工具列(&D) + + Insert Values... + - - Shows or hides the Database toolbar. - 顯示或隱藏資料庫工具列。 + + + Open a dialog for inserting values in a new record + - What's This? - 這是什麼? + + + Insert new record using default values in browsed table + - - Shift+F1 - Shift+F1 + + New In-&Memory Database + - - &About... - 關於(&A)... + + Drag && Drop Qualified Names + - - &Recently opened - 最近打開(&R) + + + Use qualified names (e.g. "Table"."Field") when dragging the objects and dropping them into the editor + - - Open &tab - 打開標籤頁(&T) + + Drag && Drop Enquoted Names + - - - Ctrl+T - Ctrl+T + + + Use escaped identifiers (e.g. "Table1") when dragging the objects and dropping them into the editor + - - Database Structure + + &Integrity Check - - Browse Data + + Runs the integrity_check pragma over the opened database and returns the results in the Execute SQL tab. This pragma does an integrity check of the entire database. - - Scroll one page upwards + + &Foreign-Key Check - - <html><head/><body><p>Clicking this button navigates one page of records upwards in the table view above.</p></body></html> + + Runs the foreign_key_check pragma over the opened database and returns the results in the Execute SQL tab - - Scroll one page downwards + + &Quick Integrity Check - - <html><head/><body><p>Clicking this button navigates one page of records downwards in the table view above.</p></body></html> + + Run a quick integrity check over the open DB - - Edit Pragmas + + Runs the quick_check pragma over the opened database and returns the results in the Execute SQL tab. This command does most of the checking of PRAGMA integrity_check but runs much faster. - - Execute SQL + + &Optimize - - DB Toolbar + + Attempt to optimize the database - - SQL &Log + + Runs the optimize pragma over the opened database. This pragma might perform optimizations that will improve the performance of future queries. - - Show S&QL submitted by + + + Print - - &Plot + + Print text from current SQL editor tab - - &Revert Changes + + Open a dialog for printing the text in the current SQL editor tab - - &Write Changes + + Print the structure of the opened database - - Compact &Database + + Open a dialog for printing the structure of the opened database - + &Database from SQL file... - + &Table from CSV file... - + &Database to SQL file... - + &Table(s) as CSV file... - + &Create Table... - + &Delete Table... - + &Modify Table... - + Create &Index... - + W&hat's This? - - &Execute SQL - 執行 SQL(&E) + + &About + - Execute SQL [F5, Ctrl+Return] - 執行 SQL [F5, Ctrl+ Enter] + + This button opens a new tab for the SQL editor + - - &Load extension - + + &Execute SQL + 執行 SQL(&E) + + + Execute SQL + 執行 SQL - &Wiki... - 維基百科(&W)... + 維基百科(&W)... - Bug &report... - 錯誤報告(&R)... + 錯誤報告(&R)... - Web&site... - 網站(&S)... + 網站(&S)... Save Project 儲存專案 - - + + Save the current session to a file 儲存目前會話到一個檔案 @@ -2418,13 +3617,13 @@ 打開專案 - - + + Load a working session from a file 從一個檔載入工作會話 - + Open SQL file 打開 SQL 檔案 @@ -2433,9 +3632,9 @@ <html><head/><body><p>儲存目前圖表...</p><p>檔案格式按副檔名選擇(png, jpg, pdf, bmp)</p></body></html> - - - + + + Save SQL file 儲存 SQL 檔案 @@ -2444,140 +3643,137 @@ 載入擴充套件 - + Execute current line 執行目前行 - Execute current line [Ctrl+E] - 執行目前行 [Ctrl+E] + Execute current line + 執行目前行 - + Ctrl+E Ctrl+E - + Export as CSV file 匯出為 CSV 檔案 - + Export table as comma separated values file 匯出資料表為逗號間隔值檔案 - + Ctrl+L Ctrl+L - + Ctrl+P Ctrl+P - + Database encoding 資料庫編碼 - - + + Choose a database file 選擇一個資料庫檔案 - + Ctrl+Return Ctrl+Return - + Ctrl+D - + Ctrl+I - + Encrypted - + Database is encrypted using SQLCipher - + Read only - + Database file is read only. Editing the database is disabled. - + Could not open database file. Reason: %1 - - - + + + Choose a filename to save under 選擇一個檔案名稱儲存 - Error adding record: - 加入記錄時出現錯誤: + 加入記錄時出現錯誤: - + Error deleting record: %1 刪除記錄時出現錯誤: %1 - + Please select a record first 請首先選擇一條記錄 - + %1 - %2 of %3 %1 - %2 / %3 - - + + There is no database opened. Please open or create a new database file. 沒有打開資料庫。請打開或建立一個新的資料庫檔案。 - Are you sure you want to delete the %1 '%2'? All data associated with the %1 will be lost. - 您是否確認您想刪除 %1 '%2'? + 您是否確認您想刪除 %1 '%2'? 所有和 %1 關聯的資料將會遺失。 - Error: could not delete the %1. Message from database engine: %2 - 錯誤: 無法刪除 %1。消息來自資料庫引擎: + 錯誤: 無法刪除 %1。消息來自資料庫引擎: %2 @@ -2585,56 +3781,56 @@ 沒有資料庫打開。 - - %1 rows returned in %2ms from: %3 - - - - + , %1 rows affected - - Query executed successfully: %1 (took %2ms%3) - - - - + Error while saving the database file. This means that not all changes to the database were saved. You need to resolve the following error first. %1 - + A new DB Browser for SQLite version is available (%1.%2.%3).<br/><br/>Please download at <a href='%4'>%4</a>. - - + + DB Browser for SQLite project file (*.sqbpro) - + Please choose a new encoding for this table. - + Please choose a new encoding for all tables. - + + Error checking foreign keys after table modification. The changes will be reverted. + + + + + This table did not pass a foreign-key check.<br/>You should run 'Tools | Foreign-Key Check' and fix the reported issues. + + + + %1 Leave the field empty for using the database encoding. - + This encoding is either not valid or not supported. @@ -2647,9 +3843,8 @@ %1 行返回自: %2 (耗時 %3毫秒) - Error executing query: %1 - 執行查詢時出現錯誤: %1 + 執行查詢時出現錯誤: %1 Query executed successfully: %1 (took %2ms) @@ -2660,17 +3855,16 @@ 選擇一個文字檔 - + Text files(*.csv *.txt);;All files(*) 文字檔案(*.csv *.txt);;所有擋檔案(*) - Import completed - 匯入完成 + 匯入完成 - + Are you sure you want to undo all changes made to the database file '%1' since the last save? 您是否確認您想撤銷從上次儲存以來對資料庫檔‘%1’做出的所有修改。? @@ -2691,173 +3885,365 @@ 匯出完成。 - + Choose a file to import 選擇要匯入的一個檔案 - - - + + + Text files(*.sql *.txt);;All files(*) 文字檔案(*.sql *.txt);;所有擋檔案(*) - + Do you want to create a new database file to hold the imported data? If you answer no we will attempt to import the data in the SQL file to the current database. 您是否確認您想建立一個新的資料庫檔用來存放匯入的資料? 如果您會到“否”的話,我們將嘗試匯入 SQL 檔中的資料到目前資料庫。 - + File %1 already exists. Please choose a different name. 檔案 %1 已存在。請選擇一個不同的名稱。 - + Error importing data: %1 匯入資料時出現錯誤: %1 - + Import completed. 匯入完成。 - - + Delete View 刪除視圖 - - + Delete Trigger 刪除觸發器 - - + Delete Index 刪除索引 - - - - Delete Table - 刪除資料表 + + + Delete Table + 刪除資料表 + + + + &%1 %2 + &%1 %2 + + + + Setting PRAGMA values will commit your current transaction. +Are you sure? + 設定 PRAGMA 值將會提交您的目前事務。. +您確認嗎? + + + + Execution aborted by user + + + + + In-Memory database + + + + + determining row count... + + + + + %1 - %2 of >= %3 + + + + + Are you sure you want to delete the table '%1'? +All data associated with the table will be lost. + + + + + Are you sure you want to delete the view '%1'? + + + + + Are you sure you want to delete the trigger '%1'? + + + + + Are you sure you want to delete the index '%1'? + + + + + Error: could not delete the table. + + + + + Error: could not delete the view. + + + + + Error: could not delete the trigger. + + + + + Error: could not delete the index. + + + + + Message from database engine: +%1 + + + + + Editing the table requires to save all pending changes now. +Are you sure you want to save the database? + + + + + -- EXECUTING SELECTION IN '%1' +-- + + + + + -- EXECUTING LINE IN '%1' +-- + + + + + -- EXECUTING ALL IN '%1' +-- + + + + + Setting PRAGMA values or vacuuming will commit your current transaction. +Are you sure? + + + + + executing query + - - &%1 %2 - &%1 %2 + + %1 rows returned in %2ms + - - Setting PRAGMA values will commit your current transaction. -Are you sure? - 設定 PRAGMA 值將會提交您的目前事務。. -您確認嗎? + + query executed successfully. Took %1ms%2 + - - Execution aborted by user + + -- At line %1: +%4 +-- Result: %3 - - Setting PRAGMA values or vacuuming will commit your current transaction. -Are you sure? + + Choose text files - - Choose text files + + Import completed. Some foreign key constraints are violated. Please fix them before saving. - - + Modify View - - + Modify Trigger - - + Modify Index - - + Modify Table - + Select SQL file to open 選擇要打開的 SQL 檔案 - + Couldn't read file: %1. - + Couldn't save file: %1. - + Select file name 選擇檔案名稱 - + Select extension file 選擇擴充套件檔 - + Extensions(*.so *.dll);;All files(*) 擴充套件(*.so *.dll);;所有擋檔案(*) - + Extension successfully loaded. 擴充套件成功載入。 - - + Error loading extension: %1 載入擴充套件時出現錯誤: %1 - + + Don't show again 不再顯示 - + New version available. 新版本可用。 - + + Choose a project file to open + + + + + This project file is using an old file format because it was created using DB Browser for SQLite version 3.10 or lower. Loading this file format is still fully supported but we advice you to convert all your project files to the new file format because support for older formats might be dropped at some point in the future. You can convert your files by simply opening and re-saving them. + + + + + Duplicate records + + + + + Duplicate record + + + + + Ctrl+" + + + + Please enter a pseudo-primary key in order to enable editing on this view. This should be the name of a unique column in the view. + + Collation needed! Proceed? + + + + + A table in this database requires a special collation function '%1' that this application can't provide without further knowledge. +If you choose to proceed, be aware bad things can happen to your database. +Create a backup! + + + + + creating collation + + + + + Set a new name for the SQL tab. Use the '&&' character to allow using the following character as a keyboard shortcut. + + + + + Please specify the view name + 請指定視圖名稱 + + + + There is already an object with that name. Please choose a different name. + 已有相同名稱的對象。請選擇一個不同的名稱。 + + + + View successfully created. + 成功建立視圖。 + + + + Error creating view: %1 + 建立視圖時出現錯誤: %1 + + + + There is no filter set for this table. View will not be created. + + + + + Delete Records + + + + + This action will open a new SQL tab for running: + + + + + Press Help for opening the corresponding SQLite reference page. + + + A new sqlitebrowser version is available (%1.%2.%3).<br/><br/>Please download at <a href='%4'>%4</a>. 有新版本的 sqlitebrowser (%1.%2.%3)可用。<br/><br/>請從 <a href='%4'>%4</a> 下載。 @@ -2870,9 +4256,8 @@ PNG(*.png);;JPG(*.jpg);;PDF(*.pdf);;BMP(*.bmp);;所有擋檔案(*) - Choose a file to open - 選擇要打開的一個檔案 + 選擇要打開的一個檔案 SQLiteBrowser project(*.sqbpro) @@ -2884,6 +4269,19 @@ + NullLineEdit + + + Set to NULL + + + + + Alt+Del + + + + PlotDock @@ -2891,182 +4289,263 @@ 圖表 - + + <html><head/><body><p>This pane shows the list of columns of the currently browsed table or the just executed query. You can select the columns that you want to be used as X or Y axis for the plot pane below. The table shows detected axis type that will affect the resulting plot. For the Y axis you can only select numeric columns, but for the X axis you will be able to select:</p><ul style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;"><li style=" margin-top:12px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Date/Time</span>: strings with format &quot;yyyy-MM-dd hh:mm:ss&quot; or &quot;yyyy-MM-ddThh:mm:ss&quot;</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Date</span>: strings with format &quot;yyyy-MM-dd&quot;</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Time</span>: strings with format &quot;hh:mm:ss&quot;</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Label</span>: other string formats. Selecting this column as X axis will produce a Bars plot with the column values as labels for the bars</li><li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Numeric</span>: integer or real values</li></ul><p>Double-clicking the Y cells you can change the used color for that graph.</p></body></html> + + + + Columns 列列 - + X X - + Y Y - _ - _ + _ + + + + Axis Type + + + + + Here is a plot drawn when you select the x and y values above. + +Click on points to select them in the plot and in the table. Ctrl+Click for selecting a range of points. + +Use mouse-wheel for zooming and mouse drag for changing the axis range. + +Select the axes or axes labels to drag and zoom only in that orientation. + - + Line type: - - + + None - + Line - + StepLeft - + StepRight - + StepCenter - + Impulse - + Point shape: - + Cross - + Plus - + Circle - + Disc - + Square - + Diamond - + Star - + Triangle - + TriangleInverted - + CrossSquare - + PlusSquare - + CrossCircle - + PlusCircle - + Peace - + <html><head/><body><p>Save current plot...</p><p>File format chosen by extension (png, jpg, pdf, bmp)</p></body></html> <html><head/><body><p>儲存目前圖表...</p><p>檔案格式按副檔名選擇(png, jpg, pdf, bmp)</p></body></html> - + Save current plot... 儲存目前圖表... - - Load all data. This has only an effect if not all data has been fetched from the table yet due to the partial fetch mechanism. + + + Load all data and redraw plot - - - + + + Row # - Choose a axis color - 選擇一個軸的顏色 + 選擇一個軸的顏色 + + + + Copy + + + + + Print... + + + + + Show legend + + + + + Stacked bars + + + + + Date/Time + + + + + Date + + + + + Time + + + + + + Numeric + + + + + Label + + + + + Invalid + + + + + Load all data and redraw plot. +Warning: not all data has been fetched from the table yet due to the partial fetch mechanism. + + + + + Choose an axis color + - + Choose a filename to save under 選擇一個檔案名稱儲存 - + PNG(*.png);;JPG(*.jpg);;PDF(*.pdf);;BMP(*.bmp);;All Files(*) PNG(*.png);;JPG(*.jpg);;PDF(*.pdf);;BMP(*.bmp);;所有擋檔案(*) - - Fetching all data... + + There are curves in this plot and the selected line style can only be applied to graphs sorted by X. Either sort the table or query by X to remove curves or select one of the styles supported by curves: None or Line. - Cancel - 取消 + 取消 @@ -3102,42 +4581,44 @@ - + Show remote options - + Automatic &updates - + &Database 資料庫(&D) - + Database &encoding 資料庫編碼(&E) - + Open databases with foreign keys enabled. 打開啟用了外鍵的資料庫。 - + &Foreign keys 外鍵(&F) - - - - - - + + + + + + + + enabled 啟用 @@ -3148,8 +4629,8 @@ - - + + ... ... @@ -3158,390 +4639,539 @@ 預取塊尺寸(&P) - + Remove line breaks in schema &view - + Prefetch block si&ze - + Advanced - + SQ&L to execute after opening database - + Default field type - + Data &Browser - + Font - + &Font - - Font si&ze: - - - - + Content - + Symbol limit in cell - - NULL fields - - - - - &Text - - - - - Field colors - - - - + NULL - + Regular - Text - 純文字檔案 + 純文字檔案 - + Binary 二進位 - + Background - + Filters - + Escape character - + Delay time (&ms) - + Set the waiting time before a new filter value is applied. Can be set to 0 for disabling waiting. - + &SQL &SQL - + Settings name 設定名稱 - + Context 上下文 - + Colour 顏色 - + Bold 粗體 - + Italic 斜體 - + Underline 底線 - + Keyword 關鍵字 - function - 函數 + 函數 - + Function 函數 - + Table 資料表 - + Comment 注釋 - + Identifier 識別符 - + String 字串 - currentline + 目前行 + + + + Current line 目前行 - - Current line - 目前行 + + SQL &editor font size + SQL 編輯器字體大小(&E) + + + SQL &log font size + SQL 日誌字體大小(&L) + + + + Tab size + + + + + SQL editor &font + + + + + Error indicators + + + + + Hori&zontal tiling + + + + + If enabled the SQL code editor and the result table view are shown side by side instead of one over the other. + + + + + Code co&mpletion + + + + + Toolbar style + + + + + Only display the icon + + + + + Only display the text + + + + + The text appears beside the icon + + + + + The text appears under the icon + + + + + Follow the style + + + + + DB file extensions + + + + + Manage + + + + + When enabled, the line breaks in the Schema column of the DB Structure tab, dock and printed output are removed. + + + + + Font si&ze + + + + + + This is the maximum number of rows in a table for enabling the value completion based on current values in the column. +Can be set to 0 for disabling completion. + + + + + Row count threshold for completion + + + + + Field display + + + + + Displayed &text + + + + + Text color + + + + + Background color + + + + + Preview only (N/A) + + + + + Foreground + + + + + SQL &results font size + + + + + &Wrap lines + + + + + Never + + + + + At word boundaries + + + + + At character boundaries + - - SQL &editor font size - SQL 編輯器字體大小(&E) + + At whitespace boundaries + - - SQL &log font size - SQL 日誌字體大小(&L) + + &Quotes for identifiers + - - Tab size + + Choose the quoting mechanism used by the application for identifiers in SQL code. - - SQL editor &font + + "Double quotes" - Standard SQL (recommended) - - Error indicators + + `Grave accents` - Traditional MySQL quotes - - Enabling error indicators highlights the SQL code lines that caused errors during the last execution + + [Square brackets] - Traditional MS SQL Server quotes - - Hori&zontal tiling + + Keywords in &UPPER CASE - - If enabled the SQL code editor and the result table view are shown side by side instead of one over the other. + + When set, the SQL keywords are completed in UPPER CASE letters. - - Code co&mpletion + + When set, the SQL code lines that caused errors during the last execution are highlighted and the results frame indicates the error in the background - + &Extensions 擴充套件(&E) - + Select extensions to load for every database: 選擇每個資料庫要載入的擴充套件: - + Add extension 加入擴充套件 - + Remove extension 刪除擴充套件 - + <html><head/><body><p>While supporting the REGEXP operator SQLite doesn't implement any regular expression<br/>algorithm but calls back the running application. DB Browser for SQLite implements this<br/>algorithm for you to let you use REGEXP out of the box. However, as there are multiple possible<br/>implementations of this and you might want to use another one, you're free to disable the<br/>application's implementation and load your own by using an extension. Requires restart of the application.</p></body></html> - + Disable Regular Expression extension - + + <html><head/><body><p>SQLite provides an SQL function for loading extensions from a shared library file. Activate this if you want to use the <span style=" font-style:italic;">load_extension()</span> function from SQL code.</p><p>For security reasons, extension loading is turned off by default and must be enabled through this setting. You can always load extensions through the GUI, even though this option is disabled.</p></body></html> + + + + + Allow loading extensions from SQL code + + + + Remote - + CA certificates - - + + Subject CN - + Common Name - + Subject O - + Organization - - + + Valid from - - + + Valid to - - + + Serial number - + Your certificates - + File 檔案 - + Subject Common Name - + Issuer CN - + Issuer Common Name - + Clone databases into - - + + Choose a directory 選擇一個目錄 - + The language will change after you restart the application. - + Select extension file 選擇擴充套件檔 - + Extensions(*.so *.dll);;All files(*) 擴充套件(*.so *.dll);;所有擋檔案(*) - + Import certificate file - + No certificates found in this file. - + Are you sure you want do remove this certificate? All certificate data will be deleted from the application settings! + + + Are you sure you want to clear all the saved settings? +All your preferences will be lost and default values will be used. + + QObject @@ -3570,23 +5200,28 @@ 正在匯出資料庫到 SQL 檔案... - + Error importing data - + from record number %1 - + . %1 - + + Importing CSV file... + + + + Cancel 取消 @@ -3665,9 +5300,8 @@ 無法取得類型 - Decoding CSV file... - 正在解析 CSV 檔... + 正在解析 CSV 檔... didn't receive any output from pragma %1 @@ -3686,83 +5320,81 @@ 找不到檔案。 - - Collation needed! Proceed? - - - - - A table in this database requires a special collation function '%1' that this application can't provide without further knowledge. -If you choose to proceed, be aware bad things can happen to your database. -Create a backup! + + All files (*) - - SQLite database files (*.db *.sqlite *.sqlite3 *.db3);;All files (*) + + SQLite database files (*.db *.sqlite *.sqlite3 *.db3) RemoteDatabase - + Error when connecting to %1. %2 - + Error opening remote file at %1. %2 - + Error: Invalid client certificate specified. - + Please enter the passphrase for this client certificate in order to authenticate. - + Cancel 取消 - + Uploading remote database to -%1. +%1 - + Downloading remote database from -%1. +%1 - - + + The remote database has been updated since the last checkout. Do you want to update the local database to the newest version? Note that this discards any changes you have made locally! If you don't want to lose local changes, click No to open the local version. + + + + + Error: The network is not accessible. - + Error: Cannot open the file for sending. - + Error opening local databases list. %1 - + Error creating local databases list. %1 @@ -3782,14 +5414,24 @@ + Connect to the remote server using the currently selected identity. The correct server is taken from the identity as well. + + + + Go - + Push currently opened database to server + + + <html><head/><body><p>In this pane, remote databases from dbhub.io website can be added to DB4S. First you need an identity:</p><ol style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;"><li style=" margin-top:12px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Login to the dbhub.io website (use your GitHub credentials or whatever you want)</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Click the button to create a DB4S certificate (that's your identity). That'll give you a certificate file (save it to your local disk).</li><li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Go to the Remote tab in DB4S Preferences. Click the button to add a new certificate to DB4S and choose the just downloaded certificate file.</li></ol><p>Now the Remote panel shows your identity and you can add remote databases.</p></body></html> + + RemoteModel @@ -3836,12 +5478,12 @@ - + Commit message - + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } @@ -3850,27 +5492,42 @@ - + Database licence - + Public - + + Branch + + + + + Force push + + + + Database will be public. Everyone has read access to it. - + Database will be private. Only you have access to it. - + + Use with care. This can cause remote commits to be deleted. + + + + Unspecified @@ -3883,313 +5540,486 @@ 表單 - + + Find previous match [Shift+F3] + + + + + Find previous match with mapping + + + + + Shift+F3 + Shift+F3 + + + + The found pattern must be a whole word + + + + + Whole Words + + + + + Text pattern to find considering the checks in this frame + + + + + Find in editor + + + + + The found pattern must match in letter case + + + + + Case Sensitive + + + + + Find next match [Enter, F3] + + + + + Find next match with wrapping + + + + + F3 + F3 + + + + Interpret search pattern as a regular expression + + + + + <html><head/><body><p>When checked, the pattern to find is interpreted as a UNIX regular expression. See <a href="https://en.wikibooks.org/wiki/Regular_Expressions">Regular Expression in Wikibooks</a>.</p></body></html> + + + + + Regular Expression + + + + + + Close Find Bar + + + + + Results of the last executed statements 最後執行語句的結果 - + This field shows the results and status codes of the last executed statements. 這個欄位顯示最後執行的語句的結果和狀態碼。 - Export to &CSV - 匯出到 &CSV + 匯出到 &CSV - Save as &view - 儲存為視圖(&V) + 儲存為視圖(&V) - Save as view - 儲存為視圖 + 儲存為視圖 - Please specify the view name - 請指定視圖名稱 + 請指定視圖名稱 - There is already an object with that name. Please choose a different name. - 已有相同名稱的對象。請選擇一個不同的名稱。 + 已有相同名稱的對象。請選擇一個不同的名稱。 - View successfully created. - 成功建立視圖。 + 成功建立視圖。 - Error creating view: %1 - 建立視圖時出現錯誤: %1 + 建立視圖時出現錯誤: %1 SqlUiLexer - + (X) The abs(X) function returns the absolute value of the numeric argument X. - + () The changes() function returns the number of database rows that were changed or inserted or deleted by the most recently completed INSERT, DELETE, or UPDATE statement. - + (X1,X2,...) The char(X1,X2,...,XN) function returns a string composed of characters having the unicode code point values of integers X1 through XN, respectively. - + (X,Y,...) The coalesce() function returns a copy of its first non-NULL argument, or NULL if all arguments are NULL - + (X,Y) The glob(X,Y) function is equivalent to the expression "Y GLOB X". - + (X,Y) The ifnull() function returns a copy of its first non-NULL argument, or NULL if both arguments are NULL. - + (X,Y) The instr(X,Y) function finds the first occurrence of string Y within string X and returns the number of prior characters plus 1, or 0 if Y is nowhere found within X. - + (X) The hex() function interprets its argument as a BLOB and returns a string which is the upper-case hexadecimal rendering of the content of that blob. - + () The last_insert_rowid() function returns the ROWID of the last row insert from the database connection which invoked the function. - + (X) For a string value X, the length(X) function returns the number of characters (not bytes) in X prior to the first NUL character. - + (X,Y) The like() function is used to implement the "Y LIKE X" expression. - + (X,Y,Z) The like() function is used to implement the "Y LIKE X ESCAPE Z" expression. - - (X) The load_extension(X) function loads SQLite extensions out of the shared library file named X. + + (X) The load_extension(X) function loads SQLite extensions out of the shared library file named X. +Use of this function must be authorized from Preferences. - - (X,Y) The load_extension(X) function loads SQLite extensions out of the shared library file named X using the entry point Y. + + (X,Y) The load_extension(X) function loads SQLite extensions out of the shared library file named X using the entry point Y. +Use of this function must be authorized from Preferences. - + (X) The lower(X) function returns a copy of string X with all ASCII characters converted to lower case. - + (X) ltrim(X) removes spaces from the left side of X. - + (X,Y) The ltrim(X,Y) function returns a string formed by removing any and all characters that appear in Y from the left side of X. - + (X,Y,...) The multi-argument max() function returns the argument with the maximum value, or return NULL if any argument is NULL. - + (X,Y,...) The multi-argument min() function returns the argument with the minimum value. - + (X,Y) The nullif(X,Y) function returns its first argument if the arguments are different and NULL if the arguments are the same. - + (FORMAT,...) The printf(FORMAT,...) SQL function works like the sqlite3_mprintf() C-language function and the printf() function from the standard C library. - + (X) The quote(X) function returns the text of an SQL literal which is the value of its argument suitable for inclusion into an SQL statement. - + () The random() function returns a pseudo-random integer between -9223372036854775808 and +9223372036854775807. - + (N) The randomblob(N) function return an N-byte blob containing pseudo-random bytes. - + (X,Y,Z) The replace(X,Y,Z) function returns a string formed by substituting string Z for every occurrence of string Y in string X. - + (X) The round(X) function returns a floating-point value X rounded to zero digits to the right of the decimal point. - + (X,Y) The round(X,Y) function returns a floating-point value X rounded to Y digits to the right of the decimal point. - + (X) rtrim(X) removes spaces from the right side of X. - + (X,Y) The rtrim(X,Y) function returns a string formed by removing any and all characters that appear in Y from the right side of X. - + (X) The soundex(X) function returns a string that is the soundex encoding of the string X. - + (X,Y) substr(X,Y) returns all characters through the end of the string X beginning with the Y-th. - + (X,Y,Z) The substr(X,Y,Z) function returns a substring of input string X that begins with the Y-th character and which is Z characters long. - + () The total_changes() function returns the number of row changes caused by INSERT, UPDATE or DELETE statements since the current database connection was opened. - + (X) trim(X) removes spaces from both ends of X. - + (X,Y) The trim(X,Y) function returns a string formed by removing any and all characters that appear in Y from both ends of X. - + (X) The typeof(X) function returns a string that indicates the datatype of the expression X. - + (X) The unicode(X) function returns the numeric unicode code point corresponding to the first character of the string X. - + (X) The upper(X) function returns a copy of input string X in which all lower-case ASCII characters are converted to their upper-case equivalent. - + (N) The zeroblob(N) function returns a BLOB consisting of N bytes of 0x00. - - - - + + + + (timestring,modifier,modifier,...) - + (format,timestring,modifier,modifier,...) - + (X) The avg() function returns the average value of all non-NULL X within a group. - + (X) The count(X) function returns a count of the number of times that X is not NULL in a group. - + (X) The group_concat() function returns a string which is the concatenation of all non-NULL values of X. - + (X,Y) The group_concat() function returns a string which is the concatenation of all non-NULL values of X. If parameter Y is present then it is used as the separator between instances of X. - + (X) The max() aggregate function returns the maximum value of all values in the group. - + (X) The min() aggregate function returns the minimum non-NULL value of all values in the group. - - + + (X) The sum() and total() aggregate functions return sum of all non-NULL values in the group. + + + () The number of the row within the current partition. Rows are numbered starting from 1 in the order defined by the ORDER BY clause in the window definition, or in arbitrary order otherwise. + + + + + () The row_number() of the first peer in each group - the rank of the current row with gaps. If there is no ORDER BY clause, then all rows are considered peers and this function always returns 1. + + + + + () The number of the current row's peer group within its partition - the rank of the current row without gaps. Partitions are numbered starting from 1 in the order defined by the ORDER BY clause in the window definition. If there is no ORDER BY clause, then all rows are considered peers and this function always returns 1. + + + + + () Despite the name, this function always returns a value between 0.0 and 1.0 equal to (rank - 1)/(partition-rows - 1), where rank is the value returned by built-in window function rank() and partition-rows is the total number of rows in the partition. If the partition contains only one row, this function returns 0.0. + + + + + () The cumulative distribution. Calculated as row-number/partition-rows, where row-number is the value returned by row_number() for the last peer in the group and partition-rows the number of rows in the partition. + + + + + (N) Argument N is handled as an integer. This function divides the partition into N groups as evenly as possible and assigns an integer between 1 and N to each group, in the order defined by the ORDER BY clause, or in arbitrary order otherwise. If necessary, larger groups occur first. This function returns the integer value assigned to the group that the current row is a part of. + + + + + (expr) Returns the result of evaluating expression expr against the previous row in the partition. Or, if there is no previous row (because the current row is the first), NULL. + + + + + (expr,offset) If the offset argument is provided, then it must be a non-negative integer. In this case the value returned is the result of evaluating expr against the row offset rows before the current row within the partition. If offset is 0, then expr is evaluated against the current row. If there is no row offset rows before the current row, NULL is returned. + + + + + + (expr,offset,default) If default is also provided, then it is returned instead of NULL if the row identified by offset does not exist. + + + + + (expr) Returns the result of evaluating expression expr against the next row in the partition. Or, if there is no next row (because the current row is the last), NULL. + + + + + (expr,offset) If the offset argument is provided, then it must be a non-negative integer. In this case the value returned is the result of evaluating expr against the row offset rows after the current row within the partition. If offset is 0, then expr is evaluated against the current row. If there is no row offset rows after the current row, NULL is returned. + + + + + (expr) This built-in window function calculates the window frame for each row in the same way as an aggregate window function. It returns the value of expr evaluated against the first row in the window frame for each row. + + + + + (expr) This built-in window function calculates the window frame for each row in the same way as an aggregate window function. It returns the value of expr evaluated against the last row in the window frame for each row. + + + + + (expr,N) This built-in window function calculates the window frame for each row in the same way as an aggregate window function. It returns the value of expr evaluated against the row N of the window frame. Rows are numbered within the window frame starting from 1 in the order defined by the ORDER BY clause if one is present, or in arbitrary order otherwise. If there is no Nth row in the partition, then NULL is returned. + + SqliteTableModel - + + reading rows + + + + + loading... + + + + References %1(%2) -Hold Ctrl+Shift and click to jump there +Hold %3Shift and click to jump there - + Error changing data: %1 修改資料庫時出現錯誤: %1 + + + retrieving list of columns + + + + + Fetching data... + + + + + Cancel + 取消 + VacuumDialog @@ -4200,13 +6030,21 @@ - Warning: Compacting the database will commit all changes you made. - 警告: 壓縮資料庫將會提交您做出的所有修改。 + Warning: Compacting the database will commit all of your changes. + + Please select the databases to co&mpact: + + + + Warning: Compacting the database will commit all changes you made. + 警告: 壓縮資料庫將會提交您做出的所有修改。 + + Please select the objects to compact: - 請選擇要壓縮的物件: + 請選擇要壓縮的物件: diff -Nru sqlitebrowser-3.10.100ubuntu1/src/translations/translations.qrc sqlitebrowser-3.11.1/src/translations/translations.qrc --- sqlitebrowser-3.10.100ubuntu1/src/translations/translations.qrc 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/src/translations/translations.qrc 2019-02-19 23:51:34.000000000 +0000 @@ -7,11 +7,13 @@ sqlb_fr.qm sqlb_zh.qm sqlb_zh_TW.qm + sqlb_pl.qm sqlb_pt_BR.qm sqlb_en_GB.qm sqlb_es_ES.qm sqlb_ko_KR.qm sqlb_tr.qm sqlb_uk_UA.qm + sqlb_it.qm diff -Nru sqlitebrowser-3.10.100ubuntu1/src/VacuumDialog.h sqlitebrowser-3.11.1/src/VacuumDialog.h --- sqlitebrowser-3.10.100ubuntu1/src/VacuumDialog.h 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/src/VacuumDialog.h 2019-02-19 23:51:34.000000000 +0000 @@ -15,14 +15,14 @@ public: explicit VacuumDialog(DBBrowserDB* _db, QWidget* parent = nullptr); - ~VacuumDialog(); + ~VacuumDialog() override; private: Ui::VacuumDialog* ui; DBBrowserDB* db; protected slots: - virtual void accept(); + void accept() override; }; #endif diff -Nru sqlitebrowser-3.10.100ubuntu1/src/version.h sqlitebrowser-3.11.1/src/version.h --- sqlitebrowser-3.10.100ubuntu1/src/version.h 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/src/version.h 2019-02-19 23:51:34.000000000 +0000 @@ -1,10 +1,16 @@ #ifndef GEN_VERSION_H #define GEN_VERSION_H #define MAJOR_VERSION 3 -#define MINOR_VERSION 10 +#define MINOR_VERSION 11 #define PATCH_VERSION 99 #define str(s) #s #define xstr(s) str(s) #define APP_VERSION xstr(MAJOR_VERSION) "." xstr(MINOR_VERSION) "." xstr(PATCH_VERSION) + +// If it is defined by the compiler, then it is a nightly build, and in the YYYYMMDD format. +#ifndef BUILD_VERSION + #define BUILD_VERSION 0 +#endif + #endif diff -Nru sqlitebrowser-3.10.100ubuntu1/src/winapp.rc sqlitebrowser-3.11.1/src/winapp.rc --- sqlitebrowser-3.10.100ubuntu1/src/winapp.rc 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/src/winapp.rc 2019-02-19 23:51:34.000000000 +0000 @@ -1 +1,30 @@ -IDI_ICON1 ICON DISCARDABLE "iconwin.ico" \ No newline at end of file +#include +#include "version.h" + +VS_VERSION_INFO VERSIONINFO +FILEVERSION MAJOR_VERSION, MINOR_VERSION, PATCH_VERSION, 0 +PRODUCTVERSION MAJOR_VERSION, MINOR_VERSION, PATCH_VERSION, 0 +FILEOS VOS_NT_WINDOWS32 +FILETYPE VFT_APP +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "000004B0" + BEGIN + VALUE "FileVersion", APP_VERSION "." xstr(BUILD_VERSION) + VALUE "ProductVersion", APP_VERSION "." xstr(BUILD_VERSION) + VALUE "FileDescription", "DB Browser for SQLite" + VALUE "ProductName", "DB Browser for SQLite" + VALUE "InternalName", "DB Browser for SQLite" + VALUE "OriginalFilename", "DB Browser for SQLite.exe" + VALUE "CompanyName", "DB Browser for SQLite Team" + VALUE "LegalCopyright", "Copyright DB Browser for SQLite Team" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x0000, 0x04B0 + END +END + +IDI_DB4S ICON "iconwin.ico" diff -Nru sqlitebrowser-3.10.100ubuntu1/.travis.yml sqlitebrowser-3.11.1/.travis.yml --- sqlitebrowser-3.10.100ubuntu1/.travis.yml 2018-03-28 23:16:48.000000000 +0000 +++ sqlitebrowser-3.11.1/.travis.yml 2019-02-19 23:51:34.000000000 +0000 @@ -1,63 +1,65 @@ language: cpp sudo: required -dist: trusty +dist: xenial branches: only: - master +# env: +# - ARCH=x86_64 DOCKER_IMAGE=amd64/ubuntu:trusty +# - ARCH=i686 DOCKER_IMAGE=i386/ubuntu:trusty + matrix: fast_finish: true include: - - compiler: gcc - addons: - apt: - sources: - - ubuntu-toolchain-r-test - packages: - - g++-5 - env: COMPILER=g++-5 CXX=g++-5 - - compiler: clang - addons: - apt: - sources: - - ubuntu-toolchain-r-test - - llvm-toolchain-precise-3.8 - packages: - - clang-3.8 - env: COMPILER=clang++-3.8 + - compiler: gcc + addons: + apt: + sources: + - ubuntu-toolchain-r-test + packages: + - g++-5 + env: COMPILER=g++-5 CXX=g++-5 + - compiler: clang + addons: + apt: + sources: + - ubuntu-toolchain-r-test + - llvm-toolchain-precise-3.8 + packages: + - clang-3.8 + env: COMPILER=clang++-3.8 before_install: - - sudo add-apt-repository ppa:likemartinma/devel -y - - sudo add-apt-repository --yes ppa:beineri/opt-qt571-trusty - - sudo apt-get update -qq - - sudo apt-get --force-yes install qt57base qt57translations qt57tools - - sudo apt-get --force-yes install libsqlite3-dev libsqlcipher-dev libantlr-dev - - QT_ENV_SCRIPT=$(find /opt -name 'qt*-env.sh') - - source $QT_ENV_SCRIPT +- sudo apt-get update -qq +- sudo apt-get --force-yes install build-essential git-core cmake libsqlite3-dev qt5-default qttools5-dev-tools libsqlcipher-dev qtbase5-dev libantlr-dev libqt5scintilla2-dev libqcustomplot-dev qttools5-dev + install: - - if [ "$CXX" = "g++" ]; then export CXX="g++-5" CC="gcc-5"; fi - - if [ "$CXX" = "clang++" ]; then export CXX="clang++-3.8" CC="clang-3.8"; fi +- if [ "$CXX" = "g++" ]; then export CXX="g++-5" CC="gcc-5"; fi +- if [ "$CXX" = "clang++" ]; then export CXX="clang++-3.8" CC="clang-3.8"; fi script: - - mkdir build - - mkdir build_cipher - - cd build - - cmake -DCMAKE_INSTALL_PREFIX:PATH=/usr -DENABLE_TESTING=ON .. - - make - - ctest -V - - cd ../build_cipher - - cmake -DCMAKE_INSTALL_PREFIX:PATH=/usr -DENABLE_TESTING=ON -Dsqlcipher=1 .. - - make - - ctest -V +- mkdir build +- mkdir build_cipher +- cd build +- cmake -DCMAKE_INSTALL_PREFIX:PATH=/usr -DENABLE_TESTING=ON .. +- make +- ctest -V +- cd ../build_cipher +- cmake -DCMAKE_INSTALL_PREFIX:PATH=/usr -DENABLE_TESTING=ON -Dsqlcipher=1 .. +- make +- ctest -V notifications: email: - recipients: - - mkleusberg@gmail.com - - innermous@gmail.com - - justin@postgresql.org - - mgrojo@gmail.com - on_success: never - on_failure: always + recipients: + - mkleusberg@gmail.com + - innermous@gmail.com + - justin@postgresql.org + - mgrojo@gmail.com + on_success: never + on_failure: always + slack: + secure: ax5bu7ySF+wlG0pCmQqyzvaurzQt2yLnp/u4KajyFCgWZKOwcvElndjhvW8bIRNgWrGP8TVPkosHhwGucFQNjJq5hHJIbuPzfBTIbITCVbKJNRqeqL0QXlKLwMTejX9AUYwzzJ3xTTj8rZn/UMocsiCy7uPuK1v/5BhZfEr3BBU=