diff -rc soci_100921/src/core/boost-fusion.h soci/src/core/boost-fusion.h
*** soci_100921/src/core/boost-fusion.h	Fri Sep 17 10:35:22 2010
--- soci/src/core/boost-fusion.h	Wed Oct 20 15:49:28 2010
***************
*** 13,36 ****
  // boost
  #include <boost/fusion/container/vector.hpp>
  #include <boost/fusion/sequence/intrinsic/at.hpp>
  #include <boost/fusion/include/at.hpp>
  
  namespace soci
  {
  
! template <typename T0>
! struct type_conversion<boost::fusion::vector<T0> >
  {
      typedef values base_type;
  
      static void from_base(base_type const & in, indicator ind,
!         boost::fusion::vector<T0> & out)
      {
          in
              >> boost::fusion::at_c<0>(out);
      }
  
!     static void to_base(boost::fusion::vector<T0> & in,
          base_type & out, indicator & ind)
      {
          out
--- 13,43 ----
  // boost
  #include <boost/fusion/container/vector.hpp>
  #include <boost/fusion/sequence/intrinsic/at.hpp>
+ #include <boost/fusion/sequence/intrinsic/size.hpp>
  #include <boost/fusion/include/at.hpp>
+ #include <boost/fusion/support/is_sequence.hpp>
+ #include <boost/utility/enable_if.hpp>
  
  namespace soci
  {
+ namespace detail
+ {
+ template <typename Seq, int size>
+ struct type_conversion;
  
! template <typename Seq>
! struct type_conversion<Seq, 1>
  {
      typedef values base_type;
  
      static void from_base(base_type const & in, indicator ind,
!         Seq & out)
      {
          in
              >> boost::fusion::at_c<0>(out);
      }
  
!     static void to_base(Seq & in,
          base_type & out, indicator & ind)
      {
          out
***************
*** 38,57 ****
      }
  };
  
! template <typename T0, typename T1>
! struct type_conversion<boost::fusion::vector<T0, T1> >
  {
      typedef values base_type;
  
      static void from_base(base_type const & in, indicator ind,
!         boost::fusion::vector<T0, T1> & out)
      {
          in
              >> boost::fusion::at_c<0>(out)
              >> boost::fusion::at_c<1>(out);
      }
  
!     static void to_base(boost::fusion::vector<T0, T1> & in,
          base_type & out, indicator & ind)
      {
          out
--- 45,64 ----
      }
  };
  
! template <typename Seq>
! struct type_conversion<Seq, 2>
  {
      typedef values base_type;
  
      static void from_base(base_type const & in, indicator ind,
!         Seq & out)
      {
          in
              >> boost::fusion::at_c<0>(out)
              >> boost::fusion::at_c<1>(out);
      }
  
!     static void to_base(Seq & in,
          base_type & out, indicator & ind)
      {
          out
***************
*** 60,72 ****
      }
  };
  
! template <typename T0, typename T1, typename T2>
! struct type_conversion<boost::fusion::vector<T0, T1, T2> >
  {
      typedef values base_type;
  
      static void from_base(base_type const & in, indicator ind,
!         boost::fusion::vector<T0, T1, T2> & out)
      {
          in
              >> boost::fusion::at_c<0>(out)
--- 67,79 ----
      }
  };
  
! template <typename Seq>
! struct type_conversion<Seq, 3>
  {
      typedef values base_type;
  
      static void from_base(base_type const & in, indicator ind,
!         Seq & out)
      {
          in
              >> boost::fusion::at_c<0>(out)
***************
*** 74,80 ****
              >> boost::fusion::at_c<2>(out);
      }
  
!     static void to_base(boost::fusion::vector<T0, T1, T2> & in,
          base_type & out, indicator & ind)
      {
          out
--- 81,87 ----
              >> boost::fusion::at_c<2>(out);
      }
  
!     static void to_base(Seq & in,
          base_type & out, indicator & ind)
      {
          out
***************
*** 84,96 ****
      }
  };
  
! template <typename T0, typename T1, typename T2, typename T3>
! struct type_conversion<boost::fusion::vector<T0, T1, T2, T3> >
  {
      typedef values base_type;
  
      static void from_base(base_type const & in, indicator ind,
!         boost::fusion::vector<T0, T1, T2, T3> & out)
      {
          in
              >> boost::fusion::at_c<0>(out)
--- 91,103 ----
      }
  };
  
! template <typename Seq>
! struct type_conversion<Seq, 4>
  {
      typedef values base_type;
  
      static void from_base(base_type const & in, indicator ind,
!         Seq & out)
      {
          in
              >> boost::fusion::at_c<0>(out)
***************
*** 99,105 ****
              >> boost::fusion::at_c<3>(out);
      }
  
!     static void to_base(boost::fusion::vector<T0, T1, T2, T3> & in,
          base_type & out, indicator & ind)
      {
          out
--- 106,112 ----
              >> boost::fusion::at_c<3>(out);
      }
  
!     static void to_base(Seq & in,
          base_type & out, indicator & ind)
      {
          out
***************
*** 110,122 ****
      }
  };
  
! template <typename T0, typename T1, typename T2, typename T3, typename T4>
! struct type_conversion<boost::fusion::vector<T0, T1, T2, T3, T4> >
  {
      typedef values base_type;
  
      static void from_base(base_type const & in, indicator ind,
!         boost::fusion::vector<T0, T1, T2, T3, T4> & out)
      {
          in
              >> boost::fusion::at_c<0>(out)
--- 117,129 ----
      }
  };
  
! template <typename Seq>
! struct type_conversion<Seq, 5>
  {
      typedef values base_type;
  
      static void from_base(base_type const & in, indicator ind,
!         Seq & out)
      {
          in
              >> boost::fusion::at_c<0>(out)
***************
*** 126,132 ****
              >> boost::fusion::at_c<4>(out);
      }
  
!     static void to_base(boost::fusion::vector<T0, T1, T2, T3, T4> & in,
          base_type & out, indicator & ind)
      {
          out
--- 133,139 ----
              >> boost::fusion::at_c<4>(out);
      }
  
!     static void to_base(Seq & in,
          base_type & out, indicator & ind)
      {
          out
***************
*** 138,151 ****
      }
  };
  
! template <typename T0, typename T1, typename T2, typename T3, typename T4,
!           typename T5>
! struct type_conversion<boost::fusion::vector<T0, T1, T2, T3, T4, T5> >
  {
      typedef values base_type;
  
      static void from_base(base_type const & in, indicator ind,
!         boost::fusion::vector<T0, T1, T2, T3, T4, T5> & out)
      {
          in
              >> boost::fusion::at_c<0>(out)
--- 145,157 ----
      }
  };
  
! template <typename Seq>
! struct type_conversion<Seq, 6>
  {
      typedef values base_type;
  
      static void from_base(base_type const & in, indicator ind,
!         Seq & out)
      {
          in
              >> boost::fusion::at_c<0>(out)
***************
*** 156,162 ****
              >> boost::fusion::at_c<5>(out);
      }
  
!     static void to_base(boost::fusion::vector<T0, T1, T2, T3, T4, T5> & in,
          base_type & out, indicator & ind)
      {
          out
--- 162,168 ----
              >> boost::fusion::at_c<5>(out);
      }
  
!     static void to_base(Seq & in,
          base_type & out, indicator & ind)
      {
          out
***************
*** 169,182 ****
      }
  };
  
! template <typename T0, typename T1, typename T2, typename T3, typename T4,
!           typename T5, typename T6>
! struct type_conversion<boost::fusion::vector<T0, T1, T2, T3, T4, T5, T6> >
  {
      typedef values base_type;
  
      static void from_base(base_type const & in, indicator ind,
!         boost::fusion::vector<T0, T1, T2, T3, T4, T5, T6> & out)
      {
          in
              >> boost::fusion::at_c<0>(out)
--- 175,187 ----
      }
  };
  
! template <typename Seq>
! struct type_conversion<Seq, 7>
  {
      typedef values base_type;
  
      static void from_base(base_type const & in, indicator ind,
!         Seq & out)
      {
          in
              >> boost::fusion::at_c<0>(out)
***************
*** 188,194 ****
              >> boost::fusion::at_c<6>(out);
      }
  
!     static void to_base(boost::fusion::vector<T0, T1, T2, T3, T4, T5, T6> & in,
          base_type & out, indicator & ind)
      {
          out
--- 193,199 ----
              >> boost::fusion::at_c<6>(out);
      }
  
!     static void to_base(Seq & in,
          base_type & out, indicator & ind)
      {
          out
***************
*** 202,215 ****
      }
  };
  
! template <typename T0, typename T1, typename T2, typename T3, typename T4,
!           typename T5, typename T6, typename T7>
! struct type_conversion<boost::fusion::vector<T0, T1, T2, T3, T4, T5, T6, T7> >
  {
      typedef values base_type;
  
      static void from_base(base_type const & in, indicator ind,
!         boost::fusion::vector<T0, T1, T2, T3, T4, T5, T6, T7> & out)
      {
          in
              >> boost::fusion::at_c<0>(out)
--- 207,219 ----
      }
  };
  
! template <typename Seq>
! struct type_conversion<Seq, 8>
  {
      typedef values base_type;
  
      static void from_base(base_type const & in, indicator ind,
!         Seq & out)
      {
          in
              >> boost::fusion::at_c<0>(out)
***************
*** 222,229 ****
              >> boost::fusion::at_c<7>(out);
      }
  
!     static void to_base(
!         boost::fusion::vector<T0, T1, T2, T3, T4, T5, T6, T7> & in,
          base_type & out, indicator & ind)
      {
          out
--- 226,232 ----
              >> boost::fusion::at_c<7>(out);
      }
  
!     static void to_base(Seq & in,
          base_type & out, indicator & ind)
      {
          out
***************
*** 238,252 ****
      }
  };
  
! template <typename T0, typename T1, typename T2, typename T3, typename T4,
!           typename T5, typename T6, typename T7, typename T8>
! struct type_conversion<
!     boost::fusion::vector<T0, T1, T2, T3, T4, T5, T6, T7, T8> >
  {
      typedef values base_type;
  
      static void from_base(base_type const & in, indicator ind,
!         boost::fusion::vector<T0, T1, T2, T3, T4, T5, T6, T7, T8> & out)
      {
          in
              >> boost::fusion::at_c<0>(out)
--- 241,253 ----
      }
  };
  
! template <typename Seq>
! struct type_conversion<Seq, 9>
  {
      typedef values base_type;
  
      static void from_base(base_type const & in, indicator ind,
!         Seq & out)
      {
          in
              >> boost::fusion::at_c<0>(out)
***************
*** 260,267 ****
              >> boost::fusion::at_c<8>(out);
      }
  
!     static void to_base(
!         boost::fusion::vector<T0, T1, T2, T3, T4, T5, T6, T7, T8> & in,
          base_type & out, indicator & ind)
      {
          out
--- 261,267 ----
              >> boost::fusion::at_c<8>(out);
      }
  
!     static void to_base(Seq & in,
          base_type & out, indicator & ind)
      {
          out
***************
*** 277,291 ****
      }
  };
  
! template <typename T0, typename T1, typename T2, typename T3, typename T4,
!           typename T5, typename T6, typename T7, typename T8, typename T9>
! struct type_conversion<
!     boost::fusion::vector<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9> >
  {
      typedef values base_type;
  
      static void from_base(base_type const & in, indicator ind,
!         boost::fusion::vector<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9> & out)
      {
          in
              >> boost::fusion::at_c<0>(out)
--- 277,289 ----
      }
  };
  
! template <typename Seq>
! struct type_conversion<Seq, 10>
  {
      typedef values base_type;
  
      static void from_base(base_type const & in, indicator ind,
!         Seq & out)
      {
          in
              >> boost::fusion::at_c<0>(out)
***************
*** 300,307 ****
              >> boost::fusion::at_c<9>(out);
      }
  
!     static void to_base(
!         boost::fusion::vector<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9> & in,
          base_type & out, indicator & ind)
      {
          out
--- 298,304 ----
              >> boost::fusion::at_c<9>(out);
      }
  
!     static void to_base(Seq & in,
          base_type & out, indicator & ind)
      {
          out
***************
*** 315,320 ****
--- 312,343 ----
              << boost::fusion::at_c<7>(in)
              << boost::fusion::at_c<8>(in)
              << boost::fusion::at_c<9>(in);
+     }
+ };
+ 
+ } // namespace detail
+ 
+ template <typename T>
+ struct type_conversion<T, 
+     typename boost::enable_if<
+         boost::fusion::traits::is_sequence<T>
+     >::type >
+ {
+     typedef values base_type;
+ 
+     typedef typename boost::fusion::result_of::size<T>::type Size;
+     typedef detail::type_conversion<T, Size::value> Converter;
+ 
+     static void from_base(base_type const & in, indicator ind,
+         T& out)
+     {
+         Converter::from_base( in, ind, out );
+     }
+ 
+     static void to_base(T& in,
+         base_type & out, indicator & ind)
+     {
+         Converter::to_base( in, out, ind );
      }
  };
  
diff -rc soci_100921/src/core/type-conversion-traits.h soci/src/core/type-conversion-traits.h
*** soci_100921/src/core/type-conversion-traits.h	Fri Sep 17 10:35:22 2010
--- soci/src/core/type-conversion-traits.h	Wed Oct 20 15:10:39 2010
***************
*** 15,21 ****
  
  // default traits class type_conversion, acts as pass through for row::get()
  // when no actual conversion is needed.
! template <typename T>
  struct type_conversion
  {
      typedef T base_type;
--- 15,21 ----
  
  // default traits class type_conversion, acts as pass through for row::get()
  // when no actual conversion is needed.
! template <typename T, typename Enable = void>
  struct type_conversion
  {
      typedef T base_type;
