1 /* key-gen.c --- manufacturing sequential keys for some db tables
3 * ====================================================================
4 * Copyright (c) 2000-2004 CollabNet. All rights reserved.
6 * This software is licensed as described in the file COPYING, which
7 * you should have received as part of this distribution. The terms
8 * are also available at http://subversion.tigris.org/license-1.html.
9 * If newer versions of this license are posted there, you may use a
10 * newer version instead, at your option.
12 * This software consists of voluntary contributions made by many
13 * individuals. For exact contribution history, see the revision
14 * history and logs, available at http://subversion.tigris.org/.
15 * ====================================================================
18 #ifndef SVN_LIBSVN_FS_KEY_GEN_H
19 #define SVN_LIBSVN_FS_KEY_GEN_H
23 #include "svn_types.h"
27 #endif /* __cplusplus */
30 /* The alphanumeric keys passed in and out of svn_fs_fs__next_key
31 are guaranteed never to be longer than this many bytes,
32 *including* the trailing null byte. It is therefore safe
33 to declare a key as "char key[MAX_KEY_SIZE]".
35 Note that this limit will be a problem if the number of
36 keys in a table ever exceeds
38 18217977168218728251394687124089371267338971528174
39 76066745969754933395997209053270030282678007662838
40 67331479599455916367452421574456059646801054954062
41 15017704234999886990788594743994796171248406730973
42 80736524850563115569208508785942830080999927310762
43 50733948404739350551934565743979678824151197232629
46 but that's a risk we'll live with for now. */
47 #define MAX_KEY_SIZE 200
50 /* Generate the next key after a given alphanumeric key.
52 * The first *LEN bytes of THIS are an ascii representation of a
53 * number in base 36: digits 0-9 have their usual values, and a-z have
56 * The new key is stored in NEXT, null-terminated. NEXT must be at
57 * least *LEN + 2 bytes long -- one extra byte to hold a possible
58 * overflow column, and one for null termination. On return, *LEN
59 * will be set to the length of the new key, not counting the null
60 * terminator. In other words, the outgoing *LEN will be either equal
61 * to the incoming, or to the incoming + 1.
63 * If THIS contains anything other than digits and lower-case
64 * alphabetic characters, or if it starts with `0' but is not the
65 * string "0", then *LEN is set to zero and the effect on NEXT
68 void svn_fs_fs__next_key(const char *this, apr_size_t
*len
, char *next
);
71 /* Compare two strings A and B as base-36 alphanumeric keys.
73 * Return -1, 0, or 1 if A is less than, equal to, or greater than B,
76 int svn_fs_fs__key_compare(const char *a
, const char *b
);
78 /* Add two base-36 alphanumeric keys to get a third, the result. */
79 void svn_fs_fs__add_keys(const char *key1
, const char *key2
, char *result
);
84 #endif /* __cplusplus */
86 #endif /* SVN_LIBSVN_FS_KEY_GEN_H */