Tools: add a sqlitetester

Windows only, to debug a Windows issue.

Change-Id: Iebd77e08ab4013967f273c262dae6817c92e9527
Reviewed-by: Thomas Hartmann <thomas.hartmann@qt.io>
This commit is contained in:
Tim Jenssen
2024-06-12 09:56:01 +02:00
parent 9d61101805
commit 980305ff15
3 changed files with 175 additions and 0 deletions

View File

@@ -29,6 +29,7 @@ endif()
add_subdirectory(processlauncher)
if (WITH_QMLDESIGNER)
add_subdirectory(qml2puppet)
add_subdirectory(sqlitetester)
endif()
add_subdirectory(qtcdebugger) ## windows only
# add_subdirectory(qtcrashhandler)

View File

@@ -0,0 +1,37 @@
cmake_minimum_required(VERSION 3.16)
# standalone build
if (NOT QT_CREATOR_API_DEFINED)
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/../../../cmake")
project(sqlitetester)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_AUTOUIC ON)
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
set(DESTINATION DESTINATION .)
include(QtCreatorIDEBranding)
include(QtCreatorAPI)
qtc_handle_compiler_cache_support()
find_package(Qt6
COMPONENTS Core Gui Widgets
REQUIRED
)
endif()
add_qtc_executable(sqlitetester
${DESTINATION}
CONDITION WINDOWS AND BUILD_DESIGNSTUDIO
DEPENDS
Sqlite
Qt::Core Qt::Widgets
INCLUDES
${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}
SOURCES
main.cpp
)

View File

@@ -0,0 +1,137 @@
// Copyright (C) 2024 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
#include <sqlitedatabase.h>
#include <sqlitelibraryinitializer.h>
#include <QApplication>
#include <QWidget>
#include <QVBoxLayout>
#include <QLineEdit>
#include <QPushButton>
#include <QTextBrowser>
#include <QTemporaryFile>
#include <QDir>
#include <windows.h>
class DatabaseApp : public QWidget {
Q_OBJECT
public:
DatabaseApp(QWidget *parent = nullptr);
private slots:
void onSetDirectoryClicked();
void createDatabase(const QString &dirPath);
private:
void deleteFileIfExist(const QString &filePath);
void logMessage(const QString &message);
void logDetailedWindowsError();
QLineEdit *directoryLineEdit;
QTextBrowser *logBrowser;
QString databaseDirectory;
};
DatabaseApp::DatabaseApp(QWidget *parent) : QWidget(parent) {
QVBoxLayout *layout = new QVBoxLayout(this);
directoryLineEdit = new QLineEdit(this);
directoryLineEdit->setPlaceholderText("Enter database directory path");
layout->addWidget(directoryLineEdit);
QPushButton *setDirectoryButton = new QPushButton("Set Directory and Create Database", this);
layout->addWidget(setDirectoryButton);
logBrowser = new QTextBrowser(this);
layout->addWidget(logBrowser);
connect(setDirectoryButton, &QPushButton::clicked, this, &DatabaseApp::onSetDirectoryClicked);
}
void DatabaseApp::onSetDirectoryClicked() {
QString dirPath = directoryLineEdit->text();
if (dirPath.isEmpty()) {
logMessage("Directory path is empty.");
return;
}
QDir dir(dirPath);
if (!dir.exists()) {
logMessage("Directory does not exist.");
return;
}
QTemporaryFile tempFile(dirPath + "/tempfileXXXXXX");
if (!tempFile.open()) {
logMessage("Cannot create temporary file in the directory: " + tempFile.errorString());
logDetailedWindowsError();
return;
}
tempFile.close();
createDatabase(dirPath);
}
void DatabaseApp::deleteFileIfExist(const QString &filePath) {
if (QFile::exists(filePath)) {
if (!QFile::remove(filePath)) {
logMessage(QString("Failed to delete existing file %1 before creating database").arg(filePath));
logDetailedWindowsError();
return;
}
}
}
void DatabaseApp::createDatabase(const QString &dirPath) {
databaseDirectory = dirPath;
QString dbPath = dirPath + "/mysqlitetester.db";
dbPath.replace("\\", "/");
deleteFileIfExist(dbPath);
try {
Sqlite::Database database{Utils::PathString{dbPath}};
} catch (const Sqlite::Exception &e) {
logMessage(QString("Cannot create %1: %2").arg(dbPath, QString::fromUtf8(e.what())));
logDetailedWindowsError();
}
deleteFileIfExist(dbPath);
logMessage(QString("Test with %1 was successful.").arg(dbPath));
}
void DatabaseApp::logMessage(const QString &message) {
logBrowser->append(message);
}
void DatabaseApp::logDetailedWindowsError() {
DWORD errorCode = GetLastError();
if (errorCode != 0) {
LPVOID errorMsg;
DWORD size = FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
NULL, errorCode, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
(LPWSTR)&errorMsg, 0, NULL);
if (size) {
QString detailedMessage = QString::fromWCharArray((LPWSTR)errorMsg, size);
logMessage("Windows error: " + detailedMessage);
LocalFree(errorMsg);
}
}
}
int main(int argc, char *argv[]) {
Sqlite::LibraryInitializer::initialize();
QApplication app(argc, argv);
DatabaseApp window;
window.setWindowTitle("SQLite Write Database Tester");
window.resize(400, 300);
window.show();
return app.exec();
}
#include "main.moc"