Massively optimize ->cursor->next while fixing some bugs along the way
authorPeter Rabbitson <ribasushi@cpan.org>
Wed, 19 Sep 2012 07:26:44 +0000 (09:26 +0200)
committerPeter Rabbitson <ribasushi@cpan.org>
Thu, 14 Feb 2013 05:34:50 +0000 (06:34 +0100)
commita2f228547345e788da5a047024c41f83513e92b8
tree69cf1d63fe94e8bcedbe9f5ad564f88c860fad73
parentfcf32d04540e2c67625641b0bc004111a7d90252
Massively optimize ->cursor->next while fixing some bugs along the way

Cursor access was previously wrapped in a dbh_do() block with the intent to
restart the connection and the cursor upon a handle error. However this
arrangement overlooks our inability to restart the cursor from the same
spot (or for that matter guarantee the same dataset). Instead we remove
the dbh_do wrap entirely, and just let the exception propagate to whatever
esle might be ready to catch it (and potentially properly retry the select).

As a side effect (because anonsubs are sloooooooow) the end result
yields astonishing speed gains - one of the test cases mentioned in [1]
went (on my test rig) from 9.61058 to 0.64960 due to this commit alone.

A particular detail - the cursor private methods _dbh_next/_dbh_all are no
more as they are unused indirection now. All storage drivers (well their
respective cursors) have been adjusted, but not yet tested due to lack of
a proper environment.

[1] http://lists.scsys.co.uk/pipermail/dbix-class/2012-July/010595.html
Changes
lib/DBIx/Class/Storage/DBI.pm
lib/DBIx/Class/Storage/DBI/ADO/MS_Jet/Cursor.pm
lib/DBIx/Class/Storage/DBI/ADO/Microsoft_SQL_Server/Cursor.pm
lib/DBIx/Class/Storage/DBI/Cursor.pm
lib/DBIx/Class/Storage/DBI/SQLAnywhere/Cursor.pm
t/50fork.t
t/51threads.t
t/51threadtxn.t
t/60core.t
t/750firebird.t