[Xapian-devel] Problem with overloading add type casts of numeric strings in PHP bindings

Mikael Johansson mikael at synd.info
Mon Feb 13 23:03:48 GMT 2006


Overloaded methods are mapped in PHP to their implementation (_SWIG_0, 
_SWIG_1, ..) based on the types and number of arguments the user supplies. 
However, if one overload accept a string and another an integer the bindings 
fail to separate them since PHP treats numeric strings much the same as 
integers.

The problem is illustrated in WritableDatabase_replace_document() which 
takes either the docid or an unique term found in the document, ie the same 
number of arguments. The check for a number if implemented as IS_STRING in 
the sence of a numeric string which effectivly prevents the application from 
reaching the next section which checks for IS_STRING in the sence of a term 
and executes the intended overload. The solution would be to change the 
integer test from

_v = (Z_TYPE_PP(argv[1]) == IS_LONG ||
  Z_TYPE_PP(argv[1]) == IS_DOUBLE ||
  Z_TYPE_PP(argv[1]) == IS_STRING) ? 1 : 0;

to

_v = (Z_TYPE_PP(argv[1]) == IS_LONG ||
  Z_TYPE_PP(argv[1]) == IS_DOUBLE) ? 1 : 0;

Thus forcing the user to typecast his parameters when in doubt (PHP does 
support casts), before invoking the Xapian methods, to ensure that the 
correct overload is executed. For example

  WritableDatabase_replace_document($handle, (int)$docid, $document); // 
Replace by docid
  WritableDatabase_replace_document($handle, (string)$uniqueterm, 
$document); // Replace by term

Other than that the new bindings with emulated overloads are great, much 
kudos.

//Mikael 





More information about the Xapian-devel mailing list