darvid / python-hyperscan

🐍 A CPython extension for the Hyperscan regular expression matching library.
https://python-hyperscan.readthedocs.io/en/latest/
MIT License
165 stars 28 forks source link

Strange "hyperscan.InvalidError: error code -1" #50

Open jerzyorlowskimim opened 1 year ago

jerzyorlowskimim commented 1 year ago

I got strange hyperscan.InvalidError: error code -1 while using scan() function. There nothing else in the stack trace and I cannot find any clue in google

It looks like some stupid simple error. Any Idea what it might be? Is it possible to make the error message more elaborate?

jerzyorlowskimim commented 1 year ago

I am using hyperscan version 0.4.0

jerzyorlowskimim commented 1 year ago

Steps:

f = open("local/keyword_features_hyperscan_databases/TestKeyword1", 'rb')
hdb = hyperscan.loadb(f.read())
hdb.scan("aaa")

gives:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: a bytes-like object is required

TestKeyword1 is a simple test database with a few words that is being compiled a moment before during tests.

darvid commented 1 year ago

try hdb.scan(b"aaa")

jerzyorlowskimim commented 1 year ago

hdb.scan(b"aaa") didn't help. But switching back to hyperscan version 0.3.3 solved the issue.

darvid commented 1 year ago

going to improve type annotations and tests to cover this, as well as docs, but basically the issue is the returned Database doesn't include a scratch. try this:

hdb.scratch = hyperscan.Scratch(db)
hdb.scan(b"aaa")

also you'll have to keep track of the mode of the database that the serialized representation was created with. i.e. if it was created with stream mode, you'll have to use the stream context manager. currently db.mode isn't set on the returned db object, which I'll try to fix.

michaelmior commented 1 year ago

@darvid Is there any reason that the scratch can't (or shouldn't) be initialized automatically if it's missing? At minimum, it would obviously help to have a more informative error :)

(Also, it looks like there's a small typo in your code example above where the parameter to the Scratch constructor should be hdb instead of db.)