145
150
Transaction transaction(m_database);
147
152
QSqlQuery query(m_database);
148
query.prepare("SELECT filePath,currentPage,continuousMode,layoutMode,scaleMode,scaleFactor,rotation FROM tabs_v2 WHERE instanceName==?");
153
query.prepare("SELECT filePath,currentPage,continuousMode,layoutMode,rightToLeftMode,scaleMode,scaleFactor,rotation FROM tabs_v3 WHERE instanceName==?");
150
155
query.bindValue(0, instanceName());
162
167
emit tabRestored(query.value(0).toString(),
163
168
static_cast< bool >(query.value(2).toUInt()),
164
169
static_cast< LayoutMode >(query.value(3).toUInt()),
165
static_cast< ScaleMode >(query.value(4).toUInt()),
166
query.value(5).toReal(),
167
static_cast< Rotation >(query.value(6).toUInt()),
170
query.value(4).toBool(),
171
static_cast< ScaleMode >(query.value(5).toUInt()),
172
query.value(6).toReal(),
173
static_cast< Rotation >(query.value(7).toUInt()),
168
174
query.value(1).toInt());
185
191
QSqlQuery query(m_database);
187
if(Settings::instance()->mainWindow().restoreTabs())
189
query.prepare("DELETE FROM tabs_v2 WHERE instanceName==?");
191
query.bindValue(0, instanceName());
193
query.prepare("DELETE FROM tabs_v3 WHERE instanceName==?");
195
query.bindValue(0, instanceName());
199
if(!query.isActive())
201
qDebug() << query.lastError();
205
query.prepare("INSERT INTO tabs_v3 "
206
"(filePath,instanceName,currentPage,continuousMode,layoutMode,rightToLeftMode,scaleMode,scaleFactor,rotation)"
207
" VALUES (?,?,?,?,?,?,?,?,?)");
209
foreach(const DocumentView* tab, tabs)
211
query.bindValue(0, tab->fileInfo().absoluteFilePath());
212
query.bindValue(1, instanceName());
213
query.bindValue(2, tab->currentPage());
215
query.bindValue(3, static_cast< uint >(tab->continuousMode()));
216
query.bindValue(4, static_cast< uint >(tab->layoutMode()));
217
query.bindValue(5, static_cast< uint >(tab->rightToLeftMode()));
219
query.bindValue(6, static_cast< uint >(tab->scaleMode()));
220
query.bindValue(7, tab->scaleFactor());
222
query.bindValue(8, static_cast< uint >(tab->rotation()));
197
228
qDebug() << query.lastError();
201
query.prepare("INSERT INTO tabs_v2 "
202
"(filePath,instanceName,currentPage,continuousMode,layoutMode,scaleMode,scaleFactor,rotation)"
203
" VALUES (?,?,?,?,?,?,?,?)");
205
foreach(const DocumentView* tab, tabs)
207
query.bindValue(0, tab->fileInfo().absoluteFilePath());
208
query.bindValue(1, instanceName());
209
query.bindValue(2, tab->currentPage());
211
query.bindValue(3, static_cast< uint >(tab->continuousMode()));
212
query.bindValue(4, static_cast< uint >(tab->layoutMode()));
214
query.bindValue(5, static_cast< uint >(tab->scaleMode()));
215
query.bindValue(6, tab->scaleFactor());
217
query.bindValue(7, static_cast< uint >(tab->rotation()));
221
if(!query.isActive())
223
qDebug() << query.lastError();
230
query.exec("DELETE FROM tabs_v2");
232
if(!query.isActive())
234
qDebug() << query.lastError();
239
233
transaction.commit();
246
240
#endif // WITH_SQL
243
void Database::clearTabs()
247
if(m_database.isOpen())
249
Transaction transaction(m_database);
251
QSqlQuery query(m_database);
252
query.exec("DELETE FROM tabs_v3");
254
if(!query.isActive())
256
qDebug() << query.lastError();
260
transaction.commit();
249
266
void Database::restoreBookmarks()
268
const QString filePath = outerQuery.value(0).toString();
269
QList< QPair< int, QString > > jumps;
285
const QString absoluteFilePath = outerQuery.value(0).toString();
287
BookmarkModel* model = BookmarkModel::fromPath(absoluteFilePath, true);
271
289
QSqlQuery innerQuery(m_database);
272
innerQuery.prepare("SELECT page,label FROM bookmarks_v2 WHERE filePath==?");
290
innerQuery.prepare("SELECT page,label,comment,modified FROM bookmarks_v3 WHERE filePath==?");
274
innerQuery.bindValue(0, filePath);
292
innerQuery.bindValue(0, absoluteFilePath);
276
294
innerQuery.exec();
286
304
const int page = innerQuery.value(0).toInt();
287
305
const QString label = innerQuery.value(1).toString();
306
const QString comment = innerQuery.value(2).toString();
307
const QDateTime modified = innerQuery.value(3).toDateTime();
289
jumps.append(qMakePair(page, label));
309
model->addBookmark(BookmarkItem(page, label, comment, modified));
292
emit bookmarkRestored(filePath, jumps);
295
313
transaction.commit();
318
336
if(Settings::instance()->mainWindow().restoreBookmarks())
320
query.prepare("INSERT INTO bookmarks_v2 "
321
"(filePath,page,label)"
338
query.prepare("INSERT INTO bookmarks_v3 "
339
"(filePath,page,label,comment,modified)"
340
" VALUES (?,?,?,?,?)");
324
foreach(const BookmarkMenu* bookmark, bookmarks)
342
foreach(const QString& absoluteFilePath, BookmarkModel::knownPaths())
326
foreach(const Jump jump, bookmark->jumps())
344
const BookmarkModel* model = BookmarkModel::fromPath(absoluteFilePath);
346
for(int row = 0, rowCount = model->rowCount(); row < rowCount; ++row)
328
query.bindValue(0, bookmark->absoluteFilePath());
329
query.bindValue(1, jump.first);
330
query.bindValue(2, jump.second);
348
const QModelIndex index = model->index(row);
350
query.bindValue(0, absoluteFilePath);
351
query.bindValue(1, index.data(BookmarkModel::PageRole));
352
query.bindValue(2, index.data(BookmarkModel::LabelRole));
353
query.bindValue(3, index.data(BookmarkModel::CommentRole));
354
query.bindValue(4, index.data(BookmarkModel::ModifiedRole));
350
374
#endif // WITH_SQL
377
void Database::clearBookmarks()
381
if(m_database.isOpen())
383
Transaction transaction(m_database);
385
QSqlQuery query(m_database);
386
query.exec("DELETE FROM bookmarks_v3");
388
if(!query.isActive())
390
qDebug() << query.lastError();
394
transaction.commit();
353
400
void Database::restorePerFileSettings(DocumentView* tab)
359
406
Transaction transaction(m_database);
361
408
QSqlQuery query(m_database);
362
query.prepare("SELECT currentPage,continuousMode,layoutMode,rightToLeftMode,scaleMode,scaleFactor,rotation FROM perfilesettings_v2 WHERE filePath==?");
409
query.prepare("SELECT currentPage,continuousMode,layoutMode,rightToLeftMode,scaleMode,scaleFactor,rotation,firstPage FROM perfilesettings_v3 WHERE filePath==?");
364
411
query.bindValue(0, QCryptographicHash::hash(tab->fileInfo().absoluteFilePath().toUtf8(), QCryptographicHash::Sha1).toBase64());
404
453
Transaction transaction(m_database);
406
455
QSqlQuery query(m_database);
407
query.prepare("INSERT OR REPLACE INTO perfilesettings_v2 "
408
"(lastUsed,filePath,currentPage,continuousMode,layoutMode,rightToLeftMode,scaleMode,scaleFactor,rotation)"
409
" VALUES (?,?,?,?,?,?,?,?,?)");
456
query.prepare("INSERT OR REPLACE INTO perfilesettings_v3 "
457
"(lastUsed,filePath,currentPage,continuousMode,layoutMode,rightToLeftMode,scaleMode,scaleFactor,rotation,firstPage)"
458
" VALUES (?,?,?,?,?,?,?,?,?,?)");
411
460
query.bindValue(0, QDateTime::currentDateTime().toTime_t());
463
514
if(m_database.isOpen())
517
QSqlQuery query(m_database);
518
query.exec("PRAGMA synchronous = OFF");
519
query.exec("PRAGMA journal_mode = MEMORY");
465
522
const QStringList tables = m_database.tables();
469
if(!tables.contains("tabs_v2"))
526
if(!tables.contains("tabs_v3"))
471
if(prepareTabs_v2() && tables.contains("tabs_v1"))
530
if(tables.contains("tabs_v2"))
534
else if(tables.contains("tabs_v1"))
479
if(!tables.contains("bookmarks_v2"))
543
if(!tables.contains("bookmarks_v3"))
481
if(prepareBookmarks_v2() && tables.contains("bookmarks_v1"))
545
if(prepareBookmarks_v3())
483
migrateBookmarks_v1_v2();
547
if(tables.contains("bookmarks_v2"))
549
migrateBookmarks_v2_v3();
551
else if(tables.contains("bookmarks_v1"))
553
migrateBookmarks_v1_v3();
487
558
// per-file settings
489
if(!tables.contains("perfilesettings_v2"))
560
if(!tables.contains("perfilesettings_v3"))
491
if(preparePerFileSettings_v2() && tables.contains("perfilesettings_v1"))
562
if(preparePerFileSettings_v3())
493
migratePerFileSettings_v1_v2();
564
if(tables.contains("perfilesettings_v2"))
566
migratePerFileSettings_v2_v3();
568
else if(tables.contains("perfilesettings_v1"))
570
migratePerFileSettings_v1_v3();
575
limitPerFileSettings();
512
bool Database::prepareTabs_v2()
592
bool Database::prepareTabs_v3()
514
594
Transaction transaction(m_database);
516
596
QSqlQuery query(m_database);
517
query.exec("CREATE TABLE tabs_v2 "
597
query.exec("CREATE TABLE tabs_v3 "
519
599
",instanceName TEXT"
520
600
",currentPage INTEGER"
521
601
",continuousMode INTEGER"
522
602
",layoutMode INTEGER"
603
",rightToLeftMode INTEGER"
523
604
",scaleMode INTEGER"
524
605
",scaleFactor REAL"
525
606
",rotation INTEGER)");
537
bool Database::prepareBookmarks_v2()
618
bool Database::prepareBookmarks_v3()
539
620
Transaction transaction(m_database);
541
622
QSqlQuery query(m_database);
542
query.exec("CREATE TABLE bookmarks_v2 "
623
query.exec("CREATE TABLE bookmarks_v3 "
628
",modified DATETIME)");
547
630
if(!query.isActive())
557
bool Database::preparePerFileSettings_v2()
640
bool Database::preparePerFileSettings_v3()
559
642
Transaction transaction(m_database);
561
644
QSqlQuery query(m_database);
563
query.exec("CREATE TABLE perfilesettings_v2 "
646
query.exec("CREATE TABLE perfilesettings_v3 "
564
647
"(lastUsed INTEGER"
565
648
",filePath TEXT PRIMARY KEY"
566
649
",currentPage INTEGER"
569
652
",rightToLeftMode INTEGER"
570
653
",scaleMode INTEGER"
571
654
",scaleFactor REAL"
572
",rotation INTEGER)");
574
if(!query.isActive())
576
qDebug() << query.lastError();
580
if(Settings::instance()->mainWindow().restorePerFileSettings())
582
query.exec("DELETE FROM perfilesettings_v2 WHERE filePath IN (SELECT filePath FROM perfilesettings_v2 ORDER BY lastUsed DESC LIMIT -1 OFFSET 1000)");
586
query.exec("DELETE FROM perfilesettings_v2");
656
",firstPage INTEGER)");
589
658
if(!query.isActive())
599
void Database::migrateTabs_v1_v2()
601
Transaction transaction(m_database);
603
QSqlQuery query(m_database);
604
query.prepare("INSERT INTO tabs_v2 "
605
"SELECT filePath,?,currentPage,continuousMode,layoutMode,scaleMode,scaleFactor,rotation "
668
void Database::migrateTabs_v2_v3()
670
Transaction transaction(m_database);
672
QSqlQuery query(m_database);
673
query.prepare("INSERT INTO tabs_v3 "
674
"SELECT filePath,instanceName,currentPage,continuousMode,layoutMode,0,scaleMode,scaleFactor,rotation "
679
if(!query.isActive())
681
qDebug() << query.lastError();
685
qWarning() << "Migrated tabs from v2 to v3, dropping v2.";
686
query.exec("DROP TABLE tabs_v2");
688
transaction.commit();
691
void Database::migrateTabs_v1_v3()
693
Transaction transaction(m_database);
695
QSqlQuery query(m_database);
696
query.prepare("INSERT INTO tabs_v3 "
697
"SELECT filePath,?,currentPage,continuousMode,layoutMode,0,scaleMode,scaleFactor,rotation "
608
700
query.bindValue(0, instanceName());
618
qWarning() << "Migrated tabs from v1 to v2, dropping v1.";
710
qWarning() << "Migrated tabs from v1 to v3, dropping v1.";
619
711
query.exec("DROP TABLE tabs_v1");
621
713
transaction.commit();
624
void Database::migrateBookmarks_v1_v2()
716
void Database::migrateBookmarks_v2_v3()
718
Transaction transaction(m_database);
720
QSqlQuery query(m_database);
721
query.prepare("INSERT INTO bookmarks_v3 "
722
"SELECT filePath,page,label,'',datetime('now') "
723
"FROM bookmarks_v2");
727
if(!query.isActive())
729
qDebug() << query.lastError();
733
qWarning() << "Migrated bookmarks from v2 to v3, dropping v2.";
734
query.exec("DROP TABLE bookmarks_v2");
736
transaction.commit();
739
void Database::migrateBookmarks_v1_v3()
626
741
Transaction transaction(m_database);
639
754
QSqlQuery innerQuery(m_database);
640
innerQuery.prepare("INSERT INTO bookmarks_v2 "
641
"(filePath,page,label)"
755
innerQuery.prepare("INSERT INTO bookmarks_v3 "
756
"(filePath,page,label,comment,modified)"
757
" VALUES (?,?,?,'',datetime('now'))");
644
759
innerQuery.bindValue(0, outerQuery.value(0));
667
qWarning() << "Migrated bookmarks from v1 to v2, dropping v1.";
782
qWarning() << "Migrated bookmarks from v1 to v3, dropping v1.";
668
783
outerQuery.exec("DROP TABLE bookmarks_v1");
670
785
transaction.commit();
673
void Database::migratePerFileSettings_v1_v2()
675
Transaction transaction(m_database);
677
QSqlQuery query(m_database);
678
query.prepare("INSERT INTO perfilesettings_v2 "
679
"SELECT lastUsed,filePath,currentPage,continuousMode,layoutMode,0,scaleMode,scaleFactor,rotation "
788
void Database::migratePerFileSettings_v2_v3()
790
Transaction transaction(m_database);
792
QSqlQuery query(m_database);
793
query.prepare("INSERT INTO perfilesettings_v3 "
794
"SELECT lastUsed,filePath,currentPage,continuousMode,layoutMode,rightToLeftMode,scaleMode,scaleFactor,rotation,-1 "
795
"FROM perfilesettings_v2");
799
if(!query.isActive())
801
qDebug() << query.lastError();
805
qWarning() << "Migrated per-file settings from v2 to v3, dropping v2.";
806
query.exec("DROP TABLE perfilesettings_v2");
808
transaction.commit();
811
void Database::migratePerFileSettings_v1_v3()
813
Transaction transaction(m_database);
815
QSqlQuery query(m_database);
816
query.prepare("INSERT INTO perfilesettings_v3 "
817
"SELECT lastUsed,filePath,currentPage,continuousMode,layoutMode,0,scaleMode,scaleFactor,rotation,-1 "
680
818
"FROM perfilesettings_v1");
690
qWarning() << "Migrated per-file settings from v1 to v2, dropping v1.";
828
qWarning() << "Migrated per-file settings from v1 to v3, dropping v1.";
691
829
query.exec("DROP TABLE perfilesettings_v1");
693
831
transaction.commit();
834
void Database::limitPerFileSettings()
836
Transaction transaction(m_database);
838
QSqlQuery query(m_database);
840
if(Settings::instance()->mainWindow().restorePerFileSettings())
842
query.exec("DELETE FROM perfilesettings_v3 WHERE filePath NOT IN (SELECT filePath FROM perfilesettings_v3 ORDER BY lastUsed DESC LIMIT 1000)");
846
query.exec("DELETE FROM perfilesettings_v3");
849
if(!query.isActive())
851
qDebug() << query.lastError();
855
transaction.commit();
696
858
#endif // WITH_SQL