C++ a vnější svět David Bednárek Jakub Yaghob Filip Zavoral
Databáze
Připojení klienta Aplikace
DB DB.LIB
Databáze – výběr a rozhraní
Oracle
MS Server
Open client
PostgreSQL
ODBC, OLE DB
Sybase
OCI
Vlastní
MySQL
Vlastní
Databáze – jak vybrat rozhraní
Nativní knihovny
Větší rychlost Dostupnost specifických vlastností Nepřenositelnost (někdy) Svázanost s konkrétní DB
Obecné nadstavby (ODBC, OLE DB)
Implementovány pomocí nativních knihoven Snížení výkonu přidáním mezivrstvy Nemožnost využít specifické vlastnosti Nesvázanost s konkrétní DB?
Databáze – programové rozhraní
ISO 9075:2008
Většina rozhraní zhruba odpovídá
Kromě MySQL
Definuje hierarchii programových entit Definuje rozhraní pro manipulaci s programovými entitami
Databáze – programové entity
Environment
Session
Celkové chování klientské knihovny v aplikaci Definuje memory-management Spojení s jedním serverem Vlastnosti session, uživatel Odvozen z environmentu
Statement
Stavový prostor zpracování jednoho dotazu Prepared statement Svázání parametrů
Statické/dynamické, vstupní/výstupní
Odvozen ze session
Databáze – programové entity
Result-set
Kontejner výsledků Odvozen od statementu
Result
Výsledek dotazu Svázání dat
Statické/dynamické
Odvozen od result-setu
Transaction
Odvozen od session
Databáze – programové entity v aplikaci Aplikace Environment Session (User/Pwd/Server1) Transaction Statement
Statement
Result-set Result
DB1
Session User Pwd Server2
R2
DB2
Databáze – programové entity - příklad environment e; CreateEnvironment(e); session ses; CreateSession(ses, e); ConnectSession(ses, “user”, “pwd”, “srv”); transaction t; CreateTransaction(t, ses); BeginTransaction(t); statement stm; CreateStatement(stm, ses); int i, j; BindParameter(stm, “q”, i, IN, C_INT, SQL_DEC);
result_set rs = ExecuteStatement(stm, “select * from t where c=:q”); result r = rs.first(); BindColumn(r, 1, j, C_INT, SQL_DEC); while(Fetch(r)) { } DestroyResult(r);DestroyRS(rs); CommitTransaction(t); DestroyStatement(stm); DestroyTransaction(t); CloseSession(ses); DestroySession(ses); DestroyEnvironment(e);
Síť
BSD sockety
Winsock 2
Socket
Abstraktní koncový bod síťové komunikace Lze svázat s různou rodinou protokolů
Lze svázat s různým typem komunikace
IPv4, IPv6 Stream, datagram, raw
Lze svázat s transportním protokolem
TCP, UDP
Síť – klient TCP SOCKET sock = socket(INET, STREAM, TCP); struct sockaddr_in soain; soain.sin_family = INET; getaddrinfo(“www.nic.cz”, SRV_PORT, 0, &soain.sin_addr); connect(sock, soain); send(sock, buf, len); recv(sock, buf, len); shutdown(sock); close(sock);
Síť – server TCP SOCKET listensock = socket(INET, STREAM, TCP); struct sockaddr_in soain; soain.sin_family = INET; soain.sin_port = SRV_PORT; soian.sin_addr = ANY; bind(listensock, soain); listen(listensock, queuedepth); for(;;) { SOCKET sock = accept(listensock); // blocks recv(sock, buf, len); send(sock, buf, len); shutdown(sock); close(sock); } shutdown(listensock); close(listensock);
Síť – klient UDP SOCKET sock = socket(INET, DGRAM, UDP); struct sockaddr_in soain; soain.sin_family = INET; getaddrinfo(“www.nic.cz”, SRV_PORT, 0, &soain.sin_addr); sendto(sock, buf, len, &soain); recvfrom(sock, buf, len, &soain); close(sock);
Síť – server UDP SOCKET sock = socket(INET, STREAM, TCP); struct sockaddr_in soain; soain.sin_family = INET; soain.sin_port = SRV_PORT; soian.sin_addr = ANY; bind(sock, soain); for(;;) { struct sockaddr_in soain_cli; int len = recvfrom(sock, buf, maxlen, &soain_cli); sendto(sock, buf, len, &soain_cli); } close(sock);
Síť – zbylé funkce
select
getaddrinfo
Obecný převod z pojmenování uzlu a služby na binární reprezentaci
getnameinfo
Čekání na dokončení více operací nad sockety
Obecný zpětný převod z binární reprezentace na pojmenování uzlu a služby
htons, htonl, ntohs, ntohl
Převod z reprezentace hosta na reprezentaci sítě
POSIX
Portable Operating System Interface [for Unix]
Existuje nativní implementace pro Win NT Single UNIX Specification IEEE standardy API Shell Utility
POSIX – verze
POSIX.1
API (zahrnuje ANSI C) 1988
POSIX.1b
Real-time rozšíření 1993
Rozšíření o vlákna 1995
API, shell, utility
POSIX:2004
Shell a utility 1992
POSIX:2001
POSIX.1c
POSIX.2
Update a opravy
POSIX:2008
API, shell, utility
POSIX – kompatibilita
Plná
Částečná
AIX, HP-UX, Solaris, Mac OS X, … FreeBSD, GNU/Linux, OpenSolaris, …
Windows
Cygwin – částečná kompatibilita MS Windows Services for UNIX 3.5 – plná kompatibilita
Boost
Přenositelné C++ knihovny
Review proces Zdroj návrhů pro ISO
Úzce svázán s ISO výborem
Velká řada podporovaných OS a překladačů Výborné knihovny, leckdy přehnaná abstrakce
Boost – kontejnery
Array
Bimap
Pole konstantní velikosti ISO C++ TR1 Oboustranná mapa
Circular buffer Graph Variant
Bezpečný union
Boost – podpora paralelního programování
Interprocess
Sdílená paměť Paměťově mapované soubory Mutexy
MPI Thread
ISO C++ 0x
Boost – I/O
Asio
Format
Vylepšené formátování podobné printf
Program options
Asynchronní I/O
Zpracování parametrů programu z příkazové řádky
Serialization
Serializace dat pro uložení nebo marshalling
Boost – matematika a numerika
Intervals Multi-array Random
ISO C++ TR1
Boost – generické programování a šablonové metaprogramování
GIL
Static assert
ISO C++ 0x
Type traits
Generic Image Library
ISO C++ TR1
MPL
Obecný framework pro kompilační algoritmy, sekvence a metafunkce
Boost – práce s řetězci
Lexical cast
Regex
ISO C++ TR1
Spirit
ISO C++ 0x
LL parser
String algo Tokenizer
Rozsekání řetězce na tokeny
Boost – nezařazené
Shared ptr
ISO C++ TR1
Date time Filesystem
Práce s cestami, soubory, adresáři
TBB
Threading Building Blocks
Open source, komerčně od firmy Intel Knihovna pro podporu paralelních aplikací Task-based parallelism Paralelní algoritmy Paralelní kontejnery Přenositelnost
Concurrency runtime ve VS 2010
Framework pro paralelní programy
VS 2010 „vykradené“ nápady z TBB