Support INSERT RETURNING for SQL Server
[dbsrgits/DBIx-Class.git] / lib / DBIx / Class / SQLMaker / MSSQL.pm
index 39e2c4f..943bf4d 100644 (file)
@@ -13,4 +13,74 @@ sub _rno_default_order {
   return \ '(SELECT(1))';
 }
 
-1;
+# more or less copy pasted directly from ::SQLMaker
+sub insert {
+  my $self    = shift;
+  my $table   = $self->_table(shift);
+  my $data    = shift || return;
+  my $options = shift;
+
+  if (! $data or (ref $data eq 'HASH' and !keys %{$data} ) ) {
+    my @bind;
+    my $sql = sprintf(
+      'INSERT INTO %s DEFAULT VALUES', $_[0]->_quote($table)
+    );
+
+    if ( ($options||{})->{returning} ) {
+      my $s;
+      ($s, @bind) = $self->_insert_returning ($options);
+      $sql .= $s;
+    }
+
+    return ($sql, @bind);
+  }
+
+  my $method = $self->_METHOD_FOR_refkind("_insert", $data);
+  my ($sql, @bind) = $self->$method($data);
+
+  $sql = join " ", $self->_sqlcase('insert into'), $table, $sql;
+
+  if ($options->{returning}) {
+    my ($s, @b) = $self->_insert_returning ($options);
+    $sql =~ s/\bVALUES\b/$s VALUES/;
+    @bind = (@b, @bind);
+  }
+
+  return wantarray ? ($sql, @bind) : $sql;
+}
+
+
+# insert returning docs at
+# http://msdn.microsoft.com/en-us/library/ms177564.aspx
+
+sub _insert_returning {
+  my ($self, $options) = @_;
+
+  my $f = $options->{returning};
+
+  my @f_list = do {
+    if (! ref $f) {
+      ($f)
+    }
+    elsif (ref $f eq 'ARRAY') {
+      @$f
+    }
+    elsif (ref $f eq 'SCALAR') {
+      (
+        ($$f)
+      )
+    }
+    else {
+      $self->throw_exception("Unsupported INSERT RETURNING option $f");
+    }
+  };
+
+  return (
+    join ' ',
+    $self->_sqlcase(' output'),
+    join ', ',
+    map $self->_quote("INSERTED.$_"), @f_list,
+  );
+}
+
+1