modifs.mineures sans commentaires

This commit is contained in:
Jephté Clain 2025-04-13 18:09:24 +04:00
parent 64c872cf3f
commit 86136e75a5
2 changed files with 31 additions and 19 deletions

View File

@ -32,6 +32,7 @@ class Pgsql implements IDatabase {
protected const OPTIONS = [ protected const OPTIONS = [
"persistent" => true, "persistent" => true,
"force_new" => false, "force_new" => false,
"serial_support" => true,
]; ];
const CONFIG = null; const CONFIG = null;
@ -171,17 +172,21 @@ class Pgsql implements IDatabase {
return true; return true;
} }
function getLastSerial() {
$db = $this->db();
$result = @pg_query($db, "select lastval()");
if ($result === false) return false;
$lastSerial = pg_fetch_row($result)[0];
pg_free_result($result);
return $lastSerial;
}
function exec($query, ?array $params=null) { function exec($query, ?array $params=null) {
$db = $this->db(); $db = $this->db();
$query = new query($query, $params); $query = new query($query, $params);
$result = $query->_exec($db); $result = $query->_exec($db);
if ($query->isInsert()) { $serialSupport = $this->options["serial_support"] ?? true;
$result = @pg_query($db, "select lastval()"); if ($serialSupport && $query->isInsert()) return $this->getLastSerial();
if ($result === false) return false;
$lastInsertId = pg_fetch_row($result)[0];
pg_free_result($result);
return $lastInsertId;
}
$affected_rows = pg_affected_rows($result); $affected_rows = pg_affected_rows($result);
pg_free_result($result); pg_free_result($result);
return $affected_rows; return $affected_rows;

View File

@ -1,15 +1,9 @@
<?php <?php
namespace nulib\db\pgsql; namespace nulib\db\pgsql;
use nulib\cv;
use nulib\db\_private\_base; use nulib\db\_private\_base;
use nulib\db\_private\_create;
use nulib\db\_private\_delete;
use nulib\db\_private\_generic;
use nulib\db\_private\_insert;
use nulib\db\_private\_select;
use nulib\db\_private\_update;
use nulib\db\_private\Tbindings; use nulib\db\_private\Tbindings;
use nulib\ValueException;
class query extends _base { class query extends _base {
use Tbindings; use Tbindings;
@ -20,15 +14,28 @@ class query extends _base {
* @return resource * @return resource
*/ */
function _exec($db) { function _exec($db) {
$sql = $this->sql;
$bindings = $this->bindings;
if (static::DEBUG_QUERIES) { #XXX if (static::DEBUG_QUERIES) { #XXX
error_log($this->sql); error_log($sql);
//error_log(var_export($this->bindings, true)); //error_log(var_export($this->bindings, true));
} }
if ($this->bindings !== null) { if ($bindings !== null) {
#XXX corriger les bindings et la requête *dans le constructeur* # trier d'abord les champ par ordre de longueur, pour éviter les overlaps
$result = pg_query_params($db, $this->sql, $this->bindings); $names = array_keys($bindings);
usort($names, function ($a, $b) {
return -cv::compare(strlen(strval($a)), strlen(strval($b)));
});
$bparams = [];
$number = 1;
foreach ($names as $name) {
$sql = str_replace(":$name", "\$$number", $sql);
$bparams[] = $bindings[$name];
$number++;
}
$result = pg_query_params($db, $sql, $bparams);
} else { } else {
$result = pg_query($db, $this->sql); $result = pg_query($db, $sql);
} }
if ($result === false) throw PgsqlException::last_error($db); if ($result === false) throw PgsqlException::last_error($db);
return $result; return $result;