![]() Server : Apache/2 System : Linux server-15-235-50-60 5.15.0-164-generic #174-Ubuntu SMP Fri Nov 14 20:25:16 UTC 2025 x86_64 User : gositeme ( 1004) PHP Version : 8.2.29 Disable Function : exec,system,passthru,shell_exec,proc_close,proc_open,dl,popen,show_source,posix_kill,posix_mkfifo,posix_getpwuid,posix_setpgid,posix_setsid,posix_setuid,posix_setgid,posix_seteuid,posix_setegid,posix_uname Directory : /home/gositeme/.cursor-server/data/User/History/-60baea9/ |
<?php
// Database configuration for SoundStudioPro
// Load credentials from external file for security
// Load database configuration from external file
$db_config = include '/home/gositeme/domains/soundstudiopro.com/database.env.php';
define('DB_HOST', $db_config['host']);
define('DB_NAME', $db_config['name']);
define('DB_USER', $db_config['user']);
define('DB_PASS', $db_config['pass']);
// Create database connection
function getDBConnection() {
try {
$pdo = new PDO(
"mysql:host=" . DB_HOST . ";dbname=" . DB_NAME . ";charset=utf8mb4",
DB_USER,
DB_PASS,
[
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
PDO::ATTR_EMULATE_PREPARES => false
]
);
return $pdo;
} catch (PDOException $e) {
error_log("Database connection failed: " . $e->getMessage());
return null;
}
}
// Initialize database tables
function initializeDatabase() {
$pdo = getDBConnection();
if (!$pdo) return false;
try {
// Users table
$pdo->exec("
CREATE TABLE IF NOT EXISTS users (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255) NOT NULL,
email VARCHAR(255) UNIQUE NOT NULL,
password VARCHAR(255) NOT NULL,
credits INT DEFAULT 5,
plan ENUM('free', 'starter', 'pro') DEFAULT 'free',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
)
");
// Music tracks table
$pdo->exec("
CREATE TABLE IF NOT EXISTS music_tracks (
id INT AUTO_INCREMENT PRIMARY KEY,
user_id INT NOT NULL,
task_id VARCHAR(255) UNIQUE NOT NULL,
title VARCHAR(255) NOT NULL,
prompt TEXT NOT NULL,
music_type ENUM('music', 'lyrics', 'wav', 'vocal-removal', 'music-video', 'extend') NOT NULL,
model_version VARCHAR(10) DEFAULT 'v3',
duration INT DEFAULT 30,
status ENUM('processing', 'complete', 'failed') DEFAULT 'processing',
audio_url TEXT,
video_url TEXT,
lyrics TEXT,
metadata JSON,
price DECIMAL(10,2) DEFAULT 0.00,
is_featured BOOLEAN DEFAULT FALSE,
is_vip_sample BOOLEAN DEFAULT FALSE,
playlist_order INT DEFAULT 0,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
)
");
// User sessions table
$pdo->exec("
CREATE TABLE IF NOT EXISTS user_sessions (
id INT AUTO_INCREMENT PRIMARY KEY,
user_id INT NOT NULL,
session_token VARCHAR(255) UNIQUE NOT NULL,
expires_at TIMESTAMP NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
)
");
// Credits transactions table
$pdo->exec("
CREATE TABLE IF NOT EXISTS credit_transactions (
id INT AUTO_INCREMENT PRIMARY KEY,
user_id INT NOT NULL,
amount INT NOT NULL,
type ENUM('purchase', 'usage', 'bonus', 'refund') NOT NULL,
description VARCHAR(255),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
)
");
// Email logs table
$pdo->exec("
CREATE TABLE IF NOT EXISTS email_logs (
id INT AUTO_INCREMENT PRIMARY KEY,
recipient_email VARCHAR(255) NOT NULL,
recipient_name VARCHAR(255),
subject VARCHAR(255) NOT NULL,
email_type VARCHAR(50) NOT NULL,
status ENUM('sent', 'failed', 'pending') DEFAULT 'pending',
error_message TEXT,
sent_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
user_id INT,
order_id VARCHAR(100),
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE SET NULL
)
");
// Security events table
$pdo->exec("
CREATE TABLE IF NOT EXISTS security_events (
id INT AUTO_INCREMENT PRIMARY KEY,
event_type VARCHAR(100) NOT NULL,
details TEXT,
user_id INT,
admin_id INT,
ip_address VARCHAR(45),
user_agent TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE SET NULL,
FOREIGN KEY (admin_id) REFERENCES users(id) ON DELETE SET NULL
)
");
// User login history table
$pdo->exec("
CREATE TABLE IF NOT EXISTS user_login_history (
id INT AUTO_INCREMENT PRIMARY KEY,
user_id INT NOT NULL,
ip_address VARCHAR(45),
user_agent TEXT,
login_success BOOLEAN DEFAULT TRUE,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
)
");
// User follows table
$pdo->exec("
CREATE TABLE IF NOT EXISTS user_follows (
id INT AUTO_INCREMENT PRIMARY KEY,
follower_id INT NOT NULL,
following_id INT NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (follower_id) REFERENCES users(id) ON DELETE CASCADE,
FOREIGN KEY (following_id) REFERENCES users(id) ON DELETE CASCADE,
UNIQUE KEY unique_follow (follower_id, following_id)
)
");
// Audio variations table
$pdo->exec("
CREATE TABLE IF NOT EXISTS audio_variations (
id INT AUTO_INCREMENT PRIMARY KEY,
track_id INT NOT NULL,
variation_index INT NOT NULL,
audio_url TEXT,
duration INT,
title VARCHAR(255),
tags TEXT,
image_url TEXT,
source_audio_url TEXT,
stream_audio_url TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (track_id) REFERENCES music_tracks(id) ON DELETE CASCADE
)
");
// Track likes table
$pdo->exec("
CREATE TABLE IF NOT EXISTS track_likes (
id INT AUTO_INCREMENT PRIMARY KEY,
track_id INT NOT NULL,
user_id INT NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (track_id) REFERENCES music_tracks(id) ON DELETE CASCADE,
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,
UNIQUE KEY unique_like (track_id, user_id)
)
");
// Track plays table
$pdo->exec("
CREATE TABLE IF NOT EXISTS track_plays (
id INT AUTO_INCREMENT PRIMARY KEY,
track_id INT NOT NULL,
user_id INT,
ip_address VARCHAR(45),
played_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (track_id) REFERENCES music_tracks(id) ON DELETE CASCADE,
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE SET NULL
)
");
// Create performance indexes
$indexes = [
// Music tracks indexes
"CREATE INDEX IF NOT EXISTS idx_music_tracks_user_status ON music_tracks(user_id, status)",
"CREATE INDEX IF NOT EXISTS idx_music_tracks_created_at ON music_tracks(created_at)",
"CREATE INDEX IF NOT EXISTS idx_music_tracks_status ON music_tracks(status)",
"CREATE INDEX IF NOT EXISTS idx_music_tracks_task_id ON music_tracks(task_id)",
// User follows indexes
"CREATE INDEX IF NOT EXISTS idx_user_follows_follower ON user_follows(follower_id)",
"CREATE INDEX IF NOT EXISTS idx_user_follows_following ON user_follows(following_id)",
// Audio variations indexes
"CREATE INDEX IF NOT EXISTS idx_audio_variations_track ON audio_variations(track_id)",
// Track likes indexes
"CREATE INDEX IF NOT EXISTS idx_track_likes_track ON track_likes(track_id)",
// Track plays indexes
"CREATE INDEX IF NOT EXISTS idx_track_plays_track ON track_plays(track_id)",
// Credit transactions indexes
"CREATE INDEX IF NOT EXISTS idx_credit_transactions_user ON credit_transactions(user_id, created_at)",
// Email logs indexes
"CREATE INDEX IF NOT EXISTS idx_email_logs_sent_at ON email_logs(sent_at)",
"CREATE INDEX IF NOT EXISTS idx_email_logs_user ON email_logs(user_id)",
// Security events indexes
"CREATE INDEX IF NOT EXISTS idx_security_events_type ON security_events(event_type, created_at)",
"CREATE INDEX IF NOT EXISTS idx_security_events_user ON security_events(user_id)",
// User login history indexes
"CREATE INDEX IF NOT EXISTS idx_user_login_history_user ON user_login_history(user_id, created_at)",
"CREATE INDEX IF NOT EXISTS idx_user_login_history_ip ON user_login_history(ip_address)"
];
foreach ($indexes as $index_sql) {
try {
$pdo->exec($index_sql);
} catch (Exception $e) {
// Index might already exist, continue
}
}
// Security flags table
$pdo->exec("
CREATE TABLE IF NOT EXISTS security_flags (
id INT AUTO_INCREMENT PRIMARY KEY,
flag_type VARCHAR(100) NOT NULL,
flag_value TEXT,
severity ENUM('low', 'medium', 'high', 'critical') DEFAULT 'medium',
is_active BOOLEAN DEFAULT TRUE,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
resolved_at TIMESTAMP NULL
)
");
// IP blacklist table
$pdo->exec("
CREATE TABLE IF NOT EXISTS ip_blacklist (
id INT AUTO_INCREMENT PRIMARY KEY,
ip_address VARCHAR(45) UNIQUE NOT NULL,
reason TEXT,
blocked_by INT,
blocked_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
expires_at TIMESTAMP NULL,
FOREIGN KEY (blocked_by) REFERENCES users(id) ON DELETE SET NULL
)
");
// User login history table
$pdo->exec("
CREATE TABLE IF NOT EXISTS user_login_history (
id INT AUTO_INCREMENT PRIMARY KEY,
user_id INT NOT NULL,
ip_address VARCHAR(45),
user_agent TEXT,
login_success BOOLEAN DEFAULT TRUE,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
)
");
// Add security-related columns to users table
$pdo->exec("
ALTER TABLE users
ADD COLUMN IF NOT EXISTS is_admin BOOLEAN DEFAULT FALSE,
ADD COLUMN IF NOT EXISTS is_blocked BOOLEAN DEFAULT FALSE,
ADD COLUMN IF NOT EXISTS block_reason TEXT,
ADD COLUMN IF NOT EXISTS blocked_at TIMESTAMP NULL,
ADD COLUMN IF NOT EXISTS last_login_ip VARCHAR(45),
ADD COLUMN IF NOT EXISTS last_login_at TIMESTAMP NULL,
ADD COLUMN IF NOT EXISTS failed_login_attempts INT DEFAULT 0,
ADD COLUMN IF NOT EXISTS last_failed_login TIMESTAMP NULL
");
// User follows table (for social features)
$pdo->exec("
CREATE TABLE IF NOT EXISTS user_follows (
id INT AUTO_INCREMENT PRIMARY KEY,
follower_id INT NOT NULL,
following_id INT NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
UNIQUE KEY unique_follow (follower_id, following_id),
FOREIGN KEY (follower_id) REFERENCES users(id) ON DELETE CASCADE,
FOREIGN KEY (following_id) REFERENCES users(id) ON DELETE CASCADE
)
");
// Track likes table (for track likes)
$pdo->exec("
CREATE TABLE IF NOT EXISTS track_likes (
id INT AUTO_INCREMENT PRIMARY KEY,
user_id INT NOT NULL,
track_id INT NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
UNIQUE KEY unique_like (user_id, track_id),
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,
FOREIGN KEY (track_id) REFERENCES music_tracks(id) ON DELETE CASCADE
)
");
// Track comments table (for track comments)
$pdo->exec("
CREATE TABLE IF NOT EXISTS track_comments (
id INT AUTO_INCREMENT PRIMARY KEY,
user_id INT NOT NULL,
track_id INT NOT NULL,
comment TEXT NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,
FOREIGN KEY (track_id) REFERENCES music_tracks(id) ON DELETE CASCADE
)
");
// Track views table (for view tracking)
$pdo->exec("
CREATE TABLE IF NOT EXISTS track_views (
id INT AUTO_INCREMENT PRIMARY KEY,
track_id INT NOT NULL,
user_id INT,
ip_address VARCHAR(45),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (track_id) REFERENCES music_tracks(id) ON DELETE CASCADE,
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE SET NULL
)
");
// Track shares table (for share tracking)
$pdo->exec("
CREATE TABLE IF NOT EXISTS track_shares (
id INT AUTO_INCREMENT PRIMARY KEY,
track_id INT NOT NULL,
user_id INT,
share_type VARCHAR(50) DEFAULT 'social',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (track_id) REFERENCES music_tracks(id) ON DELETE CASCADE,
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE SET NULL
)
");
// Track purchases table (for user purchases)
$pdo->exec("
CREATE TABLE IF NOT EXISTS track_purchases (
id INT AUTO_INCREMENT PRIMARY KEY,
user_id INT NOT NULL,
track_id INT NOT NULL,
price_paid DECIMAL(10,2) NOT NULL,
credits_used INT NOT NULL,
purchase_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
download_count INT DEFAULT 0,
last_downloaded TIMESTAMP NULL,
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,
FOREIGN KEY (track_id) REFERENCES music_tracks(id) ON DELETE CASCADE,
UNIQUE KEY unique_purchase (user_id, track_id)
)
");
// User profiles table (for additional profile info)
$pdo->exec("
CREATE TABLE IF NOT EXISTS user_profiles (
id INT AUTO_INCREMENT PRIMARY KEY,
user_id INT NOT NULL UNIQUE,
bio TEXT,
location VARCHAR(255),
website VARCHAR(255),
social_links JSON,
profile_image VARCHAR(255),
genres JSON,
music_style TEXT,
artist_highlights JSON,
influences TEXT,
equipment TEXT,
achievements JSON,
featured_tracks JSON,
artist_statement TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
)
");
// Track plays table (for play count tracking)
$pdo->exec("
CREATE TABLE IF NOT EXISTS track_plays (
id INT AUTO_INCREMENT PRIMARY KEY,
track_id INT NOT NULL,
user_id INT,
ip_address VARCHAR(45),
user_agent TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (track_id) REFERENCES music_tracks(id) ON DELETE CASCADE,
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE SET NULL
)
");
// Admin logs table (for tracking admin actions)
$pdo->exec("
CREATE TABLE IF NOT EXISTS admin_logs (
id INT AUTO_INCREMENT PRIMARY KEY,
admin_id INT NOT NULL,
action VARCHAR(100) NOT NULL,
target_user_id INT,
details TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (admin_id) REFERENCES users(id) ON DELETE CASCADE,
FOREIGN KEY (target_user_id) REFERENCES users(id) ON DELETE SET NULL
)
");
// Site settings table (for global site configuration)
$pdo->exec("
CREATE TABLE IF NOT EXISTS site_settings (
id INT AUTO_INCREMENT PRIMARY KEY,
setting_key VARCHAR(100) UNIQUE NOT NULL,
setting_value TEXT,
setting_description TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
)
");
// Email logs table for tracking email activity
$pdo->exec("
CREATE TABLE IF NOT EXISTS email_logs (
id INT AUTO_INCREMENT PRIMARY KEY,
recipient_email VARCHAR(255) NOT NULL,
recipient_name VARCHAR(255),
subject VARCHAR(255) NOT NULL,
email_type VARCHAR(50) NOT NULL,
status ENUM('sent', 'failed', 'pending') DEFAULT 'pending',
error_message TEXT,
sent_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
user_id INT,
order_id VARCHAR(100),
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE SET NULL
)
");
// Insert default site settings if they don't exist
$defaultSettings = [
['global_player_enabled', '1', 'Enable global music player'],
['auto_play_enabled', '0', 'Enable auto-play for music player'],
['shuffle_enabled', '0', 'Enable shuffle mode for playlists'],
['ajax_enabled', '1', 'Enable AJAX navigation'],
['debug_mode', '0', 'Enable debug mode'],
['stripe_live_mode', '1', 'Use Stripe live mode'],
['auto_refresh_payment_methods', '0', 'Auto-refresh payment methods']
];
foreach ($defaultSettings as $setting) {
try {
$stmt = $pdo->prepare("
INSERT IGNORE INTO site_settings (setting_key, setting_value, setting_description)
VALUES (?, ?, ?)
");
$stmt->execute($setting);
} catch (Exception $e) {
// If setting_description column doesn't exist, try without it
try {
$stmt = $pdo->prepare("
INSERT IGNORE INTO site_settings (setting_key, setting_value)
VALUES (?, ?)
");
$stmt->execute([$setting[0], $setting[1]]);
} catch (Exception $e2) {
error_log("Failed to insert site setting: " . $e2->getMessage());
}
}
}
return true;
} catch (PDOException $e) {
error_log("Database initialization failed: " . $e->getMessage());
return false;
}
}
// User management functions
function createUser($name, $email, $password) {
$pdo = getDBConnection();
if (!$pdo) return false;
try {
$hashedPassword = password_hash($password, PASSWORD_DEFAULT);
$stmt = $pdo->prepare("
INSERT INTO users (name, email, password, credits, plan)
VALUES (?, ?, ?, 5, 'free')
");
return $stmt->execute([$name, $email, $hashedPassword]);
} catch (PDOException $e) {
error_log("User creation failed: " . $e->getMessage());
return false;
}
}
function authenticateUser($email, $password) {
$pdo = getDBConnection();
if (!$pdo) return false;
try {
$stmt = $pdo->prepare("SELECT * FROM users WHERE email = ?");
$stmt->execute([$email]);
$user = $stmt->fetch();
if ($user && password_verify($password, $user['password'])) {
return $user;
}
return false;
} catch (PDOException $e) {
error_log("User authentication failed: " . $e->getMessage());
return false;
}
}
function getUserById($id) {
$pdo = getDBConnection();
if (!$pdo) return false;
try {
$stmt = $pdo->prepare("SELECT * FROM users WHERE id = ?");
$stmt->execute([$id]);
return $stmt->fetch();
} catch (PDOException $e) {
error_log("Get user failed: " . $e->getMessage());
return false;
}
}
function updateUserCredits($userId, $credits) {
$pdo = getDBConnection();
if (!$pdo) return false;
try {
$stmt = $pdo->prepare("UPDATE users SET credits = ? WHERE id = ?");
return $stmt->execute([$credits, $userId]);
} catch (PDOException $e) {
error_log("Update credits failed: " . $e->getMessage());
return false;
}
}
// Music track management functions
function createMusicTrack($userId, $taskId, $title, $prompt, $musicType, $modelVersion = 'v3', $duration = 30) {
$pdo = getDBConnection();
if (!$pdo) return false;
try {
// Check user credits first
$stmt = $pdo->prepare("SELECT credits FROM users WHERE id = ?");
$stmt->execute([$userId]);
$user = $stmt->fetch();
if (!$user || $user['credits'] < 1) {
error_log("Insufficient credits for user $userId to create track");
return false;
}
// Deduct credit
$newCredits = $user['credits'] - 1;
$stmt = $pdo->prepare("UPDATE users SET credits = ? WHERE id = ?");
$stmt->execute([$newCredits, $userId]);
// Record credit transaction
$stmt = $pdo->prepare("
INSERT INTO credit_transactions (user_id, amount, type, description, created_at)
VALUES (?, -1, 'usage', 'Music track creation via createMusicTrack: $title', NOW())
");
$stmt->execute([$userId]);
// Create the track
$stmt = $pdo->prepare("
INSERT INTO music_tracks (user_id, task_id, title, prompt, music_type, model_version, duration)
VALUES (?, ?, ?, ?, ?, ?, ?)
");
$result = $stmt->execute([$userId, $taskId, $title, $prompt, $musicType, $modelVersion, $duration]);
if ($result) {
error_log("Credit deducted for user $userId: 1 credit, new balance: $newCredits");
}
return $result;
} catch (PDOException $e) {
error_log("Create music track failed: " . $e->getMessage());
return false;
}
}
function updateMusicTrack($taskId, $status, $audioUrl = null, $videoUrl = null, $lyrics = null, $metadata = null, $duration = null) {
$pdo = getDBConnection();
if (!$pdo) return false;
try {
// Parse metadata to extract individual fields
$metadataArray = $metadata ? json_decode($metadata, true) : [];
// Build the update query dynamically based on what's provided
$updates = ['status = ?'];
$params = [$status];
if ($audioUrl !== null) {
$updates[] = 'audio_url = ?';
$params[] = $audioUrl;
}
if ($videoUrl !== null) {
$updates[] = 'video_url = ?';
$params[] = $videoUrl;
}
if ($lyrics !== null) {
$updates[] = 'lyrics = ?';
$params[] = $lyrics;
}
if ($metadata !== null) {
$updates[] = 'metadata = ?';
$params[] = $metadata;
}
if ($duration !== null) {
$updates[] = 'duration = ?';
$params[] = $duration;
}
// Update individual metadata fields
if (isset($metadataArray['audio_quality'])) {
$updates[] = 'audio_quality = ?';
$params[] = json_encode($metadataArray['audio_quality']);
}
if (isset($metadataArray['generation_parameters'])) {
$updates[] = 'generation_parameters = ?';
$params[] = json_encode($metadataArray['generation_parameters']);
}
if (isset($metadataArray['processing_info'])) {
$updates[] = 'processing_info = ?';
$params[] = json_encode($metadataArray['processing_info']);
}
if (isset($metadataArray['cost_info'])) {
$updates[] = 'cost_info = ?';
$params[] = json_encode($metadataArray['cost_info']);
}
if (isset($metadataArray['waveform_data'])) {
$updates[] = 'waveform_data = ?';
$params[] = json_encode($metadataArray['waveform_data']);
}
if (isset($metadataArray['spectrum_analysis'])) {
$updates[] = 'spectrum_analysis = ?';
$params[] = json_encode($metadataArray['spectrum_analysis']);
}
if (isset($metadataArray['audio_segments'])) {
$updates[] = 'audio_segments = ?';
$params[] = json_encode($metadataArray['audio_segments']);
}
if (isset($metadataArray['error_details'])) {
$updates[] = 'error_details = ?';
$params[] = json_encode($metadataArray['error_details']);
}
if (isset($metadataArray['audio_analysis'])) {
$updates[] = 'audio_analysis = ?';
$params[] = json_encode($metadataArray['audio_analysis']);
}
if (isset($metadataArray['system_info'])) {
$updates[] = 'system_info = ?';
$params[] = json_encode($metadataArray['system_info']);
}
$params[] = $taskId;
$sql = "UPDATE music_tracks SET " . implode(', ', $updates) . " WHERE task_id = ?";
$stmt = $pdo->prepare($sql);
return $stmt->execute($params);
} catch (PDOException $e) {
error_log("Update music track failed: " . $e->getMessage());
return false;
}
}
function getUserMusicTracks($userId, $limit = 50) {
$pdo = getDBConnection();
if (!$pdo) return [];
try {
$stmt = $pdo->prepare("
SELECT * FROM music_tracks
WHERE user_id = ?
ORDER BY created_at DESC
LIMIT ?
");
$stmt->execute([$userId, $limit]);
return $stmt->fetchAll();
} catch (PDOException $e) {
error_log("Get user music tracks failed: " . $e->getMessage());
return [];
}
}
function getMusicTrackByTaskId($taskId) {
$pdo = getDBConnection();
if (!$pdo) return false;
try {
$stmt = $pdo->prepare("SELECT * FROM music_tracks WHERE task_id = ?");
$stmt->execute([$taskId]);
return $stmt->fetch();
} catch (PDOException $e) {
error_log("Get music track failed: " . $e->getMessage());
return false;
}
}
// Database initialization is handled separately to avoid output issues
// Initialize database tables if not already done
if (!function_exists('databaseInitialized')) {
function databaseInitialized() {
return true;
}
initializeDatabase();
}
// Function to optimize database performance (can be called from any page)
function optimizeDatabasePerformance() {
$pdo = getDBConnection();
if (!$pdo) return false;
try {
// Create performance indexes if they don't exist
$indexes = [
"CREATE INDEX IF NOT EXISTS idx_music_tracks_user_status ON music_tracks(user_id, status)",
"CREATE INDEX IF NOT EXISTS idx_music_tracks_created_at ON music_tracks(created_at)",
"CREATE INDEX IF NOT EXISTS idx_music_tracks_status ON music_tracks(status)",
"CREATE INDEX IF NOT EXISTS idx_music_tracks_task_id ON music_tracks(task_id)",
"CREATE INDEX IF NOT EXISTS idx_user_follows_follower ON user_follows(follower_id)",
"CREATE INDEX IF NOT EXISTS idx_user_follows_following ON user_follows(following_id)",
"CREATE INDEX IF NOT EXISTS idx_audio_variations_track ON audio_variations(track_id)",
"CREATE INDEX IF NOT EXISTS idx_track_likes_track ON track_likes(track_id)",
"CREATE INDEX IF NOT EXISTS idx_track_plays_track ON track_plays(track_id)",
"CREATE INDEX IF NOT EXISTS idx_credit_transactions_user ON credit_transactions(user_id, created_at)",
"CREATE INDEX IF NOT EXISTS idx_email_logs_sent_at ON email_logs(sent_at)",
"CREATE INDEX IF NOT EXISTS idx_email_logs_user ON email_logs(user_id)",
"CREATE INDEX IF NOT EXISTS idx_security_events_type ON security_events(event_type, created_at)",
"CREATE INDEX IF NOT EXISTS idx_security_events_user ON security_events(user_id)",
"CREATE INDEX IF NOT EXISTS idx_user_login_history_user ON user_login_history(user_id, created_at)",
"CREATE INDEX IF NOT EXISTS idx_user_login_history_ip ON user_login_history(ip_address)"
];
foreach ($indexes as $index_sql) {
try {
$pdo->exec($index_sql);
} catch (Exception $e) {
// Index might already exist, continue
}
}
return true;
} catch (Exception $e) {
error_log("Database optimization failed: " . $e->getMessage());
return false;
}
}
// Cache cleanup disabled during development
function cleanupCache() {
// Cache cleanup disabled to prevent issues during development
return 0;
}