/** * @brief BTRecordFile::readRecordFromDiskTest * @param pDisk * @param pRecordID * Hace la lectura de un registro en la RAM */ void BTRecordFile::readRecordFromDiskTest(Disk pDisk, unsigned short pRecordID) { const char *padre = pDisk.read(this->_metadataPtr->getFirstRecordPos(), 7); const char *hizq = pDisk.read(this->_metadataPtr->getFirstRecordPos() + 8, 7); const char *hder = pDisk.read(this->_metadataPtr->getFirstRecordPos() + 16, 7); std::string father(padre); // obtiene el padre std::string HI(hizq); // obtiene el hijo izq std::string HD(hder); // obtiene el hijo der unsigned short _sizeCounter = this->_metadataPtr->getFirstRecordPos() + 24; // inicio de la data DLL<IRecordDataType*> *tmp1 = _metadataPtr->getRecordStruct(); DLLNode<IRecordDataType*> *tmp = tmp1->getHeadPtr(); const char *data; cout << "Binario " << father << " " << HI << " " << HD << endl; std::string P = _conversion->binaryToDecimal(father); std::string PHI = _conversion->binaryToDecimal(HI); std::string PHD = _conversion->binaryToDecimal(HD); cout << P << " " << PHI << " " << PHD << " "; while (tmp != nullptr) { data = (dynamic_cast<RecordDataType<char>*>(tmp->getData()))->getDataPtr(); const char *DATO = pDisk.read(_sizeCounter, 7); std::string DATOSTR(DATO); // obtiene el padre _sizeCounter += 8; cout << sortUserDataFromDisk(DATOSTR, *data) << endl; tmp = tmp->getNextPtr(); } }
/** * @brief BTRecordFile::getUserRecordData * Itera sobre la DLL de los datos que el usuario introduce */ std::string BTRecordFile::getUserRecordData(DLL<IRecordDataType *> *_dataListPtr) { std::string finalBinaryRecord; // concatenacion del registro DLLNode<IRecordDataType*> *tmp = _dataListPtr->getHeadPtr(); RecordDataType<std::string> *data; while (tmp != nullptr) { data = dynamic_cast<RecordDataType<std::string>*>(tmp->getData()); QString qstrData = _conversion->fromStringToQString(*data->getDataPtr()); if (_conversion->verificaValidezDouble(qstrData) == true) { // VERIFICACION DE SI EL DATO ES DEL TIPO DOUBLE _conversion->setFillData((data->getSize() * 8)); finalBinaryRecord += _conversion->fromDoubleString2BinaryString(*data->getDataPtr()); } else if (_conversion->verificaValidezInt(qstrData) == true) { // cadena no de numeros _conversion->setFillData((data->getSize() * 8)); finalBinaryRecord += _conversion->decimalToBinary(*data->getDataPtr()); } else { // letras _conversion->setFillData((data->getSize() * 8)); finalBinaryRecord += _conversion->stringToBinary(*data->getDataPtr()); } tmp = tmp->getNextPtr(); } cout << "El registro en BINARIO es: " << "\n" << finalBinaryRecord << endl; _conversion->setFillData(8); return finalBinaryRecord; }
/** * @brief BTRecordFile::readOneRecordFromDisk * @param recordID * Lee solo un registro desde disco */ void BTRecordFile::readOneRecordFromDisk(unsigned short recordID) { if (recordID <= this->_metadataPtr->getNumberOfRecords() - 1) { unsigned short BOF = this->_metadataPtr->getFirstRecordPos(); unsigned short recordSize = this->_metadataPtr->getRecordSize(); unsigned short recordSpace = BOF + (recordSize * (recordID - 1)); const char* padre = this->_disk->read(recordSpace, 7); std::string stringData1 = _conversion->fromConstChar2String(padre); const char* Hizq = this->_disk->read(recordSpace + 8, 7); std::string stringData2 = _conversion->fromConstChar2String(Hizq); const char* Hder = this->_disk->read(recordSpace + 16, 7); std::string stringData3 = _conversion->fromConstChar2String(Hder); cout << "BOF: " << BOF << "EOF: " << _metadataPtr->getEOF() << "\nrecordSize: " << recordSize << "\nrecordSpace: " << recordSpace; cout << "Registro #" << recordID << " " ; cout << "Padre: "; cout << _conversion->binaryToDecimal(stringData1); cout << " hIzq: "; cout << _conversion->binaryToDecimal(stringData2); cout << " hDer: "; cout << _conversion->binaryToDecimal(stringData3); cout << endl; DLL<IRecordDataType*> *tmp1 = _metadataPtr->getRecordStruct(); DLLNode<IRecordDataType*> *tmp = tmp1->getHeadPtr(); const char *data; recordSpace += 24; while (tmp != nullptr) { cout << " " << tmp->getData()->getName() << ": " ; data = (dynamic_cast<RecordDataType<char>*>(tmp->getData()))->getDataPtr(); const char *DATO = _disk->read(recordSpace, tmp->getData()->getSize() * 8 - 1); std::string DATOSTR(DATO); cout << sortUserDataFromDisk(DATOSTR, *data); recordSpace += (tmp->getData()->getSize() * 8); tmp = tmp->getNextPtr(); } cout << endl; cout << "-----------------------------------------------------" << endl; } }
/** * @brief BTRecordFile::saveMetadata2Disk * Guarda los metadatos antes de cerrar sesión y los escribirá en disco */ void BTRecordFile::saveMetadata2Disk() { std::string metadataBinary; std::string puntero = _conversion->fromShort2String(_metadataPtr->getPointerNextBlock()); std::string tamanoRegistro = _conversion->fromShort2String(_metadataPtr->getRecordSize()); std::string BOF = _conversion->fromShort2String(_metadataPtr->getFirstRecordPos()); std::string cantidadRegistro = _conversion->fromShort2String(_metadataPtr->getNumberOfRecords()); std::string ENDOF = _conversion->fromShort2String(_metadataPtr->getEOF()); std::string freeBlocks = _conversion->fromShort2String(_metadataPtr->getFreeBlockList()); _conversion->setFillData(16); // hace los datos de tamaño 16 en binario metadataBinary += _conversion->decimalToBinary(puntero); cout << _conversion->decimalToBinary(puntero) << endl; metadataBinary += _conversion->decimalToBinary(tamanoRegistro); cout << _conversion->decimalToBinary(tamanoRegistro) << endl; metadataBinary += _conversion->decimalToBinary(BOF); cout << _conversion->decimalToBinary(BOF) << endl; metadataBinary += _conversion->decimalToBinary(cantidadRegistro); cout << _conversion->decimalToBinary(cantidadRegistro) << endl; metadataBinary += _conversion->decimalToBinary(ENDOF); cout << _conversion->decimalToBinary(ENDOF) << endl; metadataBinary += _conversion->decimalToBinary(freeBlocks); cout << _conversion->decimalToBinary(freeBlocks) << endl; cout << "Metadatos: " << metadataBinary << endl; cout << "Tamaño Metadatos: " << metadataBinary.length() << endl; DLL<IRecordDataType*> *tmp1 = _metadataPtr->getRecordStruct(); DLLNode<IRecordDataType*> *tmp = tmp1->getHeadPtr(); std::string size = _conversion->fromShort2String(tmp1->getSize()); // numero de datos de usuario metadataBinary += _conversion->decimalToBinary(size); // cantidad de datos usuario _conversion->setFillData(_sizeOwner_FileName); //24 metadataBinary += _conversion->stringToBinary(_metadataPtr->getFileName()); cout << _conversion->stringToBinary(_metadataPtr->getFileName()) << endl; metadataBinary += _conversion->stringToBinary(_metadataPtr->getOwner()); cout << _conversion->stringToBinary(_metadataPtr->getOwner()) << endl; cout << "Metadatos: " << metadataBinary << endl; cout << "Tamaño Metadatos: " << metadataBinary.length() << endl; unsigned short data1; std::string data2; std::string data3; std::string datos; while (tmp != nullptr) { data1 = (dynamic_cast<RecordDataType<char>*>(tmp->getData()))->getSize(); data2 = (dynamic_cast<RecordDataType<char>*>(tmp->getData()))->getDataPtr(); data3 = (dynamic_cast<RecordDataType<char>*>(tmp->getData()))->getName(); // titulo std::string tamanoDato = _conversion->fromShort2String(data1); _conversion->setFillData(_sizeOwner_FileName); //24 datos += _conversion->decimalToBinary(tamanoDato); datos += _conversion->decimalToBinary(data2); datos += _conversion->stringToBinary(data3); cout << "MUSR1: " << data1 << " " << _conversion->decimalToBinary(tamanoDato) << endl; cout << "MUSR2: " << data2 << " " << _conversion->decimalToBinary(data2) << endl; cout << "MUSR3: " << data3 << " " << _conversion->stringToBinary(data3) << endl; cout << "MetadatosUSR: "******"Tamaño MetadatosUSR: "******"Metadatos: " << metadataBinary << endl; cout << "Tamaño Metadatos: " << metadataBinary.length() << endl; _disk->write(0, _conversion->fromStringToConstChar(metadataBinary)); // escribe a disco // return metadataBinary; }