Кодировка в веб-интерфейсе

109 views
Skip to first unread message

JasonX

unread,
May 12, 2008, 6:47:12 PM5/12/08
to cakebilling
Debian 4 etch r0

resin-3.0.24
postgresql-7.4
freeradius_1.1.7-1
radiusclient1_0.3.2-11
libradius1_0.3.2-11
java-common_0.25
postgresql-8.3-603.jdbc3.jar
sun-java5-jdk_1.5.0-14-1etch1

cake-1.0.3.war
cake-v1.0.1.sql

locale
LANG=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=


При первом старте resin выдал в логах такую ошибку

[00:43:46.205] Server[] starting
[00:43:46.206]
[00:43:46.206] Linux 2.6.18-4-686 i386
[00:43:46.209] Java 1.5.0_14-b03, 32, mixed mode, sharing, UTF-8, en,
Sun Microsystems Inc.
[00:43:46.210] resin.home = /opt/resin
[00:43:46.210] server.root = /opt/resin
[00:43:46.211]
[00:43:46.729] Host[] starting
[00:43:47.172] WebApp[http://localhost:8080] starting
[00:43:47.595] WebApp[http://localhost:8080/cake] starting
[00:43:48.675] WebApp[http://localhost:8080/resin-doc] starting
[00:43:48.771] WebApp[http://localhost:8080/resin-admin] starting
[00:43:48.854] http listening to *:8080
[00:43:48.903] hmux listening to localhost:6802
[00:43:48.905] Resin started in 3942ms
[00:44:05.729] Loading .tld files from global classpath
[00:44:07.774] Compiling local/Config.java
[00:44:07.774] Compiling local/datamodule.java
[00:44:12.460] local/datamodule.java:15: warning: unmappable character
for encoding UTF8
[00:44:12.460] String[] months = {"������", "�������", "�����",
"������", "���", "����", "����", "�������", "��������",
$[00:44:12.460] ^
[00:44:12.460] local/datamodule.java:15: warning: unmappable character
for encoding UTF8
[00:44:12.460] String[] months = {"������", "�������", "�����",
"������", "���", "����", "����", "�������", "��������",
$[00:44:12.460] ^
[00:44:12.460] local/datamodule.java:15: warning: unmappable character
for encoding UTF8

[00:44:12.542] local/datamodule.java:16: warning: unmappable character
for encoding UTF8
[00:44:12.542] String[] months2 = {"������", "�������", "����",
"������", "���", "����", "����", "������", "��������",
"$[00:44:12.542] ^
[00:44:12.542] local/datamodule.java:16: warning: unmappable character
for encoding UTF8
[00:44:12.542] String[] months2 = {"������", "�������", "����",
"������", "���", "����", "����", "������", "��������",
"$[00:44:12.542] ^
[00:44:12.542] local/datamodule.java:16: warning: unmappable character
for encoding UTF8
[00:44:12.542] String[] months2 = {"������", "�������", "����",
"������", "���", "����", "����", "������", "��������",
"$[00:44:12.542] ^
[00:44:12.542] local/datamodule.java:16: warning: unmappable character
for encoding UTF8
[00:44:12.542] String[] months2 = {"������", "�������", "����",
"������", "���", "����", "����", "������", "��������",
"$[00:44:12.542] ^
[00:44:12.542] local/datamodule.java:16: warning: unmappable character
for encoding UTF8
[00:44:12.542] String[] months2 = {"������", "�������", "����",
"������", "���", "����", "����", "������", "��������",
"$[00:44:12.542] ^
[00:44:12.542] local/datamodule.java:16: warning: unmappable character
for encoding UTF8
[00:44:12.542] String[] months2 = {"������", "�������", "����",
"������", "���", "����", "����", "������", "��������",
"$[00:44:12.558] ^
[00:44:12.558] local/datamodule.java:16: warning: unmappable character
for encoding UTF8
[00:44:12.558] String[] months2 = {"������", "�������", "����",
"������", "���", "����", "����", "������", "��������",
"$[00:44:12.558] ^
[00:44:12.558] local/datamodule.java:16: warning: unmappable character
for encoding UTF8
[00:44:12.558] String[] months2 = {"������", "�������", "����",
"������", "���", "����", "����", "������", "��������",
"$[00:44:12.558] ^
[00:44:12.558] local/datamodule.java:16: warning: unmappable character
for encoding UTF8
[00:44:12.558] String[] months2 = {"������", "�������", "����",
"������", "���", "����", "����", "������", "��������",
"$[00:44:12.558] ^
[00:44:12.558] local/datamodule.java:16: warning: unmappable character
for encoding UTF8
[00:44:12.558] String[] months2 = {"������", "�������", "����",
"������", "���", "����", "����", "������", "��������",
"$[00:44:12.558] ^
.........
....
.......
[00:44:12.558] local/datamodule.java:16: warning: unmappable character
for encoding UTF8
[00:44:12.558] String[] months2 = {"������", "�������", "����",
"������", "���", "����", "����", "������", "��������",
"$[00:44:12.558]
^
[00:44:12.558] Note: local/datamodule.java uses or overrides a
deprecated API.
[00:44:12.558] Note: Recompile with -Xlint:deprecation for details.
[00:44:12.558] 100 warnings
[00:44:12.584] Compiling _jsp/_index__jsp.java
[00:44:16.929] In-place class redefinition (HotSwap) is not
available. In-place class reloading during development requires
$[00:44:17.473] resin-file: init
[00:44:36.316] Compiling _jsp/__0act__jsp.java
Datamodule init.. [ok!]
select id from cake.users where login='admin' and pwd='1234'
select id from cake.users where id=1 and grp=1
---

И в веб-интерфейсе при кодировке win-1251, например, во вкладке
настроек

Системные настройки

Наименование Значение Описание Операции

отображается нормально, а в уже внутри поля "ОПИСАНИЕ"
, например, напротив clear_keepalive отображается чТЕНС ТПФБГЙЙ
УФБФЙУФЙЛЙ (Ч ДОСИ) (т.е. кракозябры)

Но нормально отображается "Добавление нового параметра" - "Новый
параметр" - "Добавить"

Если поставить KOI8-R с русские данные, которые отображались нормально
становятся кракозябрами, а кракозябры русскими.

Если поставить UTF-8 ни одни русские буквы не отображаются корректно -
одни квадратики

���������� ������ ���������


Debian утсновил специально без русификации, кстати с русифицированным
тоже самое.

Уважаемые разработчики в чём кроется причина? Уповаю на вашу
квалификацию.

Anatoly Shipitsin

unread,
May 12, 2008, 11:49:24 PM5/12/08
to cakeb...@googlegroups.com

При первом старте resin выдал в логах такую ошибку

Вообще-то это warning. И если перевести оно означает предупреждение, а не ошибку.

И в веб-интерфейсе при кодировке win-1251, например, во вкладке
настроек

Системные настройки

Наименование    Значение        Описание        Операции

отображается нормально, а в уже внутри поля "ОПИСАНИЕ"
, например, напротив clear_keepalive отображается чТЕНС ТПФБГЙЙ
УФБФЙУФЙЛЙ (Ч ДОСИ)  (т.е. кракозябры)
Как заливали дамп? И какой дамп заливался?

JasonX

unread,
May 13, 2008, 1:18:19 AM5/13/08
to cakebilling


Anatoly Shipitsin:
psql -h 127.0.0.1 -U cake -W -h 127.0.0.1 -d cake -f cake-v1.0.1.sql

JasonX

unread,
May 13, 2008, 1:22:08 AM5/13/08
to cakebilling
Предварительно была команда su postgres

Anatoly Shipitsin

unread,
May 13, 2008, 1:26:56 AM5/13/08
to cakeb...@googlegroups.com

psql -h 127.0.0.1 -U cake -W -h 127.0.0.1 -d cake -f cake-v1.0.1.sql
В какой кодировке создана база?

JasonX

unread,
May 13, 2008, 1:31:20 AM5/13/08
to cakebilling
su postgres
createdb -O cake -E WIN cake

Anatoly Shipitsin

unread,
May 13, 2008, 1:35:55 AM5/13/08
to cakeb...@googlegroups.com


13 мая 2008 г. 11:31 пользователь JasonX <Jas...@tut.by> написал:


su postgres
createdb -O cake -E WIN cake

psql -U postgres cake
в консоли
\l
И вывод сюда.

JasonX

unread,
May 13, 2008, 2:10:36 AM5/13/08
to cakebilling
Без su postgres?
Если без, то

psql -U postgres cake
psql: FATAL: IDENT authentication failed for user "postgres"

Anatoly Shipitsin

unread,
May 13, 2008, 2:13:16 AM5/13/08
to cakeb...@googlegroups.com


13 мая 2008 г. 12:10 пользователь JasonX <Jas...@tut.by> написал:


Без su postgres?
Если без, то

psql -U postgres cake
psql: FATAL:  IDENT authentication failed for user "postgres"
А с su вам конечно не судьба попробовать?


JasonX

unread,
May 13, 2008, 1:16:42 PM5/13/08
to cakebilling
Нужно было уходить не успел.
Вывод с su postgres:

psql -U postgres cake
Welcome to psql 7.4.16, the PostgreSQL interactive terminal.

Type: \copyright for distribution terms
\h for help with SQL commands
\? for help on internal slash commands
\g or terminate with semicolon to execute query
\q to quit

cake=# \l
List of databases
Name | Owner | Encoding
-----------+----------+----------
cake | cake | WIN
template0 | postgres | UNICODE
template1 | postgres | UNICODE
(3 rows)

Anatoly Shipitsin

unread,
May 13, 2008, 1:41:54 PM5/13/08
to cakeb...@googlegroups.com


13 мая 2008 г. 23:16 пользователь JasonX <Jas...@tut.by> написал:


Нужно было уходить не успел.
Вывод с su postgres:

psql -U postgres cake
Welcome to psql 7.4.16, the PostgreSQL interactive terminal.

Type:  \copyright for distribution terms
      \h for help with SQL commands
      \? for help on internal slash commands
      \g or terminate with semicolon to execute query
      \q to quit

cake=# \l
       List of databases
  Name    |  Owner   | Encoding
-----------+----------+----------
 cake      | cake     | WIN
Очень странно. Сделайте выборку из таблицы paramenters
Судя по всему у вас почему-то или не в той кодировке отображатся данные или же залиты в базу не в той кодировке.

JasonX

unread,
May 14, 2008, 11:43:25 AM5/14/08
to cakebilling
Если вы имели в виду выборку из таблицы cake.parameters, то вот она:

su postgres
psql -h 127.0.0.1 -Ucake cake -c "select * from cake.parameters;"
Password:
id | name | value |
comment
----+-----------------+---------------
+----------------------------------------------------------
1 | traffinterval | 60 | ������ ���������� ������ �
������� �������� (� ��������)
2 | ipnetmask | 255.255.255.0 | ����� ����������� ���
3 | max_traffout | 1073741824 | ������������ ������� ������ (�
������)
4 | min_pool_ip | 2 | ����������� ip ����� ������
5 | max_pool_ip | 254 | ������������ ip ����� ������
6 | idle_timeout | 7200 | &laquo;������&raquo; �������
(� ��������)
7 | ipsubnet | 192.168.2 | ����������� ������� (� �������
&laquo;x.x.x&raquo;)
8 | max_timeout | 43200 | ������������ ����� ������ (�
��������)
9 | clear_keepalive | 30 | ����� ������� ���������� (�
����)
(9 rows)


Я не знаю почему кракозяброй. Я ставил без русского языка.

Моя локаль:

Anatoly Shipitsin

unread,
May 14, 2008, 11:46:42 AM5/14/08
to cakeb...@googlegroups.com


14 мая 2008 г. 21:43 пользователь JasonX <Jas...@tut.by> написал:

Я не знаю почему кракозяброй. Я ставил без русского языка.

По этому и кракозяброй. \encoding utf8 делаем в консоли и затем делаем еще раз селект.

JasonX

unread,
May 14, 2008, 6:51:44 PM5/14/08
to cakebilling
su postgres
psql -U postgres cake
\encoding utf8
select * from cake.parameters;

id | name | value |
comment
----+-----------------+---------------
+----------------------------------------------------------
1 | traffinterval | 60 | рЕТЙПД ПВОПЧМЕОЙС ДБООЩИ П
ТБУИПДЕ ФТБЖЖЙЛБ (Ч УЕЛХОДБИ)
2 | ipnetmask | 255.255.255.0 | нБУЛБ ЧЙТФХБМШОПК УЕФЙ
3 | max_traffout | 1073741824 | нБЛУЙНБМШОЩК ФТБЖЖЙЛ УЕУУЙЙ (Ч
ВБКФБИ)
4 | min_pool_ip | 2 | нЙОЙНБМШОЩК ip БДТЕУ ЛМЙЕОФБ
5 | max_pool_ip | 254 | нБЛУЙНБМШОЩК ip БДТЕУ ЛМЙЕОФБ
6 | idle_timeout | 7200 | &laquo;уПООЩК&raquo; ФБКНБХФ
(Ч УЕЛХОДБИ)
7 | ipsubnet | 192.168.2 | чЙТФХБМШОБС РПДУЕФШ (Ч ЖПТНБФЕ
&laquo;x.x.x&raquo;)
8 | max_timeout | 43200 | нБЛУЙНБМШОПЕ ЧТЕНС УЕУУЙЙ (Ч
УЕЛХОДБИ)
9 | clear_keepalive | 30 | чТЕНС ТПФБГЙЙ УФБФЙУФЙЛЙ (Ч
ДОСИ)

Это при консоли в кодировке utf-8. При другой ещё хуже :)

Anatoly Shipitsin

unread,
May 14, 2008, 10:58:54 PM5/14/08
to cakeb...@googlegroups.com


15 мая 2008 г. 4:51 пользователь JasonX <Jas...@tut.by> написал:

su postgres
psql -U postgres cake
\encoding utf8
select * from cake.parameters;

 id |      name       |     value     |
comment
----+-----------------+---------------
+----------------------------------------------------------
 1 | traffinterval   | 60            | рЕТЙПД ПВОПЧМЕОЙС ДБООЩИ П
ТБУИПДЕ ФТБЖЖЙЛБ (Ч УЕЛХОДБИ)
 2 | ipnetmask       | 255.255.255.0 | нБУЛБ ЧЙТФХБМШОПК УЕФЙ
 3 | max_traffout    | 1073741824    | нБЛУЙНБМШОЩК ФТБЖЖЙЛ УЕУУЙЙ (Ч
ВБКФБИ)
 4 | min_pool_ip     | 2             | нЙОЙНБМШОЩК ip БДТЕУ ЛМЙЕОФБ
 5 | max_pool_ip     | 254           | нБЛУЙНБМШОЩК ip БДТЕУ ЛМЙЕОФБ
 6 | idle_timeout    | 7200          | &laquo;уПООЩК&raquo; ФБКНБХФ
(Ч УЕЛХОДБИ)
 7 | ipsubnet        | 192.168.2     | чЙТФХБМШОБС РПДУЕФШ (Ч ЖПТНБФЕ
&laquo;x.x.x&raquo;)
 8 | max_timeout     | 43200         | нБЛУЙНБМШОПЕ ЧТЕНС УЕУУЙЙ (Ч
УЕЛХОДБИ)
 9 | clear_keepalive | 30            | чТЕНС ТПФБГЙЙ УФБФЙУФЙЛЙ (Ч
ДОСИ)

Это при консоли в кодировке utf-8. При другой ещё хуже :)
У вас залито не в той кодировке. 


JasonX

unread,
May 15, 2008, 1:20:54 AM5/15/08
to cakebilling
Я заливал по инструкции http://code.google.com/p/cakebilling/wiki/ConfiguringPostgres
с помощью команды postgres@cake$ createdb -O cake -E WIN cake. Может
быть нужно согласовывать это как-то с локалью в Debian? Имхо ещё
особенность локализации?

jesem

unread,
May 15, 2008, 1:24:13 AM5/15/08
to cakeb...@googlegroups.com
База у вас в KOI загнана.

JasonX

unread,
May 15, 2008, 1:35:06 AM5/15/08
to cakebilling
В какой кодировке нужно?

jesem

unread,
May 15, 2008, 1:35:37 AM5/15/08
to cakeb...@googlegroups.com
Нужно в windows :)

JasonX

unread,
May 15, 2008, 1:50:31 AM5/15/08
to cakebilling
Но я прописывал ту команду, какую указывали в документации...

On 15 май, 09:35, jesem <jes...@gmail.com> wrote:
> Нужно в windows :)

Anatoly Shipitsin

unread,
May 15, 2008, 2:00:42 AM5/15/08
to cakeb...@googlegroups.com


15 мая 2008 г. 11:50 пользователь JasonX <Jas...@tut.by> написал:

Но я прописывал ту команду, какую указывали в документации...

On 15 май, 09:35, jesem <jes...@gmail.com> wrote:
> Нужно в windows :)

Какой именно файл заганялся на этой базе? Дело в том что в файле сначала идет переключение кодировки и затем уже загрузка данных, во избежание такой каши.

JasonX

unread,
May 15, 2008, 1:01:38 PM5/15/08
to cakebilling
debian:/home/# cat dists/cake/cake-v1.0.1.sql
SET client_encoding = 'WIN';
SET check_function_bodies = true;

CREATE SCHEMA cake AUTHORIZATION cake;

/* ������� ������� */
CREATE TABLE tariff (
id serial NOT NULL,
name varchar(50) DEFAULT 'New tariff' NOT NULL,
price_per_mb numeric(9,2) DEFAULT 0 NOT NULL,
ordr integer DEFAULT 0,
speed integer DEFAULT 0,

CONSTRAINT pk_tariff PRIMARY KEY (id),

CONSTRAINT tariff_name_key UNIQUE (name)

);

/* ������� � �������������� */
CREATE TABLE users (
id serial NOT NULL,
login varchar(20) NOT NULL,
name varchar(50) NOT NULL,
pwd varchar(20) DEFAULT 'pwd',
balance numeric(9,2) DEFAULT 0 NOT NULL,
userblock boolean DEFAULT false NOT NULL,
overtraffblock boolean DEFAULT true NOT NULL,
ip_addr int,
id_tariff int NOT NULL,
grp bigint DEFAULT 0,

CONSTRAINT pk_users PRIMARY KEY (id),
CONSTRAINT unilogin UNIQUE (login),
CONSTRAINT users_ip_addr_key UNIQUE (ip_addr),

CONSTRAINT fk_users_tariff FOREIGN KEY (id_tariff) REFERENCES
tariff(id) ON UPDATE CASCADE,

CONSTRAINT users_login_not_empty CHECK (((login)::text <>
''::text)),
CONSTRAINT users_name_not_empty CHECK (((name)::text <> ''::text))

);

CREATE INDEX index_login ON users USING hash (login);

/* ������� ������� �������� �������� */
CREATE TABLE pay (
id serial NOT NULL,
id_user int NOT NULL,
paydate timestamp DEFAULT now() NOT NULL,
volume numeric (9,2) DEFAULT 0 NOT NULL,
id_error_pay bigint,

CONSTRAINT pk_pay PRIMARY KEY (id),

CONSTRAINT fk_pay_users FOREIGN KEY (id_user) REFERENCES users(id)
ON UPDATE RESTRICT ON DELETE CASCADE

);

/* ������� ������ */
CREATE TABLE "session" (
id serial NOT NULL,
id_user int NOT NULL,
sid varchar(16) NOT NULL,
s_begin timestamp DEFAULT now() NOT NULL,
s_end timestamp,
svolume bigint DEFAULT 0 NOT NULL,
svolumeout bigint DEFAULT 0 NOT NULL,
s_last_update timestamp DEFAULT now(),

CONSTRAINT pk_session PRIMARY KEY (id),

CONSTRAINT fk_session_user FOREIGN KEY (id_user) REFERENCES
users(id) ON UPDATE RESTRICT ON DELETE CASCADE

);

CREATE UNIQUE INDEX indx_sid ON "session" USING btree (sid);

CREATE INDEX idx_session_begin ON "session" USING btree (s_begin);
CREATE INDEX idx_session_end ON "session" USING btree (s_end);

/* ������� ������������� ��������� ������ */
CREATE TABLE keepalive (
id serial NOT NULL,
id_session int NOT NULL,
kdatetime timestamp DEFAULT now() NOT NULL,
volumein bigint DEFAULT 0 NOT NULL,
volumeout bigint DEFAULT 0 NOT NULL,
diff_in bigint DEFAULT 0 NOT NULL,
diff_out bigint DEFAULT 0 NOT NULL,

CONSTRAINT pk_keepalive PRIMARY KEY (id),

CONSTRAINT fk_keepalive_session FOREIGN KEY (id_session)
REFERENCES "session"(id) ON UPDATE RESTRICT ON DELETE CASCADE

);

CREATE INDEX idx_keepalive_datetime ON keepalive USING btree
(kdatetime);

/* ������� ���������� */
CREATE TABLE parameters (
id serial NOT NULL,
name varchar(60) NOT NULL,
value varchar(60) NOT NULL,
"comment" varchar(100),

CONSTRAINT pk_parameters PRIMARY KEY (id),

CONSTRAINT uniname UNIQUE (name)
);

CREATE INDEX index_name ON parameters USING hash (name);

/*---------------------------------- ������� ������ � FreeRADIUS
�������� --------------------------*/
CREATE TYPE auth_reply AS (
id integer,
username varchar,
attribute varchar,
value varchar,
op varchar
);


-- �������� ������� �����
-- ����: �������� ���������� �������� � ��������� �����

CREATE FUNCTION check_idle_sessions() RETURNS void
AS '
DECLARE

restime timestamp := now() -
(((cake.getParameter(''traffinterval'')::int)*2)::varchar || ''
sec'')::interval;

BEGIN
UPDATE cake.session SET s_end = s_last_update
WHERE (s_end IS NULL) AND (s_last_update<restime);
RETURN;
END
'
LANGUAGE plpgsql VOLATILE;

CREATE FUNCTION auth_check(varchar) RETURNS SETOF auth_reply
AS '
DECLARE

runame ALIAS FOR $1;
sid integer;

r cake.auth_reply%ROWTYPE;
cuser cake.users%ROWTYPE;

BEGIN
-- �������� ������� �����
PERFORM cake.check_idle_sessions();

SELECT INTO cuser * FROM cake.users where runame=cake.users.login;

SELECT DISTINCT cake.session.id INTO sid FROM cake.session,
cake.users
WHERE (cake.session.id_user=cake.users.id) AND
(cake.session.s_end is null) AND
(cake.users.login=runame) LIMIT 1;

-- ���� ������������ ���� �� ���������� ������
IF ((cuser.login IS NOT NULL) AND (sid IS NULL)) AND
NOT ((cuser.balance<=0) AND (cuser.overtraffblock)) THEN
r.id := cuser.id;
r.username := cuser.login;
r.attribute := ''User-Password'';
r.value := cuser.pwd;
r.op := '':='';
RETURN NEXT r;
END IF;
RETURN;
END
'
LANGUAGE plpgsql STABLE;

CREATE FUNCTION auth_reply(varchar) RETURNS SETOF auth_reply
AS '
DECLARE

r cake.auth_reply%ROWTYPE;
runame ALIAS FOR $1;
cuser cake.users%ROWTYPE;

mb_price numeric(9,2);

traffout bigint := cake.getParameter(''max_traffout'')::bigint;

BEGIN
-- ������� ������������
SELECT INTO cuser * FROM cake.users WHERE runame=cake.users.login;

-- ���� �� �������� �� ������ �������� �����������
SELECT INTO mb_price price_per_mb FROM cake.tariff WHERE
id=cuser.id_tariff;

-- ���� ���� �� 0 � ����� ������������ ������ ���������,
-- �� ������� ����� ��������, ����� �������� �������
IF (mb_price<>0) AND (traffout>=round((cuser.balance*1048576)/
mb_price)) THEN
traffout := round((cuser.balance*1048576)/mb_price);
END IF;

-- ���� ������������� ������ � �������� ����������, ����������
����������
IF (traffout<=0) OR (cuser.userblock) THEN
traffout := 1;
END IF;

-- ���������� � ���������� reply �������
IF (cuser.login IS NOT NULL) THEN
r.id := cuser.id;
r.username := cuser.login;
r.op := '':='';
r.attribute := ''Framed-IP-Address'';
r.value := cake.getparameter(''ipsubnet'')||''.''||
cuser.ip_addr;
RETURN NEXT r;

r.attribute := ''Framed-IP-Netmask'';
r.value := cake.getparameter(''ipnetmask'');
RETURN NEXT r;

r.attribute := ''Session-Timeout'';
r.value := cake.getParameter(''max_timeout'');
RETURN NEXT r;

r.attribute := ''Idle-Timeout'';
r.value := cake.getparameter(''idle_timeout'');
RETURN NEXT r;

IF (cuser.overtraffblock) OR (cuser.userblock) THEN
r.attribute :=''Session-Octets-Limit'';
r.value := traffout::varchar;
RETURN NEXT r;
END IF;

r.attribute := ''Acct-Interim-Interval'';
r.value := cake.getparameter(''traffinterval'');
RETURN NEXT r;

r.attribute=''Octets-Direction'';
r.value=''2'';
RETURN NEXT r;
END IF;
RETURN;

END
'
LANGUAGE plpgsql STABLE;

CREATE FUNCTION str2sid(varchar) RETURNS integer
AS '
SELECT id from cake.session where cake.session.sid=$1
'
LANGUAGE 'SQL' STABLE;

CREATE FUNCTION str2uid(varchar) RETURNS integer
AS '
SELECT id from cake.users where cake.users.login=$1
'
LANGUAGE 'SQL' STABLE;

CREATE FUNCTION acct_update(varchar, bigint, bigint) RETURNS void
AS '
DECLARE

as_id integer;
sid ALIAS FOR $1;
vin ALIAS FOR $2;
vout ALIAS FOR $3;
ck cake.keepalive%ROWTYPE;
d_in bigint := 0;
d_out bigint := 0;

BEGIN
-- ������ ��� 7.4.x �� ������ ������������� � $1 � ����� DECLARE
as_id := cake.str2sid(sid);

-- �������� ��������� ���������� ������� ������� �����
SELECT INTO ck * FROM cake.keepalive WHERE id_session=as_id
ORDER BY kdatetime DESC LIMIT 1;

IF FOUND THEN
d_in := vout - ck.volumein;
d_out := vin - ck.volumeout;
ELSE
d_in := vout;
d_out := vin;
END IF;

-- ��������� ������ � ������������ ������� �������
INSERT INTO cake.keepalive (id_session, volumeout, volumein,
diff_in, diff_out )
VALUES ( as_id, vin, vout, d_in, d_out);

-- ��������� ��������� �������� � �����
UPDATE cake.session SET svolume=vin, svolumeout=vout,
s_last_update=now()
WHERE id=as_id;

RETURN;
END
'
LANGUAGE plpgsql VOLATILE;

CREATE FUNCTION start_session(varchar, varchar) RETURNS void
AS '
INSERT INTO cake.session (sid, id_user) VALUES ($1,
cake.str2uid($2))
'
LANGUAGE 'SQL' VOLATILE;

CREATE FUNCTION stop_session(bigint,bigint,varchar) RETURNS void
AS '
BEGIN
PERFORM acct_update($3,$2,$1);
UPDATE cake.session SET svolumeout=$1, svolume=$2, s_end=now()
WHERE id=cake.str2sid($3);
PERFORM clear_keepalive();
RETURN;
END
'
LANGUAGE plpgsql VOLATILE;
/*---------------------------------- ������� ������ � FreeRADIUS
�������� --------------------------*/

/*---------------------------------- ������� �������
-----------------------------------------------*/
CREATE TYPE mwb_report AS (
uname varchar,
ulogin varchar,
bal_cur numeric,
bal_mb numeric,
traf_week numeric,
cur_week numeric,
traf_month numeric,
cur_month numeric,
userblock boolean,
overtraffblock boolean
);

CREATE FUNCTION u_mwb_report() RETURNS SETOF mwb_report
AS '
DECLARE

cuser cake.users%ROWTYPE;
cumwb cake.mwb_report%ROWTYPE;
mb_price numeric;

BEGIN
FOR cuser IN SELECT * FROM cake.users LOOP
SELECT INTO mb_price price_per_mb FROM cake.tariff
WHERE cuser.id_tariff=cake.tariff.id;

cumwb.ulogin := cuser.login;
cumwb.uname := cuser.name;
cumwb.userblock := cuser.userblock;
cumwb.overtraffblock := cuser.overtraffblock;
cumwb.bal_cur := cuser.balance;

IF (mb_price >0) THEN
cumwb.bal_mb := cuser.balance/mb_price;
ELSE
SELECT INTO cumwb.bal_mb sum(svolume)/1048576 FROM
cake.session
WHERE ( cuser.id=cake.session.id_user);
IF cumwb.bal_mb IS NULL THEN
cumwb.bal_mb := 0;
END IF;
END IF;

SELECT INTO cumwb.cur_week sum(volume) FROM cake.pay
WHERE (id_user=cuser.id) AND ( paydate >
date_trunc(''month'', now()));

IF cumwb.cur_week IS NULL THEN
cumwb.cur_week := 0;
END IF;

IF (mb_price >0) THEN
cumwb.traf_week := cumwb.cur_week/mb_price;
ELSE
cumwb.traf_week := 0;
END IF;

SELECT INTO cumwb.traf_month sum(svolume)/1048576 FROM
cake.session
WHERE ( cuser.id=cake.session.id_user) AND
( cake.session.s_begin >= date_trunc(''month'', now()));

IF cumwb.traf_month IS NULL THEN
cumwb.traf_month := 0;
END IF;

cumwb.cur_month := (cumwb.traf_month*mb_price);

RETURN NEXT cumwb;

END LOOP;

RETURN;
END
'
LANGUAGE plpgsql STABLE;

CREATE FUNCTION u_mwb_report_all() RETURNS SETOF mwb_report
AS '
DECLARE

cuser cake.users%ROWTYPE;
cumwb cake.mwb_report%ROWTYPE;
cumwb_result cake.mwb_report%ROWTYPE;
mb_price numeric;

BEGIN
cumwb_result.bal_cur := 0;
cumwb_result.bal_mb := 0;
cumwb_result.traf_week := 0;
cumwb_result.cur_week := 0;
cumwb_result.traf_month := 0;
cumwb_result.cur_month := 0;


FOR cuser IN SELECT * FROM cake.users LOOP
SELECT INTO mb_price price_per_mb FROM cake.tariff
WHERE cuser.id_tariff=cake.tariff.id;

cumwb.ulogin := cuser.login;
cumwb.bal_cur := cuser.balance;

IF (mb_price>0) THEN
cumwb.bal_mb := cuser.balance/mb_price;
ELSE
SELECT INTO cumwb.bal_mb sum(svolume)/1048576 FROM
cake.session
WHERE ( cuser.id=cake.session.id_user);
IF cumwb.bal_mb IS NULL THEN
cumwb.bal_mb := 0;
END IF;
END IF;

cumwb_result.bal_cur := cumwb_result.bal_cur + cumwb.bal_cur;
cumwb_result.bal_mb := cumwb_result.bal_mb + cumwb.bal_mb;
RAISE NOTICE ''mb_bal: %'',cumwb.bal_mb;

SELECT INTO cumwb.cur_week sum(volume) FROM cake.pay
WHERE (id_user=cuser.id) AND (paydate >
date_trunc(''month'', now()));

IF cumwb.cur_week IS NULL THEN
cumwb.cur_week := 0;
END IF;

IF (mb_price>0) THEN
cumwb.traf_week := cumwb.cur_week/mb_price;
ELSE
cumwb.traf_week := 0;
END IF;

cumwb_result.traf_week := cumwb_result.traf_week
+cumwb.traf_week;
cumwb_result.cur_week := cumwb_result.cur_week+cumwb.cur_week;

SELECT INTO cumwb.traf_month sum(svolume)/1048576 FROM
cake.session
WHERE (cuser.id=cake.session.id_user) AND
(cake.session.s_begin >= date_trunc(''month'', now()));

IF cumwb.traf_month IS NULL THEN
cumwb.traf_month := 0;
END IF;

cumwb.cur_month := cumwb.traf_month*mb_price;

cumwb_result.traf_month := cumwb_result.traf_month
+cumwb.traf_month;
cumwb_result.cur_month := cumwb_result.cur_month
+cumwb.cur_month;
END LOOP;

RETURN NEXT cumwb_result;
RETURN;
END
'
LANGUAGE plpgsql STABLE;

CREATE FUNCTION u_mwb_report_user(varchar,varchar) RETURNS SETOF
mwb_report
AS '
DECLARE

ulogin ALIAS FOR $1;
upwd ALIAS FOR $2;
cuser cake.users%ROWTYPE;
cumwb cake.mwb_report%ROWTYPE;
mb_price numeric;

BEGIN
FOR cuser IN SELECT * FROM cake.users
WHERE (cake.users.login=ulogin) AND (cake.users.pwd=upwd) LOOP

SELECT INTO mb_price price_per_mb FROM cake.tariff
WHERE (cuser.id_tariff=cake.tariff.id);

cumwb.ulogin := cuser.login;
cumwb.uname := cuser.name;
cumwb.userblock := cuser.userblock;
cumwb.overtraffblock := cuser.overtraffblock;
cumwb.bal_cur := cuser.balance;

IF (mb_price>0) THEN
cumwb.bal_mb := cuser.balance/mb_price;
ELSE
SELECT INTO cumwb.bal_mb sum(svolume)/1048576 FROM
cake.session
WHERE ( cuser.id=cake.session.id_user);
IF cumwb.bal_mb IS NULL THEN
cumwb.bal_mb := 0;
END IF;
END IF;

SELECT INTO cumwb.cur_week sum(volume) FROM cake.pay
WHERE (id_user=cuser.id) AND (paydate >
date_trunc(''month'', now()));

IF cumwb.cur_week IS NULL THEN
cumwb.cur_week := 0;
END IF;

IF (mb_price>0) THEN
cumwb.traf_week := cumwb.cur_week/mb_price;
ELSE
cumwb.traf_week := 0;
END IF;

SELECT INTO cumwb.traf_month sum(svolume)/1048576 FROM
cake.session
WHERE (cuser.id=cake.session.id_user) AND
(cake.session.s_begin >=date_trunc(''month'', now()));

IF cumwb.traf_month IS NULL THEN
cumwb.traf_month := 0;
END IF;

cumwb.cur_month := cumwb.traf_month*mb_price;

RETURN NEXT cumwb;
END LOOP;
RETURN;
END
'
LANGUAGE plpgsql STABLE;
/*---------------------------------- ������� �������
-----------------------------------------------*/

/* ������� ������������ �������� ��������� */
CREATE FUNCTION getparameter(varchar) RETURNS text
AS '
SELECT value FROM cake.parameters WHERE name=$1
'
LANGUAGE 'SQL' STABLE;

/* ������� ������� ���������� */
CREATE OR REPLACE FUNCTION clear_keepalive() RETURNS void
AS '
DELETE FROM cake.keepalive
WHERE kdatetime <= date_trunc(''day'',now() -
(cake.getparameter(''clear_keepalive'') ||'' Days'')::interval)
'
LANGUAGE 'SQL' VOLATILE;

/* ������� ��������� ������ ip ������ �� ��������� ���� */
CREATE FUNCTION get_new_ip() RETURNS integer
AS'
DECLARE

new_ip integer;
min_pool_ip integer := cake.getParameter(''min_pool_ip'')::int;
max_pool_ip integer := cake.getParameter(''max_pool_ip'')::int;

BEGIN
SELECT INTO new_ip max(ip_addr) FROM cake.users;

IF (new_ip IS NULL) OR (new_ip+1 <= min_pool_ip) THEN
new_ip := min_pool_ip;
ELSE
IF new_ip+1 > max_pool_ip THEN
FOR i IN min_pool_ip..max_pool_ip LOOP
SELECT INTO new_ip ip_addr FROM cake.users WHERE
ip_addr=i;
IF NOT FOUND THEN
RETURN i;
ELSE
new_ip := NULL;
END IF;
END LOOP;
ELSE
new_ip := new_ip+1;
END IF;
END IF;

RETURN new_ip;
END
'
LANGUAGE plpgsql STABLE;

/* ������� ������ ip ������ �� ���� ��� ���������� ������ ������������
*/
CREATE FUNCTION set_ip_for_newuser_f() RETURNS "trigger"
AS '
BEGIN
IF (new.ip_addr IS NULL) THEN
new.ip_addr := cake.get_new_ip();
END IF;

RETURN new;
END
'
LANGUAGE plpgsql VOLATILE;

/* ������� ���������� ������� */
CREATE FUNCTION inc_balance() RETURNS "trigger"
AS '
DECLARE

cuser cake.users%ROWTYPE;

BEGIN
SELECT INTO cuser * FROM cake.users where new.id_user =
cake.users.id;
UPDATE cake.users SET balance=cuser.balance+new.volume
WHERE cake.users.id=new.id_user;
RETURN NULL;
END;
'
LANGUAGE plpgsql VOLATILE;

/* ������� ��������� ������� */
CREATE FUNCTION update_balance(int, numeric) RETURNS integer
AS '
DECLARE

cuser cake.users%ROWTYPE;
uid ALIAS FOR $1;
new_balance ALIAS FOR $2;

BEGIN
SELECT INTO cuser * FROM cake.users WHERE cake.users.id=uid;
IF FOUND AND round((new_balance - cuser.balance)*100)<>0 THEN
INSERT INTO cake.pay (id_user,volume) VALUES (uid,
(new_balance - cuser.balance));
RETURN round(new_balance - cuser.balance);
ELSE
RETURN NULL;
END IF;
END;
'
LANGUAGE plpgsql VOLATILE;

/* ������� ���������� ������� ������������ */
CREATE FUNCTION dec_user_balance_f() RETURNS "trigger"
AS '
DECLARE

oldbalance numeric;
uid integer;
mb_price numeric;

BEGIN
-- ������ id � ������ �����������
SELECT INTO uid, oldbalance id, balance FROM cake.users WHERE
old.id_user=cake.users.id;

-- ������ ����� �������� ������������
SELECT INTO mb_price price_per_mb from cake.users, cake.tariff
WHERE (cake.users.id_tariff=tariff.id) AND
(cake.users.id=old.id_user);

-- ���� ����� ������ ����, �� ��������� �����
IF (mb_price>0) THEN
UPDATE cake.users SET balance=oldbalance-((new.svolume-
old.svolume)*mb_price)/1048576
WHERE cake.users.id=old.id_user;
END IF;
RETURN NULL;
END
'
LANGUAGE plpgsql VOLATILE;

/* ������� ��� �������� �������� */
CREATE TRIGGER inc_balance_on_ins_pay
AFTER INSERT ON pay
FOR EACH ROW
EXECUTE PROCEDURE inc_balance();


/* ������� ��� ��������� ������ ip ������ */
CREATE TRIGGER set_ip_for_newuser
BEFORE INSERT ON users
FOR EACH ROW
EXECUTE PROCEDURE set_ip_for_newuser_f();

/* ������� ���������� ������� ������������ */
CREATE TRIGGER dec_user_balance
AFTER UPDATE ON "session"
FOR EACH ROW
EXECUTE PROCEDURE dec_user_balance_f();

INSERT INTO parameters (name,value,"comment") VALUES ('traffinterval',
'60', '������ ���������� ������ � ������� �������� (� ��������)');
INSERT INTO parameters (name,value,"comment") VALUES ('ipnetmask',
'255.255.255.0', '����� ����������� ����');
INSERT INTO parameters (name,value,"comment") VALUES ('max_traffout',
'1073741824', '������������ ������� ������ (� ������)');
INSERT INTO parameters (name,value,"comment") VALUES ('min_pool_ip',
'2', '����������� ip ����� �������');
INSERT INTO parameters (name,value,"comment") VALUES ('max_pool_ip',
'254', '������������ ip ����� �������');
INSERT INTO parameters (name,value,"comment") VALUES
('idle_timeout','7200', '&laquo;������&raquo; ������� (� ��������)');
INSERT INTO parameters (name,value,"comment") VALUES
('ipsubnet','192.168.2', '����������� ������� (� �������
&laquo;x.x.x&raquo;)');
INSERT INTO parameters (name,value,"comment") VALUES ('max_timeout',
'43200', '������������ ����� ������ (� ��������)');
INSERT INTO parameters (name,value,"comment") VALUES
('clear_keepalive', '30', '����� ������� ���������� (� ����)');


INSERT INTO tariff (name,price_per_mb) VALUES ('��������',1.00);

INSERT INTO users (login, name, pwd, balance, userblock,
overtraffblock, ip_addr, id_tariff ,grp) VALUES('admin', 'Admin',
'1234', 0.00, 'f', 't', 2, 1, 1);

Anatoly Shipitsin

unread,
May 15, 2008, 11:36:15 PM5/15/08
to cakeb...@googlegroups.com


15 мая 2008 г. 23:01 пользователь JasonX <Jas...@tut.by> написал:

debian:/home/# cat dists/cake/cake-v1.0.1.sql
SET client_encoding = 'WIN';
SET check_function_bodies = true;
ну и нафига вы сюда всю портянку запостили?

И почему у меня так?

wget http://cakebilling.googlecode.com/files/cake-v1.0.1.sql
cat cake-v1.0.1.sql | grep encodi
SET client_encoding = 'KOI8-R';


JasonX

unread,
May 16, 2008, 4:59:01 AM5/16/08
to cakebilling
Ура! Проблема с кодировкой решена! Спасибо админам за терпение и
содействие!

On May 16, 6:36 am, "Anatoly Shipitsin" <norguh...@gmail.com> wrote:
> 15 мая 2008 г. 23:01 пользователь JasonX <Jas...@tut.by> написал:
>
> > debian:/home/# cat dists/cake/cake-v1.0.1.sql
> > SET client_encoding = 'WIN';
> > SET check_function_bodies = true;
>
> ну и нафига вы сюда всю портянку запостили?
>
> И почему у меня так?
>
> wgethttp://cakebilling.googlecode.com/files/cake-v1.0.1.sql
Message has been deleted

Nes

unread,
May 21, 2008, 7:36:43 AM5/21/08
to cakebilling
PostgreSQL версии 8.3.1 (ubuntu server 8.04)

Anatoly Shipitsin

unread,
May 21, 2008, 7:43:06 AM5/21/08
to cakeb...@googlegroups.com


21 мая 2008 г. 17:09 пользователь Nes <nes...@gmail.com> написал:

postgres@d:/home/dom/Desktop/cake src$ createdb -O cake -E WIN cake
createdb: создание базы данных не удалось: ERROR:  encoding WIN1251
does not match server's locale ru_RU.UTF-8
DETAIL:  The server's LC_CTYPE setting requires encoding UTF8.
Возьмите словарь и переведите.

Nes

unread,
May 22, 2008, 2:50:34 AM5/22/08
to cakebilling
легко, только проблему с локалью это не решает.

# locale -a | grep ru
ru_RU.cp1251
ru_RU.utf8
ru_UA.utf8


# ./initdb --lc-ctype=win1251
initdb: директория данных не указана
Вы должны указать директорию для расположения данных для
для этой системы. Это можно сделать с помощью указания опции -D
или установки переменной окружения PGDATA.

Есть так же совет:
"Документацию читать.
initdb -D /usr/local/pgsql/data --locale=ru_RU.UTF-8
createdb --encoding=win1251 windoze"

Где брать этот "/usr/local/pgsql/data" и какие это данные я хз.

или

"/usr/local/etc/rc.d/postgresql initdb --locale=Russian_Russia.1251 --
encoding=WIN1251"

Большего гугл не дал, идеи будут?

Anatoly Shipitsin

unread,
May 22, 2008, 2:57:46 AM5/22/08
to cakeb...@googlegroups.com


22 мая 2008 г. 12:50 пользователь Nes <nes...@gmail.com> написал:

легко, только проблему с локалью это не решает.
Решает если понимать, что делаете.
 
#  ./initdb --lc-ctype=win1251
initdb: директория данных не указана
Вы должны указать директорию для расположения данных для
для этой системы.  Это можно сделать с помощью указания опции -D
или установки переменной окружения PGDATA.

Оно все правильно пишет. И если бы вы почитали что такое PGDATA то вопросов бы небыло.

Есть так же совет:
"Документацию читать.
initdb -D /usr/local/pgsql/data --locale=ru_RU.UTF-8
createdb --encoding=win1251 windoze"

Где брать этот "/usr/local/pgsql/data" и какие это данные я хз.

Если бы вы прочитали чт отакое PGDATA то вам бы стало понятно что -D указывает место,
где будет расположена первоначальная база данных.


Большего гугл не дал, идеи будут?

Идея одна. Почитать документацию PostgreSQL, особенно про то что такое PGDATA.
И перестаньте задавать в группе вопросы не по биллингу.

Nes

unread,
May 22, 2008, 5:56:43 AM5/22/08
to cakebilling
Спасибо, займусь.
Вопрос по биллингу. Зачем используется кодировка WIN, можно без нее
обойтись?

Anatoly Shipitsin

unread,
May 22, 2008, 5:59:35 AM5/22/08
to cakeb...@googlegroups.com


22 мая 2008 г. 15:56 пользователь Nes <nes...@gmail.com> написал:

Вопрос по биллингу. Зачем используется кодировка WIN, можно без нее
обойтись?
Если вы посмотрите. то увидите что веб-интерфейс использует именно эту кодировку. Хотя на самом деле совершенно без разницы в какой кодировке базу создавать. Главное чтобы русский там поддерживался.

JasonX

unread,
May 26, 2008, 8:27:40 AM5/26/08
to cakebilling
Попробуй
psql -h 127.0.0.1 -U cake -W -h 127.0.0.1 -d cake -f cake-v1.0.1.sql

Nes

unread,
Jun 6, 2008, 7:55:16 AM6/6/08
to cakebilling
> Если вы посмотрите. то увидите что веб-интерфейс использует именно эту
> кодировку. Хотя на самом деле совершенно без разницы в какой кодировке базу
> создавать. Главное чтобы русский там поддерживался.
Рискнул создать базу в UTF-8, во всех файлах заменил win на UTF8.
Результат подсунул Netbeans 6.1 -> tomcat6
Все супер. Однако, если создавать пользователя на русском...
возвращаются крякозябры :(
PS: понимаю что вопрос не по биллингу. Поставил целью разобраться и
допилить под свои нужды.

Nes

unread,
Jun 6, 2008, 1:38:28 PM6/6/08
to cakebilling
Все получилось, сконвертил в utf-8 собрался war для томкат 6.
если кому нада стучите.

jesem

unread,
Jun 6, 2008, 10:42:58 PM6/6/08
to cakeb...@googlegroups.com
Да, в стародавние времена в дубовой WIN кодировке все было сделано из за того, что под рукой не было нормального UTF редактора :). Если надо, давайте действительно обновим и WAR и БД и инструкцию.

Nes

unread,
Jun 7, 2008, 6:04:23 AM6/7/08
to cakebilling
Выложил 2 файла, war + sql, если что то найдете, напишите.
драйвер к db вложен такой: postgresql-8.3-603.jdbc3.jar
По просьбе выложу проект от NetBeans 6.1.
PS: только начал осваивать яву, но есть опыт программирования в дельфи.
Reply all
Reply to author
Forward
0 new messages