DUE TO SPAM, SIGN-UP IS DISABLED. Goto Selfserve wiki signup and request an account.
DUE TO SPAM, SIGN-UP IS DISABLED. Goto Selfserve wiki signup and request an account.
...
When processing data, users want to have access to non-tabular (not stored in cache structures) data. Example of such data is application
...
SecuritySubject can be used to provide fine-grained access control to cache data. For example, CacheInterceptor extracts the user from the attributes and saves saves the subject id it along with data ).QuerySqlFunction use the same parameter and it is convenient to take it from the attributes, rather than transfer it separately to each function)....
The requirements include:
QuerySqlFunction, CacheInterceptor) on all nodes participated in queries.Ignite does not have a similar public such API:
ServiceCallContext helps solve similar problems, but has several limitations . The main one is that it is only available in - available only by calls via the IgniteService API and cannot be used for single primitive operations or transactions.UserAttributes - allows to set user attributes, but the attribute values are fixed for the entire lifetime of the connection.ClientListenerConnectionContext - it's available only on single node , which directly accepts connection from a client connection.A similar Application context mechanism exists in Oracle [1] and it's widely used [6]. Setting Support similar mechanisms (session variables is also available in ) exist in multiple DBMS (e.g. SQLServer [8], Snowflake [7], MySQL [9]).
ApplicationContext is an entrypoint for accessing all non-tabular data.QuerySqlFunction are static, CacheInterceptor is a cache singleton for cache).QuerySqlFunction to get access to the attribute from SQL if needed.| Code Block | ||
|---|---|---|
| ||
/** ApplicationContext interface. It's an entrypoint for all non-tabular informationdata. */ public class ApplicationContext { /** @return Application attributes set for current thread. */ public static @Nullable Map<String, String> getAttributes(); /** @return Current SecuritySubject. */ public static @Nullable SecuritySubject getSecuritySubject(); } /** Example, use it in QuerySqlFunction. */ public static class UserDefinedFunctions { /** @return Session ID, set with application attributeattributes. */ @QuerySqlFunction public static @Nullable String sessionId() { Map<String, String> appAttrs = ApplicationContext.getAttributes(); return appAttrs == null ? null : appAttr.get("SESSION_ID"); } } |
...
...
| language | java |
|---|
...
Ignite node.ClientBitmaskFeature protocol.| Code Block | ||
|---|---|---|
| ||
// Extends the interface with new public method. public interface ClientTransactions { ... /** @param appAttrs Application attributes. */ public ClientTransactions withApplicationAttributes(Map<String, String> appAttrs); } // Example of usage. try (IgniteClient cln = Ignition.startClient(clnCfg)) { Map<String, String> appAttrs = F.asMap("SESSION_ID", "1234"); try (ClientTransaction tx = cln.transactions().withApplicationAttributes(appAttrs).txStart()) { ... } } |
...
[7] https://docs.snowflake.com/en/sql-reference/session-variables#session-variable-functions
[9] https://dev.mysql.com/doc/refman/8.4/en/user-variables.html
// Links or report with relevant JIRA tickets.