WIP on data (JSON Path queries)
This commit is contained in:
parent
fa281124bb
commit
dc31b65be8
@ -11,12 +11,20 @@ class Data
|
||||
/** The prayer request table */
|
||||
const REQ_TABLE = 'prayer_request';
|
||||
|
||||
/**
|
||||
* Configure the data connection
|
||||
*/
|
||||
public static function configure()
|
||||
{
|
||||
Configuration::$connectionString = 'pgsql:host=localhost;port=5432;dbname=leafjson;user=leaf;password=leaf';
|
||||
//Configuration::$startUp = '\MyPrayerJournal\Data::startUp';
|
||||
}
|
||||
|
||||
/**
|
||||
* Ensure the table and index exist
|
||||
*/
|
||||
public static function startUp()
|
||||
{
|
||||
Configuration::$connectionString = "pgsql:host=localhost;port=5432;dbname=leafjson;user=leaf;password=leaf";
|
||||
Definition::ensureTable(self::REQ_TABLE);
|
||||
Definition::ensureIndex(self::REQ_TABLE, DocumentIndex::Optimized);
|
||||
}
|
||||
@ -96,10 +104,10 @@ class Data
|
||||
private static function getJournalByAnswered(string $userId, string $op): array
|
||||
{
|
||||
$sql = Query::selectFromTable(self::REQ_TABLE)
|
||||
. ' WHERE ' . Query::whereDataContains(':criteria') . ' AND ' . Query::whereJsonPathMatches(':path');
|
||||
. ' WHERE ' . Query::whereDataContains('$1') . ' AND ' . Query::whereJsonPathMatches('$2');
|
||||
$params = [
|
||||
':criteria' => Query::jsonbDocParam([ 'userId' => $userId ]),
|
||||
':path' => '$.history[*].action (@ ' . $op . ' "' . RequestAction::Answered->name . '")'
|
||||
Query::jsonbDocParam([ 'userId' => $userId ]),
|
||||
'$.history[*].action (@ ' . $op . ' "' . RequestAction::Answered->name . '")'
|
||||
];
|
||||
return self::mapToJournalRequest(
|
||||
Document::customList($sql, $params, Request::class, Document::mapFromJson(...)), true);
|
||||
|
@ -3,6 +3,8 @@ declare(strict_types=1);
|
||||
|
||||
namespace BitBadger\PgSQL\Documents;
|
||||
|
||||
use \PgSql\Connection;
|
||||
|
||||
/**
|
||||
* Document table configuration
|
||||
*/
|
||||
@ -14,6 +16,27 @@ class Configuration
|
||||
/** @var ?\PDO $conn The active connection */
|
||||
private static ?\PDO $conn = null;
|
||||
|
||||
/** @var ?Connection $rawConn An active non-PDO PostgreSQL connection */
|
||||
private static ?Connection $rawConn = null;
|
||||
|
||||
/** @var ?string $startUp The name of a function to run on first connection to the database */
|
||||
public static ?string $startUp = null;
|
||||
|
||||
/**
|
||||
* Ensure that the connection string is set, either explicity, by environment variables, or with defaults
|
||||
*/
|
||||
private static function ensureConnectionString()
|
||||
{
|
||||
if (self::$connectionString == "") {
|
||||
$host = $_ENV['PGDOC_HOST'] ?? 'localhost';
|
||||
$port = $_ENV['PGDOC_PORT'] ?? 5432;
|
||||
$db = $_ENV['PGDOC_DB'] ?? 'postgres';
|
||||
$user = $_ENV['PGDOC_USER'] ?? 'postgres';
|
||||
$pass = $_ENV['PGDOC_PASS'] ?? 'postgres';
|
||||
self::$connectionString = "pgsql:host=$host;port=$port;dbname=$db;user=$user;pass=$pass";
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the database connection, connecting on first request
|
||||
*
|
||||
@ -22,10 +45,31 @@ class Configuration
|
||||
public static function getConn(): \PDO
|
||||
{
|
||||
if (is_null(self::$conn)) {
|
||||
self::ensureConnectionString();
|
||||
self::$conn = new \PDO(self::$connectionString);
|
||||
|
||||
if (!is_null(self::$startUp)) {
|
||||
call_user_func(self::$startUp);
|
||||
}
|
||||
}
|
||||
return self::$conn;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
public static function getRawConn(): Connection
|
||||
{
|
||||
if (is_null(self::$rawConn)) {
|
||||
self::ensureConnectionString();
|
||||
self::$rawConn = pg_connect(str_replace(';', ' ', self::$connectionString));
|
||||
|
||||
if (!is_null(self::$startUp)) {
|
||||
call_user_func(self::$startUp);
|
||||
}
|
||||
}
|
||||
return self::$rawConn;
|
||||
}
|
||||
}
|
||||
|
||||
require('functions.php');
|
||||
|
@ -4,6 +4,7 @@ declare(strict_types=1);
|
||||
namespace BitBadger\PgSQL\Documents;
|
||||
|
||||
use PDOStatement;
|
||||
use PgSql\Result;
|
||||
|
||||
/** Document manipulation functions */
|
||||
class Document
|
||||
@ -402,8 +403,14 @@ class Document
|
||||
*/
|
||||
private static function createCustomQuery(string $sql, array $params): PDOStatement
|
||||
{
|
||||
$result = pg_query_params(pgconn(), $sql, $params);
|
||||
echo "Preparing statement for $sql\n";
|
||||
foreach ($params as $name => $value) {
|
||||
echo "Binding $name to $value\n";
|
||||
}
|
||||
$query = pdo()->prepare($sql);
|
||||
foreach ($params as $name => $value) {
|
||||
echo "Binding $name to $value\n";
|
||||
$query->bindParam($name, $value);
|
||||
}
|
||||
$query->execute();
|
||||
@ -421,9 +428,14 @@ class Document
|
||||
*/
|
||||
public static function customList(string $sql, array $params, string $className, callable $mapFunc): array
|
||||
{
|
||||
return array_map(
|
||||
fn ($it) => $mapFunc($it, $className),
|
||||
self::createCustomQuery($sql, $params)->fetchAll(\PDO::FETCH_ASSOC));
|
||||
$data = pg_query_params(pgconn(), $sql, $params);
|
||||
$result = [];
|
||||
if (!$data) return $result;
|
||||
while ($row = pg_fetch_array($data, mode: PGSQL_ASSOC)) {
|
||||
array_push($result, $mapFunc($row, $className));
|
||||
}
|
||||
pg_free_result($data);
|
||||
return $result;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -13,3 +13,14 @@ if (!function_exists('pdo')) {
|
||||
return Configuration::getConn();
|
||||
}
|
||||
}
|
||||
if (!function_exists('pgconn')) {
|
||||
/**
|
||||
* Return the active PostgreSQL connection
|
||||
*
|
||||
* @return \PgSql\Connection The open PostgreSQL connection
|
||||
*/
|
||||
function pgconn()
|
||||
{
|
||||
return Configuration::getRawConn();
|
||||
}
|
||||
}
|
||||
|
@ -4,11 +4,14 @@ require __DIR__ . '/vendor/autoload.php';
|
||||
|
||||
use MyPrayerJournal\Data;
|
||||
|
||||
Data::startUp();
|
||||
Data::configure();
|
||||
//Data::findFullRequestById('abc', 'def');
|
||||
//echo "Returned from req\n";
|
||||
|
||||
//Data::getAnsweredRequests('abc');
|
||||
|
||||
app()->template->config('path', './pages');
|
||||
app()->template->config('params', [
|
||||
// 'app' => function () { return app(); },
|
||||
'page_link' => function (string $url, bool $checkActive = false) {
|
||||
echo 'href="'. $url . '" hx-get="' . $url . '"';
|
||||
if ($checkActive && str_starts_with($_SERVER['REQUEST_URI'], $url)) {
|
||||
@ -34,8 +37,10 @@ function renderPage(string $template, array $params, string $pageTitle)
|
||||
response()->markup(app()->template->render('layout/full', $params));
|
||||
}
|
||||
|
||||
Data::getAnsweredRequests('abc');
|
||||
app()->get('/', function () {
|
||||
renderPage('home', [], 'Welcome');
|
||||
phpinfo();
|
||||
//renderPage('home', [], 'Welcome');
|
||||
});
|
||||
|
||||
app()->get('/legal/privacy-policy', function () {
|
||||
|
Loading…
Reference in New Issue
Block a user