Ejemplo n.º 1
0
 /**
  * return the column default value if it is defined
  *
  * @param SimpleXMLNode  $table_name   table definition xml node
  * @param string         $column_name  name of column to look up default value
  *
  * @return string column default value, null if not defined for the $column_name
  */
 public static function column_default_value(&$table_node, $column_name, &$node)
 {
     // find the column node in the table
     $nodes = static::inheritance_get_column($table_node, $column_name);
     if (is_null($nodes) || count($nodes) != 1) {
         throw new exception(count($nodes) . " column elements found via xpath '" . 'column[@name="' . $column_name . '"]' . "' - unexpected!");
     }
     $column_node =& $nodes[0];
     $default_value = NULL;
     // if it has a default value defined, use it
     if (isset($column_node['default']) && strlen($column_node['default']) > 0) {
         $default_value = dbsteward::string_cast($column_node['default']);
         if (strcasecmp($column_node['default'], 'null') == 0) {
             // the column is allowed to be null and the definition of default is null
             // so instead of setting the value, mark the column null
             dbsteward::trace('column_default_value ' . $table_node['name'] . '.' . $column_node['name'] . ' default null');
             $node['null'] = 'true';
         } else {
             dbsteward::trace('column_default_value ' . $table_node['name'] . '.' . $column_node['name'] . ' default value ' . $column_node['default']);
             $default_value = format::strip_string_quoting($default_value);
         }
     }
     return $default_value;
 }
Ejemplo n.º 2
0
 public static function identifier_name($schema, $table, $column, $suffix)
 {
     // make sure SimpleXML attributes cast into strings as these are used for array keys
     $schema = trim($schema);
     $table = trim($table);
     $column = trim($column);
     // figure out the name of the sequence
     $ident_table = $table;
     $ident_column = $column;
     // maxlen of pg identifiers is 63
     $max_len = 63;
     $max_len = $max_len - 1 - strlen($suffix);
     $table_maxlen = ceil($max_len / 2);
     $column_maxlen = $max_len - $table_maxlen;
     if ($table_maxlen + $column_maxlen > $max_len) {
         $column_maxlen = $column_maxlen - 1;
     }
     // table is longer, column is shorter
     if (strlen($ident_table) > $table_maxlen && strlen($ident_column) < $column_maxlen) {
         // give column excess to table_maxlen
         $table_maxlen += $column_maxlen - strlen($ident_column);
     }
     // table is shorter, column is longer
     if (strlen($ident_table) < $table_maxlen && strlen($ident_column) > $column_maxlen) {
         // give table excess to column_maxlen
         $column_maxlen += $table_maxlen - strlen($ident_table);
     }
     if (strlen($ident_table) > $table_maxlen) {
         $ident_table = substr($ident_table, 0, $table_maxlen);
     }
     if (strlen($ident_column) > $column_maxlen) {
         $ident_column = substr($ident_column, 0, $column_maxlen);
     }
     $ident_name = $ident_table . '_' . $ident_column . $suffix;
     if (self::$track_pg_identifiers) {
         if (!isset(self::$known_pg_identifiers[$schema])) {
             self::$known_pg_identifiers[$schema] = array();
         }
         if (!isset(self::$known_pg_identifiers[$schema][$table])) {
             self::$known_pg_identifiers[$schema][$table] = array();
         }
         if (in_array($ident_name, self::$known_pg_identifiers[$schema][$table])) {
             dbsteward::trace("rename ident_name FROM " . $ident_name);
             $inc = 1;
             $ident_column = substr($ident_column, 0, $column_maxlen - 1);
             $ident_name = $ident_table . '_' . $ident_column . $suffix . $inc;
             dbsteward::trace("rename ident_name TO " . $ident_name);
             while (in_array($ident_name, self::$known_pg_identifiers[$schema][$table])) {
                 dbsteward::trace("rename ident_name FROM " . $ident_name);
                 $inc++;
                 $ident_name = $ident_table . '_' . $ident_column . '_' . $suffix . $inc;
                 dbsteward::trace("rename ident_name TO " . $ident_name);
             }
         }
         self::$known_pg_identifiers[$schema][$table][] = $ident_name;
         //var_dump(self::$known_pg_identifiers);
     }
     return $ident_name;
 }
Ejemplo n.º 3
0
 /**
  * @TODO: this needs rewritten to delete the XML document row instead
  */
 public static function delete_data_row(&$node_table, $where)
 {
     // break up the clause by its parenthetical () and logical AND OR segmentation
     $clause = sql_parser::clause_explode($where);
     if (!is_array($clause)) {
         $clause = array($clause);
     }
     $new_table_rows = dbx::get_table_rows($new_table);
     $data_rows = $new_table_rows->row;
     dbsteward::trace("CLAUSE " . $where);
     dbsteward::trace("BEFORE this->data has " . count($data_rows) . " rows");
     for ($i = 0; $i < count($data_rows); $i++) {
         if (self::clause_match($data_rows[$i], $clause)) {
             unset($data_rows[$i]);
             $data_rows = array_merge($data_rows);
             // redo array keys
             $i--;
         }
     }
     dbsteward::trace("AFTER  this->data has " . count($data_rows) . " rows");
 }
Ejemplo n.º 4
0
 public static function foreign_key($db_doc, $node_schema, $node_table, $column, &$foreign)
 {
     $fschema = strlen($column['foreignSchema']) == 0 ? (string) $node_schema['name'] : (string) $column['foreignSchema'];
     $foreign['schema'] = dbx::get_schema($db_doc, $fschema);
     if (!$foreign['schema']) {
         throw new exception("Failed to find foreign schema '" . dbsteward::string_cast($column['foreignSchema']) . "' for " . dbsteward::string_cast($node_schema['name']) . "." . dbsteward::string_cast($node_table['name']) . "." . dbsteward::string_cast($column['name']));
     }
     $foreign['table'] = dbx::get_table($foreign['schema'], $column['foreignTable']);
     if (!$foreign['table']) {
         throw new exception("Failed to find foreign table '" . $column['foreignTable'] . "' for " . $node_schema['name'] . "." . $node_table['name'] . "." . $column['name']);
     }
     // if foreignColumn is not set
     // the column is assumed to be the same name as the referring column
     if (isset($column['foreignColumn']) && strlen($column['foreignColumn'])) {
         $foreignColumn = $column['foreignColumn'];
     } else {
         $foreignColumn = $column['name'];
     }
     $foreign['column'] = dbx::get_table_column($foreign['table'], $foreignColumn);
     if (!$foreign['column']) {
         var_dump($foreign['column']);
         throw new exception("Failed to find foreign column '" . dbsteward::string_cast($foreignColumn) . "' for " . dbsteward::string_cast($node_schema['name']) . "." . dbsteward::string_cast($node_table['name']) . "." . dbsteward::string_cast($column['name']));
     }
     // column type is missing, and resolved foreign is also a foreign key?
     // recurse and find the cascading foreign key
     if (strlen($foreign['column']['type']) == 0 && isset($foreign['column']['foreignColumn'])) {
         dbsteward::trace("Seeking nested foreign key for " . dbsteward::string_cast($foreign['schema']['name']) . "." . dbsteward::string_cast($foreign['table']['name']) . "." . $foreign['column']['name']);
         $nested_fkey = array();
         self::foreign_key($db_doc, $foreign['schema'], $foreign['table'], $foreign['column'], $nested_fkey);
         //var_dump($nested_fkey['column']);
         // make a separate clone of the column element because we are specifying the type only for foreign key type referencing
         $foreign['column'] = new SimpleXMLElement($foreign['column']->asXML());
         $foreign['column']['type'] = $nested_fkey['column']['type'];
     }
     $foreign['name'] = pgsql8_index::index_name($node_table['name'], $column['name'], 'fkey');
     $table_name = format::get_fully_qualified_table_name($foreign['schema']['name'], $foreign['table']['name']);
     $column_name = format::get_quoted_column_name($foreign['column']['name']);
     $foreign['references'] = "{$table_name}({$column_name})";
 }