summaryrefslogtreecommitdiffstats
path: root/libglusterfs/src/gfdb/gfdb_sqlite3.h
diff options
context:
space:
mode:
Diffstat (limited to 'libglusterfs/src/gfdb/gfdb_sqlite3.h')
-rw-r--r--libglusterfs/src/gfdb/gfdb_sqlite3.h288
1 files changed, 288 insertions, 0 deletions
diff --git a/libglusterfs/src/gfdb/gfdb_sqlite3.h b/libglusterfs/src/gfdb/gfdb_sqlite3.h
new file mode 100644
index 00000000000..b0c4b2b5fdd
--- /dev/null
+++ b/libglusterfs/src/gfdb/gfdb_sqlite3.h
@@ -0,0 +1,288 @@
+/*
+ Copyright (c) 2015 Red Hat, Inc. <http://www.redhat.com>
+ This file is part of GlusterFS.
+
+ This file is licensed to you under your choice of the GNU Lesser
+ General Public License, version 3 or any later version (LGPLv3 or
+ later), or the GNU General Public License, version 2 (GPLv2), in all
+ cases as published by the Free Software Foundation.
+*/
+#ifndef __GFDB_SQLITE3_H
+#define __GFDB_SQLITE3_H
+
+
+#ifndef _CONFIG_H
+#define _CONFIG_H
+#include "config.h"
+#endif
+
+/*Sqlite3 header file*/
+#include <sqlite3.h>
+
+#include "logging.h"
+#include "gfdb_data_store_types.h"
+#include "gfdb_mem-types.h"
+
+#define GF_STMT_SIZE_MAX 2048
+
+#define GF_DB_NAME "gfdb.db"
+#define GF_FILE_TABLE "GF_FILE_TB"
+#define GF_FILE_LINK_TABLE "GF_FLINK_TB"
+#define GF_MASTER_TABLE "sqlite_master"
+
+/*Since we have multiple tables to be created we put it in a transaction*/
+#define GF_CREATE_STMT(out_str)\
+do {\
+ sprintf (out_str , "BEGIN; CREATE TABLE IF NOT EXISTS "\
+ GF_FILE_TABLE\
+ "(GF_ID TEXT PRIMARY KEY NOT NULL, "\
+ "W_SEC INTEGER NOT NULL DEFAULT 0, "\
+ "W_MSEC INTEGER NOT NULL DEFAULT 0, "\
+ "UW_SEC INTEGER NOT NULL DEFAULT 0, "\
+ "UW_MSEC INTEGER NOT NULL DEFAULT 0, "\
+ "W_READ_SEC INTEGER NOT NULL DEFAULT 0, "\
+ "W_READ_MSEC INTEGER NOT NULL DEFAULT 0, "\
+ "UW_READ_SEC INTEGER NOT NULL DEFAULT 0, "\
+ "UW_READ_MSEC INTEGER NOT NULL DEFAULT 0, "\
+ "WRITE_FREQ_CNTR INTEGER NOT NULL DEFAULT 1, "\
+ "READ_FREQ_CNTR INTEGER NOT NULL DEFAULT 1); "\
+ "CREATE TABLE IF NOT EXISTS "\
+ GF_FILE_LINK_TABLE\
+ "(GF_ID TEXT NOT NULL, "\
+ "GF_PID TEXT NOT NULL, "\
+ "FNAME TEXT NOT NULL, "\
+ "FPATH TEXT NOT NULL, "\
+ "W_DEL_FLAG INTEGER NOT NULL DEFAULT 0, "\
+ "LINK_UPDATE INTEGER NOT NULL DEFAULT 0, "\
+ "PRIMARY KEY ( GF_ID, GF_PID, FNAME) "\
+ ");"\
+ "COMMIT;"\
+ );;\
+} while (0)
+
+
+#define GF_COL_TB_WSEC GF_FILE_TABLE "." GF_COL_WSEC
+#define GF_COL_TB_WMSEC GF_FILE_TABLE "." GF_COL_WMSEC
+#define GF_COL_TB_UWSEC GF_FILE_TABLE "." GF_COL_UWSEC
+#define GF_COL_TB_UWMSEC GF_FILE_TABLE "." GF_COL_UWMSEC
+#define GF_COL_TB_RWSEC GF_FILE_TABLE "." GF_COL_WSEC_READ
+#define GF_COL_TB_RWMSEC GF_FILE_TABLE "." GF_COL_WMSEC_READ
+#define GF_COL_TB_RUWSEC GF_FILE_TABLE "." GF_COL_UWSEC_READ
+#define GF_COL_TB_RUWMSEC GF_FILE_TABLE "." GF_COL_UWMSEC_READ
+#define GF_COL_TB_WFC GF_FILE_TABLE "." GF_COL_WRITE_FREQ_CNTR
+#define GF_COL_TB_RFC GF_FILE_TABLE "." GF_COL_READ_FREQ_CNTR
+
+
+/*******************************************************************************
+* SQLITE3 Connection details and PRAGMA
+* ****************************************************************************/
+
+#define GF_SQL_AV_NONE "none"
+#define GF_SQL_AV_FULL "full"
+#define GF_SQL_AV_INCR "incr"
+
+
+#define GF_SQL_SYNC_OFF "off"
+#define GF_SQL_SYNC_NORMAL "normal"
+#define GF_SQL_SYNC_FULL "full"
+
+#define GF_SQL_JM_DELETE "delete"
+#define GF_SQL_JM_TRUNCATE "truncate"
+#define GF_SQL_JM_PERSIST "persist"
+#define GF_SQL_JM_MEMORY "memory"
+#define GF_SQL_JM_WAL "wal"
+#define GF_SQL_JM_OFF "off"
+
+
+typedef enum gf_sql_auto_vacuum {
+ gf_sql_av_none = 0,
+ gf_sql_av_full,
+ gf_sql_av_incr,
+ gf_sql_av_invalid
+} gf_sql_auto_vacuum_t;
+
+typedef enum gf_sql_sync {
+ gf_sql_sync_off = 0,
+ gf_sql_sync_normal,
+ gf_sql_sync_full,
+ gf_sql_sync_invalid
+} gf_sql_sync_t;
+
+
+typedef enum gf_sql_journal_mode {
+ gf_sql_jm_wal = 0,
+ gf_sql_jm_delete,
+ gf_sql_jm_truncate,
+ gf_sql_jm_persist,
+ gf_sql_jm_memory,
+ gf_sql_jm_off,
+ gf_sql_jm_invalid
+} gf_sql_journal_mode_t;
+
+
+typedef struct gf_sql_connection {
+ char sqlite3_db_path[PATH_MAX];
+ sqlite3 *sqlite3_db_conn;
+ ssize_t cache_size;
+ ssize_t page_size;
+ ssize_t wal_autocheckpoint;
+ gf_sql_journal_mode_t journal_mode;
+ gf_sql_sync_t synchronous;
+ gf_sql_auto_vacuum_t auto_vacuum;
+} gf_sql_connection_t;
+
+
+
+#define CHECK_SQL_CONN(sql_conn, out)\
+do {\
+ GF_VALIDATE_OR_GOTO(GFDB_STR_SQLITE3, sql_conn, out);\
+ if (!sql_conn->sqlite3_db_conn) {\
+ gf_log (GFDB_STR_SQLITE3, GF_LOG_ERROR,\
+ "sqlite3 connection not initialized");\
+ goto out;\
+ };\
+} while (0)
+
+
+#define GF_SQLITE3_SET_PRAGMA(sqlite3_config_str, param_key, format, value,\
+ ret, error)\
+do {\
+ sprintf(sqlite3_config_str, "PRAGMA " param_key " = " format , value);\
+ ret = sqlite3_exec (sql_conn->sqlite3_db_conn, sqlite3_config_str,\
+ NULL, NULL, NULL);\
+ if (ret != SQLITE_OK) {\
+ gf_log (GFDB_STR_SQLITE3, GF_LOG_ERROR,\
+ "Failed executing: %s : %s",\
+ sqlite3_config_str, sqlite3_errmsg\
+ (sql_conn->sqlite3_db_conn));\
+ ret = -1;\
+ goto error;\
+ };\
+} while (0)
+
+/************************SQLITE3 PARAMS KEYS***********************************/
+#define GFDB_SQL_PARAM_DBPATH "sql-db-path"
+#define GFDB_SQL_PARAM_CACHE_SIZE "sql-db-cachesize"
+#define GFDB_SQL_PARAM_PAGE_SIZE "sql-db-pagesize"
+#define GFDB_SQL_PARAM_JOURNAL_MODE "sql-db-journalmode"
+#define GFDB_SQL_PARAM_WAL_AUTOCHECK "sql-db-wal-autocheckpoint"
+#define GFDB_SQL_PARAM_SYNC "sql-db-sync"
+#define GFDB_SQL_PARAM_AUTO_VACUUM "sql-db-autovacuum"
+
+#define GF_SQL_DEFAULT_DBPATH ""
+#define GF_SQL_DEFAULT_PAGE_SIZE "4096"
+#define GF_SQL_DEFAULT_CACHE_SIZE "1000"
+#define GF_SQL_DEFAULT_WAL_AUTOCHECKPOINT "1000"
+#define GF_SQL_DEFAULT_JOURNAL_MODE GF_SQL_JM_WAL
+#define GF_SQL_DEFAULT_SYNC GF_SQL_SYNC_NORMAL
+#define GF_SQL_DEFAULT_AUTO_VACUUM GF_SQL_AV_NONE
+
+
+/* Defines the indexs for sqlite params
+ * The order should be maintained*/
+typedef enum sqlite_param_index {
+ sql_dbpath_ix = 0,
+ sql_pagesize_ix,
+ sql_cachesize_ix,
+ sql_journalmode_ix,
+ sql_walautocheck_ix,
+ sql_dbsync_ix,
+ sql_autovacuum_ix,
+ /*This should be in the end*/
+ sql_index_max
+} sqlite_param_index_t;
+
+/* Array to hold the sqlite param keys
+ * The order should be maintained as sqlite_param_index_t*/
+static char *sqlite_params_keys[] = {
+ GFDB_SQL_PARAM_DBPATH,
+ GFDB_SQL_PARAM_PAGE_SIZE,
+ GFDB_SQL_PARAM_CACHE_SIZE,
+ GFDB_SQL_PARAM_JOURNAL_MODE,
+ GFDB_SQL_PARAM_WAL_AUTOCHECK,
+ GFDB_SQL_PARAM_SYNC,
+ GFDB_SQL_PARAM_AUTO_VACUUM
+};
+
+
+/* Array of default values for sqlite params
+ * The order should be maintained as sqlite_param_index_t*/
+static char *sqlite_params_default_value[] = {
+ GF_SQL_DEFAULT_DBPATH,
+ GF_SQL_DEFAULT_PAGE_SIZE,
+ GF_SQL_DEFAULT_CACHE_SIZE,
+ GF_SQL_DEFAULT_JOURNAL_MODE,
+ GF_SQL_DEFAULT_WAL_AUTOCHECKPOINT,
+ GF_SQL_DEFAULT_SYNC,
+ GF_SQL_DEFAULT_AUTO_VACUUM
+};
+
+/*Extract sql params from page_size to auto_vacumm
+ * The dbpath is extracted in a different way*/
+static inline int
+gfdb_set_sql_params(char *comp_name, dict_t *from_dict, dict_t *to_dict)
+{
+ sqlite_param_index_t sql_index = sql_pagesize_ix;
+ char *_val_str = NULL;
+ int ret = -1;
+
+ GF_ASSERT (comp_name);
+ GF_ASSERT (from_dict);
+ GF_ASSERT (to_dict);
+
+ /*Extact and Set of the sql params from page_size*/
+ for (sql_index = sql_pagesize_ix; sql_index < sql_index_max;
+ sql_index++) {
+ _val_str = NULL;
+ GET_DB_PARAM_FROM_DICT_DEFAULT (comp_name, from_dict,
+ sqlite_params_keys[sql_index], _val_str,
+ sqlite_params_default_value[sql_index]);
+ SET_DB_PARAM_TO_DICT (comp_name, to_dict,
+ sqlite_params_keys[sql_index], _val_str, ret, out);
+ }
+out:
+ return ret;
+}
+
+
+
+
+/*************************SQLITE3 GFDB PLUGINS*********************************/
+
+/*Db init and fini modules*/
+int gf_sqlite3_fini (void **db_conn);
+int gf_sqlite3_init (dict_t *args, void **db_conn);
+
+/*insert/update/delete modules*/
+int gf_sqlite3_insert (void *db_conn, gfdb_db_record_t *);
+int gf_sqlite3_delete (void *db_conn, gfdb_db_record_t *);
+
+/*querying modules*/
+int gf_sqlite3_find_all (void *db_conn, gf_query_callback_t,
+ void *_query_cbk_args);
+int gf_sqlite3_find_unchanged_for_time (void *db_conn,
+ gf_query_callback_t query_callback,
+ void *_query_cbk_args,
+ gfdb_time_t *for_time);
+int gf_sqlite3_find_recently_changed_files (void *db_conn,
+ gf_query_callback_t query_callback,
+ void *_query_cbk_args,
+ gfdb_time_t *from_time);
+int gf_sqlite3_find_unchanged_for_time_freq (void *db_conn,
+ gf_query_callback_t query_callback,
+ void *_query_cbk_args,
+ gfdb_time_t *for_time,
+ int write_freq_cnt,
+ int read_freq_cnt,
+ gf_boolean_t clear_counters);
+int gf_sqlite3_find_recently_changed_files_freq (void *db_conn,
+ gf_query_callback_t query_callback,
+ void *_query_cbk_args,
+ gfdb_time_t *from_time,
+ int write_freq_cnt,
+ int read_freq_cnt,
+ gf_boolean_t clear_counters);
+
+void gf_sqlite3_fill_db_operations (gfdb_db_operations_t *gfdb_db_ops);
+
+#endif