size_t RecordHashFunction::operator()(const Record& r) const { size_t n = 0; const Record::FieldVector& fields = r.getFields(); for(Record::FieldVector::const_iterator i = fields.begin(), i_end = fields.end(); i != i_end; ++i) { n = (n << 3) ^ TypeHashFunction()((*i).second); } return n; }
TypeNode NodeManager::RecTypeCache::getRecordType( NodeManager * nm, const Record& rec, unsigned index ) { if( index==rec.getNumFields() ) { if( d_data.isNull() ) { const Record::FieldVector& fields = rec.getFields(); Datatype dt("__cvc4_record"); dt.setRecord(); DatatypeConstructor c("__cvc4_record_ctor"); for(Record::FieldVector::const_iterator i = fields.begin(); i != fields.end(); ++i) { c.addArg((*i).first, (*i).second); } dt.addConstructor(c); d_data = TypeNode::fromType(nm->toExprManager()->mkDatatypeType(dt)); Debug("tuprec-debug") << "Return type : " << d_data << std::endl; } return d_data; } else { return d_children[TypeNode::fromType( rec[index].second )][rec[index].first].getRecordType( nm, rec, index+1 ); } }
Record::Record(const Record& other) : d_fields(new FieldVector(other.getFields())) { Debug("record") << "copy constructor " << this << " " << d_fields << std::endl; }
//Encargado de mostrar los registros del archivo en una estructura de xml void MainWindow::on_exportXML_triggered() { //verifica que el archivo este abierto if(!this->fileRecord.isOpen()){ QMessageBox::critical(this,"Error","No tiene un archivo abierto para exportar sus campos y registros"); return; } //verifica que existan campos y registros if(this->fileRecord.fieldsSize() == 0 || this->fileRecord.getIndexes().size() == 0){ QMessageBox::warning(this,"Error","El archivo no tiene campos o registros"); return; } //Obtiene del usuario la direccion del archivo donde se guardara el xml QString path = QFileDialog::getExistingDirectory(this,"Exportar en archivo XML",""); //verifica que esa direccion sea correcta if(!path.isEmpty()){ path += "/Registros.xml"; //Utiliza un Qfile para poder hacer la escritura correcta del codigo xml QFile file (path); //verifica que este abierto en modo de escritura solamente if(!file.open(QIODevice::WriteOnly)){ QMessageBox::warning(this,"Error","No se puede exportar a xml, error al abrir archivo destino"); return; }else{ //se hace del uso de un QXmlStreamWriter que ayuda a escribir el codigo XML dentro del archivo QXmlStreamWriter xmlw; xmlw.setDevice(&file); //se escribe el principio del documento xmlw.writeStartDocument(); //se escribe el encabezado del archivo de xml xmlw.writeStartElement("fileRecord"); vector<PrimaryIndex*> indexes = this->fileRecord.getIndexes(); //se escriben los subarboles del principal, es uno por cada registro for(int i = 0; i < indexes.size(); i++){ PrimaryIndex* currentIndex = indexes.at(i); Record* currentRecord = this->fileRecord.getRecord(currentIndex); vector<Field*> fields = currentRecord->getFields(); vector<string> record = currentRecord->getRecord(); xmlw.writeStartElement("record"); //adentro de cada uno de los subarboles se crean otros subarboles, uno por cada campo con //su registro que le corresponde for(int j = 0; j < fields.size(); j++){ Field* currentField = fields.at(j); //se escribe los registros junto con sus campos xmlw.writeStartElement(QString::fromStdString(currentField->getName())); if(currentField->isKey()){ xmlw.writeAttribute("key","true"); }else{ xmlw.writeAttribute("key","false"); } if(currentField->getType() == 'E'){ xmlw.writeAttribute("type","integer"); }else if(currentField->getType() == 'R'){ xmlw.writeAttribute("type","real"); }else{ xmlw.writeAttribute("type","string"); } xmlw.writeAttribute("length",QString::number(currentField->getLength())); if(currentField->getType() == 'R'){ xmlw.writeAttribute("decimalPlaces",QString::number(currentField->getDecimalPlaces())); } QString str = QString::fromStdString(record[j]).trimmed(); xmlw.writeCharacters(str); xmlw.writeEndElement(); } //se escribe el final del elemento xmlw.writeEndElement(); } //se escribe el final del elemento xmlw.writeEndElement(); //se escribe el final del documento xmlw.writeEndDocument(); QMessageBox::information(this,"Satisfactorio","Se ha creado correctamente el archivo XML"); } } }