<?php
if ( !defined('BASEPATH')) exit('No direct script access allowed');
/*
* LimeSurvey
* Copyright (C) 2007-2011 The LimeSurvey Project Team / Carsten Schmitz
* All rights reserved.
* License: GNU/GPL License v2 or later, see LICENSE.php
* LimeSurvey is free software. This version may have been modified pursuant
* to the GNU General Public License, and as distributed it includes or
* is derivative of works licensed under the GNU General Public License or
* other free or open source software licenses.
* See COPYRIGHT.php for copyright notices and details.
*
*/

/**
 *
 * @param type $sql
 * @param type $inputarr
 * @param type $silent
 * @return CDbDataReader
 */
function dbExecuteAssoc($sql,$inputarr=false,$silent=true)
{
    $error = '';
    try {
        if($inputarr)
        {
            $dataset=Yii::app()->db->createCommand($sql)->bindValues($inputarr)->query();	//Checked
        }
        else
        {
            $dataset=Yii::app()->db->createCommand($sql)->query();

        }
    } catch(CDbException $e) {
        $error = $e->getMessage();
        $dataset=false;
    }

    if (!$dataset && (Yii::app()->getConfig('debug') >0 || !$silent))
    {
        safeDie('Error executing query in dbExecuteAssoc:'.$error);
    }
    return $dataset;
}


function dbQueryOrFalse($sql)
{
    try {
        $dataset=Yii::app()->db->createCommand($sql)->query();
    } catch(CDbException $e) {
        $dataset=false;
    }
    return $dataset;
}


function dbSelectLimitAssoc($sql,$numrows=0,$offset=0,$inputarr=false,$dieonerror=true)
{
    $query = Yii::app()->db->createCommand($sql.= " ");
    if ($numrows)
    {
        if ($offset)
        {
            $query->limit($numrows, $offset);
        }
        else
        {
            $query->limit($numrows, 0);
        }
    }
    if($inputarr)
    {
        $query->bindValues($inputarr);    //Checked
    }
    try
    {
        $dataset=$query->query();
    }
    catch (CDbException $e)
    {
        $dataset=false;
    }
    if (!$dataset && $dieonerror) {safeDie('Error executing query in dbSelectLimitAssoc:'.$query->text);}
    return $dataset;
}


/**
* This functions quotes fieldnames accordingly
*
* @param mixed $id Fieldname to be quoted
*/

function dbQuoteID($id)
{
    switch (Yii::app()->db->getDriverName())
    {
        case "mysqli" :
        case "mysql" :
            return "`".$id."`";
            break;
        case "dblib":
        case "mssql" :
        case "sqlsrv" :
            return "[".$id."]";
            break;
        case "pgsql":
            return "\"".$id."\"";
            break;
        default:
            return $id;
    }
}

/**
 * Return the random function to use in ORDER BY sql statements
 *
 * @return string
 */
function dbRandom()
{
    $driver = Yii::app()->db->getDriverName();

    // Looked up supported db-types in InstallerConfigForm.php
    // Use below statement to find them
    //$configForm = new InstallerConfigForm();
    //$dbTypes    = $configForm->db_names; //Supported types are in this array

    switch ($driver)
    {
        case 'dblib':
        case 'mssql':
        case 'sqlsrv':
            $srandom='NEWID()';
            break;

        case 'pgsql':
            $srandom='RANDOM()';
            break;

        case 'mysql':
        case 'mysqli':
            $srandom='RAND()';
            break;

        default:
            //Some db type that is not mentioned above, could fail and if so should get an entry above.
            $srandom= 0 + lcg_value()*(abs(1));
            break;
    }

    return $srandom;

}

/**
*  Return a sql statement for finding LIKE named tables
*  Be aware that you have to escape underscor chars by using a backslash
* otherwise you might get table names returned you don't want
*
* @param mixed $table
*/
function dbSelectTablesLike($table)
{
    switch (Yii::app()->db->getDriverName()) {
        case 'mysqli':
        case 'mysql' :
            return "SHOW TABLES LIKE '$table'";
        case 'dblib' :
        case 'mssql' :
        case 'sqlsrv' :
            return "SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES where TABLE_TYPE='BASE TABLE' and TABLE_NAME LIKE '$table' ESCAPE '\'";
        case 'pgsql' :
            return "SELECT table_name FROM information_schema.tables WHERE table_schema = 'public' and table_name like '$table'";
        default: safeDie ("Couldn't create 'select tables like' query for connection type '".Yii::app()->db->getDriverName()."'");
    }
}

/**
* Gets the table names. Do not prefix.
* @param string $table String to match
* @uses dbSelectTablesLike() To get the tables like sql query
* @return array Array of matched table names
*/
function dbGetTablesLike($table)
{
    return (array) Yii::app()->db->createCommand(dbSelectTablesLike("{{{$table}}}"))->queryColumn();
}

/**
* Creates a table using the YII DB Schema function but properly handles custom field types for the various DB types
*
* @param mixed $sTableName
* @param mixed $aColumns
* @param mixed $sOptions
*/
function createTable($sTableName, $aColumns, $sOptions=null)
{
    $sDBDriverName=Yii::app()->db->getDriverName();

    if ($sDBDriverName=='sqlsrv' || $sDBDriverName=='mssql' || $sDBDriverName=='dblib')
    {
        foreach ($aColumns as $sName=>&$sType)
        {
            $sType=str_replace('text','varchar(max)',$sType);
            $sType=str_replace('binary','text',$sType);
            if ($sType=='pk') $sType.=' NOT NULL';
            if (stripos($sType,'null')===false && stripos($sType,'PRIMARY KEY')===false) $sType.=' NULL';
        }
    }
    if ($sDBDriverName=='pgsql')
    {
        foreach ($aColumns as $sName=>&$sType)
        {
            $sType=str_replace('varchar','character varying',$sType);
        }
    }
    if (Yii::app()->db->driverName == 'mysql' || Yii::app()->db->driverName == 'mysqli')
    {
        if (is_null($sOptions))
        $sOptions='ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci';
    }
    Yii::app()->db->createCommand()->createTable($sTableName,$aColumns,$sOptions);
}
