function get_table_partition($controller_dblink, $storage_dblink, $app_data, $table_data, $record_data, $bitmask, &$partition_stack, &$dbstack) { # Calculating our evaluation value $evaluation = get_table_partition_evaluation($table_data, $record_data); # Checking if we have already selected this partition foreach ($partition_stack as $partition) { if ($partition->data['table_id'] == $table_data['id'] && $partition->data['evaluation'] == $evaluation) { return $partition; } } # Getting our partition $query = "\tSELECT\n\t\t\t\t\t*\n\t\t\t\tFROM\n\t\t\t\t\t" . NQ_TABLE_PARTITIONS_TABLE . "\n\t\t\t\tWHERE\n\t\t\t\t\t`table_id`\t\t=" . (int) $table_data['id'] . " AND\n\t\t\t\t\t`evaluation`\t\t='" . mysqli_escape_string($controller_dblink, $evaluation) . "'\n\t\t\t\tLIMIT 1"; $partition_data = mysqli_single_result_query($controller_dblink, $query); # Bad partition, need to create a new one if (!isset($partition_data['table_id'])) { # Check if we have partitions available if ($bitmask[1] == 0 && $table_data['partitions'] > 0 || $bitmask[1] > 0 && $table_data['partitions'] + 1 > bindec(str_repeat('1', $bitmask[1]))) { return false; } # Inserting the new partition $query = "\tLOCK TABLE " . NQ_TABLE_PARTITIONS_TABLE . " WRITE;\n\t\t\t\t\tSET @partition_number=\t(\n\t\t\t\t\t\t\t\t\tSELECT\n\t\t\t\t\t\t\t\t\t\tCOUNT(*)\n\t\t\t\t\t\t\t\t\tFROM\n\t\t\t\t\t\t\t\t\t\t" . NQ_TABLE_PARTITIONS_TABLE . "\n\t\t\t\t\t\t\t\t\tWHERE\n\t\t\t\t\t\t\t\t\t\t`table_id`\t=" . (int) $table_data['id'] . "\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\tSET @id=\t\t(\n\t\t\t\t\t\t\t\t\tSELECT\n\t\t\t\t\t\t\t\t\t\t`id`\n\t\t\t\t\t\t\t\t\tFROM\n\t\t\t\t\t\t\t\t\t\t" . NQ_TABLE_PARTITIONS_TABLE . "\n\t\t\t\t\t\t\t\t\tWHERE\n\t\t\t\t\t\t\t\t\t\t`table_id`\t=" . (int) $table_data['id'] . " AND\n\t\t\t\t\t\t\t\t\t\t`evaluation`\t='" . mysqli_escape_string($controller_dblink, $evaluation) . "'\n\t\t\t\t\t\t\t\t\tLIMIT 1\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\tINSERT INTO\n\t\t\t\t\t\t" . NQ_TABLE_PARTITIONS_TABLE . "\n\t\t\t\t\tSET\n\t\t\t\t\t\t`id`\t\t=IF(ISNULL(@id),NULL,@id),\n\t\t\t\t\t\t`app_id`\t=" . (int) $app_data['id'] . ",\n\t\t\t\t\t\t`table_id`\t=" . (int) $table_data['id'] . ",\n\t\t\t\t\t\t`number`\t=@partition_number,\n\t\t\t\t\t\t`evaluation`\t='" . mysqli_escape_string($controller_dblink, $evaluation) . "',\n\t\t\t\t\t\t`created`\t=NOW(),\n\t\t\t\t\t\t`modified`\t=NOW(),\n\t\t\t\t\t\t`accessed`\t=NOW();\n\t\t\t\t\tUNLOCK TABLES"; mysqli_multi_sub_query($controller_dblink, $query); # Getting our partition $query = "\tSELECT\n\t\t\t\t\t\t*\n\t\t\t\t\tFROM\n\t\t\t\t\t\t" . NQ_TABLE_PARTITIONS_TABLE . "\n\t\t\t\t\tWHERE\n\t\t\t\t\t\t`table_id`\t=" . (int) $table_data['id'] . " AND\n\t\t\t\t\t\t`evaluation`\t='" . mysqli_escape_string($controller_dblink, $evaluation) . "'\n\t\t\t\t\tLIMIT 1"; $partition_data = mysqli_single_result_query($controller_dblink, $query); # Creating our partition id table $create_query = "CREATE TABLE IF NOT EXISTS " . NQ_DATABASE_STORAGE_DATABASE . ".`" . NQ_DATABASE_PARTITION_PREFIX . $app_data['id'] . "_" . $table_data['id'] . "_" . $partition_data['number'] . "`\n\t\t\t\t\t\t\t(\n\t\t\t\t\t\t\t\t`id` " . (array_sum($bitmask) > 32 ? 'BIGINT' : 'INT') . " UNSIGNED AUTO_INCREMENT PRIMARY KEY,\n\t\t\t\t\t\t\t\t`data` TINYINT(1) UNSIGNED\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\tENGINE=" . NQ_MYSQL_TABLE_ENGINE; mysqli_sub_query($storage_dblink, $create_query); # Getting our free server space $query = "\tSELECT\n\t\t\t\t\t\t*\n\t\t\t\t\tFROM\n\t\t\t\t\t\t" . NQ_SERVERS_TABLE . "\n\t\t\t\t\tWHERE\n\t\t\t\t\t\t`environment` \t\t\tIN ('" . mysqli_escape_string($controller_dblink, $table_data['environment'] == '*' ? 'prod' : $table_data['environment']) . "','*') AND\n\t\t\t\t\t\t(\n\t\t\t\t\t\t\t`host_app_id` \t\tIN (" . (int) $app_data['id'] . ",0) OR\n\t\t\t\t\t\t\t`host_app_group` \tIN (" . (int) $app_data['group'] . ",0)\n\t\t\t\t\t\t)\n\t\t\t\t\tORDER BY\n\t\t\t\t\t\t`environment` DESC,\n\t\t\t\t\t\t`host_app_id` DESC,\n\t\t\t\t\t\t`host_app_group` DESC,\n\t\t\t\t\t\t`available_space` DESC\n\t\t\t\t\tLIMIT 1"; $server_data = mysqli_single_result_query($controller_dblink, $query); # Temp create table hold $query = "SHOW CREATE TABLE " . NQ_DATABASE_STORAGE_DATABASE . ".`" . NQ_DATABASE_STRUCTURE_PREFIX . $app_data['id'] . '_' . $partition_data['table_id'] . "`"; $create_result = mysqli_single_result_query($storage_dblink, $query); # Creating the new create syntax $partition_table_name = $app_data['id'] . '_' . $partition_data['table_id'] . '_' . $partition_data['id']; $syntax = explode('`', $create_result['Create Table']); $syntax[0] = "CREATE TABLE IF NOT EXISTS "; $syntax[1] = $server_data['database'] . '`.`' . $partition_table_name; $syntax = implode('`', $syntax); # Update the partition data $query = "\tUPDATE\n\t\t\t\t\t\t" . NQ_TABLE_PARTITIONS_TABLE . "\n\t\t\t\t\tSET\n\t\t\t\t\t\t`host_id`\t=" . (int) $server_data['id'] . ",\n\t\t\t\t\t\t`table_name`\t='" . mysqli_escape_string($controller_dblink, $partition_table_name) . "'\n\t\t\t\t\tWHERE\n\t\t\t\t\t\t`id`\t\t=" . $partition_data['id'] . "\n\t\t\t\t\tLIMIT 1"; mysqli_sub_query($controller_dblink, $query); $partition_data['host_id'] = $server_data['id']; $partition_data['table_name'] = $partition_table_name; # Open up a new connection $partition_dblink = mysqli_shared_connect($server_data['host'], $server_data['username'], $server_data['password'], $dbstack); $partition_database = $server_data['database']; # Creating our table mysqli_sub_query($partition_dblink, $syntax); } else { # Getting our free server space $query = "\tSELECT\n\t\t\t\t\t\t*\n\t\t\t\t\tFROM\n\t\t\t\t\t\t" . NQ_SERVERS_TABLE . "\n\t\t\t\t\tWHERE\n\t\t\t\t\t\t`id`=" . (int) $partition_data['host_id'] . "\n\t\t\t\t\tLIMIT 1"; $server_data = mysqli_single_result_query($controller_dblink, $query); # Open up a new connection $partition_dblink = mysqli_shared_connect($server_data['host'], $server_data['username'], $server_data['password'], $dbstack); $partition_database = $server_data['database']; } # Returning the partition data $partition = (object) ['data' => $partition_data, 'database' => $partition_database, 'dblink' => $partition_dblink]; $partition_stack[] = $partition; return $partition; }
$content->affected_rows = 0; $content->matched_rows = 0; $content->partition = $partition_evaluation; $content->env = PostParser::create_attribute($G_APP_ENVIRONMENT); # Partition evaluations $evaluation_query = ''; # Specific partitions if (isset($_CGET['partition'])) { $search = MySQLParser::column_compare_info($_CGET['partition']); $values = []; foreach (array_unique($search['values']) as $value) { $values[] = "'" . mysqli_escape_string($G_CONTROLLER_DBLINK, $value) . "'"; } $evaluation_query = " AND `evaluation`" . $search['compare'] . implode(isset($search['separator']) ? $search['separator'] : ',', $values) . $search['close']; } else { $partition_evaluation = get_table_partition_evaluation($G_TABLE_DETAILS, (object) $_CGET); $evaluation_query = $partition_evaluation !== false ? " AND `evaluation` ='" . mysqli_escape_string($G_CONTROLLER_DBLINK, $partition_evaluation) . "'" : ""; } # Which partitions are we going to be working with $partition_query = "\t\tSELECT\n\t\t\t\t\t\t`p`.*,\n\t\t\t\t\t\t`d`.`host`,\n\t\t\t\t\t\t`d`.`username`,\n\t\t\t\t\t\t`d`.`password`,\n\t\t\t\t\t\t`d`.`database`\n\t\t\t\t\tFROM\n\t\t\t\t\t\t" . NQ_TABLE_PARTITIONS_TABLE . " `p`\n\t\t\t\t\tLEFT JOIN\n\t\t\t\t\t\t" . NQ_SERVERS_TABLE . " `d`\n\t\t\t\t\t\tON\n\t\t\t\t\t\t\t`d`.`id`=`p`.`host_id`\n\t\t\t\t\tWHERE\n\t\t\t\t\t\t`table_id`=" . (int) $G_TABLE_DETAILS['id'] . "\n\t\t\t\t\t\t" . $evaluation_query . "\n\t\t\t\t\tORDER BY\n\t\t\t\t\t\t" . (isset($_CGET['partitionorder']) && $_CGET['partitionorder'] == 'value' ? "`evaluation`" : "`number`") . "\n\t\t\t\t\t\t" . (isset($_CGET['partitionordersort']) && $_CGET['partitionordersort'] == 'DESC' ? "DESC" : "ASC") . ""; $partition_results = mysqli_multi_result_query($G_CONTROLLER_DBLINK, $partition_query); # Processing each partition $query = false; $partitions_affected = new stdClass(); while ($partition_data = mysqli_fetch_assoc($partition_results)) { # Connecting to our dblinks $partition_dblink = mysqli_shared_connect($partition_data['host'], $partition_data['username'], $partition_data['password'], $G_SHARED_DBLINKS); $partitions_affected->{$partition_data['id']} = (object) ['data' => $partition_data, 'dblink' => $partition_dblink, 'database' => $partition_data['database']]; # First partition, new query object if ($query === false) { # Creating our new parser
} } mysqli_free_result($select_result); } break; # One to multiple # One to multiple case 'multiple': # Loading the partition evaluations $partition_evaluations = []; $column_values = []; $column_keys = new stdClass(); foreach ($content as $key => &$val) { # Getting the partition evaluation if ($table_settings['partition_column'] == $attached['column']) { $evaluation = mysqli_escape_string($G_CONTROLLER_DBLINK, get_table_partition_evaluation($table_settings, (object) [$attached['column'] => $val['id']])); if (!in_array($evaluation, $partition_evaluations)) { $partition_evaluations[] = $evaluation; } } # Adding to the columns if (!in_array($val['id'], $column_values)) { $column_values[] = $val['id']; } # Adding the column key if (!isset($column_keys->{$val['id']})) { $column_keys->{$val['id']} = []; } $column_keys->{$val['id']}[] = $key; # Adding our attached array $val[$attached['name']] = [];