E N D
MySql – úvod • MySql je multiplatformní databázový systém (server a klient). Je napsán v C a C++. Ke stažení je na www.mysql.com pro různé platformy, ve zdrojových i binárních verzích. My se zde budeme zabívat konkrétně knihovnou libmysqlclient, která umožňuje komunikaci libovolného programu s mysql databází. • Ještě než se pustíme do samotného popisu bych zmíníl, že u MySql se dají volit některé možnosti už při kompilaci, které lze změnit pouze další rekompilací. Zmíním zde některé volby configure skriptu, jde o optimalizaci, velikost a kódování:./configure--enable-assembler(povolí assembler, zvětší rychlost)./configure--with-client-ldflags=-all-static(zkompiluje mysqlclientlib ze statických knihoven, zvětší rychlost a velikost)./configure--with-mysqld-ldflags=-all-static(zkompiluje mysqld ze statických knihoven, zvětší rychlost a velikost)./configure--default-character-set=CHARSET(zkompiluje jako defaulní znakovou sadu CHARSET, existuje zde volba czech)./configure--default-collation=COLLATION(porovnávání řetězců, MySql používá jako default latin1_swedish_ci, existuje latin2_czech_ci)
MySql – úvod a kompilace programu • Binární verze pro linux stažené z www.mysql.com používají tyto flagy:CFLAGS ="-O3 -mpentiumpro"CXXFLAGS="-O3 -mpentiumpro -felide-constructors-fno-exceptions -fno-rtti" • Kompilace programu s podporou mysql: • Při Kompilaci programu s podporou mysql potřebujeme zahrnout hlavičkový soubor mysql.h:#include <mysql/mysql.h>a nalinkovat program s knihovnou (lib)mysqlclient (zjednodušeně - linux):gcc `mysql_config—cflags` `mysql_config –libs` test.c -o test
MySql C API – Data typy • Data typy používané v MySql: • typedef charmy_bool;Boolean (Pozor char!). • typedefunsigned long longmy_ulonglong;The type used for the number of rows and for mysql_affected_rows(), mysql_num_rows(), and mysql_insert_id(). This type provides a range of 0 to 1.84e19. On some systems, attempting to print a value of type my_ulonglong will not work. To print such a value, convert it to unsigned long and use a %lu print format. • typedefchar**MYSQL_ROW – This is a type-safe representation of one row of data. It is currently implemented as an array of counted byte strings. (You cannot treat these as null-terminated strings if field values may contain binary data, because such values may contain null bytes internally.) Rows are obtained by calling mysql_fetch_row(). • typedefunsigned intMYSQL_FIELD_OFFSET - This is a type-safe representation of an offset into a MySQL field list. (Used by mysql_field_seek().) Offsets are field numbers within a row, beginning at zero.
MySql C API – Data typy (MYSQL) • Data typy používané v MySql: • typedefstruct st_mysql {...}MYSQL;This structure represents a handle to one database connection. It is used for almost all MySQL functions. • Není třeba znát důkladně proměnné této struktury, pro nás reprezentuje handle k databázy.(Proměnné jsem neuvedl, protože by se sem nevlezly)
MySql C API – Data typy (MYSQL_FIELD) • Data typy používané v MySql: • typedef struct st_mysql_field{char *name; /* Jméno pole, nulou ukončený řetězec */char *org_name; /* Originální jméno pole (jestli jm.je alias) */char *table; /* Jméno tabulky obsahující toto pole nebo NULL */char *org_table; /* Originální jméno tabulky (jestli je tab alias) */char *db; /* Database for table */char *catalog; /* Catalog for table */char *def; /* Default value (set by mysql_list_fields) */unsigned longlength; /* Width of column (create length) */unsigned longmax_length; /* Max width for selected set */unsigned intname_length;unsigned intorg_name_length;unsigned inttable_length;unsigned intorg_table_length;unsigned intdb_length;unsigned intcatalog_length;unsigned intdef_length;unsigned intflags; /* Div flags */unsigned intdecimals; /* Počet čísel v poli */unsigned intcharsetnr; /* Character set */ enum enum_field_typestype; /* Typ pole, typy popsány na následující stránce */}MYSQL_FIELD;This structure contains information about a field, such as the field's name, type, and size. Its members are described in more detail here. You may obtain the MYSQL_FIELD structures for each field by calling mysql_fetch_field() repeatedly. Field values are not part of this structure; they are contained in a MYSQL_ROW structure.
MySql C API – Data typy (enum_field_types) • Uvnitř struktury MYSQL_FIELD: • enumenum_field_types;Enumerace použitá ve struktuře MYSQL_FIELD, určuje typ pole:HodnotaPopisFIELD_TYPE_TINY TINYINT fieldFIELD_TYPE_SHORT SMALLINT fieldFIELD_TYPE_LONG INTEGER fieldFIELD_TYPE_INT24 MEDIUMINT fieldFIELD_TYPE_LONGLONG BIGINT fieldFIELD_TYPE_DECIMAL DECIMAL or NUMERIC fieldFIELD_TYPE_FLOAT FLOAT fieldFIELD_TYPE_DOUBLE DOUBLE or REAL fieldFIELD_TYPE_TIMESTAMP TIMESTAMP fieldFIELD_TYPE_DATE DATE fieldFIELD_TYPE_TIME TIME fieldFIELD_TYPE_DATETIME DATETIME fieldFIELD_TYPE_YEAR YEAR fieldFIELD_TYPE_STRING CHAR fieldFIELD_TYPE_VAR_STRING VARCHAR fieldFIELD_TYPE_BLOB BLOB or TEXT field (use max_length to determine the maximum length)FIELD_TYPE_SET SET fieldFIELD_TYPE_ENUM ENUM fieldFIELD_TYPE_NULL NULL-type fieldFIELD_TYPE_CHARDeprecated; use FIELD_TYPE_TINY instead
MySql C API – Data typy (enum_field_types) • Uvnitř struktury MYSQL_FIELD: • Ve struktuře MYSQL_FIELD jsou ještě flagy, které je nutno popsat:unsigned intflags; • Popis jednotlivých bitů (bity se můžou navzájem kombinovat)HodnotaPopisNOT_NULL_FLAG Pole nemůže být NULLPRI_KEY_FLAG Pole je část primárního klíčeUNIQUE_KEY_FLAG Pole je část jedinečného (unique) klíčeMULTIPLE_KEY_FLAG Pole je část non-unique klíčeUNSIGNED_FLAG Pole má UNSIGNED atributuZEROFILL_FLAG Pole má ZEROFILL atributuBINARY_FLAG Pole má BINARY atributuAUTO_INCREMENT_FLAG Pole má AUTO_INCREMENT atributuENUM_FLAG Pole je ENUM (deprecated)SET_FLAG Pole je SET (deprecated)BLOB_FLAG Pole je BLOB or TEXT (deprecated)TIMESTAMP_FLAG Pole je TIMESTAMP (deprecated)
MySql C API – Data typy (MYSQL_RES) • Data typy používané v MySql: • typedef struct st_mysql_res{my_ulonglongrow_count;MYSQL_FIELD *fields;MYSQL_DATA *data;MYSQL_ROWS *data_cursor;unsigned long *lengths; /* column lengths of current row */MYSQL *handle; /* for unbuffered reads */MEM_ROOTfield_alloc;unsigned intfield_count, current_field;MYSQL_ROWrow; /* If unbuffered read */MYSQL_ROWcurrent_row; /* buffer to current row */my_booleof; /* Used by mysql_fetch_row *//* mysql_stmt_close() had to cancel this result */my_boolunbuffered_fetch_cancelled;const struct st_mysql_methods *methods;}MYSQL_RES;This structure represents the result of a query that returns rows (SELECT, SHOW, DESCRIBE, EXPLAIN). The information returned from a query is called the result set in the remainder of this section.
MySql C API – Inicializace (otevření spojení) • Inicializace:Abychom úspěšně otevřeli databázy, musíme se nejdřív spojit ze serverem.Funkce mysql_init() otevře spojení a při úspěchu vrátí ukazatel na strukturu MYSQL. Druhý krok je otevřít databázy pod uživatelským jménem, zadat heslo, apod..., to provedeme funkcí mysql_real_connect(). • MYSQL* mysql_init(MYSQL *mysql);Tuto funkci voláme na začítku s parametrem NULL. • MYSQL* mysql_real_connect(MYSQL *mysql, const char *host,const char *user,const char *passwd,const char *db,unsigned intport,const char *unix_socket,unsigned longclientflag);Poslední 3 parametry můžou být 0, NULL, 0 • Příklad:MYSQL *mysql;mysql = mysql_init(NULL);mysql = mysql_real_connect(mysql, Host, User, Pass, Db, NULL, 0, NULL);
MySql C API – Deinicializace (zavření spojení) • Deinicializace:Jestli jsme úspěšně otevřeli spojení, udělali jsme co jsme potřebovali a teď chceme spojení ukončit, zavoláme mysql_close(). • MYSQL* mysql_close(MYSQL *sock);Touto funkcí ukončíme spojení. • Příklad:MYSQL *mysql;mysql = mysql_init(NULL);mysql = mysql_real_connect(mysql, Host, User, Pass, Db, NULL, 0, NULL);mysql_close(mysql);
MySql C API – Požadavky (queries) a výsledky (results) • Když je spojení aktivní, klient může poslat požadavek funkcí mysql_query() a mysql_real_query(). Rozdíl těchto funkcí je v tom, že funkcí mysql_query() posíláme nulou ukončený řetězec a funkcí mysql_real_query() můžeme poslat i binární data (posíláme i délku). • intmysql_query(MYSQL *mysql, const char *query); • intmysql_real_query(MYSQL *mysql, const char *query,unsigned longlength); • Je nutné znát výsledek našeho požadavku.MYSQL_RES *mysql_store_result(MYSQL *mysql); • Každý výsledek vrácený funkcí mysql_store_result() musíme vyčistit funkcí:voidmysql_free_result(MYSQL_RES *result); • MYSQL_ROWmysql_fetch_row(MYSQL_RES *result);Retrieves the next row of a result set. When used after mysql_store_result(), mysql_fetch_row() returns NULL when there are no more rows to retrieve. When used after mysql_use_result(), mysql_fetch_row() returns NULL when there are no more rows to retrieve or if an error occurred.
MySql C API – Požadavky (queries) a výsledky (results) • Jednoduchý příklad funkce, která provede požadavek a vrátí MYSQL_ROW:static const charMySqlHost[] = "localhost";static const charMySqlUser[] = "UserName";static const charMySqlPass[] = "Password";static const charMySqlDb[] = "Example";my_boolGetMysql(char *query){MYSQL *mysql = mysql_init(NULL);MYSQL_RES *res;MYSQL_ROWrow; if (mysql != mysql_real_connect(mysql, MySqlHost, MySqlUser, MySqlPass,MySqlDb, NULL, 0, NULL) ){mysql_close(mysql); return FALSE; /* chyba při spojení */} if (mysql_query(mysql, query)) {mysql_close(mysql); return FALSE; /* chyba MySql serveru */}res = mysql_store_result(mysql); if (res) {row = mysql_fetch_row(res); /* tady něco co prošťourá row */mysql_free_result(res);}mysql_close(mysql); return TRUE; /* vše ok */}
MySql C API – Požadavky (queries) a výsledky (results) • Jednoduchý příklad přímo z manuálu:pozor, tady je proměnná mysql deklarována takto: MYSQLmysql;MYSQL_RES *result;unsigned intnum_fields;unsigned intnum_rows;if (mysql_query(&mysql, query_string)) {/* error */}else {/* query succeeded, process any data returned by it */result = mysql_store_result(&mysql); if (result) {/* there are rows */num_fields = mysql_num_fields(result);/* retrieve rows, then call mysql_free_result(result) */} else {/* mysql_store_result() returned nothing; should it have? */ if (mysql_field_count(&mysql) == 0) {/* query does not return data */ /* (it was not a SELECT) */num_rows = mysql_affected_rows(&mysql);} else {/* mysql_store_result() should have returned data */fprintf(stderr, "Error: %s\n", mysql_error(&mysql));}}}
MySql C API – Závěr • Manuálové stránky MySQL mají přes 4mb a není v mé moci udělat jejich absolutní překlad. Celý smysl spočívá v tom, že klient MySQL otevře databázy (pomocí knihovny libmysqlclient), pošle požadavek, vrátí se mu výsledek, zhodnotí ho a uzavře spojení. Ještě před tím, než databázy otevřeme ji musíme nejdřív vytvořit, to můžeme udělat pomocí programu mysql:takto jsem to udělal já:/usr/local/bin/mysqlWelcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 13 to server version: 4.0.22create database Example;use Example;create TABLE Test(...);quit • Tady jsou odkazy, ze kterých jsem čerpal: • www.mysql.com • www.metalshell.com • www.ousob.com • www.root.cz