[prev in list] [next in list] [prev in thread] [next in thread] 

List:       mysql-plusplus
Subject:    RE: Boost Serialization of SSQLS
From:       "Dan Cook (dancook)" <dancook () cisco ! com>
Date:       2010-12-20 19:51:49
Message-ID: 3C6C74F54069C1419AEDEC2DD8842EBA078972E5 () xmb-sjc-221 ! amer ! cisco ! com
[Download RAW message or body]

I am still perusing this ...  

> -----Original Message-----
> From: Dan Cook (dancook)
> Sent: Friday, December 17, 2010 11:38 AM
> To: plusplus@lists.mysql.com
> Subject: Boost Serialization of SSQLS
> 
> We use mysql++ SSQLS objects as member data on larger objects.  This
> allows us to ship these member data to and from the database with
ease.
> However now we need to serialize these objects over a socket and
> reconstitute it in another process.  (Yes I know - just read it from
> the database in the other process is the obvious answer, but these
> objects and not fully baked yet and my be transiet.)
> 
> We are using the Boost serialization library to serialize the objects,
> but are running into issues with things like mysqlpp::tiny_int<
> signed_char>.  Boost says all member data of inherited classes must be
> able to serailize themselves.
> 
> I was wondering if anybody is using Boost or something similar to
> serialize the SSQLS objects?
> 
> Regards,
> Dan Cook

I don't think it is very far off.  Digging a little led me the
value_list() inside SSQLS.  I wrote a very simple example. 
It would be nice to be able to do something like the sample below.  The
"serialize" function could use some of the internal data from SSQLS.
But it barfs on the compile with the attached output.  

#define MYSQLPP_MYSQL_HEADERS_BURIED
#include <mysql++/mysql++.h>
#include <mysql++/ssqls.h>

// include headers that implement a archive in simple text format
#include <fstream>
#include <string>

#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>

using std::string;

sql_create_6(stock,
    1, 6, // The meaning of these values is covered in the user manual
    mysqlpp::sql_char, item,
    mysqlpp::sql_bigint, num,
    mysqlpp::sql_double, weight,
    mysqlpp::sql_double, price,
    mysqlpp::sql_date, sdate,
    mysqlpp::Null<mysqlpp::sql_mediumtext>, description
)


/////////////////////////////////////////////////////////////
//
// illustrates serialization for a simple type
//
class MyStock
{
private:
    friend class boost::serialization::access;
    // When the class Archive corresponds to an output archive, the
    // & operator is defined similar to <<.  Likewise, when the class
Archive
    // is a type of input archive the & operator is defined similar to
>>.
    template<class Archive>
    void serialize(Archive & ar, const unsigned int version)
    {
        ar & m_stock.value_list();
    }
    stock m_stock;
public:
    MyStock(){};
    MyStock(const string& item, uint64_t num, float weight,
            float price, const string& date, const string& desc)
    {
        m_stock.item = item;
        m_stock.num = num;
        m_stock.weight = weight;
        m_stock.price = price;
        m_stock.sdate = mysqlpp::sql_date(date);
        m_stock.description = desc;
    }

};

int main() {
    // create and open a character archive for output
    std::ofstream ofs("filename");

    // create class instance
    const MyStock x("Hot Dogs", 100, 1.5, 1.75, "2010-12-25", "mmmm hot
dogs...");

    // save data to archive
    {
        boost::archive::text_oarchive oa(ofs);
        // write class instance to archive
        oa << x;
        // archive and stream closed when destructors are called
    }

    // ... some time later restore the class instance to its orginal
state
    MyStock newX;
    {
        // create and open an archive for input
        std::ifstream ifs("filename");
        boost::archive::text_iarchive ia(ifs);
        // read class state from archive
        ia >> newX;
        // archive and stream closed when destructors are called
    }

    return 0;
}



["g++_out.txt" (text/plain)]


dbJunk.cxx: In member function ‘void MyStock::serialize(Archive&, unsigned int) [with \
                Archive = boost::archive::text_iarchive]’:
../../../CommonLib/include/boost/serialization/access.hpp:118:   instantiated from \
‘static void boost::serialization::access::serialize(Archive&, T&, unsigned int) \
                [with Archive = boost::archive::text_iarchive, T = MyStock]’
../../../CommonLib/include/boost/serialization/serialization.hpp:74:   instantiated \
from ‘void boost::serialization::serialize(Archive&, T&, unsigned int) [with Archive \
                = boost::archive::text_iarchive, T = MyStock]’
../../../CommonLib/include/boost/serialization/serialization.hpp:133:   instantiated \
from ‘void boost::serialization::serialize_adl(Archive&, T&, unsigned int) [with \
                Archive = boost::archive::text_iarchive, T = MyStock]’
../../../CommonLib/include/boost/archive/detail/iserializer.hpp:182:   instantiated \
from ‘void boost::archive::detail::iserializer<Archive, \
T>::load_object_data(boost::archive::detail::basic_iarchive&, void*, unsigned int) \
const [with Archive = boost::archive::text_iarchive, T = MyStock]’ dbJunk.cxx:84:   \
instantiated from here dbJunk.cxx:40: error: no match for ‘operator&’ in ‘ar & \
                ((MyStock*)this)->MyStock::m_stock. stock::value_list()’
../../../CommonLib/include/boost/archive/detail/interface_iarchive.hpp:66: note: \
candidates are: Archive& \
boost::archive::detail::interface_iarchive<Archive>::operator&(T&) [with T = \
                stock_value_list<mysqlpp::quote_type0>, Archive = \
                boost::archive::text_iarchive]
/usr/include/c++/4.1.2/bits/ios_base.h:157: note:                 std::_Ios_Iostate \
                std::operator&(std::_Ios_Iostate, std::_Ios_Iostate)
/usr/include/c++/4.1.2/bits/ios_base.h:119: note:                 std::_Ios_Openmode \
                std::operator&(std::_Ios_Openmode, std::_Ios_Openmode)
/usr/include/c++/4.1.2/bits/ios_base.h:79: note:                 std::_Ios_Fmtflags \
                std::operator&(std::_Ios_Fmtflags, std::_Ios_Fmtflags)
../../../CommonLib/include/mysql++/mystring.h:712: note:                 \
                mysqlpp::ulonglong mysqlpp::operator&(mysqlpp::ulonglong, \
                mysqlpp::String)
../../../CommonLib/include/mysql++/mystring.h:712: note:                 \
                mysqlpp::ulonglong mysqlpp::operator&(mysqlpp::String, \
                mysqlpp::ulonglong)
../../../CommonLib/include/mysql++/mystring.h:711: note:                 \
                mysqlpp::longlong mysqlpp::operator&(mysqlpp::longlong, \
                mysqlpp::String)
../../../CommonLib/include/mysql++/mystring.h:711: note:                 \
                mysqlpp::longlong mysqlpp::operator&(mysqlpp::String, \
                mysqlpp::longlong)
../../../CommonLib/include/mysql++/mystring.h:704: note:                 long \
                unsigned int mysqlpp::operator&(long unsigned int, mysqlpp::String)
../../../CommonLib/include/mysql++/mystring.h:704: note:                 long \
                unsigned int mysqlpp::operator&(mysqlpp::String, long unsigned int)
../../../CommonLib/include/mysql++/mystring.h:703: note:                 short \
                unsigned int mysqlpp::operator&(short unsigned int, mysqlpp::String)
../../../CommonLib/include/mysql++/mystring.h:703: note:                 short \
                unsigned int mysqlpp::operator&(mysqlpp::String, short unsigned int)
../../../CommonLib/include/mysql++/mystring.h:702: note:                 unsigned int \
                mysqlpp::operator&(unsigned int, mysqlpp::String)
../../../CommonLib/include/mysql++/mystring.h:702: note:                 unsigned int \
                mysqlpp::operator&(mysqlpp::String, unsigned int)
../../../CommonLib/include/mysql++/mystring.h:701: note:                 unsigned \
                char mysqlpp::operator&(unsigned char, mysqlpp::String)
../../../CommonLib/include/mysql++/mystring.h:701: note:                 unsigned \
                char mysqlpp::operator&(mysqlpp::String, unsigned char)
../../../CommonLib/include/mysql++/mystring.h:699: note:                 long int \
                mysqlpp::operator&(long int, mysqlpp::String)
../../../CommonLib/include/mysql++/mystring.h:699: note:                 long int \
                mysqlpp::operator&(mysqlpp::String, long int)
../../../CommonLib/include/mysql++/mystring.h:698: note:                 short int \
                mysqlpp::operator&(short int, mysqlpp::String)
../../../CommonLib/include/mysql++/mystring.h:698: note:                 short int \
                mysqlpp::operator&(mysqlpp::String, short int)
../../../CommonLib/include/mysql++/mystring.h:697: note:                 int \
                mysqlpp::operator&(int, mysqlpp::String)
../../../CommonLib/include/mysql++/mystring.h:697: note:                 int \
                mysqlpp::operator&(mysqlpp::String, int)
../../../CommonLib/include/mysql++/mystring.h:696: note:                 char \
                mysqlpp::operator&(char, mysqlpp::String)
../../../CommonLib/include/mysql++/mystring.h:696: note:                 char \
                mysqlpp::operator&(mysqlpp::String, char)
dbJunk.cxx: In member function ‘void MyStock::serialize(Archive&, unsigned int) [with \
                Archive = boost::archive::text_oarchive]’:
../../../CommonLib/include/boost/serialization/access.hpp:118:   instantiated from \
‘static void boost::serialization::access::serialize(Archive&, T&, unsigned int) \
                [with Archive = boost::archive::text_oarchive, T = MyStock]’
../../../CommonLib/include/boost/serialization/serialization.hpp:74:   instantiated \
from ‘void boost::serialization::serialize(Archive&, T&, unsigned int) [with Archive \
                = boost::archive::text_oarchive, T = MyStock]’
../../../CommonLib/include/boost/serialization/serialization.hpp:133:   instantiated \
from ‘void boost::serialization::serialize_adl(Archive&, T&, unsigned int) [with \
                Archive = boost::archive::text_oarchive, T = MyStock]’
../../../CommonLib/include/boost/archive/detail/oserializer.hpp:148:   instantiated \
from ‘void boost::archive::detail::oserializer<Archive, \
T>::save_object_data(boost::archive::detail::basic_oarchive&, const void*) const \
[with Archive = boost::archive::text_oarchive, T = MyStock]’ dbJunk.cxx:84:   \
instantiated from here dbJunk.cxx:40: error: no match for ‘operator&’ in ‘ar & \
                ((MyStock*)this)->MyStock::m_stock. stock::value_list()’
../../../CommonLib/include/boost/archive/detail/interface_oarchive.hpp:69: note: \
candidates are: Archive& \
boost::archive::detail::interface_oarchive<Archive>::operator&(T&) [with T = \
                stock_value_list<mysqlpp::quote_type0>, Archive = \
                boost::archive::text_oarchive]
/usr/include/c++/4.1.2/bits/ios_base.h:157: note:                 std::_Ios_Iostate \
                std::operator&(std::_Ios_Iostate, std::_Ios_Iostate)
/usr/include/c++/4.1.2/bits/ios_base.h:119: note:                 std::_Ios_Openmode \
                std::operator&(std::_Ios_Openmode, std::_Ios_Openmode)
/usr/include/c++/4.1.2/bits/ios_base.h:79: note:                 std::_Ios_Fmtflags \
                std::operator&(std::_Ios_Fmtflags, std::_Ios_Fmtflags)
../../../CommonLib/include/mysql++/mystring.h:712: note:                 \
                mysqlpp::ulonglong mysqlpp::operator&(mysqlpp::ulonglong, \
                mysqlpp::String)
../../../CommonLib/include/mysql++/mystring.h:712: note:                 \
                mysqlpp::ulonglong mysqlpp::operator&(mysqlpp::String, \
                mysqlpp::ulonglong)
../../../CommonLib/include/mysql++/mystring.h:711: note:                 \
                mysqlpp::longlong mysqlpp::operator&(mysqlpp::longlong, \
                mysqlpp::String)
../../../CommonLib/include/mysql++/mystring.h:711: note:                 \
                mysqlpp::longlong mysqlpp::operator&(mysqlpp::String, \
                mysqlpp::longlong)
../../../CommonLib/include/mysql++/mystring.h:704: note:                 long \
                unsigned int mysqlpp::operator&(long unsigned int, mysqlpp::String)
../../../CommonLib/include/mysql++/mystring.h:704: note:                 long \
                unsigned int mysqlpp::operator&(mysqlpp::String, long unsigned int)
../../../CommonLib/include/mysql++/mystring.h:703: note:                 short \
                unsigned int mysqlpp::operator&(short unsigned int, mysqlpp::String)
../../../CommonLib/include/mysql++/mystring.h:703: note:                 short \
                unsigned int mysqlpp::operator&(mysqlpp::String, short unsigned int)
../../../CommonLib/include/mysql++/mystring.h:702: note:                 unsigned int \
                mysqlpp::operator&(unsigned int, mysqlpp::String)
../../../CommonLib/include/mysql++/mystring.h:702: note:                 unsigned int \
                mysqlpp::operator&(mysqlpp::String, unsigned int)
../../../CommonLib/include/mysql++/mystring.h:701: note:                 unsigned \
                char mysqlpp::operator&(unsigned char, mysqlpp::String)
../../../CommonLib/include/mysql++/mystring.h:701: note:                 unsigned \
                char mysqlpp::operator&(mysqlpp::String, unsigned char)
../../../CommonLib/include/mysql++/mystring.h:699: note:                 long int \
                mysqlpp::operator&(long int, mysqlpp::String)
../../../CommonLib/include/mysql++/mystring.h:699: note:                 long int \
                mysqlpp::operator&(mysqlpp::String, long int)
../../../CommonLib/include/mysql++/mystring.h:698: note:                 short int \
                mysqlpp::operator&(short int, mysqlpp::String)
../../../CommonLib/include/mysql++/mystring.h:698: note:                 short int \
                mysqlpp::operator&(mysqlpp::String, short int)
../../../CommonLib/include/mysql++/mystring.h:697: note:                 int \
                mysqlpp::operator&(int, mysqlpp::String)
../../../CommonLib/include/mysql++/mystring.h:697: note:                 int \
                mysqlpp::operator&(mysqlpp::String, int)
../../../CommonLib/include/mysql++/mystring.h:696: note:                 char \
                mysqlpp::operator&(char, mysqlpp::String)
../../../CommonLib/include/mysql++/mystring.h:696: note:                 char \
mysqlpp::operator&(mysqlpp::String, char)



-- 
MySQL++ Mailing List
For list archives: http://lists.mysql.com/plusplus
To unsubscribe:    http://lists.mysql.com/plusplus?unsub=mysql-plusplus@progressive-comp.com

[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic