コード例 #1
0
ファイル: table.php プロジェクト: nuQuery/v1m0-api-all
             case 'unlink':
                 # Adding our table link
                 $query = "\tDELETE FROM\n\t\t\t\t\t\t\t\t\t\t" . NQ_TABLE_LINKS_TABLE . "\n\t\t\t\t\t\t\t\t\tWHERE\n\t\t\t\t\t\t\t\t\t\t`app_id`\t\t=" . (int) $G_APP_DATA['id'] . " AND\n\t\t\t\t\t\t\t\t\t\t`table_id` \t= " . (int) $G_TABLE_DETAILS['id'] . " AND\n\t\t\t\t\t\t\t\t\t\t`name`\t\t='" . mysqli_escape_string($G_CONTROLLER_DBLINK, $column->link_name) . "'\n\t\t\t\t\t\t\t\t\tLIMIT 1";
                 mysqli_sub_query($G_CONTROLLER_DBLINK, $query);
                 break;
         }
     }
     # Doing all of our alters at once
     if (count($alter_queries) > 0) {
         # Adding the column to the structure table
         $query = "\tALTER TABLE\n\t\t\t\t\t\t\t\t" . NQ_DATABASE_STORAGE_DATABASE . ".`" . NQ_DATABASE_STRUCTURE_PREFIX . $G_APP_DATA['id'] . "_" . $G_TABLE_DETAILS['id'] . "`\n\t\t\t\t\t\t\tDISABLE KEYS;\n\t\t\t\t\t\t\tALTER TABLE\n\t\t\t\t\t\t\t\t" . NQ_DATABASE_STORAGE_DATABASE . ".`" . NQ_DATABASE_STRUCTURE_PREFIX . $G_APP_DATA['id'] . "_" . $G_TABLE_DETAILS['id'] . "`\n\t\t\t\t\t\t\t\t" . implode(',', $alter_queries) . ";\n\t\t\t\t\t\t\tALTER TABLE\n\t\t\t\t\t\t\t\t" . NQ_DATABASE_STORAGE_DATABASE . ".`" . NQ_DATABASE_STRUCTURE_PREFIX . $G_APP_DATA['id'] . "_" . $G_TABLE_DETAILS['id'] . "`\n\t\t\t\t\t\t\tENABLE KEYS;";
         mysqli_multi_sub_query($G_CONTROLLER_DBLINK, $query);
         # Altering the partition columns
         foreach ($G_TABLE_PARTITIONS as $partition) {
             $query = "\tALTER TABLE\n\t\t\t\t\t\t\t\t\t`" . $partition['database'] . "`.`" . $partition['table_name'] . "`\n\t\t\t\t\t\t\t\tDISABLE KEYS;\n\t\t\t\t\t\t\t\tALTER TABLE\n\t\t\t\t\t\t\t\t\t`" . $partition['database'] . "`.`" . $partition['table_name'] . "`\n\t\t\t\t\t\t\t\t\t" . implode(',', $alter_queries) . ";\n\t\t\t\t\t\t\t\tALTER TABLE\n\t\t\t\t\t\t\t\t\t`" . $partition['database'] . "`.`" . $partition['table_name'] . "`\n\t\t\t\t\t\t\t\tENABLE KEYS;";
             mysqli_multi_sub_query($partition['dblink'], $query);
         }
     }
 }
 # Handling our keys
 if (isset($_JPOST->indices)) {
     foreach ($_JPOST->indices as $index) {
         # What we want to do
         switch (strtolower($index->action)) {
             # Adding an index
             case 'add':
                 # Validating we don't have the index
                 $has_index = false;
                 $query = "SHOW INDEX FROM " . NQ_DATABASE_STORAGE_DATABASE . ".`" . NQ_DATABASE_STRUCTURE_PREFIX . $G_APP_DATA['id'] . "_" . $G_TABLE_DETAILS['id'] . "`";
                 $result = mysqli_multi_result_query($G_CONTROLLER_DBLINK, $query);
                 while ($index_data = mysqli_fetch_assoc($result)) {
コード例 #2
0
ファイル: update.php プロジェクト: nuQuery/v1m0-api-all
    # We have a different size
    $this_size_changed = false;
    if ((int) $partition->data['size'] != (int) $size_data['size']) {
        # Flag size changed
        $size_changed = true;
        $this_size_changed = true;
        # Storing the currently saved size
        $update_queries[] = "\tSET @size_delta = \t(\n\t\t\t\t\t\t\t\t\t\tSELECT \n\t\t\t\t\t\t\t\t\t\t" . (int) $size_data['size'] . "- CONVERT(`size`,SIGNED)\n\t\t\t\t\t\t\t\t\t\tFROM\n\t\t\t\t\t\t\t\t\t\t\t" . NQ_TABLE_PARTITIONS_TABLE . "\n\t\t\t\t\t\t\t\t\t\tWHERE\n\t\t\t\t\t\t\t\t\t\t\t`id`=" . (int) $id . "\n\t\t\t\t\t\t\t\t\t\tLIMIT 1\n\t\t\t\t\t\t\t\t\t)";
        # Updating our size change
        $update_queries[] = "\tSET @table_size_delta = @table_size_delta + @size_delta";
    }
    # Updating the partitions size
    $update_queries[] = "\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" . ($this_size_changed ? "`size` = `size` + @size_delta," : "") . "\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\tWHERE\n\t\t\t\t\t\t`id`\t\t=" . (int) $id . "\n\t\t\t\t\tLIMIT 1";
}
# Updating the table
$update_queries[] = "\tUPDATE\n\t\t\t\t\t" . NQ_TABLE_SETTINGS_TABLE . "\n\t\t\t\tSET\n\t\t\t\t\t" . ($size_changed ? "`size` = `size` + @table_size_delta," : "") . "\n\t\t\t\t\t`modified`\t=NOW(),\n\t\t\t\t\t`accessed`\t=NOW()\n\t\t\t\tWHERE\n\t\t\t\t\t`id`\t\t=" . (int) $G_TABLE_DETAILS['id'] . "\n\t\t\t\tLIMIT 1";
# Adjusting our app database size
if ($size_changed) {
    $update_queries[] = "\tUPDATE\n\t\t\t\t\t\t" . NQ_APPS_TABLE . "\n\t\t\t\t\tSET\n\t\t\t\t\t\t`db_size`=`db_size`+ @table_size_delta\n\t\t\t\t\tWHERE\n\t\t\t\t\t\t`id`=" . (int) $G_APP_DATA['id'] . "\n\t\t\t\t\tLIMIT 1";
}
# Running our update queries
mysqli_multi_sub_query($G_CONTROLLER_DBLINK, implode(';', $update_queries));
# Opening our tracking dblink
$G_TRACKING_DBLINK = mysqli_shared_connect(NQ_TRACKING_HOST, NQ_TRACKING_USERNAME, NQ_TRACKING_PASSWORD, $G_SHARED_DBLINKS);
# Closing the controller dblink
mysqli_shared_close($G_CONTROLLER_DBLINK, $G_SHARED_DBLINKS);
# Adding table analytics
$query = "\tINSERT INTO\n\t\t\t\t" . NQ_TRACKING_TABLE_IO . "\n\t\t\tSET\n\t\t\t\t`app_id`\t=" . (int) $G_APP_DATA['id'] . ",\n\t\t\t\t`table_id`\t=" . (int) $G_TABLE_DETAILS['id'] . ",\n\t\t\t\t`environment`\t='" . mysqli_escape_string($G_TRACKING_DBLINK, $G_APP_ENVIRONMENT) . "',\n\t\t\t\t`writes`\t=1,\n\t\t\t\t`write_rows`\t=" . (int) $content->affected_rows . ",\n\t\t\t\t`created`\t='" . date('Y-m-d H:00:00') . "'";
mysqli_sub_query($G_TRACKING_DBLINK, $query);
# Adding our usage - Always call this last
track_endpoint($G_SHARED_DBLINKS, $G_APP_DATA['id'], $G_APP_ENVIRONMENT, $_ENDPOINT);
コード例 #3
0
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;
}