summaryrefslogtreecommitdiffstats
path: root/inc
diff options
context:
space:
mode:
authorSimon Rettberg2022-07-04 15:42:13 +0200
committerSimon Rettberg2022-07-04 15:42:13 +0200
commit878dbac85a9f684916e2d30cab4782e21a03e767 (patch)
treee4e8edc6e61b10c1f6bc15f12a1d9c09677a3103 /inc
parentFix typos (diff)
downloadslx-admin-878dbac85a9f684916e2d30cab4782e21a03e767.tar.gz
slx-admin-878dbac85a9f684916e2d30cab4782e21a03e767.tar.xz
slx-admin-878dbac85a9f684916e2d30cab4782e21a03e767.zip
[rebootcontrol/main] Add subkey column to property_list table
This makes it easier to reference to list entries that have non-trivial data values, e.g. long json data.
Diffstat (limited to 'inc')
-rw-r--r--inc/property.inc.php71
1 files changed, 66 insertions, 5 deletions
diff --git a/inc/property.inc.php b/inc/property.inc.php
index 96787f00..734c559e 100644
--- a/inc/property.inc.php
+++ b/inc/property.inc.php
@@ -68,31 +68,76 @@ class Property
*/
public static function getList(string $key): array
{
- $res = Database::simpleQuery("SELECT dateline, value FROM property_list WHERE name = :key", compact('key'));
+ $res = Database::simpleQuery("SELECT subkey, dateline, value FROM property_list
+ WHERE `name` = :key", compact('key'));
$NOW = time();
- $return = array();
+ $return = [];
foreach ($res as $row) {
if ($row['dateline'] != 0 && $row['dateline'] < $NOW)
continue;
- $return[] = $row['value'];
+ $return[$row['subkey']] = $row['value'];
}
return $return;
}
/**
+ * @param string $key
+ * @param int $subkey
+ * @return ?string entry from property list
+ */
+ public static function getListEntry(string $key, int $subkey)
+ {
+ $row = Database::queryFirst("SELECT dateline, `value` FROM property_list
+ WHERE `name` = :key AND subkey = :subkey", ['key' => $key, 'subkey' => $subkey]);
+ if ($row === false || ($row['dateline'] != 0 && $row['dateline'] < time()))
+ return null;
+ return $row['value'];
+ }
+
+ /**
* Add item to property list.
*
* @param string $key key of value to set
* @param string $value the value to add for $key
* @param int $maxAgeMinutes how long to keep this entry around at least, in minutes. 0 for infinite
+ * @return int The auto generated sub-key
*/
- public static function addToList(string $key, string $value, int $maxAgeMinutes = 0)
+ public static function addToList(string $key, string $value, int $maxAgeMinutes = 0): int
{
Database::exec("INSERT INTO property_list (name, value, dateline) VALUES (:key, :value, :dateline)", array(
'key' => $key,
'value' => $value,
'dateline' => ($maxAgeMinutes === 0 ? 0 : time() + ($maxAgeMinutes * 60))
));
+ return Database::lastInsertId();
+ }
+
+ /**
+ * Update existing entry in property list.
+ *
+ * @param string $key key of list
+ * @param int $subkey subkey of entry in list
+ * @param string $value new value to set entry to
+ * @param string|null $expectedValue if not null, the value will only be updated if it currently has this value
+ * @param int $maxAgeMinutes the new lifetime of that entry
+ * @return bool whether the entry existed and has been updated
+ */
+ public static function updateListEntry(string $key, int $subkey, string $value, string $expectedValue = null,
+ int $maxAgeMinutes = 0): bool
+ {
+ $args = [
+ 'name' => $key,
+ 'subkey' => $subkey,
+ 'newvalue' => $value,
+ 'dateline' => ($maxAgeMinutes === 0 ? 0 : time() + ($maxAgeMinutes * 60)),
+ ];
+ if ($expectedValue !== null) {
+ $args['oldvalue'] = $expectedValue;
+ return Database::exec("UPDATE property_list SET `value` = :newvalue, dateline = :dateline
+ WHERE `name` = :name AND subkey = :subkey AND `value` = :oldvalue", $args);
+ }
+ return Database::exec("UPDATE property_list SET `value` = :newvalue, dateline = :dateline
+ WHERE `name` = :name AND subkey = :subkey", $args);
}
/**
@@ -103,7 +148,7 @@ class Property
* @param string $value item to remove
* @return int number of items removed
*/
- public static function removeFromList(string $key, string $value): int
+ public static function removeFromListByVal(string $key, string $value): int
{
return Database::exec("DELETE FROM property_list WHERE name = :key AND value = :value", array(
'key' => $key,
@@ -112,6 +157,22 @@ class Property
}
/**
+ * Remove given item from property list. If the list contains this item
+ * multiple times, they will all be removed.
+ *
+ * @param string $key Key of list
+ * @param int $value item to remove
+ * @return bool whether item was found and removed
+ */
+ public static function removeFromListByKey(string $key, int $subkey): bool
+ {
+ return Database::exec("DELETE FROM property_list WHERE name = :key AND subkey = :subkey", array(
+ 'key' => $key,
+ 'subkey' => $subkey,
+ )) > 0;
+ }
+
+ /**
* Delete entire list with given key.
*
* @param string $key Key of list