1<?php
2/**
3 * Statistics Plugin
4 *
5 * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
6 * @author  Andreas Gohr <andi@splitbrain.org>
7 */
8
9class helper_plugin_statistics extends Dokuwiki_Plugin {
10
11    private $dblink = null;
12    public $prefix;
13    private $oQuery = null;
14    private $oLogger = null;
15    private $oGraph = null;
16
17    /**
18     * Constructor
19     */
20    public function __construct() {
21        $this->prefix = $this->getConf('db_prefix');
22    }
23
24    /**
25     * Return an instance of the query class
26     *
27     * @return StatisticsQuery
28     */
29    public function Query() {
30        if(is_null($this->oQuery)) {
31            require dirname(__FILE__) . '/inc/StatisticsQuery.class.php';
32            $this->oQuery = new StatisticsQuery($this);
33        }
34        return $this->oQuery;
35    }
36
37    /**
38     * Return an instance of the logger class
39     *
40     * @return StatisticsLogger
41     */
42    public function Logger() {
43        $this->prefix = $this->getConf('db_prefix');
44        if(is_null($this->oLogger)) {
45            require dirname(__FILE__) . '/inc/StatisticsLogger.class.php';
46            $this->oLogger = new StatisticsLogger($this);
47        }
48        return $this->oLogger;
49    }
50
51    /**
52     * Return an instance of the Graph class
53     *
54     * @return StatisticsGraph
55     */
56    public function Graph() {
57        $this->prefix = $this->getConf('db_prefix');
58        if(is_null($this->oGraph)) {
59            require dirname(__FILE__) . '/inc/StatisticsGraph.class.php';
60            $this->oGraph = new StatisticsGraph($this);
61        }
62        return $this->oGraph;
63    }
64
65    /**
66     * Return a link to the DB, opening the connection if needed
67     */
68    protected function dbLink() {
69        // connect to DB if needed
70        if(!$this->dblink) {
71            if(!$this->getConf('db_server')) return null;
72
73            $this->dblink = mysqli_connect(
74                $this->getConf('db_server'),
75                $this->getConf('db_user'),
76                $this->getConf('db_password')
77            );
78            if(!$this->dblink) {
79                msg('DB Error: connection failed', -1);
80                return null;
81            }
82            if(!mysqli_select_db($this->dblink, $this->getConf('db_database'))) {
83                msg('DB Error: failed to select database', -1);
84                return null;
85            }
86
87            // set utf-8
88            if(!mysqli_query($this->dblink, 'set names utf8')) {
89                msg('DB Error: could not set UTF-8 (' . mysqli_error($this->dblink) . ')', -1);
90                return null;
91            }
92        }
93        return $this->dblink;
94    }
95
96    /**
97     * Simple function to run a DB query
98     */
99    public function runSQL($sql_string) {
100        $link = $this->dbLink();
101        if(!$link) return null;
102
103        $result = mysqli_query($link, $sql_string);
104        if($result === false) {
105            dbglog('DB Error: ' . mysqli_error($link) . ' ' . hsc($sql_string), -1);
106            msg('DB Error: ' . mysqli_error($link) . ' ' . hsc($sql_string), -1);
107            return null;
108        }
109
110        $resultarray = array();
111
112        //mysql_db_query returns 1 on a insert statement -> no need to ask for results
113        if($result !== true) {
114            for($i = 0; $i < mysqli_num_rows($result); $i++) {
115                $temparray     = mysqli_fetch_assoc($result);
116                $resultarray[] = $temparray;
117            }
118            mysqli_free_result($result);
119        }
120
121        if(mysqli_insert_id($link)) {
122            $resultarray = mysqli_insert_id($link); //give back ID on insert
123        }
124
125        return $resultarray;
126    }
127
128    /**
129     * Just send a 1x1 pixel blank gif to the browser
130     *
131     * @called from log.php
132     *
133     * @author Andreas Gohr <andi@splitbrain.org>
134     * @author Harry Fuecks <fuecks@gmail.com>
135     */
136    function sendGIF($transparent = true) {
137        if($transparent) {
138            $img = base64_decode('R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAEALAAAAAABAAEAAAIBTAA7');
139        } else {
140            $img = base64_decode('R0lGODdhAQABAIAAAP///////ywAAAAAAQABAAACAkQBADs=');
141        }
142        header('Content-Type: image/gif');
143        header('Content-Length: ' . strlen($img));
144        header('Connection: Close');
145        print $img;
146        flush();
147        // Browser should drop connection after this
148        // Thinks it's got the whole image
149    }
150}
151