Commit ac5ae1a9 authored by tim@work.mysql.com's avatar tim@work.mysql.com

New documentation about the embedded MySQL server library.

parent 961b6933
...@@ -39264,10 +39264,12 @@ likely it is that we can fix the problem! ...@@ -39264,10 +39264,12 @@ likely it is that we can fix the problem!
* C API datatypes:: C API Datatypes * C API datatypes:: C API Datatypes
* C API function overview:: C API Function Overview * C API function overview:: C API Function Overview
* C API functions:: C API Function Descriptions * 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 * C API problems:: Common questions and problems when using the C API
* Building clients:: Building Client Programs * Building clients:: Building Client Programs
* Threaded clients:: How to Make a Threaded Client * Threaded clients:: How to Make a Threaded Client
* libmysqld:: libmysqld, the Embedded MySQL Server Library
@end menu @end menu
The C API code is distributed with MySQL. It is included in the 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 ...@@ -39307,8 +39309,10 @@ The MySQL server shrinks each communication buffer to
the buffer associated with a connection is not decreased until the connection the buffer associated with a connection is not decreased until the connection
is closed, at which time client memory is reclaimed. is closed, at which time client memory is reclaimed.
For programming with threads, consult the 'how to make a thread-safe For programming with threads, see @ref{Threaded clients}.
client' chapter. @xref{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 @node C API datatypes, C API function overview, C, C
...@@ -39649,8 +39653,8 @@ Retrieves a complete result set to the client. ...@@ -39649,8 +39653,8 @@ Retrieves a complete result set to the client.
@item @strong{mysql_thread_id()} @tab @item @strong{mysql_thread_id()} @tab
Returns the current thread ID. Returns the current thread ID.
@item @strong{mysql_thread_save()} @tab @item @strong{mysql_thread_safe()} @tab
Returns 1 if the clients are compiled as thread-safe. Returns 1 if the clients are compiled as thread safe.
@item @strong{mysql_use_result()} @tab @item @strong{mysql_use_result()} @tab
Initiates a row-by-row result set retrieval. Initiates a row-by-row result set retrieval.
...@@ -40674,7 +40678,6 @@ of @code{mysql_field_count()} whether or not the statement was a ...@@ -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)} @code{MYSQL_FIELD_OFFSET mysql_field_seek(MYSQL_RES *result, MYSQL_FIELD_OFFSET offset)}
* Threaded clients:: How to Make a Threaded Client
@subsubheading Description @subsubheading Description
Sets the field cursor to the given offset. The next call to 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. ...@@ -41956,19 +41959,19 @@ The connection to the server was lost during the query.
An unknown error occurred. An unknown error occurred.
@end table @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 @subsection C Threaded Function Descriptions
You need to use the following functions when you want to create a You need to use the following functions when you want to create a
threaded client. @xref{Threaded clients}. threaded client. @xref{Threaded clients}.
@menu @menu
* my_init:: * my_init():: @code{my_init()}
* my_thread_init():: * mysql_thread_init():: @code{mysql_thread_init()}
* my_thread_end():: * mysql_thread_end():: @code{mysql_thread_end()}
@end menu @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()} @subsubsection @code{my_init()}
@findex @code{my_init()} @findex @code{my_init()}
...@@ -41977,20 +41980,20 @@ threaded client. @xref{Threaded clients}. ...@@ -41977,20 +41980,20 @@ threaded client. @xref{Threaded clients}.
This function needs to be called once in the program before calling any This function needs to be called once in the program before calling any
MySQL function. This initializes some global variables that MySQL MySQL function. This initializes some global variables that MySQL
needs. If you are using a thread safe client library, this will also needs. If you are using a thread-safe client library, this will also
call @code{my_thread_init()} for this thread. call @code{mysql_thread_init()} for this thread.
This is automatically called by @code{mysql_init()} This is automatically called by @code{mysql_init()},
and @code{mysql_connect()}. @code{mysql_server_init()} and @code{mysql_connect()}.
@subsubheading Return Values @subsubheading Return Values
none. none.
@node my_thread_init(), my_thread_end(), my_init, C Thread functions @node mysql_thread_init(), mysql_thread_end(), my_init(), C Thread functions
@subsubsection @code{my_thread_init()} @subsubsection @code{mysql_thread_init()}
@findex @code{my_thread_init()} @findex @code{mysql_thread_init()}
@subsubheading Description @subsubheading Description
...@@ -42003,24 +42006,115 @@ This is automatically called by @code{my_init()} and @code{mysql_connect()}. ...@@ -42003,24 +42006,115 @@ This is automatically called by @code{my_init()} and @code{mysql_connect()}.
none. none.
@node my_thread_end(), , my_thread_init(), C Thread functions @node mysql_thread_end(), , mysql_thread_init(), C Thread functions
@subsubsection @code{my_thread_end()} @subsubsection @code{mysql_thread_end()}
@findex @code{my_thread_end()} @findex @code{mysql_thread_end()}
@subsubheading Description @subsubheading Description
This function needs to be called before calling @code{pthread_exit()} to 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 @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 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
Note that this function is NOT invoked automatically by the client This function @strong{must} be called once in the program after
library! all other MySQL functions. It shuts down the embedded server.
@subsubheading Return Values @subsubheading Return Values
none. none.
@node C API problems, Building clients, C Thread functions, C @node C API problems, Building clients, C Embedded Server functions, C
@subsection Common questions and problems when using the C API @subsection Common questions and problems when using the C API
@tindex @code{mysql_query()} @tindex @code{mysql_query()}
...@@ -42196,7 +42290,7 @@ For clients that use MySQL header files, you may need to specify a ...@@ -42196,7 +42290,7 @@ For clients that use MySQL header files, you may need to specify a
files. files.
@node Threaded clients, , Building clients, C @node Threaded clients, libmysqld , Building clients, C
@subsection How to Make a Threaded Client @subsection How to Make a Threaded Client
@cindex clients, threaded @cindex clients, threaded
...@@ -42232,7 +42326,7 @@ interrupts, you can make great use of the routines in the ...@@ -42232,7 +42326,7 @@ interrupts, you can make great use of the routines in the
@code{my_init()} first! @xref{C Thread functions}. @code{my_init()} first! @xref{C Thread functions}.
All functions except @code{mysql_real_connect()} are by default 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 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 @code{mysql_real_connect()} actually apply to @code{mysql_connect()} as
well, but because @code{mysql_connect()} is deprecated, you should be 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: ...@@ -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 Call @code{my_init()} at the start of your program if it calls
any other MySQL function before calling @code{mysql_real_connect()}. any other MySQL function before calling @code{mysql_real_connect()}.
@item @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. any MySQL function.
@item @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 @code{pthread_exit()}. This will free the memory used by MySQL thread
specific variables. specific variables.
@end enumerate @end enumerate
...@@ -42308,6 +42402,383 @@ You may get some errors because of undefined symbols when linking your ...@@ -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 client with @code{mysqlclient_r}. In most cases this is because you haven't
included the thread libraries on the link/compile line. 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 @node Cplusplus, Java, C, Clients
@section MySQL C++ APIs @section MySQL C++ APIs
...@@ -45773,7 +46244,7 @@ Python interface for MySQL. By Joseph Skinner @email{joe@@earthlight.co.nz}. Mod ...@@ -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} @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 MySQLdb Python is an DB-API v2.0-compliant interface to MySQL. Transactions
are supported if the server and tables support them. It is 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. 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} @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}. ...@@ -46957,6 +47428,15 @@ Our TODO section contains what we plan to have in 4.0. @xref{TODO MySQL 4.0}.
@itemize @bullet @itemize @bullet
@item @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. Fixed handling of big unsigned bigint constants.
@item @item
New character set @code{latin_de} which provides correct German sorting. New character set @code{latin_de} which provides correct German sorting.
...@@ -47117,12 +47597,6 @@ not yet 100% confident in this code. ...@@ -47117,12 +47597,6 @@ not yet 100% confident in this code.
@appendixsubsec Changes in release 3.23.43 @appendixsubsec Changes in release 3.23.43
@itemize @bullet @itemize @bullet
@item @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 Added unique error message when one gets a DEADLOCK during a transaction with
BDB tables. BDB tables.
@item @item
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment