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 $self->{db_enable_utf8} = lc('@PGSQL_ENABLE_UTF@') eq 'yes' ? 1 : 0;
40 $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 $self->{convert_binary} = '@CONVERT@';
83 203 ahitrov $self->{file_web_storage} = lc('@FILE_WEB_STORAGE@');
84 8 ahitrov@rambler.ru
85 $self->{core_src} = '@CORE_SRC@';
86 $self->{plug_src} = '@PLUG_SRC@';
87 $self->{proj_src} = '@PROJ_SRC@';
88
89 $self->{log_dir} = '@PROJECT_LOG@';
90 $self->{run_dir} = '@PROJECT_RUN@';
91 $self->{tmp_dir} = '@PROJECT_TMP@';
92 $self->{usr_dir} = '@PROJECT_USR@';
93
94 $self->{var_dir} = '@PROJECT_VAR@';
95 $self->{data_dir} = $self->{var_dir};
96 $self->{data_directory} = $self->{var_dir};
97
98 $self->{preview} = '@PREVIEW@';
99 $self->{mason_comp} = '@MASON_COMP@';
100
101 $self->{auth_cookie} = '@AUTH_COOKIE@';
102
103 $self->{is_dev_server} = lc('@DEVELOPMENT@') eq 'yes';
104 $self->{development} = lc('@DEVELOPMENT@') eq 'yes';
105
106 $self->{contenido_version} = '@CONTENIDO_VERSION@' + 0;
107 $self->{version} = $self->{contenido_version};
108
109 $self->{__debug__} = (lc('@DEBUG@') eq 'yes');
110 $self->{__debug_format__} = '@DEBUG_FORMAT@';
111 $self->{__debug_stack_trace__} = lc('@DEBUG_STACK_TRACE@') eq 'yes';
112 $self->{__debug_min_level__} = '@DEBUG_MIN_LEVEL@';
113 $self->{__debug_max_level__} = '@DEBUG_MAX_LEVEL@';
114 $self->{__sql_debug__} = lc('@DEBUG_SQL@') eq 'yes';
115
116 $self->{project_name} = '@PROJECT_NAME@';
117 $self->{multidomain} = lc('@MULTIDOMAIN@') eq 'yes';
118 $self->{stage} = 'REAL';
119
120 $state->{readonly} = (lc('@READONLY@') eq 'yes');
121
122 $self->{store_method} = lc('@STORE_METHOD@');
123 $Contenido::Globals::store_method = $self->{store_method};
124
125 $self->{cascade} = (lc('@CASCADE@') eq 'yes');
126
127 $self->{locale} = '@LOCALE@';
128
129 # Конфигурационные параметры memcached
130 $self->{memcached_backend} = '@MEMCACHED_BACKEND@';
131 $self->{memcached_enable} = lc( '@MEMCACHED_ENABLE@' ) eq 'yes' ? 1 : 0;
132 $self->{memcached_select_timeout} = '@MEMCACHED_SELECT_TIMEOUT@' || 0.2;
133 $self->{memcached_servers} = [ split(/\s+/, '@MEMCACHED_SERVERS@') ];
134 $self->{memcached_enable_compress} = lc( '@MEMCACHED_ENABLE_COMPRESS@' ) eq 'yes' ? 1 : 0;
135 $self->{memcached_delayed} = lc('@MEMCACHED_DELAYED@') eq 'yes' ? 1 : 0;
136 $self->{memcached_set_mode} = lc('@MEMCACHED_SET_MODE@') eq 'add' ? 'add' : 'set';
137 $self->{memcached_namespace} = lc( $self->{'project'} ).'|';
138
139 $self->{memcached_object_expire} = undef;
140
141 $self->{options_expire} = '@OPTIONS_EXPIRE@';
142
143 $self->{preamble_handler} = '@PREAMBLE_HANDLER@';
144 $self->{preamble_handler_path} = '@PREAMBLE_HANDLER_PATH@';
145
146 $self->_refresh_();
147 $self->_init_();
148
149 my @plugins = split(/\s+/, $self->plugins());
150 for my $plugin ($self->{project}, @plugins) {
151 $self->{lc($plugin)} = {};
152 $self->{attributes}->{lc($plugin)} = 'SCALAR';
153
154 my $class = $plugin.'::State';
155 eval ("use $class");
156
157 if ( $@ ) {
158 warn "Contenido Error: Не могу определить состояние плагина $plugin ($class) по причине '$@'.\n";
159 } else {
160 warn "Contenido Init: Загружен класс $class для плагина $plugin.\n" if ($self->debug());
161 eval {
162 $self->{lc($plugin)} = $class->new();
163 };
164 if ( $@ ) {
165 warn "Contenido Error: Не могу выполнить инициализацию состояния плагина $plugin ($class) по причине '$@'.\n";
166 }
167 }
168 }
169
170
171
172
173 return $self;
174 }
175
176
177
178 sub _refresh_
179 {
180 my $self = shift;
181 $self->{debug} = $self->{__debug__};
182 #выставляем $DEBUG и $DEBUG_SQL в правильные значения!!!
183 $DEBUG_SQL = $self->{__sql_debug__};
184 $DEBUG = $self->{__debug__};
185 }
186
187
188 # ----------------------------------------------------------------------------
189 # Вывод информации об объекте...
190 # ----------------------------------------------------------------------------
191 sub info
192 {
193 my $self = shift;
194 return undef unless ref($self);
195
196 $log->info("Объект Contenido::State заполнен следующими параметрами:");
197 foreach my $attribute (sort (keys( %{ $self->{attributes} } )))
198 {
199 my $la = length($attribute);
200 warn "\t".$attribute.("\t" x (2-int($la/8))).": ".$self->{$attribute}."\n";
201 }
202
203 my @plugins = split(/\s+/, $self->plugins());
204 for my $plugin ($self->{project}, @plugins) {
205 if (ref($self->{lc($plugin)})) {
206 eval {
207 $self->{lc($plugin)}->info();
208 };
209 }
210 }
211 }
212
213
214
215 # ----------------------------------------------------------------------------
216 # Инициализация.
217 # - Создает внутри объекта хэш с типами полей - это нужно для быстрой
218 # работы метода AUTOLOAD...
219 # ----------------------------------------------------------------------------
220 sub _init_
221 {
222 my $self = shift;
223
224 foreach my $attribute ( qw(
225 project project_version
226
227 httpd_port httpd_server httpd_root
228 data_directory data_dir
229 images_directory images_dir
230 session_directory session_dir
231 binary_directory binary_dir
232 crosslinks_directory crosslinks_dir
233
234 stage
235 db_keepalive db_host db_name db_user db_password db_port db_type db_client_encoding db_enable_utf8
236 db_encode_data db_decode_data
237
238 mason_comp
239 multidomain
240 project_name
241 preview
242
243 proxy_image_location
244 proxy_image_secret
245
246 debug
247 auth_cookie
248
249 plugins
250
251 development
252 is_dev_server
253
254 contenido_version version
255
256 store_method cascade
257
258 readonly
259
260 locale
261
262 memcached_enable memcached_servers
263 memcached_select_timeout
264 memcached_backend memcached_enable_compress
265 memcached_set_mode
266 memcached_object_expire
267 memcached_namespace
268 convert_binary
269 ) )
270 {
271 $self->{attributes}->{ $attribute } = 'SCALAR';
272 }
273 }
274
275
276
277 # ----------------------------------------------------------------------------
278 # Это умный AUTOLOAD. Ловит методов для установки/чтения полей...
279 # Версия 0.2
280 # ----------------------------------------------------------------------------
281
282 sub AUTOLOAD
283 {
284 my $self = shift;
285 my $attribute = $AUTOLOAD;
286
287 $attribute =~ s/.*:://;
288 return undef unless $attribute =~ /[^A-Z]/; # Отключаем методы типа DESTROY
289
290 if (! exists($self->{attributes}->{$attribute}))
291 {
292 $log->error("Вызов метода, для которого не существует обрабатываемого свойства: ->$attribute()");
293 return undef;
294 }
295
296 $self->{ $attribute } = shift @_ if (scalar(@_) > 0);
297 return $self->{ $attribute };
298 }
299
300
301 1;