-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmainwindow.cpp
93 lines (76 loc) · 3.19 KB
/
mainwindow.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
//#include <QtSql/QSqlDatabase>
//#include <QtSql/QSqlQuery>
#include <QtSql>
#include <iso646.h>
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
ui->leConnectionName->setText("imCon");
ui->leDbName->setText ("file::memory:");
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_pbGo_clicked()
{
QString imCon =ui->leConnectionName->text (); // "imCon"
QString imDbName =ui->leDbName->text(); // "file::memory:
{
// open in memory database
QSqlDatabase imDb =QSqlDatabase::addDatabase ("QSQLITE", imCon);
imDb.setConnectOptions ("QSQLITE_OPEN_URI;QSQLITE_ENABLE_SHARED_CACHE");
imDb.setDatabaseName (imDbName);
if( not imDb.open())
qCritical() << "failed to open inmemory DB " << imDb.lastError ();
// open source db
QSqlDatabase srcDb =QSqlDatabase::addDatabase ("QSQLITE", "source");
srcDb.setConnectOptions ("QSQLITE_OPEN_URI;QSQLITE_ENABLE_SHARED_CACHE");
srcDb.setDatabaseName ("source.db");
if( not srcDb.open ())
qCritical() << "failed to open source db " << srcDb.lastError ();
// copy data to im db
QSqlQuery qSourceToMemory (srcDb);
if( not qSourceToMemory.exec(QString("VACUUM INTO '%1'").arg(imDbName)))
qCritical() << "failed to copy data to inmemory db " << imDbName << "\n" << qSourceToMemory.lastError ();
// change data
QSqlQuery qModifyImDb(imDb);
if( not qModifyImDb.exec ("INSERT INTO t (f) VALUES ('BrandNewData')"))
qCritical() << "failed to modify in memory db " << qModifyImDb.lastError ();
// save imdb to disc
QSqlQuery qMemoryToDisc(imDb);
QFile::remove("dest.db");
if( not qMemoryToDisc.exec(QString("VACUUM INTO '%1'").arg("dest.db")))
qCritical() << "failed to vacuum into dest db " << qMemoryToDisc.lastError ();
// cleanup
srcDb.close ();
srcDb.close();
}
QSqlDatabase::removeDatabase (imCon);
QSqlDatabase::removeDatabase ("source");
}
void MainWindow::on_pbexit_2_clicked()
{
{
QSqlDatabase db =QSqlDatabase::addDatabase ("QSQLITE", "source");
db.setDatabaseName ("source.db");
if( not db.open ())
qCritical() << "failed to open source db for creation";
// WAL mode is not necessary// switch to WAL mode for not having to have shared cache mode
QSqlQuery wal =db.exec ("PRAGMA journal_mode=WAL");
wal.next ();
if( wal.record ().value (0).toString() not_eq "wal")
qCritical() << "failed to switch to WAL mode: " << wal.lastError ();
QSqlQuery q(db);
if( not q.exec ("CREATE TABLE IF NOT EXISTS t (f TEXT PRIMARY KEY)"))
qCritical() << "failed to create table" << q.lastError ();
if( not q.exec ("REPLACE INTO t (f) VALUES ('Hallo'), ('World'), ('Welcome'), ('Aliens')"))
qCritical() << "failed to write data"<< q.lastError ();
db.close ();
} // let QSqlQuery and QSqlDatabase run out of scope to close
QSqlDatabase::removeDatabase ("source");
}