977 lines
		
	
	
		
			34 KiB
		
	
	
	
		
			C
		
	
	
			
		
		
	
	
			977 lines
		
	
	
		
			34 KiB
		
	
	
	
		
			C
		
	
	
/*
 | 
						|
 * Copyright (c) 2020, Alibaba Group Holding Limited
 | 
						|
 * Licensed under the Apache License, Version 2.0 (the "License");
 | 
						|
 * you may not use this file except in compliance with the License.
 | 
						|
 * You may obtain a copy of the License at
 | 
						|
 *
 | 
						|
 * http://www.apache.org/licenses/LICENSE-2.0
 | 
						|
 *
 | 
						|
 * Unless required by applicable law or agreed to in writing, software
 | 
						|
 * distributed under the License is distributed on an "AS IS" BASIS,
 | 
						|
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
						|
 * See the License for the specific language governing permissions and
 | 
						|
 * limitations under the License.
 | 
						|
 */
 | 
						|
#pragma once
 | 
						|
 | 
						|
#include "../core/port/likely.h"
 | 
						|
 | 
						|
#include <stdint.h>
 | 
						|
 | 
						|
/** Max table name length as defined in univ.i */
 | 
						|
#define MAX_TABLE_NAME_LEN      320
 | 
						|
#define MAX_DATABASE_NAME_LEN   MAX_TABLE_NAME_LEN
 | 
						|
#define MAX_FULL_NAME_LEN                               \
 | 
						|
        (MAX_TABLE_NAME_LEN + MAX_DATABASE_NAME_LEN + 14)
 | 
						|
 | 
						|
/** Representation of a byte within X-Engine */
 | 
						|
typedef unsigned char xengine_byte_t;
 | 
						|
/** Representation of an unsigned long int within X-Engine */
 | 
						|
 | 
						|
typedef unsigned long int xengine_ulint_t;
 | 
						|
 | 
						|
/** A signed 8 bit integral type. */
 | 
						|
typedef int8_t xengine_i8_t;
 | 
						|
 | 
						|
/** An unsigned 8 bit integral type. */
 | 
						|
typedef uint8_t xengine_u8_t;
 | 
						|
 | 
						|
/** A signed 16 bit integral type. */
 | 
						|
typedef int16_t xengine_i16_t;
 | 
						|
 | 
						|
/** An unsigned 16 bit integral type. */
 | 
						|
typedef uint16_t xengine_u16_t;
 | 
						|
 | 
						|
/** A signed 32 bit integral type. */
 | 
						|
typedef int32_t xengine_i32_t;
 | 
						|
 | 
						|
/** An unsigned 32 bit integral type. */
 | 
						|
typedef uint32_t xengine_u32_t;
 | 
						|
 | 
						|
/** A signed 64 bit integral type. */
 | 
						|
typedef int64_t xengine_i64_t;
 | 
						|
 | 
						|
/** An unsigned 64 bit integral type. */
 | 
						|
typedef uint64_t xengine_u64_t;
 | 
						|
 | 
						|
/** Generical X-Engine callback prototype. */
 | 
						|
typedef void (*xengine_cb_t)(void);
 | 
						|
 | 
						|
typedef void*			xengine_opaque_t;
 | 
						|
typedef xengine_opaque_t		XENGINE_CHARset_t;
 | 
						|
typedef xengine_ulint_t		xengine_bool_t;
 | 
						|
typedef xengine_u64_t		xengine_id_u64_t;
 | 
						|
 | 
						|
enum dberr_t {
 | 
						|
	DB_SUCCESS_LOCKED_REC = 9, /*!< like DB_SUCCESS, but a new
 | 
						|
					explicit record lock was created */
 | 
						|
	DB_SUCCESS = 10,
 | 
						|
 | 
						|
	/* The following are error codes */
 | 
						|
	DB_ERROR,
 | 
						|
	DB_INTERRUPTED,
 | 
						|
	DB_OUT_OF_MEMORY,
 | 
						|
	DB_OUT_OF_FILE_SPACE,
 | 
						|
	DB_LOCK_WAIT,
 | 
						|
	DB_DEADLOCK,
 | 
						|
	DB_ROLLBACK,
 | 
						|
	DB_DUPLICATE_KEY,
 | 
						|
	DB_QUE_THR_SUSPENDED,
 | 
						|
	DB_MISSING_HISTORY, /*!< required history data has been
 | 
						|
					deleted due to lack of space in
 | 
						|
					rollback segment */
 | 
						|
	DB_CLUSTER_NOT_FOUND = 30,
 | 
						|
	DB_TABLE_NOT_FOUND,
 | 
						|
	DB_MUST_GET_MORE_FILE_SPACE, /*!< the database has to be stopped
 | 
						|
					and restarted with more file space */
 | 
						|
	DB_TABLE_IS_BEING_USED,
 | 
						|
	DB_TOO_BIG_RECORD,					 /*!< a record in an index would not fit
 | 
						|
					on a compressed page, or it would
 | 
						|
					become bigger than 1/2 free space in
 | 
						|
					an uncompressed page frame */
 | 
						|
	DB_LOCK_WAIT_TIMEOUT,				 /*!< lock wait lasted too long */
 | 
						|
	DB_NO_REFERENCED_ROW,				 /*!< referenced key value not found
 | 
						|
					for a foreign key in an insert or
 | 
						|
					update of a row */
 | 
						|
	DB_ROW_IS_REFERENCED,				 /*!< cannot delete or update a row
 | 
						|
					because it contains a key value
 | 
						|
					which is referenced */
 | 
						|
	DB_CANNOT_ADD_CONSTRAINT,		 /*!< adding a foreign key constraint
 | 
						|
					to a table failed */
 | 
						|
	DB_CORRUPTION,							 /*!< data structure corruption
 | 
						|
					noticed */
 | 
						|
	DB_CANNOT_DROP_CONSTRAINT,	 /*!< dropping a foreign key constraint
 | 
						|
					from a table failed */
 | 
						|
	DB_NO_SAVEPOINT,						 /*!< no savepoint exists with the given
 | 
						|
					name */
 | 
						|
	DB_TABLESPACE_EXISTS,				 /*!< we cannot create a new single-table
 | 
						|
					tablespace because a file of the same
 | 
						|
					name already exists */
 | 
						|
	DB_TABLESPACE_DELETED,			 /*!< tablespace was deleted or is
 | 
						|
					being dropped right now */
 | 
						|
	DB_TABLESPACE_NOT_FOUND,		 /*<! Attempt to delete a tablespace
 | 
						|
					instance that was not found in the
 | 
						|
					tablespace hash table */
 | 
						|
	DB_LOCK_TABLE_FULL,					 /*!< lock structs have exhausted the
 | 
						|
					buffer pool (for big transactions,
 | 
						|
					InnoDB stores the lock structs in the
 | 
						|
					buffer pool) */
 | 
						|
	DB_FOREIGN_DUPLICATE_KEY,		 /*!< foreign key constraints
 | 
						|
					activated by the operation would
 | 
						|
					lead to a duplicate key in some
 | 
						|
					table */
 | 
						|
	DB_TOO_MANY_CONCURRENT_TRXS, /*!< when InnoDB runs out of the
 | 
						|
					preconfigured undo slots, this can
 | 
						|
					only happen when there are too many
 | 
						|
					concurrent transactions */
 | 
						|
	DB_UNSUPPORTED,							 /*!< when InnoDB sees any artefact or
 | 
						|
					a feature that it can't recoginize or
 | 
						|
					work with e.g., FT indexes created by
 | 
						|
					a later version of the engine. */
 | 
						|
 | 
						|
	DB_INVALID_NULL, /*!< a NOT NULL column was found to
 | 
						|
					be NULL during table rebuild */
 | 
						|
 | 
						|
	DB_STATS_DO_NOT_EXIST,				 /*!< an operation that requires the
 | 
						|
					persistent storage, used for recording
 | 
						|
					table and index statistics, was
 | 
						|
					requested but this storage does not
 | 
						|
					exist itself or the stats for a given
 | 
						|
					table do not exist */
 | 
						|
	DB_FOREIGN_EXCEED_MAX_CASCADE, /*!< Foreign key constraint related
 | 
						|
					cascading delete/update exceeds
 | 
						|
					maximum allowed depth */
 | 
						|
	DB_CHILD_NO_INDEX,						 /*!< the child (foreign) table does
 | 
						|
					not have an index that contains the
 | 
						|
					foreign keys as its prefix columns */
 | 
						|
	DB_PARENT_NO_INDEX,						 /*!< the parent table does not
 | 
						|
					have an index that contains the
 | 
						|
					foreign keys as its prefix columns */
 | 
						|
	DB_TOO_BIG_INDEX_COL,					 /*!< index column size exceeds
 | 
						|
					maximum limit */
 | 
						|
	DB_INDEX_CORRUPT,							 /*!< we have corrupted index */
 | 
						|
	DB_UNDO_RECORD_TOO_BIG,				 /*!< the undo log record is too big */
 | 
						|
	DB_READ_ONLY,									 /*!< Update operation attempted in
 | 
						|
					a read-only transaction */
 | 
						|
	DB_FTS_INVALID_DOCID,					 /* FTS Doc ID cannot be zero */
 | 
						|
	DB_TABLE_IN_FK_CHECK,					 /* table is being used in foreign
 | 
						|
					key check */
 | 
						|
	DB_ONLINE_LOG_TOO_BIG,				 /*!< Modification log grew too big
 | 
						|
					during online index creation */
 | 
						|
 | 
						|
	DB_IDENTIFIER_TOO_LONG,						/*!< Identifier name too long */
 | 
						|
	DB_FTS_EXCEED_RESULT_CACHE_LIMIT, /*!< FTS query memory
 | 
						|
					exceeds result cache limit */
 | 
						|
	DB_TEMP_FILE_WRITE_FAIL,					/*!< Temp file write failure */
 | 
						|
	DB_CANT_CREATE_GEOMETRY_OBJECT,		/*!< Cannot create specified Geometry
 | 
						|
					data object */
 | 
						|
	DB_CANNOT_OPEN_FILE,							/*!< Cannot open a file */
 | 
						|
	DB_FTS_TOO_MANY_WORDS_IN_PHRASE,
 | 
						|
	/*< Too many words in a phrase */
 | 
						|
 | 
						|
	DB_TABLESPACE_TRUNCATED, /*!< tablespace was truncated */
 | 
						|
 | 
						|
	DB_IO_ERROR = 100, /*!< Generic IO error */
 | 
						|
 | 
						|
	DB_IO_DECOMPRESS_FAIL, /*!< Failure to decompress a page
 | 
						|
					after reading it from disk */
 | 
						|
 | 
						|
	DB_IO_NO_PUNCH_HOLE, /*!< Punch hole not supported by
 | 
						|
					InnoDB */
 | 
						|
 | 
						|
	DB_IO_NO_PUNCH_HOLE_FS, /*!< The file system doesn't support
 | 
						|
					punch hole */
 | 
						|
 | 
						|
	DB_IO_NO_PUNCH_HOLE_TABLESPACE, /*!< The tablespace doesn't support
 | 
						|
					punch hole */
 | 
						|
 | 
						|
	DB_IO_DECRYPT_FAIL, /*!< Failure to decrypt a page
 | 
						|
					after reading it from disk */
 | 
						|
 | 
						|
	DB_IO_NO_ENCRYPT_TABLESPACE, /*!< The tablespace doesn't support
 | 
						|
					encrypt */
 | 
						|
 | 
						|
	DB_IO_PARTIAL_FAILED, /*!< Partial IO request failed */
 | 
						|
 | 
						|
	DB_FORCED_ABORT, /*!< Transaction was forced to rollback
 | 
						|
					by a higher priority transaction */
 | 
						|
 | 
						|
	DB_TABLE_CORRUPT, /*!< Table/clustered index is
 | 
						|
					corrupted */
 | 
						|
 | 
						|
	DB_WRONG_FILE_NAME, /*!< Invalid Filename */
 | 
						|
 | 
						|
	DB_COMPUTE_VALUE_FAILED, /*!< Compute generated value failed */
 | 
						|
	DB_NO_FK_ON_S_BASE_COL,	/*!< Cannot add foreign constrain
 | 
						|
					placed on the base column of
 | 
						|
					stored column */
 | 
						|
 | 
						|
	/* The following are partial failure codes */
 | 
						|
	DB_FAIL = 1000,
 | 
						|
	DB_OVERFLOW,
 | 
						|
	DB_UNDERFLOW,
 | 
						|
	DB_STRONG_FAIL,
 | 
						|
	DB_ZIP_OVERFLOW,
 | 
						|
	DB_RECORD_NOT_FOUND = 1500,
 | 
						|
	DB_END_OF_INDEX,
 | 
						|
	DB_NOT_FOUND, /*!< Generic error code for "Not found"
 | 
						|
					type of errors */
 | 
						|
 | 
						|
	/* The following are API only error codes. */
 | 
						|
	DB_DATA_MISMATCH = 2000, /*!< Column update or read failed
 | 
						|
					because the types mismatch */
 | 
						|
 | 
						|
	DB_SCHEMA_NOT_LOCKED, /*!< If an API function expects the
 | 
						|
					schema to be locked in exclusive mode
 | 
						|
					and if it's not then that API function
 | 
						|
					will return this error code */
 | 
						|
 | 
						|
	DB_SNAPSHOT_ERROR, /* Secondary read needs a snapshot, if not returh this */
 | 
						|
 | 
						|
	DB_UNPACK_ERROR, /* Failed to unpack record */
 | 
						|
 | 
						|
	DB_GET_ERROR, /* Failed to call DB::Get */
 | 
						|
	
 | 
						|
	/* The following are only for x_protocol */
 | 
						|
	DB_X_PROTOCOL_WRONG_VERSION = 3000,
 | 
						|
	DB_X_PROTOCOL_EINVAL,
 | 
						|
	DB_X_PROTOCOL_INVISIBLE_CONFIG,
 | 
						|
	DB_RES_OVERFLOW,
 | 
						|
	/* meta information in container is invalid */
 | 
						|
	DB_META_INVAL
 | 
						|
};
 | 
						|
 | 
						|
#define XENGINE_SQL_NULL 0xFFFFFFFF
 | 
						|
#define XENGINE_CFG_BINLOG_ENABLED 0x1
 | 
						|
#define XENGINE_CFG_MDL_ENABLED 0x2
 | 
						|
#define XENGINE_CFG_DISABLE_ROWLOCK 0x4
 | 
						|
 | 
						|
/** @enum xengine_col_type_t  column types that are supported. */
 | 
						|
typedef enum xengine_col_enum {
 | 
						|
  XENGINE_VARCHAR = 1, /* Character varying length. The
 | 
						|
					column is not padded. */
 | 
						|
 | 
						|
  XENGINE_CHAR = 2, /* Fixed length character string. The
 | 
						|
					column is padded to the right. */
 | 
						|
 | 
						|
  XENGINE_BINARY = 3, /* Fixed length binary, similar to
 | 
						|
					XENGINE_CHAR but the column is not padded
 | 
						|
					to the right. */
 | 
						|
 | 
						|
  XENGINE_VARBINARY = 4, /* Variable length binary */
 | 
						|
 | 
						|
  XENGINE_BLOB = 5, /* Binary large object, or
 | 
						|
					a TEXT type */
 | 
						|
 | 
						|
  XENGINE_INT = 6, /* Integer: can be any size
 | 
						|
					from 1 - 8 bytes. If the size is
 | 
						|
					1, 2, 4 and 8 bytes then you can use
 | 
						|
					the typed read and write functions. For
 | 
						|
					other sizes you will need to use the
 | 
						|
					xengine_col_get_value() function and do the
 | 
						|
					conversion yourself. */
 | 
						|
 | 
						|
  XENGINE_SYS = 8, /* System column, this column can
 | 
						|
					be one of DATA_TRX_ID, DATA_ROLL_PTR
 | 
						|
					or DATA_ROW_ID. */
 | 
						|
 | 
						|
  XENGINE_FLOAT = 9, /* C (float)  floating point value. */
 | 
						|
 | 
						|
  XENGINE_DOUBLE = 10, /* C (double) floating point value. */
 | 
						|
 | 
						|
  XENGINE_DECIMAL = 11, /* Decimal stored as an ASCII string */
 | 
						|
 | 
						|
  XENGINE_VARCHAR_ANYCHARSET = 12, /* Any charset, varying length */
 | 
						|
 | 
						|
  XENGINE_CHAR_ANYCHARSET = 13, /* Any charset, fixed length */
 | 
						|
 | 
						|
	XENGINE_DATETIME = 14,
 | 
						|
 | 
						|
	XENGINE_DATETIME2 = 15,
 | 
						|
 | 
						|
	XENGINE_NEWDECIMAL = 16
 | 
						|
} xengine_col_type_t;
 | 
						|
 | 
						|
/** @enum xengine_col_attr_t XDB column attributes */
 | 
						|
typedef enum {
 | 
						|
  XENGINE_COL_NONE = 0, /* No special attributes. */
 | 
						|
 | 
						|
  XENGINE_COL_NOT_NULL = 1, /* Column data can't be NULL. */
 | 
						|
 | 
						|
  XENGINE_COL_UNSIGNED = 2, /* Column is XENGINE_INT and unsigned. */
 | 
						|
 | 
						|
  XENGINE_COL_NOT_USED = 4, /* Future use, reserved. */
 | 
						|
 | 
						|
  XENGINE_COL_CUSTOM1 = 8, /* Custom precision type, this is
 | 
						|
					a bit that is ignored by XDB and so
 | 
						|
					can be set and queried by users. */
 | 
						|
 | 
						|
  XENGINE_COL_CUSTOM2 = 16, /* Custom precision type, this is
 | 
						|
					a bit that is ignored by XDB and so
 | 
						|
					can be set and queried by users. */
 | 
						|
 | 
						|
  XENGINE_COL_CUSTOM3 = 32 /* Custom precision type, this is
 | 
						|
					a bit that is ignored by XDB and so
 | 
						|
					can be set and queried by users. */
 | 
						|
} xengine_col_attr_t;
 | 
						|
 | 
						|
typedef enum {
 | 
						|
  XENGINE_CLUSTERED = 1, /* clustered index */
 | 
						|
  XENGINE_UNIQUE = 2,    /* unique index */
 | 
						|
  XENGINE_SECONDARY = 8,      /* non-unique secondary */
 | 
						|
  XENGINE_CORRUPT = 16,  /* bit to store the corrupted flag
 | 
						|
										in SYS_INDEXES.TYPE */
 | 
						|
  XENGINE_FTS = 32,      /* FTS index; can't be combined with the
 | 
						|
											other flags */
 | 
						|
  XENGINE_SPATIAL = 64,  /* SPATIAL index; can't be combined with the
 | 
						|
										other flags */
 | 
						|
  XENGINE_VIRTUAL = 128  /* Index on Virtual column */
 | 
						|
} xengine_index_type_t;
 | 
						|
 | 
						|
/* Note: must match lock0types.h */
 | 
						|
/** @enum ib_lck_mode_t InnoDB lock modes. */
 | 
						|
typedef enum {
 | 
						|
	XENGINE_LOCK_IS = 0, /*!< Intention shared, an intention
 | 
						|
					lock should be used to lock tables */
 | 
						|
 | 
						|
	XENGINE_LOCK_IX, /*!< Intention exclusive, an intention
 | 
						|
					lock should be used to lock tables */
 | 
						|
 | 
						|
	XENGINE_LOCK_S, /*!< Shared locks should be used to lock rows */
 | 
						|
 | 
						|
	XENGINE_LOCK_X, /*!< Exclusive locks should be used to lock rows*/
 | 
						|
 | 
						|
	XENGINE_LOCK_TABLE_X, /*!< exclusive table lock */
 | 
						|
 | 
						|
	XENGINE_LOCK_NONE, /*!< This is used internally to note consistent read */
 | 
						|
 | 
						|
	XENGINE_LOCK_NUM = XENGINE_LOCK_NONE /*!< number of lock modes */
 | 
						|
} xengine_lck_mode_t;
 | 
						|
 | 
						|
/** @enum ib_srch_mode_t InnoDB cursor search modes for ib_cursor_moveto().
 | 
						|
Note: Values must match those found in page0cur.h */
 | 
						|
typedef enum {
 | 
						|
	XENGINE_CUR_G = 1, /*!< If search key is not found then
 | 
						|
					position the cursor on the row that
 | 
						|
					is greater than the search key */
 | 
						|
 | 
						|
	XENGINE_CUR_GE = 2, /*!< If the search key not found then
 | 
						|
					position the cursor on the row that
 | 
						|
					is greater than or equal to the search
 | 
						|
					key */
 | 
						|
 | 
						|
	XENGINE_CUR_L = 3, /*!< If search key is not found then
 | 
						|
					position the cursor on the row that
 | 
						|
					is less than the search key */
 | 
						|
 | 
						|
	XENGINE_CUR_LE = 4 /*!< If search key is not found then
 | 
						|
					position the cursor on the row that
 | 
						|
					is less than or equal to the search
 | 
						|
					key */
 | 
						|
} xengine_srch_mode_t;
 | 
						|
 | 
						|
typedef void *xengine_opaque_t;
 | 
						|
typedef xengine_opaque_t XENGINE_CHARset_t;
 | 
						|
/** @struct xengine_col_meta_t XDB column meta data. */
 | 
						|
typedef struct {
 | 
						|
  uint32_t type; /* Type of the column */
 | 
						|
 | 
						|
  uint32_t attr; /* Column attributes */
 | 
						|
 | 
						|
  uint16_t prtype; /* Precise type of the column*/
 | 
						|
 | 
						|
  uint32_t type_len; /* Length of type */
 | 
						|
 | 
						|
  uint16_t client_type; /* 16 bits of data relevant only to
 | 
						|
					the client. XDB doesn't care */
 | 
						|
 | 
						|
  XENGINE_CHARset_t *charset; /* Column charset */
 | 
						|
} xengine_col_meta_t;
 | 
						|
 | 
						|
/* Note: Must be in sync with trx0trx.h */
 | 
						|
/** @enum xengine_trx_level_t Transaction isolation levels */
 | 
						|
typedef enum {
 | 
						|
  XENGINE_TRX_READ_UNCOMMITTED = 0, /* Dirty read: non-locking SELECTs are
 | 
						|
					performed so that we do not look at a
 | 
						|
					possible earlier version of a record;
 | 
						|
					thus they are not 'consistent' reads
 | 
						|
					under this isolation level; otherwise
 | 
						|
					like level 2 */
 | 
						|
 | 
						|
  XENGINE_TRX_READ_COMMITTED = 1, /* Somewhat Oracle-like isolation,
 | 
						|
					except that in range UPDATE and DELETE
 | 
						|
					we must block phantom rows with
 | 
						|
					next-key locks; SELECT ... FOR UPDATE
 | 
						|
					and ...  LOCK IN SHARE MODE only lock
 | 
						|
					the index records, NOT the gaps before
 | 
						|
					them, and thus allow free inserting;
 | 
						|
					each consistent read reads its own
 | 
						|
					snapshot */
 | 
						|
 | 
						|
  XENGINE_TRX_REPEATABLE_READ = 2, /* All consistent reads in the same
 | 
						|
					trx read the same snapshot; full
 | 
						|
					next-key locking used in locking reads
 | 
						|
					to block insertions into gaps */
 | 
						|
 | 
						|
  XENGINE_TRX_SERIALIZABLE = 3 /* All plain SELECTs are converted to
 | 
						|
					LOCK IN SHARE MODE reads */
 | 
						|
} xengine_trx_level_t;
 | 
						|
 | 
						|
/** @enum xengine_match_mode_t Various match modes used by xengine_iter_seek() */
 | 
						|
typedef enum {
 | 
						|
  XENGINE_CLOSEST_MATCH, /* Closest match possible */
 | 
						|
 | 
						|
  XENGINE_EXACT_MATCH, /* Search using a complete key
 | 
						|
					value */
 | 
						|
 | 
						|
  XENGINE_EXACT_PREFIX /* Search using a key prefix which
 | 
						|
					must match to rows: the prefix may
 | 
						|
					contain an incomplete field (the
 | 
						|
					last field in prefix may be just
 | 
						|
					a prefix of a fixed length column) */
 | 
						|
} xengine_match_mode_t;
 | 
						|
 | 
						|
typedef struct {
 | 
						|
	void *db_snapshot_;
 | 
						|
} xengine_trx_t;
 | 
						|
 | 
						|
typedef void *xengine_key_def_t;
 | 
						|
 | 
						|
struct xengine_table_define {
 | 
						|
	int64_t table_name_len_;
 | 
						|
	int64_t db_name_len_;
 | 
						|
	const char *table_name_;
 | 
						|
	const char *db_name_;
 | 
						|
	int64_t null_bytes_;
 | 
						|
	unsigned char *null_mask_array_;
 | 
						|
	int64_t *null_byte_offset_array_;
 | 
						|
	int64_t col_buffer_size_;
 | 
						|
	int64_t col_array_len_;
 | 
						|
	int64_t *col_length_array_;
 | 
						|
	void **field_array_;
 | 
						|
	const char **col_name_array_;
 | 
						|
	void *db_obj_; 	// myx::Xdb_tbl_def *db_obj_
 | 
						|
	void *table_; 	// TABLE *table_
 | 
						|
	xengine_key_def_t pk_def_;
 | 
						|
	int64_t pk_parts_;
 | 
						|
};
 | 
						|
 | 
						|
typedef struct xengine_table_define *xengine_table_def_t;
 | 
						|
 | 
						|
struct xengine_request {
 | 
						|
	void *buf_;
 | 
						|
	xengine_table_def_t table_def_;
 | 
						|
	xengine_match_mode_t match_mode_;
 | 
						|
	xengine_trx_t *read_trx_;
 | 
						|
	int64_t lock_type_;
 | 
						|
	void *thd_;
 | 
						|
};
 | 
						|
 | 
						|
typedef struct {
 | 
						|
	int64_t size_;
 | 
						|
	char *data_;
 | 
						|
	int64_t *offset_array_;
 | 
						|
	uint64_t *length_array_; // use uint64_t to include XENGINE_SQL_NULL
 | 
						|
	char **data_array_;
 | 
						|
	int64_t *null_offset_array_;
 | 
						|
	unsigned char *null_mask_array_;
 | 
						|
	int64_t key_parts_;
 | 
						|
  void *buffer_;
 | 
						|
} xengine_tuple_t;
 | 
						|
 | 
						|
typedef struct {
 | 
						|
	xengine_key_def_t key_def_;
 | 
						|
	uint32_t cf_id_;
 | 
						|
	uint32_t index_number_;
 | 
						|
	void *iter_;
 | 
						|
	xengine_tuple_t key_tuple_;  // just a buffer, different from Iterator::key
 | 
						|
	xengine_tuple_t value_tuple_;
 | 
						|
	char *upper_bound_;
 | 
						|
	uint64_t upper_bound_size_;
 | 
						|
	char *lower_bound_;
 | 
						|
	uint64_t lower_bound_size_;
 | 
						|
	xengine_bool_t is_primary_;
 | 
						|
	int64_t seek_key_parts_;
 | 
						|
} xengine_iter_t;
 | 
						|
 | 
						|
typedef enum dberr_t xengine_err_t;
 | 
						|
typedef struct xengine_request *xengine_request_t;
 | 
						|
typedef xengine_tuple_t *xengine_tpl_t;
 | 
						|
 | 
						|
/* Open an X-Engine table by name and return a cursor handle to it.
 | 
						|
@return DB_SUCCESS or err code */
 | 
						|
xengine_err_t xengine_open_table(
 | 
						|
		const char *db_name,				/* in: db name */
 | 
						|
		const char *table_name,			/* in: table name */
 | 
						|
		void *thd,
 | 
						|
		void *mysql_table,
 | 
						|
		int64_t lock_type,
 | 
						|
		xengine_request_t *req); /* out, own: X-Engine request context */
 | 
						|
 | 
						|
/* Start a transaction that's been rolled back. This special function
 | 
						|
exists for the case when X-Engine's deadlock detector has rolledack
 | 
						|
a transaction. While the transaction has been rolled back the handle
 | 
						|
is still valid and can be reused by calling this function. If you
 | 
						|
don't want to reuse the transaction handle then you can free the handle
 | 
						|
by calling xengine_trx_release().
 | 
						|
@return X-Engine txn handle */
 | 
						|
xengine_err_t xengine_trx_start(
 | 
						|
		xengine_trx_t *trx,						 	/* in: transaction to restart */
 | 
						|
		xengine_trx_level_t trx_level, 	/* in: trx isolation level */
 | 
						|
		xengine_bool_t read_write,		  /* in: true if read write transaction */
 | 
						|
		xengine_bool_t auto_commit,			/* in: auto commit after each single DML */
 | 
						|
		void *thd);								 			/* in: THD */
 | 
						|
 | 
						|
/* Begin a transaction. This will allocate a new transaction handle and
 | 
						|
put the transaction in the active state.
 | 
						|
@return X-Engine txn handle */
 | 
						|
xengine_trx_t *xengine_trx_begin(
 | 
						|
		xengine_trx_level_t trx_level, 	/* in: trx isolation level */
 | 
						|
		xengine_bool_t read_write,			/* in: true if read write transaction */
 | 
						|
		xengine_bool_t auto_commit);		/* in: auto commit after each single DML */
 | 
						|
 | 
						|
/* Check if the transaction is read_only */
 | 
						|
uint32_t xengine_trx_read_only(
 | 
						|
		xengine_trx_t *trx); 					 /* in: trx handle */
 | 
						|
 | 
						|
/* Release the resources of the transaction. If the transaction was
 | 
						|
selected as a victim by X-Engine and rolled back then use this function
 | 
						|
to free the transaction handle.
 | 
						|
@return DB_SUCCESS or err code */
 | 
						|
xengine_err_t xengine_trx_release(
 | 
						|
		xengine_trx_t *xengine_trx); /* in: trx handle */
 | 
						|
 | 
						|
/* Commit a transaction. This function will release the schema latches too.
 | 
						|
It will also free the transaction handle.
 | 
						|
@return DB_SUCCESS or err code */
 | 
						|
xengine_err_t xengine_trx_commit(
 | 
						|
		xengine_trx_t *xengine_trx); /* in: trx handle */
 | 
						|
 | 
						|
/* Rollback a transaction. This function will release the schema latches too.
 | 
						|
It will also free the transaction handle.
 | 
						|
@return DB_SUCCESS or err code */
 | 
						|
xengine_err_t xengine_trx_rollback(
 | 
						|
		xengine_trx_t *xengine_trx); /* in: trx handle */
 | 
						|
 | 
						|
/* Open an X-Engine table and return a cursor handle to it.
 | 
						|
@return DB_SUCCESS or err code */
 | 
						|
xengine_err_t xengine_open_table_using_id(
 | 
						|
		xengine_id_u64_t table_id, 	/* in: table id of table to open */
 | 
						|
		xengine_trx_t *xengine_trx,	/* in: Current transaction handle can be NULL */
 | 
						|
		xengine_request_t *req);		/* out,own: X-Engine cursor */
 | 
						|
 | 
						|
/* Open an X-Engine secondary index cursor and return a cursor handle to it.
 | 
						|
@return DB_SUCCESS or err code */
 | 
						|
xengine_err_t xengine_open_index_using_name(
 | 
						|
		xengine_request_t req, 				/* in: open/active req */
 | 
						|
		const char *index_name, 			/* in: secondary index name */
 | 
						|
		xengine_iter_t **iter,					/* out,own: X-Engine index iter */
 | 
						|
		int *idx_type,								/* out: index is cluster index */
 | 
						|
		xengine_id_u64_t *idx_id);		/* out: index id */
 | 
						|
 | 
						|
/* Reset the cursor.
 | 
						|
@return DB_SUCCESS or err code */
 | 
						|
xengine_err_t xengine_reset(
 | 
						|
		xengine_request_t xengine_crsr); /* in/out: X-Engine cursor */
 | 
						|
 | 
						|
/* Close an X-Engine table and free the cursor.
 | 
						|
@return DB_SUCCESS or err code */
 | 
						|
xengine_err_t xengine_close(
 | 
						|
		xengine_request_t xengine_crsr); /* in/out: X-Engine cursor */
 | 
						|
 | 
						|
/* Close the table, decrement n_ref_count count.
 | 
						|
@return DB_SUCCESS or err code */
 | 
						|
xengine_err_t xengine_close_table(
 | 
						|
		xengine_request_t xengine_crsr); /* in/out: X-Engine cursor */
 | 
						|
 | 
						|
/* update the cursor with new transactions and also reset the cursor
 | 
						|
@return DB_SUCCESS or err code */
 | 
						|
xengine_err_t xengine_new_trx(
 | 
						|
		xengine_request_t xengine_crsr, 	/* in/out: X-Engine cursor */
 | 
						|
		xengine_trx_t *xengine_trx);		/* in: transaction */
 | 
						|
 | 
						|
/* Commit the transaction in a cursor
 | 
						|
@return DB_SUCCESS or err code */
 | 
						|
xengine_err_t xengine_commit_trx(
 | 
						|
		xengine_request_t xengine_crsr, 	/* in/out: X-Engine cursor */
 | 
						|
		xengine_trx_t *xengine_trx);		/* in: transaction */
 | 
						|
 | 
						|
/* Insert a row to a table.
 | 
						|
@return DB_SUCCESS or err code */
 | 
						|
xengine_err_t xengine_insert_row(
 | 
						|
		xengine_request_t xengine_crsr,			/* in/out: X-Engine cursor instance */
 | 
						|
		const xengine_tpl_t xengine_tpl); /* in: tuple to insert */
 | 
						|
 | 
						|
/*
 | 
						|
Update a row in a table.
 | 
						|
@return DB_SUCCESS or err code */
 | 
						|
xengine_err_t xengine_update_row(
 | 
						|
		xengine_request_t xengine_crsr,					/* in: X-Engine cursor instance */
 | 
						|
		const xengine_tpl_t xengine_old_tpl,	/* in: Old tuple in table */
 | 
						|
		const xengine_tpl_t xengine_new_tpl); /* in: New tuple to update */
 | 
						|
 | 
						|
/* Delete a row in a table.
 | 
						|
@return DB_SUCCESS or err code */
 | 
						|
xengine_err_t xengine_delete_row(
 | 
						|
		xengine_request_t xengine_crsr); /* in: cursor instance */
 | 
						|
 | 
						|
xengine_err_t xengine_pk_search(
 | 
						|
		xengine_request_t req,
 | 
						|
		xengine_tuple_t *key_tuple,
 | 
						|
		xengine_tuple_t *value_tuple);
 | 
						|
 | 
						|
/* Read current row.
 | 
						|
@return DB_SUCCESS or err code */
 | 
						|
xengine_err_t xengine_read_row(
 | 
						|
		xengine_request_t req,
 | 
						|
		xengine_iter_t *iter,		 /* in: X-Engine cursor instance */
 | 
						|
		xengine_tpl_t cmp_tpl,			 /* in: tuple to compare and stop
 | 
						|
					reading */
 | 
						|
		int mode,							 /* in: mode determine when to
 | 
						|
					stop read */
 | 
						|
		void **row_buf,				 	/* in/out: row buffer */
 | 
						|
		xengine_ulint_t *row_len,	 	/* in/out: row buffer len */
 | 
						|
		xengine_ulint_t *used_len); /* in/out: row buffer len used */
 | 
						|
 | 
						|
/* Move cursor to the first record in the table.
 | 
						|
@return DB_SUCCESS or err code */
 | 
						|
xengine_err_t xengine_iter_first(
 | 
						|
		xengine_iter_t *iter);
 | 
						|
 | 
						|
/* Move cursor to the next record in the table.
 | 
						|
@return DB_SUCCESS or err code */
 | 
						|
xengine_err_t xengine_iter_next(
 | 
						|
		xengine_iter_t *iter);
 | 
						|
 | 
						|
/* Search for key.
 | 
						|
@return DB_SUCCESS or err code */
 | 
						|
xengine_err_t xengine_iter_seek(
 | 
						|
		xengine_request_t req,					 /* in: X-Engine cursor instance */
 | 
						|
		xengine_tpl_t xengine_tpl,						 /* in: Key to search for */
 | 
						|
		xengine_iter_t *iter,
 | 
						|
		xengine_srch_mode_t xengine_srch_mode, /* in: search mode */
 | 
						|
		xengine_ulint_t direction);			 /* in: search direction */
 | 
						|
 | 
						|
/* Set the match mode for xengine_move(). */
 | 
						|
void xengine_set_match_mode(
 | 
						|
		xengine_request_t xengine_crsr,					 /* in: Cursor instance */
 | 
						|
		xengine_match_mode_t match_mode); /* in: xengine_iter_seek match mode */
 | 
						|
 | 
						|
/* Set a column of the tuple. Make a copy using the tuple's heap.
 | 
						|
@return DB_SUCCESS or error code */
 | 
						|
xengine_err_t xengine_col_set_value(
 | 
						|
		xengine_tpl_t xengine_tpl,		 /* in: tuple instance */
 | 
						|
		xengine_ulint_t col_no,	 /* in: column index in tuple */
 | 
						|
		const void *src,		 /* in: data value */
 | 
						|
		xengine_ulint_t len,			 /* in: data value len */
 | 
						|
		xengine_bool_t need_cpy); /* in: if need memcpy */
 | 
						|
 | 
						|
/* Get the size of the data available in the column the tuple.
 | 
						|
@return bytes avail or XENGINE_SQL_NULL */
 | 
						|
xengine_ulint_t xengine_col_get_len(
 | 
						|
		xengine_tpl_t xengine_tpl, 	/* in: tuple instance */
 | 
						|
		xengine_ulint_t i);	 				/* in: column index in tuple */
 | 
						|
 | 
						|
/* Copy a column value from the tuple.
 | 
						|
@return bytes copied or XENGINE_SQL_NULL */
 | 
						|
xengine_ulint_t xengine_col_copy_value(
 | 
						|
		xengine_tpl_t xengine_tpl, 	/* in: tuple instance */
 | 
						|
		xengine_ulint_t i,		 			/* in: column index in tuple */
 | 
						|
		void *dst,			 	 					/* out: copied data value */
 | 
						|
		xengine_ulint_t len);  			/* in: max data value len to copy */
 | 
						|
 | 
						|
/* Read a signed int 8 bit column from an X-Engine tuple.
 | 
						|
@return DB_SUCCESS or error */
 | 
						|
xengine_err_t xengine_tuple_read_i8(
 | 
						|
		xengine_tpl_t xengine_tpl, 	/* in: X-Engine tuple */
 | 
						|
		xengine_ulint_t i,		 			/* in: column number */
 | 
						|
		xengine_i8_t *ival);				/* out: integer value */
 | 
						|
 | 
						|
/* Read an unsigned int 8 bit column from an X-Engine tuple.
 | 
						|
@return DB_SUCCESS or error */
 | 
						|
xengine_err_t xengine_tuple_read_u8(
 | 
						|
		xengine_tpl_t xengine_tpl, 	/* in: X-Engine tuple */
 | 
						|
		xengine_ulint_t i,		 			/* in: column number */
 | 
						|
		xengine_u8_t *ival);				/* out: integer value */
 | 
						|
 | 
						|
/* Read a signed int 16 bit column from an X-Engine tuple.
 | 
						|
@return DB_SUCCESS or error */
 | 
						|
xengine_err_t xengine_tuple_read_i16(
 | 
						|
		xengine_tpl_t xengine_tpl, 	/* in: X-Engine tuple */
 | 
						|
		xengine_ulint_t i,		 			/* in: column number */
 | 
						|
		xengine_i16_t *ival); 			/* out: integer value */
 | 
						|
 | 
						|
/* Read an unsigned int 16 bit column from an X-Engine tuple.
 | 
						|
@return DB_SUCCESS or error */
 | 
						|
xengine_err_t xengine_tuple_read_u16(
 | 
						|
		xengine_tpl_t xengine_tpl, 	/* in: X-Engine tuple */
 | 
						|
		xengine_ulint_t i,					/* in: column number */
 | 
						|
		xengine_u16_t *ival); 			/* out: integer value */
 | 
						|
 | 
						|
/* Read a signed int 24 bit column from an X-Engine tuple.
 | 
						|
@return DB_SUCCESS or error */
 | 
						|
xengine_err_t xengine_tuple_read_i24(
 | 
						|
		xengine_tpl_t xengine_tpl, 	/* in: X-Engine tuple */
 | 
						|
		xengine_ulint_t i,		 	/* in: column number */
 | 
						|
		xengine_i32_t *ival); 	/* out: integer value */
 | 
						|
 | 
						|
/* Read an unsigned int 24 bit column from an X-Engine tuple.
 | 
						|
@return DB_SUCCESS or error */
 | 
						|
xengine_err_t xengine_tuple_read_u24(
 | 
						|
		xengine_tpl_t xengine_tpl, 	/* in: X-Engine tuple */
 | 
						|
		xengine_ulint_t i,		 	/* in: column number */
 | 
						|
		xengine_u32_t *ival); 	/* out: integer value */
 | 
						|
 | 
						|
/* Read a signed int 32 bit column from an X-Engine tuple.
 | 
						|
@return DB_SUCCESS or error */
 | 
						|
xengine_err_t xengine_tuple_read_i32(
 | 
						|
		xengine_tpl_t xengine_tpl, 	/* in: X-Engine tuple */
 | 
						|
		xengine_ulint_t i,		 	/* in: column number */
 | 
						|
		xengine_i32_t *ival); 	/* out: integer value */
 | 
						|
 | 
						|
/* Read an unsigned int 32 bit column from an X-Engine tuple.
 | 
						|
@return DB_SUCCESS or error */
 | 
						|
xengine_err_t xengine_tuple_read_u32(
 | 
						|
		xengine_tpl_t xengine_tpl, 	/* in: X-Engine tuple */
 | 
						|
		xengine_ulint_t i,		 	/* in: column number */
 | 
						|
		xengine_u32_t *ival); 	/* out: integer value */
 | 
						|
 | 
						|
/* Read a signed int 64 bit column from an X-Engine tuple.
 | 
						|
@return DB_SUCCESS or error */
 | 
						|
xengine_err_t xengine_tuple_read_i64(
 | 
						|
		xengine_tpl_t xengine_tpl, 	/* in: X-Engine tuple */
 | 
						|
		xengine_ulint_t i,		 			/* in: column number */
 | 
						|
		xengine_i64_t *ival); 			/* out: integer value */
 | 
						|
 | 
						|
/* Read an unsigned int 64 bit column from an X-Engine tuple.
 | 
						|
@return DB_SUCCESS or error */
 | 
						|
xengine_err_t xengine_tuple_read_u64(
 | 
						|
		xengine_tpl_t xengine_tpl, 	/* in: X-Engine tuple */
 | 
						|
		xengine_ulint_t i,		 			/* in: column number */
 | 
						|
		xengine_u64_t *ival); 			/* out: integer value */
 | 
						|
 | 
						|
/* Get a column value pointer from the tuple.
 | 
						|
@return NULL or pointer to buffer */
 | 
						|
const void *xengine_col_get_value(
 | 
						|
		xengine_tuple_t *tpl, 	/* in: X-Engine tuple */
 | 
						|
		xengine_ulint_t i);	 		/* in: column number */
 | 
						|
 | 
						|
/* Get a column type, length and attributes from the tuple.
 | 
						|
@return len of column data */
 | 
						|
xengine_ulint_t xengine_col_get_meta(
 | 
						|
		xengine_request_t req,
 | 
						|
		xengine_tuple_t *tpl,						 		/* in: X-Engine tuple */
 | 
						|
		xengine_ulint_t i,								 	/* in: column number */
 | 
						|
		xengine_col_meta_t *col_meta); 			/* out: column meta data */
 | 
						|
 | 
						|
/* "Clear" or reset an X-Engine tuple. We free the heap and recreate the tuple.
 | 
						|
@return new tuple, or NULL */
 | 
						|
void xengine_tuple_clear(
 | 
						|
		xengine_iter_t **iter,
 | 
						|
		xengine_tuple_t **tpl); 				/* in: X-Engine tuple */
 | 
						|
 | 
						|
/* Create a new cluster key search tuple and copy the contents of  the
 | 
						|
secondary index key tuple columns that refer to the cluster index record
 | 
						|
to the cluster key. It does a deep copy of the column data.
 | 
						|
@return DB_SUCCESS or error code */
 | 
						|
xengine_err_t xengine_tuple_get_cluster_key(
 | 
						|
		xengine_request_t xengine_crsr,					/* in: secondary index cursor */
 | 
						|
		xengine_tpl_t *xengine_dst_tpl,					/* out,own: destination tuple */
 | 
						|
		const xengine_tpl_t xengine_src_tpl); 	/* in: source tuple */
 | 
						|
 | 
						|
/* Create an X-Engine tuple used for index/table search.
 | 
						|
@return tuple for current index */
 | 
						|
xengine_err_t xengine_key_tuple_create(
 | 
						|
		xengine_request_t req,
 | 
						|
		xengine_key_def_t key_def,
 | 
						|
		int64_t key_parts,
 | 
						|
		xengine_tuple_t **tpl); /* in: Cursor instance */
 | 
						|
 | 
						|
xengine_err_t xengine_value_tuple_create(
 | 
						|
		xengine_table_def_t table_def,
 | 
						|
    xengine_tuple_t **tuple);
 | 
						|
 | 
						|
/* Create an X-Engine tuple used for index/table search.
 | 
						|
@return tuple for current index */
 | 
						|
xengine_err_t xengine_sec_iter_create(
 | 
						|
		xengine_request_t req,
 | 
						|
		const char *index_name,
 | 
						|
		xengine_iter_t **iter); /* in: Cursor instance */
 | 
						|
 | 
						|
/* Create an X-Engine tuple used for table key operations.
 | 
						|
@return tuple for current table */
 | 
						|
xengine_err_t xengine_clust_search_tuple_create(
 | 
						|
		xengine_request_t req,
 | 
						|
		xengine_iter_t *iter); /* in: Cursor instance */
 | 
						|
 | 
						|
/* Create an X-Engine tuple for table row operations.
 | 
						|
@return tuple for current table */
 | 
						|
xengine_err_t xengine_clust_iter_create(
 | 
						|
		xengine_request_t req,
 | 
						|
		xengine_iter_t **iter);
 | 
						|
 | 
						|
/* Return the number of user columns in the tuple definition.
 | 
						|
@return number of user columns */
 | 
						|
xengine_ulint_t xengine_iter_get_n_user_cols(
 | 
						|
		const xengine_iter_t *iter); /* in: Tuple for current table */
 | 
						|
 | 
						|
/* Return the number of columns in the tuple definition.
 | 
						|
@return number of columns */
 | 
						|
xengine_ulint_t xengine_iter_get_n_cols(
 | 
						|
		const xengine_iter_t *iter); /* in: Tuple for current table */
 | 
						|
 | 
						|
/* Sets number of fields used in record comparisons.*/
 | 
						|
void xengine_tuple_set_n_fields_cmp(
 | 
						|
		const xengine_tpl_t xengine_tpl,	/* in: Tuple for current index */
 | 
						|
		uint32_t n_fields_cmp); 	/* in: number of fields used in
 | 
						|
					comparisons*/
 | 
						|
 | 
						|
/* Destroy an X-Engine tuple. */
 | 
						|
void xengine_delete_iter(
 | 
						|
		xengine_iter_t *iter);	/* in,own: Iter instance to delete */
 | 
						|
 | 
						|
void xengine_delete_tuple(
 | 
						|
		xengine_tuple_t *tuple);
 | 
						|
 | 
						|
/* Truncate a table. The cursor handle will be closed and set to NULL
 | 
						|
on success.
 | 
						|
@return DB_SUCCESS or error code */
 | 
						|
xengine_err_t xengine_truncate(
 | 
						|
		xengine_request_t *xengine_crsr,			/* in/out: cursor for table
 | 
						|
					to truncate */
 | 
						|
		xengine_id_u64_t *table_id); 	/* out: new table id */
 | 
						|
 | 
						|
/* Get a table id.
 | 
						|
@return DB_SUCCESS if found */
 | 
						|
xengine_err_t xengine_table_get_id(
 | 
						|
		const char *table_name, 	/* in: table to find */
 | 
						|
		xengine_id_u64_t *table_id); 	/* out: table id if found */
 | 
						|
 | 
						|
/* Check if cursor is positioned.
 | 
						|
@return xengine_TRUE if positioned */
 | 
						|
xengine_bool_t xengine_is_positioned(
 | 
						|
		const xengine_request_t xengine_crsr); /* in: X-Engine cursor instance */
 | 
						|
 | 
						|
/* Checks if the data dictionary is latched in exclusive mode by a
 | 
						|
user transaction.
 | 
						|
@return TRUE if exclusive latch */
 | 
						|
xengine_bool_t xengine_schema_lock_is_exclusive(
 | 
						|
		const xengine_trx_t *xengine_trx); 	/* in: transaction */
 | 
						|
 | 
						|
/* Lock an X-Engine cursor/table.
 | 
						|
@return DB_SUCCESS or error code */
 | 
						|
xengine_err_t xengine_lock(
 | 
						|
		xengine_request_t xengine_crsr,					/* in/out: X-Engine cursor */
 | 
						|
		xengine_lck_mode_t xengine_lck_mode); /* in: X-Engine lock mode */
 | 
						|
 | 
						|
/* Set the Lock an X-Engine table using the table id.
 | 
						|
@return DB_SUCCESS or error code */
 | 
						|
xengine_err_t xengine_table_lock(
 | 
						|
		xengine_trx_t *xengine_trx,						/* in/out: transaction */
 | 
						|
		xengine_id_u64_t table_id,				/* in: table id */
 | 
						|
		xengine_lck_mode_t xengine_lck_mode); /* in: X-Engine lock mode */
 | 
						|
 | 
						|
/* Set the Lock mode of the cursor.
 | 
						|
@return DB_SUCCESS or error code */
 | 
						|
xengine_err_t xengine_set_lock_mode(
 | 
						|
		xengine_request_t xengine_crsr,					/* in/out: X-Engine cursor */
 | 
						|
		xengine_lck_mode_t xengine_lck_mode); /* in: X-Engine lock mode */
 | 
						|
 | 
						|
/* Set need to access clustered index record flag. */
 | 
						|
void xengine_set_cluster_access(
 | 
						|
		xengine_request_t xengine_crsr); /* in/out: X-Engine cursor */
 | 
						|
 | 
						|
/* Inform the cursor that it's the start of an SQL statement. */
 | 
						|
void xengine_stmt_begin(
 | 
						|
		xengine_request_t xengine_crsr); /* in: cursor */
 | 
						|
 | 
						|
/* Write a double value to a column.
 | 
						|
@return DB_SUCCESS or error */
 | 
						|
xengine_err_t xengine_tuple_write_double(
 | 
						|
		xengine_tpl_t xengine_tpl, /* in: X-Engine tuple */
 | 
						|
		int col_no,			 /* in: column number */
 | 
						|
		double val);		 /* in: value to write */
 | 
						|
 | 
						|
/* Read a double column value from an X-Engine tuple.
 | 
						|
@return DB_SUCCESS or error */
 | 
						|
xengine_err_t xengine_tuple_read_double(
 | 
						|
		xengine_tpl_t xengine_tpl,	 	/* in: X-Engine tuple */
 | 
						|
		xengine_ulint_t col_no, 	/* in: column number */
 | 
						|
		double *dval);		 		/* out: double value */
 | 
						|
 | 
						|
/* Write a float value to a column.
 | 
						|
@return DB_SUCCESS or error */
 | 
						|
xengine_err_t xengine_tuple_write_float(
 | 
						|
		xengine_tpl_t xengine_tpl, 	/* in/out: tuple to write to */
 | 
						|
		int col_no,			 		/* in: column number */
 | 
						|
		float val);			 		/* in: value to write */
 | 
						|
 | 
						|
/* Read a float value from an X-Engine tuple.
 | 
						|
@return DB_SUCCESS or error */
 | 
						|
xengine_err_t xengine_tuple_read_float(
 | 
						|
		xengine_tpl_t xengine_tpl,	 	/* in: X-Engine tuple */
 | 
						|
		xengine_ulint_t col_no, 	/* in: column number */
 | 
						|
		float *fval);			 		/* out: float value */
 | 
						|
 | 
						|
/* Get a column type, length and attributes from the tuple.
 | 
						|
@return len of column data */
 | 
						|
const char *xengine_col_get_name(
 | 
						|
		xengine_request_t req, 		/* in: X-Engine request instance */
 | 
						|
		xengine_ulint_t i);		 		/* in: column index in tuple */
 | 
						|
 | 
						|
/* Get an index field name from the cursor.
 | 
						|
@return name of the field */
 | 
						|
const char *xengine_get_idx_field_name(
 | 
						|
		xengine_request_t req, 	/* in: X-Engine req instance */
 | 
						|
		xengine_iter_t *iter,		/* iter */
 | 
						|
		xengine_ulint_t i);		 	/* in: column index in tuple */
 | 
						|
 | 
						|
/* Truncate a table.
 | 
						|
@return DB_SUCCESS or error code */
 | 
						|
xengine_err_t xengine_table_truncate(
 | 
						|
		const char *table_name, /* in: table name */
 | 
						|
		xengine_id_u64_t *table_id); /* out: new table id */
 | 
						|
 | 
						|
/* Get generic configure status
 | 
						|
@return configure status*/
 | 
						|
int xengine_cfg_get_cfg();
 | 
						|
 | 
						|
/* Increase/decrease the memcached sync count of table to sync memcached
 | 
						|
DML with SQL DDLs.
 | 
						|
@return DB_SUCCESS or error number */
 | 
						|
xengine_err_t xengine_set_memcached_sync(
 | 
						|
		xengine_request_t xengine_crsr, 	/* in: cursor */
 | 
						|
		xengine_bool_t flag);	 		/* in: true for increasing */
 | 
						|
 | 
						|
/* Return isolation configuration set by "X-Engine_api_trx_level"
 | 
						|
@return trx isolation level*/
 | 
						|
xengine_trx_level_t xengine_cfg_trx_level();
 | 
						|
 | 
						|
/* Return configure value for background commit interval (in seconds)
 | 
						|
@return background commit interval (in seconds) */
 | 
						|
xengine_ulint_t xengine_cfg_bk_commit_interval();
 | 
						|
 | 
						|
/* Get a trx start time.
 | 
						|
@return trx start_time */
 | 
						|
xengine_u64_t xengine_trx_get_start_time(
 | 
						|
		xengine_trx_t *xengine_trx); /* in: transaction */
 | 
						|
 | 
						|
/* Wrapper of ut_strerr() which converts an X-Engine error number to a
 | 
						|
human readable text message.
 | 
						|
@return string, describing the error */
 | 
						|
const char *xengine_ut_strerr(
 | 
						|
		xengine_err_t num); /* in: error number */
 | 
						|
 | 
						|
/** Check the table whether it contains virtual columns.
 | 
						|
@param[in]	crsr	X-Engine Cursor
 | 
						|
@return true if table contains virtual column else false. */
 | 
						|
xengine_bool_t xengine_is_virtual_table(
 | 
						|
		xengine_request_t crsr);
 | 
						|
 | 
						|
/**
 | 
						|
 * set the tuple to be key type
 | 
						|
 * @param xengine_tpl
 | 
						|
 * */
 | 
						|
void xengine_set_tuple_key(
 | 
						|
		xengine_tpl_t xengine_tpl);
 |