代码之家  ›  专栏  ›  技术社区  ›  Vishal Sharma

从Ignite看Cassandra的Blob

  •  0
  • Vishal Sharma  · 技术社区  · 7 年前

    我试图从Ignite(充当缓存)读取Cassandra表的内容。 下表所示:

    CREATE TABLE test.epc_table (
        imsi text PRIMARY KEY,
        data blob
    )
    

    该数据blob用于存储C++类对象(类名为“RtCassEpcTableDataVo”)。

    我试图使用下面的c++程序来传递“imsi”的值并获得相应的“data”。

    #include "ignite/ignite.h"
    #include "ignite/ignition.h"
    
    
    #include <iostream>
    #include<string>
    
    #include "RtCassEpcTableDataVo.hpp"
    
    using namespace ignite;
    using namespace cache;
    using namespace std;
    
    int main()
    {
            IgniteConfiguration cfg;
    
            cfg.springCfgPath = "/home/ignite/apache-ignite-fabric-2.4.0-bin/config/cassandra-config.xml";
    
            try
            {
                    // Start a node.
                    Ignite ignite = Ignition::Start(cfg);
    Cache<string,RtCassEpcTableDataVo> cache = ignite.GetCache<std::string, RtCassEpcTableDataVo>("cache1");
    
    cout<<endl<<"Enter IMSI : ";
    string l_imsi;
    getline(cin>>ws,l_imsi);
    
    RtCassEpcTableDataVo l_blob=cache.Get(l_imsi);
                    Ignition::StopAll(false);
            }
            catch (IgniteError& err)
            {
                    std::cout << "An error occurred: " << err.GetText() << std::endl;
    
                    return err.GetCode();
            }
    
            std::cout << std::endl;
    
            return 0;
    }
    

    但是,我遇到了编译错误。

    In file included from /usr/local/include/ignite/impl/binary/binary_writer_impl.h:32:0,
                     from /usr/local/include/ignite/binary/binary_raw_writer.h:30,
                     from /home/ignite/apache-ignite-fabric-2.4.0-bin/platforms/cpp/core/include/ignite/cache/query/query_scan.h:29,
                     from /home/ignite/apache-ignite-fabric-2.4.0-bin/platforms/cpp/core/include/ignite/impl/cache/cache_impl.h:21,
                     from /home/ignite/apache-ignite-fabric-2.4.0-bin/platforms/cpp/core/include/ignite/impl/ignite_impl.h:27,
                     from /home/ignite/apache-ignite-fabric-2.4.0-bin/platforms/cpp/core/include/ignite/ignite.h:26,
                     from sample.cpp:1:
    /usr/local/include/ignite/impl/binary/binary_utils.h: In instantiation of âstatic T ignite::impl::binary::BinaryUtils::GetDefaultValue() [with T = RtCassEpcTableDataVo]â:
    /home/ignite/apache-ignite-fabric-2.4.0-bin/platforms/cpp/core/include/ignite/impl/operations.h:349:62:   required from âvoid ignite::impl::Out1Operation<T>::SetNull() [with T = RtCassEpcTableDataVo]â
    sample.cpp:72:1:   required from here
    /usr/local/include/ignite/impl/binary/binary_utils.h:475:59: error: âGetNullâ is not a member of âignite::binary::BinaryType<RtCassEpcTableDataVo>â
                         ignite::binary::BinaryType<T>::GetNull(res);
                         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~
    In file included from /usr/local/include/ignite/impl/binary/binary_object_impl.h:31:0,
                     from /usr/local/include/ignite/impl/binary/binary_writer_impl.h:35,
                     from /usr/local/include/ignite/binary/binary_raw_writer.h:30,
                     from /home/ignite/apache-ignite-fabric-2.4.0-bin/platforms/cpp/core/include/ignite/cache/query/query_scan.h:29,
                     from /home/ignite/apache-ignite-fabric-2.4.0-bin/platforms/cpp/core/include/ignite/impl/cache/cache_impl.h:21,
                     from /home/ignite/apache-ignite-fabric-2.4.0-bin/platforms/cpp/core/include/ignite/impl/ignite_impl.h:27,
                     from /home/ignite/apache-ignite-fabric-2.4.0-bin/platforms/cpp/core/include/ignite/ignite.h:26,
                     from sample.cpp:1:
    /usr/local/include/ignite/impl/binary/binary_reader_impl.h: In instantiation of âvoid ignite::impl::binary::BinaryReaderImpl::ReadTopObject0(T&) [with T = RtCassEpcTableDataVo]â:
    /usr/local/include/ignite/impl/binary/binary_type_impl.h:100:17:   required from âstatic T ignite::binary::ReadHelper<T>::Read(R&) [with R = ignite::impl::binary::BinaryReaderImpl; T = RtCassEpcTableDataVo]â
    /usr/local/include/ignite/impl/binary/binary_reader_impl.h:887:63:   required from âT ignite::impl::binary::BinaryReaderImpl::ReadTopObject() [with T = RtCassEpcTableDataVo]â
    /home/ignite/apache-ignite-fabric-2.4.0-bin/platforms/cpp/core/include/ignite/impl/operations.h:344:21:   required from âvoid ignite::impl::Out1Operation<T>::ProcessOutput(ignite::impl::binary::BinaryReaderImpl&) [with T = RtCassEpcTableDataVo]â
    sample.cpp:72:1:   required from here
    /usr/local/include/ignite/impl/binary/binary_reader_impl.h:1001:40: error: âReadâ is not a member of âBType {aka ignite::binary::BinaryType<RtCassEpcTableDataVo>}â
                                 BType::Read(reader, res);
                                 ~~~~~~~~~~~^~~~~~~~~~~~~
    /usr/local/include/ignite/impl/binary/binary_reader_impl.h: In instantiation of âT ignite::impl::binary::BinaryReaderImpl::GetNull() const [with T = RtCassEpcTableDataVo]â:
    /usr/local/include/ignite/impl/binary/binary_reader_impl.h:905:45:   required from âvoid ignite::impl::binary::BinaryReaderImpl::ReadTopObject0(T&) [with T = RtCassEpcTableDataVo]â
    /usr/local/include/ignite/impl/binary/binary_type_impl.h:100:17:   required from âstatic T ignite::binary::ReadHelper<T>::Read(R&) [with R = ignite::impl::binary::BinaryReaderImpl; T = RtCassEpcTableDataVo]â
    /usr/local/include/ignite/impl/binary/binary_reader_impl.h:887:63:   required from âT ignite::impl::binary::BinaryReaderImpl::ReadTopObject() [with T = RtCassEpcTableDataVo]â
    /home/ignite/apache-ignite-fabric-2.4.0-bin/platforms/cpp/core/include/ignite/impl/operations.h:344:21:   required from âvoid ignite::impl::Out1Operation<T>::ProcessOutput(ignite::impl::binary::BinaryReaderImpl&) [with T = RtCassEpcTableDataVo]â
    sample.cpp:72:1:   required from here
    /usr/local/include/ignite/impl/binary/binary_reader_impl.h:1024:59: error: âGetNullâ is not a member of âignite::binary::BinaryType<RtCassEpcTableDataVo>â
                         ignite::binary::BinaryType<T>::GetNull(res);
                         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~
    In file included from /usr/local/include/ignite/impl/binary/binary_writer_impl.h:30:0,
                     from /usr/local/include/ignite/binary/binary_raw_writer.h:30,
                     from /home/ignite/apache-ignite-fabric-2.4.0-bin/platforms/cpp/core/include/ignite/cache/query/query_scan.h:29,
                     from /home/ignite/apache-ignite-fabric-2.4.0-bin/platforms/cpp/core/include/ignite/impl/cache/cache_impl.h:21,
                     from /home/ignite/apache-ignite-fabric-2.4.0-bin/platforms/cpp/core/include/ignite/impl/ignite_impl.h:27,
                     from /home/ignite/apache-ignite-fabric-2.4.0-bin/platforms/cpp/core/include/ignite/ignite.h:26,
                     from sample.cpp:1:
    /usr/local/include/ignite/impl/binary/binary_id_resolver.h: In instantiation of âint32_t ignite::impl::binary::TemplatedBinaryIdResolver<T>::GetTypeId() [with T = RtCassEpcTableDataVo; int32_t = int]â:
    sample.cpp:72:1:   required from here
    /usr/local/include/ignite/impl/binary/binary_id_resolver.h:88:68: error: âGetTypeIdâ is not a member of âignite::binary::BinaryType<RtCassEpcTableDataVo>â
                         return ignite::binary::BinaryType<T>::GetTypeId();
                                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~
    /usr/local/include/ignite/impl/binary/binary_id_resolver.h: In instantiation of âint32_t ignite::impl::binary::TemplatedBinaryIdResolver<T>::GetFieldId(int32_t, const char*) [with T = RtCassEpcTableDataVo; int32_t = int]â:
    sample.cpp:72:1:   required from here
    /usr/local/include/ignite/impl/binary/binary_id_resolver.h:94:73: error: âGetFieldIdâ is not a member of âignite::binary::BinaryType<RtCassEpcTableDataVo>â
                             return ignite::binary::BinaryType<T>::GetFieldId(name);
                                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~
    

    持久性设置。xml如下所示:

    <persistence keyspace="test" table="epc_table">
        <keyPersistence class="java.lang.String" strategy="PRIMITIVE" column="imsi"/>
        <valuePersistence column="data" />
    </persistence>
    

    我不明白为什么这个程序在其他一些表上使用时会起作用(cpp和persistence setting.xml中有一些小的变化)。

    CREATE TABLE test.table2 (
        imsi text PRIMARY KEY,
        data int
    )
    

    继续: Integrating Apache Cassandra with Apache Ignite

    1 回复  |  直到 7 年前
        1
  •  1
  •   sk0x50    7 年前

    看起来你没有提供 BinaryType 类型模板 RtCassEpcTableDataVo .如下所示:

    class RtCassEpcTableDataVo {
        friend struct ignite::binary::BinaryType<RtCassEpcTableDataVo>;
        ...
    }
    
    template<> struct ignite::binary::BinaryType<RtCassEpcTableDataVo> {
      static void Write(BinaryWriter& writer, const RtCassEpcTableDataVo& obj) {
        // writing data
        // writer.Write...("attributename", obj.GetAttribute());
      }    
    
      static void Read(BinaryReader& reader, RtCassEpcTableDataVo& dst) {
          // reading data
          // dst.attribute = reader.Read...("attributename");
      }
    
      ...
    }
    

    全面的描述和示例可在此处找到: Object Serialization