root/dev/mods/value_fetch/fetcher.php @ 419

Revision 370, 6.2 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
2Class Fetcher
3{
4        var $faction;
5        var $xml_parser;
6        var $xml_file;
7        var $insideitem;
8        var $avg_sell;
9        var $avg_buy;
10        var $typeid;
11        var $count;
12        var $timestamp;
13        var $tooLow;
14        var $sell_median;
15        var $buy_median;
16        var $factionPrice;
17        var $compfile = "http://svn.nsbit.dk/itemfetch/items.xml.gzphp.php";
18        var $uncompfile = "http://svn.nsbit.dk/itemfetch/items.xml.php";
19
20        function updateShips()
21        {
22                $qry = new DBQuery();
23                $qryins = new DBQuery();
24                $str = "SELECT ship.shp_id as id, item.price as price FROM kb3_ships ship JOIN kb3_item_price item ON item.typeID = ship.shp_externalid WHERE item.price > 0";
25                $i = 0;
26                $qry->execute($str);
27                while ($row = $qry->getRow())
28                {
29                        if($i) $querytext .=",";
30                        else $querytext="INSERT INTO kb3_ships_values (shp_id, shp_value) VALUES ";
31                        $querytext .= "('".$row['id']."','".$row['price']."')";
32                        $i++;
33                }
34                $querytext .= " ON DUPLICATE KEY UPDATE shp_value = VALUES(shp_value);";
35                $qry->execute($querytext);
36                return $i;
37        }
38
39        // Some of this work is based of the value_editor from Eve-dev killboard
40        function fetch_values_php5($factionin) 
41        {
42                $this->faction = $factionin;
43                // Fetch the gzip file.
44// Switch fopen to cURL if it exists
45if (function_exists('curl_init'))
46{
47    $ch = curl_init();
48    curl_setopt($ch, CURLOPT_URL, $this->compfile);
49    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
50    curl_setopt($ch, CURLOPT_BINARYTRANSFER, true);
51    $content = curl_exec($ch);
52    curl_close($ch);
53    if(strlen($content)==0) return 0;
54}
55else
56{
57    $file = fopen($this->compfile , "r");
58
59                if (! $file) {
60                        return 0;
61                }
62                $content = stream_get_contents($file);
63                fclose($file);
64}       
65                $content = gzinflate($content);
66                // Old style, direct, no gzip!
67                // $sxe = simplexml_load_file("http://svn.nsbit.dk/itemfetch/items.xml");
68                $sxe = new SimpleXMLElement($content);
69                // prepare counter
70                $i = 0;
71                // New query
72                $qry = new DBQuery();
73
74                foreach($sxe->market_stat as $stat)
75                {
76                        // If there is almost nothing for sale, AT ALL, don't include!
77                        // if ($stat->total_sell_volume < 5) continue;
78                        // Same average as used in value_editor (eve_central_sync)
79                        //$weighted_average = round(((1.6 * $stat->avg_buy_price + 0.8 * $stat->avg_sell_price) / 2),0);
80                        // Use global sell prices
81                        //$weighted_average = round($stat->avg_sell_price,0);
82                        // Use sell median
83                        if (($stat->sell_median != null) && ($stat->sell_median != 0))
84                                $weighted_average = round($stat->sell_median,0);
85                        else
86                                $weighted_average = round($stat->avg_sell_price,0);
87
88                        if (($this->faction == true) && ($stat->factionPrice > 0))
89                                $weighted_average = round($stat->factionPrice,0);
90//                      if (!$weighted_average) continue;       
91                        // Insert new values into the database and update the old
92                        // For the first item start the query. For later items add ','
93                        if($i) $querytext .=",";
94                        else $querytext="INSERT INTO kb3_item_price (typeID, price) VALUES ";
95                        $querytext .= "(".$stat->typeid.",".number_format($weighted_average, 0, '', '').")";
96                        $i++;
97                }
98                // Finish query with a check for duplicates. If so, just update
99                $querytext .= " ON DUPLICATE KEY UPDATE price = VALUES(price);";
100                $qry->execute($querytext);
101                return "Count: ".$i." <br><br>Cached on: ".date('H:i:s - j/m/Y',(int)($sxe->timestamp));
102        }
103
104        function fetch_values_php4($factionin)
105        {
106                $this->faction = $factionin;
107                $this->sell_median = null;
108                $this->buy_median = null;
109                $this->xml_parser = xml_parser_create();
110                xml_set_object($this->xml_parser, $this);
111                // use case-folding so we are sure to find the tag in $map_array
112                //xml_parser_set_option($this->xml_parser, XML_OPTION_CASE_FOLDING, true);
113                xml_set_element_handler($this->xml_parser, "startElement", "endElement");
114                xml_set_character_data_handler($this->xml_parser, "characterData");
115               
116                if (!($fp = fopen($this->uncompfile, "r"))) {
117                        die("could not open XML input");
118                }   
119
120                while ($data = fread($fp, 4096)) 
121                {
122                        if (!xml_parse($this->xml_parser, $data, feof($fp))) 
123                        {
124                                die(sprintf("XML error: %s at line %d",
125                                xml_error_string(xml_get_error_code($this->xml_parser)), xml_get_current_line_number($this->xml_parser)));
126                        }
127                }
128                return "Count: ".$this->count." <br><br>Cached on: ".date('H:i:s - j/m/Y',$this->timestamp);
129        }
130
131
132        function characterData($parser, $data)
133        {
134                switch($this->tag)
135                {
136                        case "timestamp":
137                                $this->timestamp .= $data;
138                                break;
139                        case "total_sell_volume":
140                                $this->tooLow .= $data;
141                                break;
142                        case "typeid":
143                                $this->typeid .= $data;
144                                break;
145                        case "avg_buy_price":
146                                $this->avg_buy .= $data;
147                                break;
148                        case "avg_sell_price":
149                                $this->avg_sell .= $data;
150                                break;
151                        case "buy_median":
152                                $this->buy_median .= $data;
153                                break;
154                        case "sell_median":
155                                $this->sell_median .= $data;
156                                break;
157                        case "factionprice":
158                                $this->factionPrice .= $data;
159                                break;
160                }
161        }
162
163
164        function startElement($parser, $name, $attrs)
165        {
166                if ($this->insideitem)
167                {
168                        $this->tag = strtolower($name);
169                }
170                elseif (strtolower($name) == "timestamp")
171                {
172                        $this->tag = strtolower($name);
173                }
174                elseif (strtolower($name) == "market_stat")
175                {
176                        $this->insideitem = true;
177                }
178        }
179
180        function endElement($parser, $name)
181        {
182                if ($this->insideitem && (strtolower($name) == "market_stat"))
183                { 
184                        if (true)//($this->tooLow > 4)
185                        { 
186                                $qry = new DBQuery();
187                                // Old average calculation
188                                //$weighted_average = round(((1.6 * $this->avg_buy + 0.8 * $this->avg_sell) / 2),0);
189                                // New average using sell only
190                                //$weighted_average = round($this->avg_sell_price,0);
191                                // Median prices, if exists
192                                if (($this->sell_median != null) && ($this->sell_median != 0))
193                                        $weighted_average = round($this->sell_median,0);
194                                else
195                                        $weighted_average = round($this->avg_sell,0);
196                                if (($this->faction == true) && ($this->factionPrice != null))
197                                {
198                                        $weighted_average = round($this->factionPrice,0);
199                                }
200                                $qry->execute("REPLACE INTO kb3_item_price (typeID, price) VALUES ('".$this->typeid."','".number_format($weighted_average, 0, '', '')."')");
201                                $this->count++;
202                        }
203                        $this->insideitem = false;
204                        $this->typeid = null;
205                        $this->avg_buy = null;
206                        $this->avg_sell = null;
207                        $this->tooLow = null;
208                        $this->buy_median = null;
209                        $this->sell_median = null;
210                        $this->factionPrice = null;
211                }
212        }
213
214        function destroy() 
215        {
216                xml_parser_free($this->xml_parser);
217        }
218}
219?>
Note: See TracBrowser for help on using the browser.