Dibi or Doctrine2 or Nette Database?

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
wicked
Člen | 290
+
-1
-

jen mě napadá taková myšlenka. Zatím frčím na Nette Database který mojim potřebám zatím stačí, ale jak projíždíme fórum, narážím i na to, že to prostě něco nezvládá atd.

Chtěl bych se zeptat Vás zkušenějších, kterou využíváte vy?

Pokud se v budoucnu budu muset učit využívat něco nového, začnu s tím rovnou teď :-)

Osobně přemýšlím nad Dibi, nebo máte jiné názory, popřípadě argumenty?

Předem děkuji za reakce do diskuze.

Wicked

Jan Endel
Člen | 1016
+
+5
-

Srovnání:

  • Dibi je stabilní, odbugovaná, ale „stará“, nemá tak pěkné api
  • Nette\Database má výrazně méně bugů než-li měla, resp už se může na projektech normálně používat krásný API
  • Doctrine: Výrazně složitější než předchozí dvě, není to prostá obálka nad databází, takže na to konto může řešit mnohem pokročilejší věci než předchozí dvě

Vyber jsi podle sebe

Oli
Člen | 1215
+
+1
-

Ještě bych dodal, že Dibi i NDB je vlastně nástroj pro vytahování dat z databáze. narozdíl od toho Doctrine je ORM. Srovnával bych teda Dibi a NDB v jedné kategorii a ve druhé třeba Doctrine, Lean Mapper, YetORM nebo Nextras, kterej jsem o víkendu v rychlosti vyzkousel a zatím se mě líbil nad NDB nejvíc. Tak jsem na nej hodně zvědavej :-)

Zax
Člen | 370
+
0
-

Osobně jsem moc zvědavý, co Hrach vymyslel s tím jeho ORM nad Nette\Database a zda to bude v dohledné době použitelné na reálné projekty :-)

Doctrine je jak střílet z tanku na komára, aspoň tedy pro mě, ale čisté Nette\Database je zase jak házet šutry na tank. Navíc Nette\Database má oproti Doctrině výbornou schopnost skládat optimalizované dotazy, aniž bych musel přemýšlet, jak to zapsat (tuším že v Doctrině musí člověk přemýšlet nad DQL). Zatím mám na to vlastní ORM postavené nad Nette\Database, ale není to nic moc (základní mapování, vazby přes anotace, jednoduché entitní formuláře, to vše mi funguje, ale kdybych vypustil zdrojáky, tak se tu všichni pozvrací :-) ) a nemám čas to udělat pořádně.

Věřím, že Hrachovo řešení bude mnohem lepší než moje.

Caine
Člen | 216
+
+1
-

Imho je to ještě malinko jinak.

Dibi ≈ NDB < NDBT ≈ NotOrm < Doctrine a další ORM

Šaman
Člen | 2666
+
+2
-

U mě rozhodně vede LeanMapper (ORM nad Dibi), které, kdyby mělo zdokumentované všechny fičury, strčí do kapsy všechna výše zmíněná řešení. Takhle je potřeba se na řešení složitých dotazů ptát Tharose. Základ zdokumentovaný je.

Filip Procházka
Moderator | 4668
+
+8
-

Pokud chceš psát „správně“ a „čistě“ OO aplikace, tak Doctrine 2 (+ Kdyby), jinak bych šel asi do LeanMapperu.

wicked
Člen | 290
+
0
-

@Filip

Abych řekl pravdu, tak nad tímto řešením asi nejvíce přemýšlím, jen pořádně nevím jak začít…

Šaman
Člen | 2666
+
+1
-

Jsem přesvědčený o tom, že pišu akademicky čisté OOP a používám LM. (Ano, mám tam přidanou jednu prázdnou třídu a dva řádky kódu, které mi zajistí, že výsledky se mi vrací v objektové Collection, nikoliv v prostém poli.)

Filip Procházka
Moderator | 4668
+
0
-

LeanMapperu je výborné skoro-ORM, ale bohužel nemá identity mapu a má dost obskurní architekturu. Což spoustě lidem nevadí, ale pro mě je to nepoužitelné.

wicked
Člen | 290
+
0
-

Asi půjdu do Doctrine2+Kdyby, nějaký návody jak začít?

Link dokumentace je mi jasný, ale v rychlosti nějaký základ?

Např.insert, update, where, selektivní atd?

Děkuji

Filip Procházka
Moderator | 4668
+
0
-

Začal bych tady a pokud to s Doctrine myslíš vážně, tak pokud si přečteš celou dokumentaci tak to je výborně investovaný čas.

mrtnzlml
Člen | 140
+
+5
-

wicked napsal(a):

Asi půjdu do Doctrine2+Kdyby, nějaký návody jak začít?

Link dokumentace je mi jasný, ale v rychlosti nějaký základ?

Např.insert, update, where, selektivní atd?

Děkuji

Toto by ti mohlo pomoci s přechodem. Psal jsem to právě pro tento účel. Je to klasicky minimum potřebné k přechodu… :-) http://www.zeminem.cz/…tej-doctrine

wicked
Člen | 290
+
0
-

@Filip
Určitě, když ji chci využívat, tak na pořádně ;-)

@mrtnzlml
Kouknu, dekuji

Tharos
Člen | 1030
+
+3
-

Filip Procházka napsal(a):

Pokud chceš psát „správně“ a „čistě“ OO aplikace, tak Doctrine 2 (+ Kdyby), jinak bych šel asi do LeanMapperu.

Díky za uznání! :)


Nemohu se ale nechytnout těch přívlastků „správné“ a „čisté“ OO aplikace. :) Zajímalo by mě totiž, co konkrétně si pod tím lze představit. Já si totiž nemyslím, že „správnost“ a „čistota“ by až tak moc závisely na použitém ORM (pokud to není samozřejmě nějaká statická hrůza). Troufám si tvrdit, že „správně“ a „čistě“ lze psát OO aplikace i s pomocí PDO, když programátor ví, co dělá.

Já teď třeba zrovna píšu nad Lean Mapperem jeden e-shop a přijde mi, že výsledký kód je z pohledu OOP čistý i správný (samozřejmě, že kdo by chtěl psa bít…). Jestli mi tu apku něco vyloženě kazí, tak jsou to nezapouzdřené presentery se všemi jejich zodpovědnostmi ;). Rozhodně to nedělá její modelová část.


Identity map je úplně výborná hůl na Lean Mapper. :) Pořád o ní slyším od lidí, kteří Lean Mapper vlastně vůbec nepoužívají, ale ví, že tam strašně chybí. ;)

O víkendu jsem si taky hrál s Nextras\ORM a oceňuji, že Hrach v něm identity mapu má, ale přijde mi to jenom jako takový marketing, protože ta jeho identity mapa není úplně dobrá…

Představ si třeba takovýhle jednoduchý use-case:

<?php

// Mějme jednoduché CMS

// Chceme vypsat hlavní navigaci

foreach ($pagesRepository->findAll() as $page) {
	echo $page->title;
}

// Chceme vypsat všechny obsahy **aktuální stránky**

$currentPage = $pagesRepository->get($id);

echo $currentPage->title; // Nadpis…

foreach ($currentPage->contents as $content) {
	echo $content->body;
}

Víš, co se díky té „identity mapě“ stane na pozadí? Z databáze se Ti vytáhnou nejen všechny stránky, ale i všechny obsahy (všech stránek). Ono totiž v pozadí stojí jeden principiální problém, který není úplně trivální vyřešit, a právě z toho důvodu plnohodnotnou identity mapu v Lean Mapperu nemám. Vím, jak by ten problém šel vyřešit, ale overhead by byl takový, že už to nemá moc společného se slovem Lean. Až si začnou skuteční uživatelé stěžovat, že jim identity mapa chybí, začnu to řešit. Jinak doplnit takovou „identity mapu“, jakou má Hrach, by byla otázka pár úderů do klávesnice (byla by v EntityFactory), ale o to moc nestojím.

No a takových věcí jsem v tom ORM našel ještě víc… Ono jenom stačilo vědět, na co se zaměřit.

Mě by zajímalo, jestli Hrach třeba o tom problému s identity mapou ví? Jestli ano, tak je ohánění se jí sice hezký marketing, ale IMHO nezodpovědnost vůči uživatelům.

Zatím to na mě totiž působí spíš jako Nette\Database, která vypadala fajn, ale třeba já jsem ji musel kvůli bugům v půlce jednoho projektu opustit…


Nevím, jestli by původnímu tazateli u Lean Mapperu převážily jeho výhody nebo nevýhody (nevím, co se chystá programovat), a proto bych mu za sebe klidně doporučil Doctrine 2.

Editoval Tharos (4. 6. 2014 1:00)

David Matějka
Moderator | 6445
+
+1
-

Víš, co se díky té „identity mapě“ stane na pozadí? Překvapení! Z databáze se Ti vytáhnou nejen všechny stránky, ale i všechny obsahy (všech stránek). :) To je pěkný průser…

Jo, o tom jsem se s Hrachem bavil. Je to tim, ze pri iteraci se entite priradi kolekce („Preloaded container“), do ktere aktualne patri, ale pote se ta kolekce neodstrani. Rikal, ze je to tak umyslne, ale mozna se to jeste zmeni.

Asi by jen stacilo sem (nebo jeste nekam jinam?) pridat smazani toho preloaded containeru z predchozi entity.

Tharos
Člen | 1030
+
+2
-

@matej21: Tak jestli je to úmysl, pak je to jiná. :)

hrach
Člen | 1838
+
-11
-

Musim varovat pred LeanMapperem, coz je sra…knihovna, kterou nelze testovat. Respektive nelze vytvorit vazby, aniz bych entitu zapersistoval. Attached stav tam neexistuje a akorat se to musi hackovat ;)


Ohledne Nextras\ORM – nikdo ho tu nevnucoval, nikde, krom posoboty a sveho twitteru, ho nepropaguji :) Na otazku, kdy si myslim, ze to muze jit do produkce, jsem na posobote odpovedel, ze po prazdninach. Do te doby to chapu jako preview. Nejsou testy, neni doc. Zatim jen na hrani :)


Jo, o tom jsem se s Hrachem bavil. Je to tim, ze pri iteraci se entite priradi kolekce („Preloaded container“), do ktere aktualne patri, ale pote se ta kolekce neodstrani. Rikal, ze je to tak umyslne, ale mozna se to jeste zmeni.
Asi by jen stacilo sem (nebo jeste nekam jinam?) pridat smazani toho preloaded containeru z predchozi entity.

Je to presne jak rika Matej. Zatim jsem to neimplementoval, protoze osobne jsem na takoveto chovani jeste nenarazil, ale jsem si ho vedom. Asi to tedy pridam i to odstraneni :) Z principu jsem se tomuto venoval velmi dlouho, testoval jsem i reseni pomoci Proxy – toto mi prislo lepsi.

Editoval hrach (4. 6. 2014 0:37)

Tharos
Člen | 1030
+
+6
-

Proč by Lean Mapper nešel testovat? :) Já entity testuji úplně normálně, i traverzování mezi nimi a není k tomu zapotřebí ani databáze. A co si mám představit pod tím attached stavem? :)

Názor, že když chci něco kritizovat, nejprve si o tom musím něco zjistit, se koukám fakt už moc nenosí. :)


To, že to může jít do produkce po prázdninách, mi uniklo. To se omlouvám. Já jsem si myslel, že to, co je teď v repu, je už víceméně použitelné. Pak beru zpátky svoji kritiku. Věřím, že přes prázdniny všechno odladíš a Nextras\ORM si najde své spokojené uživatele.

Edit: Odstranil jsem z toho svého předchozího příspěvku to varování, protože pokud to je zatím jenom ke „zkoušení“, tak je to fakt jiná. Držím palce po prázdninách. :)

Editoval Tharos (4. 6. 2014 1:04)

Tharos
Člen | 1030
+
+2
-

Honzo, je to sice hezký sport a dá se při tom zažít spousta legrace, ale já bych rád tohle klání ORMek uzavřel, protože to stojí zbytečnou energii a nikomu neprospívá (osobně nesnáším negativní marketing).


Tvé ORM se mi líbí, máš ho hezky napsané. Je tam pár věcí, které se mi tak trochu nelíbí, pár věcí je třeba dotáhnout, ale pak to bude fajnová knihovna.

Přemýšlím jen, co by mělo uživatele přesvědčit používat jej namísto Doctrine 2, která je de facto standardem pro ORM v PHP? Ten ujetý benchmark, jehož výsledek vlastně nevypovídá o ničem smysluplném, je dost slabý argument. Doctrine 2 není tak špatná, jak si pravděpodobně myslíš. Fakt Ti doporučuji více se na ní podívat. Třeba já jsem to nedávno udělal a hodně mě to posunulo, dost jsem na problematiku změnil názor.


Lean Mapper má oproti Doctrine pořád pár jasných výhod. Z podstaty svého návrhu je velmi pružný. Je to ORM, které Ti umožňuje mít zároveň přesně takové public API modelu (hlavně entit), jaké si přeješ, posílat do databáze takové dotazy, jaké si přeješ, a to vše s minimem řádků a s minimálním úsilím. To je jeho hlavní výhoda a rank, podle kterého si s Doktrínou v ničem nezadá. A věřím, že to je hlavní důvod, proč jej mnozí používají.

Jako bonus beru to, že si můžeš sám vybrat, jak moc chceš vlastně relační databázi v aplikaci abstahovat. Abstrakci lze ji mít velmi malou (výhodné třeba s PostreSQL, která toho sama umí hrozně moc) i hodně velkou. V téhle volbě IMHO strká Doctrine do kapsy.

Nesouhlasím s tím, že je to sra… Praxe ukazuje, že není.

Good luck s dalším vývojem!

Editoval Tharos (4. 6. 2014 9:12)

castamir
Člen | 629
+
+4
-

@hrach, @Tharos: to už by stačilo…

Až bude mít něco použitelného, tak můžete začít srovnávat. Do té doby je to jen plané tlachání…

Zatím je LeanMapper jediná aspoň trošku solidní alternativa k Doctrine. Osobně mám k oběma docela slušné výhrady, ale přesto je mi LM přece jen bližší a tak jsem si nad ním vystavěl ještě menší nádstavbu. Do dokonalosti to má ale daleko.

Nextras ORM má pár zajímavých nápadů (např. propojení na Repository ve vazbě), ale taky hodně špatných nápadů (např. použití nezdokumentované syntaxe z Nette/Database). Prostě každé řešení má nějaké pro a proti. Každý vývojář má na ideální řešení svůj vlastní názor, svou vlastní představu. Vy dva se evidentně neshodnete, ale tím osočováním nikomu moc nepomáháte. Raději bych být vámi ten čas investoval do odstranění nedostatků ve vašem vlastním řešení, než przněním řešení toho druhého. Máte toho oba ještě dost co zlepšovat (hrach asi víc, protože je v implementaci o rok pozadu za LM).

Edit: A třeba se po zkouškách hecnu a nějaké to důkladnější srovnání, včetně mé představy ideálního chování, sepíšu :p

Editoval castamir (4. 6. 2014 1:41)

Filip Procházka
Moderator | 4668
+
+4
-

@hrach příště to zkus slušně pls :)

@Tharos Pozor, nikde nepíšu, že to že tam nemáš identity mapu je špatně, jenom píšu že máš prostě jinou architekturu (já tomu osobně říkám skoro-ORM). Určitě na tom jde napsat spousta kvalitních aplikací. Jediné co se snažím říct je, že mi tvoje architektura nevyhovuje a nebyl bych s ní schopný pracovat. Výrazy „správný“ a „čistý“ samozřejmě narážím na standardní pojetí ORM a DDD.

Na druhou stranu je dobře, že tu existuje alternativní architektura a né jenom další „napsal jsem lepší Doctrine“, protože napsat lepší Doctrine by byla práce na roky vývoje pro jednoho člověka a musel by být neskutečně geniální, aby to udělal lépe, než ty desítky vývojářů co na ní dělali do teď a tisíce co ji každý den testují a reportují chyby. Držím Hrachovi palce :)

Tomáš Jablonický
Člen | 115
+
+2
-

Jednou k Doctrine2 stejnak přičichneš a zjistíš, že ti šetří docela času při vývoji a zdroják je mnohem přehlednější a více strukturován. Ve spojení s KDYBY je to ovšem ultra super nástroj :-).

wicked
Člen | 290
+
0
-

Zatím mě Doctrine přijde ultra složitá.....

hrach
Člen | 1838
+
0
-

klání ORMek uzavřel, protože to stojí zbytečnou energii a nikomu neprospívá

Ja jsem zadne klani ani nezacal. V teto diskuzi jsem se vubec nezapojoval, sve orm nepropagoval, cizi orm nepomlouval. Potom prisel Tharosuv prispevek, ktery trema odstavcema pospal jeden neidealni usecase a uzavrel ho stylem, ze jsem to nepobral s linkem na muj tweet. Jako sorry, ale na to, ze jsem sem nenapsal predtim ani post, je toto naprosto nechutny chovani. A jeste nechutnejsi je, ze to po sobe mazes a editujes.

Napsal jsem jeden zasadni argument, proc bych nepouzil Lean mapper. Tento argument byl rozporovan, ze neni pravda. Je pravda, ja totiz Lean mapper zkousel pouzivat. A jak jinak si taky vysvetlit dnesni post, ze lze nove testovat vazby i bez pripojeni k db – ze? https://forum.dibiphp.com/…orm-nad-dibi?p=22

Nextras\ORM nedoporucuji pouzivat pro produkci. Zatim je to dev. Neni tagnuta zadna alfa, beta, rc, ani stable! Budu rad, kdyz to ozkousite na hrani a jako Tharos (ale slusne) nahlasite sve dojmy.

Tharos
Člen | 1030
+
+3
-

Bylo to naprosto nechutné chování, a proto jsem se Ti za něj taky omluvil. Víc pro to už udělat nemohu.

Zax
Člen | 370
+
0
-

@hrach: Máš tu někde svůj thread pro Nextras\ORM? Právě jsem zkouknul tvoji přednášku a líbí se mi to, mám v plánu si s tím brzo začít hrát, tak jenom abych věděl, kam můžu ty své dojmy směřovat ;-)

V té přednášce 20:05 jak tam taháš ty komentáře, k čemu slouží ten ->get()? Nestačilo by prostě $this->allComments->findBy(...)? Je to drobnost, ale už se vidím, jak na to budu zapomínat a zrovna v této situaci IDE ani nenapovídá.

Džůny
Člen | 19
+
0
-

Ahoj, dovolím si oživit téma, abych nemusel zakládat nové, protože řeší přesně to co já.

Jak je na tom Nette/Database dnes? U některého ze starších rozhovorů s Davidem (tuším) jsem se v komentářích dočetl, že je Nette/Database zabugované a používané jen začátečníky (skrze Sandbox). Otázka je: je to pravda i dnes?

Ona mi ta „magická“ složka moc nesedí, ale zase je to pohodlné. S Dibi, které bylo prozatím můj favorit, zkušenosti taky nemám. Vrátil jsem se k PHP a webům po sedmi letech, tehdy jsem jel těžký punk s funkcema mysql_* a podobnými relikviemi, tak se pořád rozkoukávám…

Projekt nebude moc velký. Docela mě láká i LeanMapper, protože jsem v C# používal Entity a bylo to super.

Editoval Džůny (9. 4. 2015 10:14)

David Grudl
Nette Core | 8228
+
+7
-
  • dibi: časem ověřená a dalo by se říci hotová knihovna
  • Nette Database: zjednodušené dibi podstavené nad PDO, poměrně stabilní, něco to má navíc, ale něco tomu i chybí. V další verzi by to mohlo s dibi srovnat krok a nahradit jej, bude-li motivace
  • Nette Database Table: „magická“ vrstva nad Nette Database, v současné době už celkem stabilní (běží na tom třeba nette.org), nicméně hlavní vývojář od toho utekl. Má takřka nulovou vstupní bariéru a nepoužívá entity (tedy není ORM)
  • Lead Mapper: ORM založené nad dibi. Jeho vývojář dnes sám používá spíš Doctrine
  • Doctrine: dnes asi nejpopulárnější ORM pro PHP, ale zároveň nejsložitější
Pavel Janda
Člen | 977
+
0
-

Trošku se divím, že jsem ještě na Nette fóru nezavadil o nějakou slušnou Active Record vrstvu, ani zmínka.
U RoR se mi s Active Recordem pracuje dobře a jednoduše, to to nemá v oblibě nikdo okolo Nette?

David Grudl
Nette Core | 8228
+
+1
-

Active Record jsem považoval za antipattern, proto jsem odmítal jej z NDBT udělat. Možná AR tak vidí i další programátoři, tudíž podobná vrstva nevznikla. V RoR je AR něco jako magic quotes – prostě věc, které RoR vděčí za svou popularitu, ale dnes se jí v bolestech snaží zbavit.

Šaman
Člen | 2666
+
0
-

… a protože David je ten guru, který půlku z nás učil čistě programovat, tak asi není nikdo, kdo by splňoval najednou dvě základní podmínky – 1) být schopný napsat tuto vrstvu v rozumné kvalitě s testy a za 2) používal active record :)

@DavidGrudl: Když už se na to narazilo, kdo tedy vyvíjí NDb a NDbT? Myslel jsem, že @hrach? Případně jak vypadá budoucnost NDbT? Díky.

@Džůny: Před dvěma lety byla situace trochu jiná, to bych ti NDb(T) nedoporučil, přestože byla již součástí
Nette. Dneska, pokud nemáš nějaký konkrétní důvod použít něco jiného, bych naopak řekl použij ji. Pokud se ti nelíbí magie, tak nemusíš používat Nette database table, ale čistou Nette database (vesměs příkaz query a fetche), přestože snad ve všech ukázkách se využívá právě možností NDbT (je to dost návykové, takový napůl ORM, taky z NotORM vychází).
Jinak jeden z těch důvodů nepoužívat NDb by mohl být požadavek na složité dolování dat (tj. využívat opravdu všech, i málo známých, možností SQL). I když, i tento pocit je možná pozůstatek z doby před těmi dvěma lety…

David Grudl
Nette Core | 8228
+
0
-

@Šaman NDb vyvíjím já, NDbT už zhruba rok nikdo, nicméně ono to funguje, občas někdo pošle bugfix, takže to klidně nasazuji i na nové weby.

Svaťa Šimara
Člen | 98
+
+2
-

TL;DR:
Pokud potřebuješ podmínku v LEFT JOIN ON, vlastní ALIAS tabulky, FORCE INDEX, a další potvůrky, tak NDBT nebrat.

@Džůny: Osobně opužívám NDBT – Selection a spol – na docela velkém projektu a jak píše Šaman, dokud nepotřebuješ používat kapku složitější SQL, je ok.

Horší bude situace, když uprostřed projektu zjistíš, že kapku složitější SQL potřebuješ, jako my :-)

Typický příklad: Potřebuješ vytáhnout kategorie, a k nim pokud existuje, tak jazykový překlad, pokud překlad neexistuje, stejně ty kategorie chceš vytáhnout, a vypsat aspoň bez překladu.

NDBT:

$selection = $this->db->table('category');

foreach($selection as $category) {
	$translation = $book->related('category_translation')->where('code', 'cz')->select('category_translation.caption');
}

Což se sice vykoná ve 2 dotazech, ale tak nějak si určitě říkáš, že jakmile tento kód budeš potřebovat na více místech, není to nic moc. V čistém SQL bys použil:

SELECT category.name, category_translation.caption
FROM category
LEFT JOIN category_translation ON (category.id = category_translation.category_id
    AND category_translation.code = 'cz')

Tak si vytvoříš třeba VIEW, ale pak zjistíš, že NDBT s view úplně kamarád není, protože nemá vazby do dalších tabulek, takže view zase zrušíš.

A přitom by stačilo mít v NDBT možnost zadávat podmínku v LEFT JOIN:

$selection = $this->db
		->table('category');
		->left('category_translation.code', 'cz')
		->select('category.name, category_translation.code');

Takže Ti potom nezbyde, než napsat pull request: https://github.com/…te/pull/1436 který bude zamítnutý, protože tuto vlastnost v NDBT Hrach nechce. A pak si fakt v loji, protože tuto feature potřebuješ, nechceš mít kód připočůraný samým ->related()->where()->select()

Pak zjistíš, že potřebuješ, stejně jako v SQL, aliasovat tabulky.
Toto taky NDBT neumí, a ani sem se už nepokoušel napsat pull request a prostě si NDB forknul.. https://github.com/…rts/database

Pavel Janda
Člen | 977
+
0
-

@Fafin Ty joiny by byly sice fajn, ale to by opravdu bylo v rozporu s filozofií NDB\Table. To je prostě Table. :)

Jeden z důvodů, proč jsem na několika projektech nasadil Dibi. Logicky, s rozsáhlejší aplikací se dibi stává poměrně ukecané. A tak jsem zatím skončil u Lean Mapperu.

Caine
Člen | 216
+
0
-

@Fafin naprosto chapu tvoji frustraci (viz muj sign;)