| 
									
										
										
										
											2021-05-30 19:20:17 +02:00
										 |  |  | # SPDX-License-Identifier: AGPL-3.0-or-later | 
					
						
							|  |  |  | # lint: pylint | 
					
						
							| 
									
										
										
										
											2023-06-30 18:07:02 +02:00
										 |  |  | """Redis is an open source (BSD licensed), in-memory data structure (key value
 | 
					
						
							|  |  |  | based) store.  Before configuring the ``redis_server`` engine, you must install | 
					
						
							|  |  |  | the dependency redis_. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Configuration | 
					
						
							|  |  |  | ============= | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Select a database to search in and set its index in the option ``db``.  You can | 
					
						
							|  |  |  | either look for exact matches or use partial keywords to find what you are | 
					
						
							|  |  |  | looking for by configuring ``exact_match_only``. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Example | 
					
						
							|  |  |  | ======= | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Below is an example configuration: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | .. code:: yaml | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   # Required dependency: redis | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   - name: myredis | 
					
						
							|  |  |  |     shortcut : rds | 
					
						
							|  |  |  |     engine: redis_server | 
					
						
							|  |  |  |     exact_match_only: false | 
					
						
							|  |  |  |     host: '127.0.0.1' | 
					
						
							|  |  |  |     port: 6379 | 
					
						
							|  |  |  |     enable_http: true | 
					
						
							|  |  |  |     password: '' | 
					
						
							|  |  |  |     db: 0 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Implementations | 
					
						
							|  |  |  | =============== | 
					
						
							| 
									
										
										
										
											2021-05-30 19:20:17 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | """
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import redis  # pylint: disable=import-error | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | engine_type = 'offline' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # redis connection variables | 
					
						
							|  |  |  | host = '127.0.0.1' | 
					
						
							|  |  |  | port = 6379 | 
					
						
							|  |  |  | password = '' | 
					
						
							|  |  |  | db = 0 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # engine specific variables | 
					
						
							|  |  |  | paging = False | 
					
						
							|  |  |  | result_template = 'key-value.html' | 
					
						
							|  |  |  | exact_match_only = True | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-06-02 09:54:58 +02:00
										 |  |  | _redis_client = None | 
					
						
							| 
									
										
										
										
											2021-12-27 09:26:22 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-05-30 19:20:17 +02:00
										 |  |  | def init(_engine_settings): | 
					
						
							| 
									
										
										
										
											2021-06-02 09:54:58 +02:00
										 |  |  |     global _redis_client  # pylint: disable=global-statement | 
					
						
							|  |  |  |     _redis_client = redis.StrictRedis( | 
					
						
							| 
									
										
										
										
											2021-12-27 09:26:22 +01:00
										 |  |  |         host=host, | 
					
						
							|  |  |  |         port=port, | 
					
						
							|  |  |  |         db=db, | 
					
						
							|  |  |  |         password=password or None, | 
					
						
							|  |  |  |         decode_responses=True, | 
					
						
							| 
									
										
										
										
											2021-05-30 19:20:17 +02:00
										 |  |  |     ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-12-27 09:26:22 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-05-30 19:20:17 +02:00
										 |  |  | def search(query, _params): | 
					
						
							|  |  |  |     if not exact_match_only: | 
					
						
							|  |  |  |         return search_keys(query) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-06-02 09:54:58 +02:00
										 |  |  |     ret = _redis_client.hgetall(query) | 
					
						
							| 
									
										
										
										
											2021-05-30 19:20:17 +02:00
										 |  |  |     if ret: | 
					
						
							|  |  |  |         ret['template'] = result_template | 
					
						
							|  |  |  |         return [ret] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if ' ' in query: | 
					
						
							|  |  |  |         qset, rest = query.split(' ', 1) | 
					
						
							|  |  |  |         ret = [] | 
					
						
							| 
									
										
										
										
											2021-12-27 09:26:22 +01:00
										 |  |  |         for res in _redis_client.hscan_iter(qset, match='*{}*'.format(rest)): | 
					
						
							|  |  |  |             ret.append( | 
					
						
							|  |  |  |                 { | 
					
						
							|  |  |  |                     res[0]: res[1], | 
					
						
							|  |  |  |                     'template': result_template, | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |             ) | 
					
						
							| 
									
										
										
										
											2021-05-30 19:20:17 +02:00
										 |  |  |         return ret | 
					
						
							|  |  |  |     return [] | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-12-27 09:26:22 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-05-30 19:20:17 +02:00
										 |  |  | def search_keys(query): | 
					
						
							|  |  |  |     ret = [] | 
					
						
							| 
									
										
										
										
											2021-12-27 09:26:22 +01:00
										 |  |  |     for key in _redis_client.scan_iter(match='*{}*'.format(query)): | 
					
						
							| 
									
										
										
										
											2021-06-02 09:54:58 +02:00
										 |  |  |         key_type = _redis_client.type(key) | 
					
						
							| 
									
										
										
										
											2021-05-30 19:20:17 +02:00
										 |  |  |         res = None | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if key_type == 'hash': | 
					
						
							| 
									
										
										
										
											2021-06-02 09:54:58 +02:00
										 |  |  |             res = _redis_client.hgetall(key) | 
					
						
							| 
									
										
										
										
											2021-05-30 19:20:17 +02:00
										 |  |  |         elif key_type == 'list': | 
					
						
							| 
									
										
										
										
											2021-06-02 09:54:58 +02:00
										 |  |  |             res = dict(enumerate(_redis_client.lrange(key, 0, -1))) | 
					
						
							| 
									
										
										
										
											2021-05-30 19:20:17 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |         if res: | 
					
						
							|  |  |  |             res['template'] = result_template | 
					
						
							|  |  |  |             res['redis_key'] = key | 
					
						
							|  |  |  |             ret.append(res) | 
					
						
							|  |  |  |     return ret |