mirror of
				https://github.com/searxng/searxng.git
				synced 2025-10-31 10:37: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 | ||||
|     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 | ||||
|     engine : torrentz | ||||
|     shortcut : tor | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user