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 on­line
• 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: libpq­fe.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