From: Warren Young Date: July 16 2007 1:35pm Subject: Re: Weird parsing of templated query List-Archive: http://lists.mysql.com/plusplus/6809 Message-Id: <469B7429.2080302@etr-usa.com> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit Steven Van Ingelgem wrote: > > People can say like: > > DatabasePtr->preparestatement( "SELECT * FROM %0 WHERE %1=%2q;" ); > (I don't know how many parameters there are here!, this is all client > sided). > +--> this calls query << "passed query"; query.parse(); > > PrepSttPtr->bindParam( , value ); > +--> this calls query.def[ ] = value; > > PrepSttPtr->fetch()/runQuery() > +--> this calls store/execute If the queries are known at compile time, I would say you have designed the wrong interface. You should just provide an equivalent of the current MySQL++ interface. Your example of three parameters would be followed by a call like PrepSttPtr->fetch(a, b, c); If the queries come as input to the program after it's compiled, I don't see the need for template queries at all. There should be no need to build the query in two parts in this case. > They can even re-use the preparedstatement, only re-binding the > changed parameters (for example a big update). Template queries are not "prepared statements". That refers to a specific MySQL server feature in which the query is pre-parsed on the server side, so that subsequent calls save some execution time. MySQL++'s template queries do not make use of this feature, and enjoy no speed advantage. I point this out in case you are trying to justify the use of template queries with this misconception in mind. > This worked untill lately I upgraded to v 232. In this version I don't find > a way to (without a hack) make it work again. Well, it was a hack to begin with. > I fixed it by adding in query.cpp at the very last line of the proc() > function: "p.processing_ = false;" > > processing_ is defined as "has been processed"... No, that's not how it is defined. When true, this flag means the SQLQueryParams object is being processed at that moment. Processing isn't complete until after proc()'s caller exits, in order to prevent an infinite recursion loop. The only reason this seems to work is because in your particular use, there are two SQLQueryParams objects: Query::def and the temporary created in some versions of execute() and friends. You're only marking one of them as finished processing, so it happens to work. I suspect you'll still hit the infinite call loop in some uses with a single parameter with this change, though I can't prove it right now.