PluginProbe
Independent Analytics – WordPress Analytics Plugin / 1.25.1
Independent Analytics – WordPress Analytics Plugin v1.25.1
2.15.5 2.15.4 2.15.3 2.15.2 2.15.1 2.15.0 2.14.10 trunk 1.1 1.10 1.10.1 1.11 1.12 1.13 1.14 1.15 1.16 1.17 1.17.1 1.17.2 1.17.3 1.17.4 1.18 1.18.1 1.19.0 All 120 releases
independent-analytics / IAWP / Query.php
Query.php
164 lines 5.4 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 namespace IAWP_SCOPED\IAWP;
4
5 class Query
6 {
7 const CAMPAIGN_URLS = 'campaign_urls';
8 const CAMPAIGNS = 'campaigns';
9 const REFERRER_GROUPS = 'referrer_groups';
10 const REFERRERS = 'referrers';
11 const RESOURCES = 'resources';
12 const VIEWS = 'views';
13 const VISITORS = 'visitors';
14 const VISITORS_TMP = 'visitors_tmp';
15 // Used in DB v7 migration
16 const VISITORS_1_16_ARCHIVE = 'visitors_1_16_archive';
17 // Used in DB v7 migration
18 const SESSIONS = 'sessions';
19 const WC_ORDERS = 'wc_orders';
20 private $query;
21 private $parameters;
22 private $pdo;
23 private $rows = [];
24 private $last_inserted_id = 0;
25 private $external_tables = ['wc_order_stats', 'comments'];
26 public function __construct(string $query_name, ?array $parameters = [])
27 {
28 $this->query = $this->get_query($query_name);
29 $this->parameters = $parameters;
30 }
31 public function last_inserted_id() : ?int
32 {
33 return $this->last_inserted_id;
34 }
35 /**
36 * Responsible for fetching the SQL from the correct query file. Query files are stored as text
37 * files with the txt extension to prevent being filtered out during backups and migrations by
38 * various hosts.
39 *
40 * @param string $query_name
41 *
42 * @return string
43 */
44 private function get_query(string $query_name) : string
45 {
46 global $wpdb;
47 $wordpress_table_prefix = $wpdb->prefix;
48 $file_path = \IAWP_SCOPED\iawp_path_to("sql/{$query_name}.txt");
49 $file_contents = \file_get_contents($file_path);
50 $reflection = new \ReflectionClass(static::class);
51 $constants = $reflection->getConstants();
52 foreach ($constants as $key => $table_partial) {
53 $hard_coded_table = 'wp_independent_analytics_' . $table_partial;
54 $actual_table = $wordpress_table_prefix . 'independent_analytics_' . $table_partial;
55 if ($actual_table !== $hard_coded_table) {
56 $file_contents = \str_replace($hard_coded_table, $actual_table, $file_contents);
57 }
58 }
59 foreach ($this->external_tables as $table_partial) {
60 $hard_coded_table = 'wp_' . $table_partial;
61 $actual_table = $wordpress_table_prefix . $table_partial;
62 if ($actual_table !== $hard_coded_table) {
63 $file_contents = \str_replace($hard_coded_table, $actual_table, $file_contents);
64 }
65 }
66 return $file_contents;
67 }
68 public function rows() : array
69 {
70 return $this->rows;
71 }
72 public function row() : ?\stdClass
73 {
74 if (isset($this->rows[0])) {
75 return $this->rows[0];
76 } else {
77 return null;
78 }
79 }
80 public function inserted_id() : ?int
81 {
82 if ($this->last_inserted_id > 0) {
83 return $this->last_inserted_id;
84 } else {
85 return null;
86 }
87 }
88 public function run() : self
89 {
90 $this->open_connection();
91 $statement = $this->pdo->prepare($this->query);
92 foreach ($this->parameters as $key => $value) {
93 $statement->bindValue($key, $value);
94 }
95 $statement->execute();
96 $rows = $statement->fetchAll();
97 $this->rows = \array_map(function ($row) {
98 return (object) $row;
99 }, $rows);
100 $this->last_inserted_id = $this->pdo->lastInsertId();
101 $this->close_connection();
102 return $this;
103 }
104 public static function query(string $query_name, ?array $parameters = []) : self
105 {
106 $db = new self($query_name, $parameters);
107 $db->run();
108 return $db;
109 }
110 private function open_connection()
111 {
112 global $wpdb;
113 $raw_host = $wpdb->dbhost;
114 $name = $wpdb->dbname;
115 $charset = $wpdb->dbcharset ?? 'utf8';
116 $user = $wpdb->dbuser;
117 $password = $wpdb->dbpassword;
118 if ($host_data = $wpdb->parse_db_host($raw_host)) {
119 list($host, $port, $socket, $is_ipv6) = $host_data;
120 } else {
121 \error_log('IAWP: Parsing DB host failed. Host = ' . $raw_host);
122 return;
123 }
124 if ($is_ipv6 && \extension_loaded('mysqlnd')) {
125 $host = "[{$host}]";
126 }
127 $charset_collate = $wpdb->determine_charset($charset, '');
128 $charset = $charset_collate['charset'];
129 if (isset($socket)) {
130 $data_source_name = 'mysql:unix_socket=' . $socket . ';dbname=' . $name . ';charset=' . $charset;
131 } else {
132 $data_source_name = 'mysql:host=' . $host . ';dbname=' . $name . ';charset=' . $charset;
133 if (isset($port)) {
134 $data_source_name .= ';port=' . $port;
135 }
136 }
137 $this->pdo = new \PDO($data_source_name, $user, $password);
138 $this->pdo->query("SET SESSION group_concat_max_len = 20000;");
139 }
140 private function close_connection()
141 {
142 $this->pdo = null;
143 }
144 /**
145 * Safe way to get the name of a table
146 *
147 * @param string $name
148 *
149 * @return string|null
150 */
151 public static function get_table_name(string $name) : ?string
152 {
153 global $wpdb;
154 $prefix = $wpdb->prefix;
155 $reflection = new \ReflectionClass(static::class);
156 $constants = $reflection->getConstants();
157 if (\in_array($name, $constants)) {
158 return $prefix . 'independent_analytics_' . $name;
159 } else {
160 return null;
161 }
162 }
163 }
164