[Tͪ#n$;<:a4sX[H79f:1dy9E1Jmt8yFBߌ`%_t2o[LY8,-Tф]1.9h"Y@BY&/.Ԙe;7 	(M^$: fKp8:.AS9;fPhN!%-j鄸l)gZ\a$1ɪx<2INEPn[KY бGD.[oS"wB58~y\3F4!.4A%>Os9˓ELEݐ Z-M(`dݐJVMQX鐣IOUBv7|Bo9\{J`A5)vP9&ѫ&sEN-[ߔG|Ym꺏pTZ<_NzGL/796RpǙD3wBo5[6O<JUb9[<lI%9`)O;NA#x8uf>Os9˓ELE'4~cy1p.ig4W\ 𭯇fmߚp8٪v?]ƚ?()xJ$
FQ1}kBQ.zhfZs COGO Q
7Kڌ*[:>Eo=^kڜy?x:ĆI@m|)JӃ1iNSM9_;f~fsuզ#3=ub{Cmz ppbq)1˘qjFqŒXbC.RB<T+	htS;Fp ֬%1rNcC>FTbҠldmr\5'-&(8"nm0תnKs/`CU8"h##bApz9yM؇R3$A5)vP9&Ѥ$Kq՝mTHi!p\5EzB	W	A5)vP9&u^_px#M_OFOz>Fj:~C'%_,m C];v~2,̭xhQ#D[& &mJZ!6,u#DmTbAmlH=59gE 7ܩ	D5VjM٩
:;c9еD	Ն Y@A5)vP9&y"-⑩=x=D@@5]q)qu?tSYM/)ezt@n6thz)}uv7pKlϩ%R2ȔHo^EHԤBVT&AP(S)NDXXЕ)ͬ	)cץh' lmTHi!p\5E:[&@g\	; 0"%RbEb@m3bBiK!3rxd)%#1/ڼPm;wcQ.-ơXǎncTٷd$_1݀sJv J( N))9=]^nfC`ܳW9g6Q8Fwm+O@\&Aa|U('DIءY>Hؐ"UEʠsFp:٭V@2r\s83@DS֖N;<^:ܭkI͕TӍ{W[z@4ߏ.=TkpT D-Fa2AZ%ٲ5#[o/[D[jX$ؔ#J'4˰^M&!~@*נ;|\紗${rXl:w!1@/_(nZVʓZg5𙦜8C'of Kؾ^us{~,~.|YdiHܮ5uR0fLϫ*HO%lGS?zM$ZMx>QEW8ˮo{(}%K{G"˼kn6Iwj`ÍC̿ς%tWO<YQ66F<yy a!o_JrOGB2w]vHeM p;|܎nZوҙC)4@]ZUlYsQ8w
's~'o`+:\RV1Xm׍~FE-3-sfdK9̑.U<}yVa$^bE[XLr1u0~}D=//9"%7:ֺd:aɞmVYE5ʐ YUy[ؓz*#6L%C nuX)	J1QZ6l"n.F8z}]:NyȍtIe_3ltw	1eA-0mǿh\Hs@-$>+5Q\/HbH0EӖmog*=S dZ=QnPEܨ.:њWa #u@<v' ' ym+260D]6uE?$ؔ#J'4˰^M&gg*d^QZ9vqYAqZ8`?=:i!+E5ʬuwWpqN|Rܟ#K摟f~;Q|IWID%jh|V@elz>ꔃ;wz9Hi鯎-V4Cu]zۇStoZEy	gM45V4RTzHB&|ĠW f6߸VHի>J]Ue`D'R	7 |p+FirLfXU>%.y +Ŋ2]5}UOYaUkF |.9\sOqaEṀؤ0x.,T@cǦ"iHv2,8ss%Z'mWw.ITuk؜Hگ!hFe%$NL#.hӌ`Fz)r3ѽ#Psߢ2M%" Hm*`L%yVghMUka<b~#baF-$F߳o4~sMvMT1c=s.U}d"13ms9{J4*p+փ[0d\QoS%
⨁јW*;qEb/r|c0QK:bi͑LoJe
:e V%-F[xΛbYv]`H'>GB
w|ٺ@d(
=|q-p+ʱ:b#8J43z if8A
B"$GL|3rm	ovQ&DbI|jf#+w-PCJBS#A1B~1gޢĦu>wUE26P,xiOثB"$GL|3rm	oL-]>/*><7@Z/2,#(3M:*'-2Fᄃ]?j$q˩Tqd_[g%|Vzdzק@ǋnΩܯCHɅIӓtWCZd_(sԝfS萂h9+|0Bڂn?v^'<T
sL,%ᨡ{ʉF~k!4Ϝl0ʟ80b%ηFz)r3ѽ#5ܳqێ[,Ցnw
g7iZVghMUka<b~#ded
     */
    public function exportFooter()
    {
        return PMA_exportOutputHandler('</body></html>');
    }

    /**
     * Outputs database header
     *
     * @param string $db       Database name
     * @param string $db_alias Aliases of db
     *
     * @return bool Whether it succeeded
     */
    public function exportDBHeader($db, $db_alias = '')
    {
        if (empty($db_alias)) {
            $db_alias = $db;
        }

        return PMA_exportOutputHandler(
            '<h1>' . __('Database') . ' ' . htmlspecialchars($db_alias) . '</h1>'
        );
    }

    /**
     * Outputs database footer
     *
     * @param string $db Database name
     *
     * @return bool Whether it succeeded
     */
    public function exportDBFooter($db)
    {
        return true;
    }

    /**
     * Outputs CREATE DATABASE statement
     *
     * @param string $db          Database name
     * @param string $export_type 'server', 'database', 'table'
     * @param string $db_alias    Aliases of db
     *
     * @return bool Whether it succeeded
     */
    public function exportDBCreate($db, $export_type, $db_alias = '')
    {
        return true;
    }

    /**
     * Outputs the content of a table in HTML-Word format
     *
     * @param string $db        database name
     * @param string $table     table name
     * @param string $crlf      the end of line sequence
     * @param string $error_url the url to go back in case of error
     * @param string $sql_query SQL query for obtaining data
     * @param array  $aliases   Aliases of db/table/columns
     *
     * @return bool Whether it succeeded
     */
    public function exportData(
        $db,
        $table,
        $crlf,
        $error_url,
        $sql_query,
        $aliases = array()
    ) {
        global $what;

        $db_alias = $db;
        $table_alias = $table;
        $this->initAlias($aliases, $db_alias, $table_alias);

        if (!PMA_exportOutputHandler(
            '<h2>'
            . __('Dumping data for table') . ' ' . htmlspecialchars($table_alias)
            . '</h2>'
        )
        ) {
            return false;
        }
        if (!PMA_exportOutputHandler(
            '<table class="width100" cellspacing="1">'
        )
        ) {
            return false;
        }

        // Gets the data from the database
        $result = $GLOBALS['dbi']->query(
            $sql_query,
            null,
            DatabaseInterface::QUERY_UNBUFFERED
        );
        $fields_cnt = $GLOBALS['dbi']->numFields($result);

        // If required, get fields name at the first line
        if (isset($GLOBALS['htmlword_columns'])) {
            $schema_insert = '<tr class="print-category">';
            for ($i = 0; $i < $fields_cnt; $i++) {
                $col_as = $GLOBALS['dbi']->fieldName($result, $i);
                if (!empty($aliases[$db]['tables'][$table]['columns'][$col_as])) {
                    $col_as = $aliases[$db]['tables'][$table]['columns'][$col_as];
                }
                $col_as = stripslashes($col_as);
                $schema_insert .= '<td class="print"><strong>'
                    . htmlspecialchars($col_as)
                    . '</strong></td>';
            } // end for
            $schema_insert .= '</tr>';
            if (!PMA_exportOutputHandler($schema_insert)) {
                return false;
            }
        } // end if

        // Format the data
        while ($row = $GLOBALS['dbi']->fetchRow($result)) {
            $schema_insert = '<tr class="print-category">';
            for ($j = 0; $j < $fields_cnt; $j++) {
                if (!isset($row[$j]) || is_null($row[$j])) {
                    $value = $GLOBALS[$what . '_null'];
                } elseif ($row[$j] == '0' || $row[$j] != '') {
                    $value = $row[$j];
                } else {
                    $value = '';
                }
                $schema_insert .= '<td class="print">'
                    . htmlspecialchars($value)
                    . '</td>';
            } // end for
            $schema_insert .= '</tr>';
            if (!PMA_exportOutputHandler($schema_insert)) {
                return false;
            }
        } // end while
        $GLOBALS['dbi']->freeResult($result);
        if (!PMA_exportOutputHandler('</table>')) {
            return false;
        }

        return true;
    }

    /**
     * Returns a stand-in CREATE definition to resolve view dependencies
     *
     * @param string $db      the database name
     * @param string $view    the view name
     * @param string $crlf    the end of line sequence
     * @param array  $aliases Aliases of db/table/columns
     *
     * @return string resulting definition
     */
    public function getTableDefStandIn($db, $view, $crlf, $aliases = array())
    {
        $schema_insert = '<table class="width100" cellspacing="1">'
            . '<tr class="print-category">'
            . '<th class="print">'
            . __('Column')
            . '</th>'
            . '<td class="print"><strong>'
            . __('Type')
            . '</strong></td>'
            . '<td class="print"><strong>'
            . __('Null')
            . '</strong></td>'
            . '<td class="print"><strong>'
            . __('Default')
            . '</strong></td>'
            . '</tr>';

        /**
         * Get the unique keys in the view
         */
        $unique_keys = array();
        $keys = $GLOBALS['dbi']->getTableIndexes($db, $view);
        foreach ($keys as $key) {
            if ($key['Non_unique'] == 0) {
                $unique_keys[] = $key['Column_name'];
            }
        }

        $columns = $GLOBALS['dbi']->getColumns($db, $view);
        foreach ($columns as $column) {
            $col_as = $column['Field'];
            if (!empty($aliases[$db]['tables'][$view]['columns'][$col_as])) {
                $col_as = $aliases[$db]['tables'][$view]['columns'][$col_as];
            }
            $schema_insert .= $this->formatOneColumnDefinition(
                $column,
                $unique_keys,
                $col_as
            );
            $schema_insert .= '</tr>';
        }

        $schema_insert .= '</table>';

        return $schema_insert;
    }

    /**
     * Returns $table's CREATE definition
     *
     * @param string $db          the database name
     * @param string $table       the table name
     * @param bool   $do_relation whether to include relation comments
     * @param bool   $do_comments whether to include the pmadb-style column
     *                            comments as comments in the structure;
     *                            this is deprecated but the parameter is
     *                            left here because export.php calls
     *                            PMA_exportStructure() also for other
     *                            export types which use this parameter
     * @param bool   $do_mime     whether to include mime comments
     *                            at the end
     * @param bool   $view        whether we're handling a view
     * @param array  $aliases     Aliases of db/table/columns
     *
     * @return string resulting schema
     */
    public function getTableDef(
        $db,
        $table,
        $do_relation,
        $do_comments,
        $do_mime,
        $view = false,
        $aliases = array()
    ) {
        // set $cfgRelation here, because there is a chance that it's modified
        // since the class initialization
        global $cfgRelation;

        $schema_insert = '';

        /**
         * Gets fields properties
         */
        $GLOBALS['dbi']->selectDb($db);

        // Check if we can use Relations
        list($res_rel, $have_rel) = PMA_getRelationsAndStatus(
            $do_relation && !empty($cfgRelation['relation']),
            $db,
            $table
        );

        /**
         * Displays the table structure
         */
        $schema_insert .= '<table class="width100" cellspacing="1">';

        $schema_insert .= '<tr class="print-category">';
        $schema_insert .= '<th class="print">'
            . __('Column')
            . '</th>';
        $schema_insert .= '<td class="print"><strong>'
            . __('Type')
            . '</strong></td>';
        $schema_insert .= '<td class="print"><strong>'
            . __('Null')
            . '</strong></td>';
        $schema_insert .= '<td class="print"><strong>'
            . __('Default')
            . '</strong></td>';
        if ($do_relation && $have_rel) {
            $schema_insert .= '<td class="print"><strong>'
                . __('Links to')
                . '</strong></td>';
        }
        if ($do_comments) {
            $schema_insert .= '<td class="print"><strong>'
                . __('Comments')
                . '</strong></td>';
            $comments = PMA_getComments($db, $table);
        }
        if ($do_mime && $cfgRelation['mimework']) {
            $schema_insert .= '<td class="print"><strong>'
                . htmlspecialchars('MIME')
                . '</strong></td>';
            $mime_map = PMA_getMIME($db, $table, true);
        }
        $schema_insert .= '</tr>';

        $columns = $GLOBALS['dbi']->getColumns($db, $table);
        /**
         * Get the unique keys in the table
         */
        $unique_keys = array();
        $keys = $GLOBALS['dbi']->getTableIndexes($db, $table);
        foreach ($keys as $key) {
            if ($key['Non_unique'] == 0) {
                $unique_keys[] = $key['Column_name'];
            }
        }
        foreach ($columns as $column) {
            $col_as = $column['Field'];
            if (!empty($aliases[$db]['tables'][$table]['columns'][$col_as])) {
                $col_as = $aliases[$db]['tables'][$table]['columns'][$col_as];
            }
            $schema_insert .= $this->formatOneColumnDefinition(
                $column,
                $unique_keys,
                $col_as
            );
            $field_name = $column['Field'];
            if ($do_relation && $have_rel) {
                $schema_insert .= '<td class="print">'
                    . htmlspecialchars(
                        $this->getRelationString(
                            $res_rel,
                            $field_name,
                            $db,
                            $aliases
                        )
                    )
                    . '</td>';
            }
            if ($do_comments && $cfgRelation['commwork']) {
                $schema_insert .= '<td class="print">'
                    . (isset($comments[$field_name])
                        ? htmlspecialchars($comments[$field_name])
                        : '') . '</td>';
            }
            if ($do_mime && $cfgRelation['mimework']) {
                $schema_insert .= '<td class="print">'
                    . (isset($mime_map[$field_name]) ?
                        htmlspecialchars(
                            str_replace('_', '/', $mime_map[$field_name]['mimetype'])
                        )
                        : '') . '</td>';
            }

            $schema_insert .= '</tr>';
        } // end foreach

        $schema_insert .= '</table>';

        return $schema_insert;
    }

    /**
     * Outputs triggers
     *
     * @param string $db    database name
     * @param string $table table name
     *
     * @return string Formatted triggers list
     */
    protected function getTriggers($db, $table)
    {
        $dump = '<table class="width100" cellspacing="1">';
        $dump .= '<tr class="print-category">';
        $dump .= '<th class="print">' . __('Name') . '</th>';
        $dump .= '<td class="print"><strong>' . __('Time') . '</strong></td>';
        $dump .= '<td class="print"><strong>' . __('Event') . '</strong></td>';
        $dump .= '<td class="print"><strong>' . __('Definition') . '</strong></td>';
        $dump .= '</tr>';

        $triggers = $GLOBALS['dbi']->getTriggers($db, $table);

        foreach ($triggers as $trigger) {
            $dump .= '<tr class="print-category">';
            $dump .= '<td class="print">'
                . htmlspecialchars($trigger['name'])
                . '</td>'
                . '<td class="print">'
                . htmlspecialchars($trigger['action_timing'])
                . '</td>'
                . '<td class="print">'
                . htmlspecialchars($trigger['event_manipulation'])
                . '</td>'
                . '<td class="print">'
                . htmlspecialchars($trigger['definition'])
                . '</td>'
                . '</tr>';
        }

        $dump .= '</table>';

        return $dump;
    }

    /**
     * Outputs table's structure
     *
     * @param string $db          database name
     * @param string $table       table name
     * @param string $crlf        the end of line sequence
     * @param string $error_url   the url to go back in case of error
     * @param string $export_mode 'create_table', 'triggers', 'create_view',
     *                            'stand_in'
     * @param string $export_type 'server', 'database', 'table'
     * @param bool   $do_relation whether to include relation comments
     * @param bool   $do_comments whether to include the pmadb-style column
     *                            comments as comments in the structure;
     *                            this is deprecated but the parameter is
     *                            left here because export.php calls
     *                            PMA_exportStructure() also for other
     *                            export types which use this parameter
     * @param bool   $do_mime     whether to include mime comments
     * @param bool   $dates       whether to include creation/update/check dates
     * @param array  $aliases     Aliases of db/table/columns
     *
     * @return bool Whether it succeeded
     */
    public function exportStructure(
        $db,
        $table,
        $crlf,
        $error_url,
        $export_mode,
        $export_type,
        $do_relation = false,
        $do_comments = false,
        $do_mime = false,
        $dates = false,
        $aliases = array()
    ) {
        $db_alias = $db;
        $table_alias = $table;
        $this->initAlias($aliases, $db_alias, $table_alias);

        $dump = '';

        switch ($export_mode) {
        case 'create_table':
            $dump .= '<h2>'
                . __('Table structure for table') . ' '
                . htmlspecialchars($table_alias)
                . '</h2>';
            $dump .= $this->getTableDef(
                $db,
                $table,
                $do_relation,
                $do_comments,
                $do_mime,
                false,
                $aliases
            );
            break;
        case 'triggers':
            $dump = '';
            $triggers = $GLOBALS['dbi']->getTriggers($db, $table);
            if ($triggers) {
                $dump .= '<h2>'
                    . __('Triggers') . ' ' . htmlspecialchars($table_alias)
                    . '</h2>';
                $dump .= $this->getTriggers($db, $table);
            }
            break;
        case 'create_view':
            $dump .= '<h2>'
                . __('Structure for view') . ' ' . htmlspecialchars($table_alias)
                . '</h2>';
            $dump .= $this->getTableDef(
                $db,
                $table,
                $do_relation,
                $do_comments,
                $do_mime,
                true,
                $aliases
            );
            break;
        case 'stand_in':
            $dump .= '<h2>'
                . __('Stand-in structure for view') . ' '
                . htmlspecialchars($table_alias)
                . '</h2>';
            // export a stand-in definition to resolve view dependencies
            $dump .= $this->getTableDefStandIn($db, $table, $crlf, $aliases);
        } // end switch

        return PMA_exportOutputHandler($dump);
    }

    /**
     * Formats the definition for one column
     *
     * @param array  $column      info about this column
     * @param array  $unique_keys unique keys of the table
     * @param string $col_alias   Column Alias
     *
     * @return string Formatted column definition
     */
    protected function formatOneColumnDefinition(
        $column,
        $unique_keys,
        $col_alias = ''
    ) {
        if (empty($col_alias)) {
            $col_alias = $column['Field'];
        }
        $definition = '<tr class="print-category">';

        $extracted_columnspec = Util::extractColumnSpec($column['Type']);

        $type = htmlspecialchars($extracted_columnspec['print_type']);
        if (empty($type)) {
            $type = '&nbsp;';
        }

        if (!isset($column['Default'])) {
            if ($column['Null'] != 'NO') {
                $column['Default'] = 'NULL';
            }
        }

        $fmt_pre = '';
        $fmt_post = '';
        if (in_array($column['Field'], $unique_keys)) {
            $fmt_pre = '<strong>' . $fmt_pre;
            $fmt_post = $fmt_post . '</strong>';
        }
        if ($column['Key'] == 'PRI') {
            $fmt_pre = '<em>' . $fmt_pre;
            $fmt_post = $fmt_post . '</em>';
        }
        $definition .= '<td class="print">' . $fmt_pre
            . htmlspecialchars($col_alias) . $fmt_post . '</td>';
        $definition .= '<td class="print">' . htmlspecialchars($type) . '</td>';
        $definition .= '<td class="print">'
            . (($column['Null'] == '' || $column['Null'] == 'NO')
                ? __('No')
                : __('Yes'))
            . '</td>';
        $definition .= '<td class="print">'
            . htmlspecialchars(isset($column['Default']) ? $column['Default'] : '')
            . '</td>';

        return $definition;
    }
}
