2003-12-08 03:19:18 +08:00
|
|
|
/* $OpenLDAP$ */
|
|
|
|
/* This work is part of OpenLDAP Software <http://www.openldap.org/>.
|
2000-03-17 03:08:22 +08:00
|
|
|
*
|
2004-01-02 03:15:16 +08:00
|
|
|
* Copyright 1999-2004 The OpenLDAP Foundation.
|
2003-12-08 03:19:18 +08:00
|
|
|
* Portions Copyright 1999 Dmitry Kovalev.
|
|
|
|
* Portions Copyright 2002 Pierangelo Mararati.
|
|
|
|
* All rights reserved.
|
2002-08-23 16:54:08 +08:00
|
|
|
*
|
2003-12-08 03:19:18 +08:00
|
|
|
* Redistribution and use in source and binary forms, with or without
|
|
|
|
* modification, are permitted only as authorized by the OpenLDAP
|
|
|
|
* Public License.
|
2002-08-23 16:54:08 +08:00
|
|
|
*
|
2003-12-08 03:19:18 +08:00
|
|
|
* A copy of this license is available in the file LICENSE in the
|
|
|
|
* top-level directory of the distribution or, alternatively, at
|
|
|
|
* <http://www.OpenLDAP.org/license.html>.
|
|
|
|
*/
|
|
|
|
/* ACKNOWLEDGEMENTS:
|
|
|
|
* This work was initially developed by Dmitry Kovalev for inclusion
|
|
|
|
* by OpenLDAP Software. Additional significant contributors include
|
|
|
|
* Pierangelo Mararati
|
2002-08-23 16:54:08 +08:00
|
|
|
*/
|
2003-12-08 03:19:18 +08:00
|
|
|
|
2002-08-23 16:54:08 +08:00
|
|
|
/*
|
2003-12-08 03:19:18 +08:00
|
|
|
* The following changes have been addressed:
|
2002-08-23 16:54:08 +08:00
|
|
|
*
|
|
|
|
* Enhancements:
|
|
|
|
* - re-styled code for better readability
|
|
|
|
* - upgraded backend API to reflect recent changes
|
|
|
|
* - LDAP schema is checked when loading SQL/LDAP mapping
|
|
|
|
* - AttributeDescription/ObjectClass pointers used for more efficient
|
|
|
|
* mapping lookup
|
|
|
|
* - bervals used where string length is required often
|
|
|
|
* - atomized write operations by committing at the end of each operation
|
|
|
|
* and defaulting connection closure to rollback
|
|
|
|
* - added LDAP access control to write operations
|
|
|
|
* - fully implemented modrdn (with rdn attrs change, deleteoldrdn,
|
|
|
|
* access check, parent/children check and more)
|
|
|
|
* - added parent access control, children control to delete operation
|
|
|
|
* - added structuralObjectClass operational attribute check and
|
|
|
|
* value return on search
|
|
|
|
* - added hasSubordinate operational attribute on demand
|
|
|
|
* - search limits are appropriately enforced
|
|
|
|
* - function backsql_strcat() has been made more efficient
|
|
|
|
* - concat function has been made configurable by means of a pattern
|
|
|
|
* - added config switches:
|
|
|
|
* - fail_if_no_mapping write operations fail if there is no mapping
|
|
|
|
* - has_ldapinfo_dn_ru overrides autodetect
|
|
|
|
* - concat_pattern a string containing two '?' is used
|
|
|
|
* (note that "?||?" should be more portable
|
|
|
|
* than builtin function "CONCAT(?,?)")
|
|
|
|
* - strcast_func cast of string constants in "SELECT DISTINCT
|
|
|
|
* statements (needed by PostgreSQL)
|
|
|
|
* - upper_needs_cast cast the argument of upper when required
|
|
|
|
* (basically when building dn substring queries)
|
2002-08-29 18:55:48 +08:00
|
|
|
* - added noop control
|
|
|
|
* - added values return filter control
|
|
|
|
* - hasSubordinate can be used in search filters (with limitations)
|
|
|
|
* - eliminated oc->name; use oc->oc->soc_cname instead
|
2002-08-23 16:54:08 +08:00
|
|
|
*
|
|
|
|
* Todo:
|
|
|
|
* - add security checks for SQL statements that can be injected (?)
|
|
|
|
* - re-test with previously supported RDBMs
|
|
|
|
* - replace dn_ru and so with normalized dn (no need for upper() and so
|
|
|
|
* in dn match)
|
|
|
|
* - implement a backsql_normalize() function to replace the upper()
|
|
|
|
* conversion routines
|
|
|
|
* - note that subtree deletion, subtree renaming and so could be easily
|
|
|
|
* implemented (rollback and consistency checks are available :)
|
|
|
|
* - implement "lastmod" and other operational stuff (ldap_entries table ?)
|
|
|
|
* - check how to allow multiple operations with one statement, to remove
|
|
|
|
* BACKSQL_REALLOC_STMT from modify.c (a more recent unixODBC lib?)
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef __BACKSQL_H__
|
|
|
|
#define __BACKSQL_H__
|
2000-03-17 03:08:22 +08:00
|
|
|
|
|
|
|
#include "external.h"
|
|
|
|
#include "sql-types.h"
|
2002-08-14 01:12:27 +08:00
|
|
|
|
|
|
|
/*
|
|
|
|
* Better use the standard length of 8192 (as of servers/slapd/dn.c) ?
|
|
|
|
*/
|
|
|
|
#define BACKSQL_MAX_DN_LEN 255
|
|
|
|
|
2002-08-23 16:54:08 +08:00
|
|
|
/*
|
|
|
|
* define to enable very extensive trace logging (debug only)
|
|
|
|
*/
|
|
|
|
#undef BACKSQL_TRACE
|
|
|
|
|
2002-08-14 01:12:27 +08:00
|
|
|
typedef struct {
|
|
|
|
char *dbhost;
|
|
|
|
int dbport;
|
|
|
|
char *dbuser;
|
|
|
|
char *dbpasswd;
|
|
|
|
char *dbname;
|
|
|
|
/*
|
|
|
|
* SQL condition for subtree searches differs in syntax:
|
2002-08-23 16:54:08 +08:00
|
|
|
* "LIKE CONCAT('%',?)" or "LIKE '%'+?" or "LIKE '%'||?"
|
|
|
|
* or smth else
|
2002-08-14 01:12:27 +08:00
|
|
|
*/
|
2002-08-23 16:54:08 +08:00
|
|
|
struct berval subtree_cond;
|
|
|
|
struct berval children_cond;
|
|
|
|
char *oc_query, *at_query;
|
2002-08-14 01:12:27 +08:00
|
|
|
char *insentry_query,*delentry_query;
|
|
|
|
char *id_query;
|
2002-08-23 16:54:08 +08:00
|
|
|
char *has_children_query;
|
2003-04-16 18:22:33 +08:00
|
|
|
|
|
|
|
MatchingRule *bi_caseIgnoreMatch;
|
|
|
|
|
2002-08-23 16:54:08 +08:00
|
|
|
struct berval upper_func;
|
|
|
|
struct berval upper_func_open;
|
|
|
|
struct berval upper_func_close;
|
|
|
|
BerVarray concat_func;
|
|
|
|
|
|
|
|
unsigned int bsql_flags;
|
|
|
|
#define BSQLF_SCHEMA_LOADED 0x0001
|
|
|
|
#define BSQLF_UPPER_NEEDS_CAST 0x0002
|
|
|
|
#define BSQLF_CREATE_NEEDS_SELECT 0x0004
|
|
|
|
#define BSQLF_FAIL_IF_NO_MAPPING 0x0008
|
|
|
|
#define BSQLF_HAS_LDAPINFO_DN_RU 0x0010
|
|
|
|
#define BSQLF_DONTCHECK_LDAPINFO_DN_RU 0x0020
|
|
|
|
#define BSQLF_USE_REVERSE_DN 0x0040
|
|
|
|
|
|
|
|
#define BACKSQL_SCHEMA_LOADED(si) \
|
|
|
|
((si)->bsql_flags & BSQLF_SCHEMA_LOADED)
|
|
|
|
#define BACKSQL_UPPER_NEEDS_CAST(si) \
|
|
|
|
((si)->bsql_flags & BSQLF_UPPER_NEEDS_CAST)
|
|
|
|
#define BACKSQL_CREATE_NEEDS_SELECT(si) \
|
|
|
|
((si)->bsql_flags & BSQLF_CREATE_NEEDS_SELECT)
|
|
|
|
#define BACKSQL_FAIL_IF_NO_MAPPING(si) \
|
|
|
|
((si)->bsql_flags & BSQLF_FAIL_IF_NO_MAPPING)
|
|
|
|
#define BACKSQL_HAS_LDAPINFO_DN_RU(si) \
|
|
|
|
((si)->bsql_flags & BSQLF_HAS_LDAPINFO_DN_RU)
|
|
|
|
#define BACKSQL_DONTCHECK_LDAPINFO_DN_RU(si) \
|
|
|
|
((si)->bsql_flags & BSQLF_DONTCHECK_LDAPINFO_DN_RU)
|
|
|
|
#define BACKSQL_USE_REVERSE_DN(si) \
|
|
|
|
((si)->bsql_flags & BSQLF_USE_REVERSE_DN)
|
|
|
|
|
|
|
|
struct berval strcast_func;
|
2002-08-14 01:12:27 +08:00
|
|
|
Avlnode *db_conns;
|
2002-08-17 00:45:24 +08:00
|
|
|
Avlnode *oc_by_oc;
|
2002-08-14 01:12:27 +08:00
|
|
|
Avlnode *oc_by_id;
|
|
|
|
ldap_pvt_thread_mutex_t dbconn_mutex;
|
|
|
|
ldap_pvt_thread_mutex_t schema_mutex;
|
|
|
|
SQLHENV db_env;
|
|
|
|
} backsql_info;
|
|
|
|
|
|
|
|
#define BACKSQL_SUCCESS( rc ) \
|
|
|
|
( (rc) == SQL_SUCCESS || (rc) == SQL_SUCCESS_WITH_INFO )
|
|
|
|
|
|
|
|
#endif /* __BACKSQL_H__ */
|
2001-09-07 21:04:11 +08:00
|
|
|
|