//Asignado a Camilo void Data::insertRecord(Registro reg) { fstream disco; disco.open(path, ios::binary | ios::in | ios::out); if (!disco) { throw SMException("No se pudo abrir el archivo tablespace.dat"); } mapabits nulos(reg.getNulos()); Metadata md(info.blockIDMD); unsigned int sizeMalloc = md.getrecordsize(); printf("\ntamaño: %u\n",reg.info.tam); unsigned char* buffer = (unsigned char*)malloc(sizeMalloc); for(int i=0; i<(int)md.getCant_campos(); i++) { InfoMDC campo = md.readCampo(i); if(nulos.getAt(i)) { switch(campo.tipo_campo){ case 1: for(int s=0; s<(int)sizeof(int);s++){ buffer[s]='#'; } buffer+=sizeof(int); break; case 2: for(int s=0; s<(int)sizeof(double);s++){ buffer[s]='#'; } buffer+=sizeof(double); break; case 3: for(int s=0; s<(int)campo.size;s++){ buffer[s]='#'; } buffer+=campo.size; break; case 4: { unsigned char *varchar=(unsigned char*)malloc(campo.size+2); varchar[0]=(unsigned char)0 ; for(int a=1;a<=(int)campo.size;a++){ varchar[a]='#'; } varchar[campo.size+1]='\0'; SystemBlock SB; unsigned int blockID = SB.getFree(); SB.acomodarPrimerLibre(); Varchar vr(blockID,info.blockIDMD,i,campo.size); vr.escribir(); unsigned int pos =vr.insertVarchar(varchar); campo.final_varchar=blockID; campo.inicio_varchar=blockID; md.setCampo(i,campo); memcpy(buffer,&blockID,sizeof(unsigned int)); buffer+=sizeof(unsigned int); memcpy(buffer,&pos,sizeof(unsigned int)); buffer+=sizeof(unsigned int); free(varchar); } break; case 5: for(int s=0; s<(int)sizeof(bool);s++){ buffer[s]='#'; } buffer+=sizeof(bool); break; } } else{ switch(campo.tipo_campo) { case 1://Int memcpy(buffer,reg.contentReg,sizeof(int)); buffer+=sizeof(int); reg.contentReg+=sizeof(int); break; case 2://Double memcpy(buffer,reg.contentReg,sizeof(double)); buffer+=sizeof(double); reg.contentReg+=sizeof(double); break; case 3://Char memcpy(buffer,reg.contentReg,campo.size); buffer+=campo.size; reg.contentReg+=campo.size; break; case 4://Varchar { unsigned char size; memcpy(&size,reg.contentReg,sizeof(unsigned char)); int SIZE_V = (int)size; unsigned char *varchar_u=(unsigned char*)malloc(SIZE_V+2); memcpy(varchar_u,reg.contentReg,SIZE_V+2); reg.contentReg+=(SIZE_V+2); unsigned char *varchar=(unsigned char*)malloc(campo.size+2); memcpy(varchar,varchar_u,SIZE_V+2); for(int a=SIZE_V+1;a<=(int)campo.size;a++){ varchar[a]='#'; } varchar[campo.size+1]='\0'; unsigned int varcharID = campo.final_varchar; if(varcharID==0){ SystemBlock SB; unsigned int blockID = SB.getFree(); SB.acomodarPrimerLibre(); Varchar vr(blockID,info.blockIDMD,i,campo.size); vr.escribir(); unsigned int pos =vr.insertVarchar(varchar); campo.final_varchar=blockID; campo.inicio_varchar=blockID; md.setCampo(i,campo); memcpy(buffer,&blockID,sizeof(unsigned int)); buffer+=sizeof(unsigned int); memcpy(buffer,&pos,sizeof(unsigned int)); buffer+=sizeof(unsigned int); }else{ Varchar vr(varcharID); unsigned int freespace = vr.getEspacioDisponible(); if(freespace>=vr.getMax_size()){ unsigned int pos= vr.insertVarchar(varchar); memcpy(buffer,&varcharID,sizeof(unsigned int)); buffer+=sizeof(unsigned int); memcpy(buffer,&pos,sizeof(unsigned int)); buffer+=sizeof(unsigned int); }else{ SystemBlock SB; unsigned int blockID = SB.getFree(); SB.acomodarPrimerLibre(); Varchar vr_new(blockID,info.blockIDMD,i,campo.size); vr_new.escribir(); unsigned int pos=vr_new.insertVarchar(varchar); vr_new.setAnt(varcharID); vr.setSig(blockID); campo.final_varchar=blockID; md.setCampo(i,campo); memcpy(buffer,&blockID,sizeof(unsigned int)); buffer+=sizeof(unsigned int); memcpy(buffer,&pos,sizeof(unsigned int)); buffer+=sizeof(unsigned int); } } free(varchar_u); free(varchar); } break; case 5://Bool memcpy(buffer,reg.contentReg,sizeof(bool)); buffer+=sizeof(bool); reg.contentReg+=sizeof(bool); break; } } } buffer-=md.getrecordsize(); reg.setContentReg(buffer); reg.setTam(sizeMalloc); unsigned int offset = 4096*header.blockID + (4096-getEspacioDisponible()); printf("\nsize del reg: %u\n",(sizeof(reg.info)+sizeMalloc)); // printf("espaciodisponible: %u\n",getEspacioDisponible()); printf("offset: %u\n",offset); disco.seekp(offset); disco.write((const char*) ®.info, sizeof(InfoReg)); disco.write((const char*) reg.contentReg,sizeMalloc); disco.flush(); disco.close(); free(buffer); this->setCantRegActivos(this->getCantRegActivos()+1); this->setCantRegFisicos(this->getCantRegFisicos()+1); }
void StorageManager::createTable(const char* nombreTabla, unsigned int cant_campos, InfoMDC* campos) { SystemBlock SB; unsigned int blockID = SB.getFree(); SB.acomodarPrimerLibre(); Metadata metadata(blockID, nombreTabla,cant_campos); metadata.escribir(); if(SB.getPrimerMD()==0){ SB.setPrimerMD(blockID); } SB.setUltimoMD(blockID); fstream disco; disco.open(path, ios::binary | ios::in | ios::out); if (!disco) { return; } unsigned int offset = (blockID* 4096) + sizeof (Header) + sizeof (InfoMD); int temp = (4096 - sizeof (Header) - sizeof (InfoMD)) / sizeof (InfoMDC); disco.seekp(offset); int temp_cant_campos_restantes = cant_campos; int campo_actual=0; for (int i = 0; i < temp; i++) { if (temp_cant_campos_restantes > 0) { disco.write((const char*) &campos[campo_actual], sizeof (InfoMDC)); disco.flush(); temp_cant_campos_restantes--; campo_actual++; } else{ break; } } unsigned int BlockID_Ant = blockID; while (temp_cant_campos_restantes > 0) { unsigned int free = SB.getFree(); SB.acomodarPrimerLibre(); MetadataContinuo MDC(free,blockID); MDC.escribir(); if (BlockID_Ant != blockID) { MetadataContinuo MDC_ant(BlockID_Ant); MDC_ant.setSig(MDC.getBlockID()); } MDC.setAnt(BlockID_Ant); offset = (MDC.header.blockID * 4096) + sizeof (Header) + sizeof (InfoCMD); disco.seekp(offset); int temp2 = (4096 - sizeof (Header) - sizeof (InfoCMD)) / sizeof (InfoMDC); for (int a = 0; a < temp2; a++) { if (temp_cant_campos_restantes > 0) { disco.write((const char*) &campos[campo_actual], sizeof (InfoMDC)); disco.flush(); temp_cant_campos_restantes--; campo_actual++; }else{ break; } } BlockID_Ant = MDC.getBlockID(); } }