aboutsummaryrefslogtreecommitdiffstats
path: root/Zotlabs/Lib/IConfig.php
blob: 74c1107f0d82cc6fe2454178adf2fe4995896ccf (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
<?php

namespace Zotlabs\Lib;



class IConfig {

	static public function Load(&$item) {
		return;
	}

	static public function Get(&$item, $family, $key, $default = false) {

		$is_item = false;

		if(is_array($item)) {
			$is_item = true;
			if((! array_key_exists('iconfig',$item)) || (! is_array($item['iconfig'])))
				$item['iconfig'] = array();

			if(array_key_exists('item_id',$item))
				$iid = $item['item_id'];
			else
				$iid = $item['id'] ?? 0;
		}
		elseif(intval($item))
			$iid = $item;

		if(! $iid)
			return $default;

		if(is_array($item) && array_key_exists('iconfig',$item) && is_array($item['iconfig'])) {
			foreach($item['iconfig'] as $c) {
				if($c['iid'] == $iid && $c['cat'] == $family && $c['k'] == $key)
					return $c['v'];
			}
		}

		$r = q("select * from iconfig where iid = %d and cat = '%s' and k = '%s' limit 1",
			intval($iid),
			dbesc($family),
			dbesc($key)
		);
		if($r) {
			$r[0]['v'] = ((preg_match('|^a:[0-9]+:{.*}$|s',$r[0]['v'])) ? unserialize($r[0]['v']) : $r[0]['v']);
			if($is_item)
				$item['iconfig'][] = $r[0];
			return $r[0]['v'];
		}
		return $default;

	}

	/**
	 * IConfig::Set(&$item, $family, $key, $value, $sharing = false);
	 *
	 * $item - item array or item id. If passed an array the iconfig meta information is
	 *    added to the item structure (which will need to be saved with item_store eventually).
	 *    If passed an id, the DB is updated, but may not be federated and/or cloned.
	 * $family - namespace of meta variable
	 * $key - key of meta variable
	 * $value - value of meta variable
	 * $sharing - boolean (default false); if true the meta information is propagated with the item
	 *   to other sites/channels, mostly useful when $item is an array and has not yet been stored/delivered.
	 *   If the meta information is added after delivery and you wish it to be shared, it may be necessary to
	 *   alter the item edited timestamp and invoke the delivery process on the updated item. The edited
	 *   timestamp needs to be altered in order to trigger an item_store_update() at the receiving end.
	 */


	static public function Set(&$item, $family, $key, $value, $sharing = false) {

		$dbvalue = ((is_array($value))  ? serialize($value) : $value);
		$dbvalue = ((is_bool($dbvalue)) ? intval($dbvalue)  : $dbvalue);

		$is_item = false;
		$idx = null;

		if(is_array($item)) {
			$is_item = true;
			if((! array_key_exists('iconfig',$item)) || (! is_array($item['iconfig'])))
				$item['iconfig'] = array();
			elseif($item['iconfig']) {
				for($x = 0; $x < count($item['iconfig']); $x ++) {
					if($item['iconfig'][$x]['cat'] == $family && $item['iconfig'][$x]['k'] == $key) {
						$idx = $x;
					}
				}
			}
			$entry = array('cat' => $family, 'k' => $key, 'v' => $value, 'sharing' => $sharing);

			if(is_null($idx))
				$item['iconfig'][] = $entry;
			else
				$item['iconfig'][$idx] = $entry;
			return $value;
		}

		if(intval($item))
			$iid = intval($item);

		if(! $iid)
			return false;

		if(self::Get($item, $family, $key) === false) {
			$r = q("insert into iconfig( iid, cat, k, v, sharing ) values ( %d, '%s', '%s', '%s', %d ) ",
				intval($iid),
				dbesc($family),
				dbesc($key),
				dbesc($dbvalue),
				intval($sharing)
			);
		}
		else {
			$r = q("update iconfig set v = '%s', sharing = %d where iid = %d and cat = '%s' and  k = '%s' ",
				dbesc($dbvalue),
				intval($sharing),
				intval($iid),
				dbesc($family),
				dbesc($key)
			);
		}

		if(! $r)
			return false;

		return $value;
	}



	static public function Delete(&$item, $family, $key) {


		$is_item = false;
		$idx = null;

		if(is_array($item)) {
			$is_item = true;
			if(is_array($item['iconfig'])) {
				for($x = 0; $x < count($item['iconfig']); $x ++) {
					if($item['iconfig'][$x]['cat'] == $family && $item['iconfig'][$x]['k'] == $key) {
						unset($item['iconfig'][$x]);
					}
				}
			}
			return true;
		}

		if(intval($item))
			$iid = intval($item);

		if(! $iid)
			return false;

		return q("delete from iconfig where iid = %d and cat = '%s' and  k = '%s' ",
			intval($iid),
			dbesc($family),
			dbesc($key)
		);

	}

}