Example #1
0
TEST_F(TestSaveLoadSchema, OneField)
{
    {
        std::vector<umf::FieldDesc> fields;
        fields.push_back(umf::FieldDesc(TEST_FIELD_NAME,umf::Variant::type_string));
        desc = std::shared_ptr<umf::MetadataDesc> (new umf::MetadataDesc(TEST_DESC_NAME, fields));
        schema = std::shared_ptr<umf::MetadataSchema>(new umf::MetadataSchema(TEST_SCHEMA_NAME));
        schema->add(desc);

        umf::MetadataStream stream;
        stream.addSchema(schema);
        stream.saveTo(SCHEMA_TEST_FILE);
    }

    {
        umf::MetadataStream stream;
        stream.open(SCHEMA_TEST_FILE, umf::MetadataStream::ReadOnly);
        auto schema = stream.getSchema(TEST_SCHEMA_NAME);

        ASSERT_EQ(TEST_SCHEMA_NAME, schema->getName());
        ASSERT_EQ(1u, schema->size());
        std::shared_ptr<umf::MetadataDesc> desc = schema->findMetadataDesc(TEST_DESC_NAME);
        ASSERT_TRUE(desc != NULL);
        ASSERT_EQ(TEST_SCHEMA_NAME, desc->getSchemaName());
        ASSERT_EQ(TEST_DESC_NAME, desc->getMetadataName());
        auto fields = desc->getFields();
        ASSERT_EQ(1u, fields.size());
        umf::FieldDesc fieldDescr;
        ASSERT_TRUE(desc->getFieldDesc(fieldDescr, TEST_FIELD_NAME));
        ASSERT_EQ(umf::Variant::type_string, fieldDescr.type);
        ASSERT_EQ(TEST_FIELD_NAME, fieldDescr.name);
    }
}
Example #2
0
TEST_F(TestSaveLoadSchema, Array)
{
    {
        umf::MetadataStream stream;
        stream.addSchema(schema);
        stream.saveTo(SCHEMA_TEST_FILE);
    }

    {
        umf::MetadataStream stream;
        stream.open(SCHEMA_TEST_FILE, umf::MetadataStream::ReadOnly);

        auto schema = stream.getSchema(TEST_SCHEMA_NAME);

        ASSERT_EQ(1u, schema->size());
        std::shared_ptr<umf::MetadataDesc> desc = schema->findMetadataDesc(TEST_DESC_NAME);
        ASSERT_TRUE(desc.get() != NULL);
        ASSERT_EQ(TEST_SCHEMA_NAME, desc->getSchemaName());
        ASSERT_EQ(TEST_DESC_NAME, desc->getMetadataName());
        std::vector<umf::FieldDesc> fields = desc->getFields();
        ASSERT_EQ(1u, fields.size());
        umf::FieldDesc field = fields.at(0);
        ASSERT_EQ(umf::Variant::type_string, field.type);
        ASSERT_EQ("", field.name);
    }
}
Example #3
0
std::shared_ptr<Metadata> MetadataStream::import( MetadataStream& srcStream, std::shared_ptr< Metadata >& spMetadata, std::map< IdType, IdType >& mapIds, long long nTarFrameIndex, long long nSrcFrameIndex, long long nNumOfFrames )
{
    auto nSrcMetadataId = spMetadata->getId();

    // Check to make sure the metadata belongs to the source stream
    if( nSrcMetadataId < 0 || srcStream.getById( nSrcMetadataId ) != spMetadata )
    {
        VMF_EXCEPTION(IncorrectParamException, "The input metadata does not belong to the source stream!" );
    }

    // Skip if it has already been imported
    if( mapIds.find( nSrcMetadataId ) != mapIds.end() )
    {
        auto spNewMetadata = this->getById( mapIds[ nSrcMetadataId ] );
        if( spNewMetadata == nullptr )
        {
            VMF_EXCEPTION(InternalErrorException, "Unexpected exception!" );
        }

        return spNewMetadata;
    }

    // Make a deep copy, add to the new stream, and add to the map
    std::shared_ptr< Metadata > spNewMetadata( new Metadata( *spMetadata ));
    if( !spNewMetadata->shiftFrameIndex( nTarFrameIndex, nSrcFrameIndex, nNumOfFrames ))
    {
        return nullptr;
    }

    auto nNewMetadataId = this->add( spNewMetadata );
    mapIds[ nSrcMetadataId ] = nNewMetadataId;

    // Wire to the correct description
    auto spNewSchema = this->getSchema( spMetadata->getSchemaName() );
    auto spNewDescriptor = spNewSchema == nullptr ? nullptr : spNewSchema->findMetadataDesc( spMetadata->getName() );
    if( spNewDescriptor == nullptr )
    {
        VMF_EXCEPTION(InternalErrorException, "Metadata schema or description was not found!" );
    }
    spNewMetadata->setDescriptor( spNewDescriptor );

    // Import all references recursively
    spNewMetadata->removeAllReferences();
    auto vReferences = spMetadata->getAllReferences();
    std::for_each( vReferences.begin(), vReferences.end(), [&]( Reference& reference )
    {
        // Import the reference to the new stream
        std::shared_ptr<Metadata> md = reference.getReferenceMetadata().lock();
        auto spNewReference = import( srcStream, md, mapIds, nTarFrameIndex, nSrcFrameIndex, nNumOfFrames );

        // Add as reference
        if( spNewReference != nullptr )
            spNewMetadata->addReference( spNewReference );
    });

    return spNewMetadata;
}