root/dev/common/includes/class.killlist.php @ 370

Revision 370, 29.3 KB (checked in by kovell, 13 years ago)

- SQL queries optimised for speed and error protection.
- feed syndication optimised
- front page includes optional clock and optional kill/loss display
- mysqli support added
- transaction protection of kills added where supported (mysqli and InnoDB)
- summary tables and contracts show total destroyed value instead of ship value
- html errors reduced
- related kill calculation improved
- query caching errors reduced
- minor bugfixes
- Smarty 2.6.25 added
- apoc fitting mod added and modded
- code optimisations
- code comments added (doxygen format)
- conflicting mods are now identified

Line 
1<?php
2require_once('class.kill.php');
3require_once('class.pagesplitter.php');
4
5class KillList
6{
7    function KillList()
8    {
9        $this->qry_ = new DBQuery();
10        $this->killpointer_ = 0;
11        $this->kills_ = 0;
12        $this->losses_ = 0;
13        $this->killisk_ = 0;
14        $this->lossisk_ = 0;
15        $this->exclude_scl_ = array();
16        $this->vic_scl_id_ = array();
17        $this->regions_ = array();
18        $this->systems_ = array();
19        $this->groupby_ = array();
20        $this->offset_ = 0;
21        $this->killcounter_ = 0;
22        $this->realkillcounter_ = 0;
23        $this->ordered_ = false;
24        $this->walked = false;
25    }
26
27    function execQuery()
28    {
29        /* Killlist philosophy
30         * For EDK the most common uses of a killlist require date ordering
31         * based on kb3_kills. This is then restricted by joins with other
32         * tables. MySQL will decide on a query interpretation based on rows
33         * returned in each step. For EDK this can be very suboptimal as the
34         * most important restriction is by date or number of kills - both
35         * based on kb3_kills - which is usually followed by ordering by date.
36         *
37         * The killlist is constructed so as to give MySQL the least opportunity
38         * to carry out the query in a slow manner. kb3_kills is used as the
39         * main table. Where possible it is only joined with tables that do not
40         * restrict the output. Comment count and involved count are in an outer
41         * query to avoid the use of distinct on the whole kb3_kills table and
42         * the potential ordering of a query with kb3_inv_detail first.
43         *
44         */
45        $timeindex='kll_timestamp';
46                $datefilter=$this->getDateFilter();
47        if (!$this->qry_->executed_)
48        {
49            $this->sql_ = '';
50            if (!count($this->groupby_) && ($this->comments_ || $this->involved_))
51            {
52                $this->sql_ .= 'SELECT list.* ';
53                if($this->comments_) $this->sql_ .= ', count(distinct com.id) as comments';
54                if($this->involved_) $this->sql_ .= ', max(ind.ind_order) + 1 as inv';
55                $this->sql_ .= ' FROM (';
56            }
57            if (!count($this->groupby_))
58            {
59                if($this->summary_)
60                {
61                                        if($datefilter == "")
62                                                $this->sql_ .= 'select distinct kll.kll_id, kll.kll_ship_id,
63                                kll.kll_points, kll.kll_isk_loss,
64                                shp.shp_class, shp.shp_name,
65                                shp.shp_externalid, shp.shp_id,
66                                scl.scl_id, scl.scl_class, scl.scl_value';
67                                        else
68                                                $this->sql_ .= 'select kll.kll_id, kll.kll_ship_id,
69                                kll.kll_points, kll.kll_isk_loss,
70                                shp.shp_class, shp.shp_name,
71                                shp.shp_externalid, shp.shp_id,
72                                scl.scl_id, scl.scl_class, scl.scl_value';
73                    if(count($this->systems_)) 
74                      $this->sql_ .= ', sys.sys_name, sys.sys_sec';
75                }
76                else
77                                {
78                                        if($datefilter == "")
79                                                $this->sql_ .= 'select distinct kll.kll_id, kll.kll_timestamp, plt.plt_name, ';
80                                        else
81                                                $this->sql_ .= 'select kll.kll_id, kll.kll_timestamp, plt.plt_name, ';
82
83                                        $this->sql_ .= 'crp.crp_name, crp.crp_id, ali.all_name, ali.all_id,
84                                kll.kll_system_id, kll.kll_ship_id,
85                                kll.kll_victim_id, plt.plt_externalid,
86                                kll.kll_crp_id, kll.kll_points, kll.kll_isk_loss,
87                                        shp.shp_class, shp.shp_name,
88                                        shp.shp_externalid, shp.shp_id,
89                                                scl.scl_id, scl.scl_class, scl.scl_value,
90                                                sys.sys_name, sys.sys_sec,
91                                fbplt.plt_name as fbplt_name,
92                                fbplt.plt_externalid as fbplt_externalid,
93                                fbcrp.crp_name as fbcrp_name';
94                                }
95            }
96           
97
98            if (count($this->groupby_))
99            {
100                $this->sql_ .= "SELECT COUNT(1) as cnt, ".implode(",", $this->groupby_);
101            }
102            if (config::get('ship_values'))
103            {
104                $this->sql_ .= ', ksv.shp_value';
105            }
106
107            $this->sql_ .= "    FROM kb3_kills kll ";
108            // MySQL tends to pick an index for this query poorly so specify one.
109            //if($this->ordered_ && !$this->orderby_) $this->sql_ .= "use index (".$timeindex.") ";
110           
111            $this->sql_ .= "INNER JOIN kb3_ships shp
112                              ON ( shp.shp_id = kll.kll_ship_id )
113                           INNER JOIN kb3_ship_classes scl
114                              ON ( scl.scl_id = shp.shp_class )";
115            if (config::get('ship_values'))
116            {
117                $this->sql_ .= ' left join kb3_ships_values ksv ON (kll.kll_ship_id = ksv.shp_id) ';
118            }
119
120            if (!$this->summary_) $this->sql_ .= "INNER JOIN kb3_pilots plt
121                              ON ( plt.plt_id = kll.kll_victim_id )
122                           INNER JOIN kb3_corps crp
123                              ON ( crp.crp_id = kll.kll_crp_id )
124                           INNER JOIN kb3_alliances ali
125                              ON ( ali.all_id = kll.kll_all_id )
126                           INNER JOIN kb3_pilots fbplt
127                              ON ( fbplt.plt_id = kll.kll_fb_plt_id )
128                                                   INNER JOIN kb3_inv_detail fb
129                                                      ON ( fb.ind_kll_id = kll.kll_id AND fb.ind_plt_id = kll.kll_fb_plt_id )
130                           INNER JOIN kb3_corps fbcrp
131                              ON ( fbcrp.crp_id = fb.ind_crp_id )";
132            if(!$this->summary_ || count($this->systems_))
133              $this->sql_ .= " INNER JOIN kb3_systems sys
134                              ON ( sys.sys_id = kll.kll_system_id )";
135
136            // regions
137            if (count($this->regions_))
138            {
139                $this->sql_ .= " INNER JOIN kb3_constellations con
140                              ON ( con.con_id = sys.sys_con_id and
141                           con.con_reg_id in ( ".implode($this->regions_, ",")." ) )";
142            }
143
144            if( $datefilter == "" && ( $this->inv_plt_ || $this->inv_crp_ || $this->inv_all_))
145            {
146                if($this->inv_plt_) $this->sql_ .= "INNER JOIN kb3_inv_detail ind ".
147                  "ON (kll.kll_id = ind.ind_kll_id AND ind.ind_plt_id IN (".
148                  implode(',', $this->inv_plt_)." ) ) ";
149                if($this->inv_crp_) $this->sql_ .= "INNER JOIN kb3_inv_detail ind ".
150                  "ON (kll.kll_id = ind.ind_kll_id AND ind.ind_crp_id IN (".
151                  implode(',', $this->inv_crp_)." ) ) ";
152                if($this->inv_all_) $this->sql_ .= "INNER JOIN kb3_inv_detail ind ".
153                  "ON (kll.kll_id = ind.ind_kll_id AND ind.ind_all_id IN (".
154                  implode(',', $this->inv_all_)." ) ) ";
155            }
156            // The first argument after WHERE affects sql optimisation so check
157            // each possible argument to see whether it should use AND or WHERE
158            // rather than start with WHERE 1
159            $sqlwhereop = ' WHERE ';
160            // Date filter
161            if($datefilter != "")
162            {
163                $this->sql_ .= $sqlwhereop.$datefilter;
164                $sqlwhereop = ' AND ';
165            }
166            // System filter
167            if (count($this->systems_))
168            {
169                $this->sql_ .= $sqlwhereop." kll.kll_system_id in ( ".implode($this->systems_, ",").")";
170                $sqlwhereop = ' AND ';
171            }
172            // victim filter
173            if($this->vic_plt_ || $this->vic_crp_ || $this->vic_all_)
174            {
175                    if ($this->mixedvictims_)
176                    {
177                        $this->sql_ .= $sqlwhereop." ( ";
178                        $sqlwhereop = "";
179                    }
180
181                    if ($this->vic_plt_)
182                        {$this->sql_ .= " ".$sqlwhereop." kll.kll_victim_id in ( ".implode(',', $this->vic_plt_)." )"; $sqlwhereop = " OR ";}
183                    if ($this->vic_crp_)
184                        {$this->sql_ .= " ".$sqlwhereop." kll.kll_crp_id in ( ".implode(',', $this->vic_crp_)." )"; $sqlwhereop = " OR ";}
185                    if ($this->vic_all_)
186                        {$this->sql_ .= " ".$sqlwhereop." kll.kll_all_id in ( ".implode(',', $this->vic_all_)." )"; $sqlwhereop = " OR ";}
187                    $sqlwhereop = ' AND ';
188                    if ($this->mixedvictims_)
189                        $this->sql_ .= " ) ";
190            }
191
192            // related kills
193            if ($this->related_)
194            {
195                $rqry = new DBQuery();
196                $rsql = "select kll_timestamp, kll_system_id from kb3_kills where kll_id = ".$this->related_;
197
198                $rqry->execute($rsql);
199                $rrow = $rqry->getRow();
200
201                $this->sql_ .= $sqlwhereop."kll.kll_timestamp <=
202                               ".(date('Y-m-d H:i:s',strtotime($rrow['kll_timestamp']) + 60 * 60)).
203                           " and kll.kll_timestamp >=
204                               ".(date('Y-m-d H:i:s',strtotime($rrow['kll_timestamp']) - 60 * 60)).
205                            " and kll.kll_system_id = ".$rrow['kll_system_id'];
206                $sqlwhereop = " AND ";
207            }
208            // Get all kills after given kill id (used for feed syndication)
209            if ($this->minkllid_)
210            {
211                $this->sql_ .= $sqlwhereop.'kll.kll_id > '.$this->minkllid_.' ';
212                $sqlwhereop = ' AND ';
213            }
214
215            // excluded ship filter
216            if (count($this->exclude_scl_))
217            {
218                $this->sql_ .= $sqlwhereop." shp.shp_class not in ( ".implode(",", $this->exclude_scl_)." )";
219                $sqlwhereop = ' AND ';
220            }
221            // included ship filter
222            if (count($this->vic_scl_id_))
223            {
224                $this->sql_ .= $sqlwhereop." shp.shp_class in ( ".implode(",", $this->vic_scl_id_)." ) ";
225                $sqlwhereop = ' AND ';
226            }
227            // involved filter
228            // involved parties who aren't also the victim
229            // Only use a join if no other limits are used.
230            if($this->inv_plt_ || $this->inv_crp_ || $this->inv_all_) 
231            {
232                if ($this->inv_all_)
233                {
234                    $this->sql_ .= $sqlwhereop." kll.kll_all_id NOT IN ( ".implode(',', $this->inv_all_)." )"; 
235                    $sqlwhereop = ' AND ';
236                }
237                if ($this->inv_crp_)
238                {
239                    $this->sql_ .= $sqlwhereop." kll.kll_crp_id NOT IN ( ".implode(',', $this->inv_crp_)." )";
240                    $sqlwhereop = ' AND ';
241                }
242                if( $datefilter != "" || $this->vic_plt_ || $this->vic_crp_ || $this->vic_all_)
243                {
244                    $this->sql_ .= $sqlwhereop." EXISTS (SELECT 1 FROM kb3_inv_detail exind ".
245                                                 "WHERE kll.kll_id = exind.ind_kll_id AND (";
246                                        $sqlwhereop = "";
247                    if ($this->inv_all_)
248                        {$this->sql_ .= $sqlwhereop." exind.ind_all_id in ( ".implode(',', $this->inv_all_)." ) ";$sqlwhereop = " OR ";}
249                    if ($this->inv_crp_)
250                        {$this->sql_ .= $sqlwhereop." exind.ind_crp_id in ( ".implode(',', $this->inv_crp_)." ) ";$sqlwhereop = " OR ";}
251                    if ($this->inv_plt_)
252                        $this->sql_ .= $sqlwhereop." exind.ind_plt_id in ( ".implode(',', $this->inv_plt_)." ) ";
253                    $this->sql_ .= " ) ) ";
254                    $sqlwhereop = " AND ";
255                }
256            }
257            // This will scan the entire table if LIMIT or a date filter are not used.
258            if($this->comb_plt_ || $this->comb_crp_ || $this->comb_all_) 
259            {
260                $this->sql_ .= $sqlwhereop." ( ";
261                $sqlwhereop = "";
262                if($this->comb_plt_)
263                {
264                        $this->sql_ .= " EXISTS (SELECT 1 FROM kb3_inv_detail ind
265                               WHERE ind.ind_plt_id in ( ".implode(',', $this->comb_plt_)." ) and kll.kll_id = ind.ind_kll_id ) OR ";
266                        $this->sql_ .= "kll.kll_victim_id in ( ".implode(',', $this->comb_plt_)." ) ";
267                        $sqlwhereop = " OR ";
268                }
269                if($this->comb_crp_)
270                {
271                        $this->sql_ .= $sqlwhereop." EXISTS (SELECT 1 FROM kb3_inv_detail ind
272                               WHERE  ind.ind_crp_id in ( ".implode(',', $this->comb_crp_)." ) and kll.kll_id = ind.ind_kll_id) OR ";
273                        $this->sql_ .= "kll.kll_crp_id in ( ".implode(',', $this->comb_crp_)." ) ";
274                        $sqlwhereop = " OR ";
275                }
276                if($this->comb_all_)
277                {
278                        $this->sql_ .= $sqlwhereop." EXISTS (SELECT 1 FROM kb3_inv_detail ind
279                               WHERE  ind.ind_all_id in ( ".implode(',', $this->comb_all_)." ) and kll.kll_id = ind.ind_kll_id) OR ";
280                        $this->sql_ .= "kll.kll_all_id in ( ".implode(',', $this->comb_all_)." ) ";
281                }
282                $this->sql_ .= " )";
283                $sqlwhereop = " AND ";
284            }
285           
286            // GROUP BY
287            if ($this->groupby_) $this->sql_ .= " GROUP BY ".implode(",", $this->groupby_);
288            // order/limit
289            if ($this->ordered_)
290            {
291                if (!$this->orderby_) $this->sql_ .= " order by kll_timestamp desc";
292                else $this->sql_ .= " order by ".$this->orderby_;
293            }
294            if ($this->limit_) $this->sql_ .= " limit ".$this->limit_." OFFSET ".$this->offset_;
295            // Enclose query in another to fetch comments and involved parties
296            if(!count($this->groupby_) && ($this->comments_ || $this->involved_))
297            {
298                $this->sql_ .= ") list";
299                if($this->involved_) $this->sql_ .= ' join kb3_inv_detail ind ON (ind.ind_kll_id = list.kll_id)';
300                if($this->comments_) $this->sql_ .= ' left join kb3_comments com ON (list.kll_id = com.kll_id)';
301                $this->sql_ .= " group by list.kll_id";
302                // Outer query also needs to be ordered, if there's an order
303                if ($this->ordered_)
304                {
305                    if (!$this->orderby_) $this->sql_ .= " order by kll_timestamp desc";
306                    else $this->sql_ .= " order by ".$this->orderby_;
307                }
308            }
309            $this->sql_ .= " -- kill list";
310            $this->qry_->execute($this->sql_);
311        }
312    }
313
314    function getRow()
315    {
316        $this->execQuery();
317        if ($this->plimit_ && $this->killcounter_ >= $this->plimit_)
318        {
319            // echo $this->plimit_." ".$this->killcounter_;
320            return null;
321        }
322
323        $skip = $this->poffset_ - $this->killpointer_;
324        if ($skip > 0)
325        {
326            for ($i = 0; $i < $skip; $i++)
327            {
328                $this->killpointer_++;
329                $row = $this->qry_->getRow();
330            }
331        }
332
333        $row = $this->qry_->getRow();
334
335        return $row;
336    }
337
338    function getKill()
339    {
340        $this->execQuery();
341        if ($this->plimit_ && $this->killcounter_ >= $this->plimit_)
342        {
343            // echo $this->plimit_." ".$this->killcounter_;
344            return null;
345        }
346
347        $skip = $this->poffset_ - $this->killpointer_;
348        if ($skip > 0)
349        {
350            for ($i = 0; $i < $skip; $i++)
351            {
352                $this->killpointer_++;
353                $row = $this->qry_->getRow();
354            }
355        }
356
357        $row = $this->qry_->getRow();
358        if ($row)
359        {
360            $this->killcounter_++;
361            if ($row['scl_class'] != 2 && $row['scl_class'] != 3 && $row['scl_class'] != 11)
362                $this->realkillcounter_++;
363
364           if (config::get('ship_values'))
365            {
366                if ($row['shp_value'])
367                {
368                    $row['scl_value'] = $row['shp_value'];
369                }
370            }
371
372            if ($this->walked == false)
373            {
374                $this->killisk_ += $row['kll_isk_loss'];
375                $this->killpoints_ += $row['kll_points'];
376            }
377
378            $kill = new Kill($row['kll_id']);
379            $kill->setTimeStamp($row['kll_timestamp']);
380            $kill->setSolarSystemName($row['sys_name']);
381            $kill->setSolarSystemSecurity($row['sys_sec']);
382            $kill->setVictimName($row['plt_name']);
383            $kill->setVictimCorpName($row['crp_name']);
384            $kill->setVictimCorpID($row['crp_id']);
385            $kill->setVictimAllianceName($row['all_name']);
386            $kill->setVictimAllianceID($row['all_id']);
387            $kill->setVictimShipName($row['shp_name']);
388            $kill->setVictimShipExternalID($row['shp_externalid']);
389            $kill->setVictimShipClassName($row['scl_class']);
390            $kill->setVictimShipValue($row['scl_value']);
391            $kill->setVictimID($row['kll_victim_id']);
392            $kill->setFBPilotName($row['fbplt_name']);
393            $kill->setFBCorpName($row['fbcrp_name']);
394            $kill->setKillPoints($row['kll_points']);
395            $kill->iskloss_ = $row['kll_isk_loss'];
396                        $kill->plt_ext_ = $row['plt_externalid'];
397            $kill->fbplt_ext_ = $row['fbplt_externalid'];
398            $kill->_sclid = $row['scl_id'];
399            $kill->_shpid = $row['shp_id'];
400            //Set the involved party count if it is known
401            if($this->involved_) $kill->setInvolvedPartyCount($row['inv']);
402            //Set the comment count if it is known
403            if($this->comments_) $kill->setCommentCount($row['comments']);
404            if ($this->_tag)
405            {
406                $kill->_tag = $this->_tag;
407            }
408            if (config::get('kill_classified'))
409            {
410                if ($kill->isClassified())
411                {
412                    $kill->setSolarSystemName('Classified');
413                    $kill->setSolarSystemSecurity('0.0');
414                }
415            }
416
417            return $kill;
418        }
419        else
420        {
421            $this->walked = true;
422            return null;
423        }
424    }
425
426    function getAllKills()
427    {
428        while ($this->getKill())
429        {
430        }
431        $this->rewind();
432    }
433
434    function addInvolvedPilot($pilot)
435    {
436        if(is_numeric($pilot)) $this->inv_plt_[] = $pilot;
437            else $this->inv_plt_[] = $pilot->getID();
438    }
439
440    function addInvolvedCorp($corp)
441    {
442        if(is_numeric($corp)) $this->inv_crp_[] = $corp;
443            else $this->inv_crp_[] = $corp->getID();
444    }
445
446    function addInvolvedAlliance($alliance)
447    {
448        if(is_numeric($alliance)) $this->inv_all_[] = $alliance;
449        else $this->inv_all_[] = $alliance->getID();
450    }
451
452    function addVictimPilot($pilot)
453    {
454        if(is_numeric($pilot)) $this->vic_plt_[] = $pilot;
455            else $this->vic_plt_[] = $pilot->getID();
456    }
457
458    function addVictimCorp($corp)
459    {
460        if(is_numeric($corp)) $this->vic_crp_[] = $corp;
461            else $this->vic_crp_[] = $corp->getID();
462    }
463
464    function addVictimAlliance($alliance)
465    {
466        if(is_numeric($alliance)) $this->vic_all_[] = $alliance;
467        else $this->vic_all_[] = $alliance->getID();
468    }
469
470    function addCombinedPilot($pilot)
471    {
472            if(is_numeric($pilot)) $this->comb_plt_[] = $pilot;
473            else $this->comb_plt_[] = $pilot->getID();
474    }
475
476    function addCombinedCorp($corp)
477    {
478            if(is_numeric($corp)) $this->comb_crp_[] = $corp;
479            else $this->comb_crp_[] = $corp->getID();
480    }
481
482    function addCombinedAlliance($alliance)
483    {
484            if(is_numeric($alliance)) $this->comb_all_[] = $alliance;
485            else $this->comb_all_[] = $alliance->getID();
486    }
487
488    function addVictimShipClass($shipclass)
489    {
490            if(is_numeric($shipclass)) $this->vic_scl_id_[] = $shipclass;
491            else $this->vic_scl_id_[] = $shipclass->getID();
492    }
493
494    function addVictimShip($ship)
495    {
496    }
497
498    function addItemDestroyed($item)
499    {
500    }
501
502    function addRegion($region)
503    {
504        if(is_numeric($region)) $this->regions_[] = $region;
505        else $this->regions_[] = $region->getID();
506    }
507
508    function addSystem($system)
509    {
510        if(is_numeric($system)) $this->systems_[] = $system;
511        else $this->systems_[] = $system->getID();
512    }
513
514    function addGroupBy($groupby)
515    {
516        array_push($this->groupby_, $groupby);
517    }
518
519    function setPageSplitter($pagesplitter)
520    {
521        if (isset($_GET['page'])) $page = $_GET['page'];
522        else $page = 1;
523        $this->plimit_ = $pagesplitter->getSplit();
524        $this->poffset_ = ($page * $this->plimit_) - $this->plimit_;
525        // echo $this->offset_;
526        // echo $this->limit_;
527    }
528
529    // Filter results by week. Requires the year to also be set.
530    function setWeek($weekno)
531    {
532        $weekno=intval($weekno);
533        if($weekno <1)  $this->weekno_ = 1;
534        if($weekno >53) $this->weekno_ = 53;
535        else $this->weekno_ = $weekno;
536    }
537
538    // Filter results by year.
539    function setYear($yearno)
540    {
541        // 1970-2038 is the allowable range for the timestamp code used
542        // Needs to be revisited in the next 30 years
543        $yearno = intval($yearno);
544        if($yearno < 1970) $this->yearno_ = 1970;
545        if($yearno > 2038) $this->yearno_ = 2038;
546        else $this->yearno_ = $yearno;
547    }
548
549    // Filter results by starting week. Requires the year to also be set.
550    function setStartWeek($weekno)
551    {
552        $weekno=intval($weekno);
553        if($weekno <1)  $this->startweekno_ = 1;
554        if($weekno >53) $this->startweekno_ = 53;
555        else $this->startweekno_ = $weekno;
556    }
557
558    // Filter results by starting date/time.
559    function setStartDate($timestamp)
560    {
561        // Check timestamp is valid before adding
562        if(strtotime($timestamp)) $this->startDate_ = $timestamp;
563    }
564
565    // Filter results by ending date/time.
566    function setEndDate($timestamp)
567    {
568        // Check timestamp is valid before adding
569        if(strtotime($timestamp)) $this->endDate_ = $timestamp;
570    }
571
572    // Return SQL for date filter using currently set date limits
573    function getDateFilter()
574    {
575        // timestamp filter
576            $qstartdate = 0;
577            $qenddate = 2147483647;
578            $sql = '';
579           
580            /* Priority order of date filters:
581             * weekno > startWeek > yearno
582             * weekno > yearno
583             * startDate and endDate are used if they restrict the date range further
584             * weekno and startweek are not used if no year is set
585             */
586            if($this->yearno_ && $this->weekno_)
587            {
588                if ($this->weekno_ == 1)
589                {
590                    $qstartdate = strtotime($this->yearno_.'-1-1 00:00 UTC');
591                    $qenddate = strtotime($this->yearno_.'-1-1 last Monday + '.($this->weekno_).' weeks - 1 minute UTC');
592                }
593                else if ($this->weekno_ == 53) 
594                {
595                    $qstartdate = strtotime($this->yearno_.'-1-1 last Monday + '.($this->weekno_-1).' weeks UTC');
596                    $qenddate = strtotime(($this->yearno_).'-12-31 23:59 UTC');
597                }
598                else
599                {
600                    $qstartdate = strtotime($this->yearno_.'-1-1 last Monday + '.($this->weekno_-1).' weeks UTC');
601                    $qenddate = strtotime($this->yearno_.'-1-1 last Monday + '.($this->weekno_).' weeks - 1 minute UTC');
602                }
603            }
604            else if($this->yearno_ && $this->startweekno_)
605            {
606                if ($this->startweekno_ == 1) $qstartdate = strtotime($this->yearno_.'-1-1 00:00 UTC');
607                else $qstartdate = strtotime($this->yearno_.'-1-1 last Monday + '.($this->weekno_-1).' weeks UTC');
608            }
609            else if($this->yearno_)
610            {
611                $qstartdate = strtotime($this->yearno_.'-1-1 00:00 UTC');
612                $qenddate = strtotime(($this->yearno_).'-12-31 23:59 UTC');
613            }
614            //If set use the latest startdate and earliest enddate set.
615            if($this->startDate_ && $qstartdate < strtotime($this->startDate_." UTC")) $qstartdate = strtotime($this->startDate_." UTC");
616            if($this->endDate_ && $qenddate > strtotime($this->endDate_." UTC")) $qenddate = strtotime($this->endDate_." UTC");
617           
618            if($qstartdate > 0) $sql .= " kll.kll_timestamp >= '".gmdate('Y-m-d H:i',$qstartdate)."' ";
619            if($qstartdate > 0 && $qenddate < 2147483647) $sql .= " AND ";
620            if($qenddate < 2147483647) $sql .= " kll.kll_timestamp <= '".gmdate('Y-m-d H:i',$qenddate)."' ";
621        return $sql;
622    }
623   
624    function setRelated($killid)
625    {
626        $this->related_ = $killid;
627    }
628
629    function setLimit($limit)
630    {
631        $this->limit_ = $limit;
632    }
633
634    function setOrderBy($orderby)
635    {
636        $this->orderby_ = $orderby;
637    }
638
639    function setMinKllID($id)
640    {
641        $this->timeframe_ = '';
642        $this->minkllid_ = $id;
643    }
644   
645    function setSummary($summary = false)
646    {
647        $this->summary_ = $summary;
648    }
649
650    function getCount()
651    {
652        $this->execQuery();
653        return $this->qry_->recordCount();
654    }
655
656    function getRealCount()
657    {
658        $this->execQuery();
659        return $this->qry_->recordCount();
660    }
661
662    function getISK()
663    {
664        $this->execQuery();
665        return $this->killisk_;
666    }
667
668    function getPoints()
669    {
670        return $this->killpoints_;
671    }
672
673    function rewind()
674    {
675        $this->qry_->rewind();
676        $this->killcounter_ = 0;
677    }
678
679    function setPodsNoobShips($flag)
680    {
681        if (!$flag)
682        {
683            array_push($this->exclude_scl_, 2);
684            array_push($this->exclude_scl_, 3);
685            array_push($this->exclude_scl_, 11);
686        }
687    }
688
689    function setOrdered($flag)
690    {
691        $this->ordered_ = $flag;
692    }
693
694    function tag($string)
695    {
696        if ($string == '')
697        {
698            $this->_tag = null;
699        }
700        else
701        {
702            $this->_tag = $string;
703        }
704    }
705   
706    // Add a comment count to the killlist SQL
707    function setCountComments($comments = true)
708    {
709        $this->comments_ = $comments;
710    }
711   
712    // Add an involved party count to the killlist SQL
713    function setCountInvolved($setinv = true)
714    {
715        $this->involved_ = $setinv;
716    }
717}
718   
719class CombinedKillList extends KillList
720{
721    function CombinedKillList()
722    {
723        // please only load killlists here
724        $this->lists = func_get_args();
725        if (!is_array($this->lists))
726        {
727            trigger_error('No killlists given to CombinedKillList', E_USER_ERROR);
728        }
729        $this->kills = false;
730    }
731
732    function buildKillArray()
733    {
734        $this->kills = array();
735        foreach ($this->lists as $killlist)
736        {
737            // reset the list
738            $killlist->rewind();
739
740            // load all kills and store them in an array
741            while ($kill = $killlist->getKill())
742            {
743                // take sure that if there are multiple kills all are stored
744                if (isset($this->kills[$kill->timestamp_]))
745                {
746                    $this->kills[$kill->timestamp_.rand()] = $kill;
747                }
748                else
749                {
750                    $this->kills[$kill->timestamp_] = $kill;
751                }
752            }
753        }
754
755        // sort the kills by time
756        krsort($this->kills);
757    }
758
759    function getKill()
760    {
761        // on the first request we load up our kills
762        if ($this->kills === false)
763        {
764            $this->buildKillArray();
765            if (is_numeric($this->poffset_) && is_numeric($this->plimit_))
766                $this->kills = array_slice($this->kills, $this->poffset_, $this->plimit_);
767        }
768
769        // once all kills are out this will return null so we're fine
770        return array_shift($this->kills);
771    }
772
773    function rewind()
774    {
775        // intentionally left empty to overload the standard handle
776    }
777
778    function getCount()
779    {
780        $count = 0;
781        foreach ($this->lists as $killlist)
782        {
783            $count += $killlist->getCount();
784        }
785        return $count;
786    }
787
788    function getRealCount()
789    {
790        $count = 0;
791        foreach ($this->lists as $killlist)
792        {
793            $count += $killlist->getRealCount();
794        }
795        return $count;
796    }
797
798    function getISK()
799    {
800        $sum = 0;
801        foreach ($this->lists as $killlist)
802        {
803            $sum += $killlist->getISK();
804        }
805       return $sum;
806    }
807
808    function getPoints()
809    {
810        $sum = 0;
811        foreach ($this->lists as $killlist)
812        {
813            $sum += $killlist->getPoints();
814        }
815        return $sum;
816    }
817
818}
819?>
Note: See TracBrowser for help on using the browser.