Skip to content

Commit

Permalink
MDL-33434 mssql: Improve handling of returned ids on insert.
Browse files Browse the repository at this point in the history
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
stronk7 committed May 30, 2012
1 parent 514da61 commit 21bb3f9
Showing 1 changed file with 16 additions and 5 deletions.
21 changes: 16 additions & 5 deletions lib/dml/mssql_native_moodle_database.php
Expand Up @@ -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";
}
}

Expand All @@ -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);

Expand Down

0 comments on commit 21bb3f9

Please sign in to comment.