Programowanie w systemie Linux
Transkrypt
Programowanie w systemie Linux
Programowanie w systemie Linux Jacek Lach Zakład Oprogramowania Instytut Informatyki Politechnika Śląska Jacek Lach. Programowanie w systemie Linux Plan • MySQL • Charakterystyka ogólna • Tworzenie aplikacji • PostgreSQL • Charakterystyka • Tworzenie aplikacji Charakterystyka ogólna Jacek Lach. Programowanie w systemie Linux • Obsługa podzbioru standardu ANSI SQL • Obsługa transakcji (możliwość wyboru) • Liczne rozszerzenia • Tablice > 4GB, BLOBy • Ograniczenia w większości wynikają z systemu operacyjnego • Rozszerzalność poprzez funkcje użytkownika • Replikacja Charakterystyka ogólna Jacek Lach. Programowanie w systemie Linux • Duży zbiór obsługiwanych typów danych • Wbudowany serwer • Możliwość zmiany parametrów serwera “w locie” • Wieloplatformowość: • Linux, • *BSD, • Solaris, • HPUX, Charakterystyka ogólna Jacek Lach. Programowanie w systemie Linux • Wsparcie dla wielu języków: C, C++, Java, PHP, Perl, Python... • Dobra dokumentacja online • Przygotowane procedury • Podzapytania • Widoki (5.0.1+) • Tablice tymczasowe • Możliwość wyboru silnika zapisu (możliwość MyISAM Jacek Lach. Programowanie w systemie Linux • Dane i indeksy w osobnych plikach • Brak transakcji • Kompresowane indeksy • Szybki zapis / odczyt • Szybkie działanie w przypadku równoległych operacji dopisywania (logowanie) • Oprogramowanie do naprawy plików InnoDB Jacek Lach. Programowanie w systemie Linux • Obsługa transakcji • Lepsza wydajność niż MyISAM dla współbieżnych operacji odczytu / zapisu tabeli • Przestrzeń tabel • Standardowo dostępne w dystrybucji • Przetestowany pod dużym obciążeniem Hash/InMemory Jacek Lach. Programowanie w systemie Linux • Tablice przechowywane w pamięci • Indeksowanie z wykorzystaniem szybkich funkcji mieszających • Zastosowanie: • tablice tymczasowe • słowniki Replikacja Jacek Lach. Programowanie w systemie Linux • Serwer Master utrzymuje dziennik poleceń SQL i aktualizuje dane • Serwery Slave aktualizują swoje dane na podstawie dziennika • Wykorzystanie: • podnoszenie odporności na awarie • rozpraszanie obciążenia Jacek Lach. Programowanie w systemie Linux Typy danych • Wartości liczbowe TINYINT, SMALLINT, MEDIUMINT, INT, BIGINT, FLOAT, DOUBLE, DECIMAL • Typy łańcuchowe CHAR, VARCHAR, TINYBLOB, TINYTEXT, MEDIUMBLOB, LONGBLOB, ENUM, SET • Data i czas DATE, TIME, DATETIME, TIMESTAMP, YEAR Praca z MySQL • Zadania administracyjne: Jacek Lach. Programowanie w systemie Linux • SQL (mysql) • oprogramowanie towarzszące (mysqladmin, mysqldump) • Typowe zadania administracyjne: • operacje na bazie danych • tworzenie struktury bazy danych • tworzenie użytkowników i uprawnień Jacek Lach. Programowanie w systemie Linux Praca z MySQL • Typowe zadania klienckie: • Połączenie z bazą danych • Wykonywanie zapytań SQL • Obsługa błędów Połączenie z serwerem Jacek Lach. Programowanie w systemie Linux • Inicjalizacja struktury służącej do obsługi połączenia • MYSQL *mysql_init(MYSQL *); • Utworzenie połączenia • MYSQL *mysql_real_connect(MYSQL *connection, const char *server_host, const char *user_name, const char *pass, const char *dbname, unsigned int port number, const char *unix_socket_name, unsigned int flags); Wykonywanie zapytań Jacek Lach. Programowanie w systemie Linux • int mysql_query(MYSQL *connection, const char *query); • int mysql_real_query(MYSQL *mysql, const char *query, unsigned long length); • Zapytania nie zwracające wyników: • wysłanie zapytania • określenie liczby zmienionych wierszy my_ulonglong mysql_affected_rows(MYSQL Zapytania zwracające wyniki • Etapy wykonania: Jacek Lach. Programowanie w systemie Linux • wysłanie zapytania • odbiór danych • przetwarzanie danych • zwolnienie buforów • Odbiór danych: • całego zbioru wyników • sekwencyjny Jacek Lach. Programowanie w systemie Linux Zapytania zwracające wyniki • Odbiór pełnego zbioru wyników MYSQL_RES *mysql_store_result(MYSQL *connection); • Określenie liczności zbioru my_ulonglong mysql_num_rows(MYSQL_RES *result); Jacek Lach. Programowanie w systemie Linux Zapytania zwracające wyniki • Sekwencyjny odbiór danych MYSQL_RES *mysql_use_result(MYSQL *connection); • nie można skorzystać z: mysql_num_rows, mysql_data_seek, mysql_row_seek, mysql_row_tell Zapytania zwracające wyniki Jacek Lach. Programowanie w systemie Linux • Przetwarzanie danych • MYSQL_ROW mysql_fetch_row(MYSQL_RES *result); • void mysql_data_seek(MYSQL_RES *result, my_ulonglong offset); • MYSQL_ROW_OFFSET mysql_row_tell(MYSQL_RES *result); • MYSQL_ROW_OFFSET mysql_row_seek(MYSQL_RES *result, Zapytania zwracające wyniki Jacek Lach. Programowanie w systemie Linux • Przetwarzanie danych • Wynik zwracany przez mysql_fetch_row jest typu char** (może być bezpośrednio użyty: wynik[1] ); • unsigned int mysql_field_count(MYSQL *connection); • MYSQL_FIELD *mysql_fetch_field(MYSQL_RES *result); • mysql.h, mysql_com.h Jacek Lach. Programowanie w systemie Linux Obsługa błędów • unsigned int mysql_errno(MYSQL *connection); • char *mysql_error(MYSQL *connection); Jacek Lach. Programowanie w systemie Linux Przykład PostgreSQL • Cechy: Jacek Lach. Programowanie w systemie Linux • Wieloplatformowy RDBMS (Unix) • Dostępne interfejsy: C, C++, PHP, Perl, Python, ODBC, JDBC, ECPG • Zgodny z ANSI SQL • Obsługa replikacji • Zaawansowane narzędzia projektowania bazy danych • Wysoka wydajność przy bardzo dużych PostgreSQL • Podzapytania Jacek Lach. Programowanie w systemie Linux • Widoki • Wyzwalacze • Przechowywane procedury • Dziedziczenie • Typy danych użytkownika • Wbudowana obsługa SSL • Ułatwienie współpracy z innymi bazami (SQL) Zadania administracyjne • Tworzenie / usuwanie użytkowników Jacek Lach. Programowanie w systemie Linux • createuser • dropuser • Tworzenie baz danych • createdb • dropdb • Tworzenie “zrzutu” bazy danych • pg_dump Zadania użytkownika Jacek Lach. Programowanie w systemie Linux • Uzyskanie dostępu do bazy danych • Zadawanie zapytań SQL / Przetwarzanie wyników • Obsługa błędów • Plik nagłówkowy: libpqfe.h • Konsolidacja: lpq Podłączanie do bazy Jacek Lach. Programowanie w systemie Linux • Pgconn *PQconnectdb(const char *conninfo); • Parametry: • host • port • dbname • user • password • options • sslmode Podłączanie do bazy Jacek Lach. Programowanie w systemie Linux • Sprawdzenie stanu połączenia: ConnStatusType PQstatus(PGconn *conn) • CONNECTION_OK • CONNECTION_BAD • char *PQerrorMessage(const PGconn *conn); • void PQfinish(PGconn *conn); Wykonywanie zapytań Jacek Lach. Programowanie w systemie Linux • PGresult *PQexec(PGconn *conn, const char *query); • ExecStatusType *PQresultStatus(PGresult *result); • PGRES_EMPTY_QUERY • PGRES_COMMAND_OK • PGRES_TUPLES_OK • PGRES_COPY_IN | OUT • PGRES_BAD_RESPONSE Wyniki zapytań Jacek Lach. Programowanie w systemie Linux • const char *PQresStatus(ExecStatusType status); • INSERT/UPDATE/DELETE const char *PQcmdTuples(PGresult *result); • Oid PqoidValue(PGresult *result); • void PQclear(PQresult *result); Informacje o wynikach Jacek Lach. Programowanie w systemie Linux • int PQntuples(PGresult *result); • int PQnfields(PGresult *result); • char *PQfname(const PGresult *result, int field_index); • int *PQfnumber(const PGresult *result, const char *field_name); • Oid *PQftype(const PGresult *result, int field_index); Pobieranie danych Jacek Lach. Programowanie w systemie Linux • void PQprint(FILE *stream, PGresult *result, PQprintOpt *options); typedef struct _PQprintOpt { pqbool header; pqbool align; pqbool standard; pqbool html3; pqbool expanded; pqbool pager; char *fieldSep; char *tableOpt; char *caption; char **fieldName; } PQprintOpt; Kursory Jacek Lach. Programowanie w systemie Linux • DECLARE nazwa CURSOR FOR <SELECT> • OPEN nazwa • FETCH [N|ALL|NEXT] [IN nazwa] • CLOSE nazwa • DECLARE mycursor CURSOR FOR SELECT * FROM tabela; • FETCH ALL IN mycursor; • /* przetwarzanie danych */ Przetwarzanie danych Jacek Lach. Programowanie w systemie Linux • char *PQgetvalue(const PGresult *result, int tup_num, int field_num); • int PQgetisnull(const PGresult *result, int tup_num, int field_num); • int PQgetlength(const PGresult *result, int tup_num, int field_num); Przetwarzanie danych Jacek Lach. Programowanie w systemie Linux • nT = Liczba wierszy > PQntuples() • nF = Liczba kolumn > PQnfields() for (i=0; i< nT; i++) { for(j=0; j<nF; j++) { przetwarzanie PQgetvalue(result, i, j); } } Jacek Lach. Programowanie w systemie Linux ecpg • ecpg jest zgodne z wymaganiami ANSI dotyczącymi osadzania zapytań SQL w języku C • Do poprawnego działania wymagane jest przetworzenie kodu preprocesorem ecpg ecpg cd. #include <stdlib.h> #include <stdio.h> Jacek Lach. Programowanie w systemie Linux exec sql include sqlca; exec sql begin declare section; int kolor; exec sql end declare section; main() { exec sql connect to 'baza@localhost'; exec sql BEGIN WORK; exec SQL SELECT kolor into :kolor FROM obraz WHERE piksel=123; ... exec sql COMMIT WORK; exec sql disconnect all; } Jacek Lach. Programowanie w systemie Linux libpq vs. ecpg • libpq + proste użycie kod SQL “wymieszany” z kodem C większa ilość kodu • ecpg + polecenia SQL oddzielone od kodu C + jest standardem wymagana znajomość typów danych wyników utrudnione uruchamianie (dodatkowy Jacek Lach. Programowanie w systemie Linux Przykład