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;
}
Beispiel #2
0
$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
Beispiel #3
0
             }
         }
         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']] = [];