]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/back-sql/back-sql.h
remove unnecessary data from search_info
[openldap] / servers / slapd / back-sql / back-sql.h
index 0275bfd570a148ff379c33106bf573e1229cb3ca..78ca48e791ec7e372d3e00868744009bd4aa3547 100644 (file)
@@ -18,7 +18,7 @@
 /* ACKNOWLEDGEMENTS:
  * This work was initially developed by Dmitry Kovalev for inclusion
  * by OpenLDAP Software.  Additional significant contributors include
- * Pierangelo Mararati and Mark Adamson.
+ * Pierangelo Masarati and Mark Adamson.
  */
 /*
  * The following changes have been addressed:
  *     BACKSQL_REALLOC_STMT from modify.c (a more recent unixODBC lib?)
  */
 /*
- * Improvements submitted by (ITS#)
+ * Improvements submitted by (ITS#3432)
  *
  * 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:
 
@@ -170,7 +173,17 @@ can be easily distinguished.
 #ifndef __BACKSQL_H__
 #define __BACKSQL_H__
 
-#include "sql-types.h"
+/* former sql-types.h */
+#include <sql.h>
+#include <sqlext.h>
+
+typedef struct {
+       SWORD           ncols;
+       BerVarray       col_names;
+       UDWORD          *col_prec;
+       char            **cols;
+       SQLINTEGER      *value_len;
+} BACKSQL_ROW_NTS;
 
 /*
  * Better use the standard length of 8192 (as of slap.h)?
@@ -185,6 +198,21 @@ can be easily distinguished.
  */
 #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
  *
@@ -217,8 +245,9 @@ can be easily distinguished.
  * 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
@@ -228,9 +257,14 @@ can be easily distinguished.
  */
 typedef struct backsql_api {
        char                    *ba_name;
+       int                     (*ba_config)( struct backsql_api *self, int argc, char *argv[] );
+       int                     (*ba_destroy)( struct backsql_api *self );
+
        int                     (*ba_dn2odbc)( Operation *op, SlapReply *rs, struct berval *dn );
        int                     (*ba_odbc2dn)( Operation *op, SlapReply *rs, struct berval *dn );
-       struct backsql_api *ba_next;
+
+       void                    *ba_private;
+       struct backsql_api      *ba_next;
 } backsql_api;
 
 /*
@@ -318,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; 
@@ -338,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))
 
@@ -358,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;
@@ -373,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;
@@ -385,15 +436,12 @@ typedef struct backsql_srch_info {
  * is used */
 #define BACKSQL_SCOPE_BASE_LIKE                ( LDAP_SCOPE_BASE | 0x1000 )
        Filter                  *bsi_filter;
-       int                     bsi_slimit,
-                               bsi_tlimit;
        time_t                  bsi_stoptime;
 
        backsql_entryID         *bsi_id_list,
                                **bsi_id_listtail,
                                *bsi_c_eid;
        int                     bsi_n_candidates;
-       int                     bsi_abandon;
        int                     bsi_status;
 
        backsql_oc_map_rec      *bsi_oc;
@@ -411,7 +459,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;
@@ -427,10 +475,10 @@ typedef struct {
        struct berval   sql_children_cond;
        char            *sql_oc_query,
                        *sql_at_query;
-       char            *sql_insentry_query,
-                       *sql_delentry_query,
-                       *sql_delobjclasses_query,
-                       *sql_delreferrals_query;
+       char            *sql_insentry_stmt,
+                       *sql_delentry_stmt,
+                       *sql_renentry_stmt,
+                       *sql_delobjclasses_stmt;
        char            *sql_id_query;
        char            *sql_has_children_query;
 
@@ -441,9 +489,14 @@ typedef struct {
        struct berval   sql_upper_func_open;
        struct berval   sql_upper_func_close;
        BerVarray       sql_concat_func;
-
        struct berval   sql_strcast_func;
 
+       struct berval   sql_aliasing;
+       struct berval   sql_aliasing_quote;
+       struct berval   sql_dn_oc_aliasing;
+
+       AttributeName   *sql_anlist;
+
        unsigned int    sql_flags;
 #define        BSQLF_SCHEMA_LOADED             0x0001
 #define        BSQLF_UPPER_NEEDS_CAST          0x0002
@@ -454,27 +507,42 @@ 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 BSQLF_CHECK_SCHEMA             0x0800
+
+#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)
+#define BACKSQL_CHECK_SCHEMA(si) \
+       BACKSQL_ISF(si, BSQLF_CHECK_SCHEMA)
 
        Entry           *sql_baseObject;
 #ifdef BACKSQL_ARBITRARY_KEY
@@ -483,7 +551,7 @@ typedef struct {
 #define        BACKSQL_IS_BASEOBJECT_ID(id)    (bvmatch((id), &backsql_baseObject_bv))
 #else /* ! BACKSQL_ARBITRARY_KEY */
 #define BACKSQL_BASEOBJECT_ID          0
-#define BACKSQL_BASEOBJECT_IDSTR       "0"
+#define BACKSQL_BASEOBJECT_IDSTR       LDAP_XSTRING(BACKSQL_BASEOBJECT_ID)
 #define BACKSQL_BASEOBJECT_KEYVAL      0
 #define        BACKSQL_IS_BASEOBJECT_ID(id)    (*(id) == BACKSQL_BASEOBJECT_ID)
 #endif /* ! BACKSQL_ARBITRARY_KEY */