begin_transaction(); sqlsave_execute_prepared( $db, 'INSERT INTO sqlsave_crafting_inventory (user_id, schema_version, user_updated_at, payload_json, payload_hash) VALUES (?, ?, ?, ?, ?) ON DUPLICATE KEY UPDATE schema_version = VALUES(schema_version), user_updated_at = VALUES(user_updated_at), payload_json = VALUES(payload_json), payload_hash = VALUES(payload_hash), updated_at = CURRENT_TIMESTAMP', [$userId, $inventorySchemaVersion, $inventoryUserUpdatedAt, $inventoryJson, $inventoryHash] ); sqlsave_execute_prepared( $db, 'INSERT INTO sqlsave_crafting_equipped_monsters (user_id, schema_version, slot_count, user_updated_at, payload_json, payload_hash) VALUES (?, ?, ?, ?, ?, ?) ON DUPLICATE KEY UPDATE schema_version = VALUES(schema_version), slot_count = VALUES(slot_count), user_updated_at = VALUES(user_updated_at), payload_json = VALUES(payload_json), payload_hash = VALUES(payload_hash), updated_at = CURRENT_TIMESTAMP', [$userId, $equippedSchemaVersion, $equippedSlotCount, $equippedUserUpdatedAt, $equippedJson, $equippedHash] ); $db->commit(); sqlsave_ok('crafting_sqlsave_save', [ 'user_id' => $userId, 'inventory' => [ 'schema_version' => $inventorySchemaVersion, 'user_updated_at' => $inventoryUserUpdatedAt, 'payload_hash' => $inventoryHash, ], 'equipped_monsters' => [ 'schema_version' => $equippedSchemaVersion, 'slot_count' => $equippedSlotCount, 'user_updated_at' => $equippedUserUpdatedAt, 'payload_hash' => $equippedHash, ], ]); } catch (InvalidArgumentException $e) { if (isset($db) && $db instanceof mysqli) { $db->rollback(); } sqlsave_fail('crafting_sqlsave_save', 'invalid_request', $e->getMessage(), 400); } catch (mysqli_sql_exception $e) { if (isset($db) && $db instanceof mysqli) { $db->rollback(); } sqlsave_fail('crafting_sqlsave_save', 'database_error', $e->getMessage(), 500); } catch (Throwable $e) { if (isset($db) && $db instanceof mysqli) { $db->rollback(); } sqlsave_fail('crafting_sqlsave_save', 'internal_error', $e->getMessage(), 500); }