Add PgDatabase class for Postgres connections

This commit is contained in:
Bofh 2022-11-27 21:17:38 +01:00
parent 7c940b058d
commit c4efc9a21d
1 changed files with 70 additions and 1 deletions

View File

@ -1,5 +1,74 @@
<?php
class PgDatabase {
private $db = null;
public function __construct() {
$instance = isset($_GET['instance']) ? trim($_GET['instance']) : null;
if ($instance === null) return;
$url = trim($_SERVER['REQUEST_URI'], '/');
$url = substr($url, 7); // api/vX/
$ps = explode('/', $url);
if ($ps[0] !== 'database') return;
$software = $ps[1];
if (!preg_match('/^[a-zA-Z0-9\.\-\_]+$/', $instance))
apiresult(['error' => 'instance parameter is not correctly formatted'], 400);
if (!preg_match('/^[a-zA-Z0-9\.\-\_]+$/', $software))
apiresult(['error' => 'software parameter is not correctly formatted'], 400);
$GLOBALS['IS_PHP'] = true;
require 'api/v1/config/get/mod.php';
unset($GLOBALS['IS_PHP']);
$found = false;
foreach ($GLOBALS['api_data']['hosts'][$software] as $ins_cfg) {
if ($ins_cfg['instance'] === $instance) {
$found = $ins_cfg;
break;
}
}
if ($found === false) return;
$config = [];
$config_raw = explode("\n", trim($found['config']));
foreach ($config_raw as $ln) {
$k = substr($ln, 0, strpos($ln,'='));
$v = substr($ln, strpos($ln,'=')+1);
$config[$k] = $v;
}
$this->db = pg_connect(
' host='.$config['psql_host'].
' port='.$config['psql_port'].
' dbname='.$config['psql_db'].
' user='.$config['psql_username'].
' password='.$config['psql_password'].
'') or apiresult('Could not connect to postgres: '.pg_last_error());
}
public function is_ok() {
return $this->db !== null;
}
public function query($sql) {
$result = pg_query($sql);
if (!$result) apiresult('The postgres query has failed: '.pg_last_error());
return $result;
}
public function fetch_all($sql) {
$data = [];
$result = $this->query($sql);
while ($line = pg_fetch_array($result, null, PGSQL_ASSOC)) {
$data []= $line;
}
pg_free_result($result);
return $data;
}
public function close($result=null) {
if ($result !== null)
pg_free_result($result);
pg_close($this->db);
}
}