PluginProbe
The WP Remote WordPress Plugin / trunk
The WP Remote WordPress Plugin vtrunk
6.72 6.69 6.65 6.62 6.48 6.47 4.87 4.97 5.05 5.09 5.16 5.22 5.24 5.25 5.38 5.41 5.42 5.45 5.47 5.53 5.56 5.65 5.68 5.72 5.73 All 53 releases
← All changes | callback/wings/db.php +95 -5 6.48trunk View file →
@@ -11,9 +11,9 @@
11 11 public $siteinfo;
12 12
13 13 public static $bvTables = array("fw_requests", "lp_requests", "ip_store");
14 14
15 - const DB_WING_VERSION = 1.3;
15 + const DB_WING_VERSION = 1.5;
16 16
17 17 public function __construct($callback_handler) {
18 18 $this->db = $callback_handler->db;
19 19 $this->account = $callback_handler->account;
@@ -29,9 +29,9 @@
29 29 }
30 30
31 31 public function getTableData($table, $tname, $offset, $limit, $bsize, $filter, $pkeys, $include_rows = false) {
32 32 $tinfo = array();
33 -
33 +
34 34 $rows_count = $this->db->rowsCount($table);
35 35 $result = array('count' => $rows_count);
36 36 if ($limit == 0) {
37 37 $limit = $rows_count;
@@ -68,8 +68,88 @@
68 68 $result['tinfo'] = $tinfo;
69 69 return $result;
70 70 }
71 71
72 + public function buildPrimaryKeyCursorFilter($pkeys, $last_ids) {
73 + if (empty($pkeys)) return null;
74 + foreach($pkeys as $pk) {
75 + if (!isset($last_ids[$pk]) || $last_ids[$pk] === '') return null;
76 + }
77 +
78 + $conditions = array();
79 + $order_by = array();
80 + foreach($pkeys as $index => $pk) {
81 + $key = "`".$pk."`";
82 + $order_by[] = $key;
83 + $parts = array();
84 + for ($eq_index = 0; $eq_index < $index; $eq_index++) {
85 + $eq_pk = $pkeys[$eq_index];
86 + $eq_key = "`".$eq_pk."`";
87 + $eq_last_id = esc_sql((string) $last_ids[$eq_pk]);
88 + $parts[] = $eq_key." = '".$eq_last_id."'";
89 + }
90 + $last_id = esc_sql((string) $last_ids[$pkeys[$index]]);
91 + $parts[] = $key." > '".$last_id."'";
92 + $condition = implode(" AND ", $parts);
93 + $conditions[] = ($index == 0) ? $condition : "(".$condition.")";
94 + }
95 + return " WHERE ".implode(" OR ", $conditions)." ORDER BY ".implode(",", $order_by);
96 + }
97 +
98 + public function getTableDataByCursor($table, $tname, $offset, $limit, $bsize, $filter, $pkeys, $include_rows = false, $cursor_mode = false) {
99 + $tinfo = array();
100 +
101 + $rows_count = $this->db->rowsCount($table);
102 + $result = array('count' => $rows_count);
103 + if ($limit == 0) {
104 + $limit = $rows_count;
105 + }
106 + $srows = 1;
107 + $current_filter = $filter;
108 + $cursor_active = ($cursor_mode === true && !empty($pkeys));
109 + $query_offset = $offset;
110 + while (($limit > 0) && ($srows > 0)) {
111 + if ($bsize > $limit)
112 + $bsize = $limit;
113 + $rows = $this->db->getTableContent($table, '*', $current_filter, $bsize, $query_offset);
114 + $srows = sizeof($rows);
115 + $data = array();
116 + $data["table_name"] = $tname;
117 + $data["offset"] = $offset;
118 + $data["size"] = $srows;
119 + $serialized_rows = serialize($rows);
120 + $data['md5'] = md5($serialized_rows);
121 + $data['length'] = strlen($serialized_rows);
122 + array_push($tinfo, $data);
123 + if (!empty($pkeys) && $srows > 0) {
124 + $end_row = end($rows);
125 + $last_ids = $this->getLastID($pkeys, $end_row);
126 + $data['last_ids'] = $last_ids;
127 + $result['last_ids'] = $last_ids;
128 + if ($cursor_active) {
129 + $cursor_filter = $this->buildPrimaryKeyCursorFilter($pkeys, $last_ids);
130 + if ($cursor_filter !== null) {
131 + $current_filter = $cursor_filter;
132 + } else {
133 + $current_filter = $filter;
134 + $cursor_active = false;
135 + }
136 + }
137 + }
138 + if ($include_rows) {
139 + $data["rows"] = $rows;
140 + $str = serialize($data);
141 + $this->stream->writeStream($str);
142 + }
143 + $offset += $srows;
144 + $limit -= $srows;
145 + $query_offset = $cursor_active ? 0 : $offset;
146 + }
147 + $result['size'] = $offset;
148 + $result['tinfo'] = $tinfo;
149 + return $result;
150 + }
151 +
72 152 public function streamQueryResult($identifier, $query, $pkeys) {
73 153 $data = array();
74 154 $data["identifier"] = $identifier;
75 155 $data["query"] = $query;
@@ -296,9 +376,14 @@
296 376 $bsize = intval($params['bsize']);
297 377 $filter = (array_key_exists('filter', $params)) ? $params['filter'] : "";
298 378 $tname = $params['tname'];
299 379 $pkeys = (array_key_exists('pkeys', $params)) ? $params['pkeys'] : array();
300 - $resp = $this->getTableData($table, $tname, $offset, $limit, $bsize, $filter, $pkeys, false);
380 + $cursor_mode = (array_key_exists('cursor_mode', $params)) ? $params['cursor_mode'] : false;
381 + if ($cursor_mode === true) {
382 + $resp = $this->getTableDataByCursor($table, $tname, $offset, $limit, $bsize, $filter, $pkeys, false, $cursor_mode);
383 + } else {
384 + $resp = $this->getTableData($table, $tname, $offset, $limit, $bsize, $filter, $pkeys, false);
385 + }
301 386 break;
302 387 case "getmulttables":
303 388 $result = array();
304 389 $tableParams = $params['table_params'];
@@ -321,9 +406,14 @@
321 406 $bsize = intval($params['bsize']);
322 407 $filter = (array_key_exists('filter', $params)) ? $params['filter'] : "";
323 408 $tname = $params['tname'];
324 409 $pkeys = (array_key_exists('pkeys', $params)) ? $params['pkeys'] : array();
325 - $resp = $this->getTableData($table, $tname, $offset, $limit, $bsize, $filter, $pkeys, true);
410 + $cursor_mode = (array_key_exists('cursor_mode', $params)) ? $params['cursor_mode'] : false;
411 + if ($cursor_mode === true) {
412 + $resp = $this->getTableDataByCursor($table, $tname, $offset, $limit, $bsize, $filter, $pkeys, true, $cursor_mode);
413 + } else {
414 + $resp = $this->getTableData($table, $tname, $offset, $limit, $bsize, $filter, $pkeys, true);
415 + }
326 416 break;
327 417 case "tblexists":
328 418 $resp = array("tblexists" => $db->isTablePresent($params['table']));
329 419 break;
@@ -385,5 +475,5 @@
385 475 }
386 476 return $resp;
387 477 }
388 478 }
389 -endif;
479 +endif;