$partitions = []; $partitions_affected = new stdClass(); $query = false; foreach ($_JPOST as $row) { # Making sure the primary key is set for the row if (isset($row->id)) { # Getting our partition $partition = get_partition_by_id($G_CONTROLLER_DBLINK, $G_TABLE_DETAILS, $row->id, $bitmask, $partitions, $G_SHARED_DBLINKS); # If the parition is valid if ($partition !== false) { # Saving our affected partitions $partitions_affected->{$partition->data['id']} = $partition; # First run, need new query object if ($query === false) { # New query parser $query = new MySQLParser($partition->dblink, $partition->data['table_name'], $partition->database); # Checking for whitelisting if (NQ_WHITELIST_COLUMNS) { $whitelist = get_whitelist_columns($G_CONTROLLER_DBLINK, $G_APP_DATA['id'], $G_TABLE_DETAILS['id'], $G_TOKEN_PRIVILEGE_DATA['id']); if (NQ_WHITELIST_EXISTENTIAL ? count($whitelist) > 0 : true) { $query->whitelist_columns($whitelist); } } # Blacklisting the locked fields and the partition columns $query->blacklist_columns(explode(',', NQ_LOCKED_FIELDS)); $query->blacklist_columns(explode(',', $partition->data['partition_column'])); } # Adding our update columns $query->add_update_columns($row); # Adding our global session values if (isset($G_TOKEN_SESSION_DATA->{NQ_SESSION_GROUP}->global->{$G_TABLE_DETAILS['alias']})) {
$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 $query = new MySQLParser($partition_dblink, $partition_data['table_name'], $partition_data['database']); # Checking for whitelisting if (NQ_WHITELIST_COLUMNS) { $whitelist = get_whitelist_columns($G_CONTROLLER_DBLINK, $G_APP_DATA['id'], $G_TABLE_DETAILS['id'], $G_TOKEN_PRIVILEGE_DATA['id']); if (NQ_WHITELIST_EXISTENTIAL ? count($whitelist) > 0 : true) { $query->whitelist_columns($whitelist); } } # Blacklisting the locked and partitioned fields $query->blacklist_columns(explode(',', NQ_LOCKED_FIELDS)); $query->blacklist_columns(explode(',', $partition_data['partition_column'])); # Order by if (isset($_CGET['order'])) { $order_sort = isset($_CGET['ordersort']) ? explode(',', $_CGET['ordersort']) : []; $query->add_order_by(explode(',', $_CGET['order']), $order_sort); }
} else { for ($i = 0; $i < $G_FROM_TABLE_COLUMNS_COUNT; $i++) { if (isset($from_data[$G_FROM_TABLE_COLUMNS[$i]])) { $entry->{$G_TO_TABLE_COLUMNS[$i]} = $from_data[$G_FROM_TABLE_COLUMNS[$i]]; } } } # Getting the appropriate to partition $to_partition = get_table_partition($G_CONTROLLER_DBLINK, $G_STORAGE_CONTROLLER_DBLINK, $G_APP_DATA, $G_TO_TABLE_DETAILS, $entry, $to_bitmask, $partitions, $G_SHARED_DBLINKS); if (!isset($partitions_affected->{$to_partition->data['id']})) { $partitions_affected->{$to_partition->data['id']} = (object) ['data' => $to_partition->data, 'database' => $to_partition->database, 'dblink' => $to_partition->dblink, 'table_id' => $G_TO_TABLE_SETTINGS['id'], 'inserted_rows' => 0, 'deleted_rows' => 0]; } # We need to create the to query if ($to_query === false) { # Creating our new parser $to_query = new MySQLParser($to_partition->dblink, $to_partition->data['table_name'], $to_partition->database); # Checking for whitelisting if (NQ_WHITELIST_COLUMNS) { $whitelist = get_whitelist_columns($G_CONTROLLER_DBLINK, $G_APP_DATA['id'], $G_TO_TABLE_SETTINGS['id'], $G_TOKEN_PRIVILEGE_DATA['id']); if (NQ_WHITELIST_EXISTENTIAL ? count($whitelist) > 0 : true) { $to_query->whitelist_columns($whitelist); } } # Blacklisting the timestamp $to_query->blacklist_columns(['timestamp']); # Adding our duplicate columns if (isset($_CGET['duplicate'])) { $to_query->add_insert_duplicate_columns(explode(',', $_CGET['duplicate'])); } # Adding our duplicate ignore columns if (isset($_CGET['duplicate_ignore'])) {
$partition_queries->{$partition->data['id']}->add_insert_columns($entry); # Adding our global session values if ($session_global_variables) { $partition_queries->{$partition->data['id']}->add_insert_columns($G_TOKEN_SESSION_DATA->{NQ_SESSION_GROUP}->global->{$G_TABLE_DETAILS['alias']}); } # Adding our specific session values if ($session_insert_variables) { $partition_queries->{$partition->data['id']}->add_insert_columns($G_TOKEN_SESSION_DATA->{NQ_SESSION_GROUP}->insert->{$G_TABLE_DETAILS['alias']}); } # Pushing columns into stack $partition_queries->{$partition->data['id']}->push_insert_columns(); } else { # New query class if ($query === false) { # Creating our new parser $query = new MySQLParser($partition->dblink, $partition->data['table_name'], $partition->database); # Checking for whitelisting if (NQ_WHITELIST_COLUMNS && (NQ_WHITELIST_EXISTENTIAL ? count($whitelist) > 0 : true)) { $query->whitelist_columns($whitelist); } # Blacklisting the timestamp $query->blacklist_columns(['timestamp']); } # Adding our insert columns $query->add_insert_columns($entry); # Adding our global session values if ($session_global_variables) { $query->add_insert_columns($G_TOKEN_SESSION_DATA->{NQ_SESSION_GROUP}->global->{$G_TABLE_DETAILS['alias']}); } # Adding our specific session values if ($session_insert_variables) {
public function actionGetSlice($num) { $parser = new MySQLParser(); $parser->fileName = $this->getFilePath(); $sql = $parser->getSlice($num); if ($sql) { $arrReplace = array('{adminName}', '{adminPass}', '{adminSalt}', '{adminEmail}', '{dbPrefix}', '{siteName}', '{siteKeywords}', '{siteDescription}'); $arrReplaceVal = array(Yii::app()->user->getState('adminName'), Yii::app()->user->getState('adminPass'), Yii::app()->user->getState('adminSalt'), Yii::app()->user->getState('adminEmail'), Yii::app()->user->getState('dbPrefix'), Yii::app()->user->getState('siteName'), Yii::app()->user->getState('siteKeywords'), Yii::app()->user->getState('siteDescription')); $sql = str_replace($arrReplace, $arrReplaceVal, $sql); $matched = preg_match("/CREATE TABLE IF NOT EXISTS `([^`]+)`/", $sql, $matches); if (!$matched) { $matched = preg_match("/CREATE TABLE `([^`]+)`/", $sql, $matches); } if ($matched) { echo 'Creating table `' . $matches[1] . '` ... '; } $command = Yii::app()->db->createCommand($sql); $command->execute(); $command->reset(); if ($matched) { echo 'OK<br/>'; } } }
} # Which partitions are we going to be working with $query = false; $unset_link_id = false; $evaluation_query = count($partition_evaluations) != 0 ? " AND `evaluation` IN ('" . implode("','", $partition_evaluations) . "')" : ""; $partition_query = "\tSELECT\n\t\t\t\t\t\t\t\t`p`.*,\n\t\t\t\t\t\t\t\t`d`.`host`,\n\t\t\t\t\t\t\t\t`d`.`username`,\n\t\t\t\t\t\t\t\t`d`.`password`,\n\t\t\t\t\t\t\t\t`d`.`database`\n\t\t\t\t\t\t\tFROM\n\t\t\t\t\t\t\t\t" . NQ_TABLE_PARTITIONS_TABLE . " `p`\n\t\t\t\t\t\t\tLEFT JOIN\n\t\t\t\t\t\t\t\t" . NQ_SERVERS_TABLE . " `d`\n\t\t\t\t\t\t\t\tON\n\t\t\t\t\t\t\t\t\t`d`.`id`=`p`.`host_id`\n\t\t\t\t\t\t\tWHERE\n\t\t\t\t\t\t\t\t`table_id`=" . (int) $table_settings['id'] . "\n\t\t\t\t\t\t\t\t" . $evaluation_query . "\n\t\t\t\t\t\t\tORDER BY\n\t\t\t\t\t\t\t\t`evaluation` ASC"; $partition_results = mysqli_multi_result_query($G_CONTROLLER_DBLINK, $partition_query); while ($partition_data = mysqli_fetch_assoc($partition_results)) { # Connecting to the correct database $dblink = mysqli_shared_connect($partition_data['host'], $partition_data['username'], $partition_data['password'], $G_SHARED_DBLINKS); # Adding our tracking $G_READ_PARTITION_IDS[] = $partition_data['id']; # We need to create a new query if ($query == false) { # Creating our new parser $query = new MySQLParser($dblink, $partition_data['table_name'], $partition_data['database']); # Checking for whitelisting if (NQ_WHITELIST_COLUMNS) { $whitelist = get_whitelist_columns($G_CONTROLLER_DBLINK, $G_APP_DATA['id'], $table_settings['id'], $G_TOKEN_DATA['id']); if (NQ_WHITELIST_EXISTENTIAL ? count($whitelist) > 0 : true) { $query->whitelist_columns($whitelist); } } # Excluding from the table $query->blacklist_columns($G_COLUMNS_EXCLUDED); # Adding our select columns $select_columns = $G_COLUMNS_SELECTED; if ($select_columns != '*' && !in_array($attached['column'], $select_columns)) { $select_columns[] = $attached['column']; $unset_link_id = true; }
} # Which partitions are we going to be working with $partition_query = "\tSELECT\n\t\t\t\t\t`p`.*,\n\t\t\t\t\t`d`.`host`,\n\t\t\t\t\t`d`.`username`,\n\t\t\t\t\t`d`.`password`,\n\t\t\t\t\t`d`.`database`\n\t\t\t\tFROM\n\t\t\t\t\t" . NQ_TABLE_PARTITIONS_TABLE . " `p`\n\t\t\t\tLEFT JOIN\n\t\t\t\t\t" . NQ_SERVERS_TABLE . " `d`\n\t\t\t\t\tON\n\t\t\t\t\t\t`d`.`id`=`p`.`host_id`\n\t\t\t\tWHERE\n\t\t\t\t\t`table_id`=" . (int) $G_TABLE_DETAILS['id'] . "\n\t\t\t\t\t" . $evaluation_query . "\n\t\t\t\tORDER BY\n\t\t\t\t\t" . (isset($_CGET['partitionorder']) && $_CGET['partitionorder'] == 'value' ? "`evaluation`" : "`number`") . "\n\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; $deleted_count = 0; $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'], 'deleted_rows' => 0]; # First partition, new query object if ($query === false) { # Creating our new parser $query = new MySQLParser($partition_dblink, $partition_data['table_name'], $partition_data['database']); # Order by if (isset($_JPOST->order)) { $order_sort = isset($_JPOST->order_sort) ? explode(',', $_JPOST->order_sort) : []; $query->add_order_by(explode(',', $_JPOST->order), $order_sort); } # Where columns $query->add_where_columns($_JPOST); } # Deleting from the partition $query->set_table($partition_data['table_name'], false, false, $partition_data['database']); $delete_query = $query->get_delete_query($limit, false); mysqli_sub_query($partition_dblink, $delete_query); # Getting our deleted info $affected = mysqli_affected_rows($partition_dblink); $limit -= (int) $affected;