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