BuildDarkFlame/_deps/mysql-src/include/mysqlx/xapi.h

3547 lines
105 KiB
C
Raw Normal View History

2022-01-02 18:29:32 -06:00
/*
* Copyright (c) 2016, 2020, Oracle and/or its affiliates.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License, version 2.0, as
* published by the Free Software Foundation.
*
* This program is also distributed with certain software (including
* but not limited to OpenSSL) that is licensed under separate terms,
* as designated in a particular file or component or in included license
* documentation. The authors of MySQL hereby grant you an
* additional permission to link the program and your derivative works
* with the separately licensed software that they have included with
* MySQL.
*
* Without limiting anything contained in the foregoing, this file,
* which is part of MySQL Connector/C++, is also subject to the
* Universal FOSS Exception, version 1.0, a copy of which can be found at
* http://oss.oracle.com/licenses/universal-foss-exception.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU General Public License, version 2.0, for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
/**
@defgroup xapi X DevAPI for C
Functions and types defined by X DevAPI for C. See @ref xapi_ref for introduction.
@{
@defgroup xapi_sess Session operations
@defgroup xapi_coll Statements operating on document collections
@defgroup xapi_tbl Statements operating on tables
@defgroup xapi_sql SQL execution
@defgroup xapi_ddl DDL statements
@note To create a table or a view, use reqular SQL statement.
@defgroup xapi_stmt Statement execution
@defgroup xapi_res Result processing
@defgroup xapi_md Meta data access
@defgroup xapi_diag Diagnostics
@}
*/
/**
@file
The main header for MySQL Connector/C++ X DevAPI for C.
This header should be included by C and C++ code which uses the X DevAPI
for C implemented by MySQL Connector/C++
@ingroup xapi
*/
#ifndef MYSQL_XAPI_H
#define MYSQL_XAPI_H
#ifdef __cplusplus
extern "C" {
#endif
#include "common_constants.h"
#include "common/api.h"
#include <stdlib.h>
#include <stdint.h>
#include <stdbool.h>
/**
@addtogroup xapi
@{
*/
// FIXME
#define STDCALL
///////////////////// COMMON TYPE DECLARATIONS, REMOVE LATER
typedef char object_id[16];
typedef object_id* MYSQLX_GUID;
/** Return value indicating function/operation success. */
#define RESULT_OK 0
/**
Return value flag indicating that the last reading operation
did not finish reading to the end and there is still more data
to be fetched by functions such as mysqlx_get_bytes()
*/
#define RESULT_MORE_DATA 8
/**
Return value flag indicating end of data items (documents or
rows) in a query result. This is used by functions which iterate
over result data.
*/
#define RESULT_NULL 16
/**
Return value flag indicating that operation generated
information diagnostic entries.
*/
#define RESULT_INFO 32
/** Return value flag indicating that operation generated warnings. */
#define RESULT_WARNING 64
/** Return value flag indicating function/operation error. */
#define RESULT_ERROR 128
#define MYSQLX_MAX_ERROR_LEN 255
#define MYSQLX_NULL_TERMINATED 0xFFFFFFFF
#define MYSQLX_ERR_UNKNOWN 0xFFFF
#define MYSQLX_COLLATION_UNDEFINED 0
/*
Error codes
*/
#define MYSQLX_ERROR_INDEX_OUT_OF_RANGE 1
/*
Error messages
*/
#define MYSQLX_ERROR_INDEX_OUT_OF_RANGE_MSG "Index is out of range"
#define MYSQLX_ERROR_MISSING_SCHEMA_NAME_MSG "Missing schema name"
#define MYSQLX_ERROR_MISSING_TABLE_NAME_MSG "Missing table name"
#define MYSQLX_ERROR_MISSING_VIEW_NAME_MSG "Missing view name"
#define MYSQLX_ERROR_MISSING_COLLECTION_NAME_MSG "Missing collection name"
#define MYSQLX_ERROR_MISSING_COLLECTION_OPT_MSG "Missing collection options"
#define MYSQLX_ERROR_MISSING_VIEW_NAME_MSG "Missing view name"
#define MYSQLX_ERROR_MISSING_KEY_NAME_MSG "Missing key name"
#define MYSQLX_ERROR_MISSING_HOST_NAME "Missing host name"
#define MYSQLX_ERROR_MISSING_SOCKET_NAME "Missing socket name"
#define MYSQLX_ERROR_MISSING_CONN_INFO "Missing connecting information"
#define MYSQLX_ERROR_HANDLE_NULL_MSG "Handle cannot be NULL"
#define MYSQLX_ERROR_VIEW_INVALID_STMT_TYPE "Invalid statement type for View. Only SELECT type is supported"
#define MYSQLX_ERROR_VIEW_TYPE_MSG "Statement must be of VIEW type"
#define MYSQLX_ERROR_OUTPUT_BUFFER_NULL "The output buffer cannot be NULL"
#define MYSQLX_ERROR_OUTPUT_BUFFER_ZERO "The output buffer cannot have zero length"
#define MYSQLX_ERROR_OUTPUT_VARIABLE_NULL "The output variable cannot be NULL"
#define MYSQLX_ERROR_OP_NOT_SUPPORTED "The operation is not supported by the function"
#define MYSQLX_ERROR_WRONG_SSL_MODE "Wrong value for SSL Mode"
#define MYSQLX_ERROR_NO_TLS_SUPPORT "Can not create TLS session - this connector is built without TLS support"
#define MYSQLX_ERROR_MIX_PRIORITY "Mixing hosts with and without priority is not allowed"
#define MYSQLX_ERROR_DUPLICATED_OPTION "Option already defined"
#define MYSQLX_ERROR_MAX_PRIORITY "Priority should be a value between 0 and 100"
#define MYSQLX_ERROR_AUTH_METHOD "Unknown authentication method"
#define MYSQLX_ERROR_ROW_LOCKING "Row locking is supported only for SELECT and FIND"
#define MYSQLX_ERROR_WRONG_LOCKING_MODE "Wrong value for the row locking mode"
#define MYSQLX_ERROR_WRONG_EXPRESSION "Expression could not be parsed"
#define MYSQLX_ERROR_EMPTY_JSON "Empty JSON document string"
/* Opaque structures*/
/**
Type of error handles.
Error handles give access to diagnostic information from the session
and statement operations.
@see mysqlx_error()
*/
typedef struct mysqlx_error_struct mysqlx_error_t;
/**
Type of session handles.
@see mysqlx_get_session()
*/
typedef struct mysqlx_session_struct mysqlx_session_t;
/**
Type of client handles.
@see mysqlx_get_client()
*/
typedef struct mysqlx_client_struct mysqlx_client_t;
/**
Type of handles for session configuration data.
Session can be created using previously prepared session configuration
data. New configuration data is allocated by `mysqlx_session_options_new()`
and can be manipulated using related functions.
@see mysqlx_get_session_from_options(), mysqlx_session_options_new(),
mysqlx_session_option_set(), mysqlx_free().
*/
typedef struct mysqlx_session_options_struct mysqlx_session_options_t;
/**
Type of handles for collection create/modify options.
@see mysqlx_collection_options_new(), mysqlx_collection_options_set(),
mysqlx_free().
*/
typedef struct mysqlx_collection_options_struct mysqlx_collection_options_t;
/**
Type of database schema handles.
@see mysqlx_get_schema()
*/
typedef struct mysqlx_schema_struct mysqlx_schema_t;
/**
Type of collection handles.
@see mysqlx_get_collection()
*/
typedef struct mysqlx_collection_struct mysqlx_collection_t;
/**
Type of table handles.
@see mysqlx_get_table()
*/
typedef struct mysqlx_table_struct mysqlx_table_t;
/**
Type of statement handles.
Some X DevAPI for C functions create statements without executing them. These
functions return a statement handle which can be used to define statement
properties and then execute it.
@see mysqlx_sql_new(), mysqlx_table_select_new(), mysqlx_table_insert_new(),
mysqlx_table_update_new(), mysqlx_table_delete_new(),
mysqlx_collection_find_new(), mysqlx_collection_modify_new(),
mysqlx_collection_add_new(), mysqlx_collection_remove_new()
*/
typedef struct mysqlx_stmt_struct mysqlx_stmt_t;
typedef struct Mysqlx_diag_base mysqlx_object_t;
/**
Type of row handles.
@see mysqlx_row_fetch_one()
*/
typedef struct mysqlx_row_struct mysqlx_row_t;
/**
Type of result handles.
Functions which produce results return a result handle which is
then used to examine the result.
@see mysqlx_execute(), mysqlx_store_result(), mysqlx_row_fetch_one(),
mysqlx_json_fetch_one(), mysqlx_next_result())
*/
typedef struct mysqlx_result_struct mysqlx_result_t;
/**
The data type identifiers used in MYSQLX API.
*/
typedef enum mysqlx_data_type_enum
{
MYSQLX_TYPE_UNDEFINED = 0,
/* Column types as defined in protobuf (mysqlx_resultset.proto)*/
MYSQLX_TYPE_SINT = 1, /**< 64-bit signed integer number type*/
MYSQLX_TYPE_UINT = 2, /**< 64-bit unsigned integer number type*/
MYSQLX_TYPE_DOUBLE = 5, /**< Floating point double number type*/
MYSQLX_TYPE_FLOAT = 6, /**< Floating point float number type*/
MYSQLX_TYPE_BYTES = 7, /**< Bytes array type*/
MYSQLX_TYPE_TIME = 10, /**< Time type*/
MYSQLX_TYPE_DATETIME = 12,/**< Datetime type*/
MYSQLX_TYPE_SET = 15, /**< Set type*/
MYSQLX_TYPE_ENUM = 16,/**< Enum type*/
MYSQLX_TYPE_BIT = 17, /**< Bit type*/
MYSQLX_TYPE_DECIMAL = 18,/**< Decimal type*/
/* Column types from DevAPI (no number constants assigned, just names)*/
MYSQLX_TYPE_BOOL = 19,/**< Bool type*/
MYSQLX_TYPE_JSON = 20,/**< JSON type*/
MYSQLX_TYPE_STRING = 21,/**< String type*/
MYSQLX_TYPE_GEOMETRY = 22,/**< Geometry type*/
MYSQLX_TYPE_TIMESTAMP= 23,/**< Timestamp type*/
MYSQLX_TYPE_NULL = 100, /**< NULL value*/
MYSQLX_TYPE_EXPR = 101 /**< Expression type*/
} mysqlx_data_type_t;
#define PARAM_SINT(A) (void*)MYSQLX_TYPE_SINT, (int64_t)A
#define PARAM_UINT(A) (void*)MYSQLX_TYPE_UINT, (uint64_t)A
#define PARAM_FLOAT(A) (void*)MYSQLX_TYPE_FLOAT, (double)A
#define PARAM_DOUBLE(A) (void*)MYSQLX_TYPE_DOUBLE, (double)A
#define PARAM_BYTES(DATA, SIZE) (void*)MYSQLX_TYPE_BYTES, (void*)DATA, (size_t)SIZE
#define PARAM_STRING(A) (void*)MYSQLX_TYPE_STRING, A
#define PARAM_EXPR(A) (void*)MYSQLX_TYPE_EXPR, A
#define PARAM_NULL() (void*)MYSQLX_TYPE_NULL
#define PARAM_END (void*)0
/**
Sort directions in sorting operations such as ORDER BY.
*/
typedef enum mysqlx_sort_direction_enum
{
SORT_ORDER_ASC = 1, /**< Ascending sorting (Default)*/
SORT_ORDER_DESC = 2 /**< Descending sorting*/
} mysqlx_sort_direction_t;
#define PARAM_SORT_ASC(A) A, SORT_ORDER_ASC
#define PARAM_SORT_DESC(A) A, SORT_ORDER_DESC
/**
Client options for use with `mysqlx_session_option_get()`
and `mysqlx_session_option_set()` functions.
*/
typedef enum mysqlx_client_opt_type_enum
{
#define XAPI_CLIENT_OPT_ENUM_str(X,N) MYSQLX_CLIENT_OPT_##X = -N,
#define XAPI_CLIENT_OPT_ENUM_bool(X,N) MYSQLX_CLIENT_OPT_##X = -N,
#define XAPI_CLIENT_OPT_ENUM_num(X,N) MYSQLX_CLIENT_OPT_##X = -N,
#define XAPI_CLIENT_OPT_ENUM_any(X,N) MYSQLX_CLIENT_OPT_##X = -N,
CLIENT_OPTION_LIST(XAPI_CLIENT_OPT_ENUM)
}
mysqlx_client_opt_type_t;
#define OPT_POOLING(A) MYSQLX_CLIENT_OPT_POOLING, (int)(bool)(A)
#define OPT_POOL_MAX_SIZE(A) MYSQLX_CLIENT_OPT_POOL_MAX_SIZE, (uint64_t)(A)
#define OPT_POOL_QUEUE_TIMEOUT(A) MYSQLX_CLIENT_OPT_POOL_QUEUE_TIMEOUT, (uint64_t)(A)
#define OPT_POOL_MAX_IDLE_TIME(A) MYSQLX_CLIENT_OPT_POOL_MAX_IDLE_TIME, (uint64_t)(A)
/**
Session options for use with `mysqlx_session_option_get()`
and `mysqlx_session_option_set()` functions.
@note Specifying `MYSQLX_OPT_SSL_CA` option requires `MYSQLX_OPT_SSL_MODE`
value of `SSL_MODE_VERIFY_CA` or `SSL_MODE_VERIFY_IDENTITY`.
If `MYSQLX_OPT_SSL_MODE` is not explicitly given then setting
`MYSQLX_OPT_SSL_CA` implies `SSL_MODE_VERIFY_CA`.
\anchor opt_session
*/
typedef enum mysqlx_opt_type_enum
{
#define XAPI_OPT_ENUM_str(X,N) MYSQLX_OPT_##X = N,
#define XAPI_OPT_ENUM_num(X,N) MYSQLX_OPT_##X = N,
#define XAPI_OPT_ENUM_any(X,N) MYSQLX_OPT_##X = N,
#define XAPI_OPT_ENUM_bool(X,N) MYSQLX_OPT_##X = N,
SESSION_OPTION_LIST(XAPI_OPT_ENUM)
MYSQLX_OPT_LAST
}
mysqlx_opt_type_t;
#define OPT_HOST(A) MYSQLX_OPT_HOST, (A)
#define OPT_PORT(A) MYSQLX_OPT_PORT, (unsigned int)(A)
#ifndef _WIN32
#define OPT_SOCKET(A) MYSQLX_OPT_SOCKET, (A)
#endif //_WIN32
#define OPT_DNS_SRV(A) MYSQLX_OPT_DNS_SRV, (A)
#define OPT_USER(A) MYSQLX_OPT_USER, (A)
#define OPT_PWD(A) MYSQLX_OPT_PWD, (A)
#define OPT_DB(A) MYSQLX_OPT_DB, (A)
#define OPT_SSL_MODE(A) MYSQLX_OPT_SSL_MODE, (A)
#define OPT_SSL_CA(A) MYSQLX_OPT_SSL_CA, (A)
#define OPT_PRIORITY(A) MYSQLX_OPT_PRIORITY, (unsigned int)(A)
#define OPT_AUTH(A) MYSQLX_OPT_AUTH, (unsigned int)(A)
#define OPT_CONNECT_TIMEOUT(A) MYSQLX_OPT_CONNECT_TIMEOUT, (unsigned int)(A)
#define OPT_CONNECTION_ATTRIBUTES(A) MYSQLX_OPT_CONNECTION_ATTRIBUTES, (A)
#define OPT_TLS_VERSIONS(A) MYSQLX_OPT_TLS_VERSIONS, (A)
#define OPT_TLS_CIPHERSUITES(A) MYSQLX_OPT_TLS_CIPHERSUITES, (A)
#define OPT_COMPRESSION(A) MYSQLX_OPT_COMPRESSION, (unsigned int)(A)
#define OPT_COMPRESSION_ALGORITHMS(A) MYSQLX_OPT_COMPRESSION_ALGORITHMS, (const char*)(A)
/**
Session SSL mode values for use with `mysqlx_session_option_get()`
and `mysqlx_session_option_set()` functions setting or getting
MYSQLX_OPT_SSL_MODE option.
*/
typedef enum mysqlx_ssl_mode_enum
{
#define XAPI_SSL_MODE_ENUM(X,N) SSL_MODE_##X = N,
SSL_MODE_LIST(XAPI_SSL_MODE_ENUM)
}
mysqlx_ssl_mode_t;
/**
Authentication method values for use with `mysqlx_session_option_get()`
and `mysqlx_session_option_set()` functions setting or getting
MYSQLX_OPT_AUTH option.
*/
typedef enum mysqlx_auth_method_enum
{
#define XAPI_AUTH_ENUM(X,N) MYSQLX_AUTH_##X = N,
AUTH_METHOD_LIST(XAPI_AUTH_ENUM)
}
mysqlx_auth_method_t;
/**
Collection create/modify options
\anchor opt_collection
*/
typedef enum mysqlx_collection_opt_enum
{
#define XAPI_COLLECTION_OPT_ENUM(X,N) MYSQLX_OPT_COLLECTION_##X = N,
COLLECTION_OPTIONS_OPTION(XAPI_COLLECTION_OPT_ENUM)
MYSQLX_OPT_COLLECTION_LAST
}
mysqlx_collection_opt_t;
/**
Collection validation options
\anchor opt_collection_validation
*/
typedef enum mysqlx_collection_validation_opt_enum
{
#define XAPI_COLLECTION_VALIDATION_OPT_ENUM(X,N) MYSQLX_OPT_COLLECTION_VALIDATION_##X = 1024+N,
COLLECTION_VALIDATION_OPTION(XAPI_COLLECTION_VALIDATION_OPT_ENUM)
MYSQLX_OPT_COLLECTION_VALIDATION_LAST
}
mysqlx_collection_validation_opt_t;
/**
Collection validation level options
\anchor opt_collection_validation_level
*/
typedef enum mysqlx_collection_validation_level_enum
{
#define XAPI_COLLECTION_VALIDATION_LEVEL_ENUM(X,N) MYSQLX_OPT_COLLECTION_VALIDATION_LEVEL_##X = 2048+N,
COLLECTION_VALIDATION_LEVEL(XAPI_COLLECTION_VALIDATION_LEVEL_ENUM)
MYSQLX_OPT_COLLECTION_VALIDATION_LEVEL_LAST
}
mysqlx_collection_validation_level_t;
#define VALIDATION_OFF MYSQLX_OPT_COLLECTION_VALIDATION_LEVEL_OFF
#define VALIDATION_STRICT MYSQLX_OPT_COLLECTION_VALIDATION_LEVEL_STRICT
#define OPT_COLLECTION_REUSE(X) MYSQLX_OPT_COLLECTION_REUSE, (unsigned int)X
#define OPT_COLLECTION_VALIDATION(X) MYSQLX_OPT_COLLECTION_VALIDATION, (const char*)X
#define OPT_COLLECTION_VALIDATION_LEVEL(X) MYSQLX_OPT_COLLECTION_VALIDATION_LEVEL, (unsigned int)X
#define OPT_COLLECTION_VALIDATION_SCHEMA(X) MYSQLX_OPT_COLLECTION_VALIDATION_SCHEMA, (const char*)X
typedef enum mysqlx_compression_mode_enum
{
#define XAPI_COMPRESSION_ENUM(X,N) MYSQLX_COMPRESSION_##X = N,
COMPRESSION_MODE_LIST(XAPI_COMPRESSION_ENUM)
}
mysqlx_compression_mode_t;
/**
Constants for defining the row locking options for
mysqlx_set_row_locking() function.
@see https://dev.mysql.com/doc/refman/8.0/en/innodb-locking-reads.html
*/
typedef enum mysqlx_row_locking_enum
{
#define XAPI_ROW_LOCK_ENUM(X,N) ROW_LOCK_##X = N,
ROW_LOCK_NONE = 0, /**< No locking */
LOCK_MODE_LIST(XAPI_ROW_LOCK_ENUM)
}
mysqlx_row_locking_t;
/**
Constants for defining the row locking options for
mysqlx_set_row_locking() function.
@see https://dev.mysql.com/doc/refman/8.0/en/innodb-locking-reads.html#innodb-locking-reads-nowait-skip-locked
*/
typedef enum mysqlx_lock_contention_enum
{
#define XAPI_LOCK_CONTENTION_ENUM(X,N) LOCK_CONTENTION_##X = N,
LOCK_CONTENTION_LIST(XAPI_LOCK_CONTENTION_ENUM)
}
mysqlx_lock_contention_t;
/*
====================================================================
Client operations
====================================================================
*/
/**
Create a client instance using connection string or URL and a client options
JSON.
Connection sting has the form `"user:pass@host:port/?option&option"`,
valid URL is like a connection string with a `mysqlx://` prefix. Host is
specified as either DNS name, IPv4 address of the form "nn.nn.nn.nn" or
IPv6 address of the form "[nn:nn:nn:...]".
Possible connection options are:
- `ssl-mode` : TLS connection mode
- `ssl-ca=`path : path to a PEM file specifying trusted root certificates
Specifying `ssl-ca` option implies `ssl-mode=VERIFY_CA`.
Client options are expressed in a JSON string format. Here is an example:
~~~~~~
{ "pooling": {
"enabled": true,
"maxSize": 25,
"queueTimeout": 1000,
"maxIdleTime": 5000}
}
~~~~~~
All options are defined under a document with key vale "pooling". Inside the
document, the available options are these:
- `enabled` : boolean value that enable or disable connection pooling. If
disabled, session created from pool are the same as created
directly without client handle.
Enabled by default.
- `maxSize` : integer that defines the max pooling sessions possible. If uses
tries to get session from pool when maximum sessions are used,
it will wait for an available session untill `queueTimeout`.
Defaults to 25.
- `queueTimeout` : integer value that defines the time, in milliseconds, that
client will wait to get an available session.
By default it doesn't timeouts.
- `maxIdleTime` : integer value that defines the time, in milliseconds, that
an available session will wait in the pool before it is
removed.
By default it doesn't cleans sessions.
@param conn_string connection string
@param client_opts client options in the form of a JSON string.
@param[out] error if error happens during connect the error object
is returned through this parameter
@return client handle if client could be created, otherwise NULL
is returned and the error information is returned through
the error output parameter.
@note The client returned by the function must be properly closed using
`mysqlx_client_close()`.
@note If an error object returned through the output parameter it must be
freed using `mysqlx_free()`.
@ingroup xapi_sess
*/
PUBLIC_API mysqlx_client_t *
mysqlx_get_client_from_url(const char *conn_string, const char *client_opts,
mysqlx_error_t **error);
/**
Create a client pool using session configuration data.
Client options are expressed in a JSON string format. Here is an example:
~~~~~~
{ "pooling": {
"enabled": true,
"maxSize": 25,
"queueTimeout": 1000,
"maxIdleTime": 5000}
}
~~~~~~
All options are defined under a document with key vale "pooling". Inside the
document, the available options are these:
- `enabled` : boolean value that enable or disable connection pooling. If
disabled, session created from pool are the same as created
directly without client handle.
Enabled by default.
- `maxSize` : integer that defines the max pooling sessions possible. If uses
tries to get session from pool when maximum sessions are used,
it will wait for an available session untill `queueTimeout`.
Defaults to 25.
- `queueTimeout` : integer value that defines the time, in milliseconds, that
client will wait to get an available session.
By default it doesn't timeouts.
- `maxIdleTime` : integer value that defines the time, in milliseconds, that
an available session will wait in the pool before it is
removed.
By default it doesn't cleans sessions.
@param opt handle to client configuration data
@param[out] error if error happens during connect the error object
is returned through this parameter
@return client handle if client could be created, otherwise NULL
is returned and the error information is returned through
the error output parameter.
@note The client returned by the function must be properly closed using
`mysqlx_client_close()`.
@note If an error object returned through the output parameter it must be
freed using `mysqlx_free()`.
@ingroup xapi_sess
*/
PUBLIC_API mysqlx_client_t *
mysqlx_get_client_from_options(mysqlx_session_options_t *opt,
mysqlx_error_t **error);
/**
Close the client pool and all sessions created by them.
This function must be called by the user to prevent memory leaks.
Closing client closes all sessions created by this client.\n
Sessions created by this client are closed, but their resources are not freed.
`mysqlx_session_close()` has to be called to prevent memory leaks.
After a call to this function the given client handle becomes invalid.
Any attempt to use the handle after this, results in undefined behavior.
@param client client handle
@ingroup xapi_sess
*/
PUBLIC_API void mysqlx_client_close(mysqlx_client_t *client);
/*
====================================================================
Session operations
====================================================================
*/
/**
Create a new session
@param cli client pool to get session from
@param[out] error if error happens during connect the error object
is returned through this parameter
@note If an error object returned through the output parameter it must be
freed using `mysqlx_free()`.
*/
PUBLIC_API mysqlx_session_t *
mysqlx_get_session_from_client(mysqlx_client_t *cli,
mysqlx_error_t **error);
/**
Create a new session.
@param host server host DNS name, IPv4 address or IPv6 address
@param port port number
@param user user name
@param password password
@param database default database name
@param[out] error if error happens during connect the error object
is returned through this parameter
@return session handle if session could be created, otherwise NULL
is returned and the error information is returned through
output error parameter.
@note The session returned by the function must be properly closed using
`mysqlx_session_close()`.
@note This function always establishes connection with SSL enabled
@note If an error object returned through the output parameter it must be
freed using `mysqlx_free()`.
@ingroup xapi_sess
*/
PUBLIC_API mysqlx_session_t *
mysqlx_get_session(const char *host, int port, const char *user,
const char *password, const char *database,
mysqlx_error_t **error);
/**
Create a session using connection string or URL.
@param conn_string connection string
@param[out] error if error happens during connect the error object
is returned through this parameter
@return session handle if session could be created, otherwise NULL
is returned and the error information is returned through
the error output parameter.
Connection sting has the form
"user:pass@connection-data/db?option&option"
with optional `mysqlx://` prefix.
The `connetction-data` part is either a single host address or a coma
separated list of hosts in square brackets: `[host1, host2, ..., hostN]`.
In the latter case the connection fail-over logic will be used when
creating the session.
A single host address is either a DNS host name, an IPv4 address of
the form `nn.nn.nn.nn` or an IPv6 address of the form `[nn:nn:nn:...]`.
On Unix systems a host can be specified as a path to a Unix domain
socket - this path must start with `/` or `.`.
Characters like `/` in the connection data, which otherwise have a special
meaning inside a connection string, must be represented using percent
encoding (e.g., `%2F` for `/`). Another option is to enclose a host name or
a socket path in round braces. For example, one can write
"mysqlx://(./path/to/socket)/db"
instead of
"mysqlx://.%2Fpath%2Fto%2Fsocket/db"
To specify priorities for hosts in a multi-host settings, use list of pairs
of the form `(address=host,priority=N)`. If priorities are specified, they
must be given to all hosts in the list.
The optional `db` part of the connection string defines the default schema
of the session.
Possible connection options are:
- `ssl-mode=...` : see `#MYSQLX_OPT_SSL_MODE`; the value is a case insensitive
name of the SSL mode
- `ssl-ca=...` : see `#MYSQLX_OPT_SSL_CA`
- `auth=...`: see `#MYSQLX_OPT_AUTH`; the value is a case insensitive name of
the authentication method
- `connect-timeout=...`: see `#MYSQLX_OPT_CONNECT_TIMEOUT`
- `connection-attributes=[...]` : see `#MYSQLX_OPT_CONNECTION_ATTRIBUTES`
but the key-value pairs are not given by a JSON document but as a list;\n
Examples:\n
`"mysqlx://user@host?connection-attributes=[foo=bar,qux,baz=]"` -
specify additional attributes to be sent\n
`"mysqlx://user@host?connection-attributes=false"` -
send no connection attributes\n
`"mysqlx://user@host?connection-attributes=true"` -
send default connection attributes\n
`"mysqlx://user@host?connection-attributes=[]"` -
the same as setting to `true`\n
`"mysqlx://user@host?connection-attributes"` -
the same as setting to `true`\n
- `tls-versions=[...]` : see `#MYSQLX_OPT_TLS_VERSIONS`
- `tls-ciphersuites=[...]` : see `#MYSQLX_OPT_TLS_CIPHERSUITES`
- `compression=...` : see `#MYSQLX_OPT_COMPRESSION`
- `compression-algorithms=[...]` : see `#MYSQLX_OPT_COMPRESSION_ALGORITHMS`
@note The session returned by the function must be properly closed using
`mysqlx_session_close()`.
@note If an error object returned through the output parameter it must be
freed using `mysqlx_free()`.
@ingroup xapi_sess
*/
PUBLIC_API mysqlx_session_t *
mysqlx_get_session_from_url(const char *conn_string,
mysqlx_error_t **error);
/**
Create a session using session configuration data.
@param opt handle to session configuration data
@param[out] error if error happens during connect the error object
is returned through this parameter
@return session handle if session could be created, otherwise NULL
is returned and the error information is returned through
the error output parameter.
@note The session returned by the function must be properly closed using
`mysqlx_session_close()`.
@note If an error object returned through the output parameter it must be
freed using `mysqlx_free()`.
@ingroup xapi_sess
*/
PUBLIC_API mysqlx_session_t *
mysqlx_get_session_from_options(mysqlx_session_options_t *opt,
mysqlx_error_t **error);
/**
Close the session.
This function must be called by the user to prevent memory leaks.
Closing session frees all related resources, including those
allocated by statements and results belonging to the session.
After a call to this function the given session handle becomes invalid.
Any attempt to use the handle after this, results in undefined behavior.
@param session session handle
@ingroup xapi_sess
*/
PUBLIC_API void mysqlx_session_close(mysqlx_session_t *session);
/**
Check the session validity.
@param sess session handle
@return 1 - if the session is valid, 0 - if the session is not valid
@note The function checks only the internal session status without
communicating with server(s).
@note This function cannot be called for a session that was closed,
because in this case the session handle itself is invalid and
cannot be used in API calls.
@ingroup xapi_sess
*/
PUBLIC_API int mysqlx_session_valid(mysqlx_session_t *sess);
/**
Get a list of schemas.
The result is returned as a set of rows with one column containing schema
name. The rows can be read with functions such as `mysqlx_row_fetch_one()`,
`mysqlx_store_result()` etc.
@param sess session handle
@param schema_pattern schema name pattern to search, using "%" as a wildcard
character; if this parameter is NULL then all schemas will be
returned.
@return handle to the result with rows containing schema names.
NULL is returned only in case of an error. The error details
can be obtained using `mysqlx_error()` function
@ingroup xapi_sess
*/
PUBLIC_API mysqlx_result_t *
mysqlx_get_schemas(mysqlx_session_t *sess, const char *schema_pattern);
/**
Get a schema object and optionally check if it exists on the server.
@param sess session handle
@param schema_name name of the schema
@param check flag to verify if the schema with the given name
exists on the server (1 - check, 0 - do not check)
@return handle to the schema object or NULL
if an error occurred or the schema does not exist on the server
@note Performing existence check involves communication with server(s).
Without the check, this operation is executed locally. It is then possible
to create a handle to a non-existent schema. Attempt to use such
a handle later would eventually trigger an error.
@ingroup xapi_sess
*/
PUBLIC_API mysqlx_schema_t *
mysqlx_get_schema(mysqlx_session_t *sess, const char *schema_name,
unsigned int check);
/**
Get a list of tables and views in a schema.
The result is returned as a set of rows with two columns. The first column
contains table/view name, the second column contains object type, either
"TABLE" or "VIEW". The rows can be read with functions such as
`mysqlx_row_fetch_one()`, `mysqlx_store_result()` etc.
@param schema schema handle
@param table_pattern table name pattern to search, using "%" as a wildcard
character; if this parameter is NULL then all tables/views in the
given schema will be returned.
@param get_views flag specifying whether view names should be included
into the result. 0 - do not show views (only table names are in
the result), 1 - show views (table and view names are in the result)
@return handle to the result with rows containing table/view names.
NULL is returned only in case of an error. The error details
can be obtained using `mysqlx_error()` function
@note this function does not return names of tables that represent
collections, use `mysqlx_get_collections()` function for getting
collections.
@ingroup xapi_sess
*/
PUBLIC_API mysqlx_result_t *
mysqlx_get_tables(mysqlx_schema_t *schema,
const char *table_pattern,
int get_views);
/**
Get a table object and optionally check if it exists in the schema
@param schema schema handle
@param tab_name name of the table
@param check flag to verify if the table with the given name
exists in the schema (1 - check, 0 - do not check)
@return handle to the table or NULL
if an error occurred or the table does not exist in the schema
@note Performing existence check involves communication with server(s).
Without the check, this operation is executed locally. It is then possible
to create a handle to a non-existent table. Attempt to use such
a handle later would eventually trigger an error.
@ingroup xapi_sess
*/
PUBLIC_API mysqlx_table_t *
mysqlx_get_table(mysqlx_schema_t *schema, const char *tab_name,
unsigned int check);
/**
Get a list of collections in a schema.
The result is returned as a set of rows with two columns. The first column
contains collection name and the second column contains string "COLLECTION".
The rows can be read with functions such as `mysqlx_row_fetch_one()`,
`mysqlx_store_result()` etc.
@param schema handle
@param col_pattern collection name pattern to search, using "%" as a wildcard
character; if this parameter is NULL then all collections in the given
schema will be returned.
@return handle to the result with rows containing collection names.
NULL is returned only in case of an error. The error details
can be obtained using `mysqlx_error()` function
@ingroup xapi_sess
*/
PUBLIC_API mysqlx_result_t *
mysqlx_get_collections(mysqlx_schema_t *schema,
const char *col_pattern);
/**
Get a collection object and optionally check if it exists in the schema
@param schema schema handle
@param col_name name of the collection
@param check flag to verify if the collection with the given name
exists in the schema (1 - check, 0 - do not check)
@return handle to the collection or NULL
if an error occurred or the collection does not exist in the schema
@note Performing existence check involves communication with server(s).
Without the check, this operation is executed locally. It is then possible
to create a handle to a non-existent collection. Attempt to use such
a handle later would eventually trigger an error.
@ingroup xapi_sess
*/
PUBLIC_API mysqlx_collection_t *
mysqlx_get_collection(mysqlx_schema_t *schema, const char *col_name,
unsigned int check);
/**
Begin a transaction for the session.
@param sess session handle
@return `RESULT_OK` - on success; `RESULT_ERROR` - on error
@note a statement will belong to the transaction when
it is actually executed after the transaction began (and before
it is committed or rolled back) even if this statement
was created before `mysqlx_transaction_begin()` call
@ingroup xapi_sess
*/
PUBLIC_API int
mysqlx_transaction_begin(mysqlx_session_t *sess);
/**
Commit a transaction for the session.
@param sess session handle
@return `RESULT_OK` - on success; `RESULT_ERROR` - on error
@note This will commit all statements that were executed as part of this
transaction, regardless of when the statements were created (see
`mysqlx_transaction_begin()`).
@ingroup xapi_sess
*/
PUBLIC_API int
mysqlx_transaction_commit(mysqlx_session_t *sess);
/**
Roll back a transaction for the session.
@param sess session handle
@return `RESULT_OK` - on success; `RESULT_ERROR` - on error
@note This will roll back all statements that were executed as part of this
transaction, regardless of when the statements were created (see
`mysqlx_transaction_begin()`).
@ingroup xapi_sess
*/
PUBLIC_API int
mysqlx_transaction_rollback(mysqlx_session_t *sess);
/**
Create savepoint inside transaction.
@param sess session handle.
@param name savepoint name (NULL for automatically generated one)
@return savepoint name
@note Savepoints are created inside transaction! Later, you can roll back
the transaction to a created savepoint using mysqlx_rollback_to().
If the current transaction has a savepoint with the same name, the old
savepoint is deleted and a new one is set.
@ingroup xapi_sess
*/
PUBLIC_API const char*
mysqlx_savepoint_set( mysqlx_session_t *sess, const char *name);
/**
Release savepoint created by mysqlx_savepoint_set().
@param sess session handle
@param name savepoint name to be released
@return `RESULT_OK` - savepoint exists and is released;
`RESULT_ERROR` - on error
@ingroup xapi_sess
*/
PUBLIC_API int
mysqlx_savepoint_release(mysqlx_session_t *sess, const char *name);
/**
Roll back to savepoint created by mysqlx_savepoint_set().
@param sess session handle.
@param name savepoint name.
@return `RESULT_OK` - savepoint exists and is released;
`RESULT_ERROR` - on error.
@ingroup xapi_sess
*/
PUBLIC_API int
mysqlx_rollback_to( mysqlx_session_t *sess, const char *name);
/**
Allocate a new session configuration data object.
@return handle to the newly allocated configuration data
@note The allocated object must be eventually freed by
`mysqlx_free()` to prevent memory leaks
@ingroup xapi_sess
*/
PUBLIC_API mysqlx_session_options_t * mysqlx_session_options_new();
/**
Free a session configuration data object.
@param opt handle to sessin configuartion data object
that has to be freed
@note This function is DEPRECATED. Use `mysqlx_free()` instead.
@ingroup xapi_sess
*/
PUBLIC_API void mysqlx_free_options(mysqlx_session_options_t *opt);
/**
Set session configuration options.
@param opth handle to session configuration data object
@param ... variable parameters list consisting of (option, value) pairs
terminated by `PARAM_END`.
@return `RESULT_OK` if option was successfully set; `RESULT_ERROR`
is set otherwise (use `mysqlx_error()` to get the error
information)
The variable parameter list is of the form
OPT_O1(val1), OPT_O2(val2), ..., OPT_On(valn), PARAM_END
or, equivalently,
MYSQLX_OPT_O1, val1, ..., MYSQLX_OPT_On, valn, PARAM_END
Possible options are defined by enumeration
\ref opt_session "mysqlx_opt_type_t". Type of option value `vali` (number,
string, etc.) must match the option `MYSQLX_OPT_Oi`, otherwise this value
along with all the sequential options and values are most likely
to be corrupted.
@ingroup xapi_sess
*/
PUBLIC_API int
mysqlx_session_option_set(mysqlx_session_options_t *opth, ...);
/**
Read session configuration options.
@param opth handle to session configuration data object
@param opt option whose value to read (see
\ref opt_session "mysqlx_opt_type_t")
@param[out] ... pointer to a buffer where to return the requested
value
TODO: Point to documentation explaining what data is returned for
each option.
@return `RESULT_OK` if option was successfully read; `RESULT_ERROR`
is set otherwise (use `mysqlx_error()` to get the error
information)
@note When reading string option values to a bufer, user is responsible for
providing a large enough buffer. No overrun checks are done when
copying data to the buffer.
@note For failover configurations with multiple hosts this function
will return only the last added host name. Same is true for the port
or the priority associated with this host name.
@ingroup xapi_sess
*/
PUBLIC_API int
mysqlx_session_option_get(mysqlx_session_options_t *opth, int opt,
...);
/*
====================================================================
SQL execution
====================================================================
*/
/**
Execute a plain SQL query.
@param sess session handle
@param query SQL query
@param query_len length of the query. For NULL-terminated query strings
`MYSQLX_NULL_TERMINATED` can be specified instead of the
actual length
@return handle to the query results.
NULL is returned only in case of an error. The error details
can be obtained using `mysqlx_error()` function
@ingroup xapi_sql
*/
PUBLIC_API mysqlx_result_t * mysqlx_sql(mysqlx_session_t *sess,
const char *query,
size_t query_len);
/**
Execute a plain SQL query with parameters.
@param sess session handle
@param query SQL query
@param query_len length of the query. For NULL-terminated query strings
`MYSQLX_NULL_TERMINATED` can be specified instead of the
actual length
@param ... variable parameters list consisting of (type, value) pairs
terminated by `PARAM_END`: type_id1, value1, type_id2, value2, ...,
type_id_n, value_n, `PARAM_END` (`PARAM_END` marks the end of
the parameters list).
type_id is the numeric identifier, which helps to determine the type
of the value provided as the next parameter. The user code must
ensure that type_id corresponds to the actual value type. Otherwise,
the value along with and all sequential types and values are most
likely to be corrupted.
Allowed types are listed in `mysqlx_data_type_t` enum.
The X DevAPI for C defines the convenience macros that help to specify
the types and values: See `PARAM_SINT()`, `PARAM_UINT()`,
`PARAM_FLOAT()`, `PARAM_DOUBLE()`, `PARAM_BYTES()`,
`PARAM_STRING()`.
@return handle to the query results.
NULL is returned only in case of an error. The error details
can be obtained using `mysqlx_error()` function
@ingroup xapi_sql
*/
PUBLIC_API mysqlx_result_t * mysqlx_sql_param(mysqlx_session_t *sess,
const char *query,
size_t query_len, ...);
/**
Create a statement which executes a plain SQL query.
@note The query can contain `?` placeholders whose values should be
specified using `mysqlx_stmt_bind()` function before executing
the statement.
@param sess session handle
@param query SQL query
@param length length of the query
@return statement handle containing the results and/or error.
NULL can be returned only in case when there are problems
allocating memory, which normally should not happen.
It is very unlikely for this function to end with an error
because it does not do any parsing, parameter checking etc.
@note To actually execute the SQL query the returned statement has to be
given to `mysqlx_execute()`.
@see mysqlx_stmt_bind()
@ingroup xapi_sql
*/
PUBLIC_API mysqlx_stmt_t *
mysqlx_sql_new(mysqlx_session_t *sess, const char *query,
uint32_t length);
/*
====================================================================
Collection operations
====================================================================
*/
/**
Return a number of documents in a collection.
@param collection collection handle
@param[out] count the number of documents in a given collection
is returned through the parameter
@return `RESULT_OK` - on success; `RESULT_ERROR` - on error
@ingroup xapi_coll
*/
PUBLIC_API int
mysqlx_collection_count(mysqlx_collection_t *collection, uint64_t *count);
/**
Execute a collection FIND statement with a specific find
criteria.
@param collection collection handle
@param criteria criteria for finding documents; if this parameter is
NULL then all documents are returned
@return handle to the query results.
NULL is returned only in case of an error. The error details
can be obtained using `mysqlx_error()` function
@ingroup xapi_coll
*/
PUBLIC_API mysqlx_result_t *
mysqlx_collection_find(mysqlx_collection_t *collection, const char *criteria);
/**
Add a set of new documents to a collection.
Each document is defined by a JSON string like
"{ \"key_1\\": value_1, ..., \"key_N\\": value_N }"
@param collection collection handle
@param ... list of parameters containing the character JSON strings
describing documents to be added. Each parameter
is a separate document. The list has to be terminated by
PARAM_END macro
@return handle to the statement result.
NULL is returned only in case of an error. The error details
can be obtained using `mysqlx_error()` function
Each document must have a unique identifier which is stored in `_id`
field of the document. Document identifiers are character strings no longer
than 32 characters. If added document does not have `_id` field, a unique
identifier will be generated for it. Document identifier generated by given
collection add operation can be examined using `mysqlx_fetch_generated_id()`
function. Generated document identifiers are strings of 32 hexadecimal digits,
like this one `0512020981044082E6119DFA0E4C0584`.
@note Generated document identifiers are based on UUIDs but they are not
valid UUIDs (fields are reversed).
@see `mysqlx_collection_add_new()`
@ingroup xapi_coll
*/
PUBLIC_API mysqlx_result_t *
mysqlx_collection_add(mysqlx_collection_t *collection, ...);
/**
Remove documents from a collection.
@param collection collection handle
@param criteria criteria selecting documents to be removed; if this parameter
is NULL, all documents are removed
@return handle to the statement result.
NULL is returned only in case of an error. The error details
can be obtained using `mysqlx_error()` function
@ingroup xapi_coll
*/
PUBLIC_API mysqlx_result_t *
mysqlx_collection_remove(mysqlx_collection_t *collection, const char*criteria);
/**
Modify documents in the collection.
@param collection collection handle
@param criteria criteria selecting documents to be modified; if this
parameter is NULL then all documents are modified
@param ... list of parameters that come as triplets
<field_path, value_type, value>
Each triplet specifies a field inside a document that should
be modified (field_path) and the new value for that field.
The value_type is the type identifier
for the data type of value (see `mysqlx_data_type_t` enum)
The list is terminated by `PARAM_END`.
For `MYSQLX_TYPE_BYTES` there will be one extra parameter specifying
the length of the binary data:
<field_path, MYSQLX_TYPE_BYTES, value, length>
The X DevAPI for C defines the convenience macros that help to specify
the types and values: See `PARAM_SINT()`, `PARAM_UINT()`,
`PARAM_FLOAT()`, `PARAM_DOUBLE()`, `PARAM_BYTES()`,
`PARAM_STRING()`, `PARAM_EXPR()`:
..., "a_key", PARAM_STRING("New Text Value"),
"b_key", PARAM_EXPR("b_key-1000"),
PARAM_END
@return handle to the statement result
NULL is returned only in case of an error. The error details
can be obtained using `mysqlx_error()` function
@ingroup xapi_coll
*/
PUBLIC_API mysqlx_result_t *
mysqlx_collection_modify_set(mysqlx_collection_t *collection,
const char *criteria, ...);
/**
Unset fields in documents from the collection.
@param collection collection handle
@param criteria criteria selecting documents to be modified; if this
parameter is NULL then all documents are modified
@param ... list of field paths that should be unset;
The list end is marked using `PARAM_END`
@return handle to the statement result.
NULL is returned only in case of an error. The error details
can be obtained using `mysqlx_error()` function
@ingroup xapi_coll
*/
PUBLIC_API mysqlx_result_t *
mysqlx_collection_modify_unset(mysqlx_collection_t *collection,
const char *criteria, ...);
/**
Apply a given patch to documents in a collection.
@param collection collection handle
@param criteria criteria selecting documents to be modified; if this
parameter is NULL then all documents are modified
@param patch_spec patch specification given as a character string and
interpreted like a JSON documents, but values of fields are
interpreted as expressions
@return handle to the statement result.
NULL is returned only in case of an error. The error details
can be obtained using `mysqlx_error()` function
@ingroup xapi_coll
*/
PUBLIC_API mysqlx_result_t *
mysqlx_collection_modify_patch(mysqlx_collection_t *collection,
const char *criteria,
const char *patch_spec);
/**
Set a given patch for a modify statement to be applied to
documents in a collection after executing the statement.
@param stmt modify statement
@param patch_spec patch specification given as a character string and
interpreted like a JSON documents, but values of fields are
interpreted as expressions
@return `RESULT_OK` - on success; `RESULT_ERROR` - on error
@ingroup xapi_coll
*/
PUBLIC_API int
mysqlx_set_modify_patch(mysqlx_stmt_t *stmt,
const char *patch_spec);
/*
Deferred statement execution
----------------------------
*/
/**
Create a statement which finds documents in a collection
@param collection collection handle
@return handle for the newly created FIND statement.
NULL can be returned only in case when there are problems
allocating memory, which normally should not happen.
It is very unlikely for this function to end with an error
because it does not do any parsing, parameter checking etc.
@note To actually execute the operation, use `mysqlx_execute()`.
@ingroup xapi_coll
*/
PUBLIC_API mysqlx_stmt_t *
mysqlx_collection_find_new(mysqlx_collection_t *collection);
/**
Specify a projection for a collection find query
The projection, if present, specifies mapping from documents found by the
query to new documents returned in the final result.
@param stmt statement handle
@param proj projection specification describing JSON document projections as
"{ \"proj1\\": expr1, ..., \"projN\\": exprN }". Expressions used
in the projection can refer to fields in the original document
using `$.path.to.field` syntax.
@return `RESULT_OK` - on success; `RESULT_ERROR` - on error
@note This function can be only called for the collection FIND statements
@see mysqlsx_collection_find_new()
@ingroup xapi_coll
*/
PUBLIC_API int mysqlx_set_find_projection(mysqlx_stmt_t *stmt, const char *proj);
/**
A macro defining a function for setting criteria for FIND operation.
@see mysqlx_set_where()
@ingroup xapi_coll
*/
#define mysqlx_set_find_criteria mysqlx_set_where
/*
A macro defining a function for setting HAVING for FIND operation.
@see mysqlx_set_having()
@ingroup xapi_tbl
*/
#define mysqlx_set_find_having mysqlx_set_having
/**
A macro defining a function for setting GROUP BY for FIND operation.
@see mysqlx_set_group_by()
@ingroup xapi_tbl
*/
#define mysqlx_set_find_group_by mysqlx_set_group_by
/**
A macro defining a function for setting LIMIT for DELETE operation.
@see mysqlx_set_limit_and_offset()
@ingroup xapi_coll
*/
#define mysqlx_set_find_limit_and_offset(STMT, LIM, OFFS) mysqlx_set_limit_and_offset(STMT, LIM, OFFS)
/**
A macro defining a function for setting ORDER BY for SELECT operation.
@see mysqlx_set_order_by()
@ingroup xapi_coll
*/
#define mysqlx_set_find_order_by mysqlx_set_order_by
/**
A macro defining a function for setting row locking mode
for FIND operation.
@see mysqlx_set_row_locking()
@ingroup xapi_coll
*/
#define mysqlx_set_find_row_locking mysqlx_set_row_locking
/**
Create a statement which adds documents to a collection
@param collection collection handle
@return handle for the newly created ADD statement.
NULL can be returned only in case when there are problems
allocating memory, which normally should not happen.
It is very unlikely for this function to end with an error
because it does not do any parsing, parameter checking etc.
@note To actually execute the operation, use `mysqlx_execute()` after
specifying documents to be added.
@ingroup xapi_coll
*/
PUBLIC_API mysqlx_stmt_t *
mysqlx_collection_add_new(mysqlx_collection_t *collection);
/**
Specify a document to be added to a collection.
The function provides the document data for the ADD statement as
a JSON string like "{ \"key_1\\": value_1, ..., \"key_N\\": value_N }"
User code must ensure the validity of the document because it is
not checked until receiving the query on the server side.
@note key names and string values in a JSON string must be given
in quotes and such quotes need to be escaped.
@param stmt statement handle
@param json_doc - the JSON string describing document to add
@return `RESULT_OK` - on success; `RESULT_ERROR` - on error
@note Each new call provides the values for the new document, which
can be used for multi-document add operations.
@note User can provide document id as a value of `_id` field, otherwise
document id is generated by the add operation. Document id must be
a string - setting `_id` to a non-string value triggers
an error.
@ingroup xapi_coll
*/
PUBLIC_API int
mysqlx_set_add_document(mysqlx_stmt_t *stmt, const char *json_doc);
/**
Create a statement which removes documents from a collection.
@param collection collection handle
@return handle for the newly created REMOVE statement.
NULL can be returned only in case when there are problems
allocating memory, which normally should not happen.
It is very unlikely for this function to end with an error
because it does not do any parsing, parameter checking etc.
@note To actually execute the statement, use `mysqlx_execute()`
@ingroup xapi_coll
*/
PUBLIC_API mysqlx_stmt_t *
mysqlx_collection_remove_new(mysqlx_collection_t *collection);
/**
A macro defining a function for setting WHERE for REMOVE operation.
@see mysqlx_set_where()
@ingroup xapi_coll
*/
#define mysqlx_set_remove_criteria mysqlx_set_where
/**
A macro defining a function for setting ORDER BY for REMOVE operation.
@see mysqlx_set_order_by()
@ingroup xapi_coll
*/
#define mysqlx_set_remove_order_by mysqlx_set_order_by
/**
A macro defining a function for setting LIMIT for REMOVE operation.
@see mysqlx_set_limit_and_offset()
@ingroup xapi_coll
*/
#define mysqlx_set_remove_limit_and_offset mysqlx_set_limit_and_offset
/**
Create a statement which modifies documents in a collection.
@param collection collection handle
@return handle for the newly created MODIFY statement.
NULL can be returned only in case when there are problems
allocating memory, which normally should not happen.
It is very unlikely for this function to end with an error
because it does not do any parsing, parameter checking etc.
@note To actually execute the statement, use `mysqlx_execute()` after
specifying modifications that should be performed.
@ingroup xapi_coll
*/
PUBLIC_API mysqlx_stmt_t *
mysqlx_collection_modify_new(mysqlx_collection_t *collection);
/**
Set fields in a document to given values.
@param stmt handle to MODIFY statement
@param ... list of parameters that come as triplets
<field_path, value_type, value>
Each triplet represents a value inside a document that can
be located by field_path. The value_type is the type identifier
for the data type of value (see `mysqlx_data_type_t` enum)
The list is terminated by `PARAM_END`.
For `MYSQLX_TYPE_BYTES` there will be one extra parameter specifying
the length of the binary data:
<field_path, `MYSQLX_TYPE_BYTES`, value, length>
@note For the convenience the code can use `PARAM_TTT(val)` macros
instead of (`MYSQLX_TYPE_TTT`, value) pairs (see `mysqlx_stmt_bind()`).
@return `RESULT_OK` - on success; `RESULT_ERROR` - on error
@ingroup xapi_coll
*/
PUBLIC_API int
mysqlx_set_modify_set(mysqlx_stmt_t *stmt, ...);
/**
Unset fields in a document
@param stmt handle to MODIFY statement
@param ... list of paths to the documents fields that should be unset. Each
entry in this list is a character string.
The list is terminated by `PARAM_END`.
@return `RESULT_OK` - on success; `RESULT_ERROR` - on error
@ingroup xapi_coll
*/
PUBLIC_API int
mysqlx_set_modify_unset(mysqlx_stmt_t *stmt, ...);
/**
Insert elements into array fields in a document
@param stmt handle to MODIFY statement
@param ... list of parameters that come as triplets
<field_path, value_type, value>
Each triplet represents a position in an array field of a document,
given by field_path, and a value to be inserted in that position.
The value_type is the type identifier for the data type of value
(see `mysqlx_data_type_t` enum). The list is terminated by `PARAM_END`.
@note For the convenience the code can use `PARAM_TTT(val)` macros
instead of (`MYSQLX_TYPE_TTT`, value) pairs (see `mysqlx_stmt_bind()`).
@return `RESULT_OK` - on success; `RESULT_ERROR` - on error
@ingroup xapi_coll
*/
PUBLIC_API int
mysqlx_set_modify_array_insert(mysqlx_stmt_t *stmt, ...);
/**
Append to array fields in a document
@param stmt handle to MODIFY statement
@param ... list of parameters that come as triplets
<field_path, value_type, value>. Each triplet specifies an array
field in a document, given by field_path, and a value that should
be appended to that array. The value_type is the type identifier
for the data type of value (see `mysqlx_data_type_t` enum).
The list is terminated by `PARAM_END`.
@note For the convenience the code can use `PARAM_TTT(val)` macros
instead of (`MYSQLX_TYPE_TTT`, value) pairs (see `mysqlx_stmt_bind()`).
@return `RESULT_OK` - on success; `RESULT_ERROR` - on error
@ingroup xapi_coll
*/
PUBLIC_API int
mysqlx_set_modify_array_append(mysqlx_stmt_t *stmt, ...);
/**
Delete elements from array fields in a document
@param stmt handle to MODIFY statement
@param ... list of paths to array elements that should be deleted from their
arrays. The list is terminated by `PARAM_END`.
@return `RESULT_OK` - on success; `RESULT_ERROR` - on error
@ingroup xapi_coll
*/
PUBLIC_API int mysqlx_set_modify_array_delete(mysqlx_stmt_t *stmt, ...);
/**
A macro defining a function for setting WHERE for MODIFY operation.
@see mysqlx_set_where()
@ingroup xapi_coll
*/
#define mysqlx_set_modify_criteria mysqlx_set_where
/*
====================================================================
Table operations
====================================================================
*/
/**
Return a number of rows in a table
@param table table handle
@param[out] count the number of rows in a given table is returned
through the parameter
@return `RESULT_OK` - on success; `RESULT_ERROR` - on error
@ingroup xapi_coll
*/
PUBLIC_API int
mysqlx_table_count(mysqlx_table_t *table, uint64_t *count);
/**
Execute a table SELECT statement with a WHERE clause.
All columns will be selected.
@param table table handle
@param criteria row selection criteria (WHERE clause); if NULL then
all rows in the table are returned.
@return handle to the query results
NULL is returned only in case of an error. The error details
can be obtained using `mysqlx_error()` function
@ingroup xapi_tbl
*/
PUBLIC_API mysqlx_result_t *
mysqlx_table_select(mysqlx_table_t *table, const char *criteria);
/**
Execute a table SELECT statement with a WHERE,
ORDER BY and LIMIT clauses
@param table table handle
@param criteria row selection criteria (WHERE clause); if NULL then all
rows in the table will be selected.
@param row_count a number of rows to return (LIMIT clause)
@param offset number of rows to skip (an offset for the LIMIT clause)
@param ... sorting specification - variable parameters list consisting of
(expression, direction) pairs terminated by `PARAM_END`: expr_1,
direction_1, ..., expr_n, direction_n, `PARAM_END`.
Each expression computes a value used to sort
the rows/documents in ascending or descending order,
as determined by direction constant
(TODO: list the direction enum names).
Special attention must be paid to the expression
strings because the empty string "" or NULL will be treated
as the end of sequence
@return handle to the query results.
NULL is returned only in case of an error. The error details
can be obtained using `mysqlx_error()` function
@ingroup xapi_tbl
*/
PUBLIC_API mysqlx_result_t *
mysqlx_table_select_limit(mysqlx_table_t *table, const char *criteria,
uint64_t row_count, uint64_t offset, ...);
/**
Execute a table INSERT statement with one row.
@param table table handle
@param ... list of column-value specifications consisting of
<column_name, value_type, value> triplets. The list
should be terminated using `PARAM_END`.
Allowed value types are listed in `mysqlx_data_type_t` enum.
The X DevAPI for C defines the convenience macros that help
to specify the types and values: See `PARAM_SINT()`,
`PARAM_UINT()`, `PARAM_FLOAT()`, `PARAM_DOUBLE()`, `PARAM_BYTES()`,
`PARAM_STRING()`:
..., "col_uint", PARAM_UINT(uint_val),
"col_blob", PARAM_BYTES(byte_buf, buf_len),
PARAM_END
@return handle to the query results.
NULL is returned only in case of an error. The error details
can be obtained using `mysqlx_error()` function
@ingroup xapi_tbl
*/
PUBLIC_API mysqlx_result_t *
mysqlx_table_insert(mysqlx_table_t *table, ...);
/**
Execute a table DELETE statement with a WHERE clause.
@param table table handle
@param criteria expression selecting rows to be deleted; if this
parameter is NULL all rows are deleted
@return handle to the query results.
NULL is returned only in case of an error. The error details
can be obtained using `mysqlx_error()` function
@ingroup xapi_tbl
*/
PUBLIC_API mysqlx_result_t *
mysqlx_table_delete(mysqlx_table_t *table, const char *criteria);
/**
Execute a table UPDATE statement.
@param table table handle
@param criteria expression selecting rows to be updated (WHERE clause)
@param ... list of column-value specifications consisting of
<column_name, value_type, value> triplets. The list
should be terminated using `PARAM_END`.
Allowed value types are listed in `mysqlx_data_type_t` enum.
The X DevAPI for C defines the convenience macros that help
to specify the types and values: See `PARAM_SINT()`,
`PARAM_UINT()`, `PARAM_FLOAT()`, `PARAM_DOUBLE()`, `PARAM_BYTES()`,
`PARAM_STRING()`, `PARAM_EXPR()`:
..., "col_uint", PARAM_EXPR("col_uint * 100"),
"col_blob", PARAM_BYTES(byte_buf, buf_len),
PARAM_END
@return handle to the query results.
NULL is returned only in case of an error. The error details
can be obtained using `mysqlx_error()` function
@ingroup xapi_tbl
*/
PUBLIC_API mysqlx_result_t *
mysqlx_table_update(mysqlx_table_t *table,
const char *criteria,
...);
/*
Deferred statement execution
----------------------------
*/
/**
Create a statement which performs a table SELECT operation.
@param table table handle
@return handle to the newly created SELECT statement.
NULL can be returned only in case when there are problems
allocating memory, which normally should not happen.
It is very unlikely for this function to end with an error
because it does not do any parsing, parameter checking etc.
@note To actually execute the statement, the returned handle has to be
given to `mysqlx_execute()`.
@see mysqlx_set_insert_columns(), mysqlx_set_insert_row()
@ingroup xapi_tbl
*/
PUBLIC_API mysqlx_stmt_t *
mysqlx_table_select_new(mysqlx_table_t *table);
/**
A macro defining a function for setting projections for SELECT operation.
@see mysqlx_set_items()
@ingroup xapi_tbl
*/
#define mysqlx_set_select_items mysqlx_set_items
/**
A macro defining a function for setting WHERE for SELECT operation.
@see mysqlx_set_where()
@ingroup xapi_tbl
*/
#define mysqlx_set_select_where mysqlx_set_where
/**
A macro defining a function for setting ORDER BY for SELECT
operation.
@see mysqlx_set_order_by()
@ingroup xapi_tbl
*/
#define mysqlx_set_select_order_by mysqlx_set_order_by
/*
A macro defining a function for setting HAVING for SELECT operation.
@see mysqlx_set_having()
@ingroup xapi_tbl
*/
#define mysqlx_set_select_having mysqlx_set_having
/**
A macro defining a function for setting GROUP BY for SELECT operation.
@see mysqlx_set_group_by()
@ingroup xapi_tbl
*/
#define mysqlx_set_select_group_by mysqlx_set_group_by
/**
A macro defining a function for setting LIMIT for SELECT operation.
@see mysqlx_set_limit_and_offset()
@ingroup xapi_tbl
*/
#define mysqlx_set_select_limit_and_offset mysqlx_set_limit_and_offset
/**
A macro defining a function for setting row locking mode
for SELECT operation.
@see mysqlx_set_row_locking()
@ingroup xapi_coll
*/
#define mysqlx_set_select_row_locking mysqlx_set_row_locking
/**
Create a statement executing a table INSERT operation.
@param table table handle
@return statement handle for the newly created INSERT operation.
NULL can be returned only in case when there are problems
allocating memory, which normally should not happen.
It is very unlikely for this function to end with an error
because it does not do any parsing, parameter checking etc.
@note To actually execute the SQL query the returned Statement has to be
given to `mysqlx_execute()`
@ingroup xapi_tbl
*/
PUBLIC_API mysqlx_stmt_t *
mysqlx_table_insert_new(mysqlx_table_t *table);
/**
Specify column names for an INSERT statement.
The function specifies the names of the columns into which the statement
will insert data. User code must ensure that the column values are correct
because the names are not validated until receiving the query on
the server side after executing with `mysqlx_execute()`.
@param stmt statement handle
@param ... variable parameters list consisting of column names; the list is
terminated by PARAM_END.
@return `RESULT_OK` - on success; `RESULT_ERROR` - on error
@note Each new call clears the list of column for a given statement
if it was set earlier.
@note If column names are not specified for an insert statement, it will
insert data into all columns of the table.
@ingroup xapi_tbl
*/
PUBLIC_API int
mysqlx_set_insert_columns(mysqlx_stmt_t *stmt, ...);
/**
Specify a row to be added by an INSERT statement.
The function provides the row data for an INSERT statement.
User code must ensure that the number of values and their order matches
the list of columns specified for the operation. If column names were not
explicitly specified, the values must match the columns of the table.
@param stmt statement handle
@param ... variable parameters list consisting of (type, value) pairs
terminated by PARAM_END. The pairs must be listed in the order they
appear in the list of columns
For MYSQLX_TYPE_BYTES the function will expect three parameters
instead of two as for all other types:
<MYSQLX_TYPE_BYTES, (void*)byte_data, (size_t)length>
@return `RESULT_OK` - on success; `RESULT_ERROR` - on error
@note Each new call provides the row values for the new row, which
can be used for multi-row inserts
@ingroup xapi_stmt
*/
PUBLIC_API int
mysqlx_set_insert_row(mysqlx_stmt_t *stmt, ...);
/**
Create a statement executing a table DELETE operation.
@param table table handle
@return handle for the newly created DELETE statement.
NULL can be returned only in case when there are problems
allocating memory, which normally should not happen.
It is very unlikely for this function to end with an error
because it does not do any parsing, parameter checking etc.
@note To actually execute the statement, use `mysqlx_execute()`.
@see mysqlx_set_delete_where(), mysqlx_set_delete_limit(),
mysqlx_set_delete_order_by()
@ingroup xapi_tbl
*/
PUBLIC_API mysqlx_stmt_t *
mysqlx_table_delete_new(mysqlx_table_t *table);
/**
A macro defining a function for setting WHERE clause for DELETE operation.
@see mysqlx_set_where()
@ingroup xapi_tbl
*/
#define mysqlx_set_delete_where mysqlx_set_where
/**
A macro defining a function for setting LIMIT for DELETE operation.
@see mysqlx_set_limit_and_offset()
@ingroup xapi_tbl
*/
#define mysqlx_set_delete_limit(STMT, LIM) mysqlx_set_limit_and_offset(STMT, LIM, 0)
/**
A macro defining a function for setting ORDER BY for DELETE operation.
@see mysqlx_set_order_by()
@ingroup xapi_tbl
*/
#define mysqlx_set_delete_order_by mysqlx_set_order_by
/**
Create a statement executing a table UPDATE operation.
@param table table handle
@return handle for the newly created UPDATE statement.
NULL can be returned only in case when there are problems
allocating memory, which normally should not happen.
It is very unlikely for this function to end with an error
because it does not do any parsing, parameter checking etc.
@note To actually execute the statement, use `mysqlx_execute()` after
specifying what updates should it perform.
@see mysqlx_set_update_values(), mysqlx_set_update_where(),
mysqlx_set_update_limit(), mysqlx_set_update_order_by()
@ingroup xapi_tbl
*/
PUBLIC_API mysqlx_stmt_t *
mysqlx_table_update_new(mysqlx_table_t *table);
/**
Set values for the columns in the UPDATE statement.
@param stmt statement handle
@param ... variable parameters list consisting of triplets
<column_name, value_type, value_or_expression>
representing column names, value types and values as
expressions. The list is terminated by `PARAM_END`:
column_1, type_1, val_1, ..., column_n, type_n, val_n, `PARAM_END`.
The value type is defined in `mysqlx_data_type_t` enum.
If the value is to be computed on the server side the type
has to be set to `MYSQLX_TYPE_EXPR`. The value (expression)
should be specified as a character string expression.
For `MYSQLX_TYPE_BYTES` the function will expect four parameters
instead of three as for all other types:
<column_name, `MYSQLX_TYPE_BYTES`, (void*)byte_data, (size_t)length>
@return `RESULT_OK` - on success; `RESULT_ERROR` - on error
@note The `param` list must be not empty, otherwise error is reported.
@note All fields and their corresponding expressions must be set in one call
otherwise the next call to this function will reset all parameters to
their new values.
@ingroup xapi_tbl
*/
PUBLIC_API int mysqlx_set_update_values(mysqlx_stmt_t *stmt, ...);
/**
A macro defining a function for setting WHERE clause for UPDATE operation.
@see mysqlx_set_where()
@ingroup xapi_tbl
*/
#define mysqlx_set_update_where mysqlx_set_where
/**
A macro defining a function for setting LIMIT for UPDATE operation.
@see mysqlx_set_limit_and_offset()
@ingroup xapi_tbl
*/
#define mysqlx_set_update_limit(STMT, LIM) mysqlx_set_limit_and_offset(STMT, LIM, 0)
/**
A macro defining a function for setting ORDER BY clause for UPDATE
operation.
@see mysqlx_set_oder_by()
@ingroup xapi_tbl
*/
#define mysqlx_set_update_order_by mysqlx_set_order_by
/*
====================================================================
Statement execution
====================================================================
*/
/**
Execute a statement
Executes statement created by `mysqlx_table_select_new()`,
`mysqlx_table_insert_new()`, `mysqlx_table_update_new()`,
`mysqlx_table_delete_new()`, `mysqlx_sql_new()`, etc.
@param stmt statement handle
@return handle that can be used to access results
of the operation. Returned handle is valid until the statement
handle is freed (when session is closed or explicitly with
`mysqlx_free()`) or until another call to `mysqlx_execute()`
on the same statement handle is made. It is also possible to close
a result handle and free all resources used by it earlier with
`mysqlx_free()` call.
On error NULL is returned. The statement is set to an error state and
errors can be examined using the statement handle.
@ingroup xapi_stmt
*/
PUBLIC_API mysqlx_result_t *
mysqlx_execute(mysqlx_stmt_t *stmt);
/**
Bind values for parametrized statements.
This function binds values of either `?` placeholders in an SQL statement
or of named parameters that can be used in other statements.
User code must ensure that the number of values in bind is the same
as the number of parameters in the query because this is not checked
until receiving the query on the server side.
@param stmt statement handle
@param ... variable parameters list, which has different structure for SQL
statements that use placeholders and for other statements that use
named parameters.
For SQL statements it is consisting of (type, value) pairs
terminated by `PARAM_END`: type_id1, value1, type_id2, value2, ...,
type_id_n, value_n, `PARAM_END`.
For SELECT, INSERT, UPDATE, DELETE, FIND, ADD, MODIFY and REMOVE
statements, the parameters come as triplets (param_name, type,
value): name1, type_id1, value1, name2, type_id2, value2, ...,
name_n, type_id_n, value_n, `PARAM_END` (`PARAM_END` marks the end
of the parameters list).
type_id is the numeric identifier, which helps to determine the type
of the value provided as the next parameter. The user code must
ensure that type_id corresponds to the actual value type. Otherwise,
the value along with and all sequential types and values are most
likely to be corrupted.
It is recommended to use `PARAM_TTT()` macros to keep the list
integrity: `PARAM_UINT()`, `PARAM_SINT()`, `PARAM_FLOAT()`,
`PARAM_DOUBLE()`, `PARAM_STRING()`, `PARAM_BYTES()`, `PARAM_EXPR()`
for different data types instead of (`MYSQLX_TYPE_TTT`, value) pairs.
@return `RESULT_OK` - on success; `RESULT_ERROR` - on error
@note Each new call resets the binds set by the previous call to
`mysqlx_stmt_bind()`
@ingroup xapi_stmt
*/
PUBLIC_API int mysqlx_stmt_bind(mysqlx_stmt_t *stmt, ...);
/**
Specify a table query projection.
Using projection, rows found by the query can be mapped to a new set of
rows which is returned in the final result. Projection is given by a list
of expressions determining values of fields in the resulting rows. These
expressions can refer to the fields in the original row (via column names
of the original table).
@param stmt handle to the statement for which the projection is set
@param ... variable parameters list consisting of character strings
containing expressions: proj_1, ..., proj_n, PARAM_END
(PARAM_END marks the end of projection's item list)
@return `RESULT_OK` - on success; `RESULT_ERROR` - on error
@note This function can be only called for table SELECT statements
@see mysqlx_table_select_new()
@ingroup xapi_stmt
*/
PUBLIC_API int mysqlx_set_items(mysqlx_stmt_t *stmt, ...);
/**
Specify selection criteria for a statement.
Restrict the statement to rows/documents that satisfy
given selection criteria:
- for select/find operations limit the returned rows/documents,
- for update/modify/delete/remove operations limit
the rows/documents affected by the operations.
Statements supported by this function: SELECT, FIND, UPDATE, MODIFY, DELETE,
REMOVE. Calling it for INSERT or ADD will result in an error
@param stmt statement handle
@param where_expr character string containing Boolean expression
like in SQL WHERE clause
@return `RESULT_OK` - on success; `RESULT_ERROR` - on error
@note this function can be be used directly, but for the convenience
the code can use the specialized macros for a specific operation.
For SELECT operation the user code should use
`mysqlx_set_select_where()` macros that map the
corresponding `mysqlx_set_where()` function.
This way the unsupported operations will not be used.
@ingroup xapi_stmt
*/
PUBLIC_API int mysqlx_set_where(mysqlx_stmt_t *stmt, const char *where_expr);
/**
Specify filter conditions for a group of rows/documents or aggregates
such as GROUP BY
Restrict the statement to rows/documents that satisfy
given selection criteria:
- for select/find operations limit the returned rows/documents,
Statements supported by this function: SELECT, FIND.
Calling it for UPDATE, MODIFY, DELETE, REMOVE, INSERT or ADD
will result in an error
@param stmt statement handle
@param having_expr character string containing Boolean expression
like in SQL HAVING clause
@return `RESULT_OK` - on success; `RESULT_ERROR` - on error
@note this function can be be used directly, but for the convenience
the code can use the specialized macros for a specific operation.
For SELECT operation the user code should use
`mysqlx_set_select_having()` macros that map the
corresponding `mysqlx_set_having()` function.
This way the unsupported operations will not be used.
@ingroup xapi_stmt
*/
PUBLIC_API int mysqlx_set_having(mysqlx_stmt_t *stmt, const char *having_expr);
/**
Specify one or more columns/values to group the result in conjunction
with the aggregate functions.
Statements supported by this function: SELECT, FIND.
Calling it for UPDATE, MODIFY, DELETE, REMOVE, INSERT or ADD
will result in an error
@param stmt statement handle
@param ... variable parameters list consisting of character strings
containing expressions specifying grouping:
expr_1, ..., expr_n, PARAM_END
(PARAM_END marks the end of projection's item list)
@return `RESULT_OK` - on success; `RESULT_ERROR` - on error
@note this function can be be used directly, but for the convenience
the code can use the specialized macros for a specific operation.
For SELECT operation the user code should use
`mysqlx_set_select_group_by()` macros that map the
corresponding `mysqlx_set_group_by()` function.
This way the unsupported operations will not be used.
@ingroup xapi_stmt
*/
PUBLIC_API int mysqlx_set_group_by(mysqlx_stmt_t *stmt, ...);
/**
Specify ordering for a statement.
Operations supported by this function:
SELECT, FIND, UPDATE, MODIFY, DELETE, REMOVE
Calling it for INSERT or ADD will result in an error
@param stmt statement handle
@param ... variable parameters list consisting of (expression, direction)
pairs terminated by `PARAM_END`: expr_1, direction_1, ..., expr_n,
direction_n, `PARAM_END`.
Each expression computes a value used to sort
the rows/documents in ascending or descending order,
as determined by direction constant
(list the direction enum names).
Special attention must be paid to the expression
strings because the empty string "" or NULL will be treated
as the end of sequence
@return `RESULT_OK` - on success; `RESULT_ERROR` - on error
@note this function can be be used directly, but for the convenience
the code can use the specialized macros for a specific operation.
For SELECT operation the user code should use
`mysqlx_set_select_order_by()` macros that map the
corresponding `mysqlx_set_order_by()` function.
This way the unsupported operations will not be used.
@ingroup xapi_stmt
*/
PUBLIC_API int mysqlx_set_order_by(mysqlx_stmt_t *stmt, ...);
/**
Set limit and offset information for a statement.
Set LIMIT and OFFSET for statement operations which work on ranges of
rows/documents: for select/find operations limit the number of returned
rows/documents, for update/delete limit the number of documents affected
by the operation.
Operations supported by this function:
SELECT, FIND - use both LIMIT and OFFSET
UPDATE, MODIFY, DELETE, REMOVE - use only LIMIT
Calling it for INSERT or ADD will result in an error
@param stmt statement handle
@param row_count the number of result rows to return
@param offset the number of rows to skip before starting counting
@return `RESULT_OK` - on success; `RESULT_ERROR` - on error
@note this function can be be used directly, but for the convenience
the code can use the specialized macros for a specific operation.
For SELECT operation the user code should use
`mysqlx_set_select_limit_and_offset()` macros that map the
corresponding `mysqlx_set_limit_and_offset()` function.
This way the unsupported operations will not be used.
@note Each call to this function replaces previously set LIMIT
@ingroup xapi_stmt
*/
PUBLIC_API int
mysqlx_set_limit_and_offset(mysqlx_stmt_t *stmt, uint64_t row_count,
uint64_t offset);
/**
Set row locking mode for a statement.
Set row locking mode for statement operations working on ranges of
rows/documents.
Operations supported by this function:
SELECT, FIND
Calling it for INSERT, UPDATE, DELETE, ADD, MODIFY and REMOVE
will result in an error.
@param stmt statement handle
@param locking the integer mode identifier (see ::mysqlx_row_locking_t).
@param contention the integer locking contention
(see ::mysqlx_lock_contention_t).
@return `RESULT_OK` - on success; `RESULT_ERROR` - on error
@note this function can be be used directly, but for the convenience
the code can use the specialized macros for a specific operation.
For SELECT operation the user code should use
`mysqlx_set_select_row_locking()` macros that map the
corresponding `mysqlx_set_row_locking()` function.
This way the unsupported operations will not be used.
@note Each call to this function replaces previously set locking mode
@ingroup xapi_stmt
*/
PUBLIC_API int
mysqlx_set_row_locking(mysqlx_stmt_t *stmt, int locking, int contention);
/**
Free the allocated handle explicitly.
After calling this function on a handle it becomes invalid and
should not be used any more.
@note This function should not be called on a client or session handle
- use `mysqlx_client_close()` or `mysqlx_session_close()` instead.
@note Statement, result, schema, collection, table and some error
handles are also freed automatically when the session is closed.
@note Only errors that originate from an already established session are
freed automatically when that session is closed.
Errors reported from one of the following functions when they
fail to create a new session or a new client must be freed explicitly:
`mysqlx_get_session()`, `mysqlx_get_session_from_url()`,
`mysqlx_get_session_from_options()`, `mysqlx_get_session_from_client()`,
`mysqlx_get_client_from_url()` and `mysqlx_get_client_from_options()`.
@param obj object handle
@ingroup xapi_stmt
*/
PUBLIC_API void mysqlx_free(void *obj);
/*
====================================================================
Result handling
====================================================================
*/
/**
Fetch one row from the result
The result is advanced to the next row (if any).
@param res result handle
@return row handle or NULL if no more rows left or if an error
occurred. In case of an error it can be retrieved from
the result using `mysqlx_error()` or `mysqlx_error_message()`.
@note The previously fetched row and its data will become invalid.
@ingroup xapi_res
*/
PUBLIC_API mysqlx_row_t * mysqlx_row_fetch_one(mysqlx_result_t *res);
/**
Fetch one document as a JSON string
@param res result handle
@param[out] out_length the total number of bytes in the JSON string;
can be NULL, in that case nothing is returned through
this parameter and user must ensure the data is correctly
interpreted
@return pointer to character JSON string or NULL if no more documents left
in the result. No need to free this data as it is tied and freed
with the result handle.
@ingroup xapi_res
*/
PUBLIC_API const char * mysqlx_json_fetch_one(mysqlx_result_t *res, size_t *out_length);
/**
Proceed to the next result set in the reply.
This function is used to process replies containing multiple result sets.
After a successful call to this function, given result handle will be moved
to access the next result set from the reply.
@note Any data from the previous result set that has not yet been fetched
is no more accessible after moving to the next result set.
@param res result handle
@return `RESULT_OK` - on success; `RESULT_NULL` when there is no more results;
`RESULT_ERROR` - on error
@ingroup xapi_res
*/
PUBLIC_API int mysqlx_next_result(mysqlx_result_t *res);
/**
Get number of rows affected by a statement.
@param res result handle
@return the number of rows affected by the statement that produced the result
@note The returned number is meaningful only for results of statements which
modify data stored in a table or collection.
@ingroup xapi_res
*/
PUBLIC_API uint64_t
mysqlx_get_affected_count(mysqlx_result_t *res);
/**
Store result data in an internal buffer
Rows/documents contained in a result must be fetched in a timely fashion.
Failing to do that can result in an error and lost access to the
remaining part of the result. This function can store complete result
in memory so it can be accessed at any time, as long as the result
handle is valid.
@param result result handle
@param[out] num number of records buffered. Zero is never returned. If the
number of records to buffer is zero the function returns
`RESULT_ERROR`
@return `RESULT_OK` - on success; `RESULT_ERROR` - on error. If the error
occurred it can be retrieved by `mysqlx_error()` function.
@note Even in case of an error some rows/documents might be buffered if they
were retrieved before the error occurred.
@note When called for second time on the same result the function
does not store anything because the data is already buffered.
Instead it returns the number of items that have not been
fetched yet.
@ingroup xapi_res
*/
PUBLIC_API int
mysqlx_store_result(mysqlx_result_t *result, size_t *num);
/**
Function for getting the number of remaining cached items in a result.
If nothing is cached if will attempt to store result in the internal
cache like `mysqlx_store_result()`.
@param result result handle
@param[out] num number of records buffered.
@return `RESULT_OK` - on success; `RESULT_ERROR` - on error. If the error
occurred it can be retrieved by `mysqlx_error()` function.
@note Even in case of an error some rows/documents might be buffered if they
were retrieved before the error occurred.
@ingroup xapi_res
*/
PUBLIC_API int
mysqlx_get_count(mysqlx_result_t *result, size_t *num);
/**
Get identifiers of the documents added to the collection.
This function returns both generated document ids and document ids specified
by user in `_id` field.
The function can be used for the multi-document inserts. In this case each
call to `mysqlx_fetch_generated_id()` returns identifier of the next document,
until NULL is returned.
@param result handle to a result of a statement which adds documents to
a collection
@return character string containing an identifier of a document added by the
statement; NULL - if all UUIDs for all added documents have been
returned
@note The returned string is valid as long as the result handle is valid.
Starting a new operation will invalidate it.
@ingroup xapi_res
*/
PUBLIC_API const char *
mysqlx_fetch_generated_id(mysqlx_result_t *result);
/**
Get auto increment value generated by a statement that inserts rows
into a table with auto increment column.
@param res handle to a result of INSERT statement
@return the generated auto increment value
@note with multi-row inserts the function returns the value generated
for the first row
@ingroup xapi_res
*/
PUBLIC_API uint64_t
mysqlx_get_auto_increment_value(mysqlx_result_t *res);
/**
Read bytes stored in a row into a pre-allocated buffer
The raw bytes are as received from the server. In genral the value
is represented using x-protocol encoding that corresponds to the
type and other meta-data of the given column. This information can
be obtained from `mysqlx_column_get_type()` and other
`mysqlx_column_get_*()` functions.
The x-protocol represenation of different value types is documented
[here]
(https://dev.mysql.com/doc/dev/mysql-server/latest/structMysqlx_1_1Resultset_1_1ColumnMetaData.html).
Most types in the #mysqlx_data_type_t enumeration correspond
to an x-protocol value type of the same name.
STRING values are encoded using the character set encoding as reported by
mysqlx_column_get_collation() function.
JSON data is represented as a JSON string. ENUM values are represented
as strings with enum constant names. Values of type TIMESTAMP use
the same representation as DATETIME. GEOMETRY values use the internal
geometry storage format described
[here]
(https://dev.mysql.com/doc/refman/8.0/en/gis-data-formats.html).
Types BOOL and EXPR are never reported for data received from server
-- they are used when sending data to the server.
Note that raw representation of BYTES and STRING values has an extra
0x00 byte added at the end, which is not part of the originial data.
It is used to distinguish null values from empty byte sequences.
@param row row handle
@param col zero-based column number
@param offset the number of bytes to skip before reading them from source row
@param[out] buf the buffer allocated on the user side into which to write data
@param[in,out] buf_len pointer to a variable holding the length of the buffer
[IN], the number of bytes actually written into the
buffer [OUT]
@return `RESULT_OK` - on success; `RESULT_NULL` when the value in the
requested column is NULL; `RESULT_MORE_DATA` if not all data was
fetched after the last call to the function;
`RESULT_ERROR` - on error
@ingroup xapi_res
*/
PUBLIC_API int
mysqlx_get_bytes(mysqlx_row_t* row, uint32_t col,
uint64_t offset, void *buf, size_t *buf_len);
/**
Get an unsigned integer number from a row.
It is important to pay attention to the signed/unsigned type of the column.
Attempting to call this function for a column whose type is different from
`MYSQLX_TYPE_UINT` will result in wrong data being retrieved.
@param row row handle
@param col zero-based column number
@param[out] val the pointer to a variable of the 64-bit unsigned integer
type in which to write the data
@return `RESULT_OK` - on success; `RESULT_NULL` when the column is NULL;
`RESULT_ERROR` - on error
@ingroup xapi_res
*/
PUBLIC_API int
mysqlx_get_uint(mysqlx_row_t* row, uint32_t col, uint64_t* val);
/**
Get a signed integer number from a row.
It is important to pay attention to the signed/unsigned type of the column.
Attempting to call this function for a column whose type is different from
`MYSQLX_TYPE_SINT` will result in wrong data being retrieved.
@param row row handle
@param col zero-based column number
@param[out] val the pointer to a variable of the 64-bit signed integer
type in which to write the data
@return `RESULT_OK` - on success; `RESULT_NULL` when the column is NULL;
`RESULT_ERROR` - on error
@ingroup xapi_res
*/
PUBLIC_API int
mysqlx_get_sint(mysqlx_row_t* row, uint32_t col, int64_t* val);
/**
Get a float number from a row.
It is important to pay attention to the type of the column.
Attempting to call this function for a column whose type is different from
`MYSQLX_TYPE_FLOAT` will result in wrong data being retrieved.
@param row row handle
@param col zero-based column number
@param[out] val the pointer to a variable of the float
type in which to write the data
@return `RESULT_OK` - on success; `RESULT_NULL` when the column is NULL;
`RESULT_ERROR` - on error
@ingroup xapi_res
*/
PUBLIC_API int
mysqlx_get_float(mysqlx_row_t* row, uint32_t col, float* val);
/**
Get a double number from a row.
It is important to pay attention to the type of the column.
Attempting to call this function for a column whose type is different from
`MYSQLX_TYPE_DOUBLE` will result in wrong data being retrieved.
@param row row handle
@param col zero-based column number
@param[out] val the pointer to a variable of the double
type in which to write the data.
@return `RESULT_OK` - on success; `RESULT_NULL` when the column is NULL;
`RESULT_ERROR` - on error
@ingroup xapi_res
*/
PUBLIC_API int
mysqlx_get_double(mysqlx_row_t* row, uint32_t col, double *val);
/**
Free the result explicitly.
@note This function is DEPRECATED. Use `mysqlx_free()` instead.
@note Results are also freed automatically when the corresponding
statement handle is freed.
@param res the result handle
@ingroup xapi_res
*/
PUBLIC_API void mysqlx_result_free(mysqlx_result_t *res);
/*
Result metadata
---------------
*/
/**
Get column type identifier.
@param res result handle
@param pos zero-based column number
@return column type identifier (see `mysqlx_data_type_t` enum)
@ingroup xapi_md
*/
PUBLIC_API uint16_t
mysqlx_column_get_type(mysqlx_result_t *res, uint32_t pos);
/**
Get column collation number.
@param res result handle
@param pos zero-based column number
@return column collation number. The number matches the ID
in the INFORMATION_SCHEMA.COLLATIONS table.
@see https://dev.mysql.com/doc/mysql/en/collations-table.html
@ingroup xapi_md
*/
PUBLIC_API uint16_t
mysqlx_column_get_collation(mysqlx_result_t *res, uint32_t pos);
/**
Get column length.
@param res result handle
@param pos zero-based column number
@return maximum length of data in the column in bytes
as reported by server.
@note because the column length is returned as byte length
it could be confusing with the multi-byte charsets.
For instance with UTF8MB4 the length of VARCHAR(100)
column is returned as 400 because each character is
4 bytes long.
@ingroup xapi_md
*/
PUBLIC_API uint32_t
mysqlx_column_get_length(mysqlx_result_t *res, uint32_t pos);
/**
Get column precision.
@param res result handle
@param pos zero-based column number
@return number of digits after the decimal point
@ingroup xapi_md
*/
PUBLIC_API uint16_t
mysqlx_column_get_precision(mysqlx_result_t *res, uint32_t pos);
/*
Get column flags.
@param res result handle
@param pos zero-based column number
@return 32-bit unsigned integer containing column flags reported by
server. TODO: Document these
@ingroup xapi_md
*/
//PUBLIC_API uint32_t
//mysqlx_column_get_flags(mysqlx_result_t *res, uint32_t pos);
/**
Get the number of columns in the result.
@param res result handle
@return the number of columns in the result
@note If the result does not contain rows, 0 columns are reported.
@note For a result with multiple result sets, the number of columns for
the current result set is reported (see `mysqlx_next_result()`).
@ingroup xapi_md
*/
PUBLIC_API uint32_t
mysqlx_column_get_count(mysqlx_result_t *res);
/**
Get column name.
@param res result handle
@param pos zero-based column number
@return character string containing the column name
@ingroup xapi_md
*/
PUBLIC_API const char *
mysqlx_column_get_name(mysqlx_result_t *res, uint32_t pos);
/**
Get column original name.
@param res result handle
@param pos zero-based column number
@return character string containing the column original name
@ingroup xapi_md
*/
PUBLIC_API const char *
mysqlx_column_get_original_name(mysqlx_result_t *res, uint32_t pos);
/**
Get column's table name.
@param res result handle
@param pos zero-based column number
@return character string containing the column table name
@ingroup xapi_md
*/
PUBLIC_API const char *
mysqlx_column_get_table(mysqlx_result_t *res, uint32_t pos);
/**
Get column's original table name.
@param res result handle
@param pos zero-based column number
@return character string containing the column original table
@ingroup xapi_md
*/
PUBLIC_API const char *
mysqlx_column_get_original_table(mysqlx_result_t *res, uint32_t pos);
/**
Get column's schema name.
@param res result handle
@param pos zero-based column number
@return character string containing the column schema
@ingroup xapi_md
*/
PUBLIC_API const char *
mysqlx_column_get_schema(mysqlx_result_t *res, uint32_t pos);
/**
Get column's catalog name.
@param res result handle
@param pos zero-based column number
@return character string containing the column name
@ingroup xapi_md
*/
PUBLIC_API const char *
mysqlx_column_get_catalog(mysqlx_result_t *res, uint32_t pos);
/*
====================================================================
DDL statements
====================================================================
*/
/**
Create a schema
@param sess session handle
@param schema the name of the schema to be created
@return `RESULT_OK` - on success; `RESULT_ERROR` - on error
The error handle can be obtained from the session
using `mysqlx_error()` function.
@ingroup xapi_ddl
*/
PUBLIC_API int
mysqlx_schema_create(mysqlx_session_t *sess, const char *schema);
/**
Drop a schema
@param sess session handle
@param schema the name of the schema to be dropped
@return `RESULT_OK` - on success; `RESULT_ERROR` - on error
The error handle can be obtained from the session
using `mysqlx_error()` function.
@ingroup xapi_ddl
*/
PUBLIC_API int
mysqlx_schema_drop(mysqlx_session_t *sess, const char *schema);
/**
Create a new collection in a specified schema
@param schema schema handle
@param collection collection name to create
@return `RESULT_OK` - on success; `RESULT_ERROR` - on error
The error handle can be obtained from the session
using `mysqlx_error()` function.
@ingroup xapi_ddl
*/
PUBLIC_API int
mysqlx_collection_create(mysqlx_schema_t *schema, const char *collection);
/**
Allocate a new create/modify collection options data.
@return collection create/modify options handle
@note The session returned by the function must be properly freed using
`mysqlx_free()`.
@ingroup xapi_ddl
*/
PUBLIC_API mysqlx_collection_options_t *
mysqlx_collection_options_new();
/**
Set collection options.
@param options handle created by mysqlx_collection_options_new() function
@param ... variable parameters list consisting of (option, value) pairs
terminated by `PARAM_END`.
@return `RESULT_OK` - on success; `RESULT_ERROR` - on error
The error handle can be obtained from the options
using `mysqlx_error()` function.
The variable parameter list is of the form
OPT_COLLECTION_O1(val1), OPT_COLLECTION_O2(val2), ..., PARAM_END
or, equivalently,
MYSQLX_OPT_COLLECTION_O1, val1, MYSQLX_OPT_COLLECTION_02, val2,...,
PARAM_END
Possible options are defined by enumerations
\ref opt_collection "mysqlx_collection_opt_t" and
\ref opt_collection_validation "mysqlx_collection_validation_opt_t".
Type of option value `vali` (number, string, etc.) must match the option
`MYSQLX_OPT_COLLECTION_Oi`, otherwise this value along with all the
sequential options and values are most likely to be corrupted.
@ingroup xapi_ddl
*/
PUBLIC_API int
mysqlx_collection_options_set(mysqlx_collection_options_t * options,...);
/**
Create a new collection in a specified schema
@param schema schema handle
@param collection collection name to create
@param options handle created by mysqlx_collection_options_new() function
@return `RESULT_OK` - on success; `RESULT_ERROR` - on error
The error handle can be obtained from the session
using `mysqlx_error()` function.
@ingroup xapi_ddl
*/
PUBLIC_API int
mysqlx_collection_create_with_options(mysqlx_schema_t *schema,
const char *collection,
mysqlx_collection_options_t *options);
/**
Create a new collection in a specified schema
@param schema schema handle
@param collection collection name to create
@param json_options json with options:
~~~~~~
{
"reuseExisting": true,
"validation":
{
"level": "Strict",
"schema":
{
"id": "http://json-schema.org/geo",
"$schema": "http://json-schema.org/draft-06/schema#",
"description": "A geographical coordinate",
"type": "object",
"properties":
{
"latitude":
{
"type": "number"
},
"longitude":
{
"type": "number"
}
},
"required": ["latitude", "longitude"]
}
}
}
}
~~~~~~
Document keys:
- `reuseExisting` : Same as @ref opt_collection "MYSQLX_OPT_COLLECTION_REUSE";
- `validation` : Same as @ref opt_collection "MYSQLX_OPT_COLLECTION_VALIDATION";
@return `RESULT_OK` - on success; `RESULT_ERROR` - on error
The error handle can be obtained from the session
using `mysqlx_error()` function.
@ingroup xapi_ddl
*/
PUBLIC_API int
mysqlx_collection_create_with_json_options(mysqlx_schema_t *schema,
const char *collection,
const char* json_options);
PUBLIC_API int
mysqlx_collection_modify_with_options(mysqlx_schema_t *schema,
const char *collection,
mysqlx_collection_options_t *options);
PUBLIC_API int
mysqlx_collection_modify_with_json_options(mysqlx_schema_t *schema,
const char* collection,
const char* json_options);
/**
Drop an existing collection in a specified schema
@param schema schema handle
@param collection collection name to drop
@return `RESULT_OK` - on success; `RESULT_ERROR` - on error
The error handle can be obtained from the session
using `mysqlx_error()` function
@ingroup xapi_ddl
*/
PUBLIC_API int
mysqlx_collection_drop(mysqlx_schema_t *schema, const char *collection);
/*
====================================================================
Diagnostics
====================================================================
*/
/**
Get the last error from the object.
@param obj handle to the object to extract the error information from.
Supported handle types are `mysqlx_session_t`,
`mysqlx_session_options_t`, `mysqlx_schema_t`,
`mysqlx_collection_t`, `mysqlx_table_t`, `mysqlx_stmt_t`,
`mysqlx_result_t`, `mysqlx_row_t`, `mysqlx_error_t`
@return the error handle or NULL if there is no errors.
@ingroup xapi_diag
*/
PUBLIC_API mysqlx_error_t * mysqlx_error(void *obj);
/**
Get the error message from the object.
@param obj handle to the object to extract the error information from.
Supported handle types are `mysqlx_session_t`,
`mysqlx_session_options_t`, `mysqlx_schema_t`,
`mysqlx_collection_t`, `mysqlx_table_t`, `mysqlx_stmt_t`,
`mysqlx_result_t`, `mysqlx_row_t`, `mysqlx_error_t`
@return the character string or NULL if there is no errors.
@ingroup xapi_diag
*/
PUBLIC_API const char * mysqlx_error_message(void *obj);
/**
Get the error number from the object.
@param obj handle to the object to extract the error information from.
Supported handle types are `mysqlx_session_t`,
`mysqlx_session_options_t`, `mysqlx_schema_t`,
`mysqlx_collection_t`, `mysqlx_table_t`, `mysqlx_stmt_t`,
`mysqlx_result_t`, `mysqlx_row_t`, `mysqlx_error_t`
@return the error number or 0 if no error
@ingroup xapi_diag
*/
PUBLIC_API unsigned int mysqlx_error_num(void *obj);
/**
Get the number of warnings generated by a statement.
@param res result handle
@return the number of warnings stored in the result
@ingroup xapi_diag
*/
PUBLIC_API unsigned int mysqlx_result_warning_count(mysqlx_result_t *res);
/**
Get the next warning from the result.
This function returns a handle to a warning which can be examined using
the same functions used for errors: `mysqlx_error_num()` and
`mysqlx_error_message()`.
@param res result handle
@return handle to the next warning from the result or
NULL if there is no more warnings left to return.
@note The warning handle returned by a previous call is invalidated.
@ingroup xapi_diag
*/
PUBLIC_API mysqlx_error_t *
mysqlx_result_next_warning(mysqlx_result_t *res);
/**
Create index for a collection.
This function creates a named index in the collection using a JSON index
specification.
@param coll collection to create the index for
@param name name for the index to be created
@param idx_spec index specification as a JSON string
@see @ref indexing for information on how to define document
collection indexes.
@return `RESULT_OK` - on success; `RESULT_ERROR` - on error
The error handle can be obtained from the collection
using `mysqlx_error()` function.
@ingroup xapi_ddl
*/
PUBLIC_API int
mysqlx_collection_create_index(mysqlx_collection_t *coll, const char *name,
const char *idx_spec);
/**
Drop index on a collection
This function drops an index in a collection
with a specific name
@param coll collection whose index should be dropped
@param name name of the index to be dropped
@return `RESULT_OK` - on success; `RESULT_ERROR` - on error
The error handle can be obtained from the collection
using `mysqlx_error()` function.
@note The warning handle returned by a previous call is invalidated.
@ingroup xapi_ddl
*/
PUBLIC_API int
mysqlx_collection_drop_index(mysqlx_collection_t *coll, const char *name);
#ifdef __cplusplus
}
#endif
/**@}*/
#endif /* __MYSQLX_H__*/