92 lines
2.4 KiB
JavaScript
92 lines
2.4 KiB
JavaScript
const { db } = require('../database');
|
|
const sql = require('mssql');
|
|
|
|
let cachedConfig = null;
|
|
let lastConfigLoad = 0;
|
|
let pool = null;
|
|
|
|
async function loadConfig() {
|
|
return new Promise((resolve, reject) => {
|
|
db.get('SELECT server, database, username, password FROM mssql_config WHERE id = 1', (err, row) => {
|
|
if (err) {
|
|
return reject(new Error('Fehler beim Lesen der MSSQL-Konfiguration: ' + err.message));
|
|
}
|
|
resolve(row || null);
|
|
});
|
|
});
|
|
}
|
|
|
|
async function getMssqlPool() {
|
|
const now = Date.now();
|
|
if (!cachedConfig || now - lastConfigLoad > 60 * 1000) {
|
|
cachedConfig = await loadConfig();
|
|
lastConfigLoad = now;
|
|
}
|
|
|
|
if (!cachedConfig || !cachedConfig.server || !cachedConfig.database || !cachedConfig.username || !cachedConfig.password) {
|
|
throw new Error('MSSQL-Konfiguration ist unvollständig. Bitte im Adminbereich konfigurieren.');
|
|
}
|
|
|
|
if (pool && pool.connected) {
|
|
return pool;
|
|
}
|
|
|
|
const config = {
|
|
server: cachedConfig.server,
|
|
database: cachedConfig.database,
|
|
user: cachedConfig.username,
|
|
password: cachedConfig.password,
|
|
options: {
|
|
encrypt: false,
|
|
trustServerCertificate: true
|
|
}
|
|
};
|
|
|
|
pool = await sql.connect(config);
|
|
return pool;
|
|
}
|
|
|
|
async function searchProjectsByDescription(searchTerm) {
|
|
const pool = await getMssqlPool();
|
|
const request = pool.request();
|
|
request.input('search', sql.NVarChar, `%${searchTerm}%`);
|
|
|
|
// Datenbankname aus Konfiguration verwenden
|
|
const dbName = cachedConfig && cachedConfig.database ? cachedConfig.database : null;
|
|
if (!dbName) {
|
|
throw new Error('MSSQL-Datenbankname ist nicht konfiguriert.');
|
|
}
|
|
|
|
const query = `
|
|
SELECT TOP 50
|
|
kk.Auftrag AS auftrag,
|
|
kk.Proj AS proj,
|
|
kk.Such AS such,
|
|
kk.Knd AS knd,
|
|
k.Bez AS bez
|
|
FROM [${dbName}].dbo.KKOPF kk
|
|
LEFT JOIN [${dbName}].dbo.KUNDE k ON kk.Knd = k.Knd
|
|
WHERE kk.Proj LIKE @search
|
|
OR kk.Auftrag LIKE @search
|
|
OR kk.Such LIKE @search
|
|
OR k.Bez LIKE @search
|
|
ORDER BY kk.ErfTerm DESC
|
|
`;
|
|
|
|
const result = await request.query(query);
|
|
return result.recordset || [];
|
|
}
|
|
|
|
async function testMssqlConnection() {
|
|
const pool = await getMssqlPool();
|
|
await pool.request().query('SELECT TOP 1 1 AS ok');
|
|
return true;
|
|
}
|
|
|
|
module.exports = {
|
|
getMssqlPool,
|
|
searchProjectsByDescription,
|
|
testMssqlConnection
|
|
};
|
|
|