fe7fc222d0a260c49ebb9c1f2bd7201fc04fb98f
[yaffs-website] / web / core / modules / user / src / UserData.php
1 <?php
2
3 namespace Drupal\user;
4
5 use Drupal\Core\Database\Connection;
6
7 /**
8  * Defines the user data service.
9  */
10 class UserData implements UserDataInterface {
11
12   /**
13    * The database connection to use.
14    *
15    * @var \Drupal\Core\Database\Connection
16    */
17   protected $connection;
18
19   /**
20    * Constructs a new user data service.
21    *
22    * @param \Drupal\Core\Database\Connection $connection
23    *   The database connection to use.
24    */
25   public function __construct(Connection $connection) {
26     $this->connection = $connection;
27   }
28
29   /**
30    * {@inheritdoc}
31    */
32   public function get($module, $uid = NULL, $name = NULL) {
33     $query = $this->connection->select('users_data', 'ud')
34       ->fields('ud')
35       ->condition('module', $module);
36     if (isset($uid)) {
37       $query->condition('uid', $uid);
38     }
39     if (isset($name)) {
40       $query->condition('name', $name);
41     }
42     $result = $query->execute();
43     // If $module, $uid, and $name were passed, return the value.
44     if (isset($name) && isset($uid)) {
45       $result = $result->fetchAllAssoc('uid');
46       if (isset($result[$uid])) {
47         return $result[$uid]->serialized ? unserialize($result[$uid]->value) : $result[$uid]->value;
48       }
49       return NULL;
50     }
51     // If $module and $uid were passed, return data keyed by name.
52     elseif (isset($uid)) {
53       $return = [];
54       foreach ($result as $record) {
55         $return[$record->name] = ($record->serialized ? unserialize($record->value) : $record->value);
56       }
57       return $return;
58     }
59     // If $module and $name were passed, return data keyed by uid.
60     elseif (isset($name)) {
61       $return = [];
62       foreach ($result as $record) {
63         $return[$record->uid] = ($record->serialized ? unserialize($record->value) : $record->value);
64       }
65       return $return;
66     }
67     // If only $module was passed, return data keyed by uid and name.
68     else {
69       $return = [];
70       foreach ($result as $record) {
71         $return[$record->uid][$record->name] = ($record->serialized ? unserialize($record->value) : $record->value);
72       }
73       return $return;
74     }
75   }
76
77   /**
78    * {@inheritdoc}
79    */
80   public function set($module, $uid, $name, $value) {
81     $serialized = (int) !is_scalar($value);
82     if ($serialized) {
83       $value = serialize($value);
84     }
85     $this->connection->merge('users_data')
86       ->keys([
87         'uid' => $uid,
88         'module' => $module,
89         'name' => $name,
90       ])
91       ->fields([
92         'value' => $value,
93         'serialized' => $serialized,
94       ])
95       ->execute();
96   }
97
98   /**
99    * {@inheritdoc}
100    */
101   public function delete($module = NULL, $uid = NULL, $name = NULL) {
102     $query = $this->connection->delete('users_data');
103     // Cast scalars to array so we can consistently use an IN condition.
104     if (isset($module)) {
105       $query->condition('module', (array) $module, 'IN');
106     }
107     if (isset($uid)) {
108       $query->condition('uid', (array) $uid, 'IN');
109     }
110     if (isset($name)) {
111       $query->condition('name', (array) $name, 'IN');
112     }
113     $query->execute();
114   }
115
116 }