Example #1
0
Dictionary::Ptr Dictionary::import( const QString& fileName )
{
    QFile file( fileName );
    if ( !file.open( QIODevice::ReadOnly | QIODevice::Text ) )
    {
        qDebug() << "Can't open " << fileName << ", err: " << file.errorString();
        return Dictionary::Ptr();
    }

    qint64 total = file.size();
    int numWords = 0;
    int numTranslations = 0;

    Lang src = QLocale::C;
    Lang trg = QLocale::C;
    QString source;
    QStringList targets;

    int ops = 0;
    Database* db = Database::instance();
    db->begin();

    Dictionary::Ptr dict;

    bool ok = true;
    QTextStream in( &file );
    while ( !in.atEnd() )
    {
        QString line = in.readLine();

        if ( line.startsWith('#') )
        {
            if ( line.startsWith( "#INDEX_LANGUAGE" ) )
            {
                src = QLocale::Finnish; // getLang( line );
            }
            else if ( line.startsWith( "#CONTENTS_LANGUAGE" ) )
            {
                trg = QLocale::Russian; // getLang( line );
            }

            if ( src != QLocale::C && trg != QLocale::C )
            {
                dict = Dictionary::Ptr( new Dictionary( LangPair( src, trg ) ) );
                ok = dict->open();
                if ( !ok ) break;
            }
        }
        else if ( !line.isEmpty() && !line[0].isSpace() )
        {
            source = line;
        }
        else if ( line.contains("[trn]") )
        {
            int start = line.indexOf("[trn]") + QString("[trn]").length();
            int end = line.indexOf("[/trn]");
            if ( end > start )
            {
                targets.append( line.mid( start, end - start ) );
            }
        }
        else if ( line.trimmed().isEmpty() && dict )
        {
            int res = dict->addWord( source, targets );
            if ( res < 0 )
            {
                db->rollback();
                ok = false;
                break;
            }
            numWords++;
            numTranslations += res - 1;
            ops++;
            if ( ops % 100 == 0 )
            {
                if ( !db->commit() && !db->begin() )
                {
                    ok = false;
                    break;
                }

                double prog = in.pos() * 100.0 / total;
                emit dict->progress( prog );
                QCoreApplication::processEvents();
            }

            source.clear();
            targets.clear();
        }
    }
    db->commit();
    qDebug() << "Added" << numWords << "new words and" << numTranslations << "new translations";
    return dict;
}