1N/A * Copyright 2004 Sun Microsystems, Inc. All rights reserved. 1N/A * Use is subject to license terms. 1N/A#
pragma ident "%Z%%M% %I% %E% SMI" 1N/A * The contents of this file are subject to the Netscape Public 1N/A * License Version 1.1 (the "License"); you may not use this file 1N/A * except in compliance with the License. You may obtain a copy of 1N/A * Software distributed under the License is distributed on an "AS 1N/A * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or 1N/A * implied. See the License for the specific language governing 1N/A * rights and limitations under the License. 1N/A * The Original Code is Mozilla Communicator client code, released 1N/A * The Initial Developer of the Original Code is Netscape 1N/A * Communications Corporation. Portions created by Netscape are 1N/A * Copyright (C) 1998-1999 Netscape Communications Corporation. All 1N/A * To Do: 1) ber_dup_ext(). 1N/A * 2) referrals and reference? 1N/A * Extra size allocated to BerElement. 1N/A/* Mode constants for function memcache_access() */ 1N/A/* Mode constants for function memcache_adj_size */ 1N/A/* Size used for calculation if given size of cache is 0 */ 1N/A/* Index into different list structure */ 1N/A/* Macros to make code more readable */ 1N/A/* Macros dealing with mutex */ 1N/A/* Macros used for triming unnecessary spaces in a basedn */ 1N/A (((c) ==
' ') || ((c) ==
'\t') || ((c) ==
'\n'))
1N/A/* Hash table callback function pointer definition */ 1N/A/* Structure of a node in a hash table */ 1N/A/* Structure of a hash table */ 1N/A/* Structure uniquely identifies a search request */ 1N/A/* Structure representing a ldap handle associated to memcache */ 1N/A/* Structure representing header of a search result */ 1N/A/* Structure for memcache statistics */ 1N/A/* Structure of a memcache object */ 1N/A/* Function prototypes */ 1N/A#
if 0
/* function not used */ 1N/A#
endif /* LDAP_DEBUG */ 1N/A/* Create a memcache object. */ 1N/A /* Non-zero default size needed for calculating size of hash tables */ 1N/A /* Create hash table for temporary cache */ 1N/A /* Create hash table for primary cache */ 1N/A /* See if there is enough room so far */ 1N/A/* Associates a ldap handle to a memcache object. */ 1N/A /* First dissociate handle from old cache */ 1N/A /* Exit if no new cache is specified */ 1N/A /* Then associate handle with new cache */ 1N/A/* Retrieves memcache with which the ldap handle has been associated. */ 1N/A * Function that stays inside libldap and proactively expires items from 1N/A * the given cache. This should be called from a newly created thread since 1N/A * it will not return until after ldap_memcache_destroy() is called. 1N/A/* Removes specified entries from given memcache. */ 1N/A "ldap_memcache_flush( cache: 0x%x, dn: %s, scope: %d)\n",
1N/A/* Destroys the given memcache. */ 1N/A /* Dissociate all ldap handes from this cache. */ 1N/A /* Free array of basedns */ 1N/A /* Free hash table used for temporary cache */ 1N/A /* Free hash table used for primary cache */ 1N/A/************************* Internal API Functions ****************************/ 1N/A/* Creates an integer key by applying the Cyclic Reduntency Check algorithm on 1N/A a long string formed by concatenating all the search parameters plus the 1N/A current bind DN. The key is used in the cache for looking up cached 1N/A entries. It is assumed that the CRC algorithm will generate 1N/A different integers from different byte strings. */ 1N/A/* Searches the cache for the right cached entries, and if found, attaches 1N/A them to the given ldap handle. This function relies on locking by the 1N/A "ldap_memcache_result( ld: 0x%x, msgid: %d, key: 0x%8.8lx)\n",
1N/A /* Search the cache and append the results to ld if found */ 1N/A "ldap_memcache_result: key 0x%8.8lx found in cache\n",
1N/A "ldap_memcache_result: key 0x%8.8lx not found in cache\n",
1N/A#
endif /* LDAP_DEBUG */ 1N/A/* Creates a new header in the cache so that entries arriving from the 1N/A directory server can later be cached under the header. */ 1N/A/* Appends a chain of entries to an existing cache header. Parameter "bLast" 1N/A indicates whether there will be more entries arriving for the search in 1N/A "ldap_memcache_append: %s result for msgid %d\n",
1N/A/* Removes partially cached results for a search as a result of calling 1N/A ldap_abandon() by the client. */ 1N/A/*************************** helper functions *******************************/ 1N/A/* Removes extraneous spaces in a basedn so that basedns differ by only those 1N/A spaces will be treated as equal. Extraneous spaces are those that 1N/A precedes the basedn and those that follow a comma. */ 1N/A * XXXmcs: this is a bit too agressive... we need to deal with the fact that 1N/A * commas and spaces may be quoted, in which case it is wrong to remove them. 1N/A/* Verifies whether the results of a search should be cached or not by 1N/A checking if the search's basedn falls under any of the basedns for which 1N/A the memcache is responsible. */ 1N/A /* XXXmcs: I do not understand this code... */ 1N/A/* Calculates the length of the buffer needed to concatenate the contents of 1N/A/* Contenates the contents of client and server controls to a buffer. */ 1N/A for (j = 0; j <
2; j++) {
1N/A/* Increases or decreases the size (in bytes) the given memcache currently 1N/A uses. If the size goes over the limit, the function returns an error. */ 1N/A "memcache_adj_size: attempting to %s %ld %s bytes...\n",
1N/A "memcache_adj_size: failed (size > size_entries %ld).\n",
1N/A "memcache_adj_size: failed (LRU flush failed).\n",
1N/A "memcache_adj_size: succeeded (new size: %ld bytes).\n",
1N/A "memcache_adj_size: succeeded (new size: %ld bytes, " 1N/A#
endif /* LDAP_DEBUG */ 1N/A/* Searches the cache for results for a particular search identified by 1N/A parameter "key", which was generated ldap_memcache_createkey(). */ 1N/A/* Adds a new header into the cache as a place holder for entries 1N/A/* Appends search entries arriving from the dir server to the cache. */ 1N/A/* Same as memcache_append(), but the entries being appended are the 1N/A last from the dir server. Once all entries for a search have arrived, 1N/A the entries are moved from secondary to primary cache, and a time 1N/A stamp is given to the entries. */ 1N/A/* Removes entries from the temporary cache. */ 1N/A#
if 0
/* this function is not used */ 1N/A/* Wipes out everything in the temporary cache directory. */ 1N/A/* Returns TRUE or FALSE */ 1N/A/* Attaches cached entries to an ldap handle. */ 1N/A/* Check if main_dn is included in {dn, scope} */ 1N/A/* Dup a complete separate copy of a berelement, including the buffers 1N/A the berelement points to. */ 1N/A/* Dup a entry or a chain of entries. */ 1N/A /* Make a copy of res */ 1N/A/************************* Cache Functions ***********************/ 1N/A/* Frees a cache header. */ 1N/A/* Detaches a cache header from the list of headers. */ 1N/A/* Inserts a new cache header to a list of headers. */ 1N/A/* Appends a chain of entries to the given cache header. */ 1N/A " key: 0x%8.8lx, ld: 0x%x, msgid: %d\n",
1N/A#
endif /* LDAP_DEBUG */ 1N/A/* Tells whether a cached result has expired. */ 1N/A/* Operates the cache in a central place. */ 1N/A /* Add a new cache header to the cache. */ 1N/A /* Append entries to an existing cache header. */ 1N/A /* Search for cached entries for a particular search. */ 1N/A /* Remove cached entries in the temporary cache. */ 1N/A /* Wipe out the temporary cache. */ 1N/A /* Remove expired entries from primary cache. */ 1N/A /* Wipe out the primary cache. */ 1N/A /* Remove cached entries in both primary and temporary cache. */ 1N/A for (i = 0; i <
2; i++) {
1N/A /* Flush least recently used entries from cache */ 1N/A "memcache_access FLUSH_LRU: removing key 0x%8.8lx\n",
1N/A /* Unknown command */ 1N/A#
endif /* LDAP_DEBUG */ 1N/A/************************ Hash Table Functions *****************************/ 1N/A/* Calculates size (# of entries) of hash table given the size limit for 1N/A for (i =
3, j =
size /
2; i < j; i++) {
1N/A/* Returns the size in bytes of the given hash table. */ 1N/A/* Inserts an item into the hash table. */ 1N/A/* Retrieves an item from the hash table. */ 1N/A/* Performs a miscellaneous operation on a hash table entry. */ 1N/A/* Removes an item from the hash table. */ 1N/A/* Removes everything in the hash table. */ 1N/A/* Creates a new hash table. */ 1N/A/* Destroys a hash table. */ 1N/A/**************** Hash table callbacks for temporary cache ****************/ 1N/A/* Called by hash table to insert an item. */ 1N/A/* Called by hash table to retrieve an item. */ 1N/A/* Called by hash table to remove an item. */ 1N/A/* Called by hash table to remove all cached entries associated to searches 1N/A being performed using the given ldap handle. */ 1N/A/* Called by hash table for removing all items in the table. */ 1N/A/********************* Hash table for primary cache ************************/ 1N/A/* Called by hash table to insert an item. */ 1N/A/* Called by hash table to retrieve an item. */ 1N/A/* Called by hash table to remove an item. */ 1N/A/* Called by hash table for removing all items in the table. */ 1N/A/***************************** CRC algorithm ********************************/ 1N/A * Build auxiliary table for parallel byte-at-a-time CRC-32. 1N/A 0x00000000,
0x04c11db7,
0x09823b6e,
0x0d4326d9,
0x130476dc,
0x17c56b6b,
1N/A 0x1a864db2,
0x1e475005,
0x2608edb8,
0x22c9f00f,
0x2f8ad6d6,
0x2b4bcb61,
1N/A 0x350c9b64,
0x31cd86d3,
0x3c8ea00a,
0x384fbdbd,
0x4c11db70,
0x48d0c6c7,
1N/A 0x4593e01e,
0x4152fda9,
0x5f15adac,
0x5bd4b01b,
0x569796c2,
0x52568b75,
1N/A 0x6a1936c8,
0x6ed82b7f,
0x639b0da6,
0x675a1011,
0x791d4014,
0x7ddc5da3,
1N/A 0x709f7b7a,
0x745e66cd,
0x9823b6e0,
0x9ce2ab57,
0x91a18d8e,
0x95609039,
1N/A 0x8b27c03c,
0x8fe6dd8b,
0x82a5fb52,
0x8664e6e5,
0xbe2b5b58,
0xbaea46ef,
1N/A 0xb7a96036,
0xb3687d81,
0xad2f2d84,
0xa9ee3033,
0xa4ad16ea,
0xa06c0b5d,
1N/A 0xd4326d90,
0xd0f37027,
0xddb056fe,
0xd9714b49,
0xc7361b4c,
0xc3f706fb,
1N/A 0xceb42022,
0xca753d95,
0xf23a8028,
0xf6fb9d9f,
0xfbb8bb46,
0xff79a6f1,
1N/A 0xe13ef6f4,
0xe5ffeb43,
0xe8bccd9a,
0xec7dd02d,
0x34867077,
0x30476dc0,
1N/A 0x3d044b19,
0x39c556ae,
0x278206ab,
0x23431b1c,
0x2e003dc5,
0x2ac12072,
1N/A 0x128e9dcf,
0x164f8078,
0x1b0ca6a1,
0x1fcdbb16,
0x018aeb13,
0x054bf6a4,
1N/A 0x0808d07d,
0x0cc9cdca,
0x7897ab07,
0x7c56b6b0,
0x71159069,
0x75d48dde,
1N/A 0x6b93dddb,
0x6f52c06c,
0x6211e6b5,
0x66d0fb02,
0x5e9f46bf,
0x5a5e5b08,
1N/A 0x571d7dd1,
0x53dc6066,
0x4d9b3063,
0x495a2dd4,
0x44190b0d,
0x40d816ba,
1N/A 0xaca5c697,
0xa864db20,
0xa527fdf9,
0xa1e6e04e,
0xbfa1b04b,
0xbb60adfc,
1N/A 0xb6238b25,
0xb2e29692,
0x8aad2b2f,
0x8e6c3698,
0x832f1041,
0x87ee0df6,
1N/A 0x99a95df3,
0x9d684044,
0x902b669d,
0x94ea7b2a,
0xe0b41de7,
0xe4750050,
1N/A 0xe9362689,
0xedf73b3e,
0xf3b06b3b,
0xf771768c,
0xfa325055,
0xfef34de2,
1N/A 0xc6bcf05f,
0xc27dede8,
0xcf3ecb31,
0xcbffd686,
0xd5b88683,
0xd1799b34,
1N/A 0xdc3abded,
0xd8fba05a,
0x690ce0ee,
0x6dcdfd59,
0x608edb80,
0x644fc637,
1N/A 0x7a089632,
0x7ec98b85,
0x738aad5c,
0x774bb0eb,
0x4f040d56,
0x4bc510e1,
1N/A 0x46863638,
0x42472b8f,
0x5c007b8a,
0x58c1663d,
0x558240e4,
0x51435d53,
1N/A 0x251d3b9e,
0x21dc2629,
0x2c9f00f0,
0x285e1d47,
0x36194d42,
0x32d850f5,
1N/A 0x3f9b762c,
0x3b5a6b9b,
0x0315d626,
0x07d4cb91,
0x0a97ed48,
0x0e56f0ff,
1N/A 0x1011a0fa,
0x14d0bd4d,
0x19939b94,
0x1d528623,
0xf12f560e,
0xf5ee4bb9,
1N/A 0xf8ad6d60,
0xfc6c70d7,
0xe22b20d2,
0xe6ea3d65,
0xeba91bbc,
0xef68060b,
1N/A 0xd727bbb6,
0xd3e6a601,
0xdea580d8,
0xda649d6f,
0xc423cd6a,
0xc0e2d0dd,
1N/A 0xcda1f604,
0xc960ebb3,
0xbd3e8d7e,
0xb9ff90c9,
0xb4bcb610,
0xb07daba7,
1N/A 0xae3afba2,
0xaafbe615,
0xa7b8c0cc,
0xa379dd7b,
0x9b3660c6,
0x9ff77d71,
1N/A 0x92b45ba8,
0x9675461f,
0x8832161a,
0x8cf30bad,
0x81b02d74,
0x857130c3,
1N/A 0x5d8a9099,
0x594b8d2e,
0x5408abf7,
0x50c9b640,
0x4e8ee645,
0x4a4ffbf2,
1N/A 0x470cdd2b,
0x43cdc09c,
0x7b827d21,
0x7f436096,
0x7200464f,
0x76c15bf8,
1N/A 0x68860bfd,
0x6c47164a,
0x61043093,
0x65c52d24,
0x119b4be9,
0x155a565e,
1N/A 0x18197087,
0x1cd86d30,
0x029f3d35,
0x065e2082,
0x0b1d065b,
0x0fdc1bec,
1N/A 0x3793a651,
0x3352bbe6,
0x3e119d3f,
0x3ad08088,
0x2497d08d,
0x2056cd3a,
1N/A 0x2d15ebe3,
0x29d4f654,
0xc5a92679,
0xc1683bce,
0xcc2b1d17,
0xc8ea00a0,
1N/A 0xd6ad50a5,
0xd26c4d12,
0xdf2f6bcb,
0xdbee767c,
0xe3a1cbc1,
0xe760d676,
1N/A 0xea23f0af,
0xeee2ed18,
0xf0a5bd1d,
0xf464a0aa,
0xf9278673,
0xfde69bc4,
1N/A 0x89b8fd09,
0x8d79e0be,
0x803ac667,
0x84fbdbd0,
0x9abc8bd5,
0x9e7d9662,
1N/A 0x933eb0bb,
0x97ffad0c,
0xafb010b1,
0xab710d06,
0xa6322bdf,
0xa2f33668,
1N/A 0xbcb4666d,
0xb8757bda,
0xb5365d03,
0xb1f740b4 };
1N/A/* Initialized first time "crc32()" is called. If you prefer, you can 1N/A * statically initialize it at compile time. [Another exercise.] 1N/A unsigned long crc;
/* FIXME: this is not 32-bits on all platforms! */ 1N/A crc =
0xffffffff;
/* preload shift register, per CRC-32 spec */ 1N/A return (
unsigned long) ~
crc;
/* transmit complement, per CRC-32 spec */