Permalink
Browse files

MDL-33434 mssql: Improve handling of returned ids on insert.

This commit moves from the batch SCOPE_IDENTITY() way to return
the inserted ids to the OUTPUT alternative (supported and
recommended since 2005). Also the handling of possible return
values is improved, with all the alternatives leading to expected results.
  • Loading branch information...
1 parent a906556 commit 87ba4ff25a40ecc3655ae056cee37d353705d2b1 @stronk7 stronk7 committed May 30, 2012
Showing with 16 additions and 5 deletions.
  1. +16 −5 lib/dml/mssql_native_moodle_database.php
@@ -810,7 +810,7 @@ public function insert_record_raw($table, $params, $returnid=true, $bulk=false,
} else {
unset($params['id']);
if ($returnid) {
- $returning = "; SELECT SCOPE_IDENTITY()";
+ $returning = "OUTPUT inserted.id";
}
}
@@ -822,18 +822,29 @@ public function insert_record_raw($table, $params, $returnid=true, $bulk=false,
$qms = array_fill(0, count($params), '?');
$qms = implode(',', $qms);
- $sql = "INSERT INTO {" . $table . "} ($fields) VALUES($qms) $returning";
+ $sql = "INSERT INTO {" . $table . "} ($fields) $returning VALUES ($qms)";
list($sql, $params, $type) = $this->fix_sql_params($sql, $params);
$rawsql = $this->emulate_bound_params($sql, $params);
$this->query_start($sql, $params, SQL_QUERY_INSERT);
$result = mssql_query($rawsql, $this->mssql);
- $this->query_end($result);
+ // Expected results are:
+ // - true: insert ok and there isn't returned information.
+ // - false: insert failed and there isn't returned information.
+ // - resource: insert executed, need to look for returned (output)
+ // values to know if the insert was ok or no. Posible values
+ // are false = failed, integer = insert ok, id returned.
+ $end = false;
+ if (is_bool($result)) {
+ $end = $result;
+ } else if (is_resource($result)) {
+ $end = mssql_result($result, 0, 0); // Fetch 1st column from 1st row.
+ }
+ $this->query_end($end); // End the query with the calculated $end.
if ($returning !== "") {
- $row = mssql_fetch_assoc($result);
- $params['id'] = reset($row);
+ $params['id'] = $end;
}
$this->free_result($result);

0 comments on commit 87ba4ff

Please sign in to comment.