[Tͪ#n$;<:a4sX[y ,)4mGwZЯהcҍ%C=z~O?ooa=͞aոc[jQ$]ݍ[fJ_Ge&yQauvB?&~00LaJMɐSTvh w#$AE=?)NSXF9R#_$3+GjMs;Ҽ?	i8E4>Os9˓ELEhοah<4H	#lƩ	7MDB}	yJNL{ebinvw%q90<RciES(p2pP*.pv.c̊*ٿ#djZƧ>1?,< I#"CGk(Xc,:@cmmӆԁޝz%y6*,lڑǑTZ!4:<PNk"nJW\Ga}-KJ.!NjpNGZw~p ~γc =93"}cP/'a4
j<r1f:ǆKCg Z[%>_Af8W5hz<-di&Iy8r7&TgP=O.&Ku3U UD5")Uuh_U[u,fHr&4ы9H84>&?6wzFuh,ĶHMQb̞4!cp%h0A]]'gٙҕ}:& x<rQ>ύ{L_
Ԕ7#~L[t;Ed+X%bL#Zvzu|͟-Ƌwo=֯^4%O`	Rm|#Zvzu|͟-ƋwǛY|ns0^9D3q8SXV\!& x<rQ>ύ{L_
Ԕi!j.8EQ77hӺcDMcA$+IJI1'Mqn1! F_ૡ_vH& x<rQ>ύ{L_
ԔD>NVܭU{Kbh9-(6-z֬=Fz@I{0/s<ti9v7ru~A?JI1'Mq1lJ3SDQUωTf،ݝ$)WEߣkDJ{ecq	Qt(Wf˘Kգ$?dcSL0ohcu3@Tns,3ϋs^Gy!2i0& x<rQ>ύ{L_
ԔcT$QvHoxwcd6W`_& x<rQ>ύ{L_
Ԕ%)Z`D8@ڧ;B_2Q<\,e3į/Y@IrjI- -SW"Iuݦ;4P⸽13$Ektme3į/Y@%aPQJtYp%8qe11ՁYe$/_b`,>@A$_4ѬJI1'Mq9vd.-BRr&(<I;TL;up6SOP,|ʝU / Vb*=.5bR5WGN$t6"usߙ%xU.ɬJI1'MqRSQ̗
!UaKyUW/C11mGvyM& x<rQ>ύ{L_
Ԕe@]\Y*<et[kDf>WB)#rŧ'-pPUxCꝞPQ1-6"O1EDX57Ku0bA[IJR7G~|85Aon~2zi;/yZ[aۡEú췕~M {BԄsxha͐[۹|_Wwj6ǻd4_?0Qd+=V#Zvzu|&>ɴ^R&Q:l$1/c5MJQs*{i6LFd6=!t%]}nٿi22^$襉Oy7mG*0dY6٣BNŒq$"rú>6&*,Rf,Vo?T!敦,ٛ{L*W=_DIUEYOO&$棄Ϗ$1GPHC#z#6f6QR)z	6b%RokҠp[$p?YW5[ou7KsDEdʅşE_R7}Ì;,2θ[NU[a^'гi;PЭ<ZFv<]ì{43sZ)B2z_
(BlXxBjċ0D ]*KÛ")$m鵓ol_~xח|y[zNs$̧ȱpxM	f.9d"d$N;yjfvދKBbrؘ<^U
Ϛ:7@C}t4 :ښ0cC1jo+=k>I>«@Z>Ă&';V-emm#J! 2"w[YxqP._HXik%Bܻ%e@M,?X^ϚeJOo@Ȗm2j6LgUj6tÆ&MR."LoZǄ=dhrC̿ςR.OncǋW-K=캡E^cY{T;2YNQd}NEl-Iul{duߺPݽ47AaR$a}$KBbrؘ<^U
Ϛ:7@C}toaKW}TGVo6hk]f6 qah^)>Zhk>}yrRhnnxmb;ƙb /M[s~7DlIf5-3Һ+)Ț^Wgiiv3SL鎆ް|IWID%jh|VE^cY{T;2YNQd}NEl-Iul{duߺPݽ47[TޙExT,u|
@Ça-2KOxGۃc=#QL\N]ߡ.e+<44Ͽʿ:q7ESԑ, ,Aʨ|M >e 릭4ڟ{u?f{XƜ3
ej.h!1l?|ݯdNxħi! =j)U%{3Mo%r_ӺmKBbrؘ<^Ums1F'Z1zkW/X2SƠHf^:.q^&Yb ӵrB@r%g/+הZZe'Su^YTk~gtf6NӎNr{*jzdCo0?$qqt"D8LYXϵ_-kեK 7JPLOC#FR6$"Oa4?Nk,YM*w=*)E(6eLY#
]t/B6 ݥCZRFD)BLOH4f$$=X'D(34❮inelation['column_info'])? $cfgRelation['column_info'] : null;
        $is_defined_table_info
            = isset($cfgRelation['table_info'])? $cfgRelation['table_info'] : null;
        $is_defined_relation
            = isset($cfgRelation['relation'])? $cfgRelation['relation'] : null;

        $this->assertEquals(
            null,
            $is_defined_column_info
        );
        $this->assertEquals(
            null,
            $is_defined_table_info
        );
        $this->assertEquals(
            null,
            $is_defined_relation
        );

    }

    /**
     * Test for PMA_relationsCleanupTable
     *
     * @return void
     */
    public function testPMARelationsCleanupTable()
    {
        $db = "PMA";
        $table = "PMA_bookmark";
        $this->redefineRelation();

        //the $cfgRelation value before cleanup column
        $cfgRelation = PMA_checkRelationsParam();
        $this->assertEquals(
            'column_info',
            $cfgRelation['column_info']
        );
        $this->assertEquals(
            'table_info',
            $cfgRelation['table_info']
        );
        $this->assertEquals(
            'table_coords',
            $cfgRelation['table_coords']
        );
        $this->assertEquals(
            'relation',
            $cfgRelation['relation']
        );

        //PMA_relationsCleanupTable
        PMA_relationsCleanupTable($db, $table);

        //the $cfgRelation value after cleanup column
        $cfgRelation = PMA_checkRelationsParam();

        $is_defined_column_info
            = isset($cfgRelation['column_info'])? $cfgRelation['column_info'] : null;
        $is_defined_table_info
            = isset($cfgRelation['table_info'])? $cfgRelation['table_info'] : null;
        $is_defined_relation
            = isset($cfgRelation['relation'])? $cfgRelation['relation'] : null;
        $is_defined_table_coords
            = isset($cfgRelation['table_coords'])
            ? $cfgRelation['table_coords']
            : null;

        $this->assertEquals(
            null,
            $is_defined_column_info
        );
        $this->assertEquals(
            null,
            $is_defined_table_info
        );
        $this->assertEquals(
            null,
            $is_defined_relation
        );
        $this->assertEquals(
            null,
            $is_defined_table_coords
        );
    }

    /**
     * Test for PMA_relationsCleanupDatabase
     *
     * @return void
     */
    public function testPMARelationsCleanupDatabase()
    {
        $db = "PMA";
        $this->redefineRelation();

        //the $cfgRelation value before cleanup column
        $cfgRelation = PMA_checkRelationsParam();
        $this->assertEquals(
            'column_info',
            $cfgRelation['column_info']
        );
        $this->assertEquals(
            'bookmark',
            $cfgRelation['bookmark']
        );
        $this->assertEquals(
            'table_info',
            $cfgRelation['table_info']
        );
        $this->assertEquals(
            'pdf_pages',
            $cfgRelation['pdf_pages']
        );
        $this->assertEquals(
            'table_coords',
            $cfgRelation['table_coords']
        );
        $this->assertEquals(
            'relation',
            $cfgRelation['relation']
        );

        //cleanup
        PMA_relationsCleanupDatabase($db);

        //the value after cleanup column
        $cfgRelation = PMA_checkRelationsParam();

        $is_defined_column_info
            = isset($cfgRelation['column_info'])? $cfgRelation['column_info'] : null;
        $is_defined_table_info
            = isset($cfgRelation['table_info'])? $cfgRelation['table_info'] : null;
        $is_defined_relation
            = isset($cfgRelation['relation'])? $cfgRelation['relation'] : null;
        $is_defined_table_coords
            = isset($cfgRelation['table_coords'])
            ? $cfgRelation['table_coords']
            : null;

        $this->assertEquals(
            null,
            $is_defined_column_info
        );
        $this->assertEquals(
            null,
            $is_defined_table_info
        );
        $this->assertEquals(
            null,
            $is_defined_relation
        );
        $this->assertEquals(
            null,
            $is_defined_table_coords
        );
    }
}

/**
 * DBI_PMA_Relation_Cleanup for Mock DBI class
 *
 * this class is for Mock DBI
 *
 * @package PhpMyAdmin-test
 */
class DBI_PMA_Relation_Cleanup extends DatabaseInterface
{
    var $index;
    var $assocIndex;
    var $totalNum;
    var $values = array();
    var $indexs = array();

    /**
     * Constructor
     *
     */
    public function __construct()
    {
         $this->index = 0;
         $this->assocIndex = 0;
         $this->totalNum = 2;
         $this->values = array(
             'bookmark',
             'relation',
             'table_info',
             'table_coords',
             'column_info',
             'pdf_pages',
             'history',
             'recent',
             'table_uiprefs',
             'tracking',
             'userconfig',
             'users',
             'usergroups',
             'navigationhiding',
         );
         $this->indexs = array(
             'bookmark' => 0,
             'relation' => 1,
             'table_info' => 2,
             'table_coords' => 3,
             'column_info' => 4,
             'pdf_pages' => 5,
             'history' => 6,
             'recent' => 7,
             'table_uiprefs' => 8,
             'tracking' => 9,
             'userconfig' => 10,
             'users' => 11,
             'usergroups' => 12,
             'navigationhiding' => 13,
         );
    }

    /**
     * returns array of rows with numeric keys from $result
     *
     * @param object $result result set identifier
     *
     * @return array
     */
    function fetchRow($result)
    {
        $curr_table = array();
        if ($this->index < count($this->values)) {
            $curr_table[0] = $this->values[$this->index];
            $this->index++;
            return $curr_table;
        }

        $this->index = 0;
        return false;
    }


    /**
     * runs a query
     *
     * @param string $sql                 SQL query to execute
     * @param mixed  $link                optional database link to use
     * @param int    $options             optional query options
     * @param bool   $cache_affected_rows whether to cache affected rows
     *
     * @return mixed
     */
    function query($sql, $link = null, $options = 0, $cache_affected_rows = true)
    {
        if (mb_stripos($sql, "column_info") !== false) {
            unset($this->values[$this->indexs['column_info']]);
        }

        if (mb_stripos($sql, "table_info") !== false) {
            unset($this->values[$this->indexs['table_info']]);
        }

        if (mb_stripos($sql, "table_coords") !== false) {
            unset($this->values[$this->indexs['table_coords']]);
        }

        if (mb_stripos($sql, "relation") !== false) {
            unset($this->values[$this->indexs['relation']]);
        }

        if (mb_stripos($sql, "pdf_pages") !== false) {
            unset($GLOBALS [$this->indexs['pdf_pages']]);
        }

        if (mb_stripos($sql, "bookmark") !== false) {
            unset($GLOBALS [$this->indexs['bookmark']]);
        }
        return true;
    }

    /**
     * runs a query and returns the result
     *
     * @param string   $query               query to run
     * @param resource $link                mysql link resource
     * @param integer  $options             query options
     * @param bool     $cache_affected_rows whether to cache affected row
     *
     * @return mixed
     */
    public function tryQuery(
        $query, $link = null, $options = 0, $cache_affected_rows = true
    ) {
        return true;
    }

    /**
     * selects given database
     *
     * @param string $dbname database name to select
     * @param object $link   connection object
     *
     * @return boolean
     */
    public function selectDb($dbname, $link = null)
    {
        return true;
    }

    /**
     * Frees memory associated with the result
     *
     * @param object $result database result
     *
     * @return bool
     */
    public function freeResult($result)
    {
        return true;
    }

    /**
     * returns only the first row from the result
     *
     * <code>
     * $sql = 'SELECT * FROM `user` WHERE `id` = 123';
     * $user = $GLOBALS['dbi']->fetchSingleRow($sql);
     * // produces
     * // $user = array('id' => 123, 'name' => 'John Doe')
     * </code>
     *
     * @param string|mysql_result $result query or mysql result
     * @param string              $type   NUM|ASSOC|BOTH
     *                                    returned array should either numeric
     *                                    associative or booth
     * @param resource            $link   mysql link
     *
     * @return array|boolean first row from result
     *                       or false if result is empty
     */
    public function fetchSingleRow($result, $type = 'ASSOC', $link = null)
    {
        return array(
            'display_field' => "PMA_display_field"
        );
    }

    /**
     * returns array of rows with associative keys from $result
     *
     * @param object $result result set identifier
     *
     * @return array
     */
    public function fetchAssoc($result)
    {
        $assocResult = array();
        if ($this->assocIndex < $this->totalNum) {
            $assocResult['db_name'] = "db_name" . $this->assocIndex;
            $assocResult['comment'] = "comment" . $this->assocIndex;
            $this->assocIndex++;
            return $assocResult;
        }

        $this->assocIndex = 0;
        return false;
    }

    /**
     * returns the number of rows returned by last query
     *
     * @param object $result result set identifier
     *
     * @return string|int
     */
    public function numRows($result)
    {
        return $this->totalNum;
    }
}
