Exemplo n.º 1
0
void D_bjmak::run(){
    if (!verifyAccess())
        return;

    server->sendReplyCode(DTP_OK);
    server->connectionPtr->recvMsg();
    BackupJob job;
    QString str = server->connectionPtr->dataToQString();
    
    job.fromQString(str);
    bsize_ = job.numberOfDailyBackups();
    bool isFullBackup = (job.numberOfMonthlyBackups() == 0);
    bool isCalculateHashes_ = (job.numberOfWeeklyBackups() == 1);
    int fd = createFileList(job);
    
    if (fd == -1)
        return;
    
    if (!isFullBackup){
        sendFileList(fd);
    }
    
    lseek(fd, 0, SEEK_SET);
    
    const int dataBufferCapacity = D_TRASFER_BUFFER_SIZE;
    const int maxNumberFilesInBuffer = 2500;
    
    QString line;
    int idCount = 0;
    qint64 sizeOfFilesInBuffer = 0;
    qint64 totalFilesizeBackuped = 0;
    qint64 totalFileCountBackuped = 0;
    
    QVector<FileID> ids;
    bool notEof = true;
    while (notEof){
        FileID id;
        QString fileName;
        
        if (!readLine(fd, fileName))
            notEof = false;
        
        if (!id.readID(fileName.toStdString().c_str())){
            continue;
        }
        
        ids.push_back(id);
        //cout << "added " << id.getFullPath().toStdString() << endl;
        ++idCount;
        sizeOfFilesInBuffer += id.getSize();
        
        if ( (sizeOfFilesInBuffer >= dataBufferCapacity) ||
                ( idCount >= maxNumberFilesInBuffer) ){

            sendBuffer(ids, dataBufferCapacity);
            ids.clear();
            totalFilesizeBackuped += sizeOfFilesInBuffer;
            totalFileCountBackuped += idCount;
            idCount = 0;
            sizeOfFilesInBuffer = 0;
        }
    }

    if ( !ids.isEmpty()){

        sendBuffer(ids, dataBufferCapacity);
        ids.clear();
        totalFilesizeBackuped += sizeOfFilesInBuffer;
        totalFileCountBackuped += idCount;
        idCount = 0;
        sizeOfFilesInBuffer = 0;
    }

    
    server->connectionPtr->sendMsg("END");

    QString shortSizeStr;
    double shortSize;
    if ( totalFilesizeBackuped > 1099511627776 ){
        shortSize = totalFilesizeBackuped / 1099511627776.0;
        shortSizeStr = QString::number(shortSize, 'f', 3);
        shortSizeStr += " TB";
    }else if ( totalFilesizeBackuped > 1073741824 ){
        shortSize = totalFilesizeBackuped / 1073741824.0;
        shortSizeStr = QString::number(shortSize, 'f', 3);
        shortSizeStr += " GB";
    }else if( totalFilesizeBackuped > 1048576 ){
        shortSize = totalFilesizeBackuped / 1048576.0;
        shortSizeStr = QString::number(shortSize, 'f', 3);
        shortSizeStr += " MB";
    }else if( totalFilesizeBackuped > 1024 ){
        shortSize = totalFilesizeBackuped / 1024.0;
        shortSizeStr = QString::number(shortSize, 'f', 3);
        shortSizeStr += " KB";
    }
    
    writeLog.info() << "Backup have finished. Save " << shortSizeStr 
            << " in " << totalFileCountBackuped << " files."
            << DebusLogger::endl;
    
}