Coverage Report

Created: 2026-01-16 06:52

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/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*)
sql.c:fiber_get_session
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*)
session.c:fiber_set_user
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()
sql.c: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
build.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
build.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 */