void PgnImporter::run() { QFile file(m_fileName); QFileInfo fileInfo(m_fileName); const QTime startTime = QTime::currentTime(); static const int updateInterval = 1024; int numReadGames = 0; if (!fileInfo.exists()) { emit error(PgnImporter::FileDoesNotExist); return; } if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) { emit error(PgnImporter::IoError); return; } PgnStream pgnStream(&file); QList<const PgnGameEntry*> games; forever { PgnGameEntry* game = new PgnGameEntry; if (m_abort || !game->read(pgnStream)) { delete game; break; } games << game; numReadGames++; if (numReadGames % updateInterval == 0) emit databaseReadStatus(startTime, numReadGames); } PgnDatabase* db = new PgnDatabase(m_fileName); db->setEntries(games); db->setLastModified(fileInfo.lastModified()); emit databaseRead(db); }
bool PgnDatabaseModel::setData(const QModelIndex& index, const QVariant& data, int role) { Q_UNUSED(role); if (!index.isValid()) return false; // only database's name should be editable if (index.column() == 0) { PgnDatabase* db = m_gameDatabaseManager->databases().at(index.row()); db->setDisplayName(data.toString()); m_gameDatabaseManager->setModified(true); return true; } return false; }
// // Get PGN index values (offsets and line numbers). // bool funcPgnIndex() { Game game; unsigned gameNum, firstGame = 0, lastGame = 0; bool retval = true; if (g_optInputDb.empty()) { cerr << "No input database specified" << endl; return false; } shared_ptr<Database> indb = Database::openDatabase(g_optInputDb, false); if (!indb) { cerr << "Don't know how to open database '" << g_optInputDb << "'" << endl; return false; } else if (!indb->isOpen()) { cerr << "Failed to open database '" << g_optInputDb << "': " << indb->errorMsg() << endl; return false; } if (!indb->needsIndexing()) { cerr << "This database doesn't support indexing" << endl; return false; } if (!indb->index(indexCallback, NULL)) { cerr << "Failed to index database '" << g_optInputDb << "': " << indb->errorMsg() << endl; return false; } if (indb->numGames() == 0) { cerr << "Database '" << g_optInputDb << "' is empty" << endl; return false; } if (g_optNumber1 <= 0) firstGame = indb->firstGameNum(); else firstGame = (unsigned)g_optNumber1; if (g_optNumber2 <= 0) lastGame = indb->lastGameNum(); else lastGame = g_optNumber2; if (firstGame > lastGame) { cerr << "Invalid game numbers specified" << endl; return false; } PgnDatabase *pgnDb = dynamic_cast<PgnDatabase *>(indb.get()); for (gameNum = firstGame; gameNum <= lastGame && retval && !g_quitFlag; gameNum++) { if (!indb->gameExists(gameNum)) { cout << "Game " << gameNum << " does not exist" << endl; continue; } uint64_t offset; uint32_t linenum; if (pgnDb->readIndex(gameNum, offset, linenum)) { cout << "game " << dec << gameNum << " offset=0x" << hex << offset << " linenum=" << dec << linenum << endl; } else { cerr << "Failed to get index info for game " << dec << gameNum << ": " << indb->errorMsg() << endl; retval = false; break; } } indb->close(); return retval; }
bool GameDatabaseManager::readState(const QString& fileName) { QFile stateFile(fileName); if (!stateFile.open(QIODevice::ReadOnly)) return false; QDataStream in(&stateFile); in.setVersion(QDataStream::Qt_4_6); // don't change // Read and verify the magic value quint32 magic; in >> magic; if (magic != GAME_DATABASE_STATE_MAGIC) { qWarning("GameDatabaseManager: bad magic value in state file"); return false; } // Read and verify the version number quint32 version; in >> version; if (version < GAME_DATABASE_STATE_VERSION || version > GAME_DATABASE_STATE_VERSION) { // TODO: Add backward compatibility qWarning("GameDatabaseManager: state file version mismatch"); return false; } // Read the number of databases qint32 dbCount; in >> dbCount; // Read the contents of the databases QString dbFileName; QDateTime dbLastModified; QString dbDisplayName; QList<PgnDatabase*> readDatabases; for (int i = 0; i < dbCount; i++) { in >> dbFileName; in >> dbLastModified; in >> dbDisplayName; // Check if the database exists QFileInfo fileInfo(dbFileName); if (!fileInfo.exists()) { m_modified = true; continue; } // Check if the database has been modified if (fileInfo.lastModified() > dbLastModified) { m_modified = true; importPgnFile(dbFileName); continue; } qint32 dbEntryCount; in >> dbEntryCount; // Read the entries QList<const PgnGameEntry*> entries; for (int j = 0; j < dbEntryCount; j++) { PgnGameEntry* entry = new PgnGameEntry; entry->read(in); entries << entry; } PgnDatabase* db = new PgnDatabase(dbFileName); db->setEntries(entries); db->setLastModified(dbLastModified); db->setDisplayName(dbDisplayName); readDatabases << db; } m_modified = false; m_databases = readDatabases; emit databasesReset(); return true; }