KZ BD w11 2 id 256668 Nieznany

background image

Bazy danych – wykład dwunasty

Interfejs do poł ˛

acze ´n z baz ˛

a danych

Konrad Zdanowski

Uniwersytet Kardynała Stefana Wyszy ´nskiego, Warszawa

Konrad Zdanowski ( Uniwersytet Kardynała Stefana Wyszy ´nskiego, Warszawa)

Bazy danych – wykład dwunasty Interfejs do poł ˛

acze ´n z baz ˛

a danych

1 / 29

background image

Zajmiemy si ˛e mechanizmami pozwalaj ˛

acymi poł ˛

aczy´c si ˛e z BD z

poziomu aplikacji klienta.

Szczegółowo omówimy interfejs JDBC i baz ˛e Oracle, inne
mechanizmy s ˛

a do´s´c podobne.

Konrad Zdanowski ( Uniwersytet Kardynała Stefana Wyszy ´nskiego, Warszawa)

Bazy danych – wykład dwunasty Interfejs do poł ˛

acze ´n z baz ˛

a danych

2 / 29

background image

Nawi ˛

azywanie poł ˛

aczenia

Dodajemy do projektu bibliotek˛e JDBC (Project
Properties/Libraries and Classpath/Add Library/Oracle JDBC )

Musimy zaimportowa´c pakiet

java.sql ( import java.sql.*).

Rejestrujemy sterownik: DriverManager.registerDriver(new
oracle.jdbc.driver.OracleDriver());

Konrad Zdanowski ( Uniwersytet Kardynała Stefana Wyszy ´nskiego, Warszawa)

Bazy danych – wykład dwunasty Interfejs do poł ˛

acze ´n z baz ˛

a danych

3 / 29

background image

Nawi ˛

azywanie poł ˛

aczenia – c.d.

Otwieramy poł ˛

aczenie Connection conn =

DriverManager.getConnection(url bazy, u˙zytkownik, hasło).

format adresu url: protokół poł ˛

aczenia @ adres bazy danych:port:

sid.

parametry znale´z´c mo˙zna w pliku tnsnames.ora (w szczególno´sci
SERVICE_NAME = <sid>),

np. Connection conn = DriverManager.getConnection(
"jdbc:oracle:thin:@localhost:1521:XE", "user", "passwd");

po pracy poł ˛

aczenie zamykamy conn.close();

Konrad Zdanowski ( Uniwersytet Kardynała Stefana Wyszy ´nskiego, Warszawa)

Bazy danych – wykład dwunasty Interfejs do poł ˛

acze ´n z baz ˛

a danych

4 / 29

background image

Wykonywanie zapyta ´n

Otwieramy obiekt implentuj ˛

acy interfejs zapyta ´n typu Statement.

Wykonujemy zapytynie zachowuj ˛

ac wynik w zmiennej typu

ResultSet.

Typ ten implementuje iterator, którym mo˙zemy odczytywa´c wyniki
zapytania.

Konrad Zdanowski ( Uniwersytet Kardynała Stefana Wyszy ´nskiego, Warszawa)

Bazy danych – wykład dwunasty Interfejs do poł ˛

acze ´n z baz ˛

a danych

5 / 29

background image

Wykonywanie zapyta ´n

Statement stmt = conn.createStatement();

ResultSet rset =
stmt.executeQuery("select TABLE_NAME from USER_TABLES");

while (rset.next())

System.out.println(rset.getString(1));

Konrad Zdanowski ( Uniwersytet Kardynała Stefana Wyszy ´nskiego, Warszawa)

Bazy danych – wykład dwunasty Interfejs do poł ˛

acze ´n z baz ˛

a danych

6 / 29

background image

Wykonywanie zapyta ´n

W metodzie ResultSet.getstring() mo˙zemy poda´c:

numer atrybutu wyniku zapytania (pierwszy atrybut ma numer 1),

jego nazwe (je´sli u˙zywamy aliasów – select A as B from ... –
podajemy alias).

Konrad Zdanowski ( Uniwersytet Kardynała Stefana Wyszy ´nskiego, Warszawa)

Bazy danych – wykład dwunasty Interfejs do poł ˛

acze ´n z baz ˛

a danych

7 / 29

background image

Wykonywanie zapyta ´n – przykład

import j a v a . s q l . ∗ ;
class JDBC_Example {

p ub li c s t a t i c void main ( S t r i n g [ ] args ) {
DriverManager . r e g i s t e r D r i v e r (

new o r a c l e . j d b c . d r i v e r . O r a c l e D r i v e r ( ) ) ;

Connection conn =
DriverManager . g e t C o n n e c t i o n (

" j d b c : o r a c l e : t h i n : @ l o c a l h o s t : 1 5 2 1 :XE" ,
" c h r i s " , " c h r i s h a s l o " ) ;

Statement s t m t = conn . c r e a t e S t a t e m e n t ( ) ;
R e s u l t S e t r s e t = s t m t . executeQuery (

" s e l e c t TABLE_NAME from USER_TABLES" ) ;

while ( r s e t . n e x t ( ) )

System . o u t . p r i n t l n ( r s e t . g e t S t r i n g ( 1 ) ) ;

r s e t . c l o s e ( ) ;

s t m t . c l o s e ( ) ;

conn . c l o s e ( ) ;

}
}

Konrad Zdanowski ( Uniwersytet Kardynała Stefana Wyszy ´nskiego, Warszawa)

Bazy danych – wykład dwunasty Interfejs do poł ˛

acze ´n z baz ˛

a danych

8 / 29

background image

Odczytywanie wyników zapytania

Klasa ResultSet posiada rodzin ˛e funkcji getX (String, Short, Int,
Float, Double, TimeStamp, ...).

Je˙zeli wynikiem zapytania jest warto´s´c atrybutu NULL, to w
przypadku String, TimeStamp, Date zostanie zwrócony pusty
wska´znik.

W przypadku funkcji zwracaj ˛

acych warto´sci numeryczne, atrybut

o warto´sci NULL zostanie zwrócony jako zero.

Aby rozstrzygn ˛

a´c czy wczytana warto´s´c nie pochodzi od NULL,

mo˙zna u˙zy´c metody wasNULL, zwracaj ˛

acej true, je´sli warto´s´c

była równa NULL.

Konrad Zdanowski ( Uniwersytet Kardynała Stefana Wyszy ´nskiego, Warszawa)

Bazy danych – wykład dwunasty Interfejs do poł ˛

acze ´n z baz ˛

a danych

9 / 29

background image

Odczytywanie wyników zapytania – przykład

R e s u l t S e t r s _ i = s t m t . executeQuery ( " s e l e c t co unt ( ∗ )

as i l o s c from osoby " ) ;

r s _ i . n e x t ( ) ;
i n t i = r s _ i . g e t I n t ( " i l o s c " ) ;
i n t k = r s _ i . g e t I n t ( 1 ) ;

Konrad Zdanowski ( Uniwersytet Kardynała Stefana Wyszy ´nskiego, Warszawa)

Bazy danych – wykład dwunasty Interfejs do poł ˛

acze ´n z baz ˛

a danych

10 / 29

background image

Aktualizacja danych

Aktualizacj ˛e danych wykonujemy analogicznie jak zadanie
zapytania.

Słu˙zy temu metoda metoda Statement.executeUpdate(polecenie
DML).

Mo˙zemy wykona´c w ten sposób polecenia INSERT, UPDATE,
DELETE.

Metoda zwraca ilo´s´c zmodyfikowanych krotek.

Mo˙zemy wykona´c te˙z polecenie DDL.

Konrad Zdanowski ( Uniwersytet Kardynała Stefana Wyszy ´nskiego, Warszawa)

Bazy danych – wykład dwunasty Interfejs do poł ˛

acze ´n z baz ˛

a danych

11 / 29

background image

Transakcje

Ka˙zde polecenie stanowi jedn ˛

a transakcj ˛e.

Je´sli chcemy wył ˛

aczy´c/wł ˛

aczy´c automatyczne zatwierdzanie

transakcji mo˙zemy u˙zy´c metody
Connection.setAutoCommit(false/true).

Zatwierdzamy wtedy wykonane polecenia metod ˛

a

Connection.commit(), wycofujemy metod ˛

a Connection.rollback().

Polecenie rollback() wycofuje zmiany wprowadzone od czasu
ostatniego commit();

Przy zamkni ˛eciu poł ˛

aczenia nast ˛epuje domy´slny commit().

Konrad Zdanowski ( Uniwersytet Kardynała Stefana Wyszy ´nskiego, Warszawa)

Bazy danych – wykład dwunasty Interfejs do poł ˛

acze ´n z baz ˛

a danych

12 / 29

background image

Transakcje – przykład

conn . setAutoCommit (

f a l s e ) ;

Statement s t m t = conn . c r e a t e S t a t e m e n t ( ) ;
s t m t . executeUpdate (

" i n s e r t i n t o osoby v a l u e s ( ’ Olga ’ ,

’ Kwiatkowska ’ ) " ) ;

s t m t . executeUpdate (

" i n s e r t i n t o osoby v a l u e s ( ’ Iwona ’ ,

’ Kwiatkowska ’ ) " ) ;

r s = s t m t . executeQuery (

" s e l e c t i m i e , nazwisko from osoby " ) ;

while ( r s . n e x t ( ) )

System . o u t . p r i n t l n ( r s . g e t S t r i n g ( 1 ) + " " + r s . g e t S t r i n g ( 2 ) ) ;

r s . c l o s e ( ) ;

conn . r o l l b a c k ( ) ;

r s = s t m t . executeQuery (

" s e l e c t i m i e , nazwisko from osoby " ) ;

while ( r s . n e x t ( ) )

System . o u t . p r i n t l n ( r s . g e t S t r i n g ( 1 ) + " " + r s . g e t S t r i n g ( 2 ) ) ;

Konrad Zdanowski ( Uniwersytet Kardynała Stefana Wyszy ´nskiego, Warszawa)

Bazy danych – wykład dwunasty Interfejs do poł ˛

acze ´n z baz ˛

a danych

13 / 29

background image

Transakcje – przykład

conn . setAutoCommit (

f a l s e ) ;

Statement s t m t = conn . c r e a t e S t a t e m e n t ( ) ;
s t m t . executeUpdate (

" i n s e r t i n t o osoby v a l u e s ( ’ Olga ’ ,

’ Kwiatkowska ’ ) " ) ;

conn . commit ( )

/ / Uwaga −− zatwierdzamy zmiany !

s t m t . executeUpdate (

" i n s e r t i n t o osoby v a l u e s ( ’ Iwona ’ ,

’ Kwiatkowska ’ ) " ) ;

r s = s t m t . executeQuery (

" s e l e c t i m i e , nazwisko from osoby " ) ;

while ( r s . n e x t ( ) )

System . o u t . p r i n t l n ( r s . g e t S t r i n g ( 1 ) + " " + r s . g e t S t r i n g ( 2 ) ) ;

r s . c l o s e ( ) ;

conn . r o l l b a c k ( ) ;

r s = s t m t . executeQuery (

" s e l e c t i m i e , nazwisko from osoby " ) ;

while ( r s . n e x t ( ) )

System . o u t . p r i n t l n ( r s . g e t S t r i n g ( 1 ) + " " + r s . g e t S t r i n g ( 2 ) ) ;

Konrad Zdanowski ( Uniwersytet Kardynała Stefana Wyszy ´nskiego, Warszawa)

Bazy danych – wykład dwunasty Interfejs do poł ˛

acze ´n z baz ˛

a danych

14 / 29

background image

Zapytania prekompilowane

Bezpo´srednie przysyłanie zapytania do SZBD jest kosztochłonne.

System musi za ka˙zdym razem zoptymalizowa´c i skompilowa´c
zapytanie.

Je˙zeli wiemy, ˙ze b ˛edziemy wykonywac zapytania pewnego typu
mo˙zemy ograniczy´c te koszty, do jednokrotnego wykonania.

W samym zapytaniu mo˙zemy pó´zniej zmienia´c parametry, z
którymi jest wykonywane.

Konrad Zdanowski ( Uniwersytet Kardynała Stefana Wyszy ´nskiego, Warszawa)

Bazy danych – wykład dwunasty Interfejs do poł ˛

acze ´n z baz ˛

a danych

15 / 29

background image

Zapytania prekompilowane – przykład

PreparedStatement ps = conn . p r e p a r e S t a t e m e n t (

" s e l e c t nazwisko from osoby where i m i e =? " ) ;

ps . s e t S t r i n g ( 1 , " Jan " ) ;

R e s u l t S e t r s =ps . executeQuery ( ) ;
while ( r s . n e x t ( ) )

System . o u t . p r i n t l n ( r s . g e t S t r i n g ( " nazwisko " ) ) ;

r s . c l o s e ( ) ;

ps . s e t S t r i n g ( 1 , "Ewa" ) ;

R e s u l t S e t r s =ps . executeQuery ( ) ;

. . .

r s . c l o s e ( ) ;

ps . c l o s e ( ) ;

Konrad Zdanowski ( Uniwersytet Kardynała Stefana Wyszy ´nskiego, Warszawa)

Bazy danych – wykład dwunasty Interfejs do poł ˛

acze ´n z baz ˛

a danych

16 / 29

background image

Zapytania prekompilowane – przykład

PreparedStatement s t m t =conn . p r e p a r e S t a t e m e n t (

" update osoby s e t hobby=? where r o k _ u r o d z e n i a =? " ) ;

s t m t . s e t S t r i n g ( 1 , " brak " ) ;
s t m t . s e t I n t ( 2 , 2 0 1 2 ) ;
s t m t . executeUpdate ( ) ;

Konrad Zdanowski ( Uniwersytet Kardynała Stefana Wyszy ´nskiego, Warszawa)

Bazy danych – wykład dwunasty Interfejs do poł ˛

acze ´n z baz ˛

a danych

17 / 29

background image

Przewijanie wyników

Po wynikach zapytania mo˙zemy porusza´c si ˛e w sposób bardziej
elastyczny.

Musimy utworzy´c inaczej obiekt typu Statement:

Statement s t m t = conn . c r e a t e S t a t e m e n t (

r o d z a j p r z e w i j a n i a , r o d z a j o d c z y t u ) ;

Rodzaj przewijania przyj ˛

a´c warto´s´c:

I

ResultSet.TYPE_SCROLL_SENSITIVE,

I

ResultSet.Type_SCROLL_INSENSITIVE,

I

ResultSet.TYPE_FORWARD_ONLY.

Rodzaj odczytu:

I

ResultSet.CONCUR_READ_ONLY,

I

ResultSet.CONCUR_UPDATABLE.

Konrad Zdanowski ( Uniwersytet Kardynała Stefana Wyszy ´nskiego, Warszawa)

Bazy danych – wykład dwunasty Interfejs do poł ˛

acze ´n z baz ˛

a danych

18 / 29

background image

Przewijanie wyników

Je´sli utworzyli´smy obiekt Statement w powy˙zszy sposób mo˙zemy
posłuzy´c si ˛e szeregiem metod clasy ResultSet pozycjonuj ˛

acych

„kursor”.

absolute(n), dla n dodatnich lub ujemnych,

relative(n), dla n dodatnich lub ujemnych,

first, last next, previous.

Mo˙zemy sprawdza´c aktualn ˛

a pozycj ˛e przez metody isAfterLast,

isBeforeFirst, isLast, isFirst.

Konrad Zdanowski ( Uniwersytet Kardynała Stefana Wyszy ´nskiego, Warszawa)

Bazy danych – wykład dwunasty Interfejs do poł ˛

acze ´n z baz ˛

a danych

19 / 29

background image

Modyfikowanie relacji wynikowych

Je´sli utworzyli´smy zapytanie z parametrem
ResultSet.CONCUR_UPDATABLE, mo˙zemy modyfikowa´c krotki
wyniku.

Pola aktualnie odczytywanej krotki modyfikujemy przez metod ˛e
ResultSet.UpdateX(nazwa, value), gdzie X to nazwa typu.

Po skonczeniu modyfikowania wywołujemy metod ˛e
ResultSet.updateRow() (lub ResultSet.cancelUpdates()).

Konrad Zdanowski ( Uniwersytet Kardynała Stefana Wyszy ´nskiego, Warszawa)

Bazy danych – wykład dwunasty Interfejs do poł ˛

acze ´n z baz ˛

a danych

20 / 29

background image

Modyfikowanie relacji wynikowych – przykład

Statement s t m t = conn . c r e a t e S t a t e m e n t (

R e s u l t S e t .TYPE_FORWARD_ONLY,
R e s u l t S e t .CONCUR_UPDATABLE ) ;

R e s u l t S e t r s = s t m t . executeQuery (

" s e l e c t

nazwisko from osoby " ) ;

while ( r s . n e x t ( ) ) {

i f ( r s . g e t S t r i n g ( 1 ) . eq ua ls ( " K o w a l s k i " ) ) {

r s . u p d a t e S t r i n g ( 1 , " K w i a t k o w s k i " ) ;
r s . updateRow ( ) ;

}

Uwaga. Te instrukcje zmieni ˛

a wszystkich Kowalskich w tabeli osoby na

Kwiatkowskich.

Konrad Zdanowski ( Uniwersytet Kardynała Stefana Wyszy ´nskiego, Warszawa)

Bazy danych – wykład dwunasty Interfejs do poł ˛

acze ´n z baz ˛

a danych

21 / 29

background image

Wstawianie krotek – przykład

r s . moveToInsertRow ( ) ;
r s . u p d a t e S t r i n g ( 1 , " Jan " ) ;
r s . u p d a t e S t r i n g ( 2 , " K o w a l s k i " ) ;
r s . i n s e r t R o w ( ) ;
r s . moveToCurrentRow ( ) ;

Konrad Zdanowski ( Uniwersytet Kardynała Stefana Wyszy ´nskiego, Warszawa)

Bazy danych – wykład dwunasty Interfejs do poł ˛

acze ´n z baz ˛

a danych

22 / 29

background image

Przetwarzanie wsadowe– przykład

Przetwarzanie wsadowe dost ˛epne jest tylko dla UPDATE, INSERT,
DELETE. Zapytanie, które generuje wynik spowoduje zgłoszenie
wyj ˛

atku.

PreparedStatement s t m t =conn . p r e p a r e S t a t e m e n t (

" update osoby s e t hobby=? where r o k _ u r o d z e n i a =? " ) ;

s t m t . s e t S t r i n g ( 1 , " brak " ) ;
s t m t . s e t I n t ( 2 , 2 0 1 2 ) ;
s t m t . addBatch ( ) ;
s t m t . s e t S t r i n g ( 1 , " kaszka " ) ;
s t m t . s e t I n t ( 2 , 2 0 1 1 ) ;
s t m t . addBatch ( ) ;

i n t

[ ]

t = s t m t . executeBatch ( ) ;

Konrad Zdanowski ( Uniwersytet Kardynała Stefana Wyszy ´nskiego, Warszawa)

Bazy danych – wykład dwunasty Interfejs do poł ˛

acze ´n z baz ˛

a danych

23 / 29

background image

Modyfikowanie ilo´sci przesyłanych krotek

Sterownik JDBC dla Oracle umozliwia zwi ˛ekszenie liczby
przeysłanych krotek metod ˛

a setRowPrefetch(int).

Musimy zrzutowa´c obiekt Statement na OracleStatement.

Mechanizm jest podobny dla PreparedStatement i
OraclePreparedStatement.

Pozwala to zwi ˛ekszenie efektywno´sci współpracy z BD.

Konrad Zdanowski ( Uniwersytet Kardynała Stefana Wyszy ´nskiego, Warszawa)

Bazy danych – wykład dwunasty Interfejs do poł ˛

acze ´n z baz ˛

a danych

24 / 29

background image

Modyfikowanie ilo´sci przesyłanych krotek – przykład

Statement s t m t =conn . c r e a t e S t a t e m e n t ( ) ;

( ( O r a c l e S t a t e m e n t ) s t m t ) . setRowPrefetch ( 1 0 ) ;

R e s u l t S e t r s = s t m t . executeQuery (

" s e l e c t i m i e , nazwisko from osoby " ) ;

while ( r s . n e x t ( ) )

System . o u t . p r i n t l n ( r s . g e t S t r i n g ( 1 ) + " " + r s . g e t S t r i n g ( 2 ) ) :

Konrad Zdanowski ( Uniwersytet Kardynała Stefana Wyszy ´nskiego, Warszawa)

Bazy danych – wykład dwunasty Interfejs do poł ˛

acze ´n z baz ˛

a danych

25 / 29

background image

Interfejs dla C++ – OCCI

OCCI – Oracle C++ Call Interface,

Oferuje podobn ˛

a funkcjonalno´s´c co JDBC.

Pobieramy ze strony Oracle. Trzeba uwa˙za´c, ˙zeby pobra´c
wła´sciw ˛

a wersj ˛e, tzn. wł ˛

a´sciw ˛

a dla kompilatora i wła´sciw ˛

a dla

platformy na która piszemy aplikacj ˛e (32 lub 64 bit).

Pobieramy i rozpakowujemy InstantClient.

Dodajemy ´scie˙zki do katalogów, w których trzymamy
instantclient-a oraz biblioteki dla Visual Studio XXXX.

Konrad Zdanowski ( Uniwersytet Kardynała Stefana Wyszy ´nskiego, Warszawa)

Bazy danych – wykład dwunasty Interfejs do poł ˛

acze ´n z baz ˛

a danych

26 / 29

background image

Interfejs dla C++ – OCCI

Pisz ˛

ac aplikacj ˛e okre´slamy w projekcie:

miejsce dla plików z definicjami: w zakładce VC++ Directories/
Include Directories dopisujemy ´scie˙zk˛e Oracle, np.
c:/oraclexe/app/oracle/product/11.2.0/serve/oci/include

do Library Directories dodajemy katalogi z bibliotekami, w których
zainstalowali´smy instantclient oraz biblioteki Visual Studio (vc10,
...).

Konrad Zdanowski ( Uniwersytet Kardynała Stefana Wyszy ´nskiego, Warszawa)

Bazy danych – wykład dwunasty Interfejs do poł ˛

acze ´n z baz ˛

a danych

27 / 29

background image

Program porównawczy

# i n c l u d e " o c c i . h "
# i n c l u d e < i o s t r e a m >
# i n c l u d e <iomanip >
namespace oc = o r a c l e : : o c c i ;

u s i n g namespace System ;
u s i n g namespace s t d ;

oc : : Environment ∗ env ;
oc : : Connection ∗ conn ;
oc : : Statement ∗ s t m t = NULL ;
oc : : R e s u l t S e t ∗ r s = NULL ;

s t r i n g s q l = " s e l e c t i m i e , nazwisko from osoby " ;

Konrad Zdanowski ( Uniwersytet Kardynała Stefana Wyszy ´nskiego, Warszawa)

Bazy danych – wykład dwunasty Interfejs do poł ˛

acze ´n z baz ˛

a danych

28 / 29

background image

Program porównawczy

i n t main ( ) {

env=oc : : Environment : : c r e a t e E n v i r o n m e n t (

oc : : Environment : : DEFAULT ) ;

conn = env>c r e a t e C o n n e c t i o n (

" user " , " pswd " , "XE" ) ;

s t m t = conn>c r e a t e S t a t e m e n t ( s q l ) ;
r s = stmt >executeQuery ( ) ;

i f ( r s ) {

while ( rs >n e x t ( ) ) {

c o u t << setw ( 1 6 ) << l e f t << rs > g e t S t r i n g ( 1 ) ;

}

}

stmt >c l o s e R e s u l t S e t ( r s ) ;

conn>t e r m i n a t e S t a t e m e n t ( s t m t ) ;
env>t e r m i n a t e C o n n e c t i o n ( conn ) ;
oc : : Environment : : t e r m i n a t e E n v i r o n m e n t ( env ) ;

r e t u r n 0 ;

}

Konrad Zdanowski ( Uniwersytet Kardynała Stefana Wyszy ´nskiego, Warszawa)

Bazy danych – wykład dwunasty Interfejs do poł ˛

acze ´n z baz ˛

a danych

29 / 29


Wyszukiwarka

Podobne podstrony:
KZ BD w09 id 256667 Nieznany
KZ BD w07 id 256666 Nieznany
KZ BD w14 2 id 256670 Nieznany
KZ BD w12 id 256669 Nieznany
KZ BD w03 2 id 256664 Nieznany
KZ BD w09 id 256667 Nieznany
bd lab2 id 81995 Nieznany (2)
bd dbastudio id 81961 Nieznany (2)
BD 408e id 130025 Nieznany (2)
bd w1 id 81977 Nieznany (2)
PodstEle w11 id 369040 Nieznany
Elektronika W11 id 159019 Nieznany
bd lab2 id 81995 Nieznany (2)
bd dbastudio id 81961 Nieznany (2)
BD 1st 2 4 lab3 tresc 1 1 id 81 Nieznany
bd lab 04 id 81967 Nieznany (2)
Calosc BD id 108184 Nieznany
BD 2st 1 2 w13 tresc 1 1 id 819 Nieznany (2)

więcej podobnych podstron