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 OCI MS Server ODBC, OLE DB Sybase Open client PostgreSQL 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 Celkové chování klientské knihovny v aplikaci Definuje memory-management Session 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 Result-set Result R2 Statement Session User Pwd Server2 DB1 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ů IPv4, IPv6 Lze svázat s různým typem komunikace 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); recv(sock, buf, len); send(sock, buf, len); shutdown(sock); close(sock); shutdown(listensock); close(listensock); // blocks
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 Čekání na dokončení více operací nad sockety getaddrinfo Obecný převod z pojmenování uzlu a služby na binární reprezentaci getnameinfo 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 POSIX.1c Rozšíření o vlákna 1995 POSIX.2 Shell a utility 1992 POSIX:2001 API, shell, utility POSIX:2004 Update a opravy POSIX:2008 API, shell, utility
POSIX kompatibilita Plná AIX, HP-UX, Solaris, Mac OS X, Částečná 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 Pole konstantní velikosti ISO C++ TR1 Bimap 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 Asynchronní I/O Format Vylepšené formátování podobné printf Program options 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 Generic Image Library Static assert ISO C++ 0x Type traits ISO C++ TR1 MPL Obecný framework pro kompilační algoritmy, sekvence a metafunkce
Boost práce s řetězci Lexical cast ISO C++ 0x Regex ISO C++ TR1 Spirit 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