2015-04-19 16:46:59 +02:00

375 lines
10 KiB
PHP

<?php
/**
* @file
* Manifest module database functions.
*/
/**
* Save a manifest.
*/
function manifest_save(&$manifest) {
manifest_delete($manifest->name);
drupal_write_record('manifest', $manifest);
}
/**
* Load a manifest.
*
* Loads one manifest.
*/
function manifest_load($manifest_name = NULL) {
$manifests = manifest_load_multiple($manifest_name);
if (!empty($manifests)) {
return reset($manifests);
}
return FALSE;
}
/**
* Load manifests.
*
* Loads all manifests.
*/
function manifest_load_multiple($manifest_name = NULL) {
$result = manifest_query_execute('manifest', 'load', array('name' => $manifest_name));
$manifests = array();
foreach ($result as $manifest) {
$manifest->settings = unserialize($manifest->settings);
manifest_config_load($manifest);
$manifests[$manifest->name] = $manifest;
}
if (!empty($manifests)) {
return $manifests;
}
return FALSE;
}
/**
* Delete a manifest.
*/
function manifest_delete($manifest_name) {
manifest_account_delete(NULL, $manifest_name);
manifest_role_delete(NULL, $manifest_name);
manifest_ip_delete(NULL, NULL, $manifest_name);
manifest_config_delete($manifest_name);
return manifest_query_execute('manifest', 'delete', array('name' => $manifest_name));
}
/**
* Save a manifest config entry.
*/
function manifest_config_save($manifest_name, $field, $value) {
if (!is_array($value)) {
$value = array($value);
}
$entry = (object)array();
for ($i = 0; $i < count($value); $i++) {
$entry->manifest = $manifest_name;
$entry->field = $field;
$entry->delta = $i;
$entry->value = current($value);
next($value);
}
drupal_write_record('manifest_config', $entry);
}
/**
* Load a manifest config entry into a manifest.
*/
function manifest_config_load(&$manifest) {
$result = manifest_query_execute('manifest_config', 'load', array('manifest' => $manifest->name));
$manifest->config = array();
foreach ($result as $row) {
$manifest->config[$row->field][$row->delta] = $row->value;
}
}
/**
* Delete a manifest.
*/
function manifest_config_delete($manifest_name) {
return manifest_query_execute('manifest_config', 'delete', array('manifest' => $manifest_name));
}
/**
* Save a manifest user entry.
*/
function manifest_account_save($uid, $manifest_name) {
$existing = manifest_account_load($uid, $manifest_name);
if (!$existing) {
$entry = (object)array(
'uid' => $uid,
'manifest' => $manifest_name,
'created' => REQUEST_TIME,
);
drupal_write_record('manifest_user', $entry);
}
}
/**
* Load a manifest user entry.
*/
function manifest_account_load($uid = NULL, $manifest_name = NULL) {
$result = manifest_query_execute('manifest_user', 'load', array('uid' => $uid, 'manifest' => $manifest_name));
$entries = array();
foreach ($result as $row) {
$entries[] = $row;
}
if (!empty($entries)) {
return $entries;
}
return FALSE;
}
/**
* Delete a manifest user entry.
*/
function manifest_account_delete($uid = NULL, $manifest_name = NULL) {
return manifest_query_execute('manifest_user', 'delete', array('uid' => $uid, 'manifest' => $manifest_name));
}
/**
* Save a manifest role entry.
*/
function manifest_role_save($rid, $manifest_name) {
$existing = manifest_role_load($rid, $manifest_name);
if (!$existing) {
$entry = (object)array(
'rid' => $rid,
'manifest' => $manifest_name,
'created' => REQUEST_TIME,
);
drupal_write_record('manifest_role', $entry);
}
}
/**
* Load a manifest role entry.
*/
function manifest_role_load($rid = NULL, $manifest_name = NULL) {
$result = manifest_query_execute('manifest_role', 'load', array('rid' => $rid, 'manifest' => $manifest_name));
$entries = array();
foreach ($result as $row) {
$entries[] = $row;
}
if (!empty($entries)) {
return $entries;
}
return FALSE;
}
/**
* Delete a manifest role entry.
*/
function manifest_role_delete($rid = NULL, $manifest_name = NULL) {
return manifest_query_execute('manifest_role', 'delete', array('rid' => $rid, 'manifest' => $manifest_name));
}
/**
* Save a manifest ip entry.
*/
function manifest_ip_save($ip1, $ip2, $manifest_name) {
$existing = manifest_ip_load($ip1, $ip2, $manifest_name);
if (!$existing) {
$entry = (object)array(
'ip1' => ip2long($ip1),
'ip2' => $ip2 ? ip2long($ip2) : ip2long($ip1),
'manifest' => $manifest_name,
'created' => REQUEST_TIME,
);
drupal_write_record('manifest_ip', $entry);
}
}
/**
* Load a manifest ip entry.
*/
function manifest_ip_load($ip1 = NULL, $ip2 = NULL, $manifest_name = NULL) {
$result = manifest_query_execute('manifest_ip', 'load', array('ip1' => $ip1, 'ip2' => $ip2, 'manifest' => $manifest_name));
$entries = array();
foreach ($result as $row) {
$row->ip1 = long2ip($row->ip1);
$row->ip2 = long2ip($row->ip2);
$entries[] = $row;
}
if (!empty($entries)) {
return $entries;
}
return FALSE;
}
/**
* Load a manifest ip entry.
*/
function manifest_ip_match($ip, $manifest_name = NULL) {
$wheres[] = ip2long($ip) . ' >= ip1';
$wheres[] = ip2long($ip) . ' <= ip2';
$result = manifest_query_execute('manifest_ip', 'load', array('manifest' => $manifest_name), array(), $wheres);
$entries = array();
foreach ($result as $row) {
$entries[] = $row;
}
if (!empty($entries)) {
return $entries;
}
return FALSE;
}
/**
* Delete a manifest ip entry.
*/
function manifest_ip_delete($ip1 = NULL, $ip2 = NULL, $manifest_name = NULL) {
return manifest_query_execute('manifest_ip', 'delete', array('ip1' => ip2long($ip1), 'ip2' => ip2long($ip2), 'manifest' => $manifest_name));
}
/**
* Assemble SQL queries.
*/
function manifest_query_execute($table, $op = 'load', $conditions = array(), $select = array(), $wheres = array(), $args = array()) {
$placeholder_count = 0;
if ($op == 'load') {
$sql = 'SELECT ';
if ($select) {
$sql .= implode(', ', $select);
}
else {
$sql .= '*';
}
}
elseif ($op == 'delete') {
$sql = 'DELETE';
}
$sql .= ' FROM {' . $table . '} ';
$schema = drupal_get_schema($table);
foreach ($conditions as $field => $values) {
if (!empty($values)) {
if (!is_array($values)) {
$values = array($values);
}
$type = $schema['fields'][$field]['type'];
$placeholder = ':value_' . $placeholder_count++;
$wheres[] = $field . ' IN ' . $placeholder;
$args[$placeholder] = $values;
}
}
if (!empty($wheres)) {
$sql .= 'WHERE ';
$sql .= implode(' AND ', $wheres);
}
return db_query($sql, $args);
}
/**
* Get a list of manifests the user is in, matching the settings.
*
* @param $config
* An array of key values that must be true of the $manifest->config.
* @param $account
* An optional user account object. If not supplied will use the current
* user.
* @return
* An array of loaded manifests.
*/
function manifest($config = NULL, $account = NULL) {
if (is_null($account)) {
global $user;
$account = $user;
$check_ip = TRUE;
}
$sql = 'SELECT DISTINCT(m.name) AS manifest FROM {manifest} m';
$args = array();
$wheres = array();
$sql .= ' LEFT JOIN {manifest_user} mu ON mu.manifest = m.name';
$sql .= ' LEFT JOIN {manifest_role} mr ON mr.manifest = m.name';
if ($check_ip) {
$sql .= ' LEFT JOIN {manifest_ip} mi ON mi.manifest = m.name';
}
if (!empty($config)) {
$placeholder_count = 0;
foreach ($config as $key => $value) {
$placeholder = $placeholder_count++;
$sql .= ' INNER JOIN {manifest_config} mc_' . $key . ' ON mc_' . $key . '.manifest = m.name AND mc_' . $key . '.field = :key_' . $placeholder . ' AND mc_' . $key . '.value = :val_' . $placeholder;
$args[':key_' . $placeholder] = $key;
$args[':val_' . $placeholder] = $value;
}
}
$wheres[] = 'mu.uid = :uid';
$args[':uid'] = $account->uid;
$roles = array_keys($account->roles);
$wheres[] = 'mr.rid IN :rids';
$args[':rids'] = $roles;
if ($check_ip) {
$wheres[] = '(:ip >= mi.ip1 AND :ip <= mi.ip2)';
$args[':ip'] = ip2long($ip);
}
$sql .= ' WHERE ' . implode(' OR ', $wheres);
$result = db_query($sql, $args);
$manifests = array();
foreach ($result as $row) {
$manifests[] = $row->manifest;
}
if (!empty($manifests)) {
return $manifests;
}
return FALSE;
}
/**
* Get a list of users for the supplied manifests, matching the settings.
*
* @param $config
* An array of key values that must be true of the $manifest->config.
* @param $manifests
* Which manifests to look in.
* @return
* An array of uids.
*/
function manifest_users($config = NULL, $manifests = NULL) {
$sql = 'SELECT DISTINCT(u.uid) AS uid FROM {users} u';
$args = array();
$sql .= ' LEFT JOIN {manifest_user} mu ON mu.uid = u.uid';
$sql .= ' LEFT JOIN {users_roles} ur ON u.uid = ur.uid';
$sql .= ' LEFT JOIN {manifest_role} mr ON ur.rid = mr.rid';
if (!empty($config)) {
$placeholder_count = 0;
foreach ($config as $key => $value) {
$placholder = $placeholder_count++;
$sql .= ' INNER JOIN {manifest_config} mc_' . $key . ' ON mu.manifest = mc_' . $key . '.manifest AND mc_' . $key . '.field = :key_' . $placeholder . ' AND mc_' . $key . '.value = :val_' . $placeholder;
$args[':key_' . $placeholder] = $key;
$args[':val_' . $placeholder] = $value;
}
}
if (!empty($manifests)) {
$wheres[] = 'mu.manifest IN :manifests';
$args[':manifests'] = $manifests;
}
$wheres[] = '(mu.uid IS NOT NULL OR mr.rid IS NOT NULL)';
if (!empty($wheres)) {
$sql .= ' WHERE ' . implode(' AND ', $wheres);
}
$result = db_query($sql, $args);
$users = array();
foreach ($result as $row) {
$users[$row->uid] = $row->uid;
}
if (!empty($users)) {
return $users;
}
return FALSE;
}