soselo/classes/PgDatabase.php

93 lines
2.5 KiB
PHP

<?php
class PgDatabase {
private $db = null;
public function __construct($software=null, $instance=null) {
if ($software === null && !isset($GLOBALS['ap_software'])) {
$url = trim($_SERVER['REQUEST_URI'], '/');
$url = substr($url, 7); // api/vX/
$ps = explode('/', $url);
$software = $ps[1];
}
if ($software === null && isset($GLOBALS['ap_software']))
$software = $GLOBALS['ap_software'];
$config = null;
if ($instance === null)
$config = instance_config($software);
else $config = instance_config($software, $instance);
if ($config === null) return;
$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(['error' => 'Could not connect to postgres: '.pg_last_error()], 500);
}
public function is_ok() {
return $this->db !== null;
}
public function escape($str) {
return pg_escape_string($this->db, $str);
}
public function query($sql) {
$result = pg_query($this->db, $sql);
if (!$result) apiresult('The postgres query has failed: '.pg_last_error());
return $result;
}
public function fetch($sql, $cache=null, $only_cached=false) {
$sql = trim($sql);
cronjob_db_create__check_cachecfg($GLOBALS['ap_software'],
$GLOBALS['ap_instance'], $sql, $cache);
$cache_key = $GLOBALS['ap_software'].$GLOBALS['ap_instance'].$sql;
if ($cache !== null) {
$cached = content_cache__get($cache_key);
if ($cached !== null)
return $cached;
}
if ($only_cached)
return 'not_cached';
$result = $this->query($sql);
$data = pg_fetch_assoc($result);
if ($cache !== null)
content_cache__put($cache_key, $cache, $data);
return $data;
}
public function fetch_all($sql, $cache=null, $only_cached=false) {
$sql = trim($sql);
cronjob_db_create__check_cachecfg($GLOBALS['ap_software'],
$GLOBALS['ap_instance'], $sql, $cache);
$cache_key = $GLOBALS['ap_software'].$GLOBALS['ap_instance'].$sql;
if ($cache !== null) {
$cached = content_cache__get($cache_key);
if ($cached !== null)
return $cached;
}
if ($only_cached)
return 'not_cached';
$data = [];
$result = $this->query($sql);
while ($line = pg_fetch_array($result, null, PGSQL_ASSOC)) {
$data []= $line;
}
pg_free_result($result);
if ($cache !== null)
content_cache__put($cache_key, $cache, $data);
return $data;
}
public function close($result=null) {
if ($result !== null)
pg_free_result($result);
pg_close($this->db);
}
}