Welcome to mirror list, hosted at ThFree Co, Russian Federation.

pmd_relation_new.php - github.com/phpmyadmin/phpmyadmin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: 134450b4455b343deb502f7bec4072124189cc3b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
<?php
/* vim: set expandtab sw=4 ts=4 sts=4: */
/**
 * PMD handler for creating new relation
 *
 * @package PhpMyAdmin-Designer
 */

/**
 *
 */
require_once './libraries/common.inc.php';

PMA_Response::getInstance()->disable();

require_once 'libraries/pmd_common.php';
$die_save_pos = 0;
require_once 'pmd_save_pos.php';
extract($_POST, EXTR_SKIP);

$tables = $GLOBALS['dbi']->getTablesFull($db, $T1);
$type_T1 = strtoupper($tables[$T1]['ENGINE']);
$tables = $GLOBALS['dbi']->getTablesFull($db, $T2);
$type_T2 = strtoupper($tables[$T2]['ENGINE']);

// native foreign key
if (PMA_Util::isForeignKeySupported($type_T1)
    && PMA_Util::isForeignKeySupported($type_T2)
    && $type_T1 == $type_T2
) {
    // relation exists?
    $existrel_foreign = PMA_getForeigners($db, $T2, '', 'foreign');
    if (isset($existrel_foreign[$F2])
        && isset($existrel_foreign[$F2]['constraint'])
    ) {
         PMD_Return_new(0, __('Error: relation already exists.'));
    }
    // note: in InnoDB, the index does not requires to be on a PRIMARY
    // or UNIQUE key
    // improve: check all other requirements for InnoDB relations
    $result = $GLOBALS['dbi']->query(
        'SHOW INDEX FROM ' . PMA_Util::backquote($db)
        . '.' . PMA_Util::backquote($T1) . ';'
    );
    $index_array1 = array(); // will be use to emphasis prim. keys in the table view
    while ($row = $GLOBALS['dbi']->fetchAssoc($result)) {
        $index_array1[$row['Column_name']] = 1;
    }
    $GLOBALS['dbi']->freeResult($result);

    $result = $GLOBALS['dbi']->query(
        'SHOW INDEX FROM ' . PMA_Util::backquote($db)
        . '.' . PMA_Util::backquote($T2) . ';'
    );
    // will be used to emphasis prim. keys in the table view
    $index_array2 = array();
    while ($row = $GLOBALS['dbi']->fetchAssoc($result)) {
        $index_array2[$row['Column_name']] = 1;
    }
    $GLOBALS['dbi']->freeResult($result);

    if (! empty($index_array1[$F1]) && ! empty($index_array2[$F2])) {
        $upd_query  = 'ALTER TABLE ' . PMA_Util::backquote($db)
            . '.' . PMA_Util::backquote($T2)
            . ' ADD FOREIGN KEY ('
            . PMA_Util::backquote($F2) . ')'
            . ' REFERENCES '
            . PMA_Util::backquote($db) . '.'
            . PMA_Util::backquote($T1) . '('
            . PMA_Util::backquote($F1) . ')';

        if ($on_delete != 'nix') {
            $upd_query   .= ' ON DELETE ' . $on_delete;
        }
        if ($on_update != 'nix') {
            $upd_query   .= ' ON UPDATE ' . $on_update;
        }
        $upd_query .= ';';
        $GLOBALS['dbi']->tryQuery($upd_query)
        || PMD_Return_new(0, __('Error: Relation could not be added!'));
        PMD_Return_new(1, __('FOREIGN KEY relation has been added.'));
    }
} else { // internal (pmadb) relation
    if ($GLOBALS['cfgRelation']['relwork'] == false) {
        PMD_Return_new(0, __('Error: Relational features are disabled!'));
    } else {
        // no need to recheck if the keys are primary or unique at this point,
        // this was checked on the interface part

        $q  = 'INSERT INTO '
            . PMA_Util::backquote($GLOBALS['cfgRelation']['db'])
            . '.' . PMA_Util::backquote($cfgRelation['relation'])
            . '(master_db, master_table, master_field,'
            . 'foreign_db, foreign_table, foreign_field)'
            . ' values('
            . '\'' . PMA_Util::sqlAddSlashes($db) . '\', '
            . '\'' . PMA_Util::sqlAddSlashes($T2) . '\', '
            . '\'' . PMA_Util::sqlAddSlashes($F2) . '\', '
            . '\'' . PMA_Util::sqlAddSlashes($db) . '\', '
            . '\'' . PMA_Util::sqlAddSlashes($T1) . '\','
            . '\'' . PMA_Util::sqlAddSlashes($F1) . '\')';

        if (PMA_queryAsControlUser($q, false, PMA_DatabaseInterface::QUERY_STORE)) {
            PMD_Return_new(1, __('Internal relation has been added.'));
        } else {
            PMD_Return_new(0, __('Error: Relation could not be added!'));
        }
    }
}

/**
 * Send xml
 *
 * @param string $b   Value of attribute "b"
 * @param string $ret Value of attribute "return"
 *
 * @return void
 */
function PMD_Return_new($b,$ret)
{
    global $db,$T1,$F1,$T2,$F2;
    header("Content-Type: text/xml; charset=utf-8");
    header("Cache-Control: no-cache");
    die('<root act="relation_new" return="' . $ret . '" b="' . $b .
    '" DB1="' . urlencode($db) .
    '" T1="' . urlencode($T1) .
    '" F1="' . urlencode($F1) .
    '" DB2="' . urlencode($db) .
    '" T2="' . urlencode($T2) .
    '" F2="' . urlencode($F2) .
    '"></root>');
}
?>