116 lines
3.7 KiB
Python
116 lines
3.7 KiB
Python
#!/usr/bin/env python3
|
|
# -*- coding: utf-8 -*-
|
|
"""
|
|
Command-line search script - called by PHP
|
|
Usage: python3 python_search.py "search_term"
|
|
Output: JSON array of items
|
|
"""
|
|
|
|
import json
|
|
import sys
|
|
import pymysql
|
|
import os
|
|
from configparser import ConfigParser
|
|
|
|
CONFIG_PATH = os.path.join(os.path.dirname(__file__), 'db_config.ini')
|
|
|
|
def load_db_config():
|
|
"""Load database config from ini file"""
|
|
parser = ConfigParser()
|
|
parser.read(CONFIG_PATH)
|
|
config = parser['database']
|
|
return {
|
|
'host': config.get('host', 'localhost'),
|
|
'user': config.get('user'),
|
|
'password': config.get('password'),
|
|
'database': config.get('database'),
|
|
'charset': 'utf8mb4',
|
|
'autocommit': True
|
|
}
|
|
|
|
def search_items(query):
|
|
"""Search items in database"""
|
|
print(f"# DEBUG: search_items called with '{query}'", file=sys.stderr)
|
|
|
|
if len(query.strip()) < 2:
|
|
print("# DEBUG: Query too short", file=sys.stderr)
|
|
return []
|
|
|
|
try:
|
|
print("# DEBUG: Loading config...", file=sys.stderr)
|
|
config = load_db_config()
|
|
print(f"# DEBUG: Connecting to DB: {config['host']}", file=sys.stderr)
|
|
conn = pymysql.connect(**config)
|
|
cursor = conn.cursor(pymysql.cursors.DictCursor)
|
|
print("# DEBUG: Connected successfully", file=sys.stderr)
|
|
|
|
sql = """
|
|
SELECT id, number, name, active
|
|
FROM items
|
|
WHERE (number LIKE %s OR name LIKE %s)
|
|
AND active = 1
|
|
ORDER BY
|
|
CASE
|
|
WHEN number LIKE %s THEN 1
|
|
WHEN name LIKE %s THEN 2
|
|
ELSE 3
|
|
END,
|
|
name ASC, number ASC
|
|
LIMIT 20
|
|
"""
|
|
|
|
search_param = f"%{query}%"
|
|
search_param_start = f"{query}%"
|
|
print(f"# DEBUG: SQL params: {search_param}", file=sys.stderr)
|
|
|
|
cursor.execute(sql, (search_param, search_param, search_param_start, search_param_start))
|
|
results = cursor.fetchall()
|
|
print(f"# DEBUG: Raw SQL results: {len(results)} rows", file=sys.stderr)
|
|
|
|
# Test: try without active filter
|
|
test_sql = "SELECT COUNT(*) as total FROM items WHERE (number LIKE %s OR name LIKE %s)"
|
|
cursor.execute(test_sql, (search_param, search_param))
|
|
total = cursor.fetchone()
|
|
print(f"# DEBUG: Total matches (any active): {total}", file=sys.stderr)
|
|
|
|
items = []
|
|
for row in results:
|
|
status = ' || aktiv' if row['active'] else ' || inaktiv'
|
|
items.append({
|
|
'id': row['id'],
|
|
'value': row['number'],
|
|
'label': f"{row['name']} ({row['number']}{status})",
|
|
'number': row['number'],
|
|
'name': row['name'],
|
|
'active': row['active']
|
|
})
|
|
|
|
cursor.close()
|
|
conn.close()
|
|
return items
|
|
|
|
except Exception as e:
|
|
# Return empty array on error - let PHP fallback handle it
|
|
return []
|
|
|
|
if __name__ == '__main__':
|
|
print("# DEBUG: Script started", file=sys.stderr)
|
|
print(f"# DEBUG: Args: {sys.argv}", file=sys.stderr)
|
|
|
|
if len(sys.argv) != 2:
|
|
print("# DEBUG: Wrong number of args", file=sys.stderr)
|
|
print("[]")
|
|
sys.exit(1)
|
|
|
|
search_query = sys.argv[1]
|
|
print(f"# DEBUG: Searching for '{search_query}'", file=sys.stderr)
|
|
|
|
try:
|
|
results = search_items(search_query)
|
|
print(f"# DEBUG: Got results: {results}", file=sys.stderr)
|
|
print(json.dumps(results))
|
|
except Exception as e:
|
|
print(f"# DEBUG: Exception: {e}", file=sys.stderr)
|
|
import traceback
|
|
traceback.print_exc(file=sys.stderr)
|
|
print("[]") |