/[A3C]/lib/Strix.pm
This is repository of my old source code which isn't updated any more. Go to git.rot13.org for current projects!
ViewVC logotype

Annotation of /lib/Strix.pm

Parent Directory Parent Directory | Revision Log Revision Log


Revision 171 - (hide annotations)
Mon Jun 16 13:16:57 2008 UTC (15 years, 9 months ago) by dpavlin
File size: 7174 byte(s)
connect to each site just once

we don't do any expiery of connections to site databases, so we
would need some kind of mechanisam for that to preserve filedescriptors
and database connections when in production
1 dpavlin 167 package Strix;
2    
3     use strict;
4     use warnings;
5    
6 dpavlin 168 use base qw(Jifty::Object Class::Accessor::Fast);
7 dpavlin 169 __PACKAGE__->mk_accessors( qw(site uid) );
8 dpavlin 167
9     use DBI;
10     use Data::Dump qw/dump/;
11 dpavlin 168 use Carp qw/confess/;
12 dpavlin 167
13 dpavlin 168 our $debug = 0;
14    
15 dpavlin 167 =head1 NAME
16    
17     Strix
18    
19     =head1 METHODS
20    
21 dpavlin 168 =head2 new
22    
23     my $strix = Strix->new({ site => 'os-test0604-zg' });
24    
25 dpavlin 167 =head2 dbh
26    
27 dpavlin 168 my $dbh = Strix->dbh( $site_name );
28 dpavlin 167
29 dpavlin 168 my $dbh = $strix->dbh;
30    
31 dpavlin 167 =cut
32    
33 dpavlin 171 our $site_dbh;
34    
35 dpavlin 167 sub dbh {
36     my $self = shift;
37    
38 dpavlin 168 my $site = shift || $self->site || confess "no site";
39 dpavlin 167
40 dpavlin 171 return $site_dbh->{$site} if $site_dbh->{$site};
41    
42 dpavlin 167 my $config = Jifty->config->app('strix') or die "need strix config";
43     my $database = $config->{database} or die "no strix.database in config";
44    
45     Jifty->log->debug("using config ", dump( $database ));
46    
47     my $dsn =
48     'DBI:Pg:dbname=' . $site .
49     ';host=' . $database->{host} .
50     ';port=' . $database->{port};
51    
52     Jifty->log->info("Connect to site $site with dsn $dsn");
53    
54     my $dbh = DBI->connect( $dsn, $database->{user}, $database->{passwd} ) or die $DBI::errstr;
55    
56 dpavlin 171 $site_dbh->{$site} = $dbh;
57    
58     warn "## site_dbh = ",dump( $site_dbh );
59    
60 dpavlin 167 return $dbh;
61     }
62    
63 dpavlin 168 =head2 category
64    
65     my $category = Strix->category( $url );
66    
67     =cut
68    
69     sub category {
70     my $self = shift;
71    
72     my $url = shift || confess "no url";
73    
74     # sysinc/profiles.php
75     my $sth = $self->dbh->prepare(qq{
76     SELECT kategorija.*, lang.langid, lang.locale, template.tfilename, template.tflags, site.naziv as sitename, site.admin_mail, site.address, site.root as site_root, getPathFromNav(kategorija.id) as path, site.ordstr as site_ordstr FROM kategorija, template, site, lang WHERE kategorija.url = ? AND kategorija.template_id = template.id AND kategorija.site_id = site.id AND lang.id = kategorija.lang
77     });
78     $sth->execute($url);
79    
80     my $category = $sth->fetchrow_hashref() or die "can't fetch category $url";
81     return $category;
82     }
83    
84     =head2 layout
85    
86     my $layout = $strix->layout( $url );
87    
88     =cut
89    
90     sub layout {
91     my $self = shift;
92    
93     my $url = shift || confess "no url";
94    
95     my $dbh = $self->dbh;
96     my $category = $self->category( $url );
97    
98     my $sth = $dbh->prepare(qq{
99     SELECT template.tfilename, template.tflags FROM template WHERE id = ?
100     });
101     $sth->execute( $category->{template_id} );
102    
103     my $template = $sth->fetchrow_hashref() or die "can't fetch template";
104    
105     warn "template = ",dump( $template ) if $debug;
106    
107     my $page;
108     warn "### free layout...\n" if $debug;
109    
110     # index.php
111     $sth = $dbh->prepare(qq{
112     SELECT layout_id, module_id, pozicija, module_args, name, fname, notitle, class_name
113     FROM pre_layout, modules
114     WHERE id=module_id AND ? = template_id AND redoslijed >= 0
115     ORDER BY redoslijed DESC
116     });
117     $sth->execute( $category->{template_id} );
118    
119     while (my $row = $sth->fetchrow_hashref() ) {
120     warn dump( $row ) if $debug;
121     push @{ $page->{free} }, { $row->{name} => $row->{module_args} };
122     }
123    
124     warn "### pre layout...\n" if $debug;
125    
126     $sth = $dbh->prepare(qq{
127     SELECT
128     l.id as layout_id, l.user_id, l.kategorija_id, l.module_id, l.pozicija, l.redoslijed, l.module_args, l.state, l.notitle,
129     m.name, m.fname, m.hidden, m.nocache, m.pos, m.class_name,
130     acl_module.acl_register_id
131     FROM layout as l, modules as m LEFT JOIN acl_module ON (acl_module.modules_id = m.id)
132     WHERE l.user_id=?
133     AND l.kategorija_id=?
134     AND m.id=l.module_id
135     ORDER BY pozicija,redoslijed DESC
136     });
137     $sth->execute( 1, $category->{id} );
138    
139     while (my $row = $sth->fetchrow_hashref() ) {
140     warn dump( $row ) if $debug;
141     push @{ $page->{pre}->{ $row->{pos} } }, { $row->{name} => $row->{module_args} };
142     }
143    
144     warn "### post layout...\n" if $debug;
145    
146     $sth = $dbh->prepare(qq{
147     SELECT layout_id, module_id, pozicija, module_args, name, notitle
148     FROM pre_layout, modules
149     WHERE id=module_id AND ? = template_id AND redoslijed < 0
150     ORDER BY redoslijed DESC
151     });
152     $sth->execute( $category->{template_id} );
153    
154     while (my $row = $sth->fetchrow_hashref() ) {
155     warn dump( $row ) if $debug;
156     push @{ $page->{post}->{ $row->{pozicija} } }, { $row->{name} => $row->{module_args} };
157     }
158    
159     return $page;
160    
161     }
162    
163 dpavlin 169 =head2 sitemap
164    
165     my $sitemap = $strix->sitemap( $site_id, $uid );
166    
167     =cut
168    
169     sub sitemap {
170     my $self = shift;
171    
172     my ( $site_id, $uid ) = @_;
173     my $sitemap;
174    
175     my $query = "SELECT *, ( length(ordstr)/3 ) - 1 AS depth FROM site WHERE id = ?";
176     $query = "SELECT *, coalesce(( length(ordstr)/3 ) - 1,0) AS depth FROM site ORDER BY ordstr" unless $site_id;
177    
178     my $sth = $self->dbh->prepare( $query );
179     if ( $site_id ) {
180     $sth->execute( $site_id );
181     } else {
182     $sth->execute;
183     }
184    
185     while (my $row = $sth->fetchrow_hashref() ) {
186     warn dump( $row ) if $debug;
187    
188     $sitemap->{ $row->{naziv} } = $self->site_navigation( $site_id, $uid );
189     }
190    
191     return $sitemap;
192     }
193    
194     =head2 site_navigation
195    
196     my $navigation = $strix->site_navigation( $site_id, $uid );
197    
198     =cut
199    
200     sub site_navigation {
201     my $self = shift;
202    
203     my ( $site_id, $uid ) = @_;
204    
205     $uid ||= 1; # anonymous
206     # $uid ||= 2; # admin
207    
208     my $sth = $self->dbh->prepare(
209     "SELECT kategorija.*, ((length(prikaz)+length(coalesce(ordstr,'')))/3)-1 as depth FROM kategorija JOIN navigacija ON (kategorija.id = kategorija_id), site WHERE site_id = ? AND site.id = site_id AND userCanDoOnObject(?, 1, 'kats', kategorija.id) ORDER BY prikaz");
210     $sth->execute( $site_id, $uid );
211    
212     Jifty->log->debug("site $site_id has ", $sth->rows, " categories for uid $uid");
213    
214     my $navigation = [];
215    
216     my @pos = ( 0 );
217    
218     while (my $kat = $sth->fetchrow_hashref() ) {
219     warn "# kat = ",dump( $kat ) if $debug;
220     die "no depth" unless $kat->{depth};
221    
222     my $node = { type => 'category' };
223     foreach my $c ( qw/naziv url/ ) {
224     $node->{$c} = $kat->{$c};
225     }
226    
227     my $depth = $kat->{depth};
228     @pos = splice( @pos, 0, $depth );
229     $pos[ $depth - 1 ]++;
230    
231     warn "## category depth = $depth pos = ",dump( @pos );
232    
233     my $code = '$navigation';
234     map { $code .= '->[' . ( $_ - 1 ) . ']->{children}' } @pos;
235     $code =~ s/->{children}$//;
236     warn "## category code: $code\n";
237     eval $code . '= $node';
238     if ( $@ ) {
239     warn "SKIPPED CATEGORY: $@ ",dump( $kat );
240     next;
241     }
242    
243     my $sth_ms = $self->dbh->prepare(
244     "SELECT
245     multistatic.id, multistatic.title, multistatic.kname,
246     multistatic_navigation.kategorija_id, multistatic_navigation.prikaz,
247     (LENGTH(multistatic_navigation.prikaz)/3) AS depth
248     FROM multistatic, multistatic_navigation
249     WHERE multistatic.id = multistatic_navigation.multistatic_id
250     AND multistatic_navigation.prikaz != ''
251     AND multistatic_navigation.kategorija_id = ?
252     AND multistatic.title != ''
253     ORDER BY multistatic_navigation.prikaz");
254     $sth_ms->execute( $kat->{id} );
255    
256     if ( my $rows = $sth_ms->rows ) {
257     Jifty->log->debug("$site_id has $rows multistatic pages");
258    
259     while (my $ms = $sth_ms->fetchrow_hashref() ) {
260     warn "# ms = ",dump( $ms ) if $debug;
261    
262     my $node = {
263     naziv => $ms->{title},
264     url => $kat->{url} . '?ms_nav=' . $ms->{prikaz},
265     type => 'multistatic',
266     };
267    
268     my $ms_depth = $ms->{depth} + $depth;
269     my $p = $pos[ $ms_depth - 1 ]++;
270     warn "## multistatic depth = $ms_depth pos = ",dump( @pos );
271    
272     my $ms_code = $code . '->{children}->[ ' . $p . '] = $node';
273     warn "## multistatic code: $ms_code\n";
274     eval $ms_code;
275     if ( $@ ) {
276     warn "SKIPPED MULTISTATIC: $@ ",dump( $ms );
277     next;
278     }
279     }
280     }
281    
282     }
283    
284     return $navigation;
285    
286     }
287    
288 dpavlin 167 1;

  ViewVC Help
Powered by ViewVC 1.1.26