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
21namespace dena {
22
23struct database_i;
24typedef std::auto_ptr<volatile database_i> database_ptr;
25
26struct dbcontext_i;
27typedef std::auto_ptr<dbcontext_i> dbcontext_ptr;
28
29struct database_i {
30 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
37struct 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:
53 size_t get_table_id() const { return table_id; }
54 size_t get_idxnum() const { return idxnum; }
55 const fields_type& get_ret_fields() const { return ret_fields; }
56 const fields_type& get_filter_fields() const { return filter_fields; }
57};
58
59struct dbcallback_i {
60 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
72enum record_filter_type {
73 record_filter_type_skip = 0,
74 record_filter_type_break = 1,
75};
76
77struct 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;
82 record_filter() : filter_type(record_filter_type_skip), ff_offset(0) { }
83};
84
85struct 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;
92 cmd_open_args() : pst_id(0), dbn(0), tbl(0), idx(0), retflds(0),
93 filflds(0) { }
94};
95
96struct 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;
109 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
113struct dbcontext_i {
114 virtual ~dbcontext_i() { }
115 virtual void init_thread(const void *stack_bottom,
116 volatile int& shutdown_flag) = 0;
117 virtual void term_thread() = 0;
118 virtual bool check_alive() = 0;
119 virtual void lock_tables_if() = 0;
120 virtual void unlock_tables_if() = 0;
121 virtual bool get_commit_error() = 0;
122 virtual void clear_error() = 0;
123 virtual void close_tables_if() = 0;
124 virtual void table_addref(size_t tbl_id) = 0; /* TODO: hide */
125 virtual void table_release(size_t tbl_id) = 0; /* TODO: hide */
126 virtual void cmd_open(dbcallback_i& cb, const cmd_open_args& args) = 0;
127 virtual void cmd_exec(dbcallback_i& cb, const cmd_exec_args& args) = 0;
128 virtual void set_statistics(size_t num_conns, size_t num_active) = 0;
129};
130
131};
132
133extern unsigned long long int open_tables_count;
134extern unsigned long long int close_tables_count;
135extern unsigned long long int lock_tables_count;
136extern unsigned long long int unlock_tables_count;
137#if 0
138extern unsigned long long int index_exec_count;
139#endif
140
141#endif
142
143