<?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>Fri, 20 Aug 2010 18:16:05 +0000</lastBuildDate>
	<language>PL</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Klasa Collection i CollectionIterator</title>
		<link>http://www.cojack.pl/klasa-collection-collectioniterator</link>
		<comments>http://www.cojack.pl/klasa-collection-collectioniterator#comments</comments>
		<pubDate>Fri, 20 Aug 2010 18:10:20 +0000</pubDate>
		<dc:creator>cojack</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[collection]]></category>
		<category><![CDATA[collectioniterator]]></category>
		<category><![CDATA[iterator]]></category>
		<category><![CDATA[skrypty php]]></category>

		<guid isPermaLink="false">http://www.cojack.pl/?p=435</guid>
		<description><![CDATA[ Dobra, trochę na speedzie jest pisany ten wpis, także może być w nim parę nieścisłości i niedociągnięć, ale mam nadzieje że poprawicie mnie w komentarzach. O co chodzi? Kod tutaj opisany poniżej nie jest mojego autorstwa, niektóre treści też zrzynam bezpośrednio z książki bo nie ma innych słów by ...]]></description>
			<content:encoded><![CDATA[<p><img width="100" height="100" alt="PHP" src="http://www.cojack.pl/wp-content/arch-php.png" title="PHP" class="alignleft"> Dobra, trochę na speedzie jest pisany ten wpis, także może być w nim parę nieścisłości i niedociągnięć, ale mam nadzieje że poprawicie mnie w komentarzach. O co chodzi? Kod tutaj opisany poniżej nie jest mojego autorstwa, niektóre treści też zrzynam bezpośrednio z książki bo nie ma innych słów by to opisać. Jest prawie na żywca zdarty z książki &#8222;PHP 5 Zaawansowane Programowanie&#8221;, także odczepić się proszę, nie piszę że ja to napisałem, jak już ktoś coś wymyślił, to nie mam zamiaru wymyślać koła na nowo, tylko poskładać wszystko do kupy i połączyć by to działało. No dobra to jedziemy. Trochę nie po kolei, z tymi klasami, ale wybaczcie. Zaczynamy.</p>
<h3>Słowem wstępu</h3>
<p>Jest sobie taki interfejs w php, który się zwie <strong>Iterator</strong>, posiadający 5 metod, które informują foreach jak sobie ma radzić z argumentami niebędącymi tablicą. On zaś (co jeszcze dziwniejsze) dziedziczy po kolejnym interfejsie który się zwie <strong>Travesrable</strong>. To co poniżej zobaczycie w pełnej krasie, jest implementacją <strong>mapy</strong>.<br />
Ale do rzeczy, po cholerę nam takie pyszne rzeczy? Otóż jeżeli chcielibyśmy sobie obiektowo przechowywać elementy w zmiennej nie będącej tablicą i przeiterować jest foreachem, to jak to zrobicie? No to pokaże Wam jak to można było by zrobić:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">&nbsp;
<span style="color: #666666; font-style: italic;">/* odpowiedni foreach dla ($objIt as $key =&gt; $value ) */</span>
<span style="color: #000088;">$objIt</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> MyIterator<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">for</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$objIt</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">rewind</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #000088;">$obj</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">valid</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #000088;">$objIt</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">next</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  <span style="color: #000088;">$key</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$objIt</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">key</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #000088;">$member</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$objIt</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">current</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Trochę mało to Wam mówi jeszcze, ale jak spojrzycie na dalszą część tekstu to się sami przekonacie.</p>
<h3>Klasa Collection</h3>
<p>Na omówieniu tej klasy, przysłużę się przykładem z książki.</p>
<blockquote><p>
Pisząc aplikację, często zachodzi potrzeba utworzeniu obiektów, które zawierają w sobie grupę innych obiektów. Na przykład w systemie obsługi dziekanatu potrzebna będzie klasa <strong>Student</strong> oraz <strong>Course</strong>. Obiekt <strong>Student</strong> zapewne będzie miał przypisany więcej niże jeden obiekt <strong>Course</strong>. Pierwsze nasuwające się rozwiążanie to dodanie tablicy obiektów <strong>Course</strong> jako zmiennej składowej obiektu <strong>Student</strong>.
</p></blockquote>
<p>Przykład z książki:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">class</span> Student <span style="color: #009900;">&#123;</span>
  <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000088;">$courses</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #666666; font-style: italic;">//... itd</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000088;">$objStudent</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Student<span style="color: #009900;">&#40;</span> <span style="color: #cc66cc;">124</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">foreach</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$objStudent</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">courses</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$objCourse</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  <span style="color: #b1b100;">print</span> <span style="color: #000088;">$objCourse</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">name</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>I wracamy do omówienia problemu:</p>
<blockquote><p>
Oczywiście gdyby taki sposób był najlepszy, to by nie było mowy o klasie Collection (trochę to przerobiłem <img src='http://www.cojack.pl/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' />  )</p>
<p>Powyższe rozwiązanie sprawia kilka problemów. Po pierwsze, publiczny dostęp do tablicy obiektów Course nie jest zgodny z zasadą hermetyzacji. Nie ma możliwości weryfikacji zmian w tablicy czy modyfikacji stanu obiektu Student, gdyby zaszła taka potrzeba. Po drugie, taka implementacja nie określa porządku elementów w tablicy ani sposobu odnalezienia poszukiwanego obiektu. Po trzecie, i najważniejsze, aby zapewnić dostęp do informacji o kursach każdemu użytkownikowi klasy Student, informacje te muszą zostać pobrane z bazy danych za każdym razem, gdy pobierane są informacje o studencie. Oznacza to że nawet jeśli konieczne jest jedynie wyświetlenie imienia studenta, pobierane są wszystkie informacje o kursach. Niepotrzebnie zwiększa to obciążenie serwera baz danych i zmniejsza wydajność aplikacji.<br />
Klasa <strong>Collection</strong> została zaprojektowana tak, aby rozwiązać wszystkie te problemy. Zapewnia obiektową otoczkę dla tablicy i implementuje mechanizm <strong>leniwej konkretyzacji</strong>, czyli opóźnienia procesu tworzenia elementów kolekcji aż do czasu, gdy są one naprawdę potrzebne. Nazywa się ją &#8222;leniwą&#8221;, ponieważ decyzja o tym, kiedy tworzyć konkretne egzemplarze obiektów, jest podejmowana przez samą aplikację.
</p></blockquote>
<p>Dobra, o co ogólnie chodzi? Chodzi o to że nasza klasa Collection, jak sama nazwa wskazuje jest kolekcją obiektów, czyli dodajemy do niej obiekty, a ona zgrabnie je przechowuje w swoim ciele. I to by było na tyle z filozofią klasy Collection, żeby zbytnio nie przeciągać, to poniżej mamy już dwie gotowe klasy które razem z sobą współpracują, są na żywca wydarte z mojego FW, także BDT_Loader, jak po samej nazwie można się domyślić, wczytuje klasy, także nie mam tu nic więcej do dodania. Klasa BDT_Collection_Exception jest po prostu klasą wyjątków, i tu też nie mam nic więcej do dodania.<br />
W naszym przykładzie będziemy potrzebowali dwie klasy, Collection (BDT_Collection) oraz CollectionIterator (BDT_Collection_Iterator). Obiekt klasy CollectionIterator jest tworzony w metodzie <strong>getIterator</strong>. Pod ciałem klasy, krótki opis.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
&nbsp;
BDT_Loader<span style="color: #339933;">::</span><span style="color: #004000;">loadFile</span><span style="color: #009900;">&#40;</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
   <span style="color: #0000ff;">'./lib/BDT/Collection/BDT_Collection_Iterator.php'</span><span style="color: #339933;">,</span>
   <span style="color: #0000ff;">'./lib/BDT/Exception/BDT_Collection_Exception.php'</span>
<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">class</span> BDT_Collection implements IteratorAggregate <span style="color: #009900;">&#123;</span>
&nbsp;
   <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000088;">$_members</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
   <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000088;">$_onload</span><span style="color: #339933;">;</span>
&nbsp;
   <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000088;">$_isLoaded</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">false</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> addItem<span style="color: #009900;">&#40;</span> <span style="color: #000088;">$obj</span><span style="color: #339933;">,</span> <span style="color: #000088;">$key</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">NULL</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>_checkCallback<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
      <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$key</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: #990000;">isset</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_members<span style="color: #009900;">&#91;</span> <span style="color: #000088;">$key</span> <span style="color: #009900;">&#93;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span>
            throw <span style="color: #000000; font-weight: bold;">new</span> BDT_Collection_Exception<span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">'Klucz '</span> <span style="color: #339933;">.</span> <span style="color: #990000;">htmlspecialchars</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$key</span><span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">ENT_QUOTES</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'UTF-8'</span> <span style="color: #009900;">&#41;</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">' jest już zajęty'</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
         <span style="color: #b1b100;">else</span>
            <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_members<span style="color: #009900;">&#91;</span> <span style="color: #000088;">$key</span> <span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$obj</span><span style="color: #339933;">;</span>
      <span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span>
         <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_members<span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$obj</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> removeItem<span style="color: #009900;">&#40;</span> <span style="color: #000088;">$key</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>_checkCallback<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
      <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span> <span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_members<span style="color: #009900;">&#91;</span> <span style="color: #000088;">$key</span> <span style="color: #009900;">&#93;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span>
         <span style="color: #990000;">unset</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_members<span style="color: #009900;">&#91;</span> <span style="color: #000088;">$key</span> <span style="color: #009900;">&#93;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      <span style="color: #b1b100;">else</span>
         throw <span style="color: #000000; font-weight: bold;">new</span> BDT_Collection_Exception<span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">'Błędny klucz '</span> <span style="color: #339933;">.</span> <span style="color: #990000;">htmlspecialchars</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$key</span><span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">ENT_QUOTES</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'UTF-8'</span> <span style="color: #009900;">&#41;</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> getItem<span style="color: #009900;">&#40;</span> <span style="color: #000088;">$key</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>_checkCallback<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
      <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span> <span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_members<span style="color: #009900;">&#91;</span> <span style="color: #000088;">$key</span> <span style="color: #009900;">&#93;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span>
         <span style="color: #b1b100;">return</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_members<span style="color: #009900;">&#91;</span> <span style="color: #000088;">$key</span> <span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
      <span style="color: #b1b100;">else</span>
         throw <span style="color: #000000; font-weight: bold;">new</span> BDT_Collection_Exception<span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">'Błędny klucz '</span> <span style="color: #339933;">.</span> <span style="color: #990000;">htmlspecialchars</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$key</span><span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">ENT_QUOTES</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'UTF-8'</span> <span style="color: #009900;">&#41;</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> keys<span style="color: #009900;">&#40;</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>_checkCallback<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
      <span style="color: #b1b100;">return</span> <span style="color: #990000;">array_keys</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_members <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> length<span style="color: #009900;">&#40;</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>_checkCallback<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
      <span style="color: #b1b100;">return</span> <span style="color: #990000;">count</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_members <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> exists<span style="color: #009900;">&#40;</span> <span style="color: #000088;">$key</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>_checkCallback<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
      <span style="color: #b1b100;">return</span> <span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_members<span style="color: #009900;">&#91;</span> <span style="color: #000088;">$key</span> <span style="color: #009900;">&#93;</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> getIterator<span style="color: #009900;">&#40;</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>_checkCallback<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
      <span style="color: #b1b100;">return</span> <span style="color: #000000; font-weight: bold;">new</span> BDT_Collection_Iterator<span style="color: #009900;">&#40;</span> clone <span style="color: #000088;">$this</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> setLoadCallback<span style="color: #009900;">&#40;</span> <span style="color: #000088;">$functionName</span><span style="color: #339933;">,</span> <span style="color: #000088;">$objOrClass</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">NULL</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;">$objOrClass</span> <span style="color: #009900;">&#41;</span>
         <span style="color: #000088;">$callback</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$objOrClass</span><span style="color: #339933;">,</span> <span style="color: #000088;">$functionName</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      <span style="color: #b1b100;">else</span>
         <span style="color: #000088;">$callback</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$functionName</span><span style="color: #339933;">;</span>
&nbsp;
      <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span> <span style="color: #339933;">!</span><span style="color: #990000;">is_callable</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$callback</span><span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #339933;">,</span> <span style="color: #000088;">$callableName</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
         throw <span style="color: #000000; font-weight: bold;">new</span> BDT_Collection_Exception<span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">'Funkcja zwrotna '</span> <span style="color: #339933;">.</span> <span style="color: #990000;">htmlspecialchars</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$callableName</span><span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">ENT_QUOTES</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'UTF-8'</span> <span style="color: #009900;">&#41;</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">' nieprawidłowa!'</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
         <span style="color: #b1b100;">return</span> <span style="color: #009900; font-weight: bold;">FALSE</span><span style="color: #339933;">;</span>
      <span style="color: #009900;">&#125;</span>
      <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_onload <span style="color: #339933;">=</span> <span style="color: #000088;">$callback</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> _checkCallback<span style="color: #009900;">&#40;</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: #990000;">isset</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_onload <span style="color: #009900;">&#41;</span> <span style="color: #339933;">&amp;&amp;</span> <span style="color: #339933;">!</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_isLoaded <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
         <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_isLoaded <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #339933;">;</span>
         <span style="color: #990000;">call_user_func</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_onload<span style="color: #339933;">,</span> <span style="color: #000088;">$this</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      <span style="color: #009900;">&#125;</span>
   <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Jak łatwo zauważyć w każdej z metod, sprawdzamy callbacka, czyli funkcje która powinna zostać wywołana przy utworzeniu kolekcji obiektów. Taka funkcja lub metoda może zostać utworzona w ciele klasy, w której wykorzystujemy kolekcje obiektów, lub po prostu jako zwykła funkcja, poniżej będzie przykład.</p>
<h3>Klasa CollectionIterator</h3>
<p>W tej klasie nie ma co zmieniać, no chyba że nazwy klas, bo metod to nie można, są wymagane przez interfejs który klasa implementuje. To też nie może być klasa abstrakcyjna, gdyż jest tworzony jej obiekt. Klasa jak klasa, przepisać, skopiować, pozmieniać nazwy jak komu się podoba klas, i używać.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">class</span> BDT_Collection_Iterator implements Iterator <span style="color: #009900;">&#123;</span>
   <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000088;">$_collection</span><span style="color: #339933;">;</span>
&nbsp;
   <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000088;">$_currIndex</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span>
&nbsp;
   <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000088;">$_keys</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> BDT_Collection <span style="color: #000088;">$objCol</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>_collection <span style="color: #339933;">=</span> <span style="color: #000088;">$objCol</span><span style="color: #339933;">;</span>
      <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_keys <span style="color: #339933;">=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_collection<span style="color: #339933;">-&gt;</span><span style="color: #004000;">keys</span><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> <span style="color: #990000;">rewind</span><span style="color: #009900;">&#40;</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>_currIndex <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</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> <span style="color: #990000;">key</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
      <span style="color: #b1b100;">return</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_keys<span style="color: #009900;">&#91;</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_currIndex <span style="color: #009900;">&#93;</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> <span style="color: #990000;">current</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
      <span style="color: #b1b100;">return</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_collection<span style="color: #339933;">-&gt;</span><span style="color: #004000;">getItem</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_keys<span style="color: #009900;">&#91;</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_currIndex <span style="color: #009900;">&#93;</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> <span style="color: #990000;">next</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
      <span style="color: #339933;">++</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_currIndex<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> valid<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
      <span style="color: #b1b100;">return</span> <span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_keys<span style="color: #009900;">&#91;</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_currIndex <span style="color: #009900;">&#93;</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>

<h3> Narzucanie wymagań co do kolekcji </h3>
<p>Możemy też wymusić na danym obiekcie jakiego typu dana kolekcja musi być, a możemy to zrobić dzięki dziedziczeniu:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">class</span> OwnCollection <span style="color: #000000; font-weight: bold;">extends</span> BDT_Collection <span style="color: #009900;">&#123;</span>
  <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> addItem<span style="color: #009900;">&#40;</span> OwnClass <span style="color: #000088;">$obj</span><span style="color: #339933;">,</span> <span style="color: #000088;">$key</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">NULL</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    parent<span style="color: #339933;">::</span><span style="color: #004000;">addItem</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$obj</span><span style="color: #339933;">,</span> <span style="color: #000088;">$key</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>I dzięki takiemu zastosowaniu, nie tworzymy obiektu BDT_Collection, w swojej klasie, tylko OwnCollection, i obiekty które prześlemy do naszej kolekcji muszą być pochodzenia klasy OwnClass.</p>
<h3>Implementacja</h3>
<p>Prosty przykład z użyciem callbacka, dla Collection ( z książki ):</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">class</span> Singer<span style="color: #009900;">&#123;</span>
  <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000088;">$name</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;">$name</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: #004000;">name</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$name</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">class</span> NightClub <span style="color: #009900;">&#123;</span>
  <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000088;">$name</span><span style="color: #339933;">;</span>
  <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000088;">$singers</span><span style="color: #339933;">;</span>
  <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;">$name</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: #004000;">name</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$name</span><span style="color: #339933;">;</span>
    <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">singers</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> BDT_Collection<span style="color: #339933;">;</span>
    <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">singers</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setLoadCallback</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">'_loadSingers'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$this</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> _loadSingers<span style="color: #009900;">&#40;</span> BDT_Collection <span style="color: #000088;">$col</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000088;">$col</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">addItem</span><span style="color: #009900;">&#40;</span> <span style="color: #000000; font-weight: bold;">new</span> Singer<span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">&quot;Maciek&quot;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000088;">$col</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">addItem</span><span style="color: #009900;">&#40;</span> <span style="color: #000000; font-weight: bold;">new</span> Singer<span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">&quot;Grzesiek&quot;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000088;">$col</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">addItem</span><span style="color: #009900;">&#40;</span> <span style="color: #000000; font-weight: bold;">new</span> Singer<span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">&quot;Wojtek&quot;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000088;">$objNightClub</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> NightClub<span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">&quot;Rotunda&quot;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;Witamy w klubie &quot;</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$objNightClub</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">name</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">&quot;&lt;br /&gt;&quot;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;Dziś zaśpiewa nam &quot;</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$objNightClub</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">singers</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">length</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">&quot; piosenkarzy &lt;br /&gt;&quot;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;Oto oni: &lt;br /&gt;&quot;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">foreach</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$objNightClub</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">singers</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$objSinger</span> <span style="color: #009900;">&#41;</span>
  <span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;Piosenkarz &quot;</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$objSinger</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">name</span> <span style="color: #339933;">.</span><span style="color: #0000ff;">&quot; &lt;br /&gt;&quot;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;Powitajmy ich gorąco oklaskami&quot;</span><span style="color: #339933;">;</span></pre></div></div>

<h3>Słów kilka na zakończenie</h3>
<p>Nie mam zbytnio jak tego sprawdzić, gdyż leże chory w łóżku i pisze na dziewczyny laptopie (mój lap też ma chorobowe), a tutaj jest winzgroza, także wybaczcie jak się tam jakieś błędy wtargnęły. Szkic ten ma już trochę czasu, stąd miałem kod z swojego FW. Klasa bardzo przyjemna, można ją w wielu rzeczach zaimplementować, u mnie działa jako kolekcja widoków i slotów w klasie szablonów (templatek), jak się uda to ją zaimplementuje w większej ilości miejsc, bo jest na prawdę ciekawa, chociażby do przechowywania wyników zapytań, przy pobieraniu z bazy danych. Za wszelkie błędy z góry przepraszam, za to że kod prawie żywcem zdarty z książki, nie przepraszam <img src='http://www.cojack.pl/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  Za to że klasy nie opisane, przepraszam (jak wyzdrowieje to poprawie). Mam nadzieje że nie tylko mi się przyda taka klasa ale i zarówno Wam.</p>
<p>Na zakończenie, dodam że kolega Wojciech Soczyński, też omówił na swoim blogu, implementację interfejsu Iterator. Link poniżej.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.cojack.pl/klasa-collection-collectioniterator/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>PostgreSQL – PL/pgSQL cz.3</title>
		<link>http://www.cojack.pl/postgresql-plpgsql-cz-3</link>
		<comments>http://www.cojack.pl/postgresql-plpgsql-cz-3#comments</comments>
		<pubDate>Sat, 14 Aug 2010 17:09:07 +0000</pubDate>
		<dc:creator>cojack</dc:creator>
				<category><![CDATA[SQL]]></category>
		<category><![CDATA[PL/pgSQL]]></category>
		<category><![CDATA[postgresql]]></category>

		<guid isPermaLink="false">http://www.cojack.pl/?p=438</guid>
		<description><![CDATA[ Na początku chciałbym przeprosić blogera Wojciecha Soczyńskiego, za to iż miałem napisać o klasie interpretującej interfejs Iterator, wpis już jest w trakcie budowy, ale nie mogę się zabrać by go skończyć. Także wyczekuj   Z cyklu artykułów o PL/pgSQL, chciałbym przedstawić kolejną z możliwości tego języka proceduralnego w ...]]></description>
			<content:encoded><![CDATA[<p><img width="100" height="100" alt="PostgreSQL" src="http://www.cojack.pl/wp-content/arch-postgresql.png" title="PostgreSQL" class="alignleft"> Na początku chciałbym przeprosić blogera Wojciecha Soczyńskiego, za to iż miałem napisać o klasie interpretującej interfejs <strong>Iterator</strong>, wpis już jest w trakcie budowy, ale nie mogę się zabrać by go skończyć. Także wyczekuj <img src='http://www.cojack.pl/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  Z cyklu artykułów o <strong>PL/pgSQL</strong>, chciałbym przedstawić kolejną z możliwości tego języka proceduralnego w bazie danych <strong>PostgreSQL</strong>.</p>
<h3>Pętle cd.</h3>
<p>Miałem napisać o pętlach, w poprzednim wpisie, ale materiał jest na tyle obszerny że postanowiłem to przenieść i poświęcić im cały wpis. No to jedziemy.</p>
<p>Pętle jak nam ładnie pokazuje manual:</p>

<div class="wp_syntax"><div class="code"><pre class="plsql" style="font-family:monospace;"><span style="color: #00F;">&#91;</span> <span style="color: #00F;">&lt;&lt;</span>label<span style="color: #00F;">&gt;&gt;</span> <span style="color: #00F;">&#93;</span>
<span style="color: #00F;">LOOP</span>
    statements
<span style="color: #00F;">END</span> <span style="color: #00F;">LOOP</span> <span style="color: #00F;">&#91;</span> label <span style="color: #00F;">&#93;</span><span style="color: #00F;">;</span></pre></div></div>

<p>Proste co? A teraz, krótki opis, otóż każda pętla może zostać &#8222;nazwana&#8221;, czyli posiadać tzw. label ( z ang. etykietę ), po co? Po to gdy będziemy chcieli zakończyć pętle, a będziemy mieli zagnieżdżenie pętel, to w przypadku chęci wyjścia całkiem z wszystkich pętli, wystarczy podać nazwę pętli wyżej. Służy nam temu polecenie:</p>

<div class="wp_syntax"><div class="code"><pre class="plsql" style="font-family:monospace;"><span style="color: #00F;">EXIT</span> <span style="color: #00F;">&#91;</span> label <span style="color: #00F;">&#93;</span> <span style="color: #00F;">&#91;</span> <span style="color: #00F;">WHEN</span> boolean<span style="color: #00F;">-</span>expression <span style="color: #00F;">&#93;</span><span style="color: #00F;">;</span></pre></div></div>

<p>Dlaczego nie RETURN a EXIT? Otóż możemy równie dobrze użyć RETURN w pętli by z niej wyjść, ale słowo kluczowe RETURN mówi nam coś innego, zwróć. A co my zwracamy wychodząc z pętli? No nic, także te słowo jest mylne.</p>
<p>Wracając do pętli, może się dziwnie wydawać że nie wiadomo kiedy się ona skończy, gdyż nie jest podoba do żadnej z pętli znanych nam z języka php, ani to for, ani do &#8230; while, ani while itd. No właśnie, gdybyśmy nie mieli żadnego warunku w pętli kończącego ją, to dostalibyśmy pętlę nieskończoną. Dlatego taka pętla <em>musi</em> posiadać w sobie warunek skończenia. Musimy na własną rękę inkrementować (itp..) jakaś wartość i sprawdzać ją w pętli. Otóż samej pętli LOOP to uwierzcie mi lub nie, to rzadko będziecie używać. No jest sama w sobie mało przydatna.</p>
<h3>Iteracja tablicy elementów</h3>
<p>Definicja pętli:</p>

<div class="wp_syntax"><div class="code"><pre class="plsql" style="font-family:monospace;"><span style="color: #00F;">&#91;</span> <span style="color: #00F;">&lt;&lt;</span>label<span style="color: #00F;">&gt;&gt;</span> <span style="color: #00F;">&#93;</span>
<span style="color: #00F;">FOR</span> name <span style="color: #00F;">IN</span> <span style="color: #00F;">&#91;</span> <span style="color: #00F;">REVERSE</span> <span style="color: #00F;">&#93;</span> expression <span style="color: #00F;">..</span> expression <span style="color: #00F;">&#91;</span> <span style="color: #00F;">BY</span> expression <span style="color: #00F;">&#93;</span> <span style="color: #00F;">LOOP</span>
    statements
<span style="color: #00F;">END</span> <span style="color: #00F;">LOOP</span> <span style="color: #00F;">&#91;</span> label <span style="color: #00F;">&#93;</span><span style="color: #00F;">;</span></pre></div></div>

<p>Tu jest moc, ukłony dla dev z postgre za wskaźniki. Dzięki językowi proceduralnemu <strong>PL/pgSQL</strong>, nie musimy się troszczyć o deklaracje wskaźników w pętli i ich wykorzystywanie, są one automatycznie definiowane i używane przez silnik bazy. Dobre co? W postgresie mamy typy tablicowe. Deklaracja jest bardzo podobna jak w innych językach:</p>
<ul>
<li>INT[]</li>
<li>VARCHAR[]</li>
</ul>
<p>I tak dalej, dobra dajmy na to że mamy funkcję której jednym z argumentów jest właśnie np VARCHAR[], co lepsze możemy zdefiniować argument funkcji jako ANYARRAY, i dzięki temu, możemy do takiej funkcji przesyłać tablicę różnego typu, bez potrzeby martwienia się o to, w jaki sposób to przesyłamy, i tak później przy wrzucaniu danych do bazy musimy rzutować typ. Wracając do sedna, to mamy taką tablice, która składa się np z 6 elementów. Indeksy tablic w postgresql są numerowane od 1 <img src='http://www.cojack.pl/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' />  Też sobie wymyślili, no ale dobra. Mamy taką tablice, i dajmy na to że składa się z 240 wierszy. Czyli jest 240 indeksów. Albo i nie, ponieważ taka tablica może być dynamiczna i w sumie nie wiemy jak wielka jest ta tablica, wiemy jedynie że będzie posiadać 6 elementów jeden wiersz. I jak to zrobić? Patrzcie:</p>

<div class="wp_syntax"><div class="code"><pre class="plsql" style="font-family:monospace;"><span style="color: #00F;">FOR</span> i <span style="color: #00F;">IN</span> ARRAY_LOWER<span style="color: #00F;">&#40;</span> <span style="color: #F00;">&quot;_someVar&quot;</span><span style="color: #00F;">,</span> <span style="color: #800;">1</span> <span style="color: #00F;">&#41;</span> <span style="color: #00F;">..</span> ARRAY_UPPER<span style="color: #00F;">&#40;</span> <span style="color: #F00;">&quot;_someVar&quot;</span><span style="color: #00F;">,</span> <span style="color: #800;">1</span> <span style="color: #00F;">&#41;</span>
  <span style="color: #00F;">LOOP</span>
&nbsp;
    <span style="color: #00F;">INSERT</span> <span style="color: #00F;">INTO</span>
      <span style="color: #F00;">&quot;someTable&quot;</span>
    <span style="color: #00F;">&#40;</span>
      <span style="color: #00F;">...</span> <span style="color: #080; font-style: italic;">-- jakieś tam kolumny</span>
    <span style="color: #00F;">&#41;</span>
    <span style="color: #00F;">VALUES</span>
    <span style="color: #00F;">&#40;</span>
      <span style="color: #F00;">&quot;_someVar&quot;</span><span style="color: #00F;">&#91;</span> i <span style="color: #00F;">&#93;</span><span style="color: #00F;">&#91;</span> <span style="color: #800;">1</span> <span style="color: #00F;">&#93;</span><span style="color: #00F;">::</span>INT<span style="color: #00F;">,</span>
      <span style="color: #F00;">&quot;_someVar&quot;</span><span style="color: #00F;">&#91;</span> i <span style="color: #00F;">&#93;</span><span style="color: #00F;">&#91;</span> <span style="color: #800;">2</span> <span style="color: #00F;">&#93;</span><span style="color: #00F;">::</span><span style="color: #00F;">VARCHAR</span><span style="color: #00F;">,</span>
      <span style="color: #F00;">&quot;_someVar&quot;</span><span style="color: #00F;">&#91;</span> i <span style="color: #00F;">&#93;</span><span style="color: #00F;">&#91;</span> <span style="color: #800;">3</span> <span style="color: #00F;">&#93;</span><span style="color: #00F;">::</span><span style="color: #00F;">BOOLEAN</span><span style="color: #00F;">,</span>
      <span style="color: #F00;">&quot;_someVar&quot;</span><span style="color: #00F;">&#91;</span> i <span style="color: #00F;">&#93;</span><span style="color: #00F;">&#91;</span> <span style="color: #800;">4</span> <span style="color: #00F;">&#93;</span><span style="color: #00F;">::</span>BIT<span style="color: #00F;">,</span>
      <span style="color: #F00;">&quot;_someVar&quot;</span><span style="color: #00F;">&#91;</span> i <span style="color: #00F;">&#93;</span><span style="color: #00F;">&#91;</span> <span style="color: #800;">5</span> <span style="color: #00F;">&#93;</span><span style="color: #00F;">::</span>NUMERIC<span style="color: #00F;">,</span>
      <span style="color: #F00;">&quot;_someVar&quot;</span><span style="color: #00F;">&#91;</span> i <span style="color: #00F;">&#93;</span><span style="color: #00F;">&#91;</span> <span style="color: #800;">6</span> <span style="color: #00F;">&#93;</span><span style="color: #00F;">::</span>BYTEA<span style="color: #00F;">,</span>
    <span style="color: #00F;">&#41;</span><span style="color: #00F;">;</span>
&nbsp;
  <span style="color: #00F;">END</span> <span style="color: #00F;">LOOP</span><span style="color: #00F;">;</span></pre></div></div>

<p>Co to jest <em>i</em> ? <em>i</em> jest numerem indeksu, nie musimy go definiować w bloku <strong>DECLARE</strong>, jest on w biegu definiowany.</p>
<p>Jest moc co? Możemy w tablicy przechowywać różnego typu wartości i później w zależności jakiego typu jest dana kolumna, rzutujemy ją do odpowiedniego typu i jazda.</p>
<p>Napisałem powyżej że pętla <em>musi</em> posiadać w sobie warunek skończenia, no właśnie nie musi <img src='http://www.cojack.pl/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  Tzn w zależności w jakim kontekście jej użyjemy.</p>
<h3>Iteracja wyników zapytania</h3>
<p>Definicja pętli:</p>

<div class="wp_syntax"><div class="code"><pre class="plsql" style="font-family:monospace;"><span style="color: #00F;">&#91;</span> <span style="color: #00F;">&lt;&lt;</span>label<span style="color: #00F;">&gt;&gt;</span> <span style="color: #00F;">&#93;</span>
<span style="color: #00F;">FOR</span> target <span style="color: #00F;">IN</span> query <span style="color: #00F;">LOOP</span>
    statements
<span style="color: #00F;">END</span> <span style="color: #00F;">LOOP</span> <span style="color: #00F;">&#91;</span> label <span style="color: #00F;">&#93;</span><span style="color: #00F;">;</span></pre></div></div>

<p>Nie opisałem definicji tych dwóch pętli, gdyż na przykładzie pierwszej, analiza dwóch pozostałych w przykładach powinna być dość prosta.</p>
<p>Dość fajna i ciekawa pętla, która dość często się przydaje, o co chodzi? Mamy sytuacje że na podstawie jednego wiersza i argumentów w nim zawartych musimy zmienić inne wiersze. Przeliczyć jakieś wartości czy cokolwiek innego.</p>

<div class="wp_syntax"><div class="code"><pre class="plsql" style="font-family:monospace;"><span style="color: #00F;">FOR</span> <span style="color: #F00;">&quot;__row&quot;</span> <span style="color: #00F;">IN</span>
  <span style="color: #00F;">SELECT</span>
    <span style="color: #F00;">&quot;someColumn&quot;</span>
  <span style="color: #00F;">FROM</span>
    <span style="color: #F00;">&quot;someTable&quot;</span>
  <span style="color: #00F;">WHERE</span>
    <span style="color: #F00;">&quot;someOtherColumn&quot;</span> <span style="color: #00F;">=</span> <span style="color: #F00;">&quot;someVar&quot;</span> <span style="color: #080; font-style: italic;">-- nie ma tutaj średnika, ważne!</span>
<span style="color: #00F;">LOOP</span>
  PERFORM <span style="color: #F00;">&quot;someFunction&quot;</span><span style="color: #00F;">&#40;</span> <span style="color: #F00;">&quot;__row&quot;</span><span style="color: #00F;">.</span><span style="color: #F00;">&quot;someColumn&quot;</span> <span style="color: #00F;">&#41;</span><span style="color: #00F;">;</span>
<span style="color: #00F;">END</span> <span style="color: #00F;">LOOP</span><span style="color: #00F;">;</span></pre></div></div>

<p>A teraz trochę co się tam dzieje i co jest czym. Od początku. Zmienna <strong>&#8222;__row&#8221;</strong> jest zdefiniowana jako <strong>RECORD</strong> w bloku <strong>DECLARE</strong>. Dzięki takiej definicji możemy wykorzystać ją jako obiekt wiersza w pętli, i obiektowo odwoływać się do kolumn pobranych w zapytaniu poprzez właśnie tą zmienną. Tak jak to widzimy w argumencie funkcji <strong>&#8222;someFunction&#8221;</strong>. Normalnie pobieramy sobie dane w select, podajemy warunki, sortujemy, robimy zwykłego selecta. Następnie iterujemy elementy wyniku zapytania, wiersz po wierszu. W moim przykładzie wywołujemy w pętli inną funkcję która coś robi. Równie dobrze na podstawie tych elementów z wyniku zapytania możemy robić inne rzeczy jak np aktualizacja innych wierszy w bazie itd.</p>
<p>W sumie, to by było na tyle jeżeli chodzi o pętle, są inne sposoby tworzenia pętli, ale nigdy mi one nie były potrzebne, nigdy z nich nie korzystałem. Także zachęcam do manuala. Jak zwykle w linkach poniżej.</p>
<h3>Słów kilka o wydajności</h3>
<p>Jeszcze chciałbym o jednej rzeczy wspomnieć, ponieważ dużo osób upiera się przy stwierdzeniu że założenie przeniesienia logiki aplikacji do sql wcale nie odciąży serwera, po prostu przeniesie środek ciężkości w inne miejsce. Ja się z tym stwierdzeniem nie będę kłócił bo to prawda, i jest jeszcze jedna rzecz która mi nie daje spokoju. Niektórzy z Was twierdzą że funkcje plpgsql będą za bardzo obciążać serwer, pewnie że będą jak się je beznadziejnie napisze.</p>
<p>Bardzo prosty przykład, zwykły warunek (koniunkcja), mamy jakieś dane, i potrafimy stwierdzić że w większości przypadków warunek będzie nieprawdziwy, więc po co w takim razie stawiać ten warunek, który będzie nieprawdziwy na drugim miejscu w koniunkcji? Co innego w alternatywie. Taka prosta rzecz, może szału nie zrobi na prędkości uzyskanej na takiej rzeczy, ale należy o tym pamiętać. Druga rzecz, ilość pamięci wykorzystanej przez funkcje, otóż wiadomą rzeczą jest to że gdy zdefiniujemy masę zmiennych, funkcja napęcznieje, a takie zmienne jak: &#8222;__isSelected&#8221; czy podobnego typu rzeczy można zastąpić w bardzo prosty sposób. Prosty przykład:</p>

<div class="wp_syntax"><div class="code"><pre class="plsql" style="font-family:monospace;">PERFORM
  <span style="color: #800;">1</span>
<span style="color: #00F;">FROM</span>
  <span style="color: #F00;">&quot;someTable&quot;</span>
<span style="color: #00F;">WHERE</span>
  <span style="color: #F00;">&quot;someColumn&quot;</span> <span style="color: #00F;">=</span> <span style="color: #F00;">&quot;_someVar&quot;</span><span style="color: #00F;">;</span>
&nbsp;
<span style="color: #00F;">IF</span> <span style="color: #00F;">NOT</span> FOUND <span style="color: #00F;">THEN</span>
  <span style="color: #00F;">....</span> <span style="color: #080; font-style: italic;">-- coś robimy gdy nie znaleziono</span>
&nbsp;
<span style="color: #00F;">ELSE</span>
  <span style="color: #00F;">...</span> <span style="color: #080; font-style: italic;">-- robimy coś innego</span>
&nbsp;
<span style="color: #00F;">END</span> <span style="color: #00F;">IF</span><span style="color: #00F;">;</span></pre></div></div>

<p>I teraz kolejny przykład przypadku, gdy będziemy wiedzieć że dany warunek w większości przypadków zostanie spełniono to zastąpimy <strong>NOT FOUND</strong>, po prostu <strong>FOUND</strong>, nie ustawiamy żadnych zmiennych, nie nadajemy im wartości, a metoda <strong>PERFORM</strong> jest o tyle fajna, że nie musimy nigdzie przypisywać wartości zwracanych z tego innego <strong>SELCT</strong>&#8216;a.</p>
<p>To by było na tyle tego całego wpisu, mam nadzieje że był interesujący.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.cojack.pl/postgresql-plpgsql-cz-3/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>BDT &#8211; Basic PHP Develop Tools</title>
		<link>http://www.cojack.pl/bdt-basic-php-develop-tools</link>
		<comments>http://www.cojack.pl/bdt-basic-php-develop-tools#comments</comments>
		<pubDate>Sun, 08 Aug 2010 11:55:40 +0000</pubDate>
		<dc:creator>cojack</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[bdt]]></category>
		<category><![CDATA[skrypty php]]></category>

		<guid isPermaLink="false">http://www.cojack.pl/?p=414</guid>
		<description><![CDATA[ Jako iż każdy chce po sobie zostawić ślad tak i ja mam taki plan. Moje założenie: Napisać prosty i ciekawy system, który byłby fundamentem do tworzenia stron, stąd też nazwa Basic PHP Develop Tools, czyli podstawowe narzędzia. Zarazem podstawowe narzędzia i pełna moc w pisaniu aplikacji. Na pewno nie ...]]></description>
			<content:encoded><![CDATA[<p><img width="100" height="100" class="alignleft" title="PHP" src="http://www.cojack.pl/wp-content/arch-php.png" alt="PHP"> Jako iż każdy chce po sobie zostawić ślad tak i ja mam taki plan. Moje założenie: Napisać prosty i ciekawy system, który byłby fundamentem do tworzenia stron, stąd też nazwa Basic PHP Develop Tools, czyli podstawowe narzędzia. Zarazem podstawowe narzędzia i pełna moc w pisaniu aplikacji. Na pewno nie jeden z Was spotkał się z Drupalem, i opiniami o nim jaki to on nie jest wyczesany, jaki to on jest wspaniały, no cud malina. Tak tylko czy ktoś próbował w nim pisać cokolwiek? No właśnie i ja podziękuje za taką fanaberię. Prędzej bym &#8222;wyklikał&#8221; w nim moduł niż go napisał. Ale nie w tym sęk, chciałbym by ta aplikacja nie przerodziła się w Frameworka, nie chce nazywać tego Frameworkiem, i nie chce by ktokolwiek o nim w ten sposób myślał. Bardzo nie lubię tego stwierdzenia, i w ogóle nie przypada mi do gustu, powiem więcej wręcz się nim brzydzę.</p>
<h3>Założenia do BDT</h3>
<p>- W pełni obiektowy<br />
- Podstawowe narzędzia dla developera<br />
- Darmowy na licencji GPL</p>
<p>to by było na tyle <img src='http://www.cojack.pl/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<h3>Użyte narzędzia</h3>
<p>- Horde Routes<br />
- Cache by MatheW ( linki na dole )<br />
- Laptop, klawiatura, myszka, monitor, trochę palców&#8230;  własne pomysły + podpatrzone.</p>
<h3>Co już mam zrobione</h3>
<p>- Obsługa akcji,<br />
- Routing (ta już był tylko zaimplementować),<br />
- Cache (j/w),<br />
- System szablonów ( php + html, żadne smarty opty i inne śmiecie ),<br />
- Obsługa błędów ( wyjątki + trigger_error ),<br />
- Obsługa SQL w 40%,<br />
- Confingi ( w XML )</p>
<h3>Czego jeszcze nie mam zrobione</h3>
<p>- Requesty (ale mam już koncept)<br />
- Weryfikacja danych (j/w)<br />
- Headery (szczerze, to mi się w to nie chce bawić, oprócz takich podstawowych jak 404 itp)<br />
- MultiLanguage ( dla błędów to będzie na 100% gettext, i l18n dla treści )<br />
- Instalator ( jeszcze nie wiem czy będzie )</p>
<h3>Co chcę uzyskać</h3>
<p>Chcę napisać wydajny system, który usprawni mi pracę, która sprawi mi jeszcze więcej przyjemności niż Wam się wydaje, gdyż dla mnie programowanie to frajda. Olałem Doctrine, gdyż z tymi pajacami z dev nie można się w żaden sposób dogadać, myślą że pozjadali wszystkie rozumy i są najlepsi na świecie, także ORM będzie trochę inny niż wszystkie. Piszę swój system do zarządzania SQL&#8217;em, oczywiście nie będzie tam żadnych INSERT, UPDATE czy DELETE w kodzie wykonanego wszystko będzie oparte o język proceduralny PL/pgSQL nazwałem tą aplikację PGFM (PostgreSQL Function Mapper) &#8230; ( przy okazji refaktoryzacji kodu już zdążyłem zmienić nazwy większości klas, także ciekawe co z tego wyjdzie&#8230;) . Czyli dodanie rekordów do bazy danych czy ich aktualizacja lub/i usunięcie będzie się wykonywało poprzez procedury. W pewnym stopniu jest to przeniesienie logiki aplikacji do SQL&#8217;a, ale dlaczego nie? Jest to ciekawe rozwiązanie i nigdzie wcześniej nie widziałem takiego rozwiązania ( no prawie nigdzie ale nie mogę powiedzieć gdzie ;] domyślcie się gdzie ).</p>
<h3>Dlaczego darmowy?</h3>
<p>Dlatego że chce by każdy miał dostęp do innego spojrzenia na problem by też mógł się rozwijać analizując czyjś kod, może znajdzie ktoś jakiś błąd i pomoże mi go naprawić. Ale szczerze powiedziawszy nie liczę na to że będziecie chcieli używać tych narzędzi, nie zależy mi na tym. Piszę go dla siebie i dla firmy mojego kolegi <img src='http://www.cojack.pl/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<h3>Bezpieczeństwo</h3>
<p>Dużą wagę przekładam na bezpieczeństwo aplikacji, zatem data wydania będzie się przeciągać w czasie, będę chciał uniknąć falstartów i śpieszyć się z tym byście ujrzeli moje wypociny, jakoś mi się nie śpieszy. Rdzeń aplikacji będzie a przynajmniej będę miał takie założenie, odporny na taki typu sql injecty, xss&#8217;y i masę innych dupereli.</p>
<h3>Słów kilka na zakończenie</h3>
<p>Pewnie nie jeden z Was zapyta się po co to piszę? No napisałem powyżej, chce to zrobić by zostawić jakiś ślad po sobie. Oraz piszę też to po to by się samemu rozwijać, widzieć problem i znaleźć rozwiązanie dla niego. Na prawdę fajnie się idzie owkurw**** jak coś nie wychodzi, a później olśnienie i tona euforii jak zaczyna działać. To jest właśnie to dlaczego piszę swoją aplikację. Poza tym TAO programowania.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.cojack.pl/bdt-basic-php-develop-tools/feed</wfw:commentRss>
		<slash:comments>14</slash:comments>
		</item>
		<item>
		<title>PostgreSQL – Ltree cz.2</title>
		<link>http://www.cojack.pl/postgresql-ltree-cz-2</link>
		<comments>http://www.cojack.pl/postgresql-ltree-cz-2#comments</comments>
		<pubDate>Sun, 27 Jun 2010 09:37:08 +0000</pubDate>
		<dc:creator>cojack</dc:creator>
				<category><![CDATA[SQL]]></category>
		<category><![CDATA[ltree]]></category>
		<category><![CDATA[postgresql]]></category>

		<guid isPermaLink="false">http://www.cojack.pl/?p=425</guid>
		<description><![CDATA[ Nadeszła w końcu ta chwila, w której miałem wolny czas by usiąść i dokończyć implementację ltree. Udało mi się, uzyskałem to co chciałem, i to na czym by każdemu programiście zależało. Działa tak jak ja chce, a nie tak jak baza chce. Do rzeczy, w ostatnim i zarazem pierwszym ...]]></description>
			<content:encoded><![CDATA[<p><img width="100" height="100" alt="PostgreSQL" src="http://www.cojack.pl/wp-content/arch-postgresql.png" title="PostgreSQL" class="alignleft"> Nadeszła w końcu ta chwila, w której miałem wolny czas by usiąść i dokończyć implementację ltree. Udało mi się, uzyskałem to co chciałem, i to na czym by każdemu programiście zależało. Działa tak jak ja chce, a nie tak jak baza chce. Do rzeczy, w ostatnim i zarazem pierwszym wpisie o ltree w postgresie nie mogłem sobie poradzić z sortowaniem, kombinowałem razem z depeszem jak by go tu posortować, w końcu jakieś rozwiązanie padło. Tylko te rozwiązanie depesz wziął z swojej struktury drzewiastej, otóż mówię temu stanowcze NIE! Dlaczego? Ltree zostało napisane po to by nie robić nic rekursywnie, to po prostu miażdży podejście do drzew w każdym calu, żadne nested sety i inne śmiecie z rightem i leftem. Tam to idzie zęby połamać a nie to ugryźć. Poza tym jest to mało optymalne, to już wolę id, parent_id (taki joke).</p>
<h3>Sortowanie w ltree</h3>
<p>Rozwiązanie było bliżej niż można było się tego spodziewać. Miałem z trylion pomysłów jak to rozkminić. Pomyślałem o liczbie rzeczywistej której każda kolejna część po przecinku będzie przedstawiała nr zagłębienia, tylko to nie jest tak łatwo oprogramować i mogłyby wyjść niezłe kaszany, także odpuściłem sobie to. I olśniło mnie ARRAY! No jacha! To przecież jest tak proste i oczywiste że nie wiem o czym my rozmawiamy. Sam sobie ten problem urodziłem, a powodem tego było iż nikt wcześniej nie pisał o tym, w necie to nawet nie ma słowa o tym module, parę rzeczy znajdziemy w manualu i stronie twórców.  Ale nikt nie pokwapił się z implementacją tego z sortowaniem i się nie podzielił.</p>
<h3>Implementacja ltree z sortowaniem</h3>
<p>Otóż sprawa jest banalnie prosta (teraz już jest):</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;category&quot;</span> <span style="color: #66cc66;">&#40;</span>
   <span style="color: #ff0000;">&quot;idCategory&quot;</span>  SERIAL <span style="color: #993333; font-weight: bold;">PRIMARY</span> <span style="color: #993333; font-weight: bold;">KEY</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;categoryPath&quot;</span>   LTREE<span style="color: #66cc66;">,</span>
   <span style="color: #ff0000;">&quot;ordering&quot;</span> INT<span style="color: #66cc66;">&#91;</span><span style="color: #66cc66;">&#93;</span>
<span style="color: #66cc66;">&#41;</span>;</pre></div></div>

<p>I mógłbym powiedzieć amen. Alę dodam jeszcze:</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> category <span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">&quot;categoryPath&quot;</span><span style="color: #66cc66;">,</span> ordering <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: #ff0000;">'{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> category <span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">&quot;categoryPath&quot;</span><span style="color: #66cc66;">,</span> ordering <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: #ff0000;">'{1,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> category <span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">&quot;categoryPath&quot;</span><span style="color: #66cc66;">,</span> ordering <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: #ff0000;">'{1,1,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> category <span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">&quot;categoryPath&quot;</span><span style="color: #66cc66;">,</span> ordering <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: #ff0000;">'{1,1,1,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> category <span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">&quot;categoryPath&quot;</span><span style="color: #66cc66;">,</span> ordering <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: #ff0000;">'{1,1,1,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> category <span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">&quot;categoryPath&quot;</span><span style="color: #66cc66;">,</span> ordering <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.Planets'</span><span style="color: #66cc66;">.</span> <span style="color: #ff0000;">'{1,1,1,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> category <span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">&quot;categoryPath&quot;</span><span style="color: #66cc66;">,</span> ordering <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: #ff0000;">'{1,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> category <span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">&quot;categoryPath&quot;</span><span style="color: #66cc66;">,</span> ordering <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: #ff0000;">'{1,2,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> category <span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">&quot;categoryPath&quot;</span><span style="color: #66cc66;">,</span> ordering <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.Swiming'</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'{1,2,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> category <span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">&quot;categoryPath&quot;</span><span style="color: #66cc66;">,</span> ordering <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.Football'</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'{1,2,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> category <span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">&quot;categoryPath&quot;</span><span style="color: #66cc66;">,</span> ordering <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.Chess'</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'{1,2,4}'</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> category <span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">&quot;categoryPath&quot;</span><span style="color: #66cc66;">,</span> ordering <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.Basketball'</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'{1,2,5}'</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> category <span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">&quot;categoryPath&quot;</span><span style="color: #66cc66;">,</span> ordering <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.Voleyball'</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'{1,2,6}'</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> category <span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">&quot;categoryPath&quot;</span><span style="color: #66cc66;">,</span> ordering <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.Checkers'</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'{1,2,7}'</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> category <span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">&quot;categoryPath&quot;</span><span style="color: #66cc66;">,</span> ordering <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.Cards'</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'{1,2,8}'</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> category <span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">&quot;categoryPath&quot;</span><span style="color: #66cc66;">,</span> ordering <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.Skis'</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'{1,2,9}'</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> category <span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">&quot;categoryPath&quot;</span><span style="color: #66cc66;">,</span> ordering <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.Post_Cards'</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'{1,2,10}'</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> category <span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">&quot;categoryPath&quot;</span><span style="color: #66cc66;">,</span> ordering <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.Book'</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'{1,2,11}'</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> category <span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">&quot;categoryPath&quot;</span><span style="color: #66cc66;">,</span> ordering <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: #ff0000;">'{1,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> category <span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">&quot;categoryPath&quot;</span><span style="color: #66cc66;">,</span> ordering <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: #ff0000;">'{1,3,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> category <span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">&quot;categoryPath&quot;</span><span style="color: #66cc66;">,</span> ordering <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: #ff0000;">'{1,3,1,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> category <span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">&quot;categoryPath&quot;</span><span style="color: #66cc66;">,</span> ordering <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: #ff0000;">'{1,3,1,1,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> category <span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">&quot;categoryPath&quot;</span><span style="color: #66cc66;">,</span> ordering <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: #ff0000;">'{1,3,1,1,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> category <span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">&quot;categoryPath&quot;</span><span style="color: #66cc66;">,</span> ordering <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: #ff0000;">'{1,3,1,1,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> category <span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">&quot;categoryPath&quot;</span><span style="color: #66cc66;">,</span> ordering <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.Planets'</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'{1,3,1,1,4}'</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> category <span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">&quot;categoryPath&quot;</span><span style="color: #66cc66;">,</span> ordering <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.Sun'</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'{1,3,1,1,5}'</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> category <span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">&quot;categoryPath&quot;</span><span style="color: #66cc66;">,</span> ordering <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.Earth'</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'{1,3,1,1,6}'</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> category <span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">&quot;categoryPath&quot;</span><span style="color: #66cc66;">,</span> ordering <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.Asteroids'</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'{1,3,1,1,7}'</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> category <span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">&quot;categoryPath&quot;</span><span style="color: #66cc66;">,</span> ordering <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.UFO'</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'{1,3,1,1,8}'</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> category <span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">&quot;categoryPath&quot;</span><span style="color: #66cc66;">,</span> ordering <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.Milk_Way'</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'{1,3,1,1,9}'</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> category <span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">&quot;categoryPath&quot;</span><span style="color: #66cc66;">,</span> ordering <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.Space_Ships'</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'{1,3,1,1,10}'</span><span style="color: #66cc66;">&#41;</span>;</pre></div></div>

<p>To powyżej to demo do tabeli, o zapomniałbym o indeksach:</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> <span style="color: #ff0000;">&quot;categoryPath_gist_idx&quot;</span> <span style="color: #993333; font-weight: bold;">ON</span> <span style="color: #ff0000;">&quot;category&quot;</span> <span style="color: #993333; font-weight: bold;">USING</span> gist<span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">&quot;categoryPath&quot;</span> <span style="color: #66cc66;">&#41;</span>;
<span style="color: #993333; font-weight: bold;">CREATE</span> <span style="color: #993333; font-weight: bold;">INDEX</span> <span style="color: #ff0000;">&quot;categoryPath_idx&quot;</span> <span style="color: #993333; font-weight: bold;">ON</span> <span style="color: #ff0000;">&quot;category&quot;</span> <span style="color: #993333; font-weight: bold;">USING</span> btree<span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">&quot;categoryPath&quot;</span> <span style="color: #66cc66;">&#41;</span>;
<span style="color: #993333; font-weight: bold;">CREATE</span> <span style="color: #993333; font-weight: bold;">INDEX</span> <span style="color: #ff0000;">&quot;ordering_gist_idx&quot;</span> <span style="color: #993333; font-weight: bold;">ON</span> <span style="color: #ff0000;">&quot;category&quot;</span> <span style="color: #993333; font-weight: bold;">USING</span> gist<span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">&quot;categoryPath&quot;</span> <span style="color: #66cc66;">&#41;</span>;
<span style="color: #993333; font-weight: bold;">CREATE</span> <span style="color: #993333; font-weight: bold;">INDEX</span> <span style="color: #ff0000;">&quot;ordering_idx&quot;</span> <span style="color: #993333; font-weight: bold;">ON</span> <span style="color: #ff0000;">&quot;category&quot;</span> <span style="color: #993333; font-weight: bold;">USING</span> btree<span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">&quot;categoryPath&quot;</span> <span style="color: #66cc66;">&#41;</span>;</pre></div></div>

<p>I sobie protestujcie sami jak to świetnie działa. W następnym i przy okazji ostatnim wpisie o ltree, przedstawię wszystkie metody do zarządzania drzewem, oraz widoki.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.cojack.pl/postgresql-ltree-cz-2/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PostgreSQL &#8211; PL/pgSQL cz.2</title>
		<link>http://www.cojack.pl/postgresql-plpgsql-cz-2</link>
		<comments>http://www.cojack.pl/postgresql-plpgsql-cz-2#comments</comments>
		<pubDate>Sat, 05 Jun 2010 14:55:33 +0000</pubDate>
		<dc:creator>cojack</dc:creator>
				<category><![CDATA[SQL]]></category>
		<category><![CDATA[PL/pgSQL]]></category>
		<category><![CDATA[postgresql]]></category>

		<guid isPermaLink="false">http://www.cojack.pl/?p=416</guid>
		<description><![CDATA[ Ostatni wpis dotyczył postgresa i zgadnijcie czego będzie dotyczył ten. Otóż dzisiaj chciałbym napisać o instrukcjach warunkowych i pętlach. Sprawa może się wydawać banalne, ale oczywiście nie musi. Dlaczego? Ponieważ instrukcje warunkowe to nic jak najzwyklejsze IF &#8230; ELSE IF &#8230; ELSE. Oprócz tego postgres udostępnia nam inne opcje ...]]></description>
			<content:encoded><![CDATA[<p><img width="100" height="100" class="alignleft" title="PostgreSQL" src="http://www.cojack.pl/wp-content/arch-postgresql.png" alt="PostgreSQL"> Ostatni wpis dotyczył postgresa i zgadnijcie czego będzie dotyczył ten. Otóż dzisiaj chciałbym napisać o instrukcjach warunkowych i pętlach. Sprawa może się wydawać banalne, ale oczywiście nie musi. Dlaczego? Ponieważ instrukcje warunkowe to nic jak najzwyklejsze IF &#8230; ELSE IF &#8230; ELSE. Oprócz tego postgres udostępnia nam inne opcje warunków które możemy wykorzystać w zapytaniach sql a mowa tutaj o CASE. A teraz dwa słowa o pętlach. Te bynajmniej ni w ząb ni w pietruchę nie są podobne do niczego. Składnia zwykłego LOOP w postgresie to powiedzmy samo LOOP &#8230; END LOOP, ha a gdzie warunki co? Otóż do tego zaraz przejdziemy.</p>
<h3>Instrukcje warunkowe</h3>
<p>Ten dział będzie poświęcony po prostu warunkom. Otóż jak wyżej wspomniałem w postgresie możemy stosować różnego rodzaju warunki, począwszy od IFów poprzez <strong>CASE </strong>skończywszy na <strong>COALESCE</strong> lub nie.<br />
 Popatrzmy na przykład użycia IFa w funkcji:</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: #66cc66;">.....</span> RETURNS VOID <span style="color: #993333; font-weight: bold;">AS</span> $BODY$
  BEGIN
    <span style="color: #993333; font-weight: bold;">SELECT</span>
      <span style="color: #66cc66;">....</span>
    <span style="color: #993333; font-weight: bold;">FROM</span>
      <span style="color: #66cc66;">...</span>
    <span style="color: #993333; font-weight: bold;">WHERE</span> <span style="color: #66cc66;">....</span>;
&nbsp;
    <span style="color: #993333; font-weight: bold;">IF</span> <span style="color: #993333; font-weight: bold;">NOT</span> FOUND THEN
      <span style="color: #808080; font-style: italic;">-- coś tu robimy jak nie znaleziono</span>
    ELSE
      <span style="color: #808080; font-style: italic;">-- w innym wypadku co innego lub kończymy RETURNem</span>
    END <span style="color: #993333; font-weight: bold;">IF</span>;
  END;
$BODY$ <span style="color: #993333; font-weight: bold;">LANGUAGE</span> <span style="color: #ff0000;">'plpgsql'</span>;</pre></div></div>

<p>Jak widać składnia IFa jest trochę podobna do tej której znamy z innych języków z tym że tutaj mamy słowo kluczowe <strong>THEN</strong>, które nie w każdym języku jest (bodajże w pascalu było ale mi się szukać nie chce). Kończywszy IFa musimy użyć składni <strong>END IF;</strong> Jak widać nie mamy tutaj żadnych klamer, dlatego ważne jest by stosować wcięcia przy kodowaniu by się samemu nie pogubić w zagłębieniach kodu. Taki kod od razu staje się czytelniejszy.</p>
<p>Jak widać dzięki takim rozwiązaniom ograniczymy się do wywołania tylko jednej funkcji z kodu php, dzięki temu i kod staje się czytelniejszy, w ten sposób można przerzucić pewną cześć logiki aplikacji na bazę danych, co w znacznym stopniu ułatwia pracę (ale i też może utrudnić, o tym później). Nie chce też znowu wałkować manuala, dlatego link do instrukcji warunkowych znajdziecie na dole, ale co jest ważne, konstrukcja musi zwrócić wartość BOOLEAN, ale to jest chyba oczywiste. W postgresie nie mamy znaku porównania tak jak w innych językach, a chodzi mi o podwójny znak równa się <strong>==</strong>, tutaj jest tylko pojedynczy znak równa się. No i teraz, kiedy rozróżnić oba te znaki? Otóż bardzo prosto, porównanie jest tylko i wyłącznie w konstrukcjach warunkowych, użycie znaku równa się w postaci:</p>

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

<p>Jest niczym innym jak przypisaniem, i tak samo jak w każdym innym języku programowania jest l-value i r-value, ale o tym już kiedyś wspominałem, także nie będę tego przytaczał ponownie. Jest także inna konstrukcja która pozwoli nam przypisywać wartość zmiennej. Może ktoś z Was kojarzy język &#8222;Prolog&#8221;? Jak nie to nie ważne, ale w nim jest użyty taki przełącznik warunkowy &#8222;:-&#8221; a w postgresie mamy &#8222;:=&#8221; jako alias do &#8222;=&#8221; z tym że jest to tylko i wyłącznie przypisanie wartości do zmiennej. Także zachęcam Was do używania takiej oto konstrukcji przypisywania:</p>

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

<p>Jest ona czytelna, i oczywista, z niczym innym się kojarzyć nie może jak z przypisaniem.</p>
<p>Wracając do konstrukcji warunkowych to pozostało nam do opisania jeszcze <strong>CASE</strong>, jest to po prostu cudowna rzecz, coś wspaniałego, gdyż używanie IFów w SELECTcie jest po prostu mało czytelne i niewygodne. Dlatego dostaliśmy <strong>CASE</strong>, taki postgresowy switch. Do rzeczy, składnia <strong>CASE</strong> jest dwojaka:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;">CASE WHEN condition THEN result
     <span style="color: #66cc66;">&#91;</span>WHEN <span style="color: #66cc66;">...</span><span style="color: #66cc66;">&#93;</span>
     <span style="color: #66cc66;">&#91;</span>ELSE result<span style="color: #66cc66;">&#93;</span>
END</pre></div></div>

<p>albo:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;">CASE expression
    WHEN value THEN result
    <span style="color: #66cc66;">&#91;</span>WHEN <span style="color: #66cc66;">...</span><span style="color: #66cc66;">&#93;</span>
    <span style="color: #66cc66;">&#91;</span>ELSE result<span style="color: #66cc66;">&#93;</span>
END</pre></div></div>

<p>W zależności od potrzeb, używamy jednej z nich, ale mała podpowiedź kiedy którą wybrać, otóż gdy mamy warunek na danej kolumnie to lepiej wybrać wariant drugi, podając tą kolumnę jako <u>expression</u>, gdy mamy parę warunków na różnych kolumnach łatwiej jest wtedy operować nimi na pierwszym przykładzie, przykłady w manualau, a ja dwa słowa o wyniku z <strong>THEN</strong>, otóż podana fraza w THEN zostanie bezwzględnie dorzucona do wyniku zapytania, czyli dzięki temu w THEN możemy podać np nazwę kolumny jaką byśmy chcieli pobrać w zależności o warunku, który zostanie spełniony. nie sprawdzałem ale pewnie też z tego poziomu można by wywołać funkcję. Warto spróbować kiedyś.</p>
<p>To by było tyle na temat CASE i IF, oprócz tego mamy jeszcze takie funkcje jak <strong>NULLIF</strong>, <strong>COALESCE</strong>, <strong>GREATEST</strong> i <strong>LEAST</strong>. Krótko o tych funkcjach:</p>
<p><strong>COALESCE</strong>: Konstrukcja COALESCE(value [, ...]). Zwraca pierwszy argument który nie jest NULLem.<br />
<strong>NULLIF</strong>: Konstrukcja NULLIF(value1, value2). Zwraca NULL gdy value1 jest równe value2.<br />
<strong>GREATEST</strong>: Konstrukcja GREATEST(value [, ...]). Zwraca największą wartość z listy argumentów.<br />
<strong>LEAST</strong>: Konstrukcja jak powyżej, tylko działa na odwrót.</p>
<h3>Pętle</h3>
<p>Do zobaczenia w przyszłym wpisie pętelki moje kochane.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.cojack.pl/postgresql-plpgsql-cz-2/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>PostgreSQL &#8211; PL/pgSQL</title>
		<link>http://www.cojack.pl/postgresql-plpgsql</link>
		<comments>http://www.cojack.pl/postgresql-plpgsql#comments</comments>
		<pubDate>Sun, 23 May 2010 09:15:53 +0000</pubDate>
		<dc:creator>cojack</dc:creator>
				<category><![CDATA[SQL]]></category>
		<category><![CDATA[PL/pgSQL]]></category>
		<category><![CDATA[postgresql]]></category>

		<guid isPermaLink="false">http://www.cojack.pl/?p=402</guid>
		<description><![CDATA[ Poniższy tutorial będzie wprowadzeniem do epizodu tutoriali o języku skryptowym (proceduralnym) PL/pgSQL. Język pl/sql został wymyślony przez Oracle, jego prostota i zarazem potężna siła daje nam wszystko czego potrzeba nam do pracy z postgresql. Język ten pozwala nam na wiele więcej działań niż sam SQL, począwszy od deklaracji zmiennych ...]]></description>
			<content:encoded><![CDATA[<p><img width="100" height="100" class="alignleft" title="PostgreSQL" src="http://www.cojack.pl/wp-content/arch-postgresql.png" alt="PosgreSQL"> Poniższy tutorial będzie wprowadzeniem do epizodu tutoriali o języku skryptowym (proceduralnym) <strong>PL/pgSQL</strong>. Język pl/sql został wymyślony przez Oracle, jego prostota i zarazem potężna siła daje nam wszystko czego potrzeba nam do pracy z postgresql. Język ten pozwala nam na wiele więcej działań niż sam SQL, począwszy od deklaracji zmiennych poprzez pętle skończywszy na triggerach (albo i nie).</p>
<h3>Wprowadzenie do PL/pgSQL</h3>
<p>Krótki i w miarę logicznie opisanym słowem wstępu jest artykuł na wiki o <strong>PL/pgSQL</strong>, link poniżej. Lecz ja chciałbym to omówić po swojemu, tak by każdy z Was to zrozumiał i przekonał się nad wielkością tego języka, zaczynajmy.<br />
Tak jak nam mówi manual składnia funkcji jest następująca:</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;">FUNCTION</span> <span style="color: #ff0000;">&quot;nazwaFunkcji&quot;</span><span style="color: #66cc66;">&#40;</span> argumenty <span style="color: #66cc66;">&#91;</span><span style="color: #66cc66;">,</span> <span style="color: #66cc66;">...</span> <span style="color: #66cc66;">&#93;</span> <span style="color: #66cc66;">&#41;</span> RETURNS <span style="color: #66cc66;">&#91;</span>typZwracanegoObiektu<span style="color: #66cc66;">&#93;</span> <span style="color: #993333; font-weight: bold;">AS</span> $BODY$
  DECLARE <span style="color: #808080; font-style: italic;">-- blok nie obowiązkowy</span>
    <span style="color: #808080; font-style: italic;">-- Możemy w tym bloku definiować zmienne, w &quot;locie&quot; zmiennych definiować nie możemy </span>
  BEGIN
    <span style="color: #808080; font-style: italic;">-- ciało funkcji</span>
&nbsp;
    <span style="color: #993333; font-weight: bold;">RETURN</span> <span style="color: #66cc66;">&#91;</span>zwracanyObiekt<span style="color: #66cc66;">&#93;</span> <span style="color: #808080; font-style: italic;">-- klauzula prawie nie obowiązkowa, o tym poniżej</span>
  END;
$BODY$ <span style="color: #993333; font-weight: bold;">LANGUAGE</span> <span style="color: #ff0000;">'plpgsql'</span>;</pre></div></div>

<p>Tak mniej więcej przedstawia się schemat konstrukcji funkcji w <strong>PL/pgSQL</strong>,  Pominąłem kwestię bloków w bloku, w sensie że w bloku BEGIN &#8230; END możemy zdefiniować kolejny blok kodu. Nigdy mi to nie było jeszcze potrzebne, i wątpię by Wam było, to jest pewnego rodzaju przerost formy nad treścią. Jak widać stosuje tutaj podwójne dolary w sensie <u>$BODY$</u>, można się zapytać dlaczego? Otóż nie musicie stosować podwójnych dolarów zamiast nich możecie zrobić po prostu AS &#8216; &#8212; i tutaj reszta kodu. Tylko nie wiem czy stać Was na nerwy stracone przy escepowaniu znaków. Otóż przy podwójnych dolarach możemy zachować taką konstrukcję:</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: #66cc66;">*</span> <span style="color: #993333; font-weight: bold;">FROM</span> users <span style="color: #993333; font-weight: bold;">WHERE</span> f_name<span style="color: #66cc66;">=</span><span style="color: #ff0000;">'foobar'</span>;</pre></div></div>

<p>Natomiast przy konstrucji z apostrofem:</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: #66cc66;">*</span> <span style="color: #993333; font-weight: bold;">FROM</span> users <span style="color: #993333; font-weight: bold;">WHERE</span> f_name<span style="color: #66cc66;">=</span><span style="color: #ff0000;">''</span>foobar<span style="color: #ff0000;">''</span>;</pre></div></div>

<p>Tam nie ma cudzysłowu przy foobar tylko podwójny apostrof. Także używajcie sobie czego chcecie, do woli. A i jeszcze jedno, to co sobie wstawicie pomiędzy podwójne dolarki nie ma znaczenia, ja wyniosłem z pracy nawyk wstawiania tam nazwy funkcji, co mi się osobiście trochę mało podoba, no ale nawyk pozostał. Przedstawiona przeze mnie powyżej konstrukcja nie jest oczywiście odzwierciedleniem tej z manuala, gdyż jest mało jasna, i rzadko się używa np CREATE OR REPLACE gdy co chwilę zmieniamy typy zmiennych przesyłanych w liście argumentów.</p>
<h3>Argumenty funkcji PL/pgSQL</h3>
<p>Lista argumentów może być podawana dwojako, a nawet trzyjako. Pierwszym z sposobów podawania argumentów do funkcji jest:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;">CREAT<span style="color: #66cc66;">....</span> <span style="color: #ff0000;">&quot;nazwaFunkcji&quot;</span> <span style="color: #66cc66;">&#40;</span> INT<span style="color: #66cc66;">,</span> NUMERIC<span style="color: #66cc66;">,</span> TEXT<span style="color: #66cc66;">,</span> VARCHAR <span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">....</span> $BODY$
  DECLARE
    <span style="color: #ff0000;">&quot;_nazwaZmiennejInt&quot;</span> ALIAS <span style="color: #993333; font-weight: bold;">FOR</span> $<span style="color: #cc66cc;">1</span>;
    <span style="color: #ff0000;">&quot;_nazwaZmiennejNumeric&quot;</span> ALIAS <span style="color: #993333; font-weight: bold;">FOR</span> $<span style="color: #cc66cc;">2</span>;
    <span style="color: #ff0000;">&quot;_nazwaZmiennejText&quot;</span> ALIAS <span style="color: #993333; font-weight: bold;">FOR</span> $<span style="color: #cc66cc;">3</span>;
    <span style="color: #ff0000;">&quot;_nazwaZmiennejVarchar&quot;</span> ALIAS <span style="color: #993333; font-weight: bold;">FOR</span> $<span style="color: #cc66cc;">4</span>;
  BEGIN
   <span style="color: #66cc66;">....</span></pre></div></div>

<p>drugi sposób:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;">CREAT<span style="color: #66cc66;">....</span> <span style="color: #ff0000;">&quot;nazwaFunkcji&quot;</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">&quot;_nazwaZmiennejInt&quot;</span> INT<span style="color: #66cc66;">,</span> <span style="color: #ff0000;">&quot;_nazwaZmiennejNumeric&quot;</span> NUMERIC<span style="color: #66cc66;">,</span>  <span style="color: #ff0000;">&quot;_nazwaZmiennejText&quot;</span> TEXT<span style="color: #66cc66;">,</span> <span style="color: #ff0000;">&quot;_nazwaZmiennejVarchar&quot;</span> VARCHAR <span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">....</span> $BODY$</pre></div></div>

<p>trzeci sposób:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;">CREAT<span style="color: #66cc66;">....</span> <span style="color: #ff0000;">&quot;nazwaFunkcji&quot;</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">&quot;_nazwaZmiennejInt&quot;</span> INT<span style="color: #66cc66;">,</span> OUT <span style="color: #ff0000;">&quot;_nazwZwracanejZmiennej&quot;</span> INT<span style="color: #66cc66;">,</span> OUT <span style="color: #ff0000;">&quot;_nazwaZwracanejZmiennej2&quot;</span> INT <span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">....</span> $BODY$</pre></div></div>

<p>Dzięki tej trzeciej metodzie możemy zwracać więcej niż jeden argument. Możemy też definiować typy zmiennych i też je zwracać o tym zraz.</p>
<h3>Zwracane typy</h3>
<p>Tak jak wyżej napisałem funkcje PostgreSQL mogą zwracać typy danych które też sami zdefiniujemy, metody mogą zwracać zarówno typ VOID, jeżeli nie potrzebujemy niczego zwrócić to po prostu ustawiamy <strong>RETURNS VOID</strong> i dzięki takiej konstrukcji klauzula <strong>RETURN</strong> w ciele kodu jest niewymagana, proste nie?<br />
PostgreSQL to nie PHP, źle mu prześlesz typ danych zdefiniowany jako INT a prześlesz jako &#8217;1&#8242; i będzie to string, w PHP to przejdzie ale w postgre nie. Więc tutaj musimy się pilnować jeżeli chodzi o przesyłanie zmiennych. To samo tyczy się wszystkich typów oraz tych zwracanych, jeżeli w końcowej wersji uzyskamy inny typ niż ten który zdefiniowaliśmy to dostaniemy błędem po oczach próbując przypisać np NUMERIC do INT i w sumie funkcja się nie wykona, nic nie zwróci a weź to debuguj :></p>
<h4> Przykłady </h4>
<p>A teraz prosty przykładzik:</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;foo&quot;</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">&quot;id&quot;</span> SERIAL<span style="color: #66cc66;">,</span> <span style="color: #ff0000;">&quot;bar&quot;</span> TEXT <span style="color: #66cc66;">&#41;</span>;
&nbsp;
<span style="color: #993333; font-weight: bold;">CREATE</span> <span style="color: #993333; font-weight: bold;">FUNCTION</span> <span style="color: #ff0000;">&quot;fooBar&quot;</span><span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">&quot;_bar&quot;</span> TEXT <span style="color: #66cc66;">&#41;</span> RETURNS VOID <span style="color: #993333; font-weight: bold;">AS</span> $$
  BEGIN
    <span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span>
      <span style="color: #ff0000;">&quot;foo&quot;</span>
    <span style="color: #66cc66;">&#40;</span>
      <span style="color: #ff0000;">&quot;bar&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;">&quot;_bar&quot;</span>
    <span style="color: #66cc66;">&#41;</span>;
  END;
$$ <span style="color: #993333; font-weight: bold;">LANGUAGE</span> <span style="color: #ff0000;">'plpgsql'</span>;</pre></div></div>

<p>I teraz przykład użycia:</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;fooBar&quot;</span><span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">'Terefere'</span> <span style="color: #66cc66;">&#41;</span>;</pre></div></div>

<p>Wykonanie takiego zapytania odpali nam naszą funkcję i wykonana kod w ciele metody.</p>
<h4>Parę słów na zakończenie</h4>
<p>To był pierwszy wpis z cyklu poświęconego językowi <strong>PL/pgSQL</strong>, temat jest szeroki jak rzeka i głęboki jak morze. Nie da się wszystkie na raz opisać, nie da się wszystkiego przedstawić i omówić szczegółowo. Następne wpisy będą dotyczyły instrukcji warunkowych oraz pętli. Wszystko możecie oczywiście znaleźć pod linkiem w stopce. Zapomniałbym wszystko co tutaj jest opisywane jest testowane pod najnowszą ver. oznaczoną numerkiem 8.4. Gdy wyjdzie nowsza i w repo będzie siedzieć to poinformuje o zmianie.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.cojack.pl/postgresql-plpgsql/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>KDevelop jako IDE dla PHP</title>
		<link>http://www.cojack.pl/kdevelop-jako-ide-dla-php</link>
		<comments>http://www.cojack.pl/kdevelop-jako-ide-dla-php#comments</comments>
		<pubDate>Sat, 15 May 2010 11:12:47 +0000</pubDate>
		<dc:creator>cojack</dc:creator>
				<category><![CDATA[GNU/Linux]]></category>
		<category><![CDATA[ide dla php]]></category>
		<category><![CDATA[kdevelop]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.cojack.pl/?p=394</guid>
		<description><![CDATA[ Kto z Was nigdy nie łamał sobie głowy jakie jest najlepsze środowisko edytorskie dla naszego &#8222;ukochanego&#8221; języka skryptowego pod linuksem? Założę się że każdy z Was, a ja chciałbym Wam zaproponować KDevelop. Nie tak dawno temu zespół KDevelop ogłosił publicznie finalną ver. oznaczoną numerkiem 4.0, w całości zostało przeportowane ...]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft" title="KDevelop" src="http://cojack.os-cms.pl/wp-content/kdevelop.png" alt="" height="100" width="100"> Kto z Was nigdy nie łamał sobie głowy jakie jest najlepsze środowisko edytorskie dla naszego &#8222;ukochanego&#8221; języka skryptowego pod linuksem? Założę się że każdy z Was, a ja chciałbym Wam zaproponować KDevelop. Nie tak dawno temu zespół KDevelop ogłosił publicznie finalną ver. oznaczoną numerkiem 4.0, w całości zostało przeportowane na qt 4. Nie dość że ślicznie wygląda to jeszcze komuś się chciało napisać plugin dla PHP! To już całkiem niezły wyczes z wypasem.</p>
<h3>Co nam oferuje KDevelop</h3>
<p><div style="width: 165px;" class="wp-caption alignright">
<a href="http://www.cojack.pl/wp-content/kdevelop-ide.png" class="fancybox" rel="fancybox" title="KDevelop i PHP"><img height="100" width="155" alt="KDevelop IDE" src="http://www.cojack.pl/wp-content/kdevelop-ide.png" title="KDevelop i PHP"></a></p>
<p class="wp-caption-text"> KDevelop i PHP </p>
</div>
<ul>
<li>Tworzenie projektów</li>
<li>Obsługa SVN z poziomu programu</li>
<li>Kolorowanie składni</li>
<li>Integracja z manualem PHP</li>
<li>Autosugestia metod w klasach</li>
<li>Autosugestia nazw zmiennych ( :p )</li>
<li>i wiele wiele wiele&#8230; more</li>
</ul>
<p>Otóż po rozmowie z twórcą pluginu i zgłoszeniu paru błędów wiem czego na razie nie ma, nie działają podpowiedzi w statycznym wywoływaniu metod np:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">SomeClassName<span style="color: #339933;">::</span></pre></div></div>

<p>Nie dostaniemy listeningu metod statycznych. Mi przynajmniej nie działa, on mówi że mu działa, eee nie wiem co jest grane ;]</p>
<p>KDevelop posiada kolorowanie składni również dla wielu wielu innych języków skryptowych. Wspaniałością jest to iż posiada kolorowanie składni dla skryptów SQL, tudzież PostgreSQL. Gdzie dla mnie to jest po prostu cudowna sprawa, ale był błąd w kolorowaniu składni procedur w języku pl/pgsql (będzie mini kurs wprowadzający w programowaniu pl/sql). By naprawić kolorowanie w tymże języku należy pobrać:<br />
<a href="http://gitorious.org/kate/kate/blobs/raw/master/part/syntax/data/sql-postgresql.xml" title="Kolorowanie składni w SQL (PostgreSQL)" alt="Kolorowanie składni w SQL (PostgreSQL)">sql-postgresql.xml</a> plik i wrzucić go do:</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>kde4<span style="color: #000000; font-weight: bold;">/</span>apps<span style="color: #000000; font-weight: bold;">/</span>katepart<span style="color: #000000; font-weight: bold;">/</span>syntax<span style="color: #000000; font-weight: bold;">/</span></pre></div></div>

<p>tam już takowy plik będzie, zróbmy sobie pierw jego kopie, a następnie wrzućmy nowy. Po tej całej operacji restart KDevelop i będzie nam piknie działać. Napisałem że ma błąd w kolorowaniu składni ale nie napisałem jaki, otóż sprawa ma się tak, przyjrzyjmy się funkcji:</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;">FUNCTION</span> <span style="color: #ff0000;">&quot;getMenuPath&quot;</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">&quot;_idMenu&quot;</span> INT <span style="color: #66cc66;">&#41;</span> RETURNS LTREE <span style="color: #993333; font-weight: bold;">AS</span> $BODY$
	<span style="color: #993333; font-weight: bold;">SELECT</span>
	   <span style="color: #ff0000;">&quot;menuPath&quot;</span>
	<span style="color: #993333; font-weight: bold;">FROM</span>
	   <span style="color: #ff0000;">&quot;menu&quot;</span>
	<span style="color: #993333; font-weight: bold;">WHERE</span>
	   <span style="color: #ff0000;">&quot;idMenu&quot;</span> <span style="color: #66cc66;">=</span> $<span style="color: #cc66cc;">1</span>;
$BODY$ <span style="color: #993333; font-weight: bold;">LANGUAGE</span> <span style="color: #ff0000;">'SQL'</span> <span style="color: #993333; font-weight: bold;">WITH</span> <span style="color: #66cc66;">&#40;</span>ISCACHABLE<span style="color: #66cc66;">&#41;</span>;</pre></div></div>

<p>Jak widzimy po strukturze $BODY$ mamy ciało SQL, natomiast KDevelop interpretował to jako string, i tutaj był problem z kolorowaniem składni.
</p>
<h3>Błędy w KDevelop</h3>
<p>
Jest parę błędów w KDevelop które często powodują że nurtują mnie pytania czy dobrze zrobiłem że się na KDevelop przesiadłem, otóż mimo iż jest to oficjalne wydanie środowisko jest dosyć nie stabilne. Potrafi się często wyłożyć w najmniej oczekiwanych momentach, dlatego np odradzam korzystanie z SVN w KDevelop a wykorzystać do tego zewnętrzny program np: kdesvn, lub po prostu jechać z konsoli.<br />
Czasami potrafi się też wysypać przy zamykaniu zakładek otwartych dokumentów. Innym ficzerem jest też taka opcja że gdy się najedzie na funkcję w php to pokazuje się tooltip ballon z informacją o funckji z linkiem w środku: <strong>Show uses</strong>, po kliknięciu na niego najprawdopodobniej powinny się pojawić jakieś przykłady jak to użyć, ale pojawia się nowe okno z paskiem postępu i cały KDevelop zdechł.
</p>
<h3>Praca z KDevelop</h3>
<p>
Wszystko co nam potrzebne do pracy z KDevelop to kawałek internetu, 3kilo root&#8217;a i z 2 głośniki. Polecam też zainstalowanie paczek z debug symbols.</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">apt-get</span> <span style="color: #c20cb9; font-weight: bold;">install</span> kdevelop kdevelop-php <span style="color: #7a0874; font-weight: bold;">&#91;</span> kdevelop-php-docs <span style="color: #660033;">--</span> integracja z manualem php.net<span style="color: #7a0874; font-weight: bold;">&#93;</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span> kdevplatform-dbg <span style="color: #660033;">--</span> opcjonalne <span style="color: #7a0874; font-weight: bold;">&#93;</span></pre></div></div>

<p>I możemy zacząć naszą pracę z KDevelop, utworzyć sobie projekt, później do projektu pobrać dane po svn, lub też i nie jeżeli takiego projektu nigdzie nie przechowujemy na zewnątrz.
</p>
<p>To by było na tyle, te informacje miały Was zachęcić do przejścia na platformę KDE oraz używania IDE KDevelop.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.cojack.pl/kdevelop-jako-ide-dla-php/feed</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Konfiguracja vhost w Apache</title>
		<link>http://www.cojack.pl/konfiguracja-vhost-w-apache</link>
		<comments>http://www.cojack.pl/konfiguracja-vhost-w-apache#comments</comments>
		<pubDate>Fri, 14 May 2010 23:51:17 +0000</pubDate>
		<dc:creator>cojack</dc:creator>
				<category><![CDATA[GNU/Linux]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[vhost]]></category>

		<guid isPermaLink="false">http://www.cojack.pl/?p=384</guid>
		<description><![CDATA[ Ostatnimi czasy nie mam czasu by tu nawet zajrzeć, kobieta -> praca -> kobieta -> praca i tak w kółko macieju. Siedząc na ircu dużo osób wciąż się pyta jak skonfigurować apache i ustawić vhosty. Jedni polecają userdir mod, mi ten mod w ogóle nie podchodzi. Ja tam sobie ...]]></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"> Ostatnimi czasy nie mam czasu by tu nawet zajrzeć, kobieta -> praca -> kobieta -> praca i tak w kółko macieju. Siedząc na ircu dużo osób wciąż się pyta jak skonfigurować apache i ustawić vhosty. Jedni polecają userdir mod, mi ten mod w ogóle nie podchodzi. Ja tam sobie będę trzymał dane tam gdzie mi pasuje, i wszystko inne też. Także w poniższym &#8222;artykule&#8221; pokażę Wam jak w nowym Apache2 wersja. 2.2.14 (teraz taka aktualna jest w ubuntu 10.04). Zakładam że macie już zainstalowanego apache, php, jedno z drugim ślicznie działa i jesteśmy prawie zadowoleni.</p>
<h3>Konfiguracja /etc/hosts</h3>
<p>
Pierwej przed przystąpieniem do pracy i konfiguracji vhostów sprawdźmy sobie ustawienia naszego /etc/hosts, zakładamy że chcemy pracować tylko lokalnie i mieć vhosty dla swojej wygody pracując na lokalnej maszynie. Także edytujmy plik posiadając uprawnienia użytkownika <strong>root</strong>:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">su</span></pre></div></div>

<p>następnie po wpisaniu hasła edytujemy plik:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #c20cb9; font-weight: bold;">nano</span> <span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>hosts</pre></div></div>

<p>I interesują nas pierwsze dwie linijki:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">127.0.0.1       localhost.localdomain
127.0.1.1       nazwa-kompa</pre></div></div>

<p>Tak powinień się nam przedstawiać nasz /etc/hosts, gdzie nazwa-kompa jest nazwą która wyświetli Wam się po wykonaniu polecenia:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #007800;">$HOSTNAME</span></pre></div></div>

<p> jeżeli tak mniej więcej wygląda Wasz plik <strong>hosts</strong> to ja proponuje takie rozwiązanie:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">127.0.0.1       localhost.localdomain   nazwa-kompa
#127.0.1.1      nazwa-kompa</pre></div></div>

<p>Jak widać 127.0.1.1 jest zaremowane więc nie jest brane pod uwagę. Czasami jest lepiej coś zaremować niż usuwać.</p>
<p>Na tym zakończymy na razie edycję pliku <strong>/etc/hosts</strong>
</p>
<h3>Konfiguracja vhosta</h3>
<p>
Przechodząc do edycji vhosta na samym początku chciałbym poinformować o pewnych zmianach wprowadzanych w ubuntu systematycznie, otóż mamy taki ciekawy program który się nazywa <strong>service</strong> i nie musimy latać do /etc/init.d/ by robić coś z aktualnie odpalonym deamonem. Czyli np taka komenda:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ service apache2 restart</pre></div></div>

<p>da nam to samo co:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>init.d<span style="color: #000000; font-weight: bold;">/</span>apache2 restart</pre></div></div>

<p>Używać do woli, co komu się podoba.</p>
<p><u>Gdzie są trzymane konfiguracje vhostów?</u> Konfiguracje vhostów trzymane są w <strong>/etc/apache2/sites-available</strong> w postaci zwykłego pliku textowego bez żadnego rozszerzenia.<br />
Budowę mają dość prostą, a co do budowy to przedstawię Wam przykład:</p>

<div class="wp_syntax"><div class="code"><pre class="apache" style="font-family:monospace;">&lt;<span style="color: #000000; font-weight:bold;">VirtualHost</span> *:<span style="color: #ff0000;">80</span>&gt;
        <span style="color: #00007f;">ServerAdmin</span> webmaster@localhost
&nbsp;
        <span style="color: #00007f;">ServerName</span>      bdt.local
        <span style="color: #00007f;">ServerAlias</span>     www.bdt.local
&nbsp;
        <span style="color: #00007f;">DocumentRoot</span> <span style="color: #7f007f;">&quot;/home/cojack/Dokumenty/Projekty/BDT/web&quot;</span>
&nbsp;
        &lt;<span style="color: #000000; font-weight:bold;">Directory</span> <span style="color: #7f007f;">&quot;/home/cojack/Dokumenty/Projekty/BPDT/web&quot;</span>&gt;
                <span style="color: #00007f;">Options</span> <span style="color: #0000ff;">Indexes</span> <span style="color: #0000ff;">FollowSymLinks</span> MultiViews
                <span style="color: #00007f;">AllowOverride</span> <span style="color: #00007f;">All</span>
                <span style="color: #00007f;">Order</span> <span style="color: #00007f;">Allow</span>,<span style="color: #00007f;">Deny</span>
                <span style="color: #00007f;">Allow</span> <span style="color: #00007f;">from</span> <span style="color: #00007f;">All</span>
        &lt;/<span style="color: #000000; font-weight:bold;">Directory</span>&gt;
&nbsp;
        <span style="color: #00007f;">ErrorLog</span> <span style="color: #7f007f;">&quot;/home/cojack/Dokumenty/Projekty/BDT/tmp/logs/error.log&quot;</span>
&nbsp;
        <span style="color: #adadad; font-style: italic;"># Possible values include: debug, info, notice, warn, error, crit,</span>
        <span style="color: #adadad; font-style: italic;"># alert, emerg.</span>
        <span style="color: #00007f;">LogLevel</span> warn
&nbsp;
        <span style="color: #00007f;">CustomLog</span> <span style="color: #7f007f;">&quot;/home/cojack/Dokumenty/Projekty/BDT/tmp/logs/access.log&quot;</span> combined
&nbsp;
        <span style="color: #00007f;">RewriteLog</span> <span style="color: #7f007f;">&quot;/home/cojack/Dokumenty/Projekty/BDT/tmp/logs/rewrite.log&quot;</span>
        <span style="color: #00007f;">RewriteLogLevel</span> <span style="color: #ff0000;">3</span>
&lt;/<span style="color: #000000; font-weight:bold;">VirtualHost</span>&gt;</pre></div></div>

<p>Dyrektyw mi się opisywać nie chce, możecie o nich poczytać na stronie apache, ale jak widać wskazuje też miejsce logów (access, error, rewrite) dla danego vhosta, te katalogi muszą już istnieć przed przeładowaniem ustawień apache i dobrze by było gdyby były pod kontrolą usera i grupy www-data.</p>
<p>W &#8222;/home/cojack/Dokumenty/Projekty/BDT/web&#8221; posiadam plik index.php oraz , i od tego miejsca się wszystko zaczyna. Wystarczy teraz utworzyć plik np: <strong>bdt</strong> w katalogu <strong>/etc/apache/sites-available</strong> i wkleić do niego zawartość tego listingu powyżej. Oczywiście u Was on nie zadziała o ile nie macie poprawnych ścieżek tak jak powyżej. Także utwórzcie sobie własne ścieżki, nazwijcie jakoś projekt, i analogicznie do mojego vhosta utwórzcie swojego.</p>
<p>Po wykonaniu takiej operacji pozostały nam już tylko dwie rzeczy do wykonania. Pierwsza z nich to:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ a2ensite bdt</pre></div></div>

<p>u Was oczywiście analogicznie (względem powyższych wskazówek) będzie to coś innego niż bdt.
</p>
<h3>Konfiguracja pliku hosts raz jeszcze</h3>
<p>Po wykonaniu wszystkich powyższych czynności by w adresie przeglądarki zadziałał nam nasz adres musimy jeszcze dodać wpis o tym:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">127.0.0.1       bdt.local       www.bdt.local</pre></div></div>

<p>Dodajemy ten wpis po naszej wstępnej konfiguracji zapisujemy i wpisujemy w pasku adresu przeglądarki adres: www.bdt.local i włala!</p>
<h3>Możliwe problemy</h3>
<p>
 * 403 Forbidden &#8211; szczerze? To nie pamiętam jak go rozwiązałem ;p<br />
 * Kiedy okaże się że mamy jakiś błąd w konfiguracji vhosta to nie pamiętam już czy apache skuma się po zmianie wpisu i akcji reload, ja zawsze dla pewności wykonywałem takie czynności:<br />
   a2dissite bdt<br />
   a2ensite bdt<br />
   service apache2 reload<br />
* poleciłbym przed dodawaniem vhostów wyłączyć apache i zrobić tail -f /var/log/apache2/error.log i nasłuchiwać co go boli przy starcie jeżeli coś go boli.<br />
* bliżej lub dalej nie określone problemy<br />
* literówki w artykule.
</p>
<p>
Aha tą czynność mamy się rozumieć wykonujemy dla każdego z vhosta.</p>
<p>To by było na tyle. W następnym arcie będzie o konfiguracji vhost z ssl.  Cza spać 1.45 na zegarku ;/</p>
]]></content:encoded>
			<wfw:commentRss>http://www.cojack.pl/konfiguracja-vhost-w-apache/feed</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Spojrzenie w studnie</title>
		<link>http://www.cojack.pl/spojrzenie-w-studnie</link>
		<comments>http://www.cojack.pl/spojrzenie-w-studnie#comments</comments>
		<pubDate>Fri, 26 Mar 2010 09:58:15 +0000</pubDate>
		<dc:creator>cojack</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[skrypty php]]></category>

		<guid isPermaLink="false">http://www.cojack.pl/?p=371</guid>
		<description><![CDATA[ Dzisiaj w pracy kolega się mnie spytał czy jest taka możliwość by z klasy rodzica wywołać metodę w klasie dziecka, której nie ma w klasie rodzica. Urodził mi się uśmiech na twarzy i odparłem nie ma takiej możliwości, z logicznego pkt widzenia to jest awykonalne by w klasie bazowej ...]]></description>
			<content:encoded><![CDATA[<p><img width="100" height="100" alt="" src="http://www.cojack.pl/wp-content/arch-php.png" title="PHP" class="alignleft"> Dzisiaj w pracy kolega się mnie spytał czy jest taka możliwość by z klasy rodzica wywołać metodę w klasie dziecka, której nie ma w klasie rodzica. Urodził mi się uśmiech na twarzy i odparłem nie ma takiej możliwości, z logicznego pkt widzenia to jest awykonalne by w klasie bazowej móc wywołać metody z klasy, która dziedziczy nie definiując ich w tejże klasie bazowej. No ale spójrzmy co nam nasze php oferuje.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">class</span> A <span style="color: #009900;">&#123;</span> 
  <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> 
    <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">fuck</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>  
&nbsp;
<span style="color: #000000; font-weight: bold;">class</span> B <span style="color: #000000; font-weight: bold;">extends</span> A <span style="color: #009900;">&#123;</span> 
  <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> fuck<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;yo<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span> 
<span style="color: #009900;">&#125;</span> 
&nbsp;
<span style="color: #000088;">$objB</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> B<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>A teraz zgadnijcie jaki będzie wynik, otóż zaskoczę Was, wynik to <strong>yo</strong>. A teraz wytłumaczenie dlaczego tak to działa:</p>
<p>&#8222;Obiekt jeszcze przed wywołaniem konstruktora klasy A już posiada wszystkie metody klasy B&#8221;</p>
<p>Innymi słowy metody są przypisane do obiektu a nie do klasy.</p>
<p>A żeby jeszcze było śmieszniej to kolejność wykonywania funkcji, popatrzcie sami:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">class</span> A <span style="color: #009900;">&#123;</span> 
  <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> 
    <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">fuck</span><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> fuck<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;wow<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>  
&nbsp;
<span style="color: #000000; font-weight: bold;">class</span> B <span style="color: #000000; font-weight: bold;">extends</span> A <span style="color: #009900;">&#123;</span> 
  <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> fuck<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;yo<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span>
    parent<span style="color: #339933;">::</span><span style="color: #004000;">fuck</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> 
&nbsp;
<span style="color: #000088;">$objB</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> B<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>W kolejności wywoła się : <strong>yo</strong> a następnie <strong>wow</strong>. Dla mnie to powinna być pętla wow -> yo -> wow, a oczywiście jest inaczej.</p>
<p>Boże zlituj się nad developerami php i nie zważaj na grzechy ich.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.cojack.pl/spojrzenie-w-studnie/feed</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>PostgreSQL &#8211; View czyli Widok</title>
		<link>http://www.cojack.pl/postgresql-view-czyli-widok</link>
		<comments>http://www.cojack.pl/postgresql-view-czyli-widok#comments</comments>
		<pubDate>Sun, 21 Mar 2010 17:20:30 +0000</pubDate>
		<dc:creator>cojack</dc:creator>
				<category><![CDATA[SQL]]></category>
		<category><![CDATA[postgresql]]></category>
		<category><![CDATA[view]]></category>
		<category><![CDATA[widok]]></category>

		<guid isPermaLink="false">http://www.cojack.pl/?p=357</guid>
		<description><![CDATA[Ostatnimi czasy coś nie mam weny by napisać cokolwiek na blogu, także postanowiłem tym razem coś może o postgresql napisać i jego własnościach tudzież mowa o widokach w postgresql. Rzecz biorąc czym jest widok? Widok jest niczym innym jak zapytaniem kryjącym się pod krótką nazwą, jak pisałem w wcześniejszej notce ...]]></description>
			<content:encoded><![CDATA[<p><img width="100" height="100" alt="" src="http://www.cojack.pl/wp-content/arch-postgresql.png" title="PostgreSQL" class="alignleft">Ostatnimi czasy coś nie mam weny by napisać cokolwiek na blogu, także postanowiłem tym razem coś może o postgresql napisać i jego własnościach tudzież mowa o widokach w postgresql. Rzecz biorąc czym jest widok? Widok jest niczym innym jak zapytaniem kryjącym się pod krótką nazwą, jak pisałem w wcześniejszej notce o RBAC cz.3 z pewnego zapytania można było utworzyć sobie widok. Może więcej szczegółów technicznych, składnia widoku ma się tak:</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: #66cc66;">&#91;</span> <span style="color: #993333; font-weight: bold;">OR</span> <span style="color: #993333; font-weight: bold;">REPLACE</span> <span style="color: #66cc66;">&#93;</span> <span style="color: #66cc66;">&#91;</span> TEMP <span style="color: #66cc66;">|</span> <span style="color: #993333; font-weight: bold;">TEMPORARY</span> <span style="color: #66cc66;">&#93;</span> <span style="color: #993333; font-weight: bold;">VIEW</span> name <span style="color: #66cc66;">&#91;</span> <span style="color: #66cc66;">&#40;</span> column_name <span style="color: #66cc66;">&#91;</span><span style="color: #66cc66;">,</span> <span style="color: #66cc66;">...</span><span style="color: #66cc66;">&#93;</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#93;</span>
    <span style="color: #993333; font-weight: bold;">AS</span> query</pre></div></div>

<p>Sama składnia może się wydawać prosta choć nie musi ;] składnia podana w nawiasach kwadratowych jest opcjonalna. Prze zemnie rzadko wykorzystywana, bo nie tworzę jakiś tymczasowych widoków, nie zapisuję widoku do innego schematu niż ten w którym się znajduję ani też nie używam OR REPLACE gdyż jak instaluje na nowo to drop db i amba. </p>
<p>Teraz może co do samej składni</p>
<p><strong>OR REPLACE</strong> &#8211; co dziwnego o tym piszą w manualu, to się można dowiedzieć na stronie podanej poniżej. Ale przytoczę fragment.</p>
<blockquote><p>CREATE OR REPLACE VIEW is similar, but if a view of the same name already exists, it is replaced. The new query must generate the same columns that were generated by the existing view query (that is, the same column names in the same order and with the same data types), but it may add additional columns to the end of the list. The calculations giving rise to the output columns may be completely different. </p></blockquote>
<p>I teraz pytanie, po czorta w takim razie OR REPLACE jeżeli zmienimy sobie całkowicie widok a pozostawimy tą samą nazwę, trochę dziwna akcja, chociaż może nas to też z jednej strony zabezpieczać przed nałogowym wstawianiu OR REPLACE i nie daj Bóg strzelimy gdzieś dwa takie same nazwy widoków, hmmm w sumie może i dobrze.</p>
<p>Przykład jakiegoś widoku? Proszę bardzo, z naszego RBAC&#8217;a z zapytania sprawdzającego uprawnienia, zróbmy sobie teraz widok:</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;">VIEW</span> <span style="color: #ff0000;">&quot;checkRightView&quot;</span> <span style="color: #993333; font-weight: bold;">AS</span>
<span style="color: #993333; font-weight: bold;">SELECT</span> 
  <span style="color: #ff0000;">&quot;allow&quot;</span><span style="color: #66cc66;">,</span>
  <span style="color: #ff0000;">&quot;u2g&quot;</span><span style="color: #66cc66;">.</span><span style="color: #ff0000;">&quot;idUser&quot;</span><span style="color: #66cc66;">,</span>
  <span style="color: #ff0000;">&quot;m&quot;</span><span style="color: #66cc66;">.</span><span style="color: #ff0000;">&quot;moduleName&quot;</span><span style="color: #66cc66;">,</span>
  <span style="color: #ff0000;">&quot;a&quot;</span><span style="color: #66cc66;">.</span><span style="color: #ff0000;">&quot;actionName&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>;</pre></div></div>

<p>Dodaliśmy tylko nagłówek create view i ucięliśmy klauzule where, a teraz przykład jak takiego widoku użyć:</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;cRV&quot;</span><span style="color: #66cc66;">.</span><span style="color: #ff0000;">&quot;allow&quot;</span>
<span style="color: #993333; font-weight: bold;">FROM</span> 
  <span style="color: #ff0000;">&quot;checkRightView&quot;</span> <span style="color: #993333; font-weight: bold;">AS</span> <span style="color: #ff0000;">&quot;cRV&quot;</span>  <span style="color: #808080; font-style: italic;">-- prawie jak honda ^^</span>
<span style="color: #993333; font-weight: bold;">WHERE</span> 
  <span style="color: #ff0000;">&quot;cRV&quot;</span><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> 
  <span style="color: #ff0000;">&quot;cRV&quot;</span><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> 
  <span style="color: #ff0000;">&quot;cRV&quot;</span><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>Tadam, proste prawda? Tworzenie widoków można by porównać do polimorfizmu, lecz nim nie jest. Co nam to daje? Na pewno przejrzyste zapytania sql, co do debugowania to w sql zawsze był z tym problem, dlatego przed utworzeniem widoku pierw lepiej sprawdzić czy zapytanie śmiga.</p>
<p>Co do ograniczeń widoku, wiążą się z tym pewne niedogodności, gdyż jak widać by mieć dostęp do tabel łączonych w zapytaniu, trzeba pobrać ich elementy w samym zapytaniu (w widoku) by mieć do nich dostęp przy wywoływaniu widoku. Cóż jak to uważam za pewne ograniczenia, czy nim jest teoretycznie? Nie mam takiej wiedzy by to stwierdzić.</p>
<p>Mam nadzieję że ta krótka notka pomoże nie którym zgłębić swoją wiedzę.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.cojack.pl/postgresql-view-czyli-widok/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
	</channel>
</rss>
