1 2 // vim:sw=2:ai 3 4 /* 5 * Copyright (C) 2010 DeNA Co.,Ltd.. All rights reserved. 6 * See COPYRIGHT.txt for details. 7 */ 8 9 #ifndef DENA_DATABASE_HPP 10 #define DENA_DATABASE_HPP 11 12 #include <string> 13 #include <memory> 14 #include <vector> 15 #include <stdint.h> 16 17 #include "string_buffer.hpp" 18 #include "string_ref.hpp" 19 #include "config.hpp" 20 21 namespace dena { 22 23 struct database_i; 24 typedef std::auto_ptr<volatile database_i> database_ptr; 25 26 struct dbcontext_i; 27 typedef std::auto_ptr<dbcontext_i> dbcontext_ptr; 28 29 struct database_i { ~database_idena::database_i30 virtual ~database_i() { } 31 virtual dbcontext_ptr create_context(bool for_write) volatile = 0; 32 virtual void stop() volatile = 0; 33 virtual const config& get_conf() const volatile = 0; 34 static database_ptr create(const config& conf); 35 }; 36 37 struct prep_stmt { 38 typedef std::vector<uint32_t> fields_type; 39 private: 40 dbcontext_i *dbctx; /* must be valid while *this is alive */ 41 size_t table_id; /* a prep_stmt object holds a refcount of the table */ 42 size_t idxnum; 43 fields_type ret_fields; 44 fields_type filter_fields; 45 public: 46 prep_stmt(); 47 prep_stmt(dbcontext_i *c, size_t tbl, size_t idx, const fields_type& rf, 48 const fields_type& ff); 49 ~prep_stmt(); 50 prep_stmt(const prep_stmt& x); 51 prep_stmt& operator =(const prep_stmt& x); 52 public: get_table_iddena::prep_stmt53 size_t get_table_id() const { return table_id; } get_idxnumdena::prep_stmt54 size_t get_idxnum() const { return idxnum; } get_ret_fieldsdena::prep_stmt55 const fields_type& get_ret_fields() const { return ret_fields; } get_filter_fieldsdena::prep_stmt56 const fields_type& get_filter_fields() const { return filter_fields; } 57 }; 58 59 struct dbcallback_i { ~dbcallback_idena::dbcallback_i60 virtual ~dbcallback_i () { } 61 virtual void dbcb_set_prep_stmt(size_t pst_id, const prep_stmt& v) = 0; 62 virtual const prep_stmt *dbcb_get_prep_stmt(size_t pst_id) const = 0; 63 virtual void dbcb_resp_short(uint32_t code, const char *msg) = 0; 64 virtual void dbcb_resp_short_num(uint32_t code, uint32_t value) = 0; 65 virtual void dbcb_resp_short_num64(uint32_t code, uint64_t value) = 0; 66 virtual void dbcb_resp_begin(size_t num_flds) = 0; 67 virtual void dbcb_resp_entry(const char *fld, size_t fldlen) = 0; 68 virtual void dbcb_resp_end() = 0; 69 virtual void dbcb_resp_cancel() = 0; 70 }; 71 72 enum record_filter_type { 73 record_filter_type_skip = 0, 74 record_filter_type_break = 1, 75 }; 76 77 struct record_filter { 78 record_filter_type filter_type; 79 string_ref op; 80 uint32_t ff_offset; /* offset in filter_fields */ 81 string_ref val; record_filterdena::record_filter82 record_filter() : filter_type(record_filter_type_skip), ff_offset(0) { } 83 }; 84 85 struct cmd_open_args { 86 size_t pst_id; 87 const char *dbn; 88 const char *tbl; 89 const char *idx; 90 const char *retflds; 91 const char *filflds; cmd_open_argsdena::cmd_open_args92 cmd_open_args() : pst_id(0), dbn(0), tbl(0), idx(0), retflds(0), 93 filflds(0) { } 94 }; 95 96 struct cmd_exec_args { 97 const prep_stmt *pst; 98 string_ref op; 99 const string_ref *kvals; 100 size_t kvalslen; 101 uint32_t limit; 102 uint32_t skip; 103 string_ref mod_op; 104 const string_ref *uvals; /* size must be pst->retfieelds.size() */ 105 const record_filter *filters; 106 int invalues_keypart; 107 const string_ref *invalues; 108 size_t invalueslen; cmd_exec_argsdena::cmd_exec_args109 cmd_exec_args() : pst(0), kvals(0), kvalslen(0), limit(0), skip(0), 110 uvals(0), filters(0), invalues_keypart(-1), invalues(0), invalueslen(0) { } 111 }; 112 113 struct dbcontext_i { ~dbcontext_idena::dbcontext_i114 virtual ~dbcontext_i() { } 115 virtual void init_thread(const void *stack_bottom, 116 volatile int& shutdown_flag) = 0; 117 virtual void wait_for_server_to_start() = 0; 118 virtual void term_thread() = 0; 119 virtual bool check_alive() = 0; 120 virtual void lock_tables_if() = 0; 121 virtual void unlock_tables_if() = 0; 122 virtual bool get_commit_error() = 0; 123 virtual void clear_error() = 0; 124 virtual void close_tables_if() = 0; 125 virtual void table_addref(size_t tbl_id) = 0; /* TODO: hide */ 126 virtual void table_release(size_t tbl_id) = 0; /* TODO: hide */ 127 virtual void cmd_open(dbcallback_i& cb, const cmd_open_args& args) = 0; 128 virtual void cmd_exec(dbcallback_i& cb, const cmd_exec_args& args) = 0; 129 virtual void set_statistics(size_t num_conns, size_t num_active) = 0; 130 }; 131 132 }; 133 134 extern unsigned long long int open_tables_count; 135 extern unsigned long long int close_tables_count; 136 extern unsigned long long int lock_tables_count; 137 extern unsigned long long int unlock_tables_count; 138 #if 0 139 extern unsigned long long int index_exec_count; 140 #endif 141 142 #endif 143 144