Changeset 8f14efda2486086620dae33eba4e05b4cdfa98e1 in xas-model


Ignore:
Timestamp:
02/17/15 17:13:13 (4 years ago)
Author:
Kevin L. Esteb <kevin@…>
Branches:
master
Children:
1d087096089e999a35750d50dad3cf9f01913a9e
Parents:
2d64c149ac3296b0168c5776a90176b9d3c4a1c0
git-author:
Kevin L. Esteb <kevin@…> (02/17/15 17:13:13)
git-committer:
Kevin L. Esteb <kevin@…> (02/17/15 17:13:13)
Message:

Wokring on database loading. Changed over to the recommended directory
structure for DBIx::Class (sorta)

Location:
trunk
Files:
8 added
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/lib/XAS/Model/Database.pm

    r2d64c149ac3296b0168c5776a90176b9d3c4a1c0 r8f14efda2486086620dae33eba4e05b4cdfa98e1  
    33our $VERSION = '0.01'; 
    44 
    5 use XAS::Exception; 
    65use Class::Inspector; 
     6use XAS::Model::Schema; 
    77 
    88use XAS::Class 
    99  debug      => 0, 
    1010  version    => $VERSION, 
    11   base       => 'DBIx::Class::Schema::Config XAS::Base', 
    12   import     => 'class CLASS', 
     11  base       => 'XAS::Base', 
    1312  constants  => 'DELIMITER PKG REFS ONCE HASH ARRAY', 
    1413  filesystem => 'File', 
     
    2221; 
    2322 
    24 #use Data::Dumper; 
    25  
    26 # --------------------------------------------------------------------- 
    27 # Define DBIx::Class::Schema::Config configuration file locations 
    28 # 
    29 # Format of the configuration file is as follows: 
    30 # 
    31 # [progress]             - corresponds to what is given to opendb() 
    32 # dbname = monitor       - name of the database 
    33 # dsn = SQLite           - corresponds to the dbd driver 
    34 # username = username    - the user context to use 
    35 # password = password    - the password for that context 
    36 # 
    37 # When using ODBC with a user level DSN or a dynamic connection, you 
    38 # should add the following items: 
    39 # 
    40 # driver = SQL Server 
    41 # server = localhost,1234 
    42 # 
    43 # When using PostgresSQL (Pg), you can add the following items: 
    44 # 
    45 # port = 5432 
    46 # host = localhost 
    47 # sslmode = something 
    48 # options = something 
    49 # 
    50 # Or a service name, which is not compatiable with the above. 
    51 # 
    52 # service = service name 
    53 #  
    54 # There can be multiple stanzas, the first one that matches is used. 
    55 # --------------------------------------------------------------------- 
    56  
    57 { 
    58     # ----------------------------------------------------------------- 
    59     # Defining where our database.ini file could be 
    60     # ----------------------------------------------------------------- 
    61  
    62     my $path; 
    63  
    64     if ($^O eq "MSWin32") { 
    65  
    66         $path = defined($ENV{XAS_ROOT}) ? $ENV{XAS_ROOT} : 'C:\\xas'; 
    67  
    68         CLASS->config_paths([( 
    69             File($path, 'etc', 'database')->path, 
    70             File($ENV{USERPROFILE}, 'database')->path, 
    71         )]); 
    72  
    73     } else { 
    74  
    75         $path = defined($ENV{XAS_ROOT}) ? $ENV{XAS_ROOT} : '/'; 
    76  
    77         CLASS->config_paths([( 
    78             File($path, 'etc', 'xas', 'database')->path, 
    79             File($ENV{HOME}, '.database')->path, 
    80         )]); 
    81  
    82     } 
    83  
    84 } 
    85  
    86 # --------------------------------------------------------------------- 
    87 # Defining our DBIx::Class exception handler 
    88 # --------------------------------------------------------------------- 
    89  
    90 CLASS->exception_action(\&XAS::Model::Database::dbix_exceptions); 
     23our $KEYS; 
     24   
     25use Data::Dumper; 
    9126 
    9227# --------------------------------------------------------------------- 
     
    11247    my $schemas = @_ == 1 ? shift : [ @_ ]; 
    11348 
    114     $self->schema($schemas); 
     49    $self->schemas($schemas); 
    11550 
    11651    return $self; 
     
    11954 
    12055# --------------------------------------------------------------------- 
    121 # Methods 
     56# Public Methods 
    12257# --------------------------------------------------------------------- 
    12358 
     
    12661    my ($tables) = $self->validate_params(\@_, [1]); 
    12762 
    128         my $TABLES = $self->class->var('TABLES'); 
    129  
    13063    $tables = [ split(DELIMITER, $tables) ] unless (ref($tables) eq ARRAY); 
    13164 
     65    my ($pkg) = caller(4); 
     66       
     67    no strict "refs";               # to register new methods in package 
     68    no warnings;                    # turn off warnings 
     69 
    13270    foreach my $table (@$tables) { 
    13371 
     72        # building constants in the calling package. 
     73 
    13474        if ($table ne ':all') { 
    13575 
    136             $self->class->constant($table => $TABLES->{$table}); 
     76            *{$pkg.PKG.$table} = sub { $KEYS->{$table}; }; 
    13777 
    13878        } else { 
    13979 
    140             while (my ($key, $value) = each(%{$TABLES->{tables}})) { 
    141  
    142                 $self->class->constant($key => $value); 
     80            while (my ($key, $value) = each(%$KEYS)) { 
     81 
     82                *{$pkg.PKG.$key} = sub { $value; }; 
    14383 
    14484            } 
     
    160100    foreach my $schema (@$schemas) { 
    161101 
     102        # loading our schema 
     103 
     104        XAS::Model::Schema->load_namespaces( 
     105            result_namespace    => "+$schema" . "::Result", 
     106            resultset_namespace => "+$schema" . "::ResultSet", 
     107        ); 
     108 
     109        # building our keys 
     110 
    162111        my $pattern = $schema . '::'; 
    163  
    164         # loading our schema 
    165  
    166         CLASS->load_namespaces(result_namespace => "+$schema"); 
    167  
    168         # building our TABLES hash 
    169  
    170112        my $modules = Class::Inspector->subclasses('UNIVERSAL'); 
    171113 
    172114        foreach my $module (@$modules) { 
     115 
     116            next if ($module =~ /ResultSet/); 
    173117 
    174118            if ($module =~ m/$pattern/) { 
     
    178122                my $name = join('', splice(@parts, $begin, $#parts)); 
    179123 
    180                 $self->class->hash_value('TABLES', $name, $module); 
     124                $KEYS->{$name} = $module; 
    181125 
    182126            } 
     
    188132} 
    189133 
    190 sub filter_loaded_credentials { 
    191     my ($class, $config, $connect_args) = @_; 
    192  
    193     $config->{dbi_attr}->{AutoCommit} = 1; 
    194     $config->{dbi_attr}->{PrintError} = 0; 
    195     $config->{dbi_attr}->{RaiseError} = 1; 
    196  
    197     if ($config->{dsn} eq 'SQLite') { 
    198  
    199         $config->{dbi_attr}->{sqlite_use_immediate_transaction} = 1; 
    200         $config->{dbi_attr}->{sqlite_see_if_its_a_number} = 1; 
    201         $config->{dbi_attr}->{on_connect_call} = 'use_foreign_keys'; 
    202  
    203         $config->{dsn} = "dbi:$config->{dsn}:dbname=$config->{dbname}"; 
    204  
    205     } elsif ($config->{dsn} eq 'ODBC') { 
    206  
    207         # http://dolio.lh.net/~apw/doc/HOWTO/HOWTO-Connect_Perl_to_SQL_Server.pdf 
    208         # 
    209         # a user level DSN or a dynamic connection needs the following: 
    210         # 
    211         # dbi:ODBC:Driver={driver};Server=server;Database=dbname 
    212         # 
    213         # a system level DSN needs the following: 
    214         # 
    215         # dbi:ODBC:dbname 
    216         #  
    217  
    218         if (defined($config->{driver})) { 
    219  
    220             $config->{dsn} = sprintf( 
    221                 "dbi:%s:Driver={%s};Database=%s;Server=%s", 
    222                 $config->{dsn}, $config->{driver}, 
    223                 $config->{dbname}, $config->{server} 
    224             ); 
    225  
    226         } else { 
    227  
    228             $config->{dsn} = "dbi:$config->{dsn}:$config->{dbname}"; 
    229     
    230         } 
    231  
    232     } elsif ($config->{dsn} eq 'Pg') { 
    233  
    234         unless (defined($config->{service})) { 
    235  
    236             $config->{dsn}  = "dbi:$config->{dsn}:dbname=$config->{dbname}"; 
    237             $config->{dsn} .= ";host=$config->{host}" if (defined($config->{host})); 
    238             $config->{dsn} .= ";port=$config->{port}" if (defined($config->{port})); 
    239             $config->{dsn} .= ";options=$config->{options}" if (defined($config->{options})); 
    240             $config->{dsn} .= ";sslnode=$config->{sslmode}" if (defined($config->{sslmode})); 
    241  
    242         } else { 
    243  
    244             $config->{dsn} = "dbi:$config->{dsn}:service=$config->{service}"; 
    245  
    246         } 
    247  
    248     } else { 
    249  
    250         $config->{dsn} = "dbi:$config->{dsn}:dbname=$config->{dbname}"; 
    251  
    252     } 
    253  
    254     return $config; 
    255  
    256 } 
    257  
    258 sub opendb { 
    259     my $class = shift; 
    260  
    261     return $class->connect(@_); 
    262  
    263 } 
    264  
    265 sub dbix_exceptions { 
    266     my $error = shift; 
    267  
    268     $error =~ s/dbix.class error - //; 
    269  
    270     my $ex = XAS::Exception->new( 
    271         type => 'dbix.class', 
    272         info => sprintf("%s", $error) 
    273     ); 
    274  
    275     $ex->throw; 
    276  
    277 } 
     134# --------------------------------------------------------------------- 
     135# Private Methods 
     136# --------------------------------------------------------------------- 
    278137 
    2791381; 
     
    287146=head1 SYNOPSIS 
    288147 
     148  use XAS::Model::Schema; 
    289149  use XAS::Model::Database 
    290150    schema => 'ETL::Model::Database', 
     
    293153  try { 
    294154 
    295       $schema = XAS::Model::Database->opendb('database'); 
     155      $schema = XAS::Model::Schema->opendb('database'); 
    296156 
    297157      my @rows = Master->search($schema); 
Note: See TracChangeset for help on using the changeset viewer.