:: Visual Foxpro, Foxpro for DOS
Re: как программно сделать приватную датасесию
of63

Сообщений: 25256
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
А пока все живы, обсуждают старую шнягу DS, от команды Fox-MS. Спорное удобство, как виртуальная машина, на твоей машине. Не компе представить можно, а на реально авто - сложно понять. Я понял механику DS как: что мол, когда фокус переходит на форму с приватной DS, то SET-ы и открытые таблички видны только открытые в это DS. Отношения польза/вред не прочуствовал, и не использую )

Доб. Аа, извините. Это топик уже о том, где размещать код программы общения с БД: целиком в фоксе (клиенте), или в T-SQL при БД, или промежуточные варианты ) Старый добрый спор остроконечников и тупоконечников

Доб. Если что, я за В.Максимова - минимум кода в БД, остальное - в клиенте.



Исправлено 2 раз(а). Последнее : of63, 17.03.17 20:05
Ratings: 0 negative/0 positive
Re: как программно сделать приватную датасесию
Simple777

Сообщений: 33855
Дата регистрации: 05.11.2006
Это ты понятно объяснил (если это правда). Дак если это так, то такого рода DS можно было использовать и в FPD. Там были команды COPY TO VIEW и SET VIEW TO, что напоминает приватные датасессии.
Тоже никогда не использовал.
Ratings: 0 negative/0 positive
Re: как программно сделать приватную датасесию
of63

Сообщений: 25256
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
В ФПД было что-то под названием ...REGION что-ли. Я не понял, и тоже не использовал
Ratings: 0 negative/0 positive
Re: как программно сделать приватную датасесию
AndyNigmatec

Сообщений: 1574
Откуда: Волгоград
Дата регистрации: 28.06.2015
Достопочтенный of63 так шутит?
Ratings: 0 negative/0 positive
Re: как программно сделать приватную датасесию
of63

Сообщений: 25256
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
Андрей, о чем я шучу?. Был оператор в при форме в ФПД, типа что-то REGION, Вот ты заинтересовался, взял бы и нашел наличие/отсутствие этого оператора или предиката (как там у вас). И меня бы подтвердил, или осмеял
Ratings: 0 negative/0 positive
Re: как программно сделать приватную датасесию
PaulWist

Сообщений: 14625
Дата регистрации: 01.04.2004
Igor Korolyov
PaulWist
Т.е. с черным ящиком для конкретной БД может работать ЛЮБОЙ клиент (почти любой)
Точно так же как и с "сервисами". Ты используешь egruil или как там его... Курсы валют ЦБ? Данные из 1це или какой другой работающей у твоего клиента системы?
И тебе есть дело до того как оно там всё реализовано - на ХП, или в коде сервиса

Мне тоже по барабану как у них устроено - это их головная боль!

Igor Korolyov
очему же тогда настаиваешь что только на ХП будет правильно (попутно отдавая доступ к БД абы кому, тогда как при работе слоя сервисов БД напрямую вообще никому не видна - не сможет злой/кривой клиент заDDoS-ить её, или пролезть через какую дыру в самой СУБД).

Потому что, СУБД - это "двое в одном флаконе", БЛ и данные.

В моём случае БД может и существует независимо от "посторонних" компонентов.

В твоём же случае, у тебя два отдельных флакона, которые друг без друга существовать не могут. Вот если бы средний слой просто транслировал вызовы к СУБД, а не управлял бы ей, то я бы первый спросил: "Уважаемый научи" (с) к/ф Не бойся я с тобой

Разница в этом.

Igor Korolyov
При чём тут маркетинг? Это жизнь. Чем гибче решение, тем лучше.
PaulWist
но как всегда у этого плюса есть обратная сторона в качестве БД - набор таблиц
Да по барабану клиенту (челу который будет пользоваться ПО) набор таблиц там или не набор Ему надо чтобы адекватно работало и решало его задачи.
Чем был хорош фокс? Он позволял быстро и просто решить задачи юзера. Пока в течении нескольких лет на паскале писался интерфейс, на сях свой апп-сервер а на tsql логика в БД, кондовый фоксовик успевал уже сдать проект.

В 10-ый раз повторяю, я не против твоего подхода, ты сознательно идешь и берёшь на себя риск возможного нарушения БЛ, ... если ты так делаешь, значит готов потом расхлёбывать получившуюся кашу, ... добавить больше нечего.


------------------
Есть многое на свете, друг Горацио...
Что и не снилось нашим мудрецам.
(В.Шекспир Гамлет)




Исправлено 1 раз(а). Последнее : PaulWist, 17.03.17 21:45
Ratings: 0 negative/0 positive
Re: как программно сделать приватную датасесию
AndyNigmatec

Сообщений: 1574
Откуда: Волгоград
Дата регистрации: 28.06.2015
Да я не про фпд, я про это
of63
DS ... Отношения польза/вред не прочуствовал, и не использую

З.Ы. в спор мэтров не вмешиваюсь - но тож интерестно - на чем порешат в итоге. У меня у самого все гораздо проще и тривиальнее - клиент-сервер, двухзвенка, никакого промежуточного слоя, все в локальной сети, логика размазана частью по коду, частью в БД в ХП - если честно делал как удобнее методом проб и ошибок, без глубокого погружения в теорию.



Исправлено 3 раз(а). Последнее : AndyNigmatec, 17.03.17 21:55
Ratings: 0 negative/0 positive
Re: как программно сделать приватную датасесию
PaulWist

Сообщений: 14625
Дата регистрации: 01.04.2004
Аспид
PaulWist
Ещё раз, такой подход МОЖЕТ существовать, только я его считаю НЕПРАВИЛЬНЫМ.
Так это все поняли)
Я и пытаюсь столкнуть. Ну почему?
Я повторюсь. Наверное фокс не лучший кандидат в средний слой.
Но софт (шарп) использующий ОРМ.
Ну удобнее там просто.
Речь не веду о целостности констрейнах.
Говорю о БЛ. О сложных процедурах.
К тому же, именно они подвержены наиболее частым изменениям.
Ну проще... есть объект, у него несколько методов. Все обычно. Легко находится, меняется,тестируется.
T-SQL как упоминали, совсем другой(
Да, и по мне, так для другого создан.

1. Если удобно, то делай, тут возражений нет.

2. БЛ и сложные процедуры, должны решаться не клиентом БД, а самой БД или ты считаешь, что сейчас самый раз реинкарнации фокса только на другом уровне (шарпе), мы уже так все писали, какие "монстры" получались ты сам знаешь.

3. ХП, триггер меняется так, что юзер об этом даже не заметит, более того, он не заметит, что данные стали приходить из другой таблицы или даже с другого сервера, для "клиента" вызов останется одним и тем же.


------------------
Есть многое на свете, друг Горацио...
Что и не снилось нашим мудрецам.
(В.Шекспир Гамлет)
Ratings: 0 negative/0 positive
Re: как программно сделать приватную датасесию
of63

Сообщений: 25256
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
Андрей, у них теория думаешь? Она есть, и у них и у тебя, несколько "теорий". При случае упоминается некие гении-теоретики "Дейкстра" (ИК еще упомоминает на букву Д товарища, я щас не помню, и не читал), или еще кто. Но ваять прогу/БД именно тебе )
Ratings: 0 negative/0 positive
Re: как программно сделать приватную датасесию
AndyNigmatec

Сообщений: 1574
Откуда: Волгоград
Дата регистрации: 28.06.2015
У меня "програмерство" это как бонус к основным обязанностям - поэтому использую сугубо практический подход.
Именно поэтому и решил что это ты пошутил насчет того что не использовал DS - ну не поверю что у тебя все в одной датасессии крутилось/крутится ... опять же - я не про фпд - я уж даж не помню как там что - настолько давно это было



Исправлено 1 раз(а). Последнее : AndyNigmatec, 17.03.17 22:07
Ratings: 0 negative/0 positive
Re: как программно сделать приватную датасесию
PaulWist

Сообщений: 14625
Дата регистрации: 01.04.2004
AndyNigmatec
З.Ы. в спор мэтров не вмешиваюсь - но тож интерестно - на чем порешат в итоге. У меня у самого все гораздо проще и тривиальнее - клиент-сервер, двухзвенка, никакого промежуточного слоя, все в локальной сети, логика размазана частью по коду, частью в БД в ХП - если честно делал как удобнее методом проб и ошибок, без глубокого погружения в теорию.

Решения ты здесь не найдёшь, этот StarWars спор продолжается если не соврать лет десять, он периодически возникает (либо весной либо осенью, всякие аналогии прошу не проводить ), пока оппоненты остаются при своём мнении.

Со своей стороны могу сказать, что именно размазанность кода между клиентом и сервером меня привела к тому, что бизнес-логика должна быть сосредоточена в одном месте, в тот момент у меня был "толстый" клиет, поэтому БЛ перенёс в СУБД (оппоненты скажут надо перенести в средний слой, что на мой взгляд неправильно, но не суть), главное ты сразу почувствуешь разницу, тебе не надо будет помнить о многих вещях, на твой front-end будут передаваться подготовленные данные, а также на back-end будут "уходить" клиентские данные в интерфейс посредника (либо ХП, либо среднего слоя), если данные корректные, то ты получишь "одобрение" посредника, если не корректные, то получишь ошибку.

Таким образом, конечный клиент будет освобожден от несвойственной ему работы.


------------------
Есть многое на свете, друг Горацио...
Что и не снилось нашим мудрецам.
(В.Шекспир Гамлет)




Исправлено 1 раз(а). Последнее : PaulWist, 17.03.17 22:11
Ratings: 0 negative/0 positive
Re: как программно сделать приватную датасесию
of63

Сообщений: 25256
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
Андрей, не слушай их (они сами друг друга, и себя уже не понимают), делай как посчитаешь нужным. А их споры... ну так... послушай... Доживешь до их/наших лет - поймешь )))
Ratings: 0 negative/0 positive
Re: как программно сделать приватную датасесию
AndyNigmatec

Сообщений: 1574
Откуда: Волгоград
Дата регистрации: 28.06.2015
Не, именно почитывая (и кстати именно здесь) подобные споры и наловчился когда-то на фоксе ... И, также когда-то начитавшись подобного (я в том момент как раз спрыгнул с dbf на нормальную БД) и была у меня попытка все в БД запхать ... но не хватило тяму/знаний/упорства - в итоге - имеем что имеем )))
Ratings: 0 negative/0 positive
Re: как программно сделать приватную датасесию
PaulWist

Сообщений: 14625
Дата регистрации: 01.04.2004
of63
Андрей, не слушай их (они сами друг друга, и себя уже не понимают), делай как посчитаешь нужным. А их споры... ну так... послушай... Доживешь до их/наших лет - поймешь )))

Ты это, ... ты кого это ... назвал старыми маразматиками земляным червяком (с) м/ф Маугли


------------------
Есть многое на свете, друг Горацио...
Что и не снилось нашим мудрецам.
(В.Шекспир Гамлет)




Исправлено 1 раз(а). Последнее : PaulWist, 18.03.17 07:17
Ratings: 0 negative/0 positive
Re: как программно сделать приватную датасесию
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
AndyNigmatec
У меня у самого все гораздо проще и тривиальнее - клиент-сервер, двухзвенка, никакого промежуточного слоя, все в локальной сети, логика размазана частью по коду, частью в БД в ХП - если честно делал как удобнее методом проб и ошибок, без глубокого погружения в теорию.
Дело в том что когда говорят про клиент-сервер и 3-звенку то обычно имеют в виду именно количество отдельных программных компонент, а когда говорят про "слои" БД/БЛ/GUI - то имеют в виду скорее "логическое" разделение кода. В самом "тупом" случае даже на фоксе с dbf-ами (когда по сути только один exe имеется - никаких "серверов", "сервисов" и прочих сложных штук) вполне можно "разделить слои". Банально не писать "расчёты" в коде кнопок, использовать те же триггера (хотя они и сильно ограничены, но кое что умеют делать сносно) Вот ХП в dbc не имеют существенных отличий от "просто процедур" - только что хранятся в dbc и потому их сложнее изменять в продуктивной системе. Работают они по сути так же как и "простой код приложения".

Т.е. если с идеей "разделения слоёв" вообще нет никаких споров - это правильно и так и надо делать в сколь-нибудь большой программе, то все споры вокруг того куда нужно каждый слой запихивать если работает как минимум 2 разных компонента - внешняя "большая" СУБД и "пользовательский exe" или, к примеру, "веб-прога". А если ещё и появляется выделенный "сервер приложений" (про что и говорят 3-звенка) то становится ещё интереснее.
Вот Павел настаивает что слой данных И слой БЛ обязаны жить в СУБД.
Ты, как я понял, считаешь что слой БЛ можно размазать между СУБД и "клиентом" (что-то в ХП, что-то в коде клиента). Я тоже так считаю Главное чтобы в коде клиента эти самые элементы БЛ не оказались в Click кнопок Чтобы они были чётко отделены от кода чисто "поддерживающего пользовательской ввод".


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: как программно сделать приватную датасесию
AndyNigmatec

Сообщений: 1574
Откуда: Волгоград
Дата регистрации: 28.06.2015
Игорь, тут я не то чтобы считаю - а "так получилось" ))) Поэтому то и интерестно смотреть/читать как у других "получается" и что это им дает.

По поводу подхода Паши - тоже когда то хотел так сделать именно желая чтоб все в одном месте было и БД стала бы "вещью в себе" - но тогда не осилил (все-таки процедурный язык в firebird-е который использую "победнее"), а сейчас пожалуй уже бы и не стал так делать.



Исправлено 1 раз(а). Последнее : AndyNigmatec, 18.03.17 12:58
Ratings: 0 negative/0 positive
Re: как программно сделать приватную датасесию
Аспид

Сообщений: 3475
Откуда: Москва
Дата регистрации: 01.04.2005
А у меня изначально как у Паши было.
И до сих пор многое осталось. Основное.
Первое что выкинул оттуда, то с чего началась эта дискуссия.
Элементарные Insrt-update
Повторяю. Мне трудно разбираться с огромным количеством ХП.
В то время как тригеры... я как то для БЛ использую исключительно редко, и исключительно... метко))) Т.е. там, где все очевидно-вечно.
С ними то легче.

Я то про то, что понадобился ASP.NET, а он тогда трудно с ХП дружил, и пришлось БЛ писать на шарпе (не так и много там было)
Но... сразу свой взгляд пересмотрел. На размещение БЛ в БД.
Даже начал попытку создать на шарпе средний слой... но... именно с фоксом, затруднения начались. Плюнул. Оставил как есть.

По факту, все равно, каждый делает так, как ему удобнее.
И мне вот не понять, почему Паше, легче искать, в 509 ХП что то.
А ведь в нормальном языке, это может быть всего 20 классов. Со своими преимуществами наследования и пр.

И уж конечно, на фоксе средний слой, вряд ли кто будет делать (сегодня).
Я так понимаю, передовая ИТ вообще, сервисной архитектуре стремится...

Паша же, рассказывая о выгодах. Могу описать минусы его подхода.
У меня несколько очень похожих клиентов.
И БД практически одинакова.
А вот БЛ у них увы, отличается. И Довольно сильно.
И был бы он среднем слое, мне было бы куда легче(


------------------




Исправлено 1 раз(а). Последнее : Аспид, 18.03.17 15:10
Ratings: 0 negative/0 positive
Re: как программно сделать приватную датасесию
lulgu

Сообщений: 1838
Дата регистрации: 30.11.2016
Такое впечатление, что эта БЛ где-то на диске а:\ расположена, только без охраны.
Ratings: 0 negative/0 positive
Re: как программно сделать приватную датасесию
Simple777

Сообщений: 33855
Дата регистрации: 05.11.2006
Аспид
каждый делает так, как ему удобнее.

[attachment 27263 slesar.gif]

Слюсарь делает так, как ему удобнее

Ratings: 0 negative/0 positive
Re: как программно сделать приватную датасесию
PaulWist

Сообщений: 14625
Дата регистрации: 01.04.2004
Igor Korolyov
PaulWist
нужна защита от "дурака" или нет, я считаю, что нужна, более того на уровне БД, у тебя другой подход
Таки да. Предпочитаю всё ж работать не с дураками. Тем более что от "изобретательного" дурака защиту соорудить весьма сложно

Как говорил т. Сталин: "Гинденбургов у меня для вас нет", те надо уметь работать с теми кто есть.

Igor Korolyov
PaulWist
мои возражения только против того, что без существования записи в Алкоголе, буква "А" не должна существовать в таблице Продукт, поскольку это нарушает БЛ, вот и всё, в твоём же понимании Продукт МОЖЕТ существовать с буквой "А" без соответствующей записи в Алкоголе, что по постановке задачи НЕДОПУСТИМО.
Ты считаешь что целостность должна соблюдаться всегда. Я считаю что вполне допустимо чтобы она соблюдалась лишь для СОГЛАСОВАННОГО представления данных - а таковое имеет место в случае отсутствия незакоммиченных изменений. Если копнуть глубже и пойти "на принцип", то в твоей БД тоже вполне себе существует несогласованное состояние - это состояние в момент работы триггера - до его завершения. Просто его "не видит" никто кроме собственно триггера (а это как ты не крути не системный а вполне себе ПРИКЛАДНОЙ код - со всем вытекающим - повышенной возможностью ошибок или попросту "неучтённого" поведения), так же как в моём случае несогласованность не видит никто кроме ПО инициировавшего соответствующую последовательность операторов - да и то в рамках одной транзакции.

Неправильно понял, у меня такое же представление о целостности как и у тебя (целостность внутри транзакции можеб быть любой).

Разница только в том, то в моём понимании состояние данных должно всегда соотвествовать БЛ, в твоём понимании состояние данных может находится в рассогласованном состоянии с БЛ, те (запись в Алкоголе может отсутствовать, тем не менее бука "А" в продукте может находиться).

Igor Korolyov
PaulWist
1. Как на клиенте проверить, что есть зацикливание
А зачем это проверять? Тебе для работы нужно вынуть часть дерева - так и вынимай его - но используя "защищённый от циклов" метод извлечения. И всего делов то

Дык, в том-то и дело, что ты НИКОГДА не сможешь вытащить ветвь дерева если оно зациклено не на родительский узел, а на один из дочерних узлов одной ветви (или как ты сам предложил вырожденный случай когда запись циклица сама на себя), пример:

use tempdb
go
create table test
(
ID int not null Primary key,
Parent_ID int FOREIGN KEY
REFERENCES test(ID )
)
insert into test (ID, Parent_ID) values (1, null)
insert into test (ID, Parent_ID) values (2, 1)
insert into test (ID, Parent_ID) values (3, 2)
-- замыкаем дерево НА ПЕРВЫЙ дочерний узел, получается "кольцо"
update test set Parent_ID = 3
where ID = 2
select * from Test
; with cte
(
ID,
Parent_ID,
cPath,
nLoop,
nLevel
)
as
(
select
ID,
Parent_ID,
'.' + CAST(test.ID AS varchar(max)) + '.' as cPath,
0 as nLoop,
1 as nLevel
from test where ID = 1
union all
select
test.ID,
test.Parent_ID,
cte.cPath + CAST(test.ID AS varchar(max)) + '.',
case
when cte.cPath like '%.' + cast(test.ID as varchar(max)) + '.%'
then cte.nLoop + 1
else cte.nLoop
end as nLoop ,
cte.nLevel + 1
from test
inner join cte on cte.ID = test.Parent_ID
where cte.nLoop < 1
)
select * from cte where nLoop > 0
drop table test

те в это кольцо можно попасть если строить ветвь для ID = 2 или 3, для ID = 1 всегда будет возвращаться одна заптись, таким образом часть данных "потеряется", хотя физически будет существовать, те будет нарушена БЛ!

Igor Korolyov
PaulWist
3. Это не фича софта, разрабы этого софта, например, для отчета по дереву крутили "курсор" в среднем слое, те про сте они видимо не знали, и в своих тестах не натыкались на такие грабли.
Вот! Значит они использовали "защищённый" от зацикливания алгоритм. И потому проблема возникла лишь у "шибко умных", которые зачем-то стали работать мимо этого "безопасного" алгоритма
Если я вижу в БД нечто типа строки документа+шапка и в шапке поле типа "количество строк", "сумма по документу" - то я НЕ ДЕЛАЮ поспешного вывода о том что "не нужно лезть в строки, можно брать данные из этих полей". И потом не испытываю попоболи, когда оказывается что таки "не совпадает" - особенно если это я сам поправил какие-то строки, и даже не через (программный) интерфейс, а напрямую в БД. Вот если разработчик даёт гарантию что "совпадает всегда" (т.к. он приверженец твоего подхода и как-то исхитрился соорудить триггера поддерживающие мульти-табличную целостность) - тогда другое дело. А так - ну может это просто "кэш" который имеет право быть "устаревшим", или считается только при каких-то там "проводках/утверждениях документа".

1. Все данные записаны исключительно через интерфейс проги, никакой самодеятельности под sa.

2. Ну их "защищенный режим" работет тоже только тогда, когда юзер для отбора ветви попадал внуть цикла.

3. Ну вот, ты сам приводишь пример, (шапка и строки) рассогласованности данных с БЛ, с твоей точки зрения это норма для меня нет.

Igor Korolyov
PaulWist
Как писал Лес Пинтер: "Программных ошибок не существует в природе, а существуют ситуации для которых программист не предусмотрел проверку" - "золотые слова"!
Когда-то я тоже болел этим - в методе на 5 строк "полезного кода" писал ещё 50 строк "проверок параметров" - хорошо если в виде ASSERT, а не безусловного IF+ERROR
Потом, правда, отпустило

И это правильно, ты должен предусмотреть все возможные ситуации, а как ты это сделаешь - дело десятое.

Igor Korolyov
PaulWist
Igor Korolyov
Да, а синтаксические ошибки в посылаемых на сервер командах ты тоже будешь триггерами исправлять
Ну да, для этого достаточно и в ХП и в ТРИГГЕРЕ
Не про них речь. Речь про клиента посылающего DML, или, раз ты его запретил напрочь, вызывающего твои мега-бронированные ХП. Вот описАлся он в названии ХП, или тип параметра не тот впихивает И, о боже мой, его программа весело падает на "ошибке от сервера" - виноват, конечно же сервер, а не слепой кодер прописавший number вместо date

Не понял, юзер/прогер просто получит ошибку/сообщение, что либо ХП не найдена, либо тип параметра не может быть авотматом конвертирован либо напрочь не совпадает, ... не понял в чем проблема, ... более того прога не падает, а ждёт корректного параметра., и вообще такие вещи обычно отлавливаются на уровне тестирования, ... хотя могу сказать, что не все комбинации параметров проверяются иногда юзер говорит: "я тут сортировку задал, а прога ругается, мол нет такого поля", ошибка такого плана исправляется за пару минут в ХП.

Igor Korolyov

pasha_usue
Опять же, как расположить этот слой, абсолютно неважно.
Сию простую мыслЮ и пытаюсь донести уж сколько страниц. Но нет - ХП рулит, а то же самое в C# коде - ацтой

Владимир Максимов
При таком способе реализации на уровне триггеров задача неразрешима.
Именно. А по докУментам был спич ранее - но я как-то с настороженностью отношусь к "совсем убогим" записям в таблицах до момента "утверждения" - помню что ты именно так строишь проверки - до "финального нажатия кнопки" совершенно любой мусор позволяешь в записях держать... Это уже другая крайность IMHO.
Владимир Максимов
По поводу же переноса вообще всего кода на T-SQL лично мне это не кажется правильным всегда и везде. Имеет смысл только в случаях, когда база данных сама по себе является приложением. Т.е. работающие с ней системы - это своеобразные "терминалы" и не более того.
Таки да! А полноценное приложение на tsql (или pl/sql) - чур меня! Хотя таковые системы есть - и антикварный Oracle Forms и всякие APEX - веб-проги писанные средствами СУБД (там ваще "конструктор" - можно "кодить" без написания кода) Думаю и для MSSQL что-то подобное существует...
Владимир Максимов
Банально T-SQL неудобен с точки зрения разработки.
И я о том же! Для НЕКОТОРЫХ алгоритмов он нормален, но делать на нём ВСЁ - это явный перебор.

Раньше я привел код триггеров для твоего примера с Продуктом и Алкоголем, ничего там сверх естественного нет, обычный код, правда требующий аккуратности в написании и понимании как работает триггер, то что не все так делают, ну это их право.


------------------
Есть многое на свете, друг Горацио...
Что и не снилось нашим мудрецам.
(В.Шекспир Гамлет)
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 20 (Гостей: 20)

© 2000-2024 Fox Club 
Яндекс.Метрика