diff options
author | José Bollo <jose.bollo@iot.bzh> | 2019-10-24 09:10:47 +0200 |
---|---|---|
committer | José Bollo <jose.bollo@iot.bzh> | 2019-10-24 09:10:47 +0200 |
commit | 6b5d5750a179def14ed48f1700aaefd5e5b0e059 (patch) | |
tree | c4183678dc71578fb74a22a07eb1cf35505777e0 | |
parent | 63c147739eec0322981ee9a5541786288d57bbce (diff) |
Improve selection of rules
Now the rule to apply is given by the laws:
1. The rules that matches exactly more keys
2. If law 1 apply to more than one rule, the select rule is the one
matches more exactly the keys in the following order of priority:
- session
- user
- client
- permission
Change-Id: Ia5ae241a08c5a58f75ca0a0c73fcda0876008cc1
Signed-off-by: José Bollo <jose.bollo@iot.bzh>
-rw-r--r-- | src/anydb.c | 47 |
1 files changed, 36 insertions, 11 deletions
diff --git a/src/anydb.c b/src/anydb.c index ef41af7..6ede4de 100644 --- a/src/anydb.c +++ b/src/anydb.c @@ -30,11 +30,36 @@ #include "data.h" #include "anydb.h" - -#define CLIENT_MATCH_SCORE 1 -#define SESSION_MATCH_SCORE 1 -#define USER_MATCH_SCORE 1 -#define PERMISSION_MATCH_SCORE 1 +/* + * Definition of the score for matching keys against database when querying. + * The scores defined below are used in the function 'searchkey_test'. + * + * They are used to give a score the key searched in the objective to + * select the rule to apply: the selected rule is the rule of higher score. + * + * When a rule matches, all its keys matched but some of them are wild matches. + * The key's scores of the keys that are not wild selectors are added. + * + * A key's score is made of 2 parts: + * - the lower 4 bits are used as bit fields to priority individual keys + * - the upper hight bits are used to count the number of keys that matched + * + * So the rule to apply is given by: + * + * 1. The rules that matches exactly more keys + * 2. If 1 apply to more than one rule, the select rule is the one + * matches more exactly the keys in the following order of priority: + * - session + * - user + * - client + * - permission + */ +#define KEY_SESSION_MATCH_SCORE 0x18 +#define KEY_USER_MATCH_SCORE 0x14 +#define KEY_CLIENT_MATCH_SCORE 0x12 +#define KEY_PERMISSION_MATCH_SCORE 0x11 +#define SOME_MATCH_SCORE 0x10 +#define NO_MATCH_SCORE 0x00 /** * helper for searching items @@ -312,17 +337,17 @@ searchkey_test( || (key->user != AnyIdx_Wide && skey->idxusr != key->user) || (key->permission != AnyIdx_Wide && strcasecmp(skey->strperm, string(db, key->permission)))) { - sc = 0; + sc = NO_MATCH_SCORE; } else { - sc = 1; + sc = SOME_MATCH_SCORE; if (key->client != AnyIdx_Wide) - sc += CLIENT_MATCH_SCORE; + sc += KEY_CLIENT_MATCH_SCORE; if (key->session != AnyIdx_Wide) - sc += SESSION_MATCH_SCORE; + sc += KEY_SESSION_MATCH_SCORE; if (key->user != AnyIdx_Wide) - sc += USER_MATCH_SCORE; + sc += KEY_USER_MATCH_SCORE; if (key->permission != AnyIdx_Wide) - sc += PERMISSION_MATCH_SCORE; + sc += KEY_PERMISSION_MATCH_SCORE; } return sc; } |