fix: Handle nil vlan_id in MAC address upsert queries
Fixes ArgumentError when upserting MAC addresses with nil vlan_id. Ecto doesn't allow direct comparison with nil in queries - must use is_nil/1 instead. Changed upsert_mac_address to build dynamic query that uses is_nil(m.vlan_id) when vlan_id is nil, or direct comparison when it has a value. Error was: Comparison with nil is forbidden as it is unsafe. Instead write a query with is_nil/1
This commit is contained in:
parent
26e5d20510
commit
c6ec9ab891
1 changed files with 16 additions and 5 deletions
|
|
@ -1563,11 +1563,22 @@ defmodule Towerops.Snmp do
|
|||
Creates or updates a MAC address entry.
|
||||
"""
|
||||
def upsert_mac_address(attrs) do
|
||||
case Repo.get_by(MacAddress,
|
||||
device_id: attrs.device_id,
|
||||
mac_address: attrs.mac_address,
|
||||
vlan_id: attrs[:vlan_id]
|
||||
) do
|
||||
import Ecto.Query
|
||||
|
||||
# Build query to find existing MAC address entry
|
||||
query =
|
||||
from m in MacAddress,
|
||||
where: m.device_id == ^attrs.device_id,
|
||||
where: m.mac_address == ^attrs.mac_address
|
||||
|
||||
# Handle vlan_id comparison (nil requires is_nil/1)
|
||||
query =
|
||||
case attrs[:vlan_id] do
|
||||
nil -> where(query, [m], is_nil(m.vlan_id))
|
||||
vlan_id -> where(query, [m], m.vlan_id == ^vlan_id)
|
||||
end
|
||||
|
||||
case Repo.one(query) do
|
||||
nil ->
|
||||
%MacAddress{}
|
||||
|> MacAddress.changeset(attrs)
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue