sb_get_table_description (public)

 sb_get_table_description table_name

Defined in packages/schema-browser/tcl/schema-browser-procs-postgresql.tcl

Parameters:
table_name

Partial Call Graph (max 5 caller/called nodes):
%3 packages/schema-browser/www/index.tcl packages/schema-browser/ www/index.tcl sb_get_table_description sb_get_table_description packages/schema-browser/www/index.tcl->sb_get_table_description ad_text_to_html ad_text_to_html (public) sb_get_table_description->ad_text_to_html db_0or1row db_0or1row (public) sb_get_table_description->db_0or1row db_foreach db_foreach (public) sb_get_table_description->db_foreach db_list db_list (public) sb_get_table_description->db_list lc_numeric lc_numeric (public) sb_get_table_description->lc_numeric

Testcases:
No testcase defined.
Source code:

    set foreign_keys [sb_get_foreign_keys $table_name]
    array set references [lindex $foreign_keys 0]
    set complex_foreign_keys [lindex $foreign_keys 1]

    set html "<pre>"

    # get table comments
    if { [db_0or1row sb_get_table_comment {
        select d.description
        from pg_class c, pg_description d
        where c.relname = lower(:table_name)
        and d.objoid = c.oid and objsubid = 0}] } {
        append html "\n--[join [split $description "\n"] "\n-- "]"
    }

    append html "\nCREATE TABLE [string tolower $table_name] ("

    if { [db_0or1row sb_get_primary_key {
            select
              indkey as primary_key_array
            from
              pg_index i join (select oid from pg_class where relname = lower(:table_name)) c
                on (i.indrelid = c.oid)
              join pg_class index_class on (index_class.oid = i.indexrelid and i.indisprimary)
              join pg_am a on (index_class.relam = a.oid)}] } {
        set primary_key_columns [split $primary_key_array " "]
    } else {
        set primary_key_columns [list]
    }

    set column_list [list]
    set column_info_set [ns_set create]

    # DRB: This changes some PG internal types into SQL92 standard types for readability's
    # sake.

    db_foreach schema_browser_index_get_user_table_data "
        select
            a.attname as column_name,
            case when t.typlen = -1 and t.typname <> 'numeric'
              then a.atttypmod - 4
              else NULL
            end as data_length,
            case when t.typname = 'numeric'
              then a.atttypmod::int4 & 65535 - 4
              else NULL
            end as scale,
            case
              when t.typname = 'numeric'
              then (a.atttypmod::int4 >> 16) & 65535
              else NULL
            end as precision,
            case t.typname
              when 'int4' then 'integer'
              when 'bpchar' then 'char'
              else t.typname
            end as data_type,
            d.description as column_comments,
            pg_get_expr(ad.adbin, ad.adrelid) as data_default,
            substr(lower(:table_name),1,15) || '_' || substr(lower(a.attname),1,15) as column_constraint_key,
            case a.attnotnull when true then 'NOT NULL' else '' end as nullable,
            a.attnum as column_number
        from (select oid from pg_class where relname=lower(:table_name)) c
             join pg_attribute a on (c.oid = a.attrelid and a.attnum > 0)
             join pg_type t on (a.atttypid = t.oid)
             left join pg_attrdef ad on (a.attrelid = ad.adrelid and a.attnum = ad.adnum)
             left join pg_description d on (c.oid = d.objoid and a.attnum = d.objsubid)
        order by a.attnum" -column_set column_info_set {

        lappend column_list [ns_set copy $column_info_set]
    }
    ns_set free $column_info_set

    # current_constraint_info -- a constraint_info_set for the constraint being processed in the loop below
    set check_constraint_set [ns_set create]
    db_foreach schema_browser_index_get_subselect {
        select
              conname as constraint_name,
              pg_get_constraintdef(c.oid) as constraint_source
        from
              pg_constraint r join (select oid from pg_class where relname = lower(:table_name)) c
              on (c.oid = r.conrelid)
        order by constraint_name
    } {
        ns_set put $check_constraint_set $constraint_name $constraint_source
    }
    #
    # write out the columns with associated constraints
    #

    set n_column 0

    foreach column $column_list {
        if { $n_column > 0 } {
            append html ","
        }
        set column_comments [ns_set get $column "column_comments"]
        if {$column_comments ne ""} {
            set comment_list [split $column_comments "\n"]
            append html "\n\t--[join $comment_list "\n\t-- "]"
        }
        append html "\n"
        append html "\t[string tolower [ns_set get $column column_name]]\t [ns_set get $column data_type]"
        if { [ns_set get $column data_length] ne "" } {
            append html "([ns_set get $column data_length])"
        }
        if { [ns_set get $column precision] ne "" } {
            append html "([ns_set get $column precision], [ns_set get $column scale])"
        }
        if { [llength $primary_key_columns] == 1 && [lindex $primary_key_columns 0] == [ns_set get $column column_number] } {
            append html " PRIMARY KEY"
        }
        if { [ns_set get $column "data_default"] ne "" } {
            append html " DEFAULT [ad_text_to_html -- [ns_set get $column data_default]]"
        }
        if { [ns_set get $column "nullable"] ne "" } {
            append html " [ns_set get $column nullable]"
        }

        if { [info exists references([ns_set get $column column_name])] } {
            append html $references([ns_set get $column column_name])"
        }

        if { [ns_set get $check_constraint_set [ns_set get $column column_constraint_key]] ne "" } {
            append html "\n\t\t\tCHECK [ns_set get $check_constraint_set [ns_set get $column column_constraint_key]]"
            ns_set delkey $check_constraint_set [ns_set get $column column_constraint_key]
        }

        incr n_column
    }

    #
    # write out the table-level constraints in the table_constraint_list
    #

    for { set i 0 } { $i < [ns_set size $check_constraint_set] } { incr i } {
        if { [ns_set value $check_constraint_set $i] ne "" } {
            append html ",\n    "
            if { [string first "\$" [ns_set key $check_constraint_set $i]] == -1 } {
                append html "CONSTRAINT [ns_set key $check_constraint_set $i]\n    "
            }
            append html "CHECK [ns_set value $check_constraint_set $i]"
        }
    }

    if { [llength $primary_key_columns] > 1 } {
        append html ",\n\tPRIMARY KEY ("
        append html [join [db_list sb_get_primary_key_select_2 [subst {
            select
              a.attname as column_name
            from
              (select oid from pg_class where relname = lower(:table_name)) c
              join pg_attribute a on (c.oid = a.attrelid)
            where a.attnum in ([join $primary_key_columns ","])
        }]] ","]
        append html ")"
    }

    foreach complex_foreign_key $complex_foreign_keys {
        append html ",\n\t$complex_foreign_key"
    }

    append html "\n);"
    append html [sb_get_indexes $table_name]
    append html [sb_get_triggers $table_name]
    append html [sb_get_child_tables $table_name "t"]

    if {[string match "pg_*" $table_name]} {
        set table_size [sb_get_table_size -table_name $table_name -namespace "pg_catalog"]
    } else {
        set table_size [sb_get_table_size -table_name $table_name]
    }
    append html "\n\n-- Table size: [lc_numeric [lindex $table_size 0]] bytes\n"
    append html "-- Table rows: [lc_numeric [lindex $table_size 1]]\n"

    append html "</pre>"

    return $html
XQL Not present:
Generic, PostgreSQL, Oracle
[ hide source ] | [ make this the default ]
Show another procedure: