/** * 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; }
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; }
/** * @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"); }
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})"; }