/src/tarantool/src/box/session.h
Line | Count | Source |
1 | | #ifndef INCLUDES_TARANTOOL_SESSION_H |
2 | | #define INCLUDES_TARANTOOL_SESSION_H |
3 | | /* |
4 | | * Copyright 2010-2016, Tarantool AUTHORS, please see AUTHORS file. |
5 | | * |
6 | | * Redistribution and use in source and binary forms, with or |
7 | | * without modification, are permitted provided that the following |
8 | | * conditions are met: |
9 | | * |
10 | | * 1. Redistributions of source code must retain the above |
11 | | * copyright notice, this list of conditions and the |
12 | | * following disclaimer. |
13 | | * |
14 | | * 2. Redistributions in binary form must reproduce the above |
15 | | * copyright notice, this list of conditions and the following |
16 | | * disclaimer in the documentation and/or other materials |
17 | | * provided with the distribution. |
18 | | * |
19 | | * THIS SOFTWARE IS PROVIDED BY <COPYRIGHT HOLDER> ``AS IS'' AND |
20 | | * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED |
21 | | * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
22 | | * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL |
23 | | * <COPYRIGHT HOLDER> OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, |
24 | | * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
25 | | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
26 | | * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR |
27 | | * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF |
28 | | * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
29 | | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF |
30 | | * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
31 | | * SUCH DAMAGE. |
32 | | */ |
33 | | #include <inttypes.h> |
34 | | #include <stdbool.h> |
35 | | #include <sys/socket.h> |
36 | | #include "trigger.h" |
37 | | #include "fiber.h" |
38 | | #include "user.h" |
39 | | #include "authentication.h" |
40 | | #include "iproto_features.h" |
41 | | |
42 | | #if defined(__cplusplus) |
43 | | extern "C" { |
44 | | #endif /* defined(__cplusplus) */ |
45 | | |
46 | | struct port; |
47 | | struct session_vtab; |
48 | | |
49 | | void |
50 | | session_init(void); |
51 | | |
52 | | void |
53 | | session_free(void); |
54 | | |
55 | | enum session_type { |
56 | | SESSION_TYPE_BACKGROUND = 0, |
57 | | SESSION_TYPE_BINARY, |
58 | | SESSION_TYPE_CONSOLE, |
59 | | SESSION_TYPE_REPL, |
60 | | SESSION_TYPE_APPLIER, |
61 | | session_type_MAX, |
62 | | }; |
63 | | |
64 | | enum output_format { |
65 | | OUTPUT_FORMAT_YAML = 0, |
66 | | OUTPUT_FORMAT_LUA_LINE, |
67 | | OUTPUT_FORMAT_LUA_BLOCK, |
68 | | }; |
69 | | |
70 | | extern const char *session_type_strs[]; |
71 | | |
72 | | /** |
73 | | * Session meta is used in different ways by sessions of different |
74 | | * types, and allows to do not store attributes in struct session, |
75 | | * that are used only by a session of particular type. |
76 | | */ |
77 | | struct session_meta { |
78 | | union { |
79 | | /** IProto connection. */ |
80 | | void *connection; |
81 | | /** Console file/socket descriptor. */ |
82 | | int fd; |
83 | | }; |
84 | | struct { |
85 | | union { |
86 | | /** Peer address. */ |
87 | | struct sockaddr addr; |
88 | | /** Peer address storage. */ |
89 | | struct sockaddr_storage addrstorage; |
90 | | }; |
91 | | /** Peer address size or 0 if the session is local. */ |
92 | | socklen_t addrlen; |
93 | | } peer; |
94 | | /** Console output format. */ |
95 | | enum output_format output_format; |
96 | | /** IPROTO client features. */ |
97 | | struct iproto_features features; |
98 | | }; |
99 | | |
100 | | /** |
101 | | * Abstraction of a single user session: |
102 | | * for now, only provides accounting of established |
103 | | * sessions and on-connect/on-disconnect event |
104 | | * handling, user credentials. In future: the |
105 | | * client/server protocol, etc. |
106 | | * Session identifiers grow monotonically. |
107 | | * 0 sid is reserved to mean 'no session'. |
108 | | */ |
109 | | struct session { |
110 | | /** Session id. */ |
111 | | uint64_t id; |
112 | | /** SQL Tarantool Default storage engine. */ |
113 | | uint8_t sql_default_engine; |
114 | | /** SQL Connection flag for current user session */ |
115 | | uint32_t sql_flags; |
116 | | enum session_type type; |
117 | | /** Session virtual methods. */ |
118 | | const struct session_vtab *vtab; |
119 | | /** Session metadata. */ |
120 | | struct session_meta meta; |
121 | | /** |
122 | | * Watchers registered for this session (key -> session_watcher). |
123 | | * Allocated on demand. |
124 | | */ |
125 | | struct mh_strnptr_t *watchers; |
126 | | /** |
127 | | * ID of statements prepared in current session. |
128 | | * This map is allocated on demand. |
129 | | */ |
130 | | struct mh_i32ptr_t *sql_stmts; |
131 | | /** Session user id and global grants */ |
132 | | struct credentials credentials; |
133 | | /** Trigger for fiber on_stop to cleanup created on-demand session */ |
134 | | struct trigger fiber_on_stop; |
135 | | /** Link in shutdown_list. */ |
136 | | struct rlist in_shutdown_list; |
137 | | }; |
138 | | |
139 | | struct session_vtab { |
140 | | /** |
141 | | * Push a port data into a session data channel - socket, |
142 | | * console or something. |
143 | | * @param session Session to push into. |
144 | | * @param port Port with data to push. |
145 | | * |
146 | | * @retval 0 Success. |
147 | | * @retval -1 Error. |
148 | | */ |
149 | | int |
150 | | (*push)(struct session *session, struct port *port); |
151 | | /** |
152 | | * Get session file descriptor if exists. |
153 | | * @param session Session to get descriptor from. |
154 | | * @retval -1 No fd. |
155 | | * @retval >=0 Found fd. |
156 | | */ |
157 | | int |
158 | | (*fd)(struct session *session); |
159 | | /** |
160 | | * For iproto requests, we set sync to the value of packet |
161 | | * sync. Since the session may be reused between many |
162 | | * requests, the value is true only at the beginning |
163 | | * of the request, and gets distorted after the first |
164 | | * yield. For other sessions it is 0. |
165 | | */ |
166 | | int64_t |
167 | | (*sync)(struct session *session); |
168 | | }; |
169 | | |
170 | | extern struct session_vtab session_vtab_registry[]; |
171 | | |
172 | | /** Change session type and vtab. */ |
173 | | void |
174 | | session_set_type(struct session *session, enum session_type type); |
175 | | |
176 | | /** |
177 | | * Close a session. It will return errors from all virtual methods |
178 | | * and its type is fixed. |
179 | | */ |
180 | | void |
181 | | session_close(struct session *session); |
182 | | |
183 | | /** |
184 | | * Find a session by id. |
185 | | */ |
186 | | struct session * |
187 | | session_find(uint64_t sid); |
188 | | |
189 | | /** Global on-connect triggers. */ |
190 | | extern struct rlist session_on_connect; |
191 | | extern struct event *session_on_connect_event; |
192 | | |
193 | | /** Global on-auth triggers. */ |
194 | | extern struct rlist session_on_auth; |
195 | | extern struct event *session_on_auth_event; |
196 | | |
197 | | /** |
198 | | * Get the current session from @a fiber |
199 | | * @param fiber fiber |
200 | | * @return session if any |
201 | | * @retval NULL if there is no active session |
202 | | */ |
203 | | static inline struct session * |
204 | | fiber_get_session(struct fiber *fiber) |
205 | 8.62k | { |
206 | 8.62k | return fiber->storage.session; |
207 | 8.62k | } Unexecuted instantiation: box.cc:fiber_get_session(fiber*) Unexecuted instantiation: authentication.c:fiber_get_session Unexecuted instantiation: recovery.cc:fiber_get_session(fiber*) Unexecuted instantiation: applier.cc:fiber_get_session(fiber*) Line | Count | Source | 205 | 2 | { | 206 | 2 | return fiber->storage.session; | 207 | 2 | } |
Unexecuted instantiation: call.c:fiber_get_session build.c:fiber_get_session Line | Count | Source | 205 | 1.56k | { | 206 | 1.56k | return fiber->storage.session; | 207 | 1.56k | } |
Unexecuted instantiation: expr.c:fiber_get_session Unexecuted instantiation: func.c:fiber_get_session Unexecuted instantiation: main.c:fiber_get_session prepare.c:fiber_get_session Line | Count | Source | 205 | 7.05k | { | 206 | 7.05k | return fiber->storage.session; | 207 | 7.05k | } |
Unexecuted instantiation: tokenize.c:fiber_get_session Unexecuted instantiation: vdbeapi.c:fiber_get_session Unexecuted instantiation: vdbeaux.c:fiber_get_session Unexecuted instantiation: console.c:fiber_get_session Unexecuted instantiation: iproto.cc:fiber_get_session(fiber*) Unexecuted instantiation: sysview.c:fiber_get_session Unexecuted instantiation: session_settings.c:fiber_get_session Unexecuted instantiation: vy_tx.c:fiber_get_session Unexecuted instantiation: space.c:fiber_get_session Unexecuted instantiation: sequence.c:fiber_get_session Unexecuted instantiation: alter.cc:fiber_get_session(fiber*) Unexecuted instantiation: schema.cc:fiber_get_session(fiber*) session.c:fiber_get_session Line | Count | Source | 205 | 2 | { | 206 | 2 | return fiber->storage.session; | 207 | 2 | } |
Unexecuted instantiation: txn.c:fiber_get_session Unexecuted instantiation: txn_limbo.c:fiber_get_session Unexecuted instantiation: execute.c:fiber_get_session Unexecuted instantiation: pragma.c:fiber_get_session |
208 | | |
209 | | /** |
210 | | * Set the current session in @a fiber |
211 | | * @param fiber fiber |
212 | | * @param session a value to set |
213 | | */ |
214 | | static inline void |
215 | | fiber_set_session(struct fiber *fiber, struct session *session) |
216 | 2 | { |
217 | 2 | fiber->storage.session = session; |
218 | 2 | } Unexecuted instantiation: box.cc:fiber_set_session(fiber*, session*) Unexecuted instantiation: authentication.c:fiber_set_session Unexecuted instantiation: recovery.cc:fiber_set_session(fiber*, session*) Unexecuted instantiation: applier.cc:fiber_set_session(fiber*, session*) Unexecuted instantiation: sql.c:fiber_set_session Unexecuted instantiation: call.c:fiber_set_session Unexecuted instantiation: build.c:fiber_set_session Unexecuted instantiation: expr.c:fiber_set_session Unexecuted instantiation: func.c:fiber_set_session Unexecuted instantiation: main.c:fiber_set_session Unexecuted instantiation: prepare.c:fiber_set_session Unexecuted instantiation: tokenize.c:fiber_set_session Unexecuted instantiation: vdbeapi.c:fiber_set_session Unexecuted instantiation: vdbeaux.c:fiber_set_session Unexecuted instantiation: console.c:fiber_set_session Unexecuted instantiation: iproto.cc:fiber_set_session(fiber*, session*) Unexecuted instantiation: sysview.c:fiber_set_session Unexecuted instantiation: session_settings.c:fiber_set_session Unexecuted instantiation: vy_tx.c:fiber_set_session Unexecuted instantiation: space.c:fiber_set_session Unexecuted instantiation: sequence.c:fiber_set_session Unexecuted instantiation: alter.cc:fiber_set_session(fiber*, session*) Unexecuted instantiation: schema.cc:fiber_set_session(fiber*, session*) session.c:fiber_set_session Line | Count | Source | 216 | 2 | { | 217 | 2 | fiber->storage.session = session; | 218 | 2 | } |
Unexecuted instantiation: txn.c:fiber_set_session Unexecuted instantiation: txn_limbo.c:fiber_set_session Unexecuted instantiation: execute.c:fiber_set_session Unexecuted instantiation: pragma.c:fiber_set_session |
219 | | |
220 | | /** |
221 | | * Get the current user from @a fiber |
222 | | * @param fiber fiber |
223 | | * @return user if any |
224 | | * @retval NULL if there is no active user |
225 | | */ |
226 | | static inline struct credentials * |
227 | | fiber_get_user(struct fiber *fiber) |
228 | 0 | { |
229 | 0 | return fiber->storage.credentials; |
230 | 0 | } Unexecuted instantiation: box.cc:fiber_get_user(fiber*) Unexecuted instantiation: authentication.c:fiber_get_user Unexecuted instantiation: recovery.cc:fiber_get_user(fiber*) Unexecuted instantiation: applier.cc:fiber_get_user(fiber*) Unexecuted instantiation: sql.c:fiber_get_user Unexecuted instantiation: call.c:fiber_get_user Unexecuted instantiation: build.c:fiber_get_user Unexecuted instantiation: expr.c:fiber_get_user Unexecuted instantiation: func.c:fiber_get_user Unexecuted instantiation: main.c:fiber_get_user Unexecuted instantiation: prepare.c:fiber_get_user Unexecuted instantiation: tokenize.c:fiber_get_user Unexecuted instantiation: vdbeapi.c:fiber_get_user Unexecuted instantiation: vdbeaux.c:fiber_get_user Unexecuted instantiation: console.c:fiber_get_user Unexecuted instantiation: iproto.cc:fiber_get_user(fiber*) Unexecuted instantiation: sysview.c:fiber_get_user Unexecuted instantiation: session_settings.c:fiber_get_user Unexecuted instantiation: vy_tx.c:fiber_get_user Unexecuted instantiation: space.c:fiber_get_user Unexecuted instantiation: sequence.c:fiber_get_user Unexecuted instantiation: alter.cc:fiber_get_user(fiber*) Unexecuted instantiation: schema.cc:fiber_get_user(fiber*) Unexecuted instantiation: session.c:fiber_get_user Unexecuted instantiation: txn.c:fiber_get_user Unexecuted instantiation: txn_limbo.c:fiber_get_user Unexecuted instantiation: execute.c:fiber_get_user Unexecuted instantiation: pragma.c:fiber_get_user |
231 | | |
232 | | /** |
233 | | * Set the current user in @a fiber |
234 | | * @param fiber fiber |
235 | | * @param cr a value to set |
236 | | */ |
237 | | static inline void |
238 | | fiber_set_user(struct fiber *fiber, struct credentials *cr) |
239 | 2 | { |
240 | 2 | fiber->storage.credentials = cr; |
241 | 2 | } Unexecuted instantiation: box.cc:fiber_set_user(fiber*, credentials*) Unexecuted instantiation: authentication.c:fiber_set_user Unexecuted instantiation: recovery.cc:fiber_set_user(fiber*, credentials*) Unexecuted instantiation: applier.cc:fiber_set_user(fiber*, credentials*) Unexecuted instantiation: sql.c:fiber_set_user Unexecuted instantiation: call.c:fiber_set_user Unexecuted instantiation: build.c:fiber_set_user Unexecuted instantiation: expr.c:fiber_set_user Unexecuted instantiation: func.c:fiber_set_user Unexecuted instantiation: main.c:fiber_set_user Unexecuted instantiation: prepare.c:fiber_set_user Unexecuted instantiation: tokenize.c:fiber_set_user Unexecuted instantiation: vdbeapi.c:fiber_set_user Unexecuted instantiation: vdbeaux.c:fiber_set_user Unexecuted instantiation: console.c:fiber_set_user Unexecuted instantiation: iproto.cc:fiber_set_user(fiber*, credentials*) Unexecuted instantiation: sysview.c:fiber_set_user Unexecuted instantiation: session_settings.c:fiber_set_user Unexecuted instantiation: vy_tx.c:fiber_set_user Unexecuted instantiation: space.c:fiber_set_user Unexecuted instantiation: sequence.c:fiber_set_user Unexecuted instantiation: alter.cc:fiber_set_user(fiber*, credentials*) Unexecuted instantiation: schema.cc:fiber_set_user(fiber*, credentials*) Line | Count | Source | 239 | 2 | { | 240 | 2 | fiber->storage.credentials = cr; | 241 | 2 | } |
Unexecuted instantiation: txn.c:fiber_set_user Unexecuted instantiation: txn_limbo.c:fiber_set_user Unexecuted instantiation: execute.c:fiber_set_user Unexecuted instantiation: pragma.c:fiber_set_user |
242 | | |
243 | | /* |
244 | | * For use in local hot standby, which runs directly |
245 | | * from ev watchers (without current fiber), but needs |
246 | | * to execute transactions. |
247 | | */ |
248 | | extern struct credentials admin_credentials; |
249 | | |
250 | | /** |
251 | | * Create a new session on demand, and set fiber on_stop |
252 | | * trigger to destroy it when this fiber ends. |
253 | | */ |
254 | | struct session * |
255 | | session_new_on_demand(void); |
256 | | |
257 | | /* |
258 | | * When creating a new fiber, the database (box) |
259 | | * may not be initialized yet. When later on |
260 | | * this fiber attempts to access the database, |
261 | | * we have no other choice but initialize fiber-specific |
262 | | * database state (something like a database connection) |
263 | | * on demand. This is why this function needs to |
264 | | * check whether or not the current session exists |
265 | | * and create it otherwise. |
266 | | */ |
267 | | static inline struct session * |
268 | | current_session(void) |
269 | 8.62k | { |
270 | 8.62k | struct session *session = fiber_get_session(fiber()); |
271 | 8.62k | if (session == NULL) { |
272 | 2 | session = session_new_on_demand(); |
273 | 2 | assert(session != NULL); |
274 | 2 | } |
275 | 8.62k | return session; |
276 | 8.62k | } Unexecuted instantiation: box.cc:current_session() Unexecuted instantiation: authentication.c:current_session Unexecuted instantiation: recovery.cc:current_session() Unexecuted instantiation: applier.cc:current_session() Line | Count | Source | 269 | 2 | { | 270 | 2 | struct session *session = fiber_get_session(fiber()); | 271 | 2 | if (session == NULL) { | 272 | 2 | session = session_new_on_demand(); | 273 | 2 | assert(session != NULL); | 274 | 2 | } | 275 | 2 | return session; | 276 | 2 | } |
Unexecuted instantiation: call.c:current_session Line | Count | Source | 269 | 1.56k | { | 270 | 1.56k | struct session *session = fiber_get_session(fiber()); | 271 | 1.56k | if (session == NULL) { | 272 | 0 | session = session_new_on_demand(); | 273 | 0 | assert(session != NULL); | 274 | 0 | } | 275 | 1.56k | return session; | 276 | 1.56k | } |
Unexecuted instantiation: expr.c:current_session Unexecuted instantiation: func.c:current_session Unexecuted instantiation: main.c:current_session prepare.c:current_session Line | Count | Source | 269 | 7.05k | { | 270 | 7.05k | struct session *session = fiber_get_session(fiber()); | 271 | 7.05k | if (session == NULL) { | 272 | 0 | session = session_new_on_demand(); | 273 | 0 | assert(session != NULL); | 274 | 0 | } | 275 | 7.05k | return session; | 276 | 7.05k | } |
Unexecuted instantiation: tokenize.c:current_session Unexecuted instantiation: vdbeapi.c:current_session Unexecuted instantiation: vdbeaux.c:current_session Unexecuted instantiation: console.c:current_session Unexecuted instantiation: iproto.cc:current_session() Unexecuted instantiation: sysview.c:current_session Unexecuted instantiation: session_settings.c:current_session Unexecuted instantiation: vy_tx.c:current_session Unexecuted instantiation: space.c:current_session Unexecuted instantiation: sequence.c:current_session Unexecuted instantiation: alter.cc:current_session() Unexecuted instantiation: schema.cc:current_session() Unexecuted instantiation: session.c:current_session Unexecuted instantiation: txn.c:current_session Unexecuted instantiation: txn_limbo.c:current_session Unexecuted instantiation: execute.c:current_session Unexecuted instantiation: pragma.c:current_session |
277 | | |
278 | | /* |
279 | | * Return the current user. Create it if it doesn't |
280 | | * exist yet. |
281 | | * The same rationale for initializing the current |
282 | | * user on demand as in current_session() applies. |
283 | | */ |
284 | | static inline struct credentials * |
285 | | effective_user(void) |
286 | 1.20k | { |
287 | 1.20k | struct fiber *f = fiber(); |
288 | 1.20k | struct credentials *u = f->storage.credentials; |
289 | 1.20k | if (u == NULL) { |
290 | 0 | session_new_on_demand(); |
291 | 0 | u = f->storage.credentials; |
292 | 0 | } |
293 | 1.20k | return u; |
294 | 1.20k | } Unexecuted instantiation: box.cc:effective_user() Unexecuted instantiation: authentication.c:effective_user Unexecuted instantiation: recovery.cc:effective_user() Unexecuted instantiation: applier.cc:effective_user() Unexecuted instantiation: sql.c:effective_user Unexecuted instantiation: call.c:effective_user Line | Count | Source | 286 | 1.20k | { | 287 | 1.20k | struct fiber *f = fiber(); | 288 | 1.20k | struct credentials *u = f->storage.credentials; | 289 | 1.20k | if (u == NULL) { | 290 | 0 | session_new_on_demand(); | 291 | 0 | u = f->storage.credentials; | 292 | 0 | } | 293 | 1.20k | return u; | 294 | 1.20k | } |
Unexecuted instantiation: expr.c:effective_user Unexecuted instantiation: func.c:effective_user Unexecuted instantiation: main.c:effective_user Unexecuted instantiation: prepare.c:effective_user Unexecuted instantiation: tokenize.c:effective_user Unexecuted instantiation: vdbeapi.c:effective_user Unexecuted instantiation: vdbeaux.c:effective_user Unexecuted instantiation: console.c:effective_user Unexecuted instantiation: iproto.cc:effective_user() Unexecuted instantiation: sysview.c:effective_user Unexecuted instantiation: session_settings.c:effective_user Unexecuted instantiation: vy_tx.c:effective_user Unexecuted instantiation: space.c:effective_user Unexecuted instantiation: sequence.c:effective_user Unexecuted instantiation: alter.cc:effective_user() Unexecuted instantiation: schema.cc:effective_user() Unexecuted instantiation: session.c:effective_user Unexecuted instantiation: txn.c:effective_user Unexecuted instantiation: txn_limbo.c:effective_user Unexecuted instantiation: execute.c:effective_user Unexecuted instantiation: pragma.c:effective_user |
295 | | |
296 | | /** Global on-disconnect triggers. */ |
297 | | extern struct rlist session_on_disconnect; |
298 | | extern struct event *session_on_disconnect_event; |
299 | | |
300 | | void |
301 | | session_storage_cleanup(int sid); |
302 | | |
303 | | /** |
304 | | * Create a session. |
305 | | * @return handle for a created session |
306 | | */ |
307 | | struct session * |
308 | | session_new(enum session_type type); |
309 | | |
310 | | /** Return true if given statement id belongs to the session. */ |
311 | | bool |
312 | | session_check_stmt_id(struct session *session, uint32_t stmt_id); |
313 | | |
314 | | /** Add prepared statement ID to the session hash. */ |
315 | | void |
316 | | session_add_stmt_id(struct session *session, uint32_t stmt_id); |
317 | | |
318 | | /** Remove prepared statement ID from the session hash. */ |
319 | | void |
320 | | session_remove_stmt_id(struct session *session, uint32_t stmt_id); |
321 | | |
322 | | /** |
323 | | * Destroy a session. |
324 | | * Must be called by the networking layer on disconnect. |
325 | | * @param session session to destroy. |
326 | | */ |
327 | | void |
328 | | session_delete(struct session *session); |
329 | | |
330 | | /** |
331 | | * Set session peer address. |
332 | | */ |
333 | | static inline void |
334 | | session_set_peer_addr(struct session *session, |
335 | | const struct sockaddr *addr, socklen_t addrlen) |
336 | 0 | { |
337 | 0 | assert(addrlen <= sizeof(session->meta.peer.addrstorage)); |
338 | 0 | memcpy(&session->meta.peer.addrstorage, addr, addrlen); |
339 | 0 | session->meta.peer.addrlen = addrlen; |
340 | 0 | } Unexecuted instantiation: box.cc:session_set_peer_addr(session*, sockaddr const*, unsigned int) Unexecuted instantiation: authentication.c:session_set_peer_addr Unexecuted instantiation: recovery.cc:session_set_peer_addr(session*, sockaddr const*, unsigned int) Unexecuted instantiation: applier.cc:session_set_peer_addr(session*, sockaddr const*, unsigned int) Unexecuted instantiation: sql.c:session_set_peer_addr Unexecuted instantiation: call.c:session_set_peer_addr Unexecuted instantiation: build.c:session_set_peer_addr Unexecuted instantiation: expr.c:session_set_peer_addr Unexecuted instantiation: func.c:session_set_peer_addr Unexecuted instantiation: main.c:session_set_peer_addr Unexecuted instantiation: prepare.c:session_set_peer_addr Unexecuted instantiation: tokenize.c:session_set_peer_addr Unexecuted instantiation: vdbeapi.c:session_set_peer_addr Unexecuted instantiation: vdbeaux.c:session_set_peer_addr Unexecuted instantiation: console.c:session_set_peer_addr Unexecuted instantiation: iproto.cc:session_set_peer_addr(session*, sockaddr const*, unsigned int) Unexecuted instantiation: sysview.c:session_set_peer_addr Unexecuted instantiation: session_settings.c:session_set_peer_addr Unexecuted instantiation: vy_tx.c:session_set_peer_addr Unexecuted instantiation: space.c:session_set_peer_addr Unexecuted instantiation: sequence.c:session_set_peer_addr Unexecuted instantiation: alter.cc:session_set_peer_addr(session*, sockaddr const*, unsigned int) Unexecuted instantiation: schema.cc:session_set_peer_addr(session*, sockaddr const*, unsigned int) Unexecuted instantiation: session.c:session_set_peer_addr Unexecuted instantiation: txn.c:session_set_peer_addr Unexecuted instantiation: txn_limbo.c:session_set_peer_addr Unexecuted instantiation: execute.c:session_set_peer_addr Unexecuted instantiation: pragma.c:session_set_peer_addr |
341 | | |
342 | | /** |
343 | | * Return session peer name or NULL if the session is local. |
344 | | * The string is allocated in the static buffer. |
345 | | */ |
346 | | const char * |
347 | | session_peer(const struct session *session); |
348 | | |
349 | | /** Run on-connect triggers */ |
350 | | int |
351 | | session_run_on_connect_triggers(struct session *session); |
352 | | |
353 | | /** Run on-disconnect triggers */ |
354 | | void |
355 | | session_run_on_disconnect_triggers(struct session *session); |
356 | | |
357 | | /** Run auth triggers */ |
358 | | int |
359 | | session_run_on_auth_triggers(const struct on_auth_trigger_ctx *result); |
360 | | |
361 | | typedef void |
362 | | (*session_notify_f)(struct session *session, uint64_t sync, |
363 | | const char *key, size_t key_len, |
364 | | const char *data, const char *data_end); |
365 | | |
366 | | /** |
367 | | * If there's no watcher registered for the specified key in the given session, |
368 | | * this function registers one, otherwise it acknowledges a notification. |
369 | | * |
370 | | * The callback will be called unconditionally right after registration and |
371 | | * then every time the key is updated provided the last notification was |
372 | | * acknowledged. |
373 | | * |
374 | | * The given sync number will be passed to the callback on each invocation. |
375 | | */ |
376 | | void |
377 | | session_watch(struct session *session, uint64_t sync, |
378 | | const char *key, size_t key_len, session_notify_f cb); |
379 | | |
380 | | /** |
381 | | * Unregisters a watcher registered for the given session and notification key. |
382 | | * Does nothing if there's no watcher registered |
383 | | */ |
384 | | void |
385 | | session_unwatch(struct session *session, const char *key, size_t key_len); |
386 | | |
387 | | /** |
388 | | * Check whether or not the current user is authorized to connect |
389 | | */ |
390 | | int |
391 | | access_check_session(struct user *user); |
392 | | |
393 | | /** |
394 | | * Check whether or not the current user can be granted |
395 | | * the requested access to the universe. |
396 | | */ |
397 | | int |
398 | | access_check_universe(user_access_t access); |
399 | | |
400 | | /** |
401 | | * This function is called by public API wrappers around session push. |
402 | | * It logs a deprecation warning. If session push is disabled, it also |
403 | | * sets diag and returns -1. |
404 | | */ |
405 | | int |
406 | | session_push_check_deprecation(void); |
407 | | |
408 | | static inline int |
409 | | session_push(struct session *session, struct port *port) |
410 | 0 | { |
411 | 0 | return session->vtab->push(session, port); |
412 | 0 | } Unexecuted instantiation: box.cc:session_push(session*, port*) Unexecuted instantiation: authentication.c:session_push Unexecuted instantiation: recovery.cc:session_push(session*, port*) Unexecuted instantiation: applier.cc:session_push(session*, port*) Unexecuted instantiation: sql.c:session_push Unexecuted instantiation: call.c:session_push Unexecuted instantiation: build.c:session_push Unexecuted instantiation: expr.c:session_push Unexecuted instantiation: func.c:session_push Unexecuted instantiation: main.c:session_push Unexecuted instantiation: prepare.c:session_push Unexecuted instantiation: tokenize.c:session_push Unexecuted instantiation: vdbeapi.c:session_push Unexecuted instantiation: vdbeaux.c:session_push Unexecuted instantiation: console.c:session_push Unexecuted instantiation: iproto.cc:session_push(session*, port*) Unexecuted instantiation: sysview.c:session_push Unexecuted instantiation: session_settings.c:session_push Unexecuted instantiation: vy_tx.c:session_push Unexecuted instantiation: space.c:session_push Unexecuted instantiation: sequence.c:session_push Unexecuted instantiation: alter.cc:session_push(session*, port*) Unexecuted instantiation: schema.cc:session_push(session*, port*) Unexecuted instantiation: session.c:session_push Unexecuted instantiation: txn.c:session_push Unexecuted instantiation: txn_limbo.c:session_push Unexecuted instantiation: execute.c:session_push Unexecuted instantiation: pragma.c:session_push |
413 | | |
414 | | static inline int |
415 | | session_fd(struct session *session) |
416 | 0 | { |
417 | 0 | return session->vtab->fd(session); |
418 | 0 | } Unexecuted instantiation: box.cc:session_fd(session*) Unexecuted instantiation: authentication.c:session_fd Unexecuted instantiation: recovery.cc:session_fd(session*) Unexecuted instantiation: applier.cc:session_fd(session*) Unexecuted instantiation: sql.c:session_fd Unexecuted instantiation: call.c:session_fd Unexecuted instantiation: build.c:session_fd Unexecuted instantiation: expr.c:session_fd Unexecuted instantiation: func.c:session_fd Unexecuted instantiation: main.c:session_fd Unexecuted instantiation: prepare.c:session_fd Unexecuted instantiation: tokenize.c:session_fd Unexecuted instantiation: vdbeapi.c:session_fd Unexecuted instantiation: vdbeaux.c:session_fd Unexecuted instantiation: console.c:session_fd Unexecuted instantiation: iproto.cc:session_fd(session*) Unexecuted instantiation: sysview.c:session_fd Unexecuted instantiation: session_settings.c:session_fd Unexecuted instantiation: vy_tx.c:session_fd Unexecuted instantiation: space.c:session_fd Unexecuted instantiation: sequence.c:session_fd Unexecuted instantiation: alter.cc:session_fd(session*) Unexecuted instantiation: schema.cc:session_fd(session*) Unexecuted instantiation: session.c:session_fd Unexecuted instantiation: txn.c:session_fd Unexecuted instantiation: txn_limbo.c:session_fd Unexecuted instantiation: execute.c:session_fd Unexecuted instantiation: pragma.c:session_fd |
419 | | |
420 | | static inline int |
421 | | session_sync(struct session *session) |
422 | 0 | { |
423 | 0 | return session->vtab->sync(session); |
424 | 0 | } Unexecuted instantiation: box.cc:session_sync(session*) Unexecuted instantiation: authentication.c:session_sync Unexecuted instantiation: recovery.cc:session_sync(session*) Unexecuted instantiation: applier.cc:session_sync(session*) Unexecuted instantiation: sql.c:session_sync Unexecuted instantiation: call.c:session_sync Unexecuted instantiation: build.c:session_sync Unexecuted instantiation: expr.c:session_sync Unexecuted instantiation: func.c:session_sync Unexecuted instantiation: main.c:session_sync Unexecuted instantiation: prepare.c:session_sync Unexecuted instantiation: tokenize.c:session_sync Unexecuted instantiation: vdbeapi.c:session_sync Unexecuted instantiation: vdbeaux.c:session_sync Unexecuted instantiation: console.c:session_sync Unexecuted instantiation: iproto.cc:session_sync(session*) Unexecuted instantiation: sysview.c:session_sync Unexecuted instantiation: session_settings.c:session_sync Unexecuted instantiation: vy_tx.c:session_sync Unexecuted instantiation: space.c:session_sync Unexecuted instantiation: sequence.c:session_sync Unexecuted instantiation: alter.cc:session_sync(session*) Unexecuted instantiation: schema.cc:session_sync(session*) Unexecuted instantiation: session.c:session_sync Unexecuted instantiation: txn.c:session_sync Unexecuted instantiation: txn_limbo.c:session_sync Unexecuted instantiation: execute.c:session_sync Unexecuted instantiation: pragma.c:session_sync |
425 | | |
426 | | /** |
427 | | * In a common case, a session does not support push. This |
428 | | * function always returns -1 and sets ER_UNSUPPORTED error. |
429 | | */ |
430 | | int |
431 | | generic_session_push(struct session *session, struct port *port); |
432 | | |
433 | | /** Return -1 from any session. */ |
434 | | int |
435 | | generic_session_fd(struct session *session); |
436 | | |
437 | | /** Return 0 from any session. */ |
438 | | int64_t |
439 | | generic_session_sync(struct session *session); |
440 | | |
441 | | #if defined(__cplusplus) |
442 | | } /* extern "C" */ |
443 | | |
444 | | #include "diag.h" |
445 | | |
446 | | static inline void |
447 | | access_check_universe_xc(user_access_t access) |
448 | 0 | { |
449 | 0 | if (access_check_universe(access) != 0) |
450 | 0 | diag_raise(); |
451 | 0 | } Unexecuted instantiation: box.cc:access_check_universe_xc(unsigned short) Unexecuted instantiation: recovery.cc:access_check_universe_xc(unsigned short) Unexecuted instantiation: applier.cc:access_check_universe_xc(unsigned short) Unexecuted instantiation: iproto.cc:access_check_universe_xc(unsigned short) Unexecuted instantiation: alter.cc:access_check_universe_xc(unsigned short) Unexecuted instantiation: schema.cc:access_check_universe_xc(unsigned short) |
452 | | |
453 | | #endif /* defined(__cplusplus) */ |
454 | | |
455 | | #endif /* INCLUDES_TARANTOOL_SESSION_H */ |