//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*) &reg.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();

            }



}