# ================================================================== # Gossamer Links - enhanced directory management system # # Website : http://gossamer-threads.com/ # Support : http://gossamer-threads.com/scripts/support/ # CVS Info : 087,071,086,086,085 # Revision : $Id: SQL.pm,v 1.141 2007/11/16 07:15:00 brewt Exp $ # # Copyright (c) 2001 Gossamer Threads Inc. All Rights Reserved. # Redistribution in part or in whole strictly prohibited. Please # see LICENSE file for full details. # ================================================================== # Contains the default table structure for Gossamer Links tables. package Links::SQL; use strict; use vars qw/@TABLES/; use Links qw/:payment $DB/; @TABLES = qw( Users Links Changes Category CatPrice Reviews CatLinks CatRelations Editors Verify Sessions EmailTemplates EmailMailings MailingIndex MailingList MailingListIndex ClickTrack Payments PaymentLogs Bookmark_Folders Bookmark_Links SearchLogs NewsletterSubscription ); sub tables { # ------------------------------------------------------------------ # Defines the SQL tables. # my $action = shift || 'warn'; my $output = ''; my $ok = Links::language('dialog_ok'); # --------- Users Table ---------------- create_table(\$output, 'Users', $action, cols => [ Username => { type => 'CHAR', size => 50, not_null => 1, form_display => Links::language('prompt_Username') }, Password => { type => 'CHAR', binary => 1, size => 25, not_null => 1, form_display => Links::language('prompt_Password') }, Email => { type => 'CHAR', size => 75, not_null => 1, regex => '^(?:.+\@.+\..+|\s*)$', form_display => Links::language('prompt_Email') }, Name => { type => 'CHAR', size => 75, form_display => Links::language('prompt_Name') }, Validation => { type => 'CHAR', size => 20, , form_display => Links::language('prompt_Validation') }, Status => { type => 'ENUM', values => ['Not Validated', 'Registered', 'Administrator'], not_null => 1, default => 'Registered', form_display => Links::language('prompt_Status') }, ReceiveMail => { type => 'ENUM', values => ['No', 'Yes'], not_null => 1, default => 'Yes', form_display => Links::language('prompt_ReceiveMail') }, SortField => { type => 'VARCHAR', size => 255, not_null => 1, regex => '^[\s\w]+$', default => 'Title', form_display => Links::language('prompt_SortField') }, SortOrd => { type => 'ENUM', values => ['ASC', 'DESC'], not_null => 1, default => 'ASC', form_display => Links::language('prompt_SortOrd') }, PerPage => { type => 'INT', not_null => 1, unsigned => 1, default => 15, form_display => Links::language('prompt_PerPage') }, Grouping => { type => 'TINYINT', not_null => 1, unsigned => 1, default => 0, form_display => Links::language('prompt_Grouping') }, ], index => { emailndx => ['Email'] }, pk => 'Username', subclass => { table => { Users => 'Links::Table::Users' }, html => { Users => 'Links::HTML::Users' } } ); # --------- Links Table ---------------- create_table(\$output, 'Links', $action, cols => [ ID => { type => 'INT', not_null => 1, unsigned => 1, regex => '^\d+$', form_display => Links::language('prompt_ID') }, Title => { type => 'CHAR', size => 100, not_null => 1, weight => 3, form_display => Links::language('prompt_Title') }, URL => { type => 'CHAR', size => 255, not_null => 1, weight => 1, default => 'http://', regex => '^\w+:', form_display => Links::language('prompt_URL') }, LinkOwner => { type => 'CHAR', size => 50, not_null => 1, default => 'admin', form_display => Links::language('prompt_LinkOwner') }, Add_Date => { type => 'DATE', not_null => 1, form_display => Links::language('prompt_Add_Date') }, Mod_Date => { type => 'DATE', not_null => 1, form_display => Links::language('prompt_Mod_Date') }, Description => { type => 'TEXT', weight => 1, form_display => Links::language('prompt_Description') }, Contact_Name => { type => 'CHAR', size => 255, form_display => Links::language('prompt_Contact_Name') }, Contact_Email => { type => 'CHAR', size => 255, form_display => Links::language('prompt_Contact_Email') }, Hits => { type => 'INT', not_null => 1, default => 0, regex => '^\d+$', form_display => Links::language('prompt_Hits') }, isNew => { type => 'ENUM', values => ['No', 'Yes'], not_null => 1, default => 'No', form_display => Links::language('prompt_isNew') }, isChanged => { type => 'ENUM', values => ['No', 'Yes'], not_null => 1, default => 'No', form_display => Links::language('prompt_isChanged') }, isPopular => { type => 'ENUM', values => ['No', 'Yes'], not_null => 1, default => 'No', form_display => Links::language('prompt_isPopular') }, isValidated => { type => 'ENUM', values => ['No', 'Yes'], not_null => 1, default => 'Yes', form_display => Links::language('prompt_isValidated') }, Rating => { type => 'DECIMAL', precision => 4, scale => 2, not_null => 1, default => 0, regex => '^(?:10(?:\.0*)?|\d(?:\.\d*)?)$', form_display => Links::language('prompt_Rating') }, Votes => { type => 'SMALLINT', unsigned => 1, not_null => 1, default => 0, regex => '^\d+$', form_display => Links::language('prompt_Votes') }, Status => { type => 'SMALLINT', not_null => 1, default => 0, regex => '^-?\d+$', form_display => Links::language('prompt_Status') }, Date_Checked => { type => 'DATETIME', form_display => Links::language('prompt_Date_Checked') }, Timestmp => { type => 'TIMESTAMP', time_check => 1, form_display => Links::language('prompt_Timestmp') }, ExpiryDate => { type => 'INT', not_null => 1, default => FREE, form_display => Links::language('prompt_ExpiryDate'), form_size => 35 }, # See FREE, UNPAID & UNLIMITED constants in Links.pm ExpiryCounted => { type => 'TINYINT', not_null => 1, default => 0, form_display => Links::language('prompt_ExpiryCounted'), form_type => 'hidden' }, ExpiryNotify => { type => 'TINYINT', not_null => 1, default => 0, form_display => Links::language('prompt_ExpiryNotify'), form_type => 'hidden' }, LinkExpired => { type => 'INT', form_display => Links::language('prompt_LinkExpired'), form_type => 'hidden' }, ], pk => 'ID', ai => 'ID', fk => { Users => { LinkOwner => 'Username' } }, index => { urlndx => ['URL'], stndx => ['Status'], valexpndx => [qw/isValidated ExpiryDate/], newndx => ['isNew'], popndx => ['isPopular'], userndx => ['LinkOwner'], expiryndx => [qw/ExpiryDate ExpiryNotify/], expcntndx => [qw/ExpiryCounted ExpiryDate/] }, subclass => { table => { Links => 'Links::Table::Links' }, html => { Links => 'Links::HTML::Links' } } ); # --------- Changes Table ---------------- create_table(\$output, 'Changes', $action, cols => [ LinkID => { type => 'INT', not_null => 1, unsigned => 1, regex => '^\d+$' }, Username => { type => 'CHAR', size => 50, not_null => 1, default => 'admin' }, ChgRequest => { type => 'TEXT' }, Timestmp => { type => 'TIMESTAMP' } ], fk => { Links => { LinkID => 'ID' }, Users => { Username => 'Username' } } ); # --------- Category Table ---------------- my $new_category = create_table(\$output, 'Category', $action, cols => [ ID => { type => 'INT', not_null => 1, unsigned => 1, form_display => Links::language('prompt_ID') }, Name => { type => 'CHAR', size => 255, not_null => 1, weight => 3, regex => '^[^/]+$', form_display => Links::language('prompt_Name') }, FatherID => { type => 'INT', not_null => 1, unsigned => 1, default => 0, form_size => 1, form_display => Links::language('prompt_FatherID') }, CatRoot => { type => 'INT', not_null => 1, unsigned => 1, default => 0, form_type => 'hidden' }, CatDepth => { type => 'INT', not_null => 1, unsigned => 1, default => 0, form_type => 'hidden' }, Full_Name => { type => 'CHAR', size => 255, form_display => Links::language('prompt_Full_Name') }, Description => { type => 'TEXT', weight => 1, form_display => Links::language('prompt_Description') }, Meta_Description => { type => 'TEXT', form_display => Links::language('prompt_Meta_Description') }, Meta_Keywords => { type => 'TEXT', form_display => Links::language('prompt_Meta_Keywords') }, Header => { type => 'TEXT', form_display => Links::language('prompt_Header') }, Footer => { type => 'TEXT', form_display => Links::language('prompt_Footer') }, Category_Template => { type => 'CHAR', size => 20, form_display => Links::language('prompt_Category_Template') }, Number_of_Links => { type => 'INT', not_null => 1, default => 0, form_display => Links::language('prompt_Number_of_Links') }, Direct_Links => { type => 'INT', not_null => 1, default => 0, form_display => Links::language('prompt_Direct_Links') }, Has_New_Links => { type => 'ENUM', values => ['No', 'Yes'], not_null => 1, default => 'No', form_display => Links::language('prompt_Has_New_Links') }, Has_Changed_Links => { type => 'ENUM', values => ['No', 'Yes'], not_null => 1, default => 'No', form_display => Links::language('prompt_Has_Changed_Links') }, Newest_Link => { type => 'DATE', form_display => Links::language('prompt_Newest_Link') }, Timestmp => { type => 'TIMESTAMP', time_check => 1, form_display => Links::language('prompt_Timestmp') }, Payment_Mode => { type => 'TINYINT', not_null => 1, default => 0, form_size => 1, form_names => [GLOBAL,NOT_ACCEPTED,OPTIONAL,REQUIRED], form_values => ['Use global settings','Not accepted','Optional','Required'], form_type => 'SELECT', form_display => Links::language('prompt_Payment_Mode') }, Payment_Description => { type => 'TEXT', form_display => Links::language('prompt_Payment_Description') }, ], subclass => { table => { Category => 'Links::Table::Category' }, html => { Category => 'Links::HTML::Category' } }, pk => 'ID', ai => 'ID', index => { catndx => ['Name'], namndx => ['Full_Name'], fthrindex => ['FatherID'], rootndx => ['CatRoot'], c_p => ['Payment_Mode'], } ); # --------- Category Tree ------------------------- $output .= "Creating Category tree... "; my $e = $DB->editor('Category'); if ($e->add_tree(father => "FatherID", root => "CatRoot", depth => "CatDepth", force => ($new_category ? 'force' : 'check'))) { $output .= "okay\n"; } else { $output .= "failed ($GT::SQL::error)\n"; } # --------- CatPrice Table ---------------- create_table(\$output, 'CatPrice', $action, cols => [ cp_id => { type => 'INT', not_null => 1, unsigned => 1 }, cp_cat_id_fk => { type => 'INT', not_null => 1, unsigned => 1 }, cp_term => { type => 'CHAR', not_null => 1, size => 10 }, # e.g. 8d, 1m, 2y, 3w, unlimited, etc. cp_cost => { type => 'DOUBLE', not_null => 1 }, cp_type => { type => 'TINYINT', not_null => 1, unsigned => 1 }, # 0 = signup, 1 = renewal, 2 = recurring cp_description => { type => 'TEXT' } ], pk => 'cp_id', ai => 'cp_id', fk => { Category => { cp_cat_id_fk => 'ID' } } ); # --------- Reviews Table ---------------- create_table(\$output, 'Reviews', $action, cols => [ ReviewID => { type => 'INT', not_null => 1, unsigned => 1, form_display => Links::language('prompt_ReviewID') }, Review_LinkID => { type => 'INT', not_null => 1, unsigned => 1, regex => '^\d+$', form_display => Links::language('prompt_Review_LinkID') }, Review_Owner => { type => 'CHAR', size => 50, not_null => 1, form_display => Links::language('prompt_Review_Owner') }, Review_Rating => { type => 'SMALLINT', unsigned => 1, not_null => 1, default => 0, regex => '^\d+$', form_display => Links::language('prompt_Review_Rating') }, Review_Date => { type => 'DATETIME', not_null => 1, form_display => Links::language('prompt_Review_Date') }, Review_ModifyDate => { type => 'DATETIME', not_null => 1, form_display => Links::language('prompt_Review_ModifyDate') }, Review_Subject => { type => 'CHAR', size => 100, not_null => 1, form_display => Links::language('prompt_Review_Subject') }, Review_Contents => { type => 'TEXT', not_null => 1, form_display => Links::language('prompt_Review_Contents') }, Review_ByLine => { type => 'CHAR', size => 50, form_display => Links::language('prompt_Review_ByLine') }, Review_WasHelpful => { type => 'INT', unsigned => 1, regex => '^\d+$', form_display => Links::language('prompt_Review_WasHelpful') }, Review_WasNotHelpful => { type => 'INT', unsigned => 1, regex => '^\d+$', form_display => Links::language('prompt_Review_WasNotHelpful') }, Review_Validated => { type => 'ENUM', values => ['No', 'Yes'], not_null => 1, default => 'No', form_display => Links::language('prompt_Review_Validated') }, Review_GuestName => { type => 'CHAR', size => 75, form_display => Links::language('prompt_Review_GuestName') }, Review_GuestEmail => { type => 'CHAR', size => 75, regex => '^(?:(?:.+\@.+\..+)|\s*)$', form_display => Links::language('prompt_Review_GuestEmail') }, ], pk => 'ReviewID', ai => 'ReviewID', subclass => { table => { Reviews => 'Links::Table::Reviews' } }, index => { rownerndx => ['Review_Owner'], rdatendx => ['Review_Date'], rlinkndx => ['Review_LinkID'] }, fk => { Links => { Review_LinkID => 'ID' }, Users => { Review_Owner => 'Username' } } ); # --------- CatLinks Table ---------------- create_table(\$output, 'CatLinks', $action, cols => [ LinkID => { type => 'INT', not_null => 1, unsigned => 1 }, CategoryID => { type => 'INT', not_null => 1, unsigned => 1 } ], subclass => { table => { CatLinks => 'Links::Table::CatLinks' } }, index => { lndx => ['LinkID'] }, unique => { cl_cl_q => [qw/CategoryID LinkID/] }, fk => { Links => { LinkID => 'ID' }, Category => { CategoryID => 'ID' } } ); # --------- CatRelations Table ---------------- create_table(\$output, 'CatRelations', $action, cols => [ CategoryID => { type => 'INT', not_null => 1, unsigned => 1 }, RelatedID => { type => 'INT', not_null => 1, unsigned => 1 }, RelationName => { type => 'VARCHAR', size => 255 } ], index => { catid => ['CategoryID'] }, fk => { Category => { CategoryID => 'ID', RelatedID => 'ID' } } ); # --------- User Editors Table ---------------- create_table(\$output, 'Editors', $action, cols => [ Username => { type => 'CHAR', size => 50, not_null => 1 }, CategoryID => { type => 'INT', unsigned => 1, not_null => 1 }, CanAddCat => { type => 'ENUM', values => ['No', 'Yes'], not_null => 1, default => 'No' }, CanModCat => { type => 'ENUM', values => ['No', 'Yes'], not_null => 1, default => 'No' }, CanDelCat => { type => 'ENUM', values => ['No', 'Yes'], not_null => 1, default => 'No' }, CanMoveCat => { type => 'ENUM', values => ['No', 'Yes'], not_null => 1, default => 'No' }, CanAddLink => { type => 'ENUM', values => ['No', 'Yes'], not_null => 1, default => 'No' }, CanDelLink => { type => 'ENUM', values => ['No', 'Yes'], not_null => 1, default => 'No' }, CanModLink => { type => 'ENUM', values => ['No', 'Yes'], not_null => 1, default => 'No' }, CanCopyLink => { type => 'ENUM', values => ['No', 'Yes'], not_null => 1, default => 'No' }, CanMoveLink => { type => 'ENUM', values => ['No', 'Yes'], not_null => 1, default => 'No' }, CanValLink => { type => 'ENUM', values => ['No', 'Yes'], not_null => 1, default => 'No' }, CanModReview => { type => 'ENUM', values => ['No', 'Yes'], not_null => 1, default => 'No' }, CanAddRel => { type => 'ENUM', values => ['No', 'Yes'], not_null => 1, default => 'No' }, CanAddEdit => { type => 'ENUM', values => ['No', 'Yes'], not_null => 1, default => 'No' }, ], unique => { edituserndx => ['Username', 'CategoryID'] }, fk => { Users => { Username => 'Username' }, Category => { CategoryID => 'ID' } } ); # --------- Verify History Table ---------------- create_table(\$output, 'Verify', $action, cols => [ LinkID => { type => 'INT', unsigned => 1, not_null => 1 }, Status => { type => 'SMALLINT', not_null => 1, default => 0 }, Date_Checked => { type => 'DATE' } ], index => { veriflndx => ['LinkID'] }, fk => { Links => { LinkID => 'ID' } } ); # --------- Session Table ---------------- create_table(\$output, 'Sessions', $action, cols => [ session_id => { type => 'CHAR', size => 32, not_null => 1, binary => 1 }, session_user_id => { type => 'CHAR', size => 50, not_null => 1 }, session_date => { type => 'INT', not_null => 1 }, session_expires => { type => 'TINYINT', default => 1 }, session_data => { type => 'TEXT' } ], pk => 'session_id', fk => { Users => { session_user_id => 'Username' } } ); # --------- Email Template Table ---------------- create_table(\$output, 'EmailTemplates', $action, cols => [ Name => { type => 'CHAR', size => 50, not_null => 1, regex => '\S' }, MsgFrom => { type => 'TEXT', not_null => 1, regex => '\A(?:\S+\@[a-zA-Z0-9][a-zA-Z0-9-]*(?:\.[a-zA-Z0-9][a-zA-Z0-9-]*)+)\Z' }, MsgFromName => { type => 'TEXT', not_null => 1 }, Subject => { type => 'TEXT', not_null => 1 }, Message => { type => 'MEDIUMTEXT', not_null => 1 }, MessageFormat => { type => 'ENUM', values => [qw[text html]], not_null => 1, default => 'text' }, LinkTemplate => { type => 'MEDIUMTEXT' } ], pk => 'Name' ); # --------- Email Mailings Table ------------- create_table(\$output, 'EmailMailings', $action, cols => [ ID => { type => 'INT', unsigned => 1, not_null => 1 }, Mailing => { type => 'INT', unsigned => 1, not_null => 1 }, Email => { type => 'TEXT', size => 75, not_null => 1 }, Sent => { type => 'TINYINT', default => 0, not_null => 1 }, LinkID => { type => 'INT', unsigned => 1 } # If this is a sending to link owners, this will hold the Link ID ], pk => 'ID', ai => 'ID' ); # --------- Email Mailing Index Table -------- create_table(\$output, 'MailingIndex', $action, cols => [ Mailing => { type => 'INT', unsigned => 1, not_null => 1 }, extra => { type => 'TINYTEXT', not_null => 1 }, done => { type => 'INT' }, mailfrom => { type => 'TEXT', not_null => 1 }, name => { type => 'TEXT', not_null => 1 }, subject => { type => 'TEXT', not_null => 1 }, message => { type => 'MEDIUMTEXT', not_null => 1 }, messageformat => { type => 'ENUM', values => [qw[text html]], not_null => 1, default => 'text' }, ], pk => 'Mailing', ai => 'Mailing' ); # --------- MailingList Table ---------------- create_table(\$output, 'MailingList', $action, cols => [ ID => { type => 'INT', not_null => 1 }, Email => { type => 'CHAR', size => 255, not_null => 1 } ], index => { maillistndx => ['Email'] } ); # --------- MailingListIndex Table ---------------- create_table(\$output, 'MailingListIndex', $action, cols => [ ID => { type => 'INT', unsigned => 1, not_null => 1 }, Name => { type => 'CHAR', size => 255, not_null => 1 }, DateModified => { type => 'INT', not_null => 1 }, DateCreated => { type => 'INT', not_null => 1 } ], pk => 'ID', ai => 'ID' ); # --------- ClickTrack Table ---------------- create_table(\$output, 'ClickTrack', $action, cols => [ LinkID => { type => 'INT', not_null => 1 }, IP => { type => 'CHAR', size => 16, not_null => 1 }, ClickType => { type => 'ENUM', values => ['Rate', 'Hits','Review'], not_null => 1 }, ReviewID => { type => 'INT', not_null => 1, default => 0}, Created => { type => 'TIMESTAMP' } ], subclass => { table => { ClickTrack => 'Links::Table::ClickTrack' } }, unique => { ct_licr => ['LinkID', 'IP', 'ClickType','ReviewID'] }, index => { cndx => ['Created'] } ); # --------- Payments Table ---------------- create_table(\$output, 'Payments', $action, cols => [ payments_id => { type => 'CHAR', not_null => 1, size => 16 }, payments_linkid => { type => 'INT', unsigned => 1, not_null => 1 }, payments_status => { type => 'INT', not_null => 1, default => 0, unsigned => 1 }, # 0 = pending, 1 = completed, 2 = declined, 3 = error payments_method => { type => 'CHAR', not_null => 1, size => 25 }, payments_type => { type => 'TINYINT', not_null => 1, unsigned => 1 }, # 0 = initial payment, 1 = renewal payment, 2 = recurring payment payments_amount => { type => 'DOUBLE', not_null => 1 }, payments_term => { type => 'CHAR', not_null => 1, size => 10 }, # e.g. 8d, 1m, 2y, 3w, unlimited, etc. payments_start => { type => 'INT', not_null => 1, unsigned => 1 }, payments_last => { type => 'INT', not_null => 1, unsigned => 1 }, ], pk => 'payments_id', fk => { Links => { payments_linkid => 'ID' } }, index => { p_sl => ['payments_status', 'payments_last'], p_ll => ['payments_linkid', 'payments_last'], p_al => ['payments_amount', 'payments_last'], } ); # --------- Payment Logs Table ---------------- create_table(\$output, 'PaymentLogs', $action, cols => [ paylogs_id => { type => 'INT', not_null => 1, unsigned => 1 }, paylogs_payments_id => { type => 'CHAR', not_null => 1, size => 16 }, paylogs_type => { type => 'INT', not_null => 1, default => 0, unsigned => 1 }, # 0 = info, 1 = accepted, 2 = declined, 3 = error paylogs_time => { type => 'INT', not_null => 1, unsigned => 1 }, paylogs_viewed => { type => 'TINYINT', not_null => 1, default => 0, unsigned => 1 }, paylogs_text => { type => 'TEXT' }, ], pk => 'paylogs_id', ai => 'paylogs_id', fk => { Payments => { paylogs_payments_id => 'payments_id' } }, index => { pl_yt => ['paylogs_type', 'paylogs_time'], pl_t => ['paylogs_time'] } ); # --------- Bookmark Folders Table ---------------- create_table(\$output, 'Bookmark_Folders', $action, cols => [ my_folder_id => { type => 'INT', not_null => 1, unsigned => 1 }, my_folder_name => { type => 'VARCHAR', not_null => 1, size => 255 }, my_folder_description => { type => 'VARCHAR', size => 255 }, my_folder_user_username_fk => { type => 'VARCHAR', size => 50 }, my_folder_default => { type => 'TINYINT', not_null => 1, default => 0, unsigned => 1 }, my_folder_public => { type => 'TINYINT', not_null => 1, default => 0, unsigned => 1 } ], pk => 'my_folder_id', ai => 'my_folder_id', fk => { Users => { my_folder_user_username_fk => 'Username' } } ); # --------- Bookmark Links Table ---------------- create_table(\$output, 'Bookmark_Links', $action, cols => [ my_id => { type => 'INT', not_null => 1, unsigned => 1 }, my_link_id_fk => { type => 'INT', not_null => 1, unsigned => 1 }, my_user_username_fk => { type => 'VARCHAR', size => 50 }, my_folder_id_fk => { type => 'INT', not_null => 1, unsigned => 1 }, my_comment => { type => 'VARCHAR', size => '255' } ], pk => 'my_id', ai => 'my_id', fk => { Users => { my_user_username_fk => 'Username' }, Bookmark_Folders => { my_folder_id_fk => 'my_folder_id' }, Links => { my_link_id_fk => 'ID' }, } ); # --------- SearchLogs Table ---------------- create_table(\$output, 'SearchLogs', $action, cols => [ slog_query => { type => 'VARCHAR', not_null => 1, size => 255 }, slog_count => { type => 'INT', not_null => 1, default => 0 }, slog_hits => { type => 'INT', not_null => 1, default => 0 }, slog_time => { type => 'FLOAT' }, slog_last => { type => 'INT', not_null => 1, default => 0 }, ], pk => 'slog_query' ); # --------- Newsletter Subscription Table ---------------- create_table(\$output, 'NewsletterSubscription', $action, cols => [ UserID => { type => 'CHAR', size => 50 }, CategoryID => { type => 'INT', not_null => 1 }, ], unique => { ns_uc => ['UserID', 'CategoryID'] }, fk => { Users => { UserID => 'Username' }, Category => { CategoryID => 'ID' } } ); return $output; } sub create_table { my ($output, $table, $action, @def) = @_; $$output .= Links::language('dialog_create', $table); my $c = $DB->creator($table); $c->clear_schema() if $action eq 'force'; @def % 2 and die "Odd number of table defs passed to create_table()"; while (@def) { my ($meth, $arg) = splice @def, 0, 2; $c->$meth($arg); } if ($c->create($action)) { $$output .= Links::language('dialog_ok'); return 1; } else { $$output .= Links::language($GT::SQL::errcode eq 'TBLEXISTS' ? ('error_failed_exists') : ('error_failed_other', $GT::SQL::error)); $GT::SQL::errcode if 0; # silence "used only once" warning $c->set_defaults; $c->save_schema; return 0; } } sub load_from_sql { # --------------------------------------------------------------- # Creates def files based on existing tables. # my ($output, $return); foreach my $table (@TABLES) { $output .= "$table .. "; my $c = $DB->creator($table); $return = $c->load_table($table); if ($return) { if ($table eq 'Links' or $table eq 'Users' or $table eq 'Category') { $c->subclass( table => { $table => "Links::Table::$table" }, html => { $table => "Links::HTML::$table" } ); } elsif ($table eq 'CatLinks' or $table eq 'ClickTrack') { $c->subclass( table => { $table => "Links::Table::$table" } ); } $output .= "ok!\n"; $c->save_schema(); } else { $output .= "failed: $GT::SQL::error\n"; } } return $output; } sub load { # --------------------------------------------------------------- # Return a hash of current connection settings. # my %h = (); $h{prefix} = $DB->prefix(); $h{database} = $DB->{connect}->{database}; $h{login} = $DB->{connect}->{login}; $h{password} = $DB->{connect}->{password}; $h{host} = $DB->{connect}->{host}; $h{host} .= ":" . $DB->{connect}->{port} if $DB->{connect}->{port}; $h{driver} = $DB->{connect}->{driver}; return \%h; } 1;