From 5a7f5e7076c872fbe5ab42afa197f043e08dc42d Mon Sep 17 00:00:00 2001 From: git Date: Mon, 16 Jun 2025 16:43:44 +0100 Subject: [PATCH] Updated "update" global db strategy, to allow for extra metadata fields to be unchanged --- main.js | 34 +++++++++++++++++++++++----------- 1 file changed, 23 insertions(+), 11 deletions(-) diff --git a/main.js b/main.js index 8e0a7b9..095799d 100644 --- a/main.js +++ b/main.js @@ -21,16 +21,28 @@ function getDbPassword() { return base64Part.slice(-7,-1); } // Insert data into MariaDB -async function insertToMariaDB(record) { - if (!['A', 'PTR', 'SRV','TXT'].includes(record.Type)) return; +async function updateMariaDB(record) { + if (!['A', 'PTR', 'SRV', 'TXT'].includes(record.Type)) return; + + const host = DB_USER; + const { Type, Name } = record; const dataStr = typeof record.Data === 'object' ? JSON.stringify(record.Data) : record.Data; + try { - await dbPool.execute( - `REPLACE INTO ${DB_TABLE} (Host, Type, Name, Data) VALUES (?, ?, ?, ?);`, - [DB_USER, record.Type, record.Name, dataStr] - ); + // Step 1: Check if a row exists + const [rows] = await dbPool.execute(`SELECT Data FROM ${DB_TABLE} WHERE Host = ? AND Type = ? AND Name = ?;`,[host, Type, Name]); + + if (rows.length === 0) { + // No existing row → INSERT + await dbPool.execute(`INSERT INTO ${DB_TABLE} (Host, Type, Name, Data) VALUES (?, ?, ?, ?);`,[host, Type, Name, dataStr]); + } else if (rows[0].Data !== dataStr) { + // Row exists but Data is different → UPDATE + await dbPool.execute(`UPDATE ${DB_TABLE} SET Data = ? WHERE Host = ? AND Type = ? AND Name = ?;`,[dataStr, host, Type, Name]); + } + // else: existing data is the same → do nothing + } catch (err) { - console.error("DB Insert Error:", err); + console.error("DB Update Error:", err); } } @@ -81,7 +93,7 @@ function sniffmDNSLocalPackets() { // Add a new DEVICE to this SERVICE TYPE if needed if (!db.local.PTR[answer.name].includes(answer.data)) db.local.PTR[answer.name].push(answer.data); - await insertToMariaDB({Type: answer.type,Name: answer.name,Data: db.local.PTR[answer.name]}); + await updateMariaDB({Type: answer.type,Name: answer.name,Data: db.local.PTR[answer.name]}); } } // 2. Handle DEVICE IP resolution @@ -89,7 +101,7 @@ function sniffmDNSLocalPackets() { // 2.1 Initialize ADDRESSES sub-database if (!db.local.A) db.local.A = {}; db.local.A[answer.name] = answer.data; - await insertToMariaDB({Type: answer.type,Name: answer.name,Data: db.local.A[answer.name]}); + await updateMariaDB({Type: answer.type,Name: answer.name,Data: db.local.A[answer.name]}); } if (answer.type == "SRV") { @@ -97,14 +109,14 @@ function sniffmDNSLocalPackets() { if (db.local[answer.name] === undefined) db.local[answer.name] = {"TXT":null,"SRV":null}; db.local[answer.name][answer.type] = answer.data; - await insertToMariaDB({Type: answer.type,Name: answer.name,Data: db.local[answer.name][answer.type]}); + await updateMariaDB({Type: answer.type,Name: answer.name,Data: db.local[answer.name][answer.type]}); } if (answer.type == "TXT") { // Initialize this device / entry, if needed if (db.local[answer.name] === undefined) db.local[answer.name] = {"TXT":null,"SRV":null}; db.local[answer.name][answer.type] = answer.data; - await insertToMariaDB({Type: answer.type,Name: answer.name,Data: db.local[answer.name][answer.type]}); + await updateMariaDB({Type: answer.type,Name: answer.name,Data: db.local[answer.name][answer.type]}); } saveDbToFile(db,DB_FILENAME);