/** * @brief printDataStructureByUser imprime cómo está conformado el registro * según los campos que ingresó el usuario */ void BTRecordFile::printDataStructureByUser() // TODO ver que hay duplicado { std::cout << "Los registros tienen la siguiente estructura: \n\n"; DLLNode<IRecordDataType *> *current = _metadataPtr->getRecordStruct()->getHeadPtr(); char headerName; do { headerName = *current->getData()->getName().c_str(); if (headerName == BTRecordFileMetadata::STRING) { std::cout << "string"; } else if (headerName == BTRecordFileMetadata::CHAR) { std::cout << "char"; } else if (headerName == BTRecordFileMetadata::SHORT) { std::cout << "short"; } else if (headerName == BTRecordFileMetadata::INT) { std::cout << "int"; } else if (headerName == BTRecordFileMetadata::DOUBLE) { std::cout << "double"; } else if (headerName == BTRecordFileMetadata::BOOL) { std::cout << "bool"; } else { std::cout << "El tipo de dato no es soportado"; } // current = current->getNextPtr(); current++; } while (current != nullptr); std::cout << "\n\n"; }
/** * @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; }
// Consigue el elemento index de la lista, si index es una posición válida Object* LinkedList::get(int index)const { if (index < 0 || index >= getSize) return NULL; DLLNode* tmp = head; for (int i=0; i < index; i++) tmp = tmp->getNext(); return tmp->getData(); }
// Retorna el último elemento de la lista, si es que hay alguno Object* LinkedList::last()const { if (!head) return NULL; DLLNode* tmp = head; for (int i=0; i < getSize -1; i++) tmp = tmp->getNext(); return tmp->getData(); }
TDAList* LinkedList::toFArrayList()const{ TDAList* retVal = new FArrayList(getSize); DLLNode* temp = head; for (int i = 0; i<getSize ; i++){ retVal->insert(temp->getData(),i); temp = temp->getNext(); } return retVal; }
/* * Búsqueda del índice (posición) de un objeto * Para que esta operación tenga éxito es necesario que los objetos que sean * insertados en la lista tengan bien definido el método equals, pues es este * método el que determinará la igualdad de un objeto con otro. */ int LinkedList::indexOf(Object* other)const { DLLNode* tmp = head; for (int i=0; i < getSize; i++){ // Compara cada uno de los elementos con el parámetro if (tmp->getData()->equals(other)) return i; tmp = tmp->getNext(); } // En el caso de no encontrarlo return -1; }
/** * @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; } }
/* * Borra un elemento de la lista, dada la posición del mismo. Se consideran * tres casos: * (A) El Elemento es la Cabeza * (B) El Elemento es el Último * (C) El Elemento está en Medio * Es importante recalcar que para borrar un elemento es necesario primero * desenlazarlo de la lista y luego liberar su memoria, pues en caso contrario * liberaríamos todos los elementos siguiente a este elemento. */ Object* LinkedList::erase(unsigned pos) { // Si es una posición Inválida if (pos < 0 || pos >= size) return NULL; // Indicar fracaso en la operación DLLNode* tmp = head; for (int i=0; i<=pos; i++) tmp = tmp->getNext(); Object* E = tmp->getData(); if (pos == 0){ // Desea Borrar la Cabeza // Desenlazar tmp = head->getNext(); tmp->setPrev(NULL); head->setNext(NULL); // Liberar Memoria delete head; // Actualizar head head = tmp; }else if (pos == size - 1){ // Desea Borrar el último // Recorrer hasta el final tmp = head; for (int i=0; i<pos-1; i++) tmp = tmp->getNext(); // Desenlazar DLLNode* toErase = tmp->getNext(); tmp->setNext(NULL); toErase->setPrev(NULL); // Liberar Memoria delete toErase; }else { // Desea Borrar de enmedio // Recorrer hasta el nodo anterior al que se desea borrar tmp = head; for (int i=0; i<pos-1; i++) tmp = tmp->getNext(); // Desenlazar DLLNode* toErase = tmp->getNext(); tmp->setNext(toErase->getNext()); toErase->getNext()->setPrev(tmp); toErase->setNext(NULL); toErase->setPrev(NULL); // Liberar Memoria delete toErase; } size--; // Disminuir Tamaño return E; // Indicar Éxito }
/** * @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; }