# Getting our general count data $query = "\tSELECT\n\t\t\t\t\t\tCOUNT(*) AS `count`,\n\t\t\t\t\t\t`app_id`,\n\t\t\t\t\t\t`environment`\n\t\t\t\t\tFROM\n\t\t\t\t\t\t" . NQ_TRACKING_DATABASE . ".`api_calls_" . $table . "`\n\t\t\t\t\tWHERE\n\t\t\t\t\t\t`created`>='" . date('Y-m-d 00:00:00', $date) . "' AND\n\t\t\t\t\t\t`created`<='" . date('Y-m-d 23:59:59', $date) . "'\n\t\t\t\t\tGROUP BY\n\t\t\t\t\t\t`app_id`,\n\t\t\t\t\t\t`environment`"; $result = mysqli_multi_result_query($G_CONTROLLER_DBLINK, $query); while ($count_data = mysqli_fetch_array($result)) { # Adding our count into the database $query = "\tINSERT IGNORE INTO\n\t\t\t\t\t\t\t" . NQ_TRACKING_DATABASE . ".`api_calls_" . $table . "_summary`\n\t\t\t\t\t\tSET\n\t\t\t\t\t\t\t`app_id`\t=" . $count_data['app_id'] . ",\n\t\t\t\t\t\t\t`environment`\t='" . $count_data['environment'] . "',\n\t\t\t\t\t\t\t`transactions`\t=" . $count_data['count'] . ",\n\t\t\t\t\t\t\t`created`\t='" . date('Y-m-d', $date) . "'"; mysqli_sub_query($G_CONTROLLER_DBLINK, $query); } # Getting our general count data $query = "\tSELECT\n\t\t\t\t\t\t`app_id`,\n\t\t\t\t\t\t`type`,\n\t\t\t\t\t\t`environment`,\n\t\t\t\t\t\tCOUNT(*) AS `count`,\n\t\t\t\t\t\tMIN(`size`) AS `min_size`,\n\t\t\t\t\t\tAVG(`size`) AS `avg_size`,\n\t\t\t\t\t\tMAX(`size`) AS `max_size`,\n\t\t\t\t\t\tMIN(`time`) AS `min_time`,\n\t\t\t\t\t\tAVG(`time`) AS `avg_time`,\n\t\t\t\t\t\tMAX(`time`) AS `max_time`\n\t\t\t\t\tFROM\n\t\t\t\t\t\t" . NQ_TRACKING_DATABASE . ".`api_calls_" . $table . "`\n\t\t\t\t\tWHERE\n\t\t\t\t\t\t`created`>='" . date('Y-m-d 00:00:00', $date) . "' AND\n\t\t\t\t\t\t`created`<='" . date('Y-m-d 23:59:59', $date) . "'\n\t\t\t\t\tGROUP BY\n\t\t\t\t\t\t`app_id`,\n\t\t\t\t\t\t`type`,\n\t\t\t\t\t\t`environment`"; $result = mysqli_multi_result_query($G_CONTROLLER_DBLINK, $query); while ($count_data = mysqli_fetch_array($result)) { # Adding our count into the database $query = "\tINSERT IGNORE INTO\n\t\t\t\t\t\t\t" . NQ_TRACKING_DATABASE . ".`api_calls_" . $table . "_summary_expanded`\n\t\t\t\t\t\tSET\n\t\t\t\t\t\t\t`app_id`\t\t=" . (int) $count_data['app_id'] . ",\n\t\t\t\t\t\t\t`environment`\t\t='" . mysqli_escape_string($G_CONTROLLER_DBLINK, $count_data['environment']) . "',\n\t\t\t\t\t\t\t`type`\t\t\t='" . mysqli_escape_string($G_CONTROLLER_DBLINK, $count_data['type']) . "',\n\t\t\t\t\t\t\t`transactions`\t\t=" . (int) $count_data['count'] . ",\n\t\t\t\t\t\t\t`created`\t\t='" . mysqli_escape_string($G_CONTROLLER_DBLINK, date('Y-m-d', $date)) . "',\n\t\t\t\t\t\t\t`min_size`\t\t=" . (double) $count_data['min_size'] . ",\n\t\t\t\t\t\t\t`avg_size`\t\t=" . (double) $count_data['avg_size'] . ",\n\t\t\t\t\t\t\t`max_size`\t\t=" . (double) $count_data['max_size'] . ",\n\t\t\t\t\t\t\t`min_time`\t\t=" . (double) $count_data['min_time'] . ",\n\t\t\t\t\t\t\t`avg_time`\t\t=" . (double) $count_data['avg_time'] . ",\n\t\t\t\t\t\t\t`max_time`\t\t=" . (double) $count_data['max_time']; mysqli_sub_query($G_CONTROLLER_DBLINK, $query); } # Removing our old entries $query = "\tDELETE FROM\n\t\t\t\t\t\t" . NQ_TRACKING_DATABASE . ".`api_calls_" . $table . "`\n\t\t\t\t\tWHERE\n\t\t\t\t\t\t`created`>='" . date('Y-m-d 00:00:00', $date) . "' AND\n\t\t\t\t\t\t`created`<='" . date('Y-m-d 23:59:59', $date) . "'"; mysqli_sub_query($G_CONTROLLER_DBLINK, $query); # Message if (!NQ_MOD_TRACKING_QUIET) { echo 'Summary complete for ', $table, ' on for date ', date('m/d/Y', $date), "\n"; } # Move back a day $date -= 24 * 60 * 60; } } # Message if (!NQ_MOD_TRACKING_QUIET) { echo NQ_MOD_REPORT_SEPARATOR; }
# 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);
function queue_email($controller_dblink, $to, $from, $subject, $email_data, $constants, $variables, $app_id, $send_date, $bcc_available = true) { # Reply to $reply_to = $from; # Separating for validation $p = explode('@', $to, 2); # Bailing if not someone@someplace.com format if (count($p) < 2) { return false; } # Checking if the email is blocked $query = "\tSELECT\n\t\t\t\t\t\t`email`\n\t\t\t\t\tFROM\n\t\t\t\t\t\t" . NQ_BLOCKED_EMAILS_TABLE . "\n\t\t\t\t\tWHERE\n\t\t\t\t\t\t`app_id`\t=" . (int) $app_id . " AND\n\t\t\t\t\t\t`email`\t='" . mysqli_escape_string($controller_dblink, $to) . "'\n\t\t\t\t\tLIMIT 1"; $blocked_data = mysqli_single_result_query($controller_dblink, $query); # This user has blocked the app from sending emails if (isset($blocked_data)) { # Adding our analytics $query = "\tINSERT INTO\n\t\t\t\t\t\t\t" . NQ_ANALYTICS_BLOCKED_TABLE . "\n\t\t\t\t\t\tSET\n\t\t\t\t\t\t\t`app_id`\t\t=" . (int) $app_id . ",\n\t\t\t\t\t\t\t`template_id`\t=" . (int) $email_data['id'] . ",\n\t\t\t\t\t\t\t`sender`\t\t='" . mysqli_escape_string($controller_dblink, $from) . "',\n\t\t\t\t\t\t\t`recipient`\t='" . mysqli_escape_string($controller_dblink, $to) . "',\n\t\t\t\t\t\t\t`created`\t\t=NOW()"; mysqli_sub_query($controller_dblink, $query); # Blocked return -1; } else { # Applying our constants and variables $attachments_list = []; $body = TemplateParser::parse($email_data['body'], $constants, $variables, $app_id, $attachments_list); # Applying our unsubscribe if ($email_data['requires_unsubscribe'] == 1 && strpos($body, '%unsubscribe%') === false) { $body .= ' <div style="margin-top:10px;">%unsubscribe% from ' . $G_APP_DATA['name'] . '</div>'; } # If we are going to track $mail_body = $body; $bcc_body = $body; # Adding our analytics $query = "\tINSERT INTO\n\t\t\t\t\t\t" . NQ_ANALYTICS_SENT_TABLE . "\n\t\t\t\t\tSET\n\t\t\t\t\t\t`app_id`\t\t=" . (int) $app_id . ",\n\t\t\t\t\t\t`template_id`\t\t=" . (int) $email_data['id'] . ",\n\t\t\t\t\t\t`sender`\t\t='" . mysqli_escape_string($controller_dblink, $from) . "',\n\t\t\t\t\t\t`recipient`\t\t='" . mysqli_escape_string($controller_dblink, $to) . "',\n\t\t\t\t\t\t`created`\t\t=NOW(),\n\t\t\t\t\t\t`requested_date`\t=NOW()"; mysqli_sub_query($controller_dblink, $query); $analytics_id = mysqli_insert_id($controller_dblink); # If we are going to track $mail_body = $body; $bcc_body = $body; if ($email_data['track'] == 1) { # Our ids $hash_id = hash('sha256', $analytics_id . $to); # Updating the hash id $query = "\tUPDATE\n\t\t\t\t\t\t\t" . NQ_ANALYTICS_SENT_TABLE . "\n\t\t\t\t\t\tSET\n\t\t\t\t\t\t\t`hash_id`\t='" . $hash_id . "'\n\t\t\t\t\t\tWHERE\n\t\t\t\t\t\t\t`id`\t\t=" . (int) $analytics_id . "\n\t\t\t\t\t\tLIMIT 1"; mysqli_sub_query($controller_dblink, $query); # Customizing the body $mail_body .= '<img style="display:none;" src="' . NQ_DOMAIN_ROOT . '/' . $app_id . '/track?ref=' . $hash_id . '" width="1" height="1" />'; } # Inserting our unsubscribe link $keys = ['/%unsubscribe%/']; $values = ['<a href="' . NQ_DOMAIN_ROOT . '/' . $app_id . '/unsubscribe?ref=' . $hash_id . '&email=' . urlencode($to) . '" style="color:inherit;text-decoration:inherit;"> Unsubscribe </a>']; $mail_body = preg_replace($keys, $values, $mail_body); # Adding to the queue $query = "\tINSERT INTO\n\t\t\t\t\t\t" . NQ_QUEUE_TABLE . "\n\t\t\t\t\tSET\n\t\t\t\t\t\t`app_id`\t=" . (int) $app_id . ",\n\t\t\t\t\t\t`analytics_id`\t=" . (int) $analytics_id . ",\n\t\t\t\t\t\t`sender`\t='" . mysqli_escape_string($controller_dblink, $from) . "',\n\t\t\t\t\t\t`recipient`\t='" . mysqli_escape_string($controller_dblink, $to) . "',\n\t\t\t\t\t\t`subject`\t='" . mysqli_escape_string($controller_dblink, $subject) . "',\n\t\t\t\t\t\t`raw`\t\t='" . mysqli_escape_string($controller_dblink, build_raw_email($to, $from, $reply_to, $subject, $mail_body, $attachments_list, $app_id)) . "',\n\t\t\t\t\t\t`send_date`\t='" . date('Y-m-d H:i:s', $send_date) . "',\n\t\t\t\t\t\t`priority`\t=1"; mysqli_sub_query($controller_dblink, $query); # Sending the bcc if ($bcc_available) { # Modifying to add our bcc header $bcc_body = trim('<div style="padding:10px;border-bottom:solid #E9E9E9 1px;margin-bottom:1px;line-height:2.0;"> <div style="width:75px;color:#999;display:inline-block;text-align:right;padding-right:10px;"></div><b>BCC Email</b><br /> <div style="width:75px;color:#999;display:inline-block;text-align:right;padding-right:10px;">sent to:</div>' . $to . '<br /> <div style="width:75px;color:#999;display:inline-block;text-align:right;padding-right:10px;">from:</div>' . htmlentities($from) . '<br /> <div style="width:75px;color:#999;display:inline-block;text-align:right;padding-right:10px;">date:</div>' . date('r') . '<br /> <div style="width:75px;color:#999;display:inline-block;text-align:right;padding-right:10px;">send date:</div>' . date('r', $send_date) . '<br /> <div style="width:75px;color:#999;display:inline-block;text-align:right;padding-right:10px;">tracking:</div>' . ($email_data['track'] == 1 ? 'Yes' : 'No') . '<br /> </div> ' . $bcc_body); # Sending bcc emails foreach (explode(',', $email_data['bcc']) as $bcc) { # Adding to the queue if (trim($bcc) != '') { $query = "\tINSERT INTO\n\t\t\t\t\t\t\t\t\t" . NQ_QUEUE_TABLE . "\n\t\t\t\t\t\t\t\tSET\n\t\t\t\t\t\t\t\t\t`app_id`\t=" . (int) $app_id . ",\n\t\t\t\t\t\t\t\t\t`sender`\t='" . mysqli_escape_string($controller_dblink, $from) . "',\n\t\t\t\t\t\t\t\t\t`recipient`\t='" . mysqli_escape_string($controller_dblink, trim($bcc)) . "',\n\t\t\t\t\t\t\t\t\t`subject`\t='" . mysqli_escape_string($controller_dblink, $subject) . "',\n\t\t\t\t\t\t\t\t\t`raw`\t\t='" . mysqli_escape_string($controller_dblink, build_raw_email(trim($bcc), $from, $reply_to, $subject, $bcc_body, $attachments_list, $app_id)) . "',\n\t\t\t\t\t\t\t\t\t`send_date`\t=NOW(),\n\t\t\t\t\t\t\t\t\t`priority`\t=255"; mysqli_sub_query($controller_dblink, $query); } } } # Sent return 1; } }
break; # Dropping an index # Dropping an index case 'drop': # Getting our index $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)) { # Found the index if ($index_data['Key_name'] == $index->name) { # Dropping the index $query = "\tDROP INDEX\n\t\t\t\t\t\t\t\t\t\t\t\t`" . mysqli_escape_string($G_CONTROLLER_DBLINK, $index->name) . "`\n\t\t\t\t\t\t\t\t\t\t\tON\n\t\t\t\t\t\t\t\t\t\t\t" . NQ_DATABASE_STORAGE_DATABASE . ".`" . NQ_DATABASE_STRUCTURE_PREFIX . $G_APP_DATA['id'] . "_" . $G_TABLE_DETAILS['id'] . "`"; mysqli_sub_query($G_CONTROLLER_DBLINK, $query); # Dropping the index from the partitions foreach ($G_TABLE_PARTITIONS as $partition) { $query = "\tDROP INDEX\n\t\t\t\t\t\t\t\t\t\t\t\t\t`" . mysqli_escape_string($partition['dblink'], $index->name) . "`\n\t\t\t\t\t\t\t\t\t\t\t\tON\n\t\t\t\t\t\t\t\t\t\t\t\t\t`" . $partition['database'] . "`.`" . $partition['table_name'] . "`"; mysqli_sub_query($partition['dblink'], $query, true); } break; } } break; } } } } # Returning our values $strlen = PostParser::send($content); /* --- Connection closed wit PostParser::send --- Below this point things need to be tracked and cleaned up --- */ # Adding our usage - Always call this last track_endpoint($G_SHARED_DBLINKS, $G_APP_DATA['id'], $G_APP_ENVIRONMENT, $_ENDPOINT, $strlen);
function directory_hierarchy($dblink, $app_id, $environment, $dirpath, $autocreate = false) { # Starting properties $parent_ids = []; $parent_id = 0; $path = '~'; $dir = explode('/', $dirpath); # Checking for our root folder if ($dir[0] == '~') { array_shift($dir); array_unshift($dir, ''); } # Looping through our dirs to create for ($i = 0, $len = count($dir); $i < $len; $i++) { # Saving our name $name = $dir[$i]; if ($name == '' && $i > 0) { continue; } # Checking to see if our path exists $query = "\tSELECT\n\t\t\t\t\t\t*\n\t\t\t\t\tFROM\n\t\t\t\t\t\t" . NQ_DIRECTORY_TABLE . "\n\t\t\t\t\tWHERE\n\t\t\t\t\t\t`app_id`\t=" . (int) $app_id . " AND\n\t\t\t\t\t\t`environment`\t='" . mysqli_escape_string($dblink, $environment) . "' AND\n\t\t\t\t\t\t`path`\t\t='" . mysqli_escape_string($dblink, $path) . "' AND\n\t\t\t\t\t\t`name`\t\t='" . mysqli_escape_string($dblink, str_replace(str_split(NQ_INVALID_PATH_CHARS), '', $name)) . "'\n\t\t\t\t\tLIMIT 1"; $directory_data = mysqli_single_result_query($dblink, $query); # If it doesn't we add it if (!isset($directory_data['id'])) { # We can't autocreate if (!$autocreate && false && $i > 0) { exit_fail(NQ_ERROR_INVALID_VALUE, LANG_INVALID_DIR); } # Updating our parent if ($parent_id > 0) { $query = "\tUPDATE\n\t\t\t\t\t\t\t\t" . NQ_DIRECTORY_TABLE . "\n\t\t\t\t\t\t\tSET\n\t\t\t\t\t\t\t\t`directories`=`directories`+1\n\t\t\t\t\t\t\tWHERE\n\t\t\t\t\t\t\t\t`id`=" . (int) $parent_id . "\n\t\t\t\t\t\t\tLIMIT 1"; mysqli_sub_query($dblink, $query); } # Adding our directory $query = "\tINSERT INTO\n\t\t\t\t\t\t\t" . NQ_DIRECTORY_TABLE . "\n\t\t\t\t\t\tSET\n\t\t\t\t\t\t\t`app_id`\t\t=" . (int) $app_id . ",\n\t\t\t\t\t\t\t`environment`\t\t='" . mysqli_escape_string($dblink, $environment) . "',\n\t\t\t\t\t\t\t`name`\t\t\t='" . mysqli_escape_string($dblink, str_replace(str_split(NQ_INVALID_PATH_CHARS), '', $name)) . "',\n\t\t\t\t\t\t\t`path`\t\t\t='" . mysqli_escape_string($dblink, $path) . "',\n\t\t\t\t\t\t\t`parent_directory_id`\t=" . (int) $parent_id . ",\n\t\t\t\t\t\t\t`created`\t\t=NOW(),\n\t\t\t\t\t\t\t`modified`\t\t=NOW()"; mysqli_sub_query($dblink, $query); $parent_id = mysqli_insert_id($dblink); } else { $parent_id = $directory_data['id']; } # Adding to our path $parent_ids[] = $parent_id; $path .= str_replace(str_split(NQ_INVALID_PATH_CHARS), '', $name) . '/'; } # Removing our last parent id (actual folder id ) $parent_id = array_pop($parent_ids); # Returning our data return ['id' => $parent_id, 'path' => $path, 'parent_ids' => $parent_ids]; }
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; }
function track_endpoint(&$dblinks, $app_id, $environment, $endpoint) { # If we want to track our usage if (NQ_TRACKING_ENABLED) { # Connecting to our tracking database $dblink = mysqli_shared_connect(NQ_TRACKING_HOST, NQ_TRACKING_USERNAME, NQ_TRACKING_PASSWORD, $dblinks); # Logging our usage $query = "\tINSERT INTO\n\t\t\t\t\t\t" . NQ_TRACKING_TABLE . "\n\t\t\t\t\tSET\n\t\t\t\t\t\t`app_id`\t=" . (int) $app_id . ",\n\t\t\t\t\t\t`environment`\t='" . mysqli_escape_string($dblink, $environment) . "',\n\t\t\t\t\t\t`endpoint`\t='" . mysqli_escape_string($dblink, $endpoint) . "',\n\t\t\t\t\t\t`receive_size`\t=" . (defined('NQ_RECEIVE_SIZE') ? NQ_RECEIVE_SIZE : strlen($_SERVER['QUERY_STRING'])) . ",\n\t\t\t\t\t\t`send_size`\t=" . (defined('NQ_SEND_SIZE') ? NQ_SEND_SIZE : 0) . ",\n\t\t\t\t\t\t`send_time`\t=" . ((defined('NQ_SEND_TIME') ? NQ_SEND_TIME : microtime(true)) - NQ_TRACKING_START_TIME) . ",\n\t\t\t\t\t\t`complete_time`\t=" . (microtime(true) - NQ_TRACKING_START_TIME) . ",\n\t\t\t\t\t\t`created`\t=NOW()"; mysqli_sub_query($dblink, $query); } # Logging our endpoint log_access($endpoint, true); }