202 lines
4.8 KiB
PHP
202 lines
4.8 KiB
PHP
<?php
|
|
|
|
namespace alveolata\storage;
|
|
|
|
// require_once(DIR_ALVEOLATA . '/definitions.php');
|
|
require_once(DIR_ALVEOLATA . '/string/functions.php');
|
|
require_once(DIR_ALVEOLATA . '/list/functions.php');
|
|
require_once(DIR_ALVEOLATA . '/report/functions.php');
|
|
require_once(DIR_ALVEOLATA . '/storage/implementation-sqltable/functions.php');
|
|
|
|
|
|
/**
|
|
* @author Christian Fraß <frass@greenscale.de>
|
|
*/
|
|
class struct_sqltablegroup
|
|
{
|
|
|
|
/**
|
|
* @var struct_sqltable
|
|
* @author Christian Fraß <frass@greenscale.de>
|
|
*/
|
|
public $core;
|
|
|
|
|
|
/**
|
|
* @var list<record<sqltable:struct_sqltable,key:string,target:string>>
|
|
* @author Christian Fraß <frass@greenscale.de>
|
|
*/
|
|
public $satellites;
|
|
|
|
|
|
/**
|
|
* @author Christian Fraß <frass@greenscale.de>
|
|
*/
|
|
public function __construct(
|
|
\alveolata\storage\struct_sqltable $core,
|
|
array $satellites
|
|
)
|
|
{
|
|
$this->core = $core;
|
|
$this->satellites = $satellites;
|
|
}
|
|
|
|
}
|
|
|
|
|
|
/**
|
|
* @author Christian Fraß <frass@greenscale.de>
|
|
*/
|
|
function sqltablegroup_make(
|
|
\alveolata\storage\struct_sqltable $core,
|
|
array $satellites
|
|
)
|
|
{
|
|
return (
|
|
new struct_sqltablegroup(
|
|
$core,
|
|
$satellites
|
|
)
|
|
);
|
|
}
|
|
|
|
|
|
/**
|
|
* @author Christian Fraß <frass@greenscale.de>
|
|
*/
|
|
function sqltablegroup_teardown(
|
|
struct_sqltablegroup $subject
|
|
) : void
|
|
{
|
|
foreach ($subject->satellites as $satellite) {
|
|
\alveolata\storage\sqltable_teardown($satellite['sqltable']);
|
|
}
|
|
\alveolata\storage\sqltable_teardown($subject->core);
|
|
}
|
|
|
|
|
|
/**
|
|
* @author Christian Fraß <frass@greenscale.de>
|
|
*/
|
|
function sqltablegroup_setup(
|
|
struct_sqltablegroup $subject
|
|
) : void
|
|
{
|
|
\alveolata\storage\sqltable_setup($subject->core);
|
|
foreach ($subject->satellites as $satellite) {
|
|
\alveolata\storage\sqltable_setup($satellite['sqltable']);
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
* @author Christian Fraß <frass@greenscale.de>
|
|
*/
|
|
function sqltablegroup_create(
|
|
struct_sqltablegroup $subject,
|
|
/*map<string,any> */$value
|
|
)/* : int*/
|
|
{
|
|
$value_stripped = $value;
|
|
foreach ($subject->satellites as $satellite) {
|
|
unset($value_stripped[$satellite['target']]);
|
|
}
|
|
$key = \alveolata\storage\sqltable_create($subject->core, $value_stripped);
|
|
foreach ($subject->satellites as $satellite) {
|
|
foreach ($value[$satellite['target']] as $value_orbit) {
|
|
$value_orbit[$satellite['key']] = $key;
|
|
\alveolata\storage\sqltable_create($satellite['sqltable'], $value_orbit);
|
|
}
|
|
}
|
|
return $key;
|
|
}
|
|
|
|
|
|
/**
|
|
* @author Christian Fraß <frass@greenscale.de>
|
|
* @todo improve update of satellites
|
|
*/
|
|
function sqltablegroup_update(
|
|
struct_sqltablegroup $subject,
|
|
/*int */$key,
|
|
/*map<string,any> */$value
|
|
) : void
|
|
{
|
|
$value_stripped = $value;
|
|
foreach ($subject->satellites as $satellite) {
|
|
unset($value_stripped[$satellite['target']]);
|
|
}
|
|
\alveolata\storage\sqltable_update($subject->core, $key, $value_stripped);
|
|
foreach ($subject->satellites as $satellite) {
|
|
// delete old
|
|
$keys_satellites = \alveolata\storage\sqltable_search($satellite['sqltable'], [$satellite['key'] => $key]);
|
|
foreach ($keys_satellites as $key_satellite) {
|
|
\alveolata\storage\sqltable_delete($satellite['sqltable'], $key_satellite);
|
|
}
|
|
// create new
|
|
foreach ($value[$satellite['target']] as $value_orbit) {
|
|
$value_orbit[$satellite['key']] = $key;
|
|
\alveolata\storage\sqltable_create($satellite['sqltable'], $value_orbit);
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
* @author Christian Fraß <frass@greenscale.de>
|
|
*/
|
|
function sqltablegroup_delete(
|
|
struct_sqltablegroup $subject,
|
|
/*int */$key
|
|
) : void
|
|
{
|
|
foreach ($subject->satellites as $satellite) {
|
|
$key_satellites = \alveolata\storage\sqltable_search($satellite['sqltable'], [$satellite['key'] => $key]);
|
|
foreach ($key_satellites as $key_satellite) {
|
|
\alveolata\storage\sqltable_delete($satellite['sqltable'], $key_satellite);
|
|
}
|
|
}
|
|
\alveolata\storage\sqltable_delete($subject->core, $key);
|
|
}
|
|
|
|
|
|
/**
|
|
* @author Christian Fraß <frass@greenscale.de>
|
|
*/
|
|
function sqltablegroup_read(
|
|
struct_sqltablegroup $subject,
|
|
/*int */$key
|
|
)/* : map<string,any>*/
|
|
{
|
|
$value = \alveolata\storage\sqltable_read($subject->core, $key);
|
|
foreach ($subject->satellites as $satellite) {
|
|
$keys_satellites = \alveolata\storage\sqltable_search($satellite['sqltable'], [$satellite['key'] => $key]);
|
|
$value_orbit = [];
|
|
foreach ($keys_satellites as $key_satellite) {
|
|
$value_orbit_element = \alveolata\storage\sqltable_read($satellite['sqltable'], $key_satellite);
|
|
unset($value_orbit_element[$satellite['key']]);
|
|
array_push($value_orbit, $value_orbit_element);
|
|
}
|
|
$value[$satellite['target']] = $value_orbit;
|
|
}
|
|
return $value;
|
|
}
|
|
|
|
|
|
/**
|
|
* @author Christian Fraß <frass@greenscale.de>
|
|
* @todo search in satellites
|
|
*/
|
|
function sqltablegroup_search(
|
|
struct_sqltablegroup $subject,
|
|
array $parameters = []
|
|
) : array
|
|
{
|
|
$parameters_stripped = $parameters;
|
|
foreach ($subject->satellites as $satellite) {
|
|
unset($parameters_stripped[$satellite['target']]);
|
|
}
|
|
return \alveolata\storage\sqltable_search($subject->core, $parameters_stripped);
|
|
}
|
|
|
|
?>
|