<?php

require_once(dirname(__FILE__) . '/flexihash.php');
require_once(ABSPATH . 'wp-config.php');

global $r2db_hash_map;
$r2db_hash_map = new Flexihash(null, R2DB_FLEXIHASH_REPLICAS);

/* Hashing function to map blogs to databases.
 *
 * Implements a consistent hashing scheme using Flexihash.
 */
function noblogs_db_callback($query, $wpdb) {
  global $r2db_hash_map;
  if (preg_match("/^{$wpdb->base_prefix}(\d+)_/", $wpdb->table, $matches)) {
    $blog_id = $matches[1];
    return $r2db_hash_map->lookup($blog_id);
  }
}

$wpdb->add_callback('noblogs_db_callback');

/* Load backend shards and add them to FlexiHash / $wpdb. */
function noblogs_load_backends() {
  global $wpdb;
  global $r2db_hash_map;
  global $noblogs_config;
  $backend_map = array();
  foreach ($noblogs_config['db_config']['backends'] as $backend_name => $backend) {
    $b = array(
       "host" => $backend['host'] . ":" . $backend['port'],
       "user" => $backend['user'],
       "password" => $backend['password'],
       "name" => $backend['name'],
       "dataset" => $backend_name,
       "read" => 1,
       "write" => 1,
       "timeout" => 10
    );
    $wpdb->add_database($b);
    $r2db_hash_map->addTarget($backend_name);
    $backend_map[$backend_name] = $b;
  }
  return $backend_map;
}

/* Load the local and master backends to $wpdb. */
function noblogs_load_global_dataset() {
  global $wpdb;
  global $noblogs_config;
  $master = $noblogs_config['db_config']['master'];
  // IP adress of the local mysql instance with the 'master' db.
  // We want to override this in certain testing scenarios, to use
  // a mysql server not on localhost.
  $local_master_host = '127.0.0.1';
  if (isset($master['local_host'])) {
    $local_master_host = $master['local_host'];
  }
  if ($noblogs_config['db_config']['is_master']) {
    $wpdb->add_database(array(
       "host" => $local_master_host . ":" . $master['port'],
       "user" => $master['user'],
       "password" => $master['password'],
       "name" => $master['name'],
       "dataset" => "global",
       "read" => 1,
       "write" => 1,
       "timeout" => 2
    ));
  } else {
    $wpdb->add_database(array(
       "host" => $master['host'] . ":" . $master['port'],
       "user" => $master['user'],
       "password" => $master['password'],
       "name" => $master['name'],
       "dataset" => "global",
       "read" => 0,
       "write" => 1,
       "timeout" => 2
    ));
    $wpdb->add_database(array(
       "host" => $local_master_host . ":" . $master['port'],
       "user" => $master['user'],
       "password" => $master['password'],
       "name" => $master['name'],
       "dataset" => "global",
       "read" => 1,
       "write" => 0,
       "timeout" => 2
    ));
  }
}