<?php

/*
    SQL osztály
    adatbázis műveletek
    SQLI osztályból származtatva
*/


class sql extends mysqli {
    private $_query;

    function __construct($_host, $_username, $_password, $_dbname) {
       parent::__construct($_host, $_username, $_password, $_dbname);
       self::set_charset("utf8");
    }

    public function single_variable($_query) {
        $result = self::query($_query);
        //var_dump($_query);
        $assoc_array = $result->fetch_array(MYSQLI_NUM);
        return $assoc_array['0'];
    }

    public function assoc_array($_query) {
        //var_dump($_query);
        $result = self::query($_query);
        $ret_array = array();
        while ($item = $result->fetch_assoc()) {
            $ret_array[] = $item;
        }
        return $ret_array;
    }


    public function insert_into($table, $value_array, $need_apostrophs = true) {
        //a beszúrt rekord id-ját adja vissza
        $fields = '';
        $values = '';
        $i = 0;
        $n = count($value_array);
        foreach ($value_array as $key => $value) {
            $fields .= $key;
            $need_apostrophs = $value!='null';
            $values .= ($need_apostrophs ? "'" : "") . $value . ($need_apostrophs ? "'" : "");
            if ($i!=($n-1)) {
                $fields .= ', ';
                $values .= ', ';
            }
            $i++;
        }
        $this->_query = 'insert into ' . $table . ' (' . $fields . ') values (' . $values . ');';
        //var_dump($this->_query);
        self::query($this->_query);
        return $this->insert_id;
    }

    public function update_table($table, $value_array, $conditions, $need_apostrophs = true) {
        $this->_query = "update " . $table . " set ";
        $n = count($value_array);
        $i=0;
        foreach ($value_array as $key => $val) {
            $need_apostrophs = $val!='null';
            $this->_query .= $key . "=" . ($need_apostrophs ? "'" : "") . $val . ($need_apostrophs ? "'" : "") . ($i!=$n-1 ? ", " : "");
            $i++;
        }
        $this->_query .= " where ";
        $n = count($conditions);
        $i=0;
        foreach ($conditions as $key_ => $val_) {
            $this->_query .= $key_ . "='" . $val_ . "'" . ($i!=$n-1 ? " and " : ";");
            $i++;
        }
        //var_dump($this->_query);
        self::query($this->_query);
    }


    public function num_of_rows($_query) {
        $result = self::query($_query);
        return is_object($result)?$result->num_rows:0;
    }

    public function execute_query($_query) {
        //var_dump($_query);
        return self::query($_query);
    }

    function export_database($tables=false, $backup_name=false )
    {
        $name = "badminton_coach";
        $this->query("SET NAMES 'utf8'");

        $queryTables    = $this->query('SHOW TABLES');
        while($row = $queryTables->fetch_row())
        {
            $target_tables[] = $row[0];
        }
        if($tables !== false)
        {
            $target_tables = array_intersect( $target_tables, $tables);
        }
        foreach($target_tables as $table)
        {
            $result         =   $this->query('SELECT * FROM '.$table);
            $fields_amount  =   $result->field_count;
            $rows_num=$this->affected_rows;
            $res            =   $this->query('SHOW CREATE TABLE '.$table);
            $TableMLine     =   $res->fetch_row();
            $content        = (!isset($content) ?  '' : $content) . "\n\n".$TableMLine[1].";\n\n";

            for ($i = 0, $st_counter = 0; $i < $fields_amount;   $i++, $st_counter=0)
            {
                while($row = $result->fetch_row())
                { //when started (and every after 100 command cycle):
                    if ($st_counter%100 == 0 || $st_counter == 0 )
                    {
                            $content .= "\nINSERT INTO ".$table." VALUES";
                    }
                    $content .= "\n(";
                    for($j=0; $j<$fields_amount; $j++)
                    {
                        $row[$j] = str_replace("\n","\\n", addslashes($row[$j]) );
                        if (isset($row[$j]))
                        {
                            $content .= '"'.$row[$j].'"' ;
                        }
                        else
                        {
                            $content .= '""';
                        }
                        if ($j<($fields_amount-1))
                        {
                                $content.= ',';
                        }
                    }
                    $content .=")";
                    //every after 100 command cycle [or at last line] ....p.s. but should be inserted 1 cycle eariler
                    if ( (($st_counter+1)%100==0 && $st_counter!=0) || $st_counter+1==$rows_num)
                    {
                        $content .= ";";
                    }
                    else
                    {
                        $content .= ",";
                    }
                    $st_counter=$st_counter+1;
                }
            } $content .="\n\n\n";
        }
        //$backup_name = $backup_name ? $backup_name : $name."___(".date('H-i-s')."_".date('d-m-Y').")__rand".rand(1,11111111).".sql";
        $backup_name = $backup_name ? $backup_name : $name.".sql";
        //header('Content-Type: application/octet-stream');
        //header("Content-Transfer-Encoding: Binary");
        //header("Content-disposition: attachment; filename=\"".$backup_name."\"");
        return $content;

        }
}


?>
