| 1 |  | 
|---|
| 2 |  | 
|---|
| 3 | ARB_DB | 
|---|
| 4 |  | 
|---|
| 5 | Basic idea: | 
|---|
| 6 |  | 
|---|
| 7 | All data is stored hierarchically in database elements. | 
|---|
| 8 |  | 
|---|
| 9 | A database element is a small structure which stores: | 
|---|
| 10 | - key | 
|---|
| 11 | - type  (integer/string...) | 
|---|
| 12 | - it's value | 
|---|
| 13 | - last modification time | 
|---|
| 14 | - access rights | 
|---|
| 15 | ... | 
|---|
| 16 |  | 
|---|
| 17 | A value itself might be a set of database elements. | 
|---|
| 18 |  | 
|---|
| 19 | There are 10 basic data types: | 
|---|
| 20 | Type            C/C++ enum      PERL_NAME | 
|---|
| 21 | ---------------------------------------------------------------- | 
|---|
| 22 | String          GB_STRING       STRING  // Null terminated string | 
|---|
| 23 | Integer         GB_INT          INT     // 32 bit integer | 
|---|
| 24 | Float           GB_FLOAT        FLOAT   // real number | 
|---|
| 25 | BitString       GB_BITS         BITS    // any bitstring | 
|---|
| 26 | Integer String  GB_INTS         INTS    // array of integer | 
|---|
| 27 | Container       GB_DB           CONTAINER // a set of other elements | 
|---|
| 28 |  | 
|---|
| 29 |  | 
|---|
| 30 | ****************************** Example 1 *************** | 
|---|
| 31 |  | 
|---|
| 32 | Let's say we want to store the following key value pairs in the | 
|---|
| 33 | database: | 
|---|
| 34 | name    niels | 
|---|
| 35 | tel     37543345 | 
|---|
| 36 | sex     male | 
|---|
| 37 | age     40 | 
|---|
| 38 |  | 
|---|
| 39 | So all we have to do is to create 4 database elements of type | 
|---|
| 40 | STRING and store the data into it: | 
|---|
| 41 |  | 
|---|
| 42 | $gb_main = ARB::open("new_db.arb","wc");        // create new db | 
|---|
| 43 | // we are operating | 
|---|
| 44 | // in a multi user env., so we have to | 
|---|
| 45 | // get exclusive rights to the server: | 
|---|
| 46 | ARB::begin_transaction($gb_main); | 
|---|
| 47 | // create a dbelem key = "name" | 
|---|
| 48 | //                      type = "STRING" | 
|---|
| 49 | $gb_name = ARB::create($gb_main,"name","STRING"); | 
|---|
| 50 | // and store a value in the dbelem | 
|---|
| 51 | $error = ARB::write_string($gb_name,"niels"); | 
|---|
| 52 | ... | 
|---|
| 53 | ... | 
|---|
| 54 | ARB::commit_transaction($gb_main);      // everything is ok | 
|---|
| 55 | $error = ARB::save($gb_main,"new_db.arb", "a"); // save in ascii format | 
|---|
| 56 |  | 
|---|
| 57 | ***************************** END 1 ********************* | 
|---|
| 58 |  | 
|---|
| 59 |  | 
|---|
| 60 | What has been done: | 
|---|
| 61 |  | 
|---|
| 62 | The first argument of nearly all ARB-Database (ARBDB) functions | 
|---|
| 63 | is an existing database element. | 
|---|
| 64 | You may change or read this element or use it to find or | 
|---|
| 65 | create other elements. | 
|---|
| 66 |  | 
|---|
| 67 | First we create a new database "new_db.arb". | 
|---|
| 68 | ARB::open returns the root element of the database. | 
|---|
| 69 | Before we can actually read or write to it we have to | 
|---|
| 70 | get exclusive rights by calling | 
|---|
| 71 | GB_begin_transaction( root_element_of_database ); | 
|---|
| 72 | To make all changes to the database persistent we have | 
|---|
| 73 | to call GB_commit_transaction, or if we want to undo all | 
|---|
| 74 | recent changes GB_abort_transaction. | 
|---|
| 75 | Because the root node of the database is always a container | 
|---|
| 76 | we can simply add new items to it. | 
|---|
| 77 |  | 
|---|
| 78 |  | 
|---|
| 79 | ****************************** Example 2 *************** | 
|---|
| 80 |  | 
|---|
| 81 | We have the same situation as in Example 1 but we want to store | 
|---|
| 82 | the name, tel .. of different persons in the database. | 
|---|
| 83 |  | 
|---|
| 84 | So we simply store the person's data not in the root container, | 
|---|
| 85 | but in a person container. | 
|---|
| 86 |  | 
|---|
| 87 | $gb_main = .... | 
|---|
| 88 | ARB::begin_transaction($gb_main); | 
|---|
| 89 |  | 
|---|
| 90 | for all persons do { | 
|---|
| 91 | $gb_person = ARB::create_container($gb_main,"person"); | 
|---|
| 92 | $gb_name = ARB::create($gb_person,"name","STRING"); | 
|---|
| 93 | $error = ARB::write_string($gb_name,"name of p"); | 
|---|
| 94 | if ($error) ..... | 
|---|
| 95 | $gb_tel = ARB::create($gb_person,"tel", STRING); | 
|---|
| 96 | $error = ARB::write_string($gb_tel,"telnr of person"); | 
|---|
| 97 | } | 
|---|
| 98 | commit and save | 
|---|
| 99 |  | 
|---|
| 100 | ******************************* END 2 *************************** | 
|---|
| 101 |  | 
|---|
| 102 | What's new in the last example: | 
|---|
| 103 |  | 
|---|
| 104 | We created sub containers for each person. All this | 
|---|
| 105 | have the key 'person', so in this case the key is really | 
|---|
| 106 | useless. Some people might think that it would be much | 
|---|
| 107 | better to give each container the name of the person. | 
|---|
| 108 | But that would limit you to search for only one field. | 
|---|
| 109 | So we decided not to index the keys of the database | 
|---|
| 110 | elements but their values. So you should not use the | 
|---|
| 111 | key for indexing. | 
|---|
| 112 |  | 
|---|
| 113 |  | 
|---|
| 114 | Searching the database: | 
|---|
| 115 | There are three main ways to find your data: | 
|---|
| 116 |  | 
|---|
| 117 | 1. Use the key of the elements: | 
|---|
| 118 | This is good if all your keys are unique in | 
|---|
| 119 | a container and if there are only a few elements | 
|---|
| 120 | in a container. | 
|---|
| 121 |  | 
|---|
| 122 | 2. Use the value of the elements: | 
|---|
| 123 | This works like grep in a filesystem. Go through | 
|---|
| 124 | all elements and  inspect the value. | 
|---|
| 125 | This can be indexed, and is therefor much faster | 
|---|
| 126 | and more flexible than the search by key method. | 
|---|
| 127 |  | 
|---|
| 128 | 3. Walk through the database by hand: | 
|---|
| 129 | All elements within one container are stored as | 
|---|
| 130 | a linked list. A small loop allows you to create | 
|---|
| 131 | any user defined query | 
|---|
| 132 |  | 
|---|
| 133 | All searching is done by two functions: | 
|---|
| 134 | find and search | 
|---|
| 135 | Both functions start the search at a user defined database elem | 
|---|
| 136 | (first argument). | 
|---|
| 137 |  | 
|---|
| 138 | ARB::search is used, if all keys in a container are unique. | 
|---|
| 139 | example: | 
|---|
| 140 |  | 
|---|
| 141 | $gb_searched = ARB::search($gb_start,"key1","none"); | 
|---|
| 142 | searches in the container $gb_start for an element with | 
|---|
| 143 | the key 'key1' | 
|---|
| 144 |  | 
|---|
| 145 | $gb_searched = ARB::search($gb_start,"key1/key2","none"); | 
|---|
| 146 | searches a container $gb_h with key 'key1' in $gb_start | 
|---|
| 147 | and if found continues searching in $gb_h for an element | 
|---|
| 148 | with key 'key2' | 
|---|
| 149 |  | 
|---|
| 150 | The last parameter enables ARB::search to create an element if it | 
|---|
| 151 | has not found any. To do this simply enter the type of the new | 
|---|
| 152 | element as the third argument. This is really usefull, if you want | 
|---|
| 153 | to store information in an existing database and you do not know | 
|---|
| 154 | whether an element exists already or not. | 
|---|
| 155 |  | 
|---|
| 156 |  | 
|---|
| 157 | ARB::find is used if not all keys are unique | 
|---|
| 158 |  | 
|---|
| 159 | Like ARB::search it starts the search at a given element. | 
|---|
| 160 | It's basic syntax looks like this: | 
|---|
| 161 |  | 
|---|
| 162 | ARB::find($gb_start_point, "[opt key]", "[opt value]", "mode"); | 
|---|
| 163 | where mode can be:      "this" | 
|---|
| 164 | "down" | 
|---|
| 165 | "down_2" | 
|---|
| 166 | "this_next" | 
|---|
| 167 | "down_next" | 
|---|
| 168 |  | 
|---|
| 169 | if "[opt key]" != "" than look only for items with that key | 
|---|
| 170 | if "[opt value]" != "" than return only those items which value | 
|---|
| 171 | mach the "[opt value]" | 
|---|
| 172 | Any '*' maches any number of characters | 
|---|
| 173 | Any '?' maches exactly one character | 
|---|
| 174 | the rest maches itself | 
|---|
| 175 |  | 
|---|
| 176 | If opt key is the searched key and opt value == "" and mode == | 
|---|
| 177 | "down" than ARB::find will behave like ARB::search. | 
|---|
| 178 |  | 
|---|
| 179 | mode indicates the direction of the search: | 
|---|
| 180 | "down"   means that $gb_start_point is a container and it | 
|---|
| 181 | looks for an element in that container | 
|---|
| 182 | "down_2" means that $gb_start_point is a container and all its | 
|---|
| 183 | elements are containers and it looks for elements in | 
|---|
| 184 | the subcontainers of $gb_start_point | 
|---|
| 185 | "this"  forces ARB::search to look for a brother | 
|---|
| 186 | of $gb_start_point. | 
|---|
| 187 | "this_next" continues a search started by mode == "down", | 
|---|
| 188 | The first parameter should be the last hit | 
|---|
| 189 | "down_next" continues a search started by mode == "down_2", | 
|---|
| 190 | The first parameter should be the father of the last hit. | 
|---|
| 191 | To get the father of an element call | 
|---|
| 192 | ARB::get_father($gb_elem); | 
|---|
| 193 |  | 
|---|
| 194 |  | 
|---|
| 195 |  | 
|---|
| 196 | ****************************** Example 3 *************** | 
|---|
| 197 | Let's find Niels in our database from example 2 | 
|---|
| 198 | and print his data on the screen | 
|---|
| 199 |  | 
|---|
| 200 |  | 
|---|
| 201 | .... | 
|---|
| 202 | // find an element which holds niels name | 
|---|
| 203 | $gb_niels_name = ARB::find($gb_main,"name","niels","down_2"); | 
|---|
| 204 | // We want the container for niels not just his name | 
|---|
| 205 | $gb_niels = ARB::get_father($gb_niels_name); | 
|---|
| 206 | // lets loop through everything | 
|---|
| 207 | $gb_any = ARB::find($gb_niels,"","",down_level); | 
|---|
| 208 | while ($gb_any) { | 
|---|
| 209 | // We know that we have only strings, so this is | 
|---|
| 210 | save | 
|---|
| 211 | // Just read the value | 
|---|
| 212 | $value = ARB::read_string($gb_any); | 
|---|
| 213 | // and we need the key | 
|---|
| 214 | $key = ARB::read_key($gb_any); | 
|---|
| 215 | print "$key:    $value\n"; | 
|---|
| 216 | // get the next element | 
|---|
| 217 | $gb_any = ARB::find($gb_any,"","","this_next"); | 
|---|
| 218 | } | 
|---|
| 219 | ... | 
|---|
| 220 |  | 
|---|
| 221 |  | 
|---|
| 222 | ***************************** All the functions *************** | 
|---|
| 223 |  | 
|---|
| 224 | Now the rest is really trivial: only a lot of functions | 
|---|
| 225 |  | 
|---|
| 226 | Some name conventions: | 
|---|
| 227 | $gb_xxx indicates are variable which is a database | 
|---|
| 228 | element | 
|---|
| 229 | $gb_cxxx is any container | 
|---|
| 230 | $gb_main is always the root element | 
|---|
| 231 | $error is an error string | 
|---|
| 232 |  | 
|---|
| 233 |  | 
|---|
| 234 |  | 
|---|
| 235 | $gb_main = ARB::open("path of existing or new database.arb",flags) | 
|---|
| 236 | if "path of existing or new database.arb" contains a ':' | 
|---|
| 237 | character, then ARB looks for a server instead of a file. | 
|---|
| 238 | path syntax:    hostname:tcpnr          // network mode | 
|---|
| 239 | :path_of_unix_socket    // unix socket | 
|---|
| 240 | :                       // default socket | 
|---|
| 241 |  | 
|---|
| 242 | flags is a string of characters: | 
|---|
| 243 | r               read existing database | 
|---|
| 244 | w               database should be writeable | 
|---|
| 245 | c               create a new one if read failed | 
|---|
| 246 | -> r            reads a database | 
|---|
| 247 | -> rwc          reads or creates a database | 
|---|
| 248 | -> wc           always creates a new one | 
|---|
| 249 |  | 
|---|
| 250 |  | 
|---|
| 251 | $error = ARB::save($gb_main,"path of the database",mode) | 
|---|
| 252 | mode | 
|---|
| 253 | a               ascii format | 
|---|
| 254 | b               binary format | 
|---|
| 255 | Only if you have opened a database on a file you are allowed to | 
|---|
| 256 | save it, otherwise the server has to do it. | 
|---|
| 257 | You may not change the path of the database, it is used | 
|---|
| 258 | for security. If you want to save the database to a new | 
|---|
| 259 | file use: | 
|---|
| 260 |  | 
|---|
| 261 | $error = ARB::save_as($gb_main,"path of the database",mode) | 
|---|
| 262 |  | 
|---|
| 263 |  | 
|---|
| 264 | $error = ARB::save_quick($gb_main,"existing path of the database"); | 
|---|
| 265 | Save all changes to a file "xxxx.quickX" where X is an | 
|---|
| 266 | autoincremented number between 0 and 7 | 
|---|
| 267 |  | 
|---|
| 268 | $error = ARB::save_quick_as($gb_main,"new path"); | 
|---|
| 269 | Fake an existing database by create a symbolic link and | 
|---|
| 270 | then call ARB::save_quick | 
|---|
| 271 |  | 
|---|
| 272 | $error = ARB::close($gb_main); | 
|---|
| 273 | You should be polite to your server and say good bye, so | 
|---|
| 274 | please call this function just before you exit. | 
|---|
| 275 | Nothing serious will happen if you forget to call it. | 
|---|
| 276 |  | 
|---|
| 277 |  | 
|---|
| 278 | $error = ARB::begin_transaction($gb_main); | 
|---|
| 279 | Get the exclusive read and write rights from the server | 
|---|
| 280 | $error = ARB::abort_transaction($gb_main); | 
|---|
| 281 | Undo everything since the last begin_transaction | 
|---|
| 282 | $error = ARB::commit_transaction($gb_main); | 
|---|
| 283 | Write all data to the server and give the database rights | 
|---|
| 284 | back to other users | 
|---|
| 285 |  | 
|---|
| 286 | $error = ARB::push_transaction($gb_main); | 
|---|
| 287 | Increments an internal counter. If the counter was previously | 
|---|
| 288 | 0 then calls begin_transaction. This is usefull when working | 
|---|
| 289 | in a subroutine and not knowing whether your calling function | 
|---|
| 290 | had opened a transaction already. | 
|---|
| 291 | $error = ARB::pop_transaction($gb_main); | 
|---|
| 292 | Decrements the internal counter. If the counter gets zero, | 
|---|
| 293 | commit a transaction. | 
|---|
| 294 |  | 
|---|
| 295 |  | 
|---|
| 296 | ****************** Now the following functions assume that you have | 
|---|
| 297 | began a transaction *************************** | 
|---|
| 298 |  | 
|---|
| 299 | *************************** error handling ******************** | 
|---|
| 300 | Most of the functions return an optional error string if there have | 
|---|
| 301 | been a problem. If a function do not return a error string but | 
|---|
| 302 | for example a database element, you may get the error string by | 
|---|
| 303 | calling ARB::get_error() | 
|---|
| 304 |  | 
|---|
| 305 | example: | 
|---|
| 306 | $gb_main = ARB::open("Idonotexist","rw"); | 
|---|
| 307 | if (! $gb_main ) $error = ARB::get_error(); | 
|---|
| 308 |  | 
|---|
| 309 | **************************** find and search entries *********** | 
|---|
| 310 |  | 
|---|
| 311 | $gb_xxx = ARB::search($gb_start_search_point,"path/in/the/database", | 
|---|
| 312 | "TYPE_OF_ELEMENT_YOU_WANT_CREATE/none" | 
|---|
| 313 | search a database element if all keys are unique | 
|---|
| 314 |  | 
|---|
| 315 | $gb_xxx = ARB::find($gb_start_search_point, "[key]", "[value]", | 
|---|
| 316 | "search_mode" | 
|---|
| 317 |  | 
|---|
| 318 |  | 
|---|
| 319 | ************************** create new entries *************** | 
|---|
| 320 |  | 
|---|
| 321 | $gb_new_entry = ARB::create($gb_cxx, "key", "type"); | 
|---|
| 322 | creates a new element of type "type" within $gb_cxx | 
|---|
| 323 |  | 
|---|
| 324 | $gb_new_container = ARB::create_container($gb_cxx,"key"); | 
|---|
| 325 | create a new container within $gb_cxx | 
|---|
| 326 |  | 
|---|
| 327 | ************************* read entries ******************* | 
|---|
| 328 | // simple types | 
|---|
| 329 | $val = ARB::read_byte($gb_xxx); | 
|---|
| 330 | $val = ARB::read_int($gb_xxx); | 
|---|
| 331 | $val = ARB::read_float($gb_xxx); | 
|---|
| 332 | // array types | 
|---|
| 333 | $val = ARB::read_string($gb_xxx);       // read the value | 
|---|
| 334 | $val = ARB::read_bytes($gb_xxx);        // may contain \0 characters | 
|---|
| 335 | $val = ARB::read_ints_using_index($gb_xx, "index"); | 
|---|
| 336 | // read the integer #index of an | 
|---|
| 337 | // integer array | 
|---|
| 338 | $val = ARB::read_floats_using_index($gb_xxx, "index"); | 
|---|
| 339 |  | 
|---|
| 340 | $val = ARB::read_count($gb_xxx);        // get the size of the array | 
|---|
| 341 |  | 
|---|
| 342 | $val = ARB::read_as_string($gb_xxx);    // read and convert to string | 
|---|
| 343 |  | 
|---|
| 344 | $val = ARB::read_bits($gb_xxx,char_0,char_1); | 
|---|
| 345 | convert a bit array into a string, | 
|---|
| 346 | a '0' will be converted into char_0 | 
|---|
| 347 | a '1' into char_1 | 
|---|
| 348 |  | 
|---|
| 349 | eg: ARB::read_bits($gb_xxx, "-", "+" ); returns a '-' '+' string | 
|---|
| 350 |  | 
|---|
| 351 |  | 
|---|
| 352 | ************************* write entries ******************* | 
|---|
| 353 |  | 
|---|
| 354 | $error = ARB::write_int($gb_xxx, "value");      // write the value | 
|---|
| 355 | $error = ARB::write_float($gb_xxx, "value");    // write the value | 
|---|
| 356 | $error = ARB::write_byte($gb_xxx, "value");     // write the value | 
|---|
| 357 |  | 
|---|
| 358 | $error = ARB::write_bytes($gb_xxx, "value", len);// write array of bytes | 
|---|
| 359 | $error = ARB::write_string($gb_xxx, "value");   // write the value | 
|---|
| 360 | $error = ARB::write_bits($gb_xxx, "value", char_0); // convert a string | 
|---|
| 361 | // into bitarray, all characters != | 
|---|
| 362 | // char_0 will converted to 1 else 0 | 
|---|
| 363 |  | 
|---|
| 364 | $error = ARB::write_as_string($gb_xxx); try to interpret the value and | 
|---|
| 365 | // convert it automatically to the right | 
|---|
| 366 | // format | 
|---|
| 367 |  | 
|---|
| 368 | If you write to an element and you do not change the value, | 
|---|
| 369 | the element thinks, that you have done nothing, and no | 
|---|
| 370 | element pending events are called, and the modification time is not | 
|---|
| 371 | changed. If you want to force to change the element, call | 
|---|
| 372 |  | 
|---|
| 373 | $error = ARB::touch($gb_xxx); | 
|---|
| 374 |  | 
|---|
| 375 | ******************************* etc entries **************** | 
|---|
| 376 |  | 
|---|
| 377 | $error = ARB::delete($gb_xxx); | 
|---|
| 378 | deletes an element or a container and it's subelements | 
|---|
| 379 |  | 
|---|
| 380 | $error = ARB::copy($gb_destination, $gb_source); | 
|---|
| 381 | copy's the value from source to destination. | 
|---|
| 382 | does not create a new element. | 
|---|
| 383 | the type of $gb_destination must be the type of $gb_source | 
|---|
| 384 | if type == "CONTAINER" than all subelements are copied | 
|---|
| 385 |  | 
|---|
| 386 | ************************ security levels ********************** | 
|---|
| 387 |  | 
|---|
| 388 | each database element has three security levels: | 
|---|
| 389 | read write and delete | 
|---|
| 390 | each level's value is between 0 and 7 | 
|---|
| 391 |  | 
|---|
| 392 | $val = ARB::read_security_read($gb_xxx); | 
|---|
| 393 | $val = ARB::read_security_write($gb_xxx); | 
|---|
| 394 | $val = ARB::read_security_delete($gb_xxx); | 
|---|
| 395 |  | 
|---|
| 396 | $error = ARB::write_security_read($gb_xxx, "val"); | 
|---|
| 397 | $error = ARB::write_security_write($gb_xxx, "val"); | 
|---|
| 398 | $error = ARB::write_security_delete($gb_xxx, "val"); | 
|---|
| 399 |  | 
|---|
| 400 | to change any element, the users security level must be greater or | 
|---|
| 401 | equal the elements level. To change the users level call: | 
|---|
| 402 |  | 
|---|
| 403 | $error        = ARB::change_my_security($gb_main,"level","passwd"); | 
|---|
| 404 | passwd is not in use yet | 
|---|
| 405 |  | 
|---|
| 406 |  | 
|---|
| 407 | *********************** additional element information *********** | 
|---|
| 408 |  | 
|---|
| 409 | $type = ARB::read_type($gb_xxx); | 
|---|
| 410 | gets the type of a database elem: "INT" "STRING" "CONTAINER" .... | 
|---|
| 411 |  | 
|---|
| 412 | $key = ARB::read_key($gb_xxx); | 
|---|
| 413 | read the key of a database elem: | 
|---|
| 414 |  | 
|---|
| 415 | $clock = ARB::read_clock($gb_xxx); | 
|---|
| 416 | gets the last modification time of an entry. | 
|---|
| 417 | The modification time of a container is always greater or equal | 
|---|
| 418 | then the modification time of it's subelements. | 
|---|
| 419 | The clock counts transactions, not seconds | 
|---|
| 420 |  | 
|---|
| 421 |  | 
|---|
| 422 | $error = ARB::set_temporary($gb_xxx); | 
|---|
| 423 | Marks a field in the database as a temporary field. | 
|---|
| 424 | That means that this field is never saved to a file. | 
|---|
| 425 | $error = ARB::clear_temporary($gb_xxx); | 
|---|
| 426 | Clears tmp flag | 
|---|
| 427 |  | 
|---|
| 428 | $error = ARB::write_flag($gb_xxx, bool); | 
|---|
| 429 | Sets or clears a flag in the database, | 
|---|
| 430 | There are functions to quickly find all flagged == marked | 
|---|
| 431 | entries | 
|---|
| 432 |  | 
|---|
| 433 | $gb_xxx = ARB::first_marked($gb_cxx); | 
|---|
| 434 | finds the first flagged element in a container | 
|---|
| 435 |  | 
|---|
| 436 | $gb_xxx = ARB::next_marked($gb_xxx); | 
|---|
| 437 | gets the next flagged item | 
|---|
| 438 |  | 
|---|
| 439 | $count = ARB::number_of_marked_subentries($gb_cxxx); | 
|---|
| 440 | adds all flags of direct subentries within $gb_cxxx | 
|---|
| 441 |  | 
|---|
| 442 | $error = ARB::write_usr_public($gb_xxx, value); | 
|---|
| 443 | Each element has 8 free public bits | 
|---|
| 444 | public means that all clients share the same bits | 
|---|
| 445 |  | 
|---|
| 446 | $value = ARB::read_usr_public($gb_xxx); | 
|---|
| 447 |  | 
|---|
| 448 |  | 
|---|
| 449 | $error = ARB::write_usr_private($gb_xxx, value); | 
|---|
| 450 | Each element has 8 free private bits | 
|---|
| 451 | private means each database client has it's own bits | 
|---|
| 452 | $value = ARB::read_usr_private($gb_xxx); | 
|---|
| 453 |  | 
|---|
| 454 |  | 
|---|
| 455 | ************************** ETC ************************ | 
|---|
| 456 |  | 
|---|
| 457 | $error = ARB::release($gb_xxx); | 
|---|
| 458 | By default all clients cache all data which has been searched, | 
|---|
| 459 | read or modified. | 
|---|
| 460 | If you want to get rid of some cached items you may call | 
|---|
| 461 | ARB::release, which frees all data below $gb_xxx. | 
|---|
| 462 | Warning: All database elements, which are a subentry of $gb_xxx | 
|---|
| 463 | will be temporary lost. You have to search or find them again. | 
|---|
| 464 |  | 
|---|
| 465 |  | 
|---|
| 466 | $error = ARB::add_callback($gb_xxx, function_name, clientdata); | 
|---|
| 467 | Adds a callback to a database element. | 
|---|
| 468 | Every time you call begin_transaction and any other client | 
|---|
| 469 | has changed this database element, your function_name is called | 
|---|
| 470 | Every time you call commit_transaction and you have made | 
|---|
| 471 | changed to this item, your function_name is called, | 
|---|
| 472 |  | 
|---|
| 473 | function_name is a function with the following parameters: | 
|---|
| 474 |  | 
|---|
| 475 | func($gb_changed_element, clientdata, "DELETED/CHANGED" | 
|---|
| 476 | A "DELETED" value in the third argument means that | 
|---|
| 477 | the element had been deleted | 
|---|
| 478 | A "CHANGED" value indicate only a change. | 
|---|
| 479 |  | 
|---|
| 480 | $error = ARB::remove_callback($gb_xxx, function_name); | 
|---|
| 481 | remove a callback | 
|---|
| 482 |  | 
|---|
| 483 |  | 
|---|
| 484 | $error = ARB::create_index($gb_cxx, "key", estimated_size); | 
|---|
| 485 | If you call ARB::find with mode "down_2" or "this_next" | 
|---|
| 486 | very often on a huge database you may create an index. | 
|---|
| 487 | estimated_size is the estimated number of items which should | 
|---|
| 488 | be indexed. | 
|---|
| 489 | In the current version we are using a hash mechanism to index | 
|---|
| 490 | the elements. Only strings can be indexed. | 
|---|
| 491 |  | 
|---|
| 492 | $error = ARB::undo($gb_main, "UNDO"/"REDO"); | 
|---|
| 493 | undo oder redo the database. | 
|---|
| 494 | Should not be called within a running transaction | 
|---|
| 495 |  | 
|---|
| 496 | $info = ARB::undo_info($gb_main, "UNDO"/"REDO"); | 
|---|
| 497 | Should give you a short information about the next undo/redo | 
|---|
| 498 |  | 
|---|
| 499 | $error = ARB::set_undo_mem($gb_main, size_in_bytes); | 
|---|
| 500 | sets the amount of memory used to store undo values | 
|---|
| 501 |  | 
|---|
| 502 | $time = ARB::last_saved_clock($gb_main); | 
|---|
| 503 | transaction number when the database was last saved | 
|---|
| 504 | Can only be called from the server program | 
|---|
| 505 |  | 
|---|
| 506 | $time = ARB::last_saved_time($gb_main); | 
|---|
| 507 | the same but in seconds after 1 Jan 0:00 1970 | 
|---|
| 508 |  | 
|---|
| 509 | $error = ARB::set_cache_size($gb_main, "size_in_bytes"); | 
|---|
| 510 | ARB uses datacompression for long strings. If some strings | 
|---|
| 511 | are used very intensely the program may slow down. | 
|---|
| 512 | Therefor a small cache is used and it's size can be set | 
|---|
| 513 | by this function. If you are working with sequences, a value | 
|---|
| 514 | of 1 or 2 meg seems reasonable | 
|---|
| 515 |  | 
|---|
| 516 |  | 
|---|
| 517 | $error = ARB::check_key("key"); | 
|---|
| 518 | checks "key" is a valid key | 
|---|
| 519 |  | 
|---|
| 520 | ************************* Creating a server ****************** | 
|---|
| 521 |  | 
|---|
| 522 | $error = ARB::sopen("socketid",timeout_in_millisec, $gb_main); | 
|---|
| 523 | serves $gb_main for other clients. | 
|---|
| 524 | syntax of "socketid": | 
|---|
| 525 | host:tcpnr | 
|---|
| 526 | :/path/of/unix/socket | 
|---|
| 527 | :                       // default unix socket | 
|---|
| 528 |  | 
|---|
| 529 | prepares the database to be served. timeout is not used now | 
|---|
| 530 | but later in: | 
|---|
| 531 |  | 
|---|
| 532 | $error = ARB::accept_calls($gb_main); | 
|---|
| 533 | Watch your socket timeout_in_millisec for any clients, who need | 
|---|
| 534 | help | 
|---|
| 535 |  | 
|---|
| 536 | $error = ARB::shutdown($gb_main); | 
|---|
| 537 | shutdown the server | 
|---|
| 538 |  | 
|---|
| 539 | $clients = ARB::read_clients($gb_main) | 
|---|
| 540 | Get the number of clients using this server. | 
|---|
| 541 | if $clients == -1 than I'm a client no server | 
|---|
| 542 | So this can be used to check wether I'm a client or server | 
|---|
| 543 |  | 
|---|