diff options
author | unknown <tim@work.mysql.com> | 2001-09-18 22:45:41 +0200 |
---|---|---|
committer | unknown <tim@work.mysql.com> | 2001-09-18 22:45:41 +0200 |
commit | 7d4f8a6b4b4ad0a52839330d0cf80f5279803a37 (patch) | |
tree | a404ca2d7b466a23e299d1fdc4a118dc7e412f7f /Docs | |
parent | 7a02a3e95b54e49bfab7e5e4f947e42539ab2957 (diff) | |
download | mariadb-git-7d4f8a6b4b4ad0a52839330d0cf80f5279803a37.tar.gz |
New documentation about the embedded MySQL server library.
Docs/manual.texi:
New information about the embedded MySQL server
library.
Diffstat (limited to 'Docs')
-rw-r--r-- | Docs/manual.texi | 546 |
1 files changed, 510 insertions, 36 deletions
diff --git a/Docs/manual.texi b/Docs/manual.texi index 1069202f67c..df07f391112 100644 --- a/Docs/manual.texi +++ b/Docs/manual.texi @@ -39264,10 +39264,12 @@ likely it is that we can fix the problem! * C API datatypes:: C API Datatypes * C API function overview:: C API Function Overview * C API functions:: C API Function Descriptions -* C Thread functions:: +* C Thread functions:: C Thread Functions +* C Embedded Server functions:: C Embedded Server Functions * C API problems:: Common questions and problems when using the C API * Building clients:: Building Client Programs * Threaded clients:: How to Make a Threaded Client +* libmysqld:: libmysqld, the Embedded MySQL Server Library @end menu The C API code is distributed with MySQL. It is included in the @@ -39307,8 +39309,10 @@ The MySQL server shrinks each communication buffer to the buffer associated with a connection is not decreased until the connection is closed, at which time client memory is reclaimed. -For programming with threads, consult the 'how to make a thread-safe -client' chapter. @xref{Threaded clients}. +For programming with threads, see @ref{Threaded clients}. +For creating a stand-alone application which includes the +"server" and "client" in the same program (and does not +communicate with an external MySQL server), see @ref{libmysqld}. @node C API datatypes, C API function overview, C, C @@ -39649,8 +39653,8 @@ Retrieves a complete result set to the client. @item @strong{mysql_thread_id()} @tab Returns the current thread ID. -@item @strong{mysql_thread_save()} @tab -Returns 1 if the clients are compiled as thread-safe. +@item @strong{mysql_thread_safe()} @tab +Returns 1 if the clients are compiled as thread safe. @item @strong{mysql_use_result()} @tab Initiates a row-by-row result set retrieval. @@ -40674,7 +40678,6 @@ of @code{mysql_field_count()} whether or not the statement was a @code{MYSQL_FIELD_OFFSET mysql_field_seek(MYSQL_RES *result, MYSQL_FIELD_OFFSET offset)} -* Threaded clients:: How to Make a Threaded Client @subsubheading Description Sets the field cursor to the given offset. The next call to @@ -41956,19 +41959,19 @@ The connection to the server was lost during the query. An unknown error occurred. @end table -@node C Thread functions, C API problems, C API functions, C +@node C Thread functions, C Embedded Server functions, C API functions, C @subsection C Threaded Function Descriptions You need to use the following functions when you want to create a threaded client. @xref{Threaded clients}. @menu -* my_init:: -* my_thread_init():: -* my_thread_end():: +* my_init():: @code{my_init()} +* mysql_thread_init():: @code{mysql_thread_init()} +* mysql_thread_end():: @code{mysql_thread_end()} @end menu -@node my_init, my_thread_init(), C Thread functions, C Thread functions +@node my_init(), mysql_thread_init(), C Thread functions, C Thread functions @subsubsection @code{my_init()} @findex @code{my_init()} @@ -41977,20 +41980,20 @@ threaded client. @xref{Threaded clients}. This function needs to be called once in the program before calling any MySQL function. This initializes some global variables that MySQL -needs. If you are using a thread safe client library, this will also -call @code{my_thread_init()} for this thread. +needs. If you are using a thread-safe client library, this will also +call @code{mysql_thread_init()} for this thread. -This is automatically called by @code{mysql_init()} -and @code{mysql_connect()}. +This is automatically called by @code{mysql_init()}, +@code{mysql_server_init()} and @code{mysql_connect()}. @subsubheading Return Values none. -@node my_thread_init(), my_thread_end(), my_init, C Thread functions -@subsubsection @code{my_thread_init()} +@node mysql_thread_init(), mysql_thread_end(), my_init(), C Thread functions +@subsubsection @code{mysql_thread_init()} -@findex @code{my_thread_init()} +@findex @code{mysql_thread_init()} @subsubheading Description @@ -42003,24 +42006,115 @@ This is automatically called by @code{my_init()} and @code{mysql_connect()}. none. -@node my_thread_end(), , my_thread_init(), C Thread functions -@subsubsection @code{my_thread_end()} +@node mysql_thread_end(), , mysql_thread_init(), C Thread functions +@subsubsection @code{mysql_thread_end()} -@findex @code{my_thread_end()} +@findex @code{mysql_thread_end()} @subsubheading Description This function needs to be called before calling @code{pthread_exit()} to -freed memory allocated by @code{my_thread_init()}. +free memory allocated by @code{mysql_thread_init()}. -Note that this function is NOT invoked automatically by the client -library! +Note that this function @strong{is not invoked automatically} by the client +library. It must be called explicitly to avoid a memory leak. @subsubheading Return Values none. -@node C API problems, Building clients, C Thread functions, C +@node C Embedded Server functions, C API problems, C Thread functions, C +@subsection C Embedded Server Function Descriptions + +You must use the following functions if you want to allow your +application to be linked against the embedded MySQL server library. +@xref{libmysqld}. + +If the program is linked with @code{-lmysqlclient} instead of +@code{-lmysqld}, these functions do nothing. This makes it +possible to choose between using the embedded MySQL server and +a stand-alone server without modifying any code. + +@menu +* mysql_server_init():: +* mysql_server_end():: +@end menu + +@node mysql_server_init(), mysql_server_end(), C Embedded Server functions, C Embedded Server functions +@subsubsection @code{mysql_server_init()} + +@findex @code{mysql_server_init()} + +@code{void mysql_server_init(int argc, const char **argv, const char **groups)} + +@subsubheading Description + +This function @strong{must} be called once in the program before +calling any other MySQL function. It starts up the server and +initializes any subsystems (@code{mysys}, InnoDB, etc.) that the +server uses. If this function is not called, the program will +crash. + +The @code{argc} and @code{argv} arguments are analogous to the +arguments to @code{main()}. The first element of @code{argv} +is ignored (it typically contains the program name). For +convenience, @code{argc} may be @code{0} (zero) if there are no +command-line arguments for the server. + +The @code{NULL}-terminated list of strings in @code{groups} +selects which groups in the option files will be active. +@xref{Option files}. For convenience, @code{groups} may be +@code{NULL}, in which case the @code{[server]} group will be +active. + +@subsubheading Example + +@example +#include <mysql.h> +#include <stdlib.h> + +static char *server_args[] = @{ + "this_program", /* this string is not used */ + "--datadir=.", + "--set-variable=key_buffer_size=32M" +@}; +static char *server_groups[] = @{ + "server", + "this_program_SERVER", + (char *)NULL +@}; + +int main(void) @{ + mysql_server_init(sizeof(server_args) / sizeof(char *), + server_args, server_groups); + + /* Use any MySQL API functions here */ + + mysql_server_end(); + + return EXIT_SUCCESS; +@} +@end example + +@subsubheading Return Values + +none. + +@node mysql_server_end(), , mysql_server_init(), C Embedded Server functions +@subsubsection @code{mysql_server_end()} + +@findex @code{mysql_server_end()} + +@subsubheading Description + +This function @strong{must} be called once in the program after +all other MySQL functions. It shuts down the embedded server. + +@subsubheading Return Values + +none. + +@node C API problems, Building clients, C Embedded Server functions, C @subsection Common questions and problems when using the C API @tindex @code{mysql_query()} @@ -42196,7 +42290,7 @@ For clients that use MySQL header files, you may need to specify a files. -@node Threaded clients, , Building clients, C +@node Threaded clients, libmysqld , Building clients, C @subsection How to Make a Threaded Client @cindex clients, threaded @@ -42232,7 +42326,7 @@ interrupts, you can make great use of the routines in the @code{my_init()} first! @xref{C Thread functions}. All functions except @code{mysql_real_connect()} are by default -thread safe. The following notes describe how to compile a thread safe +thread safe. The following notes describe how to compile a thread-safe client library and use it in a thread-safe manner. (The notes below for @code{mysql_real_connect()} actually apply to @code{mysql_connect()} as well, but because @code{mysql_connect()} is deprecated, you should be @@ -42296,10 +42390,10 @@ The get things to work smoothly you have to do the following: Call @code{my_init()} at the start of your program if it calls any other MySQL function before calling @code{mysql_real_connect()}. @item -Call @code{my_thread_init()} in the thread handler before calling +Call @code{mysql_thread_init()} in the thread handler before calling any MySQL function. @item -In the thread, call @code{my_thread_end()} before calling +In the thread, call @code{mysql_thread_end()} before calling @code{pthread_exit()}. This will free the memory used by MySQL thread specific variables. @end enumerate @@ -42308,6 +42402,383 @@ You may get some errors because of undefined symbols when linking your client with @code{mysqlclient_r}. In most cases this is because you haven't included the thread libraries on the link/compile line. +@node libmysqld, , Threaded clients, C +@subsection libmysqld, the Embedded MySQL Server Library + +@cindex libmysqld +@cindex embedded MySQL server library + +@menu +* libmysqld overview:: Overview of the Embedded MySQL Server Library +* libmysqld compiling:: Compiling Programs with @code{libmysqld} +* libmysqld example:: A Simple Embedded Server Example +* libmysqld licensing:: Licensing the Embedded Server +@end menu + +@node libmysqld overview, libmysqld compiling, libmysqld, libmysqld +@subsubsection Overview of the Embedded MySQL Server Library + +The embedded MySQL server library makes it possible to run a +full-featured MySQL server inside the client application. The +main benefits are increased speed and more simple management for +embedded applications. + +@node libmysqld compiling, libmysqld example, libmysqld overview, libmysqld +@subsubsection Compiling Programs with @code{libmysqld} + +Currently, all of the support libraries must be explicitly +listed when linking with @code{-lmysqld}. In the future, +@code{mysql_config --libmysqld-libs} will name the libraries to +make this easier. Also, all of the supporting libraries will +probably be incorporated into libmysqld at some time to simplify +this even more. + +The correct flags for compiling and linking a threaded program +must be used, even if you do not directly call any thread +functions in your code. + +@node libmysqld example, libmysqld licensing, libmysqld compiling, libmysqld +@subsubsection A Simple Embedded Server Example + +This example program and makefile should work without any +changes on a Linux or FreeBSD system. For other operating +systems, minor changes will be needed. This example is +designed to give enough details to understand the problem, +without the clutter that is a necessary part of a real +application. + +To try out the example, create an @file{example} directory +at the same level as the mysql-4.0 source directory. Save +the @file{example.c} source and the @file{GNUmakefile} in the +directory, and run GNU @file{make} from inside the @file{example} +directory. + +@file{example.c} +@example +/* + * A simple example client, using the embedded MySQL server library + */ + +#include <mysql.h> +#include <stdarg.h> +#include <stdio.h> +#include <stdlib.h> + +enum on_error @{ E_okay, E_warn, E_fail @}; + +static void die(MYSQL *db, char *fmt, ...); +MYSQL *db_connect(const char *dbname); +void db_disconnect(MYSQL *db); +void db_do_query(MYSQL *db, const char *query, enum on_error on_error); + +const char *server_groups[] = @{ "test_client_SERVER", "server", NULL @}; + +int +main(int argc, char **argv) +@{ + MYSQL *one, *two; + + /* This must be called before any other mysql functions. + * + * You can use mysql_server_init(0, NULL, NULL), and it will + * initialize the server using groups = @{ "server", NULL @}. + * + * In your $HOME/.my.cnf file, you probably want to put: + +[test_client_SERVER] +language = /path/to/source/of/mysql/sql/share/english + + * You could, of course, modify argc and argv before passing + * them to this function. Or you could create new ones in any + * way you like. But all of the arguments in argv (except for + * argv[0], which is the program name) should be valid options + * for the MySQL server. + * + * If you link this client against the normal mysqlclient + * library, this function is just a stub that does nothing. + */ + mysql_server_init(argc, argv, server_groups); + + one = db_connect("test"); + two = db_connect(NULL); + + db_do_query(one, "show table status", E_fail); + db_do_query(two, "show databases", E_fail); + + mysql_close(two); + mysql_close(one); + + /* This must be called after all other mysql functions */ + mysql_server_end(); + + exit(EXIT_SUCCESS); +@} + +void +die(MYSQL *db, char *fmt, ...) +@{ + va_list ap; + va_start(ap, fmt); + vfprintf(stderr, fmt, ap); + va_end(ap); + putc('\n', stderr); + if (db) + db_disconnect(db); + exit(EXIT_FAILURE); +@} + +MYSQL * +db_connect(const char *dbname) +@{ + MYSQL *db = mysql_init(NULL); + if (!db) + die(db, "mysql_init failed: no memory"); + mysql_options(db, MYSQL_READ_DEFAULT_GROUP, "simple"); + if (!mysql_real_connect(db, NULL, NULL, NULL, dbname, 0, NULL, 0)) + die(db, "mysql_real_connect failed: %s", mysql_error(db)); + + return db; +@} + +void +db_disconnect(MYSQL *db) +@{ + mysql_close(db); +@} + +/* + * show_query: this code is snagged from mysql.cc; this function + * is intended to be used internally to db_do_query() + */ +static char * +show_query(MYSQL *db) +@{ + MYSQL_RES *res; + MYSQL_FIELD *field; + MYSQL_ROW row; + char sep[256], *psep = sep; + char *is_num = 0; + char *err = 0; + unsigned int length = 1; /* initial "|" */ + unsigned int off; + + if (!(res = mysql_store_result(db))) + return mysql_error(db); + + if (!(is_num = malloc(mysql_num_fields(res)))) + @{ + err = "out of memory"; + goto err; + @} + + /* set up */ + *psep++ = '+'; + while ((field = mysql_fetch_field(res))) + @{ + unsigned int len = strlen(field->name); + if (len < field->max_length) + len = field->max_length; + if (len < 2 && !IS_NOT_NULL(field->flags)) + len = 2; /* \N */ + field->max_length = len + 1; /* bending the API... */ + len += 2; length += len + 1; /* " " before, " |" after */ + if (length >= 255) + @{ + err = "row too long"; + goto err; + @} + memset(psep, '-', len); psep += len; + *psep++ = '+'; + *psep = '\0'; + @} + + /* column headings */ + puts(sep); + mysql_field_seek(res,0); + fputc('|',stdout); + for (off=0; (field = mysql_fetch_field(res)) ; off++) + @{ + printf(" %-*s|",field->max_length, field->name); + is_num[off]= IS_NUM(field->type); + @} + fputc('\n',stdout); + puts(sep); + + /* rows */ + while ((row = mysql_fetch_row(res))) + @{ + (void) fputs("|",stdout); + mysql_field_seek(res,0); + for (off=0 ; off < mysql_num_fields(res); off++) + @{ + field = mysql_fetch_field(res); + printf(is_num[off] ? "%*s |" : " %-*s|", + field->max_length, row[off] ? (char*) row[off] : "NULL"); + @} + (void) fputc('\n',stdout); + @} + puts(sep); + +err: + if (is_num) + free(is_num); + mysql_free_result(res); + + return err; +@} + +void +db_do_query(MYSQL *db, const char *query, enum on_error on_error) +@{ + char *err = 0; + if (mysql_query(db, query) != 0) + goto err; + + if (mysql_field_count(db) > 0) + @{ + if ((err = show_query(db))) + goto err; + @} + else if (mysql_affected_rows(db)) + printf("Affected rows: %lld [%s]\n", mysql_affected_rows(db), query); + + return; + +err: + switch (on_error) @{ + case E_okay: + break; + case E_warn: + fprintf(stderr, "db_do_query failed: %s [%s]\n", + err ? err : mysql_error(db), query); + break; + case E_fail: + die(db, "db_do_query failed: %s [%s]", + err ? err : mysql_error(db), query); + break; + @} +@} +@end example + +@file{GNUmakefile} +@example +# Set this to your mysql source directory +m := ../mysql-4.0 + +CC := cc +CPPFLAGS := -I$m/include -D_THREAD_SAFE -D_REENTRANT +CFLAGS := -g -W -Wall +LDFLAGS := -static +LDLIBS = $(embed_libs) -lz -lm -lcrypt + +ifneq (,$(shell grep FreeBSD /COPYRIGHT 2>/dev/null)) +# FreeBSD +LDFLAGS += -pthread +else +# Assume Linux +LDLIBS += -lpthread +endif + + +# Standard libraries + +embed_libs := \ + $m/libmysqld/.libs/libmysqld.a \ + $m/isam/libnisam.a \ + $m/myisam/libmyisam.a \ + $m/heap/libheap.a \ + $m/merge/libmerge.a \ + $m/myisammrg/libmyisammrg.a + + +# Optionally-built libraries + +ifneq (,$(shell test -r $m/innobase/usr/libusr.a && echo "yes")) +embed_libs += \ + $m/innobase/usr/libusr.a \ + $m/innobase/odbc/libodbc.a \ + $m/innobase/srv/libsrv.a \ + $m/innobase/que/libque.a \ + $m/innobase/srv/libsrv.a \ + $m/innobase/dict/libdict.a \ + $m/innobase/ibuf/libibuf.a \ + $m/innobase/row/librow.a \ + $m/innobase/pars/libpars.a \ + $m/innobase/btr/libbtr.a \ + $m/innobase/trx/libtrx.a \ + $m/innobase/read/libread.a \ + $m/innobase/usr/libusr.a \ + $m/innobase/buf/libbuf.a \ + $m/innobase/ibuf/libibuf.a \ + $m/innobase/eval/libeval.a \ + $m/innobase/log/liblog.a \ + $m/innobase/fsp/libfsp.a \ + $m/innobase/fut/libfut.a \ + $m/innobase/fil/libfil.a \ + $m/innobase/lock/liblock.a \ + $m/innobase/mtr/libmtr.a \ + $m/innobase/page/libpage.a \ + $m/innobase/rem/librem.a \ + $m/innobase/thr/libthr.a \ + $m/innobase/com/libcom.a \ + $m/innobase/sync/libsync.a \ + $m/innobase/data/libdata.a \ + $m/innobase/mach/libmach.a \ + $m/innobase/ha/libha.a \ + $m/innobase/dyn/libdyn.a \ + $m/innobase/mem/libmem.a \ + $m/innobase/sync/libsync.a \ + $m/innobase/ut/libut.a \ + $m/innobase/os/libos.a \ + $m/innobase/ut/libut.a +endif + +ifneq (,$(shell test -r $m/bdb/build_unix/libdb.a && echo "yes")) +embed_libs += $m/bdb/build_unix/libdb.a +endif + + +# Support libraries + +embed_libs += \ + $m/mysys/libmysys.a \ + $m/strings/libmystrings.a \ + $m/dbug/libdbug.a \ + $m/regex/libregex.a + + +# Optionally built support libraries + +ifneq (,$(shell test -r $m/readline/libreadline.a && echo "yes")) +embed_libs += $m/readline/libreadline.a +endif + +# This works for simple one-file test programs +sources := $(wildcard *.c) +objects := $(patsubst %c,%o,$(sources)) +targets := $(basename $(sources)) + +all: $(targets) + +clean: + rm -f $(targets) $(objects) *.core +@end example + +@node libmysqld licensing, , libmysqld example, libmysqld +@subsubsection Licensing the Embedded Server + +The MySQL source code is covered by the GNU GPL license +(@pxref{GPL license}). One result of this is that any program +which includes, by linking with @code{libmysqld}, the MySQL +source code must be released as free software (under a license +compatible with the GPL). + +We encourage everyone to promote free software by releasing +code under the GPL or a compatible license. For those who +are not able to do this, another option is to purchase the +MySQL code from MySQL AB under a looser license. For details +concerning this issue, please see @ref{Licensing policy}. + @node Cplusplus, Java, C, Clients @section MySQL C++ APIs @@ -45773,7 +46244,7 @@ Python interface for MySQL. By Joseph Skinner @email{joe@@earthlight.co.nz}. Mod @item @uref{http://www.mysql.com/Downloads/Contrib/MySQL-python-0.3.0.tar.gz, MySQL-python-0.3.0.tar.gz} MySQLdb Python is an DB-API v2.0-compliant interface to MySQL. Transactions are supported if the server and tables support them. It is -thread-safe, and contains a compatibility module for older code +thread safe, and contains a compatibility module for older code written for the no-longer-maintained MySQLmodule interface. @item @uref{http://www.mysql.com/Downloads/Contrib/mysql_mex_12.tar.gz, mysql_mex_1_12.tar.gz} @@ -46957,6 +47428,15 @@ Our TODO section contains what we plan to have in 4.0. @xref{TODO MySQL 4.0}. @itemize @bullet @item +Added documentation for @code{libmysqld}, the embedded +MySQL server library. Also added example programs (a +@code{mysql} client and @code{mysqltest} test program) which use +@code{libmysqld}. +@item +Removed @code{my_thread_init()} and @code{my_thread_end()} +from mysql_com.h, and added @code{mysql_thread_init()} and +@code{mysql_thread_end()} to mysql.h. +@item Fixed handling of big unsigned bigint constants. @item New character set @code{latin_de} which provides correct German sorting. @@ -47117,12 +47597,6 @@ not yet 100% confident in this code. @appendixsubsec Changes in release 3.23.43 @itemize @bullet @item -Fixed a unlikely core-dump bug when doing @code{EXPLAIN SELECT} when using -many tables and @code{ORDER BY}. -@item -Fixed bug in @code{LOAD DATA FROM MASTER} when using table with -@code{CHECKSUM=1}. -@item Added unique error message when one gets a DEADLOCK during a transaction with BDB tables. @item |