<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Fri, Nov 14, 2014 at 11:11 AM, Michael Van Canneyt <span dir="ltr"><<a href="mailto:michael@freepascal.org" target="_blank">michael@freepascal.org</a>></span> wrote:</div><div class="gmail_quote">[...]<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
By the very nature of the problem: GetLastAutoIncValue simply cannot be implemented in general.<br>
<br>
In firebird, postgres, these values are generated using a generator/sequence.<br>
You don't know the name of the generator, and even if you did, it is impossible to retrieve the value that was used to fill your particular record because the sequence/generator may have been updated several thousands of times by the time your second statement arrives.<br>
<br>
The only way to do this correctly is using a RETURNING clause when doing the insert.<br></blockquote><div><br></div><div>Indded.</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
The idea is to add [pfRefresh] to providerflags. When doing an insert, the fields with this flag will be added to the RETURNING clause and used to update the buffer.<br>
<br>
Fields of type ftautoInc can be added to this list (i.e. they automatically<br>
get pfRefresh in their providerflags)<br>
<br>
This approach will work on all SQL databases that support RETURNING.<br>
(That should include any SQL database available today)</blockquote></div><div><br></div><div>Just a suggestion: it would be nice to implement it using interface or abstract class (like ConnectionDef). So if a database X does not provide the RETURNING support, a "mortal programmer" could do that by himself on his own project. =D</div><div><br></div><div>E.g:</div><div><br></div><div>// implemented in FPC PQConnection.pas, using the RETURNING feature</div><div>TPGSequence = class(..., ISQLSequence)</div><div>..</div><div>  function GetLastId: int64;</div><div><br></div><div>// implemented in programmer project, using X feature</div><div>TXSequence = class(..., ISQLSequence)</div><div><div>..</div><div>  function GetLastId: int64;</div></div><div><br></div><div>So:</div><div><br></div><div>PQConnector1.SetSequencer(TPGSequence.Create);</div><div><br></div><div>or:</div><div><br></div><div>XYZConnector1.SetSequencer(TXSequence.Create);<br></div><div><br></div>-- <br><div class="gmail_signature">Silvio Clécio<br>My public projects - <a href="http://github.com/silvioprog" target="_blank">github.com/silvioprog</a></div>
</div></div>