Initial import: Carteasy Shop (Dev-Stand)
This commit is contained in:
@@ -0,0 +1,116 @@
|
||||
#!/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("[]")
|
||||
Reference in New Issue
Block a user