You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
283 lines
8.1 KiB
283 lines
8.1 KiB
/*
|
|
** Zabbix
|
|
** Copyright (C) 2001-2023 Zabbix SIA
|
|
**
|
|
** This program is free software; you can redistribute it and/or modify
|
|
** it under the terms of the GNU General Public License as published by
|
|
** the Free Software Foundation; either version 2 of the License, or
|
|
** (at your option) any later version.
|
|
**
|
|
** 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 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 Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
**/
|
|
|
|
#ifndef ZABBIX_ZBXDB_H
|
|
#define ZABBIX_ZBXDB_H
|
|
|
|
#include "zbxcommon.h"
|
|
#include "zbxjson.h"
|
|
|
|
#define ZBX_DB_OK 0
|
|
#define ZBX_DB_FAIL -1
|
|
#define ZBX_DB_DOWN -2
|
|
|
|
#define ZBX_DB_TLS_CONNECT_REQUIRED_TXT "required"
|
|
#define ZBX_DB_TLS_CONNECT_VERIFY_CA_TXT "verify_ca"
|
|
#define ZBX_DB_TLS_CONNECT_VERIFY_FULL_TXT "verify_full"
|
|
|
|
typedef char **zbx_db_row_t;
|
|
typedef struct zbx_db_result *zbx_db_result_t;
|
|
|
|
/* database field value */
|
|
typedef union
|
|
{
|
|
int i32;
|
|
zbx_uint64_t ui64;
|
|
double dbl;
|
|
char *str;
|
|
}
|
|
zbx_db_value_t;
|
|
|
|
typedef struct
|
|
{
|
|
char *config_dbhost;
|
|
char *config_dbname;
|
|
char *config_dbschema;
|
|
char *config_dbuser;
|
|
char *config_dbpassword;
|
|
char *config_dbsocket;
|
|
char *config_db_tls_connect;
|
|
char *config_db_tls_cert_file;
|
|
char *config_db_tls_key_file;
|
|
char *config_db_tls_ca_file;
|
|
char *config_db_tls_cipher;
|
|
char *config_db_tls_cipher_13;
|
|
int config_dbport;
|
|
}
|
|
zbx_config_dbhigh_t;
|
|
|
|
#ifdef HAVE_SQLITE3
|
|
/* we have to put double % here for sprintf */
|
|
# define ZBX_SQL_MOD(x, y) #x "%%" #y
|
|
#else
|
|
# define ZBX_SQL_MOD(x, y) "mod(" #x "," #y ")"
|
|
#endif
|
|
|
|
#ifdef HAVE_SQLITE3
|
|
# define ZBX_FOR_UPDATE "" /* SQLite3 does not support "select ... for update" */
|
|
#else
|
|
# define ZBX_FOR_UPDATE " for update"
|
|
#endif
|
|
|
|
int zbx_db_init_basic(const char *dbname, const char *const dbschema, int log_slow_queries, char **error);
|
|
void zbx_db_deinit_basic(void);
|
|
|
|
void zbx_db_init_autoincrement_options_basic(void);
|
|
|
|
int zbx_db_connect_basic(const zbx_config_dbhigh_t *cfg);
|
|
void zbx_db_close_basic(void);
|
|
|
|
int zbx_db_begin_basic(void);
|
|
int zbx_db_commit_basic(void);
|
|
int zbx_db_rollback_basic(void);
|
|
int zbx_db_txn_level(void);
|
|
int zbx_db_txn_error(void);
|
|
int zbx_db_txn_end_error(void);
|
|
const char *zbx_db_last_strerr(void);
|
|
|
|
typedef enum
|
|
{
|
|
ERR_Z3001 = 3001,
|
|
ERR_Z3002,
|
|
ERR_Z3003,
|
|
ERR_Z3004,
|
|
ERR_Z3005,
|
|
ERR_Z3006,
|
|
ERR_Z3007,
|
|
ERR_Z3008
|
|
}
|
|
zbx_err_codes_t;
|
|
|
|
zbx_err_codes_t zbx_db_last_errcode(void);
|
|
|
|
#ifdef HAVE_POSTGRESQL
|
|
int zbx_tsdb_get_version(void);
|
|
#define ZBX_DB_TSDB_V1 (20000 > zbx_tsdb_get_version())
|
|
#endif
|
|
|
|
#ifdef HAVE_ORACLE
|
|
|
|
/* context for dynamic parameter binding */
|
|
typedef struct
|
|
{
|
|
/* the parameter position, starting with 0 */
|
|
int position;
|
|
/* the parameter type (ZBX_TYPE_* ) */
|
|
unsigned char type;
|
|
/* the maximum parameter size */
|
|
size_t size_max;
|
|
/* the data to bind - array of rows, each row being an array of columns */
|
|
zbx_db_value_t **rows;
|
|
/* custom data, depending on column type */
|
|
void *data;
|
|
}
|
|
zbx_db_bind_context_t;
|
|
|
|
int zbx_db_statement_prepare_basic(const char *sql);
|
|
int zbx_db_bind_parameter_dyn(zbx_db_bind_context_t *context, int position, unsigned char type,
|
|
zbx_db_value_t **rows, int rows_num);
|
|
void zbx_db_clean_bind_context(zbx_db_bind_context_t *context);
|
|
int zbx_db_statement_execute(int iters);
|
|
#endif
|
|
|
|
#if defined (HAVE_MYSQL)
|
|
void zbx_mysql_escape_bin(const char *src, char *dst, size_t size);
|
|
#elif defined(HAVE_POSTGRESQL)
|
|
void zbx_postgresql_escape_bin(const char *src, char **dst, size_t size);
|
|
#endif
|
|
|
|
int zbx_db_vexecute(const char *fmt, va_list args);
|
|
zbx_db_result_t zbx_db_vselect(const char *fmt, va_list args);
|
|
zbx_db_result_t zbx_db_select_n_basic(const char *query, int n);
|
|
|
|
zbx_db_row_t zbx_db_fetch_basic(zbx_db_result_t result);
|
|
void zbx_db_free_result(zbx_db_result_t result);
|
|
int zbx_db_is_null_basic(const char *field);
|
|
|
|
typedef enum
|
|
{
|
|
ESCAPE_SEQUENCE_OFF,
|
|
ESCAPE_SEQUENCE_ON
|
|
}
|
|
zbx_escape_sequence_t;
|
|
char *zbx_db_dyn_escape_string_basic(const char *src, size_t max_bytes, size_t max_chars,
|
|
zbx_escape_sequence_t flag);
|
|
#define ZBX_SQL_LIKE_ESCAPE_CHAR '!'
|
|
char *zbx_db_dyn_escape_like_pattern_basic(const char *src);
|
|
|
|
int zbx_db_strlen_n(const char *text_loc, size_t maxlen);
|
|
|
|
#define ZBX_DB_EXTENSION_TIMESCALEDB "timescaledb"
|
|
|
|
#if defined(HAVE_POSTGRESQL)
|
|
# define ZBX_SUPPORTED_DB_CHARACTER_SET "utf8"
|
|
#elif defined(HAVE_ORACLE)
|
|
# define ZBX_ORACLE_UTF8_CHARSET "AL32UTF8"
|
|
# define ZBX_ORACLE_CESU8_CHARSET "UTF8"
|
|
#elif defined(HAVE_MYSQL)
|
|
# define ZBX_DB_STRLIST_DELIM ','
|
|
# define ZBX_SUPPORTED_DB_CHARACTER_SET_UTF8 "utf8"
|
|
# define ZBX_SUPPORTED_DB_CHARACTER_SET_UTF8MB3 "utf8mb3"
|
|
# define ZBX_SUPPORTED_DB_CHARACTER_SET_UTF8MB4 "utf8mb4"
|
|
# define ZBX_SUPPORTED_DB_CHARACTER_SET ZBX_SUPPORTED_DB_CHARACTER_SET_UTF8 ","\
|
|
ZBX_SUPPORTED_DB_CHARACTER_SET_UTF8MB3 ","\
|
|
ZBX_SUPPORTED_DB_CHARACTER_SET_UTF8MB4
|
|
# define ZBX_SUPPORTED_DB_COLLATION "utf8_bin,utf8mb3_bin,utf8mb4_bin"
|
|
#endif
|
|
|
|
typedef enum
|
|
{ /* db version status flags shared with FRONTEND */
|
|
DB_VERSION_SUPPORTED,
|
|
DB_VERSION_LOWER_THAN_MINIMUM,
|
|
DB_VERSION_HIGHER_THAN_MAXIMUM,
|
|
DB_VERSION_FAILED_TO_RETRIEVE,
|
|
DB_VERSION_NOT_SUPPORTED_ERROR,
|
|
DB_VERSION_NOT_SUPPORTED_WARNING,
|
|
DB_VERSION_HIGHER_THAN_MAXIMUM_ERROR,
|
|
DB_VERSION_HIGHER_THAN_MAXIMUM_WARNING
|
|
}
|
|
zbx_db_version_status_t;
|
|
|
|
typedef enum
|
|
{ /* db extension error codes shared with FRONTEND */
|
|
ZBX_EXT_ERR_UNDEFINED = 0,
|
|
ZBX_EXT_SUCCEED = 1,
|
|
ZBX_TIMESCALEDB_POSTGRES_TOO_OLD,
|
|
ZBX_TIMESCALEDB_VERSION_FAILED_TO_RETRIEVE,
|
|
ZBX_TIMESCALEDB_VERSION_LOWER_THAN_MINIMUM,
|
|
ZBX_TIMESCALEDB_VERSION_NOT_SUPPORTED,
|
|
ZBX_TIMESCALEDB_VERSION_HIGHER_THAN_MAXIMUM,
|
|
ZBX_TIMESCALEDB_LICENSE_NOT_COMMUNITY
|
|
}
|
|
zbx_db_ext_err_code_t;
|
|
|
|
struct zbx_db_version_info_t
|
|
{
|
|
/* information about database server */
|
|
|
|
const char *database;
|
|
|
|
zbx_uint32_t current_version;
|
|
zbx_uint32_t min_version;
|
|
zbx_uint32_t max_version;
|
|
zbx_uint32_t min_supported_version;
|
|
|
|
char *friendly_current_version;
|
|
const char *friendly_min_version;
|
|
const char *friendly_max_version;
|
|
const char *friendly_min_supported_version;
|
|
|
|
zbx_db_version_status_t flag;
|
|
|
|
int history_pk;
|
|
|
|
/* information about database server extension */
|
|
|
|
char *extension;
|
|
|
|
zbx_uint32_t ext_current_version;
|
|
zbx_uint32_t ext_min_version;
|
|
zbx_uint32_t ext_max_version;
|
|
zbx_uint32_t ext_min_supported_version;
|
|
|
|
char *ext_friendly_current_version;
|
|
const char *ext_friendly_min_version;
|
|
const char *ext_friendly_max_version;
|
|
const char *ext_friendly_min_supported_version;
|
|
|
|
zbx_db_version_status_t ext_flag;
|
|
|
|
char *ext_lic;
|
|
zbx_db_ext_err_code_t ext_err_code;
|
|
|
|
int history_compressed_chunks;
|
|
int trends_compressed_chunks;
|
|
#ifdef HAVE_ORACLE
|
|
struct zbx_json tables_json;
|
|
#endif
|
|
};
|
|
|
|
void zbx_dbms_version_info_extract(struct zbx_db_version_info_t *version_info);
|
|
#ifdef HAVE_POSTGRESQL
|
|
void zbx_tsdb_info_extract(struct zbx_db_version_info_t *version_info);
|
|
void zbx_tsdb_set_compression_availability(int compression_availabile);
|
|
int zbx_tsdb_get_compression_availability(void);
|
|
void zbx_tsdb_extract_compressed_chunk_flags(struct zbx_db_version_info_t *version_info);
|
|
#endif
|
|
|
|
int zbx_db_version_check(const char *database, zbx_uint32_t current_version, zbx_uint32_t min_version,
|
|
zbx_uint32_t max_version, zbx_uint32_t min_supported_version);
|
|
void zbx_db_version_json_create(struct zbx_json *json, struct zbx_db_version_info_t *info);
|
|
|
|
#if defined(HAVE_MYSQL)
|
|
# define ZBX_DB_TIMESTAMP() "unix_timestamp()"
|
|
# define ZBX_DB_CHAR_LENGTH(str) "char_length(" #str ")"
|
|
#elif defined(HAVE_POSTGRESQL)
|
|
# define ZBX_DB_TIMESTAMP() "cast(extract(epoch from now()) as int)"
|
|
# define ZBX_DB_CHAR_LENGTH(str) "char_length(" #str ")"
|
|
#elif defined(HAVE_ORACLE)
|
|
# define ZBX_DB_TIMESTAMP() "(cast(sys_extract_utc(systimestamp) as date) - date'1970-01-01') * 86400"
|
|
# define ZBX_DB_CHAR_LENGTH(str) "length(" #str ")"
|
|
#else
|
|
# define ZBX_DB_TIMESTAMP() "cast(strftime('%s', 'now') as integer)"
|
|
# define ZBX_DB_CHAR_LENGTH(str) "length(" #str ")"
|
|
#endif
|
|
|
|
#endif
|