Ticket #287: xapian_standalone_test.php

File xapian_standalone_test.php, 2.8 KB (added by Flavio daCosta, 16 years ago)

Test file to reproduce error.

Line 
1#!/usr/bin/php
2<?php
3/*
4 This simulates a problem I am having with Xapian/PHP/Ubuntu. Reduced
5 the problem down to this contrived example.
6
7 PHP Error: DatabaseCorruptError: Data ran out unexpectedly when reading posting list.
8 xapian-check Error: Extra bytes after key for first chunk of posting list for term
9
10 The use case is similar to this:
11 Many accounts with individual data to be indexed. Using a handful of
12 custom prefixes to do filtering when querying. When an account is
13 disabled, the records are purged from the XapianDatabase.
14
15 Errors with:
16 Ubuntu Hardy 8.04.1
17 libxapian15 1.0.5 (Ubuntu current package)
18 php5 5.2.4 (Ubuntu current package)
19
20 -- Did an upgrade install to 1.0.7 and had same problems errors.
21
22 Works fine under:
23 Ubuntu Gutsy 7.10
24 libxapian15 1.0.2 (Ubuntu current package)
25 php5 5.2.3 (Ubuntu current package)
26
27*/
28require '/usr/share/php5/xapian.php';
29
30$db_file = '/tmp/xapiantest';
31
32try {
33
34 /* Changing keys or values will give mixed results. */
35 $recipe_for_fail = array (
36 219 => 74,
37 221 => 116,
38 222 => 199,
39 223 => 21,
40 224 => 45,
41 225 => 155,
42 226 => 189,
43 );
44
45 $testdata = array ();
46 $pos = 0;
47 foreach ($recipe_for_fail as $value => $num)
48 {
49 $testdata += array_fill($pos, $num, $value);
50 $pos += $num;
51 }
52
53 // Populate Xapian database
54 $database = new XapianWritableDatabase($db_file, Xapian::DB_CREATE_OR_OPEN);
55 foreach ($testdata as $value)
56 {
57 $doc = new XapianDocument();
58 $doc->add_term('XC' . $value);
59 $doc->add_term('XTabc');
60 $doc->add_term('XAdef');
61 $doc->add_term('XRghi');
62 // Magic quantity, if you comment this, it wont error.
63 $doc->add_term('XYabc');
64
65 $database->add_document($doc);
66 }
67 $database = null;
68
69
70
71 // Did not normally delete /all/ entries, however, in testing, this
72 // gave more consistent results/error.
73 // Also of note, in production dont actually open the DB twice, however
74 // the error would show up on subsequent calls, doing the second open
75 // in here to reproduce multiple calls in one pass.
76 $database = new XapianWritableDatabase($db_file, Xapian::DB_CREATE_OR_OPEN);
77 foreach (array_keys ($recipe_for_fail) as $value)
78 {
79 $database->delete_document('XC' . $value);
80 }
81 $database = null;
82
83 // Running xapian check on DB shows the errors. In normal use, the
84 // database would work somewhat unless querying for one of the deleted
85 // records.
86 system("xapian-check $db_file");
87
88 echo "Dont forget to remove the db file before next test. ($db_file)\n";
89 //echo "Cleanup\n";
90 //system("rm -Rf $db_file");
91
92} catch (Exception $e) {
93 print $e->getMessage() . "\n";
94 exit(1);
95}