]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/back-sql/back-sql.h
ITS#3576 use actual backend (not glue instance) for restriction and
[openldap] / servers / slapd / back-sql / back-sql.h
index b44bf0701dfc5c992bfb120989711f551380e269..d905d2bf23943e7081101af57d330bfe11488c8a 100644 (file)
  * 1. id_query.patch           applied (with changes)
  * 2. shortcut.patch           applied (reworked)
  * 3. create_hint.patch                applied
- * 4. count_query.patch                rejected (conflicts with other features)
+ * 4. count_query.patch                applied (reworked)
  * 5. returncodes.patch                applied (with sanity checks)
  * 6. connpool.patch           under evaluation
- * 7. modoc.patch              under evaluation
- * 8. miscfixes.patch          applied (reworked; FIXME: other
- *                             operations may need to load the
- *                             entire entry for ACL purposes)
+ * 7. modoc.patch              under evaluation (requires
+ *                             manageDSAit and "manage"
+ *                             access privileges)
+ * 8. miscfixes.patch          applied (reworked; other
+ *                             operations need to load the
+ *                             entire entry for ACL purposes;
+ *                             see ITS#3480, now fixed)
  *
  * original description:
 
@@ -195,6 +198,21 @@ typedef struct {
  */
 #undef BACKSQL_TRACE
 
+/*
+ * define if using MS SQL and workaround needed (see sql-wrap.c)
+ */
+#undef BACKSQL_MSSQL_WORKAROUND
+
+/*
+ * define to enable values counting for attributes
+ */
+#define BACKSQL_COUNTQUERY
+
+/*
+ * define to enable prettification/validation of values
+ */
+#define BACKSQL_PRETTY_VALIDATE
+
 /*
  * define to enable varchars as unique keys in user tables
  *
@@ -227,8 +245,9 @@ typedef struct {
  * in quotes.  This is especially true for those that do not
  * allow keywords used as aliases.
  */
-/* #define BACKSQL_ALIASING_QUOTE      '"' */
-/* #define BACKSQL_ALIASING_QUOTE      '\'' */
+#define BACKSQL_ALIASING_QUOTE ""
+/* #define BACKSQL_ALIASING_QUOTE      "\"" */
+/* #define BACKSQL_ALIASING_QUOTE      "'" */
 
 /*
  * API
@@ -333,6 +352,9 @@ typedef struct backsql_at_map_rec {
        /* for optimization purposes attribute load query 
         * is preconstructed from parts on schemamap load time */
        char            *bam_query;
+#ifdef BACKSQL_COUNTQUERY
+       char            *bam_countquery;
+#endif /* BACKSQL_COUNTQUERY */
        /* following flags are bitmasks (first bit used for add_proc, 
         * second - for delete_proc) */
        /* order of parameters for procedures above; 
@@ -353,14 +375,14 @@ typedef struct backsql_at_map_rec {
  * (currently broken) */
 /* #define     BACKSQL_UPPERCASE_FILTER */
 
-#define        BACKSQL_AT_CANUPPERCASE(at)     ((at)->bam_sel_expr_u.bv_val)
+#define        BACKSQL_AT_CANUPPERCASE(at)     ( !BER_BVISNULL( &(at)->bam_sel_expr_u ) )
 
 /* defines to support bitmasks above */
 #define BACKSQL_ADD    0x1
 #define BACKSQL_DEL    0x2
 
-#define BACKSQL_IS_ADD(x)      ( BACKSQL_ADD & (x) )
-#define BACKSQL_IS_DEL(x)      ( BACKSQL_DEL & (x) )
+#define BACKSQL_IS_ADD(x)      ( ( BACKSQL_ADD & (x) ) == BACKSQL_ADD )
+#define BACKSQL_IS_DEL(x)      ( ( BACKSQL_DEL & (x) ) == BACKSQL_DEL )
 
 #define BACKSQL_NCMP(v1,v2)    ber_bvcmp((v1),(v2))
 
@@ -373,8 +395,18 @@ typedef struct berbuf {
        ber_len_t       bb_len;
 } BerBuffer;
 
-#define BB_NULL                { { 0, NULL }, 0 }
-
+#define BB_NULL                { BER_BVNULL, 0 }
+
+/* the function must collect the entry associated to nbase */
+#define BACKSQL_ISF_GET_ID     0x1U
+#define BACKSQL_ISF_GET_ENTRY  ( 0x2U | BACKSQL_ISF_GET_ID )
+#define BACKSQL_ISF_MATCHED    0x4U
+#define BACKSQL_IS_GET_ID(f) \
+       ( ( (f) & BACKSQL_ISF_GET_ID ) == BACKSQL_ISF_GET_ID )
+#define BACKSQL_IS_GET_ENTRY(f) \
+       ( ( (f) & BACKSQL_ISF_GET_ENTRY ) == BACKSQL_ISF_GET_ENTRY )
+#define BACKSQL_IS_MATCHED(f) \
+       ( ( (f) & BACKSQL_ISF_MATCHED ) == BACKSQL_ISF_MATCHED )
 typedef struct backsql_srch_info {
        Operation               *bsi_op;
        SlapReply               *bsi_rs;
@@ -388,6 +420,10 @@ typedef struct backsql_srch_info {
 #define BSQL_SF_FILTER_ENTRYUUID       0x0020U
 #define BSQL_SF_FILTER_ENTRYCSN                0x0040U
 #define BSQL_SF_RETURN_ENTRYUUID       (BSQL_SF_FILTER_ENTRYUUID << 8)
+#define        BSQL_ISF(bsi, f)                ( ( (bsi)->bsi_flags & f ) == f )
+#define        BSQL_ISF_ALL_USER(bsi)          BSQL_ISF(bsi, BSQL_SF_ALL_USER)
+#define        BSQL_ISF_ALL_OPER(bsi)          BSQL_ISF(bsi, BSQL_SF_ALL_OPER)
+#define        BSQL_ISF_ALL_ATTRS(bsi)         BSQL_ISF(bsi, BSQL_SF_ALL_ATTRS)
 
        struct berval           *bsi_base_ndn;
        int                     bsi_use_subtree_shortcut;
@@ -408,7 +444,6 @@ typedef struct backsql_srch_info {
                                **bsi_id_listtail,
                                *bsi_c_eid;
        int                     bsi_n_candidates;
-       int                     bsi_abandon;
        int                     bsi_status;
 
        backsql_oc_map_rec      *bsi_oc;
@@ -426,7 +461,7 @@ typedef struct backsql_srch_info {
 /*
  * Backend private data structure
  */
-typedef struct {
+typedef struct backsql_info {
        char            *sql_dbhost;
        int             sql_dbport;
        char            *sql_dbuser;
@@ -444,8 +479,8 @@ typedef struct {
                        *sql_at_query;
        char            *sql_insentry_stmt,
                        *sql_delentry_stmt,
-                       *sql_delobjclasses_stmt,
-                       *sql_delreferrals_stmt;
+                       *sql_renentry_stmt,
+                       *sql_delobjclasses_stmt;
        char            *sql_id_query;
        char            *sql_has_children_query;
 
@@ -456,9 +491,10 @@ typedef struct {
        struct berval   sql_upper_func_open;
        struct berval   sql_upper_func_close;
        BerVarray       sql_concat_func;
-
        struct berval   sql_strcast_func;
 
+       AttributeName   *sql_anlist;
+
        unsigned int    sql_flags;
 #define        BSQLF_SCHEMA_LOADED             0x0001
 #define        BSQLF_UPPER_NEEDS_CAST          0x0002
@@ -469,27 +505,39 @@ typedef struct {
 #define BSQLF_USE_REVERSE_DN           0x0040
 #define BSQLF_ALLOW_ORPHANS            0x0080
 #define BSQLF_USE_SUBTREE_SHORTCUT     0x0100
+#define BSQLF_FETCH_ALL_USERATTRS      0x0200
+#define BSQLF_FETCH_ALL_OPATTRS                0x0400
+#define        BSQLF_FETCH_ALL_ATTRS           (BSQLF_FETCH_ALL_USERATTRS|BSQLF_FETCH_ALL_OPATTRS)
+
+#define BACKSQL_ISF(si, f) \
+       (((si)->sql_flags & f) == f)
 
 #define        BACKSQL_SCHEMA_LOADED(si) \
-       ((si)->sql_flags & BSQLF_SCHEMA_LOADED)
+       BACKSQL_ISF(si, BSQLF_SCHEMA_LOADED)
 #define BACKSQL_UPPER_NEEDS_CAST(si) \
-       ((si)->sql_flags & BSQLF_UPPER_NEEDS_CAST)
+       BACKSQL_ISF(si, BSQLF_UPPER_NEEDS_CAST)
 #define BACKSQL_CREATE_NEEDS_SELECT(si) \
-       ((si)->sql_flags & BSQLF_CREATE_NEEDS_SELECT)
+       BACKSQL_ISF(si, BSQLF_CREATE_NEEDS_SELECT)
 #define BACKSQL_FAIL_IF_NO_MAPPING(si) \
-       ((si)->sql_flags & BSQLF_FAIL_IF_NO_MAPPING)
+       BACKSQL_ISF(si, BSQLF_FAIL_IF_NO_MAPPING)
 #define BACKSQL_HAS_LDAPINFO_DN_RU(si) \
-       ((si)->sql_flags & BSQLF_HAS_LDAPINFO_DN_RU)
+       BACKSQL_ISF(si, BSQLF_HAS_LDAPINFO_DN_RU)
 #define BACKSQL_DONTCHECK_LDAPINFO_DN_RU(si) \
-       ((si)->sql_flags & BSQLF_DONTCHECK_LDAPINFO_DN_RU)
+       BACKSQL_ISF(si, BSQLF_DONTCHECK_LDAPINFO_DN_RU)
 #define BACKSQL_USE_REVERSE_DN(si) \
-       ((si)->sql_flags & BSQLF_USE_REVERSE_DN)
+       BACKSQL_ISF(si, BSQLF_USE_REVERSE_DN)
 #define BACKSQL_CANUPPERCASE(si) \
        (!BER_BVISNULL( &(si)->sql_upper_func ))
 #define BACKSQL_ALLOW_ORPHANS(si) \
-       ((si)->sql_flags & BSQLF_ALLOW_ORPHANS)
+       BACKSQL_ISF(si, BSQLF_ALLOW_ORPHANS)
 #define BACKSQL_USE_SUBTREE_SHORTCUT(si) \
-       ((si)->sql_flags & BSQLF_USE_SUBTREE_SHORTCUT)
+       BACKSQL_ISF(si, BSQLF_USE_SUBTREE_SHORTCUT)
+#define BACKSQL_FETCH_ALL_USERATTRS(si) \
+       BACKSQL_ISF(si, BSQLF_FETCH_ALL_USERATTRS)
+#define BACKSQL_FETCH_ALL_OPATTRS(si) \
+       BACKSQL_ISF(si, BSQLF_FETCH_ALL_OPATTRS)
+#define BACKSQL_FETCH_ALL_ATTRS(si) \
+       BACKSQL_ISF(si, BSQLF_FETCH_ALL_ATTRS)
 
        Entry           *sql_baseObject;
 #ifdef BACKSQL_ARBITRARY_KEY