Niedawno pojawił się artykuł na temat Pythona, dlatego teraz dla odmiany coś na temat Pike’a (Perla zostawiam dla innych). W jednym z poprzednich moich artykułów przedstawiałem, krótko sposób dostępu w RXML do bazy SQL. Teraz chciałbym (równie krótko) przedstawić jak to wygląda od środka (czyli jak to zapisać w Pike’u).

Uaktualnienie!
Pokazała się nowa, stabilna wersja języka Pike (7.2.197). Tutaj można znaleźć więcej infomacji na ten temat. Do sciągnięcia są również źródła oraz binaria dla systemu MS Windows.

Nie ukrywam, że program jest dość trywialny. Nie ma on jednak na celu przedstawienia całości zagadnienia, tylko na przedstawienie kilku kontrukcji języka Pike tj. klas, metod wyłapywania błędów czy też ogólnej budowy skryptu (programiści znający język C++ zauważą pewne podobieństwa)

Skrypt, który nazwałem sqlquery.pike spełnia trzy zadania:

  1. Łączy się z bazą danych
  2. Wysyła do niej zapytanie
  3. Wyświetla wyniki zapytania na ekranie

Do połączenia z bazą danych wykorzystamy klasę Sql. Jest to ogólny interfejs do baz danych SQL (w chwili obecnej obsługuje bazy mysql, postgres, sybase, oracle i odbc). To, jaką bazę chcemy użyć, określamy w URL-u przekazywanym do konstruktora klasy (np. tak wygląda URL łączący z bazą tekstów Andrzeja Waligórskiego: postgres://zuzanka@localhost/aw) gdzie:

  • postgres – typ bazy danych
  • localhost – lokalizacja (serwer) bazy danych
  • aw – nazwa bazy
  • zuzanka – użytkownik, łączący się z bazą

URL ten wysyłamy zazwyczaj jako parametr kontruktora klasy. W naszym przypadku, będzie to pierwszy parametr uruchamianego programu. Parametr ten zostanie przekazany do konstruktora klasy Query. Jej początek wygląda następująco:

  class Query  {    inherit Sql.sql; // dziedziczymy po klasie SQL  

a jej konstruktor:

  void create(string url, string _query)  {   ::create(url); // wywołujemy kontruktor rodzica   myquery = _query;  }  

Klasa Query zawiera (nie licząc konstruktora) jedną metodę query, która zajmie się przetworzeniem zapytania i wysłaniem wyników ma ekran. Zawiera też metody odziedziczone (tj. jak big_query() i error()) wykorzystane w metodzie query:

  int query()  {   object result;  // wynik zapytania (jako obiekt)   array indices;  // wynik zapytania (jako krotki)     // wyślij zapytanie do bazy i przechwyć błędy   mixed error = catch {       result = ::big_query(myquery);   };   // jeśli wystąpi błąd, zaraportuj i wyjdź   if (error) {       werror("Wystąpił błąd: "+error[0]+"n");       werror(::error());       exit(1);   }   // wypisz wyniki na ekranie   while (indices = result->fetch_row()) {        foreach (indices, object ii) {          write(ii + "t");       }       write("n");   }  }  

Pozostała nam jeszcze do omówienia funkcja main(). Tu nie ma wiele niespodzianek:

  int main(int argc, array(string) argv)  {     if (argc != 3) {        werror("Użycie: sqlquery.pike url queryn");        werror("   url: typ://uzytkownik:haslo@serwer/bazan");        werror("        typ = (postgres, mysql, odbc, sybase, oracle)n");        werror(" query: zapytanie SQLn");        exit(1);     } else {        object query=Query(argv[1], argv[2]);        query->query();     }            return 0;  }  

Całość uruchamiamy podając jako pierwszy parametr URL do bazy. Drugim parametrem jest zapytanie SQL

  ./sqlquery.pike "postgres://zuzanka@localhost/aw" "select * from aw;"  

I jeszcze na koniec stamdardowa garść linków:

Archiwalny news dodany przez użytkownika: eloy.
Kliknij tutaj by zobaczyć archiwalne komentarze.

Share →