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);
}
Beispiel #2
0
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;
}
Beispiel #3
0
//
// 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;
}