Boost logo

Boost :

Subject: Re: [boost] sqlpp11: SQL for C++
From: Larry Evans (cppljevans_at_[hidden])
Date: 2013-11-11 09:06:55


On 11/11/13 02:36, Roland Bock wrote:
> On 2013-11-11 01:47, Larry Evans wrote:
>> On 11/10/13 18:02, Larry Evans wrote:
>>> On 11/09/13 16:03, Roland Bock wrote:
>>>> Hi,
>>>>
>>>> over the last four or five years I developed several SQL libraries for
>>>> C++. With C++11 I was finally able to create an SQL library that meets
>>>> my own expectations and requirements. It is being used in production, I
>>>> recently put it on github, and I would really like to hear from you
>>>> guys
>>>> whether this is something that could be interesting for you personally
>>>> or for boost?
>>>>
>>>> https://github.com/rbock/sqlpp11
>>>> https://github.com/rbock/sqlpp11/wiki
>>>>
>>> [snip]
>>> The code here:
>>>
>>> https://github.com/rbock/sqlpp11/blob/master/include/sqlpp11/table_base.h
>>>
>>>
>>> contains:
>>>
>>> template<typename Table, typename... ColumnSpec>
>>> struct table_base_t
>>> : public ColumnSpec::_name_t::template
>>> _member_t<column_t<Table, ColumnSpec>>...
>>> {...};
>>>
>>> which looks like it declares a table row, where the columns
>>> come from ColumnSpec...
>
> In understanding how the library works, this is probably one of the
> crucial parts.
> As you guessed correctly, it declares the innards of a table class. The
> somewhat convoluted looking inheritance adds columns as members to the
> class. The
>
> column_t<Table, ColumnSpec>
>
> instantiates a column class with all required information like the value
> type, whether it can be NULL, its textual representation, etc. The
> ColumnSpec also contains a template like this:
>
> template<typename T>
> struct _member_t
> {
> T foo;
> };
>
>
> Inheriting from an instance of this template adds a member with the
> respective name (foo in this example) to derived class.
> Thus, the code you cited adds objects representing columns as
> appropriately named members to the table class.
>

Ah. I see. So tab_sample, if declared as:

   TabSample tab_sample;

where TabSample is from:

   https://github.com/rbock/sqlpp11/blob/master/tests/TabSample.h

could be used in expressions like:

   tab_sample.alpha;
   tab_sample.beta;
   tab_sample.gamma;

Nice! Makes meaningful column names.

However, instead of table_base_t, would maybe row_base_t
be a better name since it's really a row in a table?

>
> The same technique is used when creating aliases for expressions, using
> selects as pseudo tables and constructing result row classes.
>
>
>>>
>>> What's confusing to me is the code here:
>>>
>>> https://github.com/rbock/sqlpp11/wiki/Tables
>>>
>>> contains, what I assume are the ColumnSpecs; however,
>>> there's no column_t, there's only column_type.
>>> Does table_base.h have a typo?
>>>
>> OOPS. I see it now:
>>
>> https://github.com/rbock/sqlpp11/blob/master/include/sqlpp11/column.h
>
> I guess that part of the confusion is due to names. I know that the code
> has inconsistent use of _type and _t suffix, which certainly doesn't
> help and is on my list of todos. Having column_t and a member class
> _column_type is probably also adding to the confusion.
>
> Maybe renaming _column_type to _column_traits_t would be better?

Yes, a bit. However, I must confess, I was a bit careless
while reading the code. Sorry about that :(

>
>
> Best regards,
>
> Roland
>
> _______________________________________________
> Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost
>


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk