Line # Revision Author
1 8 ahitrov@rambler.ru package Contenido::State;
2
3 # ----------------------------------------------------------------------------
4 # Contenido::State - класс, описывающий текущее состояние проекта.
5 # Объект этого класса создается при старте Apache-сервера и заполняется
6 # данными из handler.pl или startup.pl. Конкретные данные (порт, URL,
7 # стадию и т.д.) изменяются в startup.pl с помощью стандартного механизма
8 # sandbox (@@PORT@@).
9 # ----------------------------------------------------------------------------
10
11 use strict;
12 use vars qw($VERSION $AUTOLOAD);
13 $VERSION = '4.2';
14
15 use Utils;
16 use Contenido::Globals;
17
18 use @MEMCACHED_BACKEND@;
19
20 sub new
21 {
22 my ($proto) = shift;
23 my $class = ref($proto) || $proto;
24 my $self = {};
25 bless($self, $class);
26
27 $self->{project} = '@PROJECT@';
28 $self->{project_version} = '@PROJECT_VERSION@';
29 $self->{core_version} = '@CORE_VERSION@';
30
31 $self->{db_type} = lc('@DB_TYPE@') || 'single';
32 $self->{db_keepalive} = (lc('@PERSISTENT_CONN@') eq 'no') ? 0:1;
33 $self->{db_host} = (($self->{db_type} eq 'remote') and '@BASE_HOST@') ? lc('@BASE_HOST@') : 'localhost';
34 $self->{db_name} = '@PGSQL_BASE@';
35 $self->{db_user} = '@BASE_USER@';
36 $self->{db_password} = '@BASE_PASSWD@';
37 $self->{db_port} = '@PGSQL_PORT@';
38 $self->{db_prepare} = lc('@PGSQL_REAL_PREPARE@') eq 'yes' ? 1 : 0;
39 567 ahitrov $self->{db_enable_utf8} = lc('@PGSQL_ENABLE_UTF@') eq 'yes' ? -1 : 0;
40 8 ahitrov@rambler.ru $self->{db_client_encoding} = '@PGSQL_CLIENT_ENCODING@';
41
42 $self->{db_encode_data} = '@PGSQL_ENCODE_DATA@';
43 $self->{db_decode_data} = '@PGSQL_DECODE_DATA@' || 'utf-8';
44
45 217 ahitrov $self->{serialize_with} = lc('@SERIALIZE_WITH@') || 'dumper';
46
47 8 ahitrov@rambler.ru $self->{master_db_host} = (($self->{db_type} eq 'remote') and '@MASTER_BASE_HOST@') ? lc('@MASTER_BASE_HOST@') : 'localhost';
48 $self->{master_db_name} = '@MASTER_BASE_NAME@';
49 $self->{master_db_user} = '@MASTER_BASE_USER@';
50 $self->{master_db_password} = '@MASTER_BASE_PASSWD@';
51 $self->{master_db_port} = '@MASTER_BASE_PORT@';
52
53 $self->{session_dir} = '@SESSIONS@';
54 $self->{session_directory} = '@SESSIONS@';
55
56 $self->{crosslinks_dir} = '@CROSSLINKS@';
57 $self->{crosslinks_directory} = '@CROSSLINKS@';
58
59 $self->{httpd_port} = '@HTTPD_PORT@';
60 $self->{httpd_server} = '@HTTPD_SERVER@';
61 $self->{httpd_root} = 'http://'.$self->{httpd_server}.'/';
62
63 $self->{plugins} = '@PLUGINS@';
64
65 $self->{prefix} = '@PREFIX@';
66
67 $self->{images_directory} = '@IMAGES@';
68 $self->{images_dir} = '@IMAGES@';
69
70 $self->{proxy_image_location} = '@PROXY_IMAGE_LOCATION@';
71 $self->{proxy_image_secret} = '@PROXY_IMAGE_SECRET@';
72
73
74 $self->{binary_directory} = '@BINARY@';
75 $self->{binary_dir} = '@BINARY@';
76
77 {
78 my $files_dir = '@FILES@';
79 $self->{files_dir} = [split /\s+/ms, $files_dir];
80 }
81
82 365 ahitrov $self->{composite_binary} = '@COMPOSITE@';
83 8 ahitrov@rambler.ru $self->{convert_binary} = '@CONVERT@';
84 203 ahitrov $self->{file_web_storage} = lc('@FILE_WEB_STORAGE@');
85 8 ahitrov@rambler.ru
86 $self->{core_src} = '@CORE_SRC@';
87 $self->{plug_src} = '@PLUG_SRC@';
88 $self->{proj_src} = '@PROJ_SRC@';
89
90 $self->{log_dir} = '@PROJECT_LOG@';
91 $self->{run_dir} = '@PROJECT_RUN@';
92 $self->{tmp_dir} = '@PROJECT_TMP@';
93 $self->{usr_dir} = '@PROJECT_USR@';
94
95 $self->{var_dir} = '@PROJECT_VAR@';
96 $self->{data_dir} = $self->{var_dir};
97 $self->{data_directory} = $self->{var_dir};
98
99 $self->{preview} = '@PREVIEW@';
100 $self->{mason_comp} = '@MASON_COMP@';
101
102 $self->{auth_cookie} = '@AUTH_COOKIE@';
103
104 $self->{is_dev_server} = lc('@DEVELOPMENT@') eq 'yes';
105 $self->{development} = lc('@DEVELOPMENT@') eq 'yes';
106
107 $self->{contenido_version} = '@CONTENIDO_VERSION@' + 0;
108 $self->{version} = $self->{contenido_version};
109
110 $self->{__debug__} = (lc('@DEBUG@') eq 'yes');
111 $self->{__debug_format__} = '@DEBUG_FORMAT@';
112 $self->{__debug_stack_trace__} = lc('@DEBUG_STACK_TRACE@') eq 'yes';
113 $self->{__debug_min_level__} = '@DEBUG_MIN_LEVEL@';
114 $self->{__debug_max_level__} = '@DEBUG_MAX_LEVEL@';
115 $self->{__sql_debug__} = lc('@DEBUG_SQL@') eq 'yes';
116
117 $self->{project_name} = '@PROJECT_NAME@';
118 $self->{multidomain} = lc('@MULTIDOMAIN@') eq 'yes';
119 $self->{stage} = 'REAL';
120
121 $state->{readonly} = (lc('@READONLY@') eq 'yes');
122
123 $self->{store_method} = lc('@STORE_METHOD@');
124 $Contenido::Globals::store_method = $self->{store_method};
125
126 $self->{cascade} = (lc('@CASCADE@') eq 'yes');
127
128 $self->{locale} = '@LOCALE@';
129
130 # Конфигурационные параметры memcached
131 $self->{memcached_backend} = '@MEMCACHED_BACKEND@';
132 $self->{memcached_enable} = lc( '@MEMCACHED_ENABLE@' ) eq 'yes' ? 1 : 0;
133 $self->{memcached_select_timeout} = '@MEMCACHED_SELECT_TIMEOUT@' || 0.2;
134 $self->{memcached_servers} = [ split(/\s+/, '@MEMCACHED_SERVERS@') ];
135 $self->{memcached_enable_compress} = lc( '@MEMCACHED_ENABLE_COMPRESS@' ) eq 'yes' ? 1 : 0;
136 $self->{memcached_delayed} = lc('@MEMCACHED_DELAYED@') eq 'yes' ? 1 : 0;
137 $self->{memcached_set_mode} = lc('@MEMCACHED_SET_MODE@') eq 'add' ? 'add' : 'set';
138 $self->{memcached_namespace} = lc( $self->{'project'} ).'|';
139
140 $self->{memcached_object_expire} = undef;
141
142 $self->{options_expire} = '@OPTIONS_EXPIRE@';
143
144 $self->{preamble_handler} = '@PREAMBLE_HANDLER@';
145 $self->{preamble_handler_path} = '@PREAMBLE_HANDLER_PATH@';
146
147 $self->_refresh_();
148 $self->_init_();
149
150 my @plugins = split(/\s+/, $self->plugins());
151 for my $plugin ($self->{project}, @plugins) {
152 $self->{lc($plugin)} = {};
153 $self->{attributes}->{lc($plugin)} = 'SCALAR';
154
155 my $class = $plugin.'::State';
156 eval ("use $class");
157
158 if ( $@ ) {
159 warn "Contenido Error: Не могу определить состояние плагина $plugin ($class) по причине '$@'.\n";
160 } else {
161 warn "Contenido Init: Загружен класс $class для плагина $plugin.\n" if ($self->debug());
162 eval {
163 $self->{lc($plugin)} = $class->new();
164 };
165 if ( $@ ) {
166 warn "Contenido Error: Не могу выполнить инициализацию состояния плагина $plugin ($class) по причине '$@'.\n";
167 }
168 }
169 }
170
171
172
173
174 return $self;
175 }
176
177
178
179 sub _refresh_
180 {
181 my $self = shift;
182 $self->{debug} = $self->{__debug__};
183 #выставляем $DEBUG и $DEBUG_SQL в правильные значения!!!
184 $DEBUG_SQL = $self->{__sql_debug__};
185 $DEBUG = $self->{__debug__};
186 }
187
188
189 # ----------------------------------------------------------------------------
190 # Вывод информации об объекте...
191 # ----------------------------------------------------------------------------
192 sub info
193 {
194 my $self = shift;
195 return undef unless ref($self);
196
197 $log->info("Объект Contenido::State заполнен следующими параметрами:");
198 foreach my $attribute (sort (keys( %{ $self->{attributes} } )))
199 {
200 my $la = length($attribute);
201 warn "\t".$attribute.("\t" x (2-int($la/8))).": ".$self->{$attribute}."\n";
202 }
203
204 my @plugins = split(/\s+/, $self->plugins());
205 for my $plugin ($self->{project}, @plugins) {
206 if (ref($self->{lc($plugin)})) {
207 eval {
208 $self->{lc($plugin)}->info();
209 };
210 }
211 }
212 }
213
214
215
216 # ----------------------------------------------------------------------------
217 # Инициализация.
218 # - Создает внутри объекта хэш с типами полей - это нужно для быстрой
219 # работы метода AUTOLOAD...
220 # ----------------------------------------------------------------------------
221 sub _init_
222 {
223 my $self = shift;
224
225 foreach my $attribute ( qw(
226 project project_version
227
228 httpd_port httpd_server httpd_root
229 data_directory data_dir
230 images_directory images_dir
231 session_directory session_dir
232 binary_directory binary_dir
233 crosslinks_directory crosslinks_dir
234
235 stage
236 db_keepalive db_host db_name db_user db_password db_port db_type db_client_encoding db_enable_utf8
237 db_encode_data db_decode_data
238
239 mason_comp
240 multidomain
241 project_name
242 preview
243
244 proxy_image_location
245 proxy_image_secret
246
247 debug
248 auth_cookie
249
250 plugins
251
252 development
253 is_dev_server
254
255 contenido_version version
256
257 store_method cascade
258
259 readonly
260
261 locale
262
263 memcached_enable memcached_servers
264 memcached_select_timeout
265 memcached_backend memcached_enable_compress
266 memcached_set_mode
267 memcached_object_expire
268 memcached_namespace
269 convert_binary
270 ) )
271 {
272 $self->{attributes}->{ $attribute } = 'SCALAR';
273 }
274 }
275
276
277
278 # ----------------------------------------------------------------------------
279 # Это умный AUTOLOAD. Ловит методов для установки/чтения полей...
280 # Версия 0.2
281 # ----------------------------------------------------------------------------
282
283 sub AUTOLOAD
284 {
285 my $self = shift;
286 my $attribute = $AUTOLOAD;
287
288 $attribute =~ s/.*:://;
289 return undef unless $attribute =~ /[^A-Z]/; # Отключаем методы типа DESTROY
290
291 if (! exists($self->{attributes}->{$attribute}))
292 {
293 $log->error("Вызов метода, для которого не существует обрабатываемого свойства: ->$attribute()");
294 return undef;
295 }
296
297 $self->{ $attribute } = shift @_ if (scalar(@_) > 0);
298 return $self->{ $attribute };
299 }
300
301
302 1;