| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375 | <?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;}
 |