void symbolConverter::stationsToRUS() { QString ENG("ABCEHKMOPTX"); QString RUS("АВСЕНКМОРТХ"); QString src;//читаем с файла QString dest; QSqlQuery queryRead(QSqlDatabase::database()); queryRead.exec("SELECT pn, sk FROM stations"); qDebug() << "Number of rows: " << queryRead.numRowsAffected(); while(queryRead.next()) { src = queryRead.value(0).toString(); while(!src.isEmpty()) { dest += convertChar(src[0]); src.remove(0, 1); } dest = dest.toUtf8(); //записываем dest в БД QSqlQuery queryWrite(QSqlDatabase::database()); QString strQueryWrite = QString("UPDATE stations SET pn = \'") + dest + QString("\' WHERE sk = \'") + queryRead.value(1).toString() + QString("\'"); queryWrite.exec(strQueryWrite); dest = ""; } qDebug() << "src = " << src; qDebug() << "dest = " << dest; }
bool ServerRepo::Sync(StreamReader* reader, StreamWriter* writer, const String& userName, bool writeAccess) { BEGIN_TRY(); // push & pull should be in a one transaction Data::SqliteTransaction transaction(db); // get user id long long userId = GetUserId(userName); // get initial revision long long prePushRevision = GetMaxRevision(); // read client revision long long clientRevision = reader->ReadShortlyBig(); // read client upper revision long long clientUpperRevision = reader->ReadShortlyBig(); // correct upper revision if(clientUpperRevision == 0 || clientUpperRevision > prePushRevision) clientUpperRevision = prePushRevision; // determine total size of the pull { Data::SqliteQuery queryPullTotalSize(stmtPullTotalSize); stmtPullTotalSize->Bind(1, clientRevision); if(stmtPullTotalSize->Step() != SQLITE_ROW) THROW("Can't determine total pull size"); // output total size of pull long long pullTotalSize = stmtPullTotalSize->ColumnInt64(0); writer->WriteShortlyBig(pullTotalSize); } //*** push void* key = keyBufferFile->GetData(); void* value = valueBufferFile->GetData(); size_t totalPushSize = 0; // output pre-push revision writer->WriteShortlyBig(prePushRevision); bool pushedSomething = false; // loop for push keys for(size_t i = 0; ; ++i) { // read key size size_t keySize = reader->ReadShortly(); // if it's 0, it's signal of end if(!keySize) break; // if there is no write access right, stop if(!writeAccess) THROW("Write access denied"); // check number of keys if(i >= (size_t)maxPushKeysCount) THROW("Too many keys"); // check key size if(keySize > maxKeySize) THROW("Too big key"); // read key value reader->Read(key, keySize); // read value size_t valueSize = reader->ReadShortly(); if(valueSize > maxValueSize) THROW("Too big value"); if(valueSize) reader->Read(value, valueSize); // check total push size totalPushSize += valueSize; if(totalPushSize > maxPushTotalSize) THROW("Too big push total size"); ptr<File> keyFile = NEW(PartFile(keyBufferFile, key, keySize)); // clear latest flag for that key Data::SqliteQuery queryClearLatest(stmtClearLatest); stmtClearLatest->Bind(1, keyFile); if(stmtClearLatest->Step() != SQLITE_DONE) THROW_SECONDARY("Can't clear latest flag", db->Error()); // do write Data::SqliteQuery queryWrite(stmtWrite); stmtWrite->Bind(1, userId); stmtWrite->Bind(2, keyFile); stmtWrite->Bind(3, NEW(PartFile(valueBufferFile, value, valueSize))); if(stmtWrite->Step() != SQLITE_DONE) THROW_SECONDARY("Can't do write", db->Error()); pushedSomething = true; } // ensure request is over reader->ReadEnd(); // output post-push revision writer->WriteShortlyBig(GetMaxRevision()); //*** pull Data::SqliteQuery queryPull(stmtPull); stmtPull->Bind(1, clientRevision); stmtPull->Bind(2, clientUpperRevision); stmtPull->Bind(3, maxPullKeysCount); long long lastKnownClientRevision = clientRevision; size_t totalPullSize = 0; bool done = false; while(!done) { switch(stmtPull->Step()) { case SQLITE_ROW: // check total pull size totalPullSize += stmtPull->ColumnBlobSize(2); if(totalPullSize > maxPullTotalSize) { // stop pull, that's enough done = true; break; } // output key { ptr<File> key = stmtPull->ColumnBlob(1); size_t keySize = key->GetSize(); writer->WriteShortly(keySize); writer->Write(key->GetData(), keySize); } // output value { ptr<File> value = stmtPull->ColumnBlob(2); size_t valueSize = value->GetSize(); writer->WriteShortly(valueSize); writer->Write(value->GetData(), valueSize); } { // output revision long long revision = stmtPull->ColumnInt64(0); writer->WriteShortlyBig(revision); // remember last revision lastKnownClientRevision = revision; } break; case SQLITE_DONE: // end, no more keys done = true; break; default: // some error THROW_SECONDARY("Error pulling changes", db->Error()); } } // write final zero writer->WriteShortly(0); // write new client revision { Data::SqliteQuery query(stmtGetWeakRevision); stmtGetWeakRevision->Bind(1, lastKnownClientRevision); stmtGetWeakRevision->Bind(2, clientUpperRevision); long long newClientRevision; switch(stmtGetWeakRevision->Step()) { case SQLITE_ROW: newClientRevision = stmtGetWeakRevision->ColumnInt64(0) - 1; break; case SQLITE_DONE: newClientRevision = clientUpperRevision; break; default: THROW_SECONDARY("Error getting new client revision", db->Error()); } writer->WriteShortlyBig(newClientRevision); } // commit transaction transaction.Commit(); return pushedSomething; END_TRY("Can't sync server repo"); }