Fix for => 'shared' on MySQL (RT#64590)
Peter Rabbitson [Thu, 13 Jan 2011 11:41:44 +0000 (12:41 +0100)]
Changes
lib/DBIx/Class.pm
lib/DBIx/Class/SQLMaker/MySQL.pm
t/71mysql.t

diff --git a/Changes b/Changes
index 09663a6..2f6f95b 100644 (file)
--- a/Changes
+++ b/Changes
@@ -16,6 +16,7 @@ Revision history for DBIx::Class
           it easier to pass HashRefInflator data directly to ->populate
         - Improve freeze/thaw semantics and error messages (RT#62546)
         - Fix inconsistency in Manual::Features (RT#64500)
+        - Fix incorrect SQL when using for => 'shared' with MySQL (RT#64590)
 
     * Misc
         - Fix test warning on win32 - at this point the test suite is
index 9fc06fb..dc42f38 100644 (file)
@@ -326,6 +326,8 @@ kaare: Kaare Rasmussen
 
 konobi: Scott McWhirter
 
+littlesavage: Alexey Illarionov <littlesavage@orionet.ru>
+
 lukes: Luke Saunders <luke.saunders@gmail.com>
 
 marcus: Marcus Ramberg <mramberg@cpan.org>
index 16e47e7..ccb1195 100644 (file)
@@ -31,4 +31,19 @@ sub _generate_join_clause {
 
     return $self->SUPER::_generate_join_clause( $join_type );
 }
+
+# LOCK IN SHARE MODE
+my $for_syntax = {
+   update => 'FOR UPDATE',
+   shared => 'LOCK IN SHARE MODE'
+};
+
+sub _lock_select {
+   my ($self, $type) = @_;
+
+   my $sql = $for_syntax->{$type} || croak "Unknown SELECT .. FOR type '$type' requested";
+
+   return " $sql";
+}
+
 1;
index 66ebfd2..d75474e 100644 (file)
@@ -85,6 +85,16 @@ lives_ok {
   });
 } 'Limited FOR UPDATE select works';
 
+# shared-lock
+lives_ok {
+  $schema->txn_do (sub {
+    isa_ok (
+      $schema->resultset('Artist')->find({artistid => 1}, {for => 'shared'}),
+      'DBICTest::Schema::Artist',
+    );
+  });
+} 'LOCK IN SHARE MODE select works';
+
 my $test_type_info = {
     'artistid' => {
         'data_type' => 'INT',