die($dal->my_error()); } $dal->my_query('select count(*) from schemata'); if ($dal->my_error()) { die("VERIFICATION FAILED: " . $dal->my_error()); } echo "* Creating new mapper.\n"; switch ($config['mapper']) { case 'directory': $mapper = new DirectoryShardKeyMapper($config); break; case 'hash': $mapper = new HashShardKeyMapper($config); break; case 'none': $mapper = new NoneShardKeyMapper($config); break; default: throw new Exception('Unsupported mapper: ' . $config_database['mapper']); break; } if (empty($config['gearman'])) { /* Add a Shard-Query managed gearmand */ write_line("A gearman server was not seen in your config. Enter a host to use: [127.0.0.1]"); $gearman_host = read_line(); if (!trim($gearman_host)) { $gearman_host = '127.0.0.1'; } write_line("A gearman port was not seen in your config. Enter a port number to use: [7001]");
function set_schema($schema_name = null, &$state = null, $config_file = 'shard-query-config.php') { if (!isset($state)) { $state = ShardQuery::new_state(); } require $config_file; if (!$schema_name && isset($config_database['default_virtual_schema'])) { $schema_name = $config_database['default_virtual_schema']; } $state->schema_name = $schema_name; /* reset defaults */ $state->verbose = false; $state->inlist_opt = false; $state->between_opt = false; $state->gearman_servers = array(); $state->inlist_merge_threshold = 128; $state->inlist_merge_size = 128; $state->star_opt = false; $state->current_schema = $schema_name; $state->extra_tables = array(); //any tables that get created along the way and need cleaning up at the end switch ($config_database['mapper_type']) { case SQ_DIRECTORY: $mapper = new DirectoryShardKeyMapper($config_database); break; case SQ_HASH: $mapper = new HashShardKeyMapper($config_database); break; case SQ_NONE: $mapper = new NoneShardKeyMapper($config_database); break; default: throw new Exception('Unsupported mapper: ' . $config_database['mapper']); break; } $params = $mapper->get_params($schema_name); $shards = $mapper->get_shards($schema_name); $state->shards = $shards; $state->mapper =& $mapper; if (!empty($params['shared_path'])) { $state->shared_path = $params['shared_path']; } else { $state->shared_path = ""; } if (in_array('verbose', array_keys($params))) { $state->verbose = true; } if (!empty($params['inlist_merge_threshold'])) { $state->inlist_merge_threshold = $params['inlist_merge_threshold']; } if (!empty($params['inlist_merge_size'])) { $state->inlist_merge_size = $params['inlist_merge_size']; } if (!empty($params['ignore_virtual_schema'])) { if ($params['ignore_virtual_schema'] == 1 || $params['ignore_virtual_schema'] == 'true') { $state->ignore_virtual_schema = true; } } if (!empty($params['star_schema'])) { if ($params['star_schema'] == 1 || $params['star_schema'] == 'true') { $state->star_opt = 1; } } if (!empty($params['aws_access_key'])) { $state->aws_access_key = $params['aws_access_key']; } if (!empty($params['aws_secret_key'])) { $state->aws_secret_key = $params['aws_secret_key']; } $state->engine = 'InnoDB'; if (!empty($params['coord_engine'])) { $state->engine = $params['coord_engine']; } $this->set_shard_mapper($column = $mapper->get_column($schema_name), array($mapper, 'map')); if (!$column) { $this->errors[] = "Could not find shard column or could not find schema definition"; return false; } /* One shard acts as the coordination shard. A table is created on this shard to coallesce the results from the other shards. */ $coords = $mapper->get_shards($schema_name, true); if (!empty($coords)) { $state->tmp_shard = $coords[array_rand($coords)]; } else { $state->tmp_shard = $shards[array_rand($shards)]; } if (!empty($params['inlist'])) { $state->inlist_opt = trim($params['inlist']); if ($state->inlist_opt == "-") { $state->inlist_opt = $column; } } if (!empty($params['between'])) { $state->between_opt = trim($params['between']); if ($state->inlist_opt == "-") { $state->inlist_opt = $column; } } $state->client = null; $servers = $mapper->get_gearman_servers($schema_name); $cnt = count($servers); for ($i = 0; $i < $cnt; ++$i) { $key = array_rand($servers); $server = $servers[$key]; unset($servers[$key]); try { $state->client = new Net_Gearman_Client($server); break; } catch (Net_Gearman_Exception $e) { $state->client = null; } } if (!isset($state->client)) { $state->errors[] = "Could not connect to any of the specified gearman servers."; return false; } return $state; }