mirror of
				https://github.com/searxng/searxng.git
				synced 2025-10-31 02:27:06 -04:00 
			
		
		
		
	Merge pull request #103 from searxng/add-sqlite-engine2
[enh] add offline engine for sqlite database
This commit is contained in:
		
						commit
						25b5797a0c
					
				
							
								
								
									
										75
									
								
								searx/engines/sqlite.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										75
									
								
								searx/engines/sqlite.py
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,75 @@ | |||||||
|  | # SPDX-License-Identifier: AGPL-3.0-or-later | ||||||
|  | # lint: pylint | ||||||
|  | # pylint: disable=missing-function-docstring | ||||||
|  | 
 | ||||||
|  | """SQLite database (Offline) | ||||||
|  | 
 | ||||||
|  | """ | ||||||
|  | 
 | ||||||
|  | import sqlite3 | ||||||
|  | import contextlib | ||||||
|  | 
 | ||||||
|  | from searx import logger | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | logger = logger.getChild('SQLite engine') | ||||||
|  | 
 | ||||||
|  | engine_type = 'offline' | ||||||
|  | database = "" | ||||||
|  | query_str = "" | ||||||
|  | limit = 10 | ||||||
|  | paging = True | ||||||
|  | result_template = 'key-value.html' | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | def init(engine_settings): | ||||||
|  |     if 'query_str' not in engine_settings: | ||||||
|  |         raise ValueError('query_str cannot be empty') | ||||||
|  | 
 | ||||||
|  |     if not engine_settings['query_str'].lower().startswith('select '): | ||||||
|  |         raise ValueError('only SELECT query is supported') | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | @contextlib.contextmanager | ||||||
|  | def sqlite_cursor(): | ||||||
|  |     """Implements a `Context Manager`_ for a :py:obj:`sqlite3.Cursor`. | ||||||
|  | 
 | ||||||
|  |     Open database in read only mode: if the database doesn't exist. | ||||||
|  |     The default mode creates an empty file on the file system. | ||||||
|  | 
 | ||||||
|  |     see: | ||||||
|  |     * https://docs.python.org/3/library/sqlite3.html#sqlite3.connect | ||||||
|  |     * https://www.sqlite.org/uri.html | ||||||
|  |     """ | ||||||
|  |     global database  # pylint: disable=global-statement | ||||||
|  |     uri = 'file:' + database + '?mode=ro' | ||||||
|  |     with contextlib.closing(sqlite3.connect(uri, uri=True)) as connect: | ||||||
|  |         connect.row_factory = sqlite3.Row | ||||||
|  |         with contextlib.closing(connect.cursor()) as cursor: | ||||||
|  |             yield cursor | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | def search(query, params): | ||||||
|  |     global query_str, result_template  # pylint: disable=global-statement | ||||||
|  |     results = [] | ||||||
|  | 
 | ||||||
|  |     query_params = { | ||||||
|  |         'query': query, | ||||||
|  |         'wildcard':  r'%' + query.replace(' ', r'%') + r'%', | ||||||
|  |         'limit': limit, | ||||||
|  |         'offset': (params['pageno'] - 1) * limit | ||||||
|  |     } | ||||||
|  |     query_to_run = query_str + ' LIMIT :limit OFFSET :offset' | ||||||
|  | 
 | ||||||
|  |     with sqlite_cursor() as cur: | ||||||
|  | 
 | ||||||
|  |         cur.execute(query_to_run, query_params) | ||||||
|  |         col_names = [cn[0] for cn in cur.description] | ||||||
|  | 
 | ||||||
|  |         for row in cur.fetchall(): | ||||||
|  |             item = dict( zip(col_names, map(str, row)) ) | ||||||
|  |             item['template'] = result_template | ||||||
|  |             logger.debug("append result --> %s", item) | ||||||
|  |             results.append(item) | ||||||
|  | 
 | ||||||
|  |     return results | ||||||
| @ -1003,6 +1003,26 @@ engines: | |||||||
|     timeout : 3.0 |     timeout : 3.0 | ||||||
|     disabled : True |     disabled : True | ||||||
| 
 | 
 | ||||||
|  |   # For this demo of the sqlite engine download: | ||||||
|  |   #   https://liste.mediathekview.de/filmliste-v2.db.bz2 | ||||||
|  |   # and unpack into searx/data/filmliste-v2.db | ||||||
|  |   # Query to test: "!demo concert" | ||||||
|  |   # | ||||||
|  |   # - name : demo | ||||||
|  |   #   engine : sqlite | ||||||
|  |   #   shortcut: demo | ||||||
|  |   #   categories: general | ||||||
|  |   #   result_template: default.html | ||||||
|  |   #   database : searx/data/filmliste-v2.db | ||||||
|  |   #   query_str :  >- | ||||||
|  |   #     SELECT title || ' (' || time(duration, 'unixepoch') || ')' AS title, | ||||||
|  |   #            COALESCE( NULLIF(url_video_hd,''), NULLIF(url_video_sd,''), url_video) AS url, | ||||||
|  |   #            description AS content | ||||||
|  |   #       FROM film | ||||||
|  |   #      WHERE title LIKE :wildcard OR description LIKE :wildcard | ||||||
|  |   #      ORDER BY duration DESC | ||||||
|  |   #   disabled : False | ||||||
|  | 
 | ||||||
|   - name : torrentz |   - name : torrentz | ||||||
|     engine : torrentz |     engine : torrentz | ||||||
|     shortcut : tor |     shortcut : tor | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user