<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>cojack blog</title>
	<atom:link href="http://www.cojack.pl/feed" rel="self" type="application/rss+xml" />
	<link>http://www.cojack.pl</link>
	<description>Programowanie oraz Open Source powodem do życia</description>
	<lastBuildDate>Thu, 25 Feb 2010 09:03:25 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>JavaScript &#8211; nextSibling</title>
		<link>http://www.cojack.pl/javascript-nextsibling/355</link>
		<comments>http://www.cojack.pl/javascript-nextsibling/355#comments</comments>
		<pubDate>Thu, 25 Feb 2010 09:03:25 +0000</pubDate>
		<dc:creator>cojack</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[nextSibling]]></category>

		<guid isPermaLink="false">http://www.cojack.pl/?p=355</guid>
		<description><![CDATA[Dzisiaj chciałbym opisać (pewnie dość znany już problem) występowania białych znaków w strukturze HTML pomiędzy elementami HTML. W czym jest problem? Istotą problemu jest chęć pobrania następnego elementu DOM który się znajduję po elemencie na którym mamy jakąś akcję i teraz jeżeli mamy odstęp pomiędzy tymi dwoma elementami, jakieś znaki ...]]></description>
			<content:encoded><![CDATA[<p>Dzisiaj chciałbym opisać (pewnie dość znany już problem) występowania białych znaków w strukturze HTML pomiędzy elementami HTML. W czym jest problem? Istotą problemu jest chęć pobrania następnego elementu DOM który się znajduję po elemencie na którym mamy jakąś akcję i teraz jeżeli mamy odstęp pomiędzy tymi dwoma elementami, jakieś znaki ( \s, \t, \r, \n ) lub inne nie zdefiniowane białe znaki, to po pobraniu tego elementu przez funkcję <strong>nextSibling</strong> nie będziemy oczekiwanego efektu, tylko coś ala undefined lub text. A na pewno każdy z nas się z tym spotka ponieważ mamy zdefiniowane gdzieś w głowie że podgląd źródła strony powinien być ładnie sformatowany. Na stronach developer.mozilla.org odnośnie dokumentacji gecko dom można przeczytać właśnie o tej funkcji i przytoczę fragment z ich strony:</p>

<div class="wp_syntax"><div class="code"><pre class="html4strict" style="font-family:monospace;"><span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">table</span>&gt;</span>
  <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">tr</span>&gt;</span>
    <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">td</span> <span style="color: #000066;">id</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;cell1&quot;</span>&gt;</span>cell1<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">td</span>&gt;</span>
    <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">td</span> <span style="color: #000066;">id</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;cell2&quot;</span>&gt;</span>cell2<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">td</span>&gt;</span>
  <span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">tr</span>&gt;</span>
  <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">tr</span>&gt;</span>
    <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">td</span> <span style="color: #000066;">id</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;cell3&quot;</span>&gt;</span>cell3<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">td</span>&gt;&lt;<span style="color: #000000; font-weight: bold;">td</span> <span style="color: #000066;">id</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;cell4&quot;</span>&gt;</span>cell4<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">td</span>&gt;&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">tr</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">table</span>&gt;</span></pre></div></div>

<p>Mamy prostą tabele, pierwszy jej wiersz jest ładnie sformatowany by cieszyło nasze oko, drugi jest prosty, w jednym ciągu zapisany. Teraz po pobraniu następnego elementu poprzez <strong>nextSibling</strong> dla cell1 będziemy mieli text zamiast oczekiwanego przez nas cell2,a po pobraniu następnego elementu (j/w) dla cell3 będziemy mieli cell4.</p>
<p>Teraz za pewne można sobie zadać pytanie i co z tym zrobić? Otóż każdy element w javascript ma coś takiego jak nodeType, nodeType jest niczym innym jak indeksem elementu DOM przypisanym na stałe ustalonym w dokumentacji ECMA-262, zainteresowanych odsyłam do wiki. Nie ma sensu bym tutaj przytaczał wszystkiego odsyłam do w3shools <a href="http://www.w3schools.com/dom/dom_nodetype.asp" rel="nofollow" title="w3schools - nodeTypes" >w3schools &#8211; nodeTypes</a>. Wracając do sedna sprawy bo troszkę odbiegłem od tematu, aby pobrać następny element trzeba sprawdzić jakiego jest typu. Także funkcja którą poniżej przedstawię nie jest mojego autorstwa, została już trylion razy przedstawiona w internecie,</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">   <span style="color: #006600; font-style: italic;">/**
    * Metoda zwraca następny obiekt w DOM
    *
    * @param    obj    obiekt elementu
    * @return    obj    następny obiekt w DOM
    */</span>
   nextObject <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span> MyObject <span style="color: #009900;">&#41;</span> 
   <span style="color: #009900;">&#123;</span>
      <span style="color: #000066; font-weight: bold;">do</span> NextObject <span style="color: #339933;">=</span> MyObject.<span style="color: #660066;">nextSibling</span><span style="color: #339933;">;</span>
      <span style="color: #000066; font-weight: bold;">while</span> <span style="color: #009900;">&#40;</span>NextObject <span style="color: #339933;">&amp;&amp;</span> NextObject.<span style="color: #660066;">nodeType</span> <span style="color: #339933;">!=</span> <span style="color: #CC0000;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000066; font-weight: bold;">return</span> NextObject<span style="color: #339933;">;</span>
   <span style="color: #009900;">&#125;</span></pre></div></div>

<p>Tadam, proste, szybkie i skuteczne, użycie?</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> div <span style="color: #339933;">=</span> document.<span style="color: #660066;">getElementById</span><span style="color: #009900;">&#40;</span> <span style="color: #3366CC;">&quot;jakiesId&quot;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #003366; font-weight: bold;">var</span> nextElement <span style="color: #339933;">=</span> nextObject<span style="color: #009900;">&#40;</span> div <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Mam nadzieję że się komuś przyda i uśmierzy ból który spływa na nasze serca podczas pisania kodu js i wyrywania sobie włosów z głowy przy nieoczekiwanych wynikach wykonanego kodu który względnie teoretycznie jest dobry.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.cojack.pl/javascript-nextsibling/355/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Zmartwychwstanie Gruba</title>
		<link>http://www.cojack.pl/zmartwychwstanie-gruba/348</link>
		<comments>http://www.cojack.pl/zmartwychwstanie-gruba/348#comments</comments>
		<pubDate>Wed, 03 Feb 2010 13:20:23 +0000</pubDate>
		<dc:creator>cojack</dc:creator>
				<category><![CDATA[GNU/Linux]]></category>
		<category><![CDATA[grub]]></category>
		<category><![CDATA[kubuntu]]></category>
		<category><![CDATA[odzyskiwanie gruba]]></category>
		<category><![CDATA[ubuntu]]></category>

		<guid isPermaLink="false">http://www.cojack.pl/?p=348</guid>
		<description><![CDATA[ Pewnie wielu z Was zapyta się po co ten topic, gdyż już jest wałkowany miliony razy w internecie, opisany w każdym języku po tysiąc razy. A ja Wam powiem że guzik prawda. Czytałem te ich wpisy na blogach, i myślałem sobie, fakt no proste jak budowa cepa, a tu ...]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft" title="Linux" src="http://cojack.os-cms.pl/wp-content/linux.png" alt="" height="100" width="100"> Pewnie wielu z Was zapyta się po co ten topic, gdyż już jest wałkowany miliony razy w internecie, opisany w każdym języku po tysiąc razy. A ja Wam powiem że guzik prawda. Czytałem te ich wpisy na blogach, i myślałem sobie, fakt no proste jak budowa cepa, a tu się okazało że nie koniecznie. Problem jest taki, dużo tych blogerów skopiowało z innego bloga wpisy i mają to w duszy, działa bo ktoś opisał że działa, a czy sprawdził na swojej skórze? No nie powiedziałbym, dlatego możecie być pewni tego wpisu, gdyż ja go sam przetestowałem, i ktoś może pisać a poco tyle kombinacji itp itd. Pracy jest może trochę więcej ale nie u każdego jeden sposób może zadziałać. Są różne metody odzyskiwania gruba, Super Grub Disk, Auto Grub Disk itp Co u mnie nie zdało egzaminu. Gdyż wszystko się wyłożyło i nic nie chciało działać.</p>
<h3>Live CD</h3>
<p>Pierwsze co powinniśmy zrobić, to zmontować sobie jakąś dystrybucję która nam pozwoli odzyskać gruba, aby tak się stało dystrybucja powinna mieć grub&#8217;a w swoich pakietach, nie każda ma ubuntu defaultowo też nie posiada, więc bez dostępu do internetu będziemy w czarnej dziurze. Możemy z windowsa nagrać ubuntu/kubuntu na pendrive za pomocą ultra iso, fajne narzędzie. Inne nie tworzyły mi bootowanego pendriva i nie mogłem nic z tym zrobić. Dobra mamy pendrive/cd z ubuntu co dalej?</p>
<h3>Chrootowanie systemu</h3>
<p>Otwieramy konsole, wpisujemy</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;"># sudo su</span></pre></div></div>

<p>następnie</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;"># aptitude install grub -y</span></pre></div></div>

<p>dalej</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;"># mkdir /media/root</span>
<span style="color: #666666; font-style: italic;"># mount /media/root /dev/sdaX</span></pre></div></div>

<p>Gdzie X jest to numer naszej partycji<br />
I tutaj zależy jaki mamy dysk, sata, czy też nie oraz w której kolejności jest ustawiony na kablu jeżeli to ata lub mamy dwa dyski na sata, aby wyświetlić jakie mamy dyski należy wykonać to za pomocą:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;"># fdisk -l</span></pre></div></div>

<p>Dobra, mamy zamontowaną partycję z dyskiem, następnie montujemy proc i dev</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;"># mount -t proc none /media/root/proc</span>
<span style="color: #666666; font-style: italic;"># mount -o bind /dev /media/root/dev</span></pre></div></div>

<p>Przed chrootem jeszcze jedna akcja:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;"># grub-install /dev/sda</span></pre></div></div>

<p>Teraz chrotujemy dziada:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;"># chroot /media/root /bin/bash</span></pre></div></div>

<p>Ok i teraz tak, mamy już gruba zainstalowanego na dysku, więc możemy się do niego wbić, gdybyśmy go nie zainstalowali nie mogli byśmy zrobić tego co piszą różni blogowicze a chodzi o:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;"># grub</span></pre></div></div>

<p>Ok jedziemy</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;"># grub&gt; find /boot/grub/stage1</span></pre></div></div>

<p>Teraz tak jak u innych mamy to samo, powinno nam wywalić numer partycji coś ala</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;"># hd(0,1)</span></pre></div></div>

<p>Standardowo lecimy dalej:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;"># grub&gt; root (hd0,1)</span></pre></div></div>

<p>oraz</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;"># grub&gt; setup (hd0)</span></pre></div></div>

<p>Ha! I tu jest ficzer, gdybyśmy nie zainstalowal gruba od zera to byśmy dostali błędem po oczach że nie ma pliku stage1, a tak jest. Zainstalowane skonfigurowane i co pewnie myślicie że to już wszystko co? A no nie wszystko, mało kto pisze o tym na blogu, a to jest bardzo ważne, gdyż jak wykonamy restarta po tych operacjach to przywita nas grub a nie wybór systemu</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;"># grub&gt; quit</span>
<span style="color: #666666; font-style: italic;"># grub-udpate</span></pre></div></div>

<p>Powinno nas poinformować że nie mamy utworzonego menu.lst potwierdzamy chęć utworzenia listy wciskając <strong>y</strong> i enter.<br />
Włala, utworzyło nam piknie wszystko, teraz możemy już tylko odmontować partycje</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;"># umount /media/root/dev</span>
<span style="color: #666666; font-style: italic;"># umount /media/root/proc</span>
<span style="color: #666666; font-style: italic;"># umount /media/root</span></pre></div></div>

<p>I nie bić reboot z konsoli bo ubuntu się nie zresetuje tylko zawiesi przy próbie restartu, nie wiem też czy poweroff zadziała, najlepiej mu kliknąć myszką żeby się wyłączył.</p>
<p>Po tych operacjach możemy cieszyć się działającym grubem. Amen.</p>
<p><em>Wzorowane na artykule z <a href="http://thecamels.org/2007/11/07/odzyskiwanie-gruba/" rel="nofollow">thecamels.org</a></em></p>
]]></content:encoded>
			<wfw:commentRss>http://www.cojack.pl/zmartwychwstanie-gruba/348/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Role Based Access Control cz.3</title>
		<link>http://www.cojack.pl/role-based-access-control-cz-3/326</link>
		<comments>http://www.cojack.pl/role-based-access-control-cz-3/326#comments</comments>
		<pubDate>Fri, 22 Jan 2010 09:41:53 +0000</pubDate>
		<dc:creator>cojack</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[rbac]]></category>
		<category><![CDATA[role based access control]]></category>
		<category><![CDATA[uprawnienia]]></category>

		<guid isPermaLink="false">http://www.cojack.pl/?p=326</guid>
		<description><![CDATA[ Tak więc w poprzednim wpisie, pokazałem w jaki sposób zaimplementować taką strukturę w sql, w tym wpisie chciałbym rozważyć pewne dodatkowe możliwości, które mogą chodź nie muszą okazać się przydatne w cale. A więc, mamy tutaj sprawdzanie uprawnień tylko i wyłącznie dla grup użytkowników. Co nie było naszym założeniem, ...]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft" title="PHP" src="http://www.cojack.pl/wp-content/arch-php.png" alt="" height="100" width="100"> Tak więc w poprzednim wpisie, pokazałem w jaki sposób zaimplementować taką strukturę w sql, w tym wpisie chciałbym rozważyć pewne dodatkowe możliwości, które mogą chodź nie muszą okazać się przydatne w cale. A więc, mamy tutaj sprawdzanie uprawnień tylko i wyłącznie dla grup użytkowników. Co nie było naszym założeniem, więc by kontynuować i rozszerzyć możliwości naszego rbac&#8217;a należy wprowadzić pewne zmiany. Tabela rbac_privilages powinna zostać przemianowana na rbac_group_privilages, musimy też utworzyć drugą tabelę rbac_user_privilages o podobnej strukturze jak ta poprzednia. Taka zmiana pozwoli nam już dodawać indywidualne uprawnienia dla użytkowników. Z założeń pozostało nam jeszcze grupa do grup zadań czyli naszych controllerów, oraz użytkownik do grupy zadań. Jakby nie patrzeć są to dodatkowe dwie tabele, których utworzenie nie powinno przysporzyć większych problemów.</p>
<h3>Logika struktury sql</h3>
<p>Można by się zapytać po co tyle tabel? A bardzo chętnie na to pytanie odpowiem, otóż baza danych nie jest stworzona po to by trzymać w niej to co się chce i nawet bez sensu, takie rzeczy dyskryminują nas od razu w oczach pracodawcy. Więc dane nie powinny się powtarzać, kolumny powinny być tak tworzone by zawierały jak najmniej wartości NULL chyba że ma to pewien sens. Coś na zasadzie &#8220;Dziel i zwyciężaj&#8221; tylko tutaj prawda nie mamy żadnych algorytmów <img src='http://www.cojack.pl/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<h3>Priorytety w Role Based Access Control</h3>
<p>Mamy taki problem: Czy pobrać wszystko za jednym zamachem i sprawdzać dostęp za pomocą tego co mamy, czy sprawdzać pobierając dane po kolei? I odpowiedź bez sprawdzenia tego, które z założeń jest szybsze jest chyba absurdem, niestety nie mam na razie na to czasu by to sprawdzić, lecz chciałbym ustalić kolejność priorytetów. Założenie jest takie: Każdy użytkownik jest przypisany do jakiejś grupy, użytkownik bez grupy też jest w grupie użytkowników a mowa tutaj o osobach które nie są zarejestrowane na naszej stronie, można przyjąć ich za grupę Guest, czyli gości. Taki paradoks. I teraz priorytety wg mnie można by ustalić w ten sposób:</p>
<ol>
<li>Sprawdzanie czy grupa ma dostęp do controllera, czyli naszej grupy zadań.
<ol>
<li>Ma, sprawdzamy czy grupa ma dostęp do akcji w kontrolerze, czyli naszego zadania
<ol>
<li> Ma, zezwalamy</li>
<li>Nie ma, przechodzimy do pkt 2</li>
</ol>
</li>
<li>Nie ma, przechodzimy do pkt 2</li>
</ol>
</li>
<li>Grupa nie ma uprawnień do zadania w controllerze, sprawdzamy czy użytkownik ma dostęp do controllera
<ol>
<li>Ma, sprawdzamy czy ma dostęp do akcji w kontrolerze
<ol>
<li>Ma, zezwalamy</li>
<li>Nie ma, odmawiamy</li>
</ol>
</li>
<li>Nie ma, odmawiamy</li>
</ol>
</li>
<li> Amen </li>
</ol>
<h3>Hierarchia, czyli dziedziczenie uprawnień</h3>
<p>Szczerze jak sobie pomyślę o takim założeniu to zaczyna mnie głowa boleć, bo już sobie w głowie tworzę taką aplikację w sql która musi to sprawdzać, no daję głowę, szczęka opada&#8230; Więc nie wiem czy aby na pewno jest to słuszne by tworzyć to, ale słowo się rzekło, to i się to napisze. Tylko obawiam się że bez rekurencji to nie przejdzie, chociaż nie jestem tego jeszcze do końca pewien, być może nie będzie tak źle na jak to wygląda. Dodatkowe akcje wchodzą w grę, należy sprawdzać czy jeżeli np grupa nie ma uprawnień do akcji, czy nad grupa ma pozwolenie na tą akcję oraz czy pozwala ją dziedziczyć, gdyby ktoś wyjechał z pomysłem komu pozwala ją dziedziczyć to w ogóle jeszcze więcej roboty, więc proszę nie dobijać leżącego <img src='http://www.cojack.pl/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  Huh chociaż dobrze że nie ma sensu robić hierarchie użytkowników, bo od tego jest rbac właśnie by zrobił to za nas.</p>
<h4>Słów kilka na zakończenie</h4>
<p>Myślę że jest to optymalne sprawdzanie, chyba że coś pominąłem to mnie poprawcie, trochę z rana mogę być jeszcze nie ogarnięty z wszystkim, więc pisać w komentarzach co i jak.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.cojack.pl/role-based-access-control-cz-3/326/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Role Based Access Control cz.2</title>
		<link>http://www.cojack.pl/role-based-access-control-cz-2/319</link>
		<comments>http://www.cojack.pl/role-based-access-control-cz-2/319#comments</comments>
		<pubDate>Tue, 19 Jan 2010 19:57:11 +0000</pubDate>
		<dc:creator>cojack</dc:creator>
				<category><![CDATA[SQL]]></category>
		<category><![CDATA[postgresql]]></category>
		<category><![CDATA[rbac]]></category>
		<category><![CDATA[role based access control]]></category>
		<category><![CDATA[uprawnienia]]></category>

		<guid isPermaLink="false">http://www.cojack.pl/?p=319</guid>
		<description><![CDATA[ Nadszedł czas na pierwszą implementację tej struktury w sql, oczywiście nie jest to czego byśmy oczekiwali ponieważ ma pewne braki które mogły by się wydawać dla większego użytku wprost odwrotnie proporcjonalne do zastosowania role based access control. Otóż jest trochę uproszczona struktura, dlaczego? Mieliśmy w pracy z kolegą burzę ...]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft" title="PostgreSQL" src="http://www.cojack.pl/wp-content/arch-postgresql.png" alt="" height="100" width="100"> Nadszedł czas na pierwszą implementację tej struktury w sql, oczywiście nie jest to czego byśmy oczekiwali ponieważ ma pewne braki które mogły by się wydawać dla większego użytku wprost odwrotnie proporcjonalne do zastosowania <strong>role based access control</strong>. Otóż jest trochę uproszczona struktura, dlaczego? Mieliśmy w pracy z kolegą burzę mózgów na ten temat gdyż go bardzo zainteresował i doszedł do wniosku iż konstruowanie kolosa może mieć negatywny wpływ na jego interfejs, i prawdę powiedziawszy po głębszym zastanowieniu się oraz doświadczeniu wyniesionym z używania phpbb (taki skrypt forum) doszedłem do wniosku iż ma chłop rację. Więc na pierwszy ogień skonstruowaliśmy taką oto strukturę rbac&#8217;a, ale moje ego nie pozwala mi na zakończenie prac nad tym i będę kontynuował rozwój do takiego stopnia że stwierdzę iż większego kolosa się zbudować nie da ponieważ zawiera już wszystko. </p>
<h3>Struktura SQL Role Based Access Control</h3>
<p>Także do dzieła, struktura bazy danych:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;">BEGIN;
&nbsp;
<span style="color: #993333; font-weight: bold;">DROP</span> <span style="color: #993333; font-weight: bold;">TABLE</span> <span style="color: #993333; font-weight: bold;">IF</span> <span style="color: #993333; font-weight: bold;">EXISTS</span> <span style="color: #ff0000;">&quot;rbac_user&quot;</span> CASCADE;
<span style="color: #993333; font-weight: bold;">CREATE</span> <span style="color: #993333; font-weight: bold;">TABLE</span> <span style="color: #ff0000;">&quot;rbac_user&quot;</span>
<span style="color: #66cc66;">&#40;</span>
   <span style="color: #ff0000;">&quot;idUser&quot;</span> SERIAL <span style="color: #993333; font-weight: bold;">PRIMARY</span> <span style="color: #993333; font-weight: bold;">KEY</span><span style="color: #66cc66;">,</span>
   <span style="color: #ff0000;">&quot;userName&quot;</span> VARCHAR<span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">255</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span>
<span style="color: #66cc66;">&#41;</span>;
&nbsp;
<span style="color: #993333; font-weight: bold;">DROP</span> <span style="color: #993333; font-weight: bold;">TABLE</span> <span style="color: #993333; font-weight: bold;">IF</span> <span style="color: #993333; font-weight: bold;">EXISTS</span> <span style="color: #ff0000;">&quot;rbac_group&quot;</span> CASCADE;
<span style="color: #993333; font-weight: bold;">CREATE</span> <span style="color: #993333; font-weight: bold;">TABLE</span> <span style="color: #ff0000;">&quot;rbac_group&quot;</span>
<span style="color: #66cc66;">&#40;</span>
   <span style="color: #ff0000;">&quot;idGroup&quot;</span> SERIAL <span style="color: #993333; font-weight: bold;">PRIMARY</span> <span style="color: #993333; font-weight: bold;">KEY</span><span style="color: #66cc66;">,</span>
   <span style="color: #ff0000;">&quot;groupName&quot;</span> VARCHAR<span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">255</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">UNIQUE</span> <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span>
<span style="color: #66cc66;">&#41;</span>;
&nbsp;
<span style="color: #993333; font-weight: bold;">DROP</span> <span style="color: #993333; font-weight: bold;">TABLE</span> <span style="color: #993333; font-weight: bold;">IF</span> <span style="color: #993333; font-weight: bold;">EXISTS</span> <span style="color: #ff0000;">&quot;rbac_user_to_group&quot;</span>;
<span style="color: #993333; font-weight: bold;">CREATE</span> <span style="color: #993333; font-weight: bold;">TABLE</span> <span style="color: #ff0000;">&quot;rbac_user_to_group&quot;</span>
<span style="color: #66cc66;">&#40;</span>
   <span style="color: #ff0000;">&quot;idUser&quot;</span> INT <span style="color: #993333; font-weight: bold;">REFERENCES</span> <span style="color: #ff0000;">&quot;rbac_user&quot;</span><span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">&quot;idUser&quot;</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span><span style="color: #66cc66;">,</span>
   <span style="color: #ff0000;">&quot;idGroup&quot;</span> INT <span style="color: #993333; font-weight: bold;">REFERENCES</span> <span style="color: #ff0000;">&quot;rbac_group&quot;</span><span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">&quot;idGroup&quot;</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span><span style="color: #66cc66;">,</span>
   <span style="color: #993333; font-weight: bold;">PRIMARY</span> <span style="color: #993333; font-weight: bold;">KEY</span><span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">&quot;idUser&quot;</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">&quot;idGroup&quot;</span> <span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#41;</span>;
&nbsp;
<span style="color: #993333; font-weight: bold;">DROP</span> <span style="color: #993333; font-weight: bold;">TABLE</span> <span style="color: #993333; font-weight: bold;">IF</span> <span style="color: #993333; font-weight: bold;">EXISTS</span> <span style="color: #ff0000;">&quot;rbac_module&quot;</span> CASCADE;
<span style="color: #993333; font-weight: bold;">CREATE</span> <span style="color: #993333; font-weight: bold;">TABLE</span> <span style="color: #ff0000;">&quot;rbac_module&quot;</span>
<span style="color: #66cc66;">&#40;</span>
   <span style="color: #ff0000;">&quot;idModule&quot;</span> SERIAL <span style="color: #993333; font-weight: bold;">PRIMARY</span> <span style="color: #993333; font-weight: bold;">KEY</span><span style="color: #66cc66;">,</span>
   <span style="color: #ff0000;">&quot;moduleName&quot;</span> VARCHAR<span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">255</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">UNIQUE</span> <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span>
<span style="color: #66cc66;">&#41;</span>;
&nbsp;
<span style="color: #993333; font-weight: bold;">DROP</span> <span style="color: #993333; font-weight: bold;">TABLE</span> <span style="color: #993333; font-weight: bold;">IF</span> <span style="color: #993333; font-weight: bold;">EXISTS</span> <span style="color: #ff0000;">&quot;rbac_action&quot;</span> CASCADE;
<span style="color: #993333; font-weight: bold;">CREATE</span> <span style="color: #993333; font-weight: bold;">TABLE</span> <span style="color: #ff0000;">&quot;rbac_action&quot;</span>
<span style="color: #66cc66;">&#40;</span>
   <span style="color: #ff0000;">&quot;idAction&quot;</span> SERIAL <span style="color: #993333; font-weight: bold;">PRIMARY</span> <span style="color: #993333; font-weight: bold;">KEY</span><span style="color: #66cc66;">,</span>
   <span style="color: #ff0000;">&quot;idModule&quot;</span> INT <span style="color: #993333; font-weight: bold;">REFERENCES</span> <span style="color: #ff0000;">&quot;rbac_module&quot;</span><span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">&quot;idModule&quot;</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span><span style="color: #66cc66;">,</span>
   <span style="color: #ff0000;">&quot;actionName&quot;</span> VARCHAR<span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">255</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span><span style="color: #66cc66;">,</span>
   <span style="color: #ff0000;">&quot;inherited&quot;</span> <span style="color: #993333; font-weight: bold;">BOOLEAN</span> <span style="color: #993333; font-weight: bold;">DEFAULT</span> FALSE <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span><span style="color: #66cc66;">,</span>
   <span style="color: #993333; font-weight: bold;">UNIQUE</span><span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">&quot;actionName&quot;</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">&quot;idModule&quot;</span> <span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#41;</span>;
&nbsp;
<span style="color: #993333; font-weight: bold;">DROP</span> <span style="color: #993333; font-weight: bold;">TABLE</span> <span style="color: #993333; font-weight: bold;">IF</span> <span style="color: #993333; font-weight: bold;">EXISTS</span> <span style="color: #ff0000;">&quot;rbac_privilages&quot;</span>;
<span style="color: #993333; font-weight: bold;">CREATE</span> <span style="color: #993333; font-weight: bold;">TABLE</span> <span style="color: #ff0000;">&quot;rbac_privilages&quot;</span>
<span style="color: #66cc66;">&#40;</span>
   <span style="color: #ff0000;">&quot;idGroup&quot;</span> INT <span style="color: #993333; font-weight: bold;">REFERENCES</span> <span style="color: #ff0000;">&quot;rbac_group&quot;</span><span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">&quot;idGroup&quot;</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span><span style="color: #66cc66;">,</span>
   <span style="color: #ff0000;">&quot;idModule&quot;</span> INT <span style="color: #993333; font-weight: bold;">REFERENCES</span> <span style="color: #ff0000;">&quot;rbac_module&quot;</span><span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">&quot;idModule&quot;</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span><span style="color: #66cc66;">,</span>
   <span style="color: #ff0000;">&quot;idAction&quot;</span> INT <span style="color: #993333; font-weight: bold;">REFERENCES</span> <span style="color: #ff0000;">&quot;rbac_action&quot;</span><span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">&quot;idAction&quot;</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span><span style="color: #66cc66;">,</span>
   <span style="color: #ff0000;">&quot;allow&quot;</span> <span style="color: #993333; font-weight: bold;">BOOLEAN</span> <span style="color: #993333; font-weight: bold;">DEFAULT</span> FALSE <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span><span style="color: #66cc66;">,</span>
   <span style="color: #993333; font-weight: bold;">PRIMARY</span> <span style="color: #993333; font-weight: bold;">KEY</span><span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">&quot;idGroup&quot;</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">&quot;idModule&quot;</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">&quot;idAction&quot;</span> <span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#41;</span>;
&nbsp;
COMMIT;</pre></div></div>

<p>Użyłem transakcji, w posgresql można <img src='http://www.cojack.pl/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  W MySQL też, pod warunkiem że typ tabeli to InnoDB. Ale nie teraz o tym rzecz. Co jest co?</p>
<p><strong>rbac_user</strong> &#8211; tabela przechowująca użytkowników naszego systemu<br />
<strong>rbac_group</strong> &#8211; tabela przechowująca grupy w naszym systemie<br />
<strong>rbac_user_to_group</strong> &#8211; tabela wiążąca użytkowników z grupami, relacja typu many-to-many (wiele do wielu)<br />
<strong>rbac_module</strong> &#8211; tabela przechowująca nazwy naszych modułów, można to rozumieć jako controllery naszej aplikacji<br />
<strong>rbac_action</strong> &#8211; tabela przechowująca nazwy naszych akcji, trzeba to rozumieć jako metody w naszych controllerach, relacja typu many-to-one (wiele do jednego, to samo co jeden do wielu [one-to-many])<br />
<strong>rbac_privilages</strong> &#8211; a to jest tabela wiążąca grupę użytkowników, moduł i akcję.</p>
<h3>Demo Role Based Access Control</h3>
<p>Teraz jak to ustrojstwo wypełnić danymi? Bardzo proszę:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;">BEGIN;
&nbsp;
<span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> <span style="color: #ff0000;">&quot;rbac_user&quot;</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">&quot;userName&quot;</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">VALUES</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">'przemek'</span> <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">'maciej'</span> <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">'andrzej'</span> <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">'grzesiek'</span> <span style="color: #66cc66;">&#41;</span>;
<span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> <span style="color: #ff0000;">&quot;rbac_group&quot;</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">&quot;groupName&quot;</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">VALUES</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">'admin'</span> <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">'user'</span> <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">'moderator'</span> <span style="color: #66cc66;">&#41;</span>;
<span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> <span style="color: #ff0000;">&quot;rbac_user_to_group&quot;</span> <span style="color: #993333; font-weight: bold;">VALUES</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">1</span> <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">2</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">3</span> <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">3</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">2</span> <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">4</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">2</span> <span style="color: #66cc66;">&#41;</span>;
<span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> <span style="color: #ff0000;">&quot;rbac_module&quot;</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">&quot;moduleName&quot;</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">VALUES</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">'news'</span> <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">'articles'</span> <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">'download'</span> <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">'music'</span> <span style="color: #66cc66;">&#41;</span>;
<span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> <span style="color: #ff0000;">&quot;rbac_action&quot;</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">&quot;idModule&quot;</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">&quot;actionName&quot;</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">&quot;inherited&quot;</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">VALUES</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'index'</span><span style="color: #66cc66;">,</span> FALSE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'edit'</span><span style="color: #66cc66;">,</span> FALSE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'add'</span><span style="color: #66cc66;">,</span> FALSE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'delete'</span><span style="color: #66cc66;">,</span> FALSE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'block'</span><span style="color: #66cc66;">,</span> FALSE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">2</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'index'</span><span style="color: #66cc66;">,</span> TRUE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">2</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'edit'</span><span style="color: #66cc66;">,</span> TRUE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">2</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'add'</span><span style="color: #66cc66;">,</span> TRUE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">2</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'delete'</span><span style="color: #66cc66;">,</span> TRUE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">2</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'block'</span><span style="color: #66cc66;">,</span> TRUE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">3</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'index'</span><span style="color: #66cc66;">,</span> TRUE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">3</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'edit'</span><span style="color: #66cc66;">,</span> FALSE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">3</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'add'</span><span style="color: #66cc66;">,</span> TRUE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">3</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'delete'</span><span style="color: #66cc66;">,</span> FALSE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">3</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'block'</span><span style="color: #66cc66;">,</span> FALSE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">3</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'download'</span><span style="color: #66cc66;">,</span> TRUE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>   
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">4</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'index'</span><span style="color: #66cc66;">,</span> TRUE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">4</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'edit'</span><span style="color: #66cc66;">,</span> TRUE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">4</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'add'</span><span style="color: #66cc66;">,</span> FALSE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">4</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'delete'</span><span style="color: #66cc66;">,</span> FALSE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">4</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'block'</span><span style="color: #66cc66;">,</span> FALSE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">4</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'download'</span><span style="color: #66cc66;">,</span> FALSE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">4</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'play'</span><span style="color: #66cc66;">,</span> TRUE <span style="color: #66cc66;">&#41;</span>;
&nbsp;
<span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> <span style="color: #ff0000;">&quot;rbac_privilages&quot;</span> <span style="color: #993333; font-weight: bold;">VALUES</span> 
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">,</span> TRUE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">2</span><span style="color: #66cc66;">,</span> TRUE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">3</span><span style="color: #66cc66;">,</span> TRUE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">4</span><span style="color: #66cc66;">,</span> TRUE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">5</span><span style="color: #66cc66;">,</span> TRUE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">2</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">,</span> TRUE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">2</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">2</span><span style="color: #66cc66;">,</span> FALSE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">2</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">3</span><span style="color: #66cc66;">,</span> TRUE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">2</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">4</span><span style="color: #66cc66;">,</span> FALSE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">2</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">5</span><span style="color: #66cc66;">,</span> FALSE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">3</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">,</span> TRUE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">3</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">2</span><span style="color: #66cc66;">,</span> TRUE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">3</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">3</span><span style="color: #66cc66;">,</span> TRUE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">3</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">4</span><span style="color: #66cc66;">,</span> TRUE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">3</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">5</span><span style="color: #66cc66;">,</span> FALSE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">2</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">6</span><span style="color: #66cc66;">,</span> TRUE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">2</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">7</span><span style="color: #66cc66;">,</span> TRUE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">2</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">8</span><span style="color: #66cc66;">,</span> TRUE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">2</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">9</span><span style="color: #66cc66;">,</span> TRUE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">2</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">10</span><span style="color: #66cc66;">,</span> TRUE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">2</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">2</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">6</span><span style="color: #66cc66;">,</span> TRUE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">2</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">2</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">7</span><span style="color: #66cc66;">,</span> FALSE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">2</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">2</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">8</span><span style="color: #66cc66;">,</span> TRUE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">2</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">2</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">9</span><span style="color: #66cc66;">,</span> FALSE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">2</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">2</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">10</span><span style="color: #66cc66;">,</span> FALSE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">3</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">2</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">6</span><span style="color: #66cc66;">,</span> TRUE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">3</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">2</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">7</span><span style="color: #66cc66;">,</span> TRUE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">3</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">2</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">8</span><span style="color: #66cc66;">,</span> TRUE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">3</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">2</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">9</span><span style="color: #66cc66;">,</span> TRUE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">3</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">2</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">10</span><span style="color: #66cc66;">,</span> FALSE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">3</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">11</span><span style="color: #66cc66;">,</span> TRUE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">3</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">12</span><span style="color: #66cc66;">,</span> TRUE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">3</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">13</span><span style="color: #66cc66;">,</span> TRUE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">3</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">14</span><span style="color: #66cc66;">,</span> TRUE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">3</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">15</span><span style="color: #66cc66;">,</span> TRUE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">3</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">16</span><span style="color: #66cc66;">,</span> TRUE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">2</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">3</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">11</span><span style="color: #66cc66;">,</span> TRUE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">2</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">3</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">12</span><span style="color: #66cc66;">,</span> FALSE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">2</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">3</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">13</span><span style="color: #66cc66;">,</span> TRUE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">2</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">3</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">14</span><span style="color: #66cc66;">,</span> FALSE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">2</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">3</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">15</span><span style="color: #66cc66;">,</span> FALSE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">2</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">3</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">16</span><span style="color: #66cc66;">,</span> TRUE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">3</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">3</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">11</span><span style="color: #66cc66;">,</span> TRUE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">3</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">3</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">12</span><span style="color: #66cc66;">,</span> TRUE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">3</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">3</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">13</span><span style="color: #66cc66;">,</span> TRUE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">3</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">3</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">14</span><span style="color: #66cc66;">,</span> FALSE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">3</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">3</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">15</span><span style="color: #66cc66;">,</span> TRUE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">3</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">3</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">16</span><span style="color: #66cc66;">,</span> TRUE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">4</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">17</span><span style="color: #66cc66;">,</span> TRUE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">4</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">18</span><span style="color: #66cc66;">,</span> TRUE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">4</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">19</span><span style="color: #66cc66;">,</span> TRUE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">4</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">20</span><span style="color: #66cc66;">,</span> TRUE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">4</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">21</span><span style="color: #66cc66;">,</span> TRUE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">4</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">22</span><span style="color: #66cc66;">,</span> TRUE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">4</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">23</span><span style="color: #66cc66;">,</span> TRUE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">2</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">4</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">17</span><span style="color: #66cc66;">,</span> TRUE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">2</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">4</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">18</span><span style="color: #66cc66;">,</span> FALSE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">2</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">4</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">19</span><span style="color: #66cc66;">,</span> TRUE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">2</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">4</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">20</span><span style="color: #66cc66;">,</span> FALSE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">2</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">4</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">21</span><span style="color: #66cc66;">,</span> FALSE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">2</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">4</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">22</span><span style="color: #66cc66;">,</span> TRUE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">2</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">4</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">23</span><span style="color: #66cc66;">,</span> TRUE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">3</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">4</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">17</span><span style="color: #66cc66;">,</span> TRUE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">3</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">4</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">18</span><span style="color: #66cc66;">,</span> TRUE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">3</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">4</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">19</span><span style="color: #66cc66;">,</span> TRUE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">3</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">4</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">20</span><span style="color: #66cc66;">,</span> FALSE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">3</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">4</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">21</span><span style="color: #66cc66;">,</span> TRUE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">3</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">4</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">22</span><span style="color: #66cc66;">,</span> TRUE <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
   <span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">3</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">4</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">23</span><span style="color: #66cc66;">,</span> TRUE <span style="color: #66cc66;">&#41;</span>;
&nbsp;
COMMIT;</pre></div></div>

<p>Znowu transakcję, jakoś tak szybciej działa to <img src='http://www.cojack.pl/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  Jak pewnie zdążyliście zauważyć tabela <strong>rbac_action</strong> posiada kolumnę &#8220;inherited&#8221; która w późniejszym etapie mojej implementacji tego paradygmatu będzie potrzebna do tego by w hierarchii definiować czy dana akcja ma być dziedziczona dla pod grup. Taki ficzer.</p>
<p>Teraz tak, żeby to działało co jest wyżej przedstawione na gotowca, czyli copy-paste wymagana jest baza danych postgresql > 8.2. Dlaczego? A otóż dlatego że:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">DROP</span> <span style="color: #ff0000;">&quot;tabela&quot;</span> <span style="color: #993333; font-weight: bold;">IF</span> <span style="color: #993333; font-weight: bold;">EXISTS</span>;</pre></div></div>

<p> jest zaimplementowane od tej versji. Oj brakowało tego brakowało&#8230; Nie wiem jak z wierszami podawanymi po przecinku, gdyż w 8.1 to nie działa (mowa tutaj o klauzuli INSERT).</p>
<h3>Sprawdzanie uprawnień</h3>
<p>Pozostało nam już tylko jak to pobrać, dla przykładu nie tworzyłem żadnych testów wydajnościowych, chodź przyznam że łączymy parę tabel ale utworzone indeksy są w pełni wykorzystywane, przykład jak sprawdzić uprawnienia:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">SELECT</span> 
  <span style="color: #ff0000;">&quot;allow&quot;</span> 
<span style="color: #993333; font-weight: bold;">FROM</span> 
  <span style="color: #ff0000;">&quot;rbac_privilages&quot;</span> p 
<span style="color: #993333; font-weight: bold;">LEFT</span> <span style="color: #993333; font-weight: bold;">JOIN</span> 
  <span style="color: #ff0000;">&quot;rbac_module&quot;</span> m 
<span style="color: #993333; font-weight: bold;">ON</span> 
  <span style="color: #66cc66;">&#40;</span> p<span style="color: #66cc66;">.</span><span style="color: #ff0000;">&quot;idModule&quot;</span> <span style="color: #66cc66;">=</span> m<span style="color: #66cc66;">.</span><span style="color: #ff0000;">&quot;idModule&quot;</span> <span style="color: #66cc66;">&#41;</span> 
<span style="color: #993333; font-weight: bold;">LEFT</span> <span style="color: #993333; font-weight: bold;">JOIN</span> 
  <span style="color: #ff0000;">&quot;rbac_action&quot;</span> a 
<span style="color: #993333; font-weight: bold;">ON</span> 
  <span style="color: #66cc66;">&#40;</span> p<span style="color: #66cc66;">.</span><span style="color: #ff0000;">&quot;idAction&quot;</span> <span style="color: #66cc66;">=</span> a<span style="color: #66cc66;">.</span><span style="color: #ff0000;">&quot;idAction&quot;</span> <span style="color: #66cc66;">&#41;</span> 
<span style="color: #993333; font-weight: bold;">LEFT</span> <span style="color: #993333; font-weight: bold;">JOIN</span> 
  <span style="color: #ff0000;">&quot;rbac_user_to_group&quot;</span> u2g 
<span style="color: #993333; font-weight: bold;">ON</span> 
  <span style="color: #66cc66;">&#40;</span> p<span style="color: #66cc66;">.</span><span style="color: #ff0000;">&quot;idGroup&quot;</span> <span style="color: #66cc66;">=</span> u2g<span style="color: #66cc66;">.</span><span style="color: #ff0000;">&quot;idGroup&quot;</span> <span style="color: #66cc66;">&#41;</span> 
<span style="color: #993333; font-weight: bold;">WHERE</span> 
  u2g<span style="color: #66cc66;">.</span><span style="color: #ff0000;">&quot;idUser&quot;</span> <span style="color: #66cc66;">=</span> <span style="color: #cc66cc;">2</span> 
<span style="color: #993333; font-weight: bold;">AND</span> 
  m<span style="color: #66cc66;">.</span><span style="color: #ff0000;">&quot;moduleName&quot;</span> <span style="color: #66cc66;">=</span> <span style="color: #ff0000;">'music'</span> 
<span style="color: #993333; font-weight: bold;">AND</span> 
  a<span style="color: #66cc66;">.</span><span style="color: #ff0000;">&quot;actionName&quot;</span> <span style="color: #66cc66;">=</span> <span style="color: #ff0000;">'index'</span>;</pre></div></div>

<p>Możemy sobie z tego ładny widoczek utworzyć, ale może o tym kiedy indziej. A teraz co wykazało explain?</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"> Nested Loop  <span style="color: #66cc66;">&#40;</span>cost<span style="color: #66cc66;">=</span>8<span style="color: #66cc66;">.</span>28<span style="color: #66cc66;">..</span>14<span style="color: #66cc66;">.</span>17 rows<span style="color: #66cc66;">=</span><span style="color: #cc66cc;">1</span> width<span style="color: #66cc66;">=</span><span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span>
   <span style="color: #66cc66;">-&gt;</span>  Nested Loop  <span style="color: #66cc66;">&#40;</span>cost<span style="color: #66cc66;">=</span>8<span style="color: #66cc66;">.</span>28<span style="color: #66cc66;">..</span>13<span style="color: #66cc66;">.</span>19 rows<span style="color: #66cc66;">=</span><span style="color: #cc66cc;">1</span> width<span style="color: #66cc66;">=</span><span style="color: #cc66cc;">5</span><span style="color: #66cc66;">&#41;</span>
         <span style="color: #993333; font-weight: bold;">JOIN</span> Filter: <span style="color: #66cc66;">&#40;</span>p<span style="color: #66cc66;">.</span><span style="color: #ff0000;">&quot;idModule&quot;</span> <span style="color: #66cc66;">=</span> m<span style="color: #66cc66;">.</span><span style="color: #ff0000;">&quot;idModule&quot;</span><span style="color: #66cc66;">&#41;</span>
         <span style="color: #66cc66;">-&gt;</span>  Hash <span style="color: #993333; font-weight: bold;">JOIN</span>  <span style="color: #66cc66;">&#40;</span>cost<span style="color: #66cc66;">=</span>8<span style="color: #66cc66;">.</span>28<span style="color: #66cc66;">..</span>10<span style="color: #66cc66;">.</span>26 rows<span style="color: #66cc66;">=</span><span style="color: #cc66cc;">3</span> width<span style="color: #66cc66;">=</span><span style="color: #cc66cc;">9</span><span style="color: #66cc66;">&#41;</span>
               Hash Cond: <span style="color: #66cc66;">&#40;</span>p<span style="color: #66cc66;">.</span><span style="color: #ff0000;">&quot;idAction&quot;</span> <span style="color: #66cc66;">=</span> a<span style="color: #66cc66;">.</span><span style="color: #ff0000;">&quot;idAction&quot;</span><span style="color: #66cc66;">&#41;</span>
               <span style="color: #66cc66;">-&gt;</span>  Seq Scan <span style="color: #993333; font-weight: bold;">ON</span> rbac_privilages p  <span style="color: #66cc66;">&#40;</span>cost<span style="color: #66cc66;">=</span>0<span style="color: #66cc66;">.</span>00<span style="color: #66cc66;">..</span>1<span style="color: #66cc66;">.</span>69 rows<span style="color: #66cc66;">=</span><span style="color: #cc66cc;">69</span> width<span style="color: #66cc66;">=</span><span style="color: #cc66cc;">13</span><span style="color: #66cc66;">&#41;</span>
               <span style="color: #66cc66;">-&gt;</span>  Hash  <span style="color: #66cc66;">&#40;</span>cost<span style="color: #66cc66;">=</span>8<span style="color: #66cc66;">.</span>27<span style="color: #66cc66;">..</span>8<span style="color: #66cc66;">.</span>27 rows<span style="color: #66cc66;">=</span><span style="color: #cc66cc;">1</span> width<span style="color: #66cc66;">=</span><span style="color: #cc66cc;">4</span><span style="color: #66cc66;">&#41;</span>
                     <span style="color: #66cc66;">-&gt;</span>  <span style="color: #993333; font-weight: bold;">INDEX</span> Scan <span style="color: #993333; font-weight: bold;">USING</span> <span style="color: #ff0000;">&quot;rbac_action_actionName_key&quot;</span> <span style="color: #993333; font-weight: bold;">ON</span> rbac_action a  <span style="color: #66cc66;">&#40;</span>cost<span style="color: #66cc66;">=</span>0<span style="color: #66cc66;">.</span>00<span style="color: #66cc66;">..</span>8<span style="color: #66cc66;">.</span>27 rows<span style="color: #66cc66;">=</span><span style="color: #cc66cc;">1</span> width<span style="color: #66cc66;">=</span><span style="color: #cc66cc;">4</span><span style="color: #66cc66;">&#41;</span>
                           <span style="color: #993333; font-weight: bold;">INDEX</span> Cond: <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;actionName&quot;</span><span style="color: #66cc66;">&#41;</span>::text <span style="color: #66cc66;">=</span> <span style="color: #ff0000;">'index'</span>::text<span style="color: #66cc66;">&#41;</span>
         <span style="color: #66cc66;">-&gt;</span>  <span style="color: #993333; font-weight: bold;">INDEX</span> Scan <span style="color: #993333; font-weight: bold;">USING</span> <span style="color: #ff0000;">&quot;rbac_module_moduleName_key&quot;</span> <span style="color: #993333; font-weight: bold;">ON</span> rbac_module m  <span style="color: #66cc66;">&#40;</span>cost<span style="color: #66cc66;">=</span>0<span style="color: #66cc66;">.</span>00<span style="color: #66cc66;">..</span>0<span style="color: #66cc66;">.</span>97 rows<span style="color: #66cc66;">=</span><span style="color: #cc66cc;">1</span> width<span style="color: #66cc66;">=</span><span style="color: #cc66cc;">4</span><span style="color: #66cc66;">&#41;</span>
               <span style="color: #993333; font-weight: bold;">INDEX</span> Cond: <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>m<span style="color: #66cc66;">.</span><span style="color: #ff0000;">&quot;moduleName&quot;</span><span style="color: #66cc66;">&#41;</span>::text <span style="color: #66cc66;">=</span> <span style="color: #ff0000;">'music'</span>::text<span style="color: #66cc66;">&#41;</span>
   <span style="color: #66cc66;">-&gt;</span>  <span style="color: #993333; font-weight: bold;">INDEX</span> Scan <span style="color: #993333; font-weight: bold;">USING</span> rbac_user_to_group_pkey <span style="color: #993333; font-weight: bold;">ON</span> rbac_user_to_group u2g  <span style="color: #66cc66;">&#40;</span>cost<span style="color: #66cc66;">=</span>0<span style="color: #66cc66;">.</span>00<span style="color: #66cc66;">..</span>0<span style="color: #66cc66;">.</span>97 rows<span style="color: #66cc66;">=</span><span style="color: #cc66cc;">1</span> width<span style="color: #66cc66;">=</span><span style="color: #cc66cc;">4</span><span style="color: #66cc66;">&#41;</span>
         <span style="color: #993333; font-weight: bold;">INDEX</span> Cond: <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>u2g<span style="color: #66cc66;">.</span><span style="color: #ff0000;">&quot;idUser&quot;</span> <span style="color: #66cc66;">=</span> <span style="color: #cc66cc;">2</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">AND</span> <span style="color: #66cc66;">&#40;</span>u2g<span style="color: #66cc66;">.</span><span style="color: #ff0000;">&quot;idGroup&quot;</span> <span style="color: #66cc66;">=</span> p<span style="color: #66cc66;">.</span><span style="color: #ff0000;">&quot;idGroup&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">13</span> rows<span style="color: #66cc66;">&#41;</span></pre></div></div>

<p>A co explain z analyze?</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"> Nested Loop  <span style="color: #66cc66;">&#40;</span>cost<span style="color: #66cc66;">=</span>8<span style="color: #66cc66;">.</span>28<span style="color: #66cc66;">..</span>14<span style="color: #66cc66;">.</span>17 rows<span style="color: #66cc66;">=</span><span style="color: #cc66cc;">1</span> width<span style="color: #66cc66;">=</span><span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span>actual time<span style="color: #66cc66;">=</span>0<span style="color: #66cc66;">.</span>449<span style="color: #66cc66;">..</span>0<span style="color: #66cc66;">.</span>480 rows<span style="color: #66cc66;">=</span><span style="color: #cc66cc;">1</span> loops<span style="color: #66cc66;">=</span><span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span>
   <span style="color: #66cc66;">-&gt;</span>  Nested Loop  <span style="color: #66cc66;">&#40;</span>cost<span style="color: #66cc66;">=</span>8<span style="color: #66cc66;">.</span>28<span style="color: #66cc66;">..</span>13<span style="color: #66cc66;">.</span>19 rows<span style="color: #66cc66;">=</span><span style="color: #cc66cc;">1</span> width<span style="color: #66cc66;">=</span><span style="color: #cc66cc;">5</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span>actual time<span style="color: #66cc66;">=</span>0<span style="color: #66cc66;">.</span>355<span style="color: #66cc66;">..</span>0<span style="color: #66cc66;">.</span>449 rows<span style="color: #66cc66;">=</span><span style="color: #cc66cc;">3</span> loops<span style="color: #66cc66;">=</span><span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span>
         <span style="color: #993333; font-weight: bold;">JOIN</span> Filter: <span style="color: #66cc66;">&#40;</span>p<span style="color: #66cc66;">.</span><span style="color: #ff0000;">&quot;idModule&quot;</span> <span style="color: #66cc66;">=</span> m<span style="color: #66cc66;">.</span><span style="color: #ff0000;">&quot;idModule&quot;</span><span style="color: #66cc66;">&#41;</span>
         <span style="color: #66cc66;">-&gt;</span>  Hash <span style="color: #993333; font-weight: bold;">JOIN</span>  <span style="color: #66cc66;">&#40;</span>cost<span style="color: #66cc66;">=</span>8<span style="color: #66cc66;">.</span>28<span style="color: #66cc66;">..</span>10<span style="color: #66cc66;">.</span>26 rows<span style="color: #66cc66;">=</span><span style="color: #cc66cc;">3</span> width<span style="color: #66cc66;">=</span><span style="color: #cc66cc;">9</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span>actual time<span style="color: #66cc66;">=</span>0<span style="color: #66cc66;">.</span>083<span style="color: #66cc66;">..</span>0<span style="color: #66cc66;">.</span>288 rows<span style="color: #66cc66;">=</span><span style="color: #cc66cc;">12</span> loops<span style="color: #66cc66;">=</span><span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span>
               Hash Cond: <span style="color: #66cc66;">&#40;</span>p<span style="color: #66cc66;">.</span><span style="color: #ff0000;">&quot;idAction&quot;</span> <span style="color: #66cc66;">=</span> a<span style="color: #66cc66;">.</span><span style="color: #ff0000;">&quot;idAction&quot;</span><span style="color: #66cc66;">&#41;</span>
               <span style="color: #66cc66;">-&gt;</span>  Seq Scan <span style="color: #993333; font-weight: bold;">ON</span> rbac_privilages p  <span style="color: #66cc66;">&#40;</span>cost<span style="color: #66cc66;">=</span>0<span style="color: #66cc66;">.</span>00<span style="color: #66cc66;">..</span>1<span style="color: #66cc66;">.</span>69 rows<span style="color: #66cc66;">=</span><span style="color: #cc66cc;">69</span> width<span style="color: #66cc66;">=</span><span style="color: #cc66cc;">13</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span>actual time<span style="color: #66cc66;">=</span>0<span style="color: #66cc66;">.</span>012<span style="color: #66cc66;">..</span>0<span style="color: #66cc66;">.</span>099 rows<span style="color: #66cc66;">=</span><span style="color: #cc66cc;">69</span> loops<span style="color: #66cc66;">=</span><span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span>
               <span style="color: #66cc66;">-&gt;</span>  Hash  <span style="color: #66cc66;">&#40;</span>cost<span style="color: #66cc66;">=</span>8<span style="color: #66cc66;">.</span>27<span style="color: #66cc66;">..</span>8<span style="color: #66cc66;">.</span>27 rows<span style="color: #66cc66;">=</span><span style="color: #cc66cc;">1</span> width<span style="color: #66cc66;">=</span><span style="color: #cc66cc;">4</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span>actual time<span style="color: #66cc66;">=</span>0<span style="color: #66cc66;">.</span>049<span style="color: #66cc66;">..</span>0<span style="color: #66cc66;">.</span>049 rows<span style="color: #66cc66;">=</span><span style="color: #cc66cc;">4</span> loops<span style="color: #66cc66;">=</span><span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span>
                     <span style="color: #66cc66;">-&gt;</span>  <span style="color: #993333; font-weight: bold;">INDEX</span> Scan <span style="color: #993333; font-weight: bold;">USING</span> <span style="color: #ff0000;">&quot;rbac_action_actionName_key&quot;</span> <span style="color: #993333; font-weight: bold;">ON</span> rbac_action a  <span style="color: #66cc66;">&#40;</span>cost<span style="color: #66cc66;">=</span>0<span style="color: #66cc66;">.</span>00<span style="color: #66cc66;">..</span>8<span style="color: #66cc66;">.</span>27 rows<span style="color: #66cc66;">=</span><span style="color: #cc66cc;">1</span> width<span style="color: #66cc66;">=</span><span style="color: #cc66cc;">4</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span>actual time<span style="color: #66cc66;">=</span>0<span style="color: #66cc66;">.</span>027<span style="color: #66cc66;">..</span>0<span style="color: #66cc66;">.</span>036 rows<span style="color: #66cc66;">=</span><span style="color: #cc66cc;">4</span> loops<span style="color: #66cc66;">=</span><span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span>
                           <span style="color: #993333; font-weight: bold;">INDEX</span> Cond: <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;actionName&quot;</span><span style="color: #66cc66;">&#41;</span>::text <span style="color: #66cc66;">=</span> <span style="color: #ff0000;">'index'</span>::text<span style="color: #66cc66;">&#41;</span>
         <span style="color: #66cc66;">-&gt;</span>  <span style="color: #993333; font-weight: bold;">INDEX</span> Scan <span style="color: #993333; font-weight: bold;">USING</span> <span style="color: #ff0000;">&quot;rbac_module_moduleName_key&quot;</span> <span style="color: #993333; font-weight: bold;">ON</span> rbac_module m  <span style="color: #66cc66;">&#40;</span>cost<span style="color: #66cc66;">=</span>0<span style="color: #66cc66;">.</span>00<span style="color: #66cc66;">..</span>0<span style="color: #66cc66;">.</span>97 rows<span style="color: #66cc66;">=</span><span style="color: #cc66cc;">1</span> width<span style="color: #66cc66;">=</span><span style="color: #cc66cc;">4</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span>actual time<span style="color: #66cc66;">=</span>0<span style="color: #66cc66;">.</span>006<span style="color: #66cc66;">..</span>0<span style="color: #66cc66;">.</span>008 rows<span style="color: #66cc66;">=</span><span style="color: #cc66cc;">1</span> loops<span style="color: #66cc66;">=</span><span style="color: #cc66cc;">12</span><span style="color: #66cc66;">&#41;</span>
               <span style="color: #993333; font-weight: bold;">INDEX</span> Cond: <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>m<span style="color: #66cc66;">.</span><span style="color: #ff0000;">&quot;moduleName&quot;</span><span style="color: #66cc66;">&#41;</span>::text <span style="color: #66cc66;">=</span> <span style="color: #ff0000;">'music'</span>::text<span style="color: #66cc66;">&#41;</span>
   <span style="color: #66cc66;">-&gt;</span>  <span style="color: #993333; font-weight: bold;">INDEX</span> Scan <span style="color: #993333; font-weight: bold;">USING</span> rbac_user_to_group_pkey <span style="color: #993333; font-weight: bold;">ON</span> rbac_user_to_group u2g  <span style="color: #66cc66;">&#40;</span>cost<span style="color: #66cc66;">=</span>0<span style="color: #66cc66;">.</span>00<span style="color: #66cc66;">..</span>0<span style="color: #66cc66;">.</span>97 rows<span style="color: #66cc66;">=</span><span style="color: #cc66cc;">1</span> width<span style="color: #66cc66;">=</span><span style="color: #cc66cc;">4</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span>actual time<span style="color: #66cc66;">=</span>0<span style="color: #66cc66;">.</span>005<span style="color: #66cc66;">..</span>0<span style="color: #66cc66;">.</span>006 rows<span style="color: #66cc66;">=</span><span style="color: #cc66cc;">0</span> loops<span style="color: #66cc66;">=</span><span style="color: #cc66cc;">3</span><span style="color: #66cc66;">&#41;</span>
         <span style="color: #993333; font-weight: bold;">INDEX</span> Cond: <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>u2g<span style="color: #66cc66;">.</span><span style="color: #ff0000;">&quot;idUser&quot;</span> <span style="color: #66cc66;">=</span> <span style="color: #cc66cc;">2</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">AND</span> <span style="color: #66cc66;">&#40;</span>u2g<span style="color: #66cc66;">.</span><span style="color: #ff0000;">&quot;idGroup&quot;</span> <span style="color: #66cc66;">=</span> p<span style="color: #66cc66;">.</span><span style="color: #ff0000;">&quot;idGroup&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
 Total runtime: <span style="color: #cc66cc;">0.576</span> ms
<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">14</span> rows<span style="color: #66cc66;">&#41;</span></pre></div></div>

<p>I skąd te 14 wierszy? Bladego pojęcia nie mam. (Edit już wiem ;p) Także czekam na Wasze konstruktywne opinie, chce zaznaczyć że całość nie jest tylko moim pomysłem ale również kolegi z pracy Maćka.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.cojack.pl/role-based-access-control-cz-2/319/feed</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Role Based Access Control</title>
		<link>http://www.cojack.pl/role-based-access-control/229</link>
		<comments>http://www.cojack.pl/role-based-access-control/229#comments</comments>
		<pubDate>Mon, 18 Jan 2010 14:14:42 +0000</pubDate>
		<dc:creator>cojack</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[acl]]></category>
		<category><![CDATA[rbac]]></category>
		<category><![CDATA[role based access control]]></category>
		<category><![CDATA[uprawnienia]]></category>

		<guid isPermaLink="false">http://cojack.os-cms.pl/?p=229</guid>
		<description><![CDATA[Ostatnio naszła mnie potrzeba na utworzenie listy kontroli dostępu dla użytkowników do modułów i akcji, cel zadania:

Użytkownik w wielu grupach
Grupy użytkowników	
Zadania
Grupy zadań
Dostęp grupie użytkowników do zadań
Dostęp grupie użytkowników do grupy zadań
Dostęp pojedynczemu użytkownikowi do zadań
Dostęp pojedynczemu użytkownikowi do grupy zadań
Hierarchia grup (dziedziczenie z rodzica grupy)

No i z pomocą przyszło google, ...]]></description>
			<content:encoded><![CDATA[<p>Ostatnio naszła mnie potrzeba na utworzenie listy kontroli dostępu dla użytkowników do modułów i akcji, cel zadania:</p>
<ol>
<li>Użytkownik w wielu grupach</li>
<li>Grupy użytkowników	</li>
<li>Zadania</li>
<li>Grupy zadań</li>
<li>Dostęp grupie użytkowników do zadań</li>
<li>Dostęp grupie użytkowników do grupy zadań</li>
<li>Dostęp pojedynczemu użytkownikowi do zadań</li>
<li>Dostęp pojedynczemu użytkownikowi do grupy zadań</li>
<li>Hierarchia grup (dziedziczenie z rodzica grupy)</li>
</ol>
<p>No i z pomocą przyszło google, a dokładnie strona: <a href="http://www.tonymarston.net/" rell="nofollow">link</a>, kolega przedstawił wzór graficzny w jaki sposób wszystko z sobą połączyć:</p>
<p><img src="http://www.tonymarston.net/php-mysql/rbac-05.png" alt="RBAC" /></p>
<p>W tablicy TASK (czyli zadania, będę przechowywał moduły i akcje, w postaci drzewa <em>(tak drzewo, mam już sposób w doctrine na prace z drzewem, opiszę nie długo, albo ltree się zobaczy)</em>, po adresie albo routerze, jeżeli będzie przepisany link, będę pobierał moduł i akcję którą w danej chwili wykonuje użytkownik, na samym początku będzie sprawdzanie czy użytkownik ma dostęp do grupy zadań, jeżeli ma, jest szansa na to że będzie miał dostęp do zadania, jeżeli nie, sprawdzimy grupę użytkownika, czy ma dostęp do grupy zadań, biorąc pod uwagę czy ma ojca i jakie on ma uprawnienia do zadań oraz czy pozwala na dziedziczenie tych uprawnień.</p>
<p>Do: <strong>Zyx</strong><br />
W ten sposób rozwiązuje nawet problem taki jaki mi przedstawiłeś dotyczący kategorii artykułów dopisując je jako dziecko articles.</p>
<p>Co o Tym sądzicie? Już nie długo przedstawię pełny kod <img src='http://www.cojack.pl/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.cojack.pl/role-based-access-control/229/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Szyfrowanie haseł</title>
		<link>http://www.cojack.pl/szyfrowanie-hasel/307</link>
		<comments>http://www.cojack.pl/szyfrowanie-hasel/307#comments</comments>
		<pubDate>Thu, 31 Dec 2009 20:59:21 +0000</pubDate>
		<dc:creator>cojack</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[crypt]]></category>
		<category><![CDATA[kryptografia]]></category>
		<category><![CDATA[md5]]></category>
		<category><![CDATA[sha1]]></category>
		<category><![CDATA[suma kontrolna]]></category>
		<category><![CDATA[szyfrowanie haseł]]></category>
		<category><![CDATA[tęczowe tablice]]></category>

		<guid isPermaLink="false">http://cojack.os-cms.pl/?p=307</guid>
		<description><![CDATA[ Pomyślałem o tym by napisać o szyfrowaniu haseł w php, gdyż dużo osób myśli że jak sobie utworzy sumę md5 z hasła to jest bezpieczny. Otóż nie. Jest prawdopodobieństwo wygenerowania dwóch jednakowych sum md5 dla dwóch różnych stringów (nie majtki  ). 
Dlaczego nie używać md5?
W internecie możemy przeczytać ...]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft" width="100" height="100" alt="" src="http://cojack.os-cms.pl/wp-content/arch-php.png" title="PHP"/> Pomyślałem o tym by napisać o szyfrowaniu haseł w php, gdyż dużo osób myśli że jak sobie utworzy sumę md5 z hasła to jest bezpieczny. Otóż nie. Jest prawdopodobieństwo wygenerowania dwóch jednakowych sum md5 dla dwóch różnych stringów (nie majtki <img src='http://www.cojack.pl/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> ). </p>
<h3>Dlaczego nie używać md5?</h3>
<p>W internecie możemy przeczytać nt używania sumy md5 w certyfikatach SSL przy połączeniach w np. systemach bankowych. Wg NIST (National Institute of Standards and Technology [ang. Narodowy Instytut Standaryzacji i Technologii]), powinno się wycofać używanie jej już w 1999r. I co Wy na to? Zdziwieni zapewne? A proszę bardzo, a to dlaczego? Jest za duża możliwość wygenerowania kolizji sumy, czyli to co pisałem wyżej wygenerowania dwóch identycznych sum.</p>
<h3>Co zamiast md5?</h3>
<p>Jest dużo algorytmów oferujących sumę kontrolną z stringu, lecz nie wszystkie są zalecane. W kolejności od najsłabszego:</p>
<ul>
<li>SHA1</li>
<li>SHA-224</li>
<li>SHA-256</li>
<li>SHA-384</li>
<li>SHA-512</li>
</ul>
<p>Wszystko wiąże się z przyrostem miejsca w bazie danych, więc i z czasem dostępu, porównaniem stringu. Szybciej jest pobrać 32 znaki alfanumeryczne z bazy danych niż 512 i je z sobą porównać. Ale na pewno nie jest bezpieczniej.</p>
<h3>crypt() dobra alternatywa</h3>
<p>Pewnie nie jeden z Was zastanawiał się jak w linuxie hasła są zabezpieczane. Otóż linux i unixowe systemy wykorzystują <em>sól</em> do zapisywania haseł. Tylko to nie polega na tym że wydzielimy sobie string, dorzucimy sól, połączymy ponownie i zrobimy z tego sumę md5 gdyż to nie zwiększy bezpieczeństwa.<br />
W php od wersji > 4 istnieje taka funkcja jak <strong>crypt()</strong>, <a href="http://php.net/manual/en/function.crypt.php" rel="nofollow">link-manual</a>. Funkcja ta ma zaimplementowany algorytm taki jak linuks do zapisywania hasła.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">function</span> genSalt<span style="color: #009900;">&#40;</span><span style="color: #000088;">$len</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">64</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000088;">$safeChars</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'0123456789abcdefghijkmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'</span><span style="color: #339933;">;</span>
    <span style="color: #000088;">$shuffle</span> <span style="color: #339933;">=</span> <span style="color: #990000;">str_shuffle</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$safeChars</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// mieszamy stringami ;)</span>
    <span style="color: #000088;">$n</span> <span style="color: #339933;">=</span> <span style="color: #990000;">strlen</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$safeChars</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #000088;">$p</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">''</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// na wszelki wypadek</span>
	<span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$i</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span> <span style="color: #000088;">$i</span> <span style="color: #339933;">&lt;</span> <span style="color: #000088;">$len</span><span style="color: #339933;">;</span> <span style="color: #000088;">$i</span><span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000088;">$p</span> <span style="color: #339933;">.=</span> <span style="color: #000088;">$shuffle</span><span style="color: #009900;">&#91;</span><span style="color: #990000;">rand</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">0</span><span style="color: #339933;">,</span> <span style="color: #000088;">$n</span> <span style="color: #339933;">-</span> <span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span> 
	<span style="color: #b1b100;">return</span> <span style="color: #000088;">$p</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000088;">$password</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$_POST</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'password'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$salt</span> <span style="color: #339933;">=</span> genSalt<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$pwdEncrypted</span> <span style="color: #339933;">=</span> <span style="color: #990000;">crypt</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$password</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'$2a$07$'</span><span style="color: #339933;">.</span><span style="color: #000088;">$salt</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'$'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">echo</span> <span style="color: #000088;">$pwdEncrypted</span><span style="color: #339933;">;</span></pre></div></div>

<h3>Problem z crypt()</h3>
<p>Jest jeden mały problem z tą funkcją, po przeniesieniu strony wraz z bazą danych na inny hosting, istnieje prawdopodobieństwo iż hasła mimo że są poprawne nie będą pasować. Dlaczego? Nie mam pojęcia, przeczytałem to w jednej z książek ale autor nie wytłumaczył. Możliwe że zauważył ten problem, a mi się szukać nie chce ;] Ale who care? Jak można zawsze sobie hasło zmienić. Nie jestem do końca przekonany co do tej własności z tym że może być wygenerowany różnych suma dla teg samego stringa i soli.</p>
<h3>A co z SHA-N?</h3>
<p>Tak więc wg NIST do 2010r. SHA1 też ma zostać wycofane z użytku przy certyfikatach ssl. Tak więc pozostało nam parę funkcji.<br />
Nie wszystkie z tych funkcji są &#8220;jawnie&#8221; dostępne w php, w sensie że są w postaci funkcji tak jak np <strong>md5</strong>, aby móc użyć np algorytmu SHA-512 musimy wykonać taką operację:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #990000;">hash</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'sha512'</span><span style="color: #339933;">,</span><span style="color: #0000ff;">'Jakiś tekst do zsumowania ;)'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>W funkcji hash możemy również wywoływać inne algorytmy tworzące sumę kontrolną. <a href="http://php.net/manual/en/book.hash.php" rel="nofollow">link-manual</a></p>
<p> Ale to nie wszystko, zapewne ktoś z Was słyszał o <strong>tęczowych tablicach</strong>, a jak nie to zapraszam <a href="http://pl.wikipedia.org/wiki/T%C4%99czowe_tablice" rel="nofollow">link-wikipedia</a>. Po przeczytaniu sami dojdziecie do wniosku że używanie sum kontrolnych jest po prostu mało bezpieczne.</p>
<h3>Słów kilka na zakończenie</h3>
<p>Co byśmy nie zrobili, to i tak się znajdzie ktoś kto nam złamie hasło, to tylko kwestia czasu.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.cojack.pl/szyfrowanie-hasel/307/feed</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Planeta PHP?</title>
		<link>http://www.cojack.pl/planeta-php/297</link>
		<comments>http://www.cojack.pl/planeta-php/297#comments</comments>
		<pubDate>Wed, 30 Dec 2009 09:11:34 +0000</pubDate>
		<dc:creator>cojack</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[planeta php]]></category>

		<guid isPermaLink="false">http://cojack.os-cms.pl/?p=297</guid>
		<description><![CDATA[ Tak sobie z rana chciałem odświeżyć swój wpis na planecie bo parę literówek się wdarło, no to logowanie, login -> hasło -> enter. Bum!

I Zonk  

Ale czego się można było dowiedzieć? Że wreszcie poszli po rozum do głowy, bo cały portal jest tak rozpieprzony po łokciach, że stoi ...]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft" title="PHP" src="http://cojack.os-cms.pl/wp-content/arch-php.png" alt="" height="100" width="100"> Tak sobie z rana chciałem odświeżyć swój wpis na planecie bo parę literówek się wdarło, no to logowanie, login -> hasło -> enter. Bum!</p>
<div class="wp-caption alignright" style="width: 165px;"><a href="http://gfx.efotek.pl/images/z95g5cdet4z95p71giw.png"><img title="Planeta PHP" src="http://gfx.efotek.pl/images/z95g5cdet4z95p71giw_thumb.png" alt="Planeta PHP" height="100" width="155"></a>
<p class="wp-caption-text">I Zonk <img src="http://cojack.os-cms.pl/wp-includes/images/smilies/icon_twisted.gif" alt="ZONK" class="wp-smiley"> </p>
</div>
<p>Ale czego się można było dowiedzieć? Że wreszcie poszli po rozum do głowy, bo cały portal jest tak rozpieprzony po łokciach, że stoi bo ma stać. A jak stoi to już trochę ludzi boli. A na pewno tych z branży.<br />
A dlaczego? Największy Polski portal społecznościowy prowadzony przez programistów dla programistów, tworzy go społeczność jak by nie patrzeć. To się chwali. Cieszy mnie że php.pl używa oprogramowania otwartego, gdyby się ktoś nie domyślił to jest to framework Symfony. A wydawało mi się że większość z nich na zendzie jedzie po wpisach na forum, ale jak widać myliłem się.</p>
<p>Taki krótki wpis szału ni ma.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.cojack.pl/planeta-php/297/feed</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>PostgreSQL &#8211; Ltree</title>
		<link>http://www.cojack.pl/postgresql-ltree/284</link>
		<comments>http://www.cojack.pl/postgresql-ltree/284#comments</comments>
		<pubDate>Wed, 30 Dec 2009 00:15:46 +0000</pubDate>
		<dc:creator>cojack</dc:creator>
				<category><![CDATA[SQL]]></category>
		<category><![CDATA[ltree]]></category>
		<category><![CDATA[menu drzewiaste]]></category>
		<category><![CDATA[menu wielopoziomowe]]></category>
		<category><![CDATA[postgresql]]></category>

		<guid isPermaLink="false">http://cojack.os-cms.pl/?p=284</guid>
		<description><![CDATA[ Tym razem nie będzie nic o implementacji pewnej struktury drzewiastej w php. Natomiast zajmiemy się dziś sql. A dokładniej PostgreSQL, od dłuższego czasu nie mogłem ogarnąć modułu w postgresql, który nazywa się ltree, jak sama cząstkowa nazwy wskazuje i łatwo się domyślić że chodzi tutaj o reprezentację i strukturę ...]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft" title="PostgreSQL" src="http://cojack.os-cms.pl/wp-content/arch-postgresql.png" alt="" height="100" width="100"> Tym razem nie będzie nic o implementacji pewnej struktury drzewiastej w php. Natomiast zajmiemy się dziś sql. A dokładniej PostgreSQL, od dłuższego czasu nie mogłem ogarnąć modułu w postgresql, który nazywa się <strong>ltree</strong>, jak sama cząstkowa nazwy wskazuje i łatwo się domyślić że chodzi tutaj o reprezentację i strukturę drzewa. Co najlepsze, przeprowadzone benchmarki przez jego twórców wykazują na największy w śród tymczasowych ogólnie dostępnych wzorców tego typu struktury czas dostępu do danych.</p>
<p><strong>Trochę historii</strong><br />
W 2002 roku, dwóch programistów: Teodor Sigaev oraz Oleg Bartunov, wypuściło na światło dzienne moduł ltree (kiedy zaczęli, brak danych). Podeszli do tego dość ogólnego problemu z wielkim dystansem, za to teraz mamy potężne narzędzie całkowicie za darmo. Następne wydania miały na celu wyeliminowanie błędów zgłoszonych przez użytkowników oraz rozszerzyć możliwości o nowe możliwości w indeksie GIST. Więcej na temat samych wydań jak zwykle w paczce do pobrania z ich strony na dole.</p>
<p><strong>Z czym to się je?</strong><br />
Ltree jak już wyżej wspomniałem jest modułem do PosgreSQL&#8217;a mający za zadanie przechowywanie danych w sposób przedstawiający strukturę drzewiastą. Implementacja jak najbardziej wydajna. A więc zacznijmy.</p>
<p>W zależności od dystrybucji z jakiej korzystamy, możemy mieć lub nie dodatkową paczkę dla postgresql&#8217;a która powinna się nazywać mniej więcej tak: <strong>postgresql-contrib</strong></p>
<p>Po zainstalowaniu tych dodatków mamy masę innych rzeczy, z których nie koniecznie będziemy korzystać. Ale nas interesuje ltree, ścieżka ltree.sql u mnie to:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>share<span style="color: #000000; font-weight: bold;">/</span>postgresql<span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">8.4</span><span style="color: #000000; font-weight: bold;">/</span>contrib<span style="color: #000000; font-weight: bold;">/</span></pre></div></div>

<p>a żeby wyszukać gdzie my to mamy:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">locate</span> ltree.sql</pre></div></div>

<p>po wcześniejszym updatedb.</p>
<p>powinniśmy mieć tam plik ltree.sql, musimy ten plik wrzucić do naszej bazy danych. No to jedziemy:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">psql nazwaDB <span style="color: #000000; font-weight: bold;">&lt;</span> <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>share<span style="color: #000000; font-weight: bold;">/</span>postgresql<span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">8.4</span><span style="color: #000000; font-weight: bold;">/</span>contrib<span style="color: #000000; font-weight: bold;">/</span>ltree.sql</pre></div></div>

<p>powinniśmy mieć wszystko ładnie wrzucone do bazy danych. Teraz zostało nam już tylko utworzenie tabeli i ogień.</p>
<p>Przykładowa tabela z naszym drzewem.</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">CREATE</span> <span style="color: #993333; font-weight: bold;">TABLE</span> <span style="color: #ff0000;">&quot;tree&quot;</span> <span style="color: #66cc66;">&#40;</span>
   <span style="color: #ff0000;">&quot;id&quot;</span>  SERIAL <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span><span style="color: #66cc66;">,</span>
   <span style="color: #ff0000;">&quot;path&quot;</span>   LTREE<span style="color: #66cc66;">,</span>
   <span style="color: #ff0000;">&quot;sort&quot;</span> SMALLINT
<span style="color: #66cc66;">&#41;</span>;</pre></div></div>

<p>mamy tutaj tabelę którą nazywamy tree, i teraz nowy typ danych <strong>LTREE</strong>. Nie ma co tu dużo tłumaczyć zaraz sami zobaczycie jak to działa.</p>
<p>Pozostało nam jeszcze założyć indeksy na kolumny:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">CREATE</span> <span style="color: #993333; font-weight: bold;">INDEX</span> path_gist_idx <span style="color: #993333; font-weight: bold;">ON</span> <span style="color: #ff0000;">&quot;tree&quot;</span> <span style="color: #993333; font-weight: bold;">USING</span> gist<span style="color: #66cc66;">&#40;</span>path<span style="color: #66cc66;">&#41;</span>;
<span style="color: #993333; font-weight: bold;">CREATE</span> <span style="color: #993333; font-weight: bold;">INDEX</span> path_idx <span style="color: #993333; font-weight: bold;">ON</span> <span style="color: #ff0000;">&quot;tree&quot;</span> <span style="color: #993333; font-weight: bold;">USING</span> btree<span style="color: #66cc66;">&#40;</span>path<span style="color: #66cc66;">&#41;</span>;</pre></div></div>

<p>oraz możemy sobie w prosty sposób komentarze na kolumny powrzucać:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;">COMMENT <span style="color: #993333; font-weight: bold;">ON</span> <span style="color: #993333; font-weight: bold;">COLUMN</span> <span style="color: #ff0000;">&quot;tree&quot;</span><span style="color: #66cc66;">.</span><span style="color: #ff0000;">&quot;path&quot;</span> <span style="color: #993333; font-weight: bold;">IS</span> <span style="color: #ff0000;">'Scieżka drzewa'</span>;</pre></div></div>

<p>Żeby zobaczyć komentarz w psql należy wykonać polecenie:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;">\d<span style="color: #66cc66;">+</span> <span style="color: #ff0000;">&quot;nazwaTabeli&quot;</span></pre></div></div>

<p>A teraz dane przykładowe do drzewa:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> <span style="color: #ff0000;">&quot;tree&quot;</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">&quot;path&quot;</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">&quot;sort&quot;</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">VALUES</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'Top'</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> <span style="color: #ff0000;">&quot;tree&quot;</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">&quot;path&quot;</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">&quot;sort&quot;</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">VALUES</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'Top.Science'</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> <span style="color: #ff0000;">&quot;tree&quot;</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">&quot;path&quot;</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">&quot;sort&quot;</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">VALUES</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'Top.Science.Astronomy'</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> <span style="color: #ff0000;">&quot;tree&quot;</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">&quot;path&quot;</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">&quot;sort&quot;</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">VALUES</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'Top.Science.Astronomy.Astrophysics'</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> <span style="color: #ff0000;">&quot;tree&quot;</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">&quot;path&quot;</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">&quot;sort&quot;</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">VALUES</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'Top.Science.Astronomy.Cosmology'</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">2</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> <span style="color: #ff0000;">&quot;tree&quot;</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">&quot;path&quot;</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">&quot;sort&quot;</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">VALUES</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'Top.Hobbies'</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">2</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> <span style="color: #ff0000;">&quot;tree&quot;</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">&quot;path&quot;</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">&quot;sort&quot;</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">VALUES</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'Top.Hobbies.Amateurs_Astronomy'</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">2</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> <span style="color: #ff0000;">&quot;tree&quot;</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">&quot;path&quot;</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">&quot;sort&quot;</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">VALUES</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'Top.Collections'</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">3</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> <span style="color: #ff0000;">&quot;tree&quot;</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">&quot;path&quot;</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">&quot;sort&quot;</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">VALUES</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'Top.Collections.Pictures'</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> <span style="color: #ff0000;">&quot;tree&quot;</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">&quot;path&quot;</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">&quot;sort&quot;</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">VALUES</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'Top.Collections.Pictures.Astronomy'</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> <span style="color: #ff0000;">&quot;tree&quot;</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">&quot;path&quot;</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">&quot;sort&quot;</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">VALUES</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'Top.Collections.Pictures.Astronomy.Stars'</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> <span style="color: #ff0000;">&quot;tree&quot;</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">&quot;path&quot;</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">&quot;sort&quot;</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">VALUES</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'Top.Collections.Pictures.Astronomy.Galaxies'</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">2</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> <span style="color: #ff0000;">&quot;tree&quot;</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">&quot;path&quot;</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">&quot;sort&quot;</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">VALUES</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'Top.Collections.Pictures.Astronomy.Astronauts'</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">3</span><span style="color: #66cc66;">&#41;</span>;</pre></div></div>

<p>Jak zauważyliście, dane w ścieżce drzewa nie mogą posiadać wolnej przestrzeni, więc należy ją zamienić na np &#8220;_&#8221;, co nie jest żadnym problemem.</p>
<p>Ścieżka rysuje się mniej więcej tak:<br />
<br />
<img title="Ltree - path" src="http://cojack.os-cms.pl/wp-content/path_ltree.png" alt=""><br />
<br />
Pobierzmy sobie teraz całe drzewko:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">ltree<span style="color: #339933;">=&gt;</span> SELECT <span style="color: #339933;">*</span> FROM tree<span style="color: #339933;">;</span>
 id <span style="color: #339933;">|</span>                     path                      <span style="color: #339933;">|</span> <span style="color: #990000;">sort</span>
<span style="color: #339933;">----+-----------------------------------------------+------</span>
  <span style="color: #cc66cc;">1</span> <span style="color: #339933;">|</span> Top                                           <span style="color: #339933;">|</span>    <span style="color: #cc66cc;">1</span>
  <span style="color: #cc66cc;">2</span> <span style="color: #339933;">|</span> Top<span style="color: #339933;">.</span>Science                                   <span style="color: #339933;">|</span>    <span style="color: #cc66cc;">1</span>
  <span style="color: #cc66cc;">3</span> <span style="color: #339933;">|</span> Top<span style="color: #339933;">.</span>Science<span style="color: #339933;">.</span>Astronomy                         <span style="color: #339933;">|</span>    <span style="color: #cc66cc;">1</span>
  <span style="color: #cc66cc;">4</span> <span style="color: #339933;">|</span> Top<span style="color: #339933;">.</span>Science<span style="color: #339933;">.</span>Astronomy<span style="color: #339933;">.</span>Astrophysics            <span style="color: #339933;">|</span>    <span style="color: #cc66cc;">1</span>
  <span style="color: #cc66cc;">5</span> <span style="color: #339933;">|</span> Top<span style="color: #339933;">.</span>Science<span style="color: #339933;">.</span>Astronomy<span style="color: #339933;">.</span>Cosmology               <span style="color: #339933;">|</span>    <span style="color: #cc66cc;">2</span>
  <span style="color: #cc66cc;">6</span> <span style="color: #339933;">|</span> Top<span style="color: #339933;">.</span>Hobbies                                   <span style="color: #339933;">|</span>    <span style="color: #cc66cc;">2</span>
  <span style="color: #cc66cc;">7</span> <span style="color: #339933;">|</span> Top<span style="color: #339933;">.</span>Hobbies<span style="color: #339933;">.</span>Amateurs_Astronomy                <span style="color: #339933;">|</span>    <span style="color: #cc66cc;">2</span>
  <span style="color: #cc66cc;">8</span> <span style="color: #339933;">|</span> Top<span style="color: #339933;">.</span>Collections                               <span style="color: #339933;">|</span>    <span style="color: #cc66cc;">3</span>
  <span style="color: #cc66cc;">9</span> <span style="color: #339933;">|</span> Top<span style="color: #339933;">.</span>Collections<span style="color: #339933;">.</span>Pictures                      <span style="color: #339933;">|</span>    <span style="color: #cc66cc;">1</span>
 <span style="color: #cc66cc;">10</span> <span style="color: #339933;">|</span> Top<span style="color: #339933;">.</span>Collections<span style="color: #339933;">.</span>Pictures<span style="color: #339933;">.</span>Astronomy            <span style="color: #339933;">|</span>    <span style="color: #cc66cc;">1</span>
 <span style="color: #cc66cc;">11</span> <span style="color: #339933;">|</span> Top<span style="color: #339933;">.</span>Collections<span style="color: #339933;">.</span>Pictures<span style="color: #339933;">.</span>Astronomy<span style="color: #339933;">.</span>Stars      <span style="color: #339933;">|</span>    <span style="color: #cc66cc;">1</span>
 <span style="color: #cc66cc;">12</span> <span style="color: #339933;">|</span> Top<span style="color: #339933;">.</span>Collections<span style="color: #339933;">.</span>Pictures<span style="color: #339933;">.</span>Astronomy<span style="color: #339933;">.</span>Galaxies   <span style="color: #339933;">|</span>    <span style="color: #cc66cc;">2</span>
 <span style="color: #cc66cc;">13</span> <span style="color: #339933;">|</span> Top<span style="color: #339933;">.</span>Collections<span style="color: #339933;">.</span>Pictures<span style="color: #339933;">.</span>Astronomy<span style="color: #339933;">.</span>Astronauts <span style="color: #339933;">|</span>    <span style="color: #cc66cc;">3</span>
<span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">13</span> rows<span style="color: #009900;">&#41;</span></pre></div></div>

<p>I wszystko wygląda fajnie co? Ale tu się zaczynają schody z którymi ja sam nie potrafiłem sobie poradzić. I po raz któryś poprosiłem depesz&#8217;a o pomoc. Sprawa ma się tak: Jak pobrać drzewo z posortowanymi gałęziami względem głębokości? No i tutaj był mój pies pogrzebany. Ale z pomocą przyszedł depesz, ale do sedna sprawy. Dodajmy sobie z 3 rekordy do naszej tabeli:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"> <span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> tree <span style="color: #66cc66;">&#40;</span>path<span style="color: #66cc66;">,</span>sort<span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">VALUES</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'Top.Science.Programing'</span><span style="color: #66cc66;">,</span><span style="color: #cc66cc;">2</span><span style="color: #66cc66;">&#41;</span>;
 <span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> tree <span style="color: #66cc66;">&#40;</span>path<span style="color: #66cc66;">,</span>sort<span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">VALUES</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'Top.Science.Chemia'</span><span style="color: #66cc66;">,</span><span style="color: #cc66cc;">3</span><span style="color: #66cc66;">&#41;</span>;
 <span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> tree <span style="color: #66cc66;">&#40;</span>path<span style="color: #66cc66;">,</span>sort<span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">VALUES</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'Top.Science.Fizyka'</span><span style="color: #66cc66;">,</span><span style="color: #cc66cc;">4</span><span style="color: #66cc66;">&#41;</span>;</pre></div></div>

<p>Teraz nasze drzewko będzie wyglądało tak:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"> id <span style="color: #66cc66;">|</span>                     path                      <span style="color: #66cc66;">|</span> sort
<span style="color: #808080; font-style: italic;">----+-----------------------------------------------+------</span>
  <span style="color: #cc66cc;">1</span> <span style="color: #66cc66;">|</span> Top                                           <span style="color: #66cc66;">|</span>    <span style="color: #cc66cc;">1</span>
  <span style="color: #cc66cc;">2</span> <span style="color: #66cc66;">|</span> Top<span style="color: #66cc66;">.</span>Science                                   <span style="color: #66cc66;">|</span>    <span style="color: #cc66cc;">1</span>
  <span style="color: #cc66cc;">3</span> <span style="color: #66cc66;">|</span> Top<span style="color: #66cc66;">.</span>Science<span style="color: #66cc66;">.</span>Astronomy                         <span style="color: #66cc66;">|</span>    <span style="color: #cc66cc;">1</span>
  <span style="color: #cc66cc;">4</span> <span style="color: #66cc66;">|</span> Top<span style="color: #66cc66;">.</span>Science<span style="color: #66cc66;">.</span>Astronomy<span style="color: #66cc66;">.</span>Astrophysics            <span style="color: #66cc66;">|</span>    <span style="color: #cc66cc;">1</span>
  <span style="color: #cc66cc;">5</span> <span style="color: #66cc66;">|</span> Top<span style="color: #66cc66;">.</span>Science<span style="color: #66cc66;">.</span>Astronomy<span style="color: #66cc66;">.</span>Cosmology               <span style="color: #66cc66;">|</span>    <span style="color: #cc66cc;">2</span>
  <span style="color: #cc66cc;">6</span> <span style="color: #66cc66;">|</span> Top<span style="color: #66cc66;">.</span>Hobbies                                   <span style="color: #66cc66;">|</span>    <span style="color: #cc66cc;">2</span>
  <span style="color: #cc66cc;">7</span> <span style="color: #66cc66;">|</span> Top<span style="color: #66cc66;">.</span>Hobbies<span style="color: #66cc66;">.</span>Amateurs_Astronomy                <span style="color: #66cc66;">|</span>    <span style="color: #cc66cc;">2</span>
  <span style="color: #cc66cc;">8</span> <span style="color: #66cc66;">|</span> Top<span style="color: #66cc66;">.</span>Collections                               <span style="color: #66cc66;">|</span>    <span style="color: #cc66cc;">3</span>
  <span style="color: #cc66cc;">9</span> <span style="color: #66cc66;">|</span> Top<span style="color: #66cc66;">.</span>Collections<span style="color: #66cc66;">.</span>Pictures                      <span style="color: #66cc66;">|</span>    <span style="color: #cc66cc;">1</span>
 <span style="color: #cc66cc;">10</span> <span style="color: #66cc66;">|</span> Top<span style="color: #66cc66;">.</span>Collections<span style="color: #66cc66;">.</span>Pictures<span style="color: #66cc66;">.</span>Astronomy            <span style="color: #66cc66;">|</span>    <span style="color: #cc66cc;">1</span>
 <span style="color: #cc66cc;">11</span> <span style="color: #66cc66;">|</span> Top<span style="color: #66cc66;">.</span>Collections<span style="color: #66cc66;">.</span>Pictures<span style="color: #66cc66;">.</span>Astronomy<span style="color: #66cc66;">.</span>Stars      <span style="color: #66cc66;">|</span>    <span style="color: #cc66cc;">1</span>
 <span style="color: #cc66cc;">12</span> <span style="color: #66cc66;">|</span> Top<span style="color: #66cc66;">.</span>Collections<span style="color: #66cc66;">.</span>Pictures<span style="color: #66cc66;">.</span>Astronomy<span style="color: #66cc66;">.</span>Galaxies   <span style="color: #66cc66;">|</span>    <span style="color: #cc66cc;">2</span>
 <span style="color: #cc66cc;">13</span> <span style="color: #66cc66;">|</span> Top<span style="color: #66cc66;">.</span>Collections<span style="color: #66cc66;">.</span>Pictures<span style="color: #66cc66;">.</span>Astronomy<span style="color: #66cc66;">.</span>Astronauts <span style="color: #66cc66;">|</span>    <span style="color: #cc66cc;">3</span>
 <span style="color: #cc66cc;">14</span> <span style="color: #66cc66;">|</span> Top<span style="color: #66cc66;">.</span>Science<span style="color: #66cc66;">.</span>Programing                        <span style="color: #66cc66;">|</span>    <span style="color: #cc66cc;">2</span>
 <span style="color: #cc66cc;">15</span> <span style="color: #66cc66;">|</span> Top<span style="color: #66cc66;">.</span>Science<span style="color: #66cc66;">.</span>Chemia                            <span style="color: #66cc66;">|</span>    <span style="color: #cc66cc;">3</span>
 <span style="color: #cc66cc;">16</span> <span style="color: #66cc66;">|</span> Top<span style="color: #66cc66;">.</span>Science<span style="color: #66cc66;">.</span>Fizyka                            <span style="color: #66cc66;">|</span>    <span style="color: #cc66cc;">4</span>
<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">16</span> rows<span style="color: #66cc66;">&#41;</span></pre></div></div>

<p>Co nas w ogóle nie zadowala, próbowałem na różne sposoby:</p>
<p>1 by depesz:</p>
<blockquote><p>
10:12 <    depesz> cojack: i think you will need to sort on subltree(path, 0, nlevel(path)-2), sort;
</p></blockquote>
<p>No to jedziemy</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;">ltree<span style="color: #66cc66;">=&gt;</span> <span style="color: #993333; font-weight: bold;">SELECT</span> <span style="color: #66cc66;">*</span> <span style="color: #993333; font-weight: bold;">FROM</span> tree <span style="color: #993333; font-weight: bold;">ORDER</span> <span style="color: #993333; font-weight: bold;">BY</span> subltree<span style="color: #66cc66;">&#40;</span>path<span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">0</span><span style="color: #66cc66;">,</span> nlevel<span style="color: #66cc66;">&#40;</span>path<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">-</span><span style="color: #cc66cc;">2</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span> sort;
ERROR:  invalid positions</pre></div></div>

<p>A dziwne bo wcześniej działało ^^</p>
<p>2 moja</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">SELECT</span> id<span style="color: #66cc66;">,</span> subpath<span style="color: #66cc66;">&#40;</span>path<span style="color: #66cc66;">,</span> <span style="color: #66cc66;">-</span><span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">AS</span> title<span style="color: #66cc66;">,</span> nlevel<span style="color: #66cc66;">&#40;</span>path<span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">AS</span> depth<span style="color: #66cc66;">,</span> sort <span style="color: #993333; font-weight: bold;">FROM</span> tree <span style="color: #993333; font-weight: bold;">ORDER</span> <span style="color: #993333; font-weight: bold;">BY</span> subltree<span style="color: #66cc66;">&#40;</span>path<span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">0</span><span style="color: #66cc66;">,</span> nlevel<span style="color: #66cc66;">&#40;</span>path<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">ASC</span>;
 id <span style="color: #66cc66;">|</span>       title        <span style="color: #66cc66;">|</span> depth <span style="color: #66cc66;">|</span> sort
<span style="color: #808080; font-style: italic;">----+--------------------+-------+------</span>
  <span style="color: #cc66cc;">1</span> <span style="color: #66cc66;">|</span> Top                <span style="color: #66cc66;">|</span>     <span style="color: #cc66cc;">1</span> <span style="color: #66cc66;">|</span>    <span style="color: #cc66cc;">1</span>
  <span style="color: #cc66cc;">8</span> <span style="color: #66cc66;">|</span> Collections        <span style="color: #66cc66;">|</span>     <span style="color: #cc66cc;">2</span> <span style="color: #66cc66;">|</span>    <span style="color: #cc66cc;">3</span>
  <span style="color: #cc66cc;">9</span> <span style="color: #66cc66;">|</span> Pictures           <span style="color: #66cc66;">|</span>     <span style="color: #cc66cc;">3</span> <span style="color: #66cc66;">|</span>    <span style="color: #cc66cc;">1</span>
 <span style="color: #cc66cc;">10</span> <span style="color: #66cc66;">|</span> Astronomy          <span style="color: #66cc66;">|</span>     <span style="color: #cc66cc;">4</span> <span style="color: #66cc66;">|</span>    <span style="color: #cc66cc;">1</span>
 <span style="color: #cc66cc;">13</span> <span style="color: #66cc66;">|</span> Astronauts         <span style="color: #66cc66;">|</span>     <span style="color: #cc66cc;">5</span> <span style="color: #66cc66;">|</span>    <span style="color: #cc66cc;">3</span>
 <span style="color: #cc66cc;">12</span> <span style="color: #66cc66;">|</span> Galaxies           <span style="color: #66cc66;">|</span>     <span style="color: #cc66cc;">5</span> <span style="color: #66cc66;">|</span>    <span style="color: #cc66cc;">2</span>
 <span style="color: #cc66cc;">11</span> <span style="color: #66cc66;">|</span> Stars              <span style="color: #66cc66;">|</span>     <span style="color: #cc66cc;">5</span> <span style="color: #66cc66;">|</span>    <span style="color: #cc66cc;">1</span>
  <span style="color: #cc66cc;">6</span> <span style="color: #66cc66;">|</span> Hobbies            <span style="color: #66cc66;">|</span>     <span style="color: #cc66cc;">2</span> <span style="color: #66cc66;">|</span>    <span style="color: #cc66cc;">2</span>
  <span style="color: #cc66cc;">7</span> <span style="color: #66cc66;">|</span> Amateurs_Astronomy <span style="color: #66cc66;">|</span>     <span style="color: #cc66cc;">3</span> <span style="color: #66cc66;">|</span>    <span style="color: #cc66cc;">2</span>
  <span style="color: #cc66cc;">2</span> <span style="color: #66cc66;">|</span> Science            <span style="color: #66cc66;">|</span>     <span style="color: #cc66cc;">2</span> <span style="color: #66cc66;">|</span>    <span style="color: #cc66cc;">1</span>
  <span style="color: #cc66cc;">3</span> <span style="color: #66cc66;">|</span> Astronomy          <span style="color: #66cc66;">|</span>     <span style="color: #cc66cc;">3</span> <span style="color: #66cc66;">|</span>    <span style="color: #cc66cc;">1</span>
  <span style="color: #cc66cc;">4</span> <span style="color: #66cc66;">|</span> Astrophysics       <span style="color: #66cc66;">|</span>     <span style="color: #cc66cc;">4</span> <span style="color: #66cc66;">|</span>    <span style="color: #cc66cc;">1</span>
  <span style="color: #cc66cc;">5</span> <span style="color: #66cc66;">|</span> Cosmology          <span style="color: #66cc66;">|</span>     <span style="color: #cc66cc;">4</span> <span style="color: #66cc66;">|</span>    <span style="color: #cc66cc;">2</span>
 <span style="color: #cc66cc;">15</span> <span style="color: #66cc66;">|</span> Chemia             <span style="color: #66cc66;">|</span>     <span style="color: #cc66cc;">3</span> <span style="color: #66cc66;">|</span>    <span style="color: #cc66cc;">3</span>
 <span style="color: #cc66cc;">16</span> <span style="color: #66cc66;">|</span> Fizyka             <span style="color: #66cc66;">|</span>     <span style="color: #cc66cc;">3</span> <span style="color: #66cc66;">|</span>    <span style="color: #cc66cc;">4</span>
 <span style="color: #cc66cc;">14</span> <span style="color: #66cc66;">|</span> Programing         <span style="color: #66cc66;">|</span>     <span style="color: #cc66cc;">3</span> <span style="color: #66cc66;">|</span>    <span style="color: #cc66cc;">2</span>
<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">16</span> rows<span style="color: #66cc66;">&#41;</span></pre></div></div>

<p>I tutaj można zauważyć że mamy już względnie posortowane według kategorii ale wciąż brak posortowania względem sort po prostu, no i trzecia ostateczna (chyba) propozycja wg depesza podejście drugie:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">WITH</span> RECURSIVE rec <span style="color: #993333; font-weight: bold;">AS</span> <span style="color: #66cc66;">&#40;</span>
<span style="color: #993333; font-weight: bold;">SELECT</span> <span style="color: #66cc66;">*,</span> btrim<span style="color: #66cc66;">&#40;</span>to_char<span style="color: #66cc66;">&#40;</span> sort<span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'0000000'</span> <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">AS</span> ordering <span style="color: #993333; font-weight: bold;">FROM</span> tree <span style="color: #993333; font-weight: bold;">WHERE</span> nlevel<span style="color: #66cc66;">&#40;</span>path<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">=</span> <span style="color: #cc66cc;">1</span>
<span style="color: #993333; font-weight: bold;">UNION</span> <span style="color: #993333; font-weight: bold;">ALL</span>
<span style="color: #993333; font-weight: bold;">SELECT</span> t2<span style="color: #66cc66;">.*,</span> t1<span style="color: #66cc66;">.</span>ordering <span style="color: #66cc66;">||</span> <span style="color: #ff0000;">'/'</span> <span style="color: #66cc66;">||</span> btrim<span style="color: #66cc66;">&#40;</span>to_char<span style="color: #66cc66;">&#40;</span> t2<span style="color: #66cc66;">.</span>sort<span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'0000000'</span> <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">AS</span> ordering <span style="color: #993333; font-weight: bold;">FROM</span> rec t1<span style="color: #66cc66;">,</span> tree t2 <span style="color: #993333; font-weight: bold;">WHERE</span> t1<span style="color: #66cc66;">.</span>path @<span style="color: #66cc66;">&gt;</span> t2<span style="color: #66cc66;">.</span>path <span style="color: #993333; font-weight: bold;">AND</span> nlevel<span style="color: #66cc66;">&#40;</span>t1<span style="color: #66cc66;">.</span>path<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">+</span> <span style="color: #cc66cc;">1</span> <span style="color: #66cc66;">=</span> nlevel<span style="color: #66cc66;">&#40;</span>t2<span style="color: #66cc66;">.</span>path<span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#41;</span>
<span style="color: #993333; font-weight: bold;">SELECT</span> id<span style="color: #66cc66;">,</span> subpath<span style="color: #66cc66;">&#40;</span>path<span style="color: #66cc66;">,</span> <span style="color: #66cc66;">-</span><span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">AS</span> title<span style="color: #66cc66;">,</span> nlevel<span style="color: #66cc66;">&#40;</span>path<span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">AS</span> depth<span style="color: #66cc66;">,</span> sort <span style="color: #993333; font-weight: bold;">FROM</span> rec <span style="color: #993333; font-weight: bold;">ORDER</span> <span style="color: #993333; font-weight: bold;">BY</span> ordering;
&nbsp;
 id <span style="color: #66cc66;">|</span>       title        <span style="color: #66cc66;">|</span> depth <span style="color: #66cc66;">|</span> sort
<span style="color: #808080; font-style: italic;">----+--------------------+-------+------</span>
  <span style="color: #cc66cc;">1</span> <span style="color: #66cc66;">|</span> Top                <span style="color: #66cc66;">|</span>     <span style="color: #cc66cc;">1</span> <span style="color: #66cc66;">|</span>    <span style="color: #cc66cc;">1</span>
  <span style="color: #cc66cc;">2</span> <span style="color: #66cc66;">|</span> Science            <span style="color: #66cc66;">|</span>     <span style="color: #cc66cc;">2</span> <span style="color: #66cc66;">|</span>    <span style="color: #cc66cc;">1</span>
  <span style="color: #cc66cc;">3</span> <span style="color: #66cc66;">|</span> Astronomy          <span style="color: #66cc66;">|</span>     <span style="color: #cc66cc;">3</span> <span style="color: #66cc66;">|</span>    <span style="color: #cc66cc;">1</span>
  <span style="color: #cc66cc;">4</span> <span style="color: #66cc66;">|</span> Astrophysics       <span style="color: #66cc66;">|</span>     <span style="color: #cc66cc;">4</span> <span style="color: #66cc66;">|</span>    <span style="color: #cc66cc;">1</span>
  <span style="color: #cc66cc;">5</span> <span style="color: #66cc66;">|</span> Cosmology          <span style="color: #66cc66;">|</span>     <span style="color: #cc66cc;">4</span> <span style="color: #66cc66;">|</span>    <span style="color: #cc66cc;">2</span>
 <span style="color: #cc66cc;">14</span> <span style="color: #66cc66;">|</span> Programing         <span style="color: #66cc66;">|</span>     <span style="color: #cc66cc;">3</span> <span style="color: #66cc66;">|</span>    <span style="color: #cc66cc;">2</span>
 <span style="color: #cc66cc;">15</span> <span style="color: #66cc66;">|</span> Chemia             <span style="color: #66cc66;">|</span>     <span style="color: #cc66cc;">3</span> <span style="color: #66cc66;">|</span>    <span style="color: #cc66cc;">3</span>
 <span style="color: #cc66cc;">16</span> <span style="color: #66cc66;">|</span> Fizyka             <span style="color: #66cc66;">|</span>     <span style="color: #cc66cc;">3</span> <span style="color: #66cc66;">|</span>    <span style="color: #cc66cc;">4</span>
  <span style="color: #cc66cc;">6</span> <span style="color: #66cc66;">|</span> Hobbies            <span style="color: #66cc66;">|</span>     <span style="color: #cc66cc;">2</span> <span style="color: #66cc66;">|</span>    <span style="color: #cc66cc;">2</span>
  <span style="color: #cc66cc;">7</span> <span style="color: #66cc66;">|</span> Amateurs_Astronomy <span style="color: #66cc66;">|</span>     <span style="color: #cc66cc;">3</span> <span style="color: #66cc66;">|</span>    <span style="color: #cc66cc;">2</span>
  <span style="color: #cc66cc;">8</span> <span style="color: #66cc66;">|</span> Collections        <span style="color: #66cc66;">|</span>     <span style="color: #cc66cc;">2</span> <span style="color: #66cc66;">|</span>    <span style="color: #cc66cc;">3</span>
  <span style="color: #cc66cc;">9</span> <span style="color: #66cc66;">|</span> Pictures           <span style="color: #66cc66;">|</span>     <span style="color: #cc66cc;">3</span> <span style="color: #66cc66;">|</span>    <span style="color: #cc66cc;">1</span>
 <span style="color: #cc66cc;">10</span> <span style="color: #66cc66;">|</span> Astronomy          <span style="color: #66cc66;">|</span>     <span style="color: #cc66cc;">4</span> <span style="color: #66cc66;">|</span>    <span style="color: #cc66cc;">1</span>
 <span style="color: #cc66cc;">11</span> <span style="color: #66cc66;">|</span> Stars              <span style="color: #66cc66;">|</span>     <span style="color: #cc66cc;">5</span> <span style="color: #66cc66;">|</span>    <span style="color: #cc66cc;">1</span>
 <span style="color: #cc66cc;">12</span> <span style="color: #66cc66;">|</span> Galaxies           <span style="color: #66cc66;">|</span>     <span style="color: #cc66cc;">5</span> <span style="color: #66cc66;">|</span>    <span style="color: #cc66cc;">2</span>
 <span style="color: #cc66cc;">13</span> <span style="color: #66cc66;">|</span> Astronauts         <span style="color: #66cc66;">|</span>     <span style="color: #cc66cc;">5</span> <span style="color: #66cc66;">|</span>    <span style="color: #cc66cc;">3</span>
<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">16</span> rows<span style="color: #66cc66;">&#41;</span></pre></div></div>

<p>Dziękuje nie mam do Pana więcej pytań, rozwalił mnie jego poziom wiedzy.</p>
<p>To co tutaj przedstawiłem to tylko przedsmak tego co dzięki tej sposobności możemy doświadczyć, a są to:</p>
<ol>
<li>ACL</li>
<li>RBAC</li>
<li>Hierarchia grup</li>
<li>Drzewa ^^</li>
</ol>
<p>Nie będę opisywał funkcji jakie są dostępne w tym module, a na pewno nie w tym wpisie. Chciałem przedstawić że coś takiego istnieje, gdyż bardzo mało osób wie o tym, nie zdaje sobie sprawy z potężnej mocy jaką to posiada.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.cojack.pl/postgresql-ltree/284/feed</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Inicjalizacja != inicjacji</title>
		<link>http://www.cojack.pl/inicjalizacja-a-inicjacja/277</link>
		<comments>http://www.cojack.pl/inicjalizacja-a-inicjacja/277#comments</comments>
		<pubDate>Mon, 07 Dec 2009 16:00:05 +0000</pubDate>
		<dc:creator>cojack</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[inicjacja]]></category>
		<category><![CDATA[inicjalizacja]]></category>

		<guid isPermaLink="false">http://cojack.os-cms.pl/?p=277</guid>
		<description><![CDATA[Dawno nic ciekawego nie napisałem, nie martwcie się, nic się nie zmieni. Ale chciałbym poruszyć temat, który jest dość &#8220;śmieszny&#8221;. Dużo nieświadomych programistów swojej upośledzonej wiedzy nt tego co robią używają określenia czegoś czym nie jest. A mowa tutaj o inicjacji (poprawnie inicjalizacji). Śmieszy mnie jak widzę gdzieś w necie ...]]></description>
			<content:encoded><![CDATA[<p>Dawno nic ciekawego nie napisałem, nie martwcie się, nic się nie zmieni. Ale chciałbym poruszyć temat, który jest dość &#8220;śmieszny&#8221;. Dużo nieświadomych programistów swojej upośledzonej wiedzy nt tego co robią używają określenia czegoś czym nie jest. A mowa tutaj o inicjacji (poprawnie inicjalizacji). Śmieszy mnie jak widzę gdzieś w necie jakiś temat poruszony o programowaniu oczywiście i tam wojny, oj wojny kto lepiej kto ładniej, oj jakie wojny&#8230; A najbardziej rozbawia mnie:</p>
<blockquote><p>&#8220;źle inicjujesz zmienne&#8221;</p></blockquote>
<p>Jak pisze mój promotor programowania J. Grębosz, sprawdź sobie czym jest jedno a czym drugie to się uśmiejesz. I rzeczywiście można się uśmiać i jednocześnie zrobić z siebie totalne pośmiewisko. Ale wybaczajmy ludziom upośledzonym umysłowo. Wychodzących z założenia że jak strzeli się pięćdziesiąt wykrzykników i napiszę się tekst za pomocą CapsLock&#8217;a to się wszystko wie. A moja domena jest sprzeczna z tym założeniem, oto one:</p>
<blockquote><p>&#8220;jeżeli czegoś nie wiem, to nie myślę że wiem&#8221;</p></blockquote>
<p>Mam nadzieję że gdy ktoś będzie szukał czegoś o inicjacji w programowaniu to trafi na ten wpis i się 3x dobrze zastanowi niczym użyje tego słowa.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.cojack.pl/inicjalizacja-a-inicjacja/277/feed</wfw:commentRss>
		<slash:comments>20</slash:comments>
		</item>
		<item>
		<title>MVC w PHP cz.2</title>
		<link>http://www.cojack.pl/mvc-w-php-cz-2/255</link>
		<comments>http://www.cojack.pl/mvc-w-php-cz-2/255#comments</comments>
		<pubDate>Fri, 23 Oct 2009 07:08:39 +0000</pubDate>
		<dc:creator>cojack</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Doctrine]]></category>
		<category><![CDATA[mvc]]></category>
		<category><![CDATA[skrypty php]]></category>

		<guid isPermaLink="false">http://cojack.os-cms.pl/?p=255</guid>
		<description><![CDATA[ Tak więc chciałbym rozwinąć swoją myśl w poprzednim wpisie dotyczącym mvc w php, o co mi tu chodzi oraz czy temat i kategoria ma się jakoś do treści tutaj przedstawionej. Otóż uważam że tak, wzorzec mvc jak samo rozwiniecie jego skrótu nam mówi, model, widok, kontroler. Chodzi o prezentacje ...]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft" title="PHP" src="http://cojack.os-cms.pl/wp-content/arch-php.png" alt="" height="100" width="100"> Tak więc chciałbym rozwinąć swoją myśl w poprzednim wpisie dotyczącym mvc w php, o co mi tu chodzi oraz czy temat i kategoria ma się jakoś do treści tutaj przedstawionej. Otóż uważam że tak, wzorzec mvc jak samo rozwiniecie jego skrótu nam mówi, model, widok, kontroler. Chodzi o prezentacje kodu złożoną z warstw, i połączeniem tego z sobą, dobrze wiemy że kontroler czyli nasz cały mózg operacji powinien wywoływać metody z modelu do pobierania danych z bazy danych, tak że end user nie ma że tak powiem bezpośredniego dostępu do tej że warstwy prezentacji kodu, chyba że jesteśmy na tyle upośledzeni że nie zabezpieczymy sobie katalogów i struktura naszych katalogów pozwala użytkownikowi na przeglądanie zawartości katalogów gdzie mamy poskładane nasze klasy. W różnych książkach można spotkać różnie przedstawione formy zapisu nazewnictwa plików, *.phpm itp ale nie o tym chcę pisać, ponieważ dla mnie to powinno być na tyle intuicyjne i poprawne by nam później było łatwiej się odnaleźć w utworzonej przez nas aplikacji.</p>
<p>Wracając do tematu, bo wydaje mi się że trochę od niego odbiegłem, chciałbym rozwinąć swoją myśl przedstawioną w poprzednim poście (czuje jakbym się powtarzał&#8230;). Pisałem o tym że użytkownicy Doctrine dostali narzędzie i ogromnej mocy do utworzenia aplikacji zorientowanej obiektowo oraz o wzorzec MVC, i w cale nie chcę się z tego wycofać a poprzeć tą tezę argumentami.</p>
<p>Do czego bym zachęcał? Otóż by każdy zainteresowany pobrał sobie sandbox&#8217;a doctrine z strony projektu, standardowo linki na samym dole. Sandbox jest w pewnym stopniu za nas skonfigurowany, i jeżeli nie czujemy potrzeby modyfikacji jego ustawień proponowałbym zostawić układ taki jaki jest, chociażby dla samego tego artykułu. Ja go osobiście trochę przerobiłem na wzór układu katalogów z symfony ale nie ważne jest to teraz.</p>
<p>Pisałem o tym że nie będziemy musieli ładować w kontrolerach modułów a same widoki (widok), tak zakładam że jeden widok dla jednego kontrolera, jeden model dla jednego kontrolera. Wychodząc z założenia DRY ( Don&#8217;t Repeat Yourself ), jedna metoda dla jednej i tej samej akcji, bo po co się powtarzać?</p>
<p>Nie chciałbym by ten topic zszedł do tematu konfiguracji sandboxa, dlatego o konfiguracji Doctrine w innym temacie.</p>
<p>A teraz jak to nam uprzyjemnia życie? A dajmy na to że mamy jakiś kontroler, np HandlerNews</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">class</span> HandlerNews <span style="color: #000000; font-weight: bold;">extends</span> EventHandler  <span style="color: #009900;">&#123;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000088;">$_tpl</span><span style="color: #339933;">;</span>
	<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000088;">$_handle</span><span style="color: #339933;">;</span>
	<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000088;">$_lang</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> __construct<span style="color: #009900;">&#40;</span><span style="color: #000088;">$tpl</span><span style="color: #339933;">,</span><span style="color: #000088;">$event</span><span style="color: #339933;">,</span><span style="color: #000088;">$trans</span><span style="color: #009900;">&#41;</span>	<span style="color: #009900;">&#123;</span>
		<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_tpl <span style="color: #339933;">=</span> <span style="color: #000088;">$tpl</span><span style="color: #339933;">;</span>
		<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_handle <span style="color: #339933;">=</span> <span style="color: #000088;">$event</span><span style="color: #339933;">;</span>
		<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_lang <span style="color: #339933;">=</span> <span style="color: #000088;">$trans</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getLanguage</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> handledEvent<span style="color: #009900;">&#40;</span><span style="color: #000088;">$route</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$route</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">2</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">!=</span> <span style="color: #0000ff;">''</span> <span style="color: #339933;">&amp;&amp;</span> <span style="color: #990000;">method_exists</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">,</span><span style="color: #000088;">$route</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">2</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_<span style="color: #009900;">&#123;</span><span style="color: #000088;">$route</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">2</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#125;</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> 
		  throw <span style="color: #000000; font-weight: bold;">new</span> Exception <span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Brak akcji'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000000; font-weight: bold;">function</span> _show<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>	<span style="color: #009900;">&#123;</span>
		<span style="color: #000088;">$news</span> <span style="color: #339933;">=</span> Doctrine<span style="color: #339933;">::</span><span style="color: #004000;">getTable</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'News'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getNews</span><span style="color: #009900;">&#40;</span>Route<span style="color: #339933;">::</span><span style="color: #004000;">getId</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_lang<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">tpl</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">assign</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'news'</span><span style="color: #339933;">,</span><span style="color: #000088;">$news</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>No i nasza metoda getNews wyglądała by mniej więcej tak (plik NewsTable.php):</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">class</span> NewsTable <span style="color: #000000; font-weight: bold;">extends</span> Doctrine_Table
<span style="color: #009900;">&#123;</span>
  <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> getNews<span style="color: #009900;">&#40;</span> <span style="color: #000088;">$id</span><span style="color: #339933;">,</span> <span style="color: #000088;">$lang</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000088;">$query</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">createQuery</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">'n'</span> <span style="color: #009900;">&#41;</span>
                           <span style="color: #339933;">-&gt;</span><span style="color: #004000;">where</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">'n.id = ?'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$id</span><span style="color: #009900;">&#41;</span>
                           <span style="color: #339933;">-&gt;</span><span style="color: #004000;">andWhere</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">'n.lang = ?'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$lang</span><span style="color: #009900;">&#41;</span>
                           <span style="color: #339933;">-&gt;</span><span style="color: #004000;">execute</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">return</span> <span style="color: #000088;">$query</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Oto całe nasze mvc, mamy model, który jest organizowany za pomocą doctrine, mamy plik kontrolera który sobie pobiera z bazy danych dane, wrzuca je do templatki no i jakoś tam musimy wykombinować żeby jeszcze templatke wczytywać, ale to już inna kwestia.</p>
<p>No więc jak widać implementacja takiego wzorca MVC nie jest trudna, i nie uprzykrzajcie sobie ludzie życia wymyślając nie wiadomo co, nie wiadomo jak złożone struktury katalogów jak to jest proste jak budowa cepa <img src='http://www.cojack.pl/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Ja wiem że równie dobrze możemy sobie utworzyć klasę w której będziemy mieli standardowe zapytania do bazy danych np na PDO, z zwykłą składnią SQL&#8217;ową. Nikt nie broni, a nawet dlaczego nie? np:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">class</span> NewsModel <span style="color: #000000; font-weight: bold;">extends</span> Model <span style="color: #009900;">&#123;</span>
&nbsp;
  <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> __construct <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    parent<span style="color: #339933;">::</span>__construct<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>  
  <span style="color: #009900;">&#125;</span>
&nbsp;
  <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> getNews <span style="color: #009900;">&#40;</span> <span style="color: #000088;">$id</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000088;">$query</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$pdo</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">prepare</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">'SELECT * FROM news WHERE id = :id'</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000088;">$query</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">bindParam</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">':id'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$id</span><span style="color: #339933;">,</span> PDO<span style="color: #339933;">::</span><span style="color: #004000;">PARAM_INT</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">return</span> <span style="color: #000088;">$query</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">execute</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Dlaczego wybrałem Doctrine zamiast właśnie w ten sposób pisać osobne klasy jako modele z standardową składnią SQL? Bo tak mi jest wygodniej, oraz dla mnie bezpieczniej. Wasz wybór jaką drogę obierzecie, tylko nie modźcie z tym wzorcem&#8230; Bo widziałem różne implementację MVC i nie które to mnie po prostu przerażają, tak jak Zyx napisał, prosty wzorzec, ale nie dla wszystkich.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.cojack.pl/mvc-w-php-cz-2/255/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
