Warren Young wrote:
> On Oct 14, 2008, at 3:20 PM, Rick Gutleber wrote:
>
>> Do you envision the policy as an actual object (i.e., class)?
> Yes.
>
> The only other alternative that comes to mind is an enum and a switch
> statement inside insert(con, policy), but I think you will actually
> end up with multiple versions of insert(con, policy), if only due to
> the differences between sequence and associative containers. So,
> you'd end up duplicating code if you don't factor it out somehow.
Actually, that was my original thought, which is why I was thinking of
the enum... I didn't quite get what you meant by the Policy class until
this message. I think I do now.
> Also, people may want to create their own policy classes. I don't
> propose to solve everyone's problem with this, just most people's. :)
The template function would work with a completely external Policy class
as long as it provides the right methods: OO without all the messing
around with abstract base classes (although I like abstract base
classes). That's still a new idea to me, I have to get used to it.
>> Or maybe the policy should be a private struct....
>
> End-user code can't create policy objects if the declaration is private.
Duh. <smacks face> I meant a public member struct of the Query class.
>
>> Or, would you prefer me to use my own judgement and show you when I
>> have something? ;-)
>
> That, too, but be prepared for requests to go back and rewrite it. :)
No problem.
>
> You have read HACKERS.txt, I hope?
I have now. :-)
By the way, I really don't know I originally concluded that insert( Iter
first, Iter last ) only inserts a row at a time. That's obviously not
true. I think someone spiked my Mountain Dew.
However, that leads me to another question. I was all ready to start
knocking this thing out, but I realized each of the insert( ), replace(
), etc calls in class Query puts a single query into the stream which
gets executed when you call execute( ). But now we are creating a
situation where one call to insert( ) could result in multiple queries.
We are doing so, among other things, to avoid exceeding the maximum
packet size. If I call execute( ) with, which in turn calls
mysql_real_query( ) which requires multi-statement execution to be
turned on to process multiple statements at once. I would guess that
maximum packet size would apply to the compound statement not each
individual one.
The only alternative I can see is maintaining state outside of calls to
insert( ), something like this:
Query::insert( Iter & it, Policy policy ) {
}
Iter it = container.begin( );
for ( Iter it = container.begin( ); it != container.end( );
query.insert( it, policy ) ) {
query.execute( );
}
Am I missing something here?
Rick

Content reproduced on this site is the property of the respective copyright holders. It is not reviewed in advance by Oracle and does not necessarily represent the opinion of Oracle or any other party.