Compare commits

..

2 Commits

Author SHA1 Message Date
afd896161e commit 05/02/2026 2026-02-05 16:51:03 +07:00
4a6df6bef4 commit 05/02/2026 2026-02-05 16:20:40 +07:00
12 changed files with 663 additions and 433 deletions

View File

@@ -17,5 +17,6 @@
<option name="processComments" value="true" /> <option name="processComments" value="true" />
</inspection_tool> </inspection_tool>
<inspection_tool class="SqlDialectInspection" enabled="false" level="WARNING" enabled_by_default="false" /> <inspection_tool class="SqlDialectInspection" enabled="false" level="WARNING" enabled_by_default="false" />
<inspection_tool class="SqlSourceToSinkFlow" enabled="false" level="WARNING" enabled_by_default="false" />
</profile> </profile>
</component> </component>

View File

@@ -16,16 +16,20 @@ function load_log_data(datevalue){
data.forEach(function(item, index){ data.forEach(function(item, index){
tblog.row.add({ tblog.row.add({
index: index + 1, index: index + 1,
date: item.datenya, date: item.date,
time: item.timenya, time: item.time,
source: item.machine, source: item.source,
message: item.description description: item.description
}) });
}); });
tblog.draw(); tblog.draw();
} else {
console.log("No log data found for date:", datevalue);
alert("No log data found for the selected date.");
} }
},function(error){ },function(error){
console.error("Error fetching log data:", error); console.error("Error fetching log data:", error);
alert("Error fetching log data : " + error.message);
}); });
} }
@@ -37,7 +41,7 @@ $(document).ready(function () {
{title: 'Date', data: 'date'}, {title: 'Date', data: 'date'},
{title: 'Time', data: 'time'}, {title: 'Time', data: 'time'},
{title: 'Source', data: 'source'}, {title: 'Source', data: 'source'},
{title: 'Message', data: 'message'} {title: 'Description', data: 'description'}
], ],
pageLength: 25, pageLength: 25,
data: [], data: [],

View File

@@ -65,29 +65,7 @@
<th class="class50 wrap" data-sortable="true">Description</th> <th class="class50 wrap" data-sortable="true">Description</th>
</tr> </tr>
</thead> </thead>
<tbody class="w-100 table-fixed" id="tbodylog"> <tbody class="w-100 table-fixed" id="tbodylog"></tbody>
<tr>
<td>999999</td>
<td>13-OKT-25</td>
<td>24:10:10</td>
<td><strong>1.Lorem Ipsum</strong>&nbsp;is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged.&nbsp;<br><br></td>
<td><strong><span style="color: rgb(0, 0, 0);">2.Lorem Ipsum</span></strong><span style="color: rgb(0, 0, 0);">&nbsp;is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged.&nbsp;</span></td>
</tr>
<tr>
<td>2222</td>
<td>13-OKT-25<br><strong>Lorem Ipsum</strong>&nbsp;is simply dummy text of the printing and typesetting industry.<br><br><br></td>
<td>24:10:10</td>
<td><strong>2.Lorem Ipsum</strong>&nbsp;is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged.&nbsp;</td>
<td><strong>2.Lorem Ipsum</strong>&nbsp;is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged.&nbsp;</td>
</tr>
<tr>
<td>33333</td>
<td>13-OKT-25<br><strong>Lorem Ipsum</strong>&nbsp;is simply dummy text of the printing and typesetting industry.<br><br></td>
<td>Text</td>
<td><strong>3.Lorem Ipsum</strong>&nbsp;is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged.&nbsp;</td>
<td><strong>3. Lorem Ipsum</strong>&nbsp;is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged.&nbsp;</td>
</tr>
</tbody>
</table> </table>
</div> </div>
</div> </div>

View File

@@ -210,6 +210,7 @@ function get_pagingresult_files() {
player.pause(); player.pause();
window.URL.revokeObjectURL(player.src); window.URL.revokeObjectURL(player.src);
} }
$icon.removeClass("fa-stop").addClass("fa-play");
} else { } else {
// start playback // start playback
play("PlayPagingResultFile", filename, () => { play("PlayPagingResultFile", filename, () => {
@@ -221,8 +222,9 @@ function get_pagingresult_files() {
} }
window.lastplaybutton = $(this); window.lastplaybutton = $(this);
}); });
$icon.removeClass("fa-play").addClass("fa-stop");
} }
$icon.toggleClass("fa-play fa-stop"); //$icon.toggleClass("fa-play fa-stop");
}); });
let $tdbutton = $("<td></td>").append($btndownload).append($btnplay).addClass("text-center"); let $tdbutton = $("<td></td>").append($btndownload).append($btnplay).addClass("text-center");
@@ -262,6 +264,7 @@ function get_soundbankresult_files() {
player.pause(); player.pause();
window.URL.revokeObjectURL(player.src); window.URL.revokeObjectURL(player.src);
} }
$icon.removeClass("fa-stop").addClass("fa-play");
} else { } else {
// start playback // start playback
play("PlaySoundbankResultFile", filename, () => { play("PlaySoundbankResultFile", filename, () => {
@@ -273,8 +276,9 @@ function get_soundbankresult_files() {
} }
window.lastplaybutton = $(this); window.lastplaybutton = $(this);
}); });
$icon.removeClass("fa-play").addClass("fa-stop");
} }
$icon.toggleClass("fa-play fa-stop"); //$icon.toggleClass("fa-play fa-stop");
}); });
$tr.append($tdtitle); $tr.append($tdtitle);
$tr.append($tdbutton); $tr.append($tdbutton);

View File

@@ -280,14 +280,14 @@ fun main(args: Array<String>) {
} }
} }
db.Add_Log("AAS"," Application started")
db.logDB.Add("AAS"," Application started")
// shutdown hook // shutdown hook
Runtime.getRuntime().addShutdownHook(Thread ({ Runtime.getRuntime().addShutdownHook(Thread ({
db.Add_Log("AAS"," Application stopping") db.logDB.Add("AAS"," Application stopping")
Logger.info { "Shutdown hook called, stopping services..." } Logger.info { "Shutdown hook called, stopping services..." }
barixserver.StopTcpCommand() barixserver.StopTcpCommand()
androidserver.StopTcpCommand() androidserver.StopTcpCommand()

View File

@@ -583,16 +583,16 @@ class MainExtension01 {
StreamerOutputs[ip]?.SendData(afi.bytes, StreamerOutputs[ip]?.SendData(afi.bytes,
{ {
Deactivate_Relays(zz) Deactivate_Relays(zz)
db.Add_Log("AAS", it) }, db.logDB.Add("AAS", it) },
{ {
Deactivate_Relays(zz) Deactivate_Relays(zz)
db.Add_Log("AAS", it) }) db.logDB.Add("AAS", it) })
} }
val logmessage = val logmessage =
"Broadcast started PAGING with Filename '${qp.Message}' to zones: ${qp.BroadcastZones}" "Broadcast started PAGING with Filename '${qp.Message}' to zones: ${qp.BroadcastZones}"
Logger.info { logmessage } Logger.info { logmessage }
db.Add_Log("AAS", logmessage) db.logDB.Add("AAS", logmessage)
db.queuepagingDB.DeleteByIndex(qp.index.toInt()) db.queuepagingDB.DeleteByIndex(qp.index.toInt())
db.queuepagingDB.Resort() db.queuepagingDB.Resort()
return true return true
@@ -600,7 +600,7 @@ class MainExtension01 {
// file tidak valid, delete from queue paging // file tidak valid, delete from queue paging
db.queuepagingDB.DeleteByIndex(qp.index.toInt()) db.queuepagingDB.DeleteByIndex(qp.index.toInt())
db.queuepagingDB.Resort() db.queuepagingDB.Resort()
db.Add_Log( db.logDB.Add(
"AAS", "AAS",
"Cancelled paging message $qp due to invalid audio file" "Cancelled paging message $qp due to invalid audio file"
) )
@@ -611,14 +611,14 @@ class MainExtension01 {
// ada broadcast zone yang tidak valid, delete from queue paging // ada broadcast zone yang tidak valid, delete from queue paging
db.queuepagingDB.DeleteByIndex(qp.index.toInt()) db.queuepagingDB.DeleteByIndex(qp.index.toInt())
db.queuepagingDB.Resort() db.queuepagingDB.Resort()
db.Add_Log("AAS", "Cancelled paging message $qp due to invalid broadcast zone") db.logDB.Add("AAS", "Cancelled paging message $qp due to invalid broadcast zone")
Logger.error { "Cancelled paging message $qp due to invalid broadcast zone" } Logger.error { "Cancelled paging message $qp due to invalid broadcast zone" }
} }
} else { } else {
// file tidak valid, delete from queue paging // file tidak valid, delete from queue paging
db.queuepagingDB.DeleteByIndex(qp.index.toInt()) db.queuepagingDB.DeleteByIndex(qp.index.toInt())
db.queuepagingDB.Resort() db.queuepagingDB.Resort()
db.Add_Log( db.logDB.Add(
"AAS", "AAS",
"Cancelled paging message $qp due to invalid audio file" "Cancelled paging message $qp due to invalid audio file"
) )
@@ -628,7 +628,7 @@ class MainExtension01 {
// invalid broadcast zone, delete from queue paging // invalid broadcast zone, delete from queue paging
db.queuepagingDB.DeleteByIndex(qp.index.toInt()) db.queuepagingDB.DeleteByIndex(qp.index.toInt())
db.queuepagingDB.Resort() db.queuepagingDB.Resort()
db.Add_Log("AAS", "Cancelled paging message $qp due to empty broadcast zone") db.logDB.Add("AAS", "Cancelled paging message $qp due to empty broadcast zone")
Logger.error { "Cancelled paging message $qp due to empty broadcast zone" } Logger.error { "Cancelled paging message $qp due to empty broadcast zone" }
} }
} }
@@ -677,7 +677,7 @@ class MainExtension01 {
listafi, listafi,
targetfile, true, targetfile, true,
) )
db.Add_Log("AAS", result.message) db.logDB.Add("AAS", result.message)
if (result.success) { if (result.success) {
// file siap broadcast // file siap broadcast
val targetafi = audioPlayer.LoadAudioFile(targetfile) val targetafi = audioPlayer.LoadAudioFile(targetfile)
@@ -689,21 +689,21 @@ class MainExtension01 {
StreamerOutputs[ip]?.SendData(targetafi.bytes, StreamerOutputs[ip]?.SendData(targetafi.bytes,
{ {
Deactivate_Relays(zz) Deactivate_Relays(zz)
db.Add_Log("AAS", it) }, db.logDB.Add("AAS", it) },
{ {
Deactivate_Relays(zz) Deactivate_Relays(zz)
db.Add_Log("AAS", it) }) db.logDB.Add("AAS", it) })
} }
val logmsg = val logmsg =
"Broadcast started SHALAT message with generated file '$targetfile' to zones: ${qp.BroadcastZones}" "Broadcast started SHALAT message with generated file '$targetfile' to zones: ${qp.BroadcastZones}"
Logger.info { logmsg } Logger.info { logmsg }
db.Add_Log("AAS", logmsg) db.logDB.Add("AAS", logmsg)
db.queuepagingDB.DeleteByIndex(qp.index.toInt()) db.queuepagingDB.DeleteByIndex(qp.index.toInt())
db.queuepagingDB.Resort() db.queuepagingDB.Resort()
return true return true
} else { } else {
db.Add_Log( db.logDB.Add(
"AAS", "AAS",
"Failed to load generated Shalat WAV file $targetfile" "Failed to load generated Shalat WAV file $targetfile"
) )
@@ -712,7 +712,7 @@ class MainExtension01 {
} else{ } else{
db.queuepagingDB.DeleteByIndex(qp.index.toInt()) db.queuepagingDB.DeleteByIndex(qp.index.toInt())
db.queuepagingDB.Resort() db.queuepagingDB.Resort()
db.Add_Log("AAS", result.message) db.logDB.Add("AAS", result.message)
} }
} }
@@ -721,7 +721,7 @@ class MainExtension01 {
// tidak ada messagebank dengan ann_id ini, delete from queue paging // tidak ada messagebank dengan ann_id ini, delete from queue paging
db.queuepagingDB.DeleteByIndex(qp.index.toInt()) db.queuepagingDB.DeleteByIndex(qp.index.toInt())
db.queuepagingDB.Resort() db.queuepagingDB.Resort()
db.Add_Log( db.logDB.Add(
"AAS", "AAS",
"Cancelled Shalat message $qp due to ANN_ID $ann_id not found in Messagebank" "Cancelled Shalat message $qp due to ANN_ID $ann_id not found in Messagebank"
) )
@@ -733,21 +733,21 @@ class MainExtension01 {
// invalid ann_id, delete from queue paging // invalid ann_id, delete from queue paging
db.queuepagingDB.DeleteByIndex(qp.index.toInt()) db.queuepagingDB.DeleteByIndex(qp.index.toInt())
db.queuepagingDB.Resort() db.queuepagingDB.Resort()
db.Add_Log("AAS", "Cancelled shalat message $qp due to invalid ANN_ID") db.logDB.Add("AAS", "Cancelled shalat message $qp due to invalid ANN_ID")
Logger.error { "Cancelled shalat message $qp due to invalid ANN_ID" } Logger.error { "Cancelled shalat message $qp due to invalid ANN_ID" }
} }
} else { } else {
// ada broadcast zone yang tidak valid, delete from queue paging // ada broadcast zone yang tidak valid, delete from queue paging
db.queuepagingDB.DeleteByIndex(qp.index.toInt()) db.queuepagingDB.DeleteByIndex(qp.index.toInt())
db.queuepagingDB.Resort() db.queuepagingDB.Resort()
db.Add_Log("AAS", "Cancelled shalat message $qp due to invalid broadcast zone") db.logDB.Add("AAS", "Cancelled shalat message $qp due to invalid broadcast zone")
Logger.error { "Cancelled shalat message $qp due to invalid broadcast zone" } Logger.error { "Cancelled shalat message $qp due to invalid broadcast zone" }
} }
} else { } else {
// invalid broadcast zone, delete from queue paging // invalid broadcast zone, delete from queue paging
db.queuepagingDB.DeleteByIndex(qp.index.toInt()) db.queuepagingDB.DeleteByIndex(qp.index.toInt())
db.queuepagingDB.Resort() db.queuepagingDB.Resort()
db.Add_Log("AAS", "Cancelled shalat message $qp due to empty broadcast zone") db.logDB.Add("AAS", "Cancelled shalat message $qp due to empty broadcast zone")
Logger.error { "Cancelled shalat message $qp due to empty broadcast zone" } Logger.error { "Cancelled shalat message $qp due to empty broadcast zone" }
} }
} }
@@ -788,7 +788,7 @@ class MainExtension01 {
} }
val targetfile = SoundbankResult_directory.resolve(Make_WAV_FileName("Timer","")).toString() val targetfile = SoundbankResult_directory.resolve(Make_WAV_FileName("Timer","")).toString()
val result = audioPlayer.WavWriter(listafi, targetfile, true) val result = audioPlayer.WavWriter(listafi, targetfile, true)
db.Add_Log("AAS", result.message) db.logDB.Add("AAS", result.message)
if (result.success){ if (result.success){
// file siap broadcast // file siap broadcast
val targetafi = audioPlayer.LoadAudioFile(targetfile) val targetafi = audioPlayer.LoadAudioFile(targetfile)
@@ -800,16 +800,16 @@ class MainExtension01 {
StreamerOutputs[ip]?.SendData(targetafi.bytes, StreamerOutputs[ip]?.SendData(targetafi.bytes,
{ {
Deactivate_Relays(zz) Deactivate_Relays(zz)
db.Add_Log("AAS", it) }, db.logDB.Add("AAS", it) },
{ {
Deactivate_Relays(zz) Deactivate_Relays(zz)
db.Add_Log("AAS", it) }) db.logDB.Add("AAS", it) })
} }
val logmsg = val logmsg =
"Broadcast started TIMER message with generated file '$targetfile' to zones: ${qa.BroadcastZones}" "Broadcast started TIMER message with generated file '$targetfile' to zones: ${qa.BroadcastZones}"
Logger.info { logmsg } Logger.info { logmsg }
db.Add_Log("AAS", logmsg) db.logDB.Add("AAS", logmsg)
db.queuetableDB.DeleteByIndex(qa.index.toInt()) db.queuetableDB.DeleteByIndex(qa.index.toInt())
db.queuetableDB.Resort() db.queuetableDB.Resort()
return true return true
@@ -817,12 +817,12 @@ class MainExtension01 {
} else{ } else{
db.queuetableDB.DeleteByIndex(qa.index.toInt()) db.queuetableDB.DeleteByIndex(qa.index.toInt())
db.queuetableDB.Resort() db.queuetableDB.Resort()
db.Add_Log("AAS", result.message) db.logDB.Add("AAS", result.message)
} }
} else { } else {
db.queuetableDB.DeleteByIndex(qa.index.toInt()) db.queuetableDB.DeleteByIndex(qa.index.toInt())
db.queuetableDB.Resort() db.queuetableDB.Resort()
db.Add_Log("AAS", result.message) db.logDB.Add("AAS", result.message)
} }
} }
@@ -830,7 +830,7 @@ class MainExtension01 {
// tidak ada messagebank dengan ann_id ini, delete from queue table // tidak ada messagebank dengan ann_id ini, delete from queue table
db.queuetableDB.DeleteByIndex(qa.index.toInt()) db.queuetableDB.DeleteByIndex(qa.index.toInt())
db.queuetableDB.Resort() db.queuetableDB.Resort()
db.Add_Log( db.logDB.Add(
"AAS", "AAS",
"Cancelled TIMER $qa due to ANN_ID $ann_id not found in Messagebank" "Cancelled TIMER $qa due to ANN_ID $ann_id not found in Messagebank"
) )
@@ -842,21 +842,21 @@ class MainExtension01 {
// invalid ann_id, delete from queue table // invalid ann_id, delete from queue table
db.queuetableDB.DeleteByIndex(qa.index.toInt()) db.queuetableDB.DeleteByIndex(qa.index.toInt())
db.queuetableDB.Resort() db.queuetableDB.Resort()
db.Add_Log("AAS", "Cancelled TIMER message $qa due to invalid ANN_ID") db.logDB.Add("AAS", "Cancelled TIMER message $qa due to invalid ANN_ID")
Logger.error { "Cancelled TIMER message $qa due to invalid ANN_ID" } Logger.error { "Cancelled TIMER message $qa due to invalid ANN_ID" }
} }
} else { } else {
// ada broadcast zone yang tidak valid, delete from queue table // ada broadcast zone yang tidak valid, delete from queue table
db.queuetableDB.DeleteByIndex(qa.index.toInt()) db.queuetableDB.DeleteByIndex(qa.index.toInt())
db.queuetableDB.Resort() db.queuetableDB.Resort()
db.Add_Log("AAS", "Cancelled TIMER message $qa due to invalid broadcast zone") db.logDB.Add("AAS", "Cancelled TIMER message $qa due to invalid broadcast zone")
Logger.error {"Cancelled TIMER message $qa due to invalid broadcast zone"} Logger.error {"Cancelled TIMER message $qa due to invalid broadcast zone"}
} }
} else { } else {
// invalid broadcast zone, delete from queue table // invalid broadcast zone, delete from queue table
db.queuetableDB.DeleteByIndex(qa.index.toInt()) db.queuetableDB.DeleteByIndex(qa.index.toInt())
db.queuetableDB.Resort() db.queuetableDB.Resort()
db.Add_Log("AAS", "Cancelled TIMER message $qa due to empty broadcast zone") db.logDB.Add("AAS", "Cancelled TIMER message $qa due to empty broadcast zone")
Logger.error { "Cancelled TIMER message $qa due to empty broadcast zone" } Logger.error { "Cancelled TIMER message $qa due to empty broadcast zone" }
} }
} }
@@ -922,7 +922,7 @@ class MainExtension01 {
// not available from variables, try to get from Message column // not available from variables, try to get from Message column
// ada ini, karena protokol FIS dulu tidak ada ANN_ID tapi pake Remark // ada ini, karena protokol FIS dulu tidak ada ANN_ID tapi pake Remark
val remark = variables?.get("REMARK").orEmpty() val remark = variables?.get("REMARK").orEmpty()
db.Add_Log("AAS", "Trying to get ANN_ID from REMARK field: $remark") db.logDB.Add("AAS", "Trying to get ANN_ID from REMARK field: $remark")
Logger.info{ "Trying to get ANN_ID from REMARK field: $remark" } Logger.info{ "Trying to get ANN_ID from REMARK field: $remark" }
when(remark){ when(remark){
"GOP" -> { "GOP" -> {
@@ -947,15 +947,15 @@ class MainExtension01 {
} }
} }
Logger.info{"Found ANN_ID from REMARK field: $ann_id" } Logger.info{"Found ANN_ID from REMARK field: $ann_id" }
db.Add_Log("AAS", "Found ANN_ID from REMARK field: $ann_id") db.logDB.Add("AAS", "Found ANN_ID from REMARK field: $ann_id")
} else { } else {
db.Add_Log("AAS", "Found ANN_ID from SB_TAGS variables: $ann_id") db.logDB.Add("AAS", "Found ANN_ID from SB_TAGS variables: $ann_id")
Logger.info{ "Found ANN_ID from SB_TAGS variables: $ann_id" } Logger.info{ "Found ANN_ID from SB_TAGS variables: $ann_id" }
} }
// recheck again // recheck again
if (ann_id == 0) { if (ann_id == 0) {
db.Add_Log( db.logDB.Add(
"AAS", "AAS",
"Cancelled SOUNDBANK message $qa due to missing or invalid ANN_ID in SB_TAGS" "Cancelled SOUNDBANK message $qa due to missing or invalid ANN_ID in SB_TAGS"
) )
@@ -986,7 +986,7 @@ class MainExtension01 {
} }
} else { } else {
db.Add_Log("AAS", result.message) db.logDB.Add("AAS", result.message)
db.queuetableDB.DeleteByIndex(qa.index.toInt()) db.queuetableDB.DeleteByIndex(qa.index.toInt())
db.queuetableDB.Resort() db.queuetableDB.Resort()
} }
@@ -1014,25 +1014,25 @@ class MainExtension01 {
StreamerOutputs[ip]?.SendData(targetafi.bytes, StreamerOutputs[ip]?.SendData(targetafi.bytes,
{ {
Deactivate_Relays(zz) Deactivate_Relays(zz)
db.Add_Log("AAS", it) db.logDB.Add("AAS", it)
}, { }, {
Deactivate_Relays(zz) Deactivate_Relays(zz)
db.Add_Log("AAS", it) db.logDB.Add("AAS", it)
}) })
} }
val logmsg = val logmsg =
"Broadcast started SOUNDBANK message with generated file '$targetfile' to zones: ${qa.BroadcastZones}" "Broadcast started SOUNDBANK message with generated file '$targetfile' to zones: ${qa.BroadcastZones}"
Logger.info { logmsg } Logger.info { logmsg }
db.Add_Log("AAS", logmsg) db.logDB.Add("AAS", logmsg)
return true return true
} }
} else { } else {
db.queuetableDB.DeleteByIndex(qa.index.toInt()) db.queuetableDB.DeleteByIndex(qa.index.toInt())
db.queuetableDB.Resort() db.queuetableDB.Resort()
db.Add_Log("AAS", result.message) db.logDB.Add("AAS", result.message)
} }
} }
@@ -1040,7 +1040,7 @@ class MainExtension01 {
// tidak ada messagebank dengan ann_id ini, delete from queue table // tidak ada messagebank dengan ann_id ini, delete from queue table
db.queuetableDB.DeleteByIndex(qa.index.toInt()) db.queuetableDB.DeleteByIndex(qa.index.toInt())
db.queuetableDB.Resort() db.queuetableDB.Resort()
db.Add_Log( db.logDB.Add(
"AAS", "AAS",
"Cancelled SOUNDBANK message $qa due to ANN_ID $ann_id not found in Messagebank" "Cancelled SOUNDBANK message $qa due to ANN_ID $ann_id not found in Messagebank"
) )
@@ -1053,14 +1053,14 @@ class MainExtension01 {
// ada broadcast zone yang tidak valid, delete from queue table // ada broadcast zone yang tidak valid, delete from queue table
db.queuetableDB.DeleteByIndex(qa.index.toInt()) db.queuetableDB.DeleteByIndex(qa.index.toInt())
db.queuetableDB.Resort() db.queuetableDB.Resort()
db.Add_Log("AAS", "Cancelled SOUNDBANK message $qa due to invalid broadcast zone") db.logDB.Add("AAS", "Cancelled SOUNDBANK message $qa due to invalid broadcast zone")
Logger.error { "Cancelled SOUNDBANK message $qa due to invalid broadcast zone" } Logger.error { "Cancelled SOUNDBANK message $qa due to invalid broadcast zone" }
} }
} else { } else {
// invalid broadcast zone, delete from queue table // invalid broadcast zone, delete from queue table
db.queuetableDB.DeleteByIndex(qa.index.toInt()) db.queuetableDB.DeleteByIndex(qa.index.toInt())
db.queuetableDB.Resort() db.queuetableDB.Resort()
db.Add_Log("AAS", "Cancelled SOUNDBANK message $qa due to empty broadcast zone") db.logDB.Add("AAS", "Cancelled SOUNDBANK message $qa due to empty broadcast zone")
Logger.error { "Cancelled SOUNDBANK message $qa due to empty broadcast zone" } Logger.error { "Cancelled SOUNDBANK message $qa due to empty broadcast zone" }
} }
} }

View File

@@ -1,5 +1,9 @@
package database package database
import java.time.LocalDate
import java.time.LocalTime
import java.time.format.DateTimeFormatter
@Suppress("unused") @Suppress("unused")
data class Log( data class Log(
val index: ULong, val index: ULong,
@@ -14,9 +18,11 @@ data class Log(
machine: String, machine: String,
description: String description: String
) : Log { ) : Log {
val current = java.time.LocalDateTime.now() //val current = java.time.LocalDateTime.now()
val date = current.toLocalDate().toString() // format YYYY-MM-DD //val date = current.toLocalDate().toString() // format YYYY-MM-DD
val time = current.toLocalTime().withNano(0).toString() // format HH:MM:SS //val time = current.toLocalTime().withNano(0).toString() // format HH:MM:SS
val date = LocalDate.now().format(DateTimeFormatter.ofPattern("dd/MM/yyyy"))
val time = LocalTime.now().format(DateTimeFormatter.ofPattern("HH:mm:ss"))
return Log(0u, date, time, machine, description) return Log(0u, date, time, machine, description)
} }
} }

View File

@@ -1,9 +1,18 @@
package database package database
data class LogSemiauto(val index: UInt, val date: String, val time: String, val source: String, val description: String){ import java.time.LocalDate
import java.time.LocalTime
import java.time.format.DateTimeFormatter
data class LogSemiauto(val index: ULong, val date: String, val time: String, val source: String, val description: String){
override fun toString(): String { override fun toString(): String {
return "$date $time [$source] $description" return "$date $time [$source] $description"
} }
companion object{
fun NewLog(source: String, description: String): LogSemiauto {
val date = LocalDate.now().format(DateTimeFormatter.ofPattern("dd/MM/yyyy"))
val time = LocalTime.now().format(DateTimeFormatter.ofPattern("HH:mm:ss"))
return LogSemiauto(0u, date, time, source, description)
}
}
} }

View File

@@ -1,6 +1,5 @@
package database package database
import codes.Somecodes.Companion.ValiDateForLogHtml
import codes.Somecodes.Companion.ValidScheduleDay import codes.Somecodes.Companion.ValidScheduleDay
import codes.Somecodes.Companion.toJsonString import codes.Somecodes.Companion.toJsonString
import config import config
@@ -16,6 +15,7 @@ import java.sql.DriverManager
import java.util.function.Consumer import java.util.function.Consumer
import codes.configKeys import codes.configKeys
/** /**
* A class to manage a connection to a MariaDB database. * A class to manage a connection to a MariaDB database.
* *
@@ -45,15 +45,12 @@ class MariaDB(
lateinit var queuetableDB: dbFunctions<QueueTable> lateinit var queuetableDB: dbFunctions<QueueTable>
lateinit var queuepagingDB: dbFunctions<QueuePaging> lateinit var queuepagingDB: dbFunctions<QueuePaging>
lateinit var soundchannelDB: dbFunctions<SoundChannel> lateinit var soundchannelDB: dbFunctions<SoundChannel>
lateinit var logDB: dbFunctions<Log> lateinit var logDB: Table_Logs
lateinit var userDB: dbFunctions<UserDB> lateinit var userDB: dbFunctions<UserDB>
lateinit var logSemiAuto: Table_LogSemiAuto
companion object { companion object {
fun ValidDate(date: String): Boolean {
// Check if the date is in the format DD/MM/YYYY
val regex = Regex("""^\d{2}/\d{2}/\d{4}$""")
return regex.matches(date)
}
fun ValidTime(time: String): Boolean { fun ValidTime(time: String): Boolean {
// Check if the time is in the format HH:MM // Check if the time is in the format HH:MM
@@ -167,15 +164,15 @@ class MariaDB(
statement?.setString(6, data.Path) statement?.setString(6, data.Path)
val rowsAffected = statement?.executeUpdate() val rowsAffected = statement?.executeUpdate()
if (rowsAffected != null && rowsAffected > 0) { if (rowsAffected != null && rowsAffected > 0) {
Add_Log("AAS", "Soundbank added: ${data.Description}; TAG: ${data.TAG}; Category: ${data.Category}; Language: ${data.Language}; VoiceType: ${data.VoiceType}; Path: ${data.Path}") logDB.Add("AAS", "Soundbank added: ${data.Description}; TAG: ${data.TAG}; Category: ${data.Category}; Language: ${data.Language}; VoiceType: ${data.VoiceType}; Path: ${data.Path}")
Logger.info("Soundbank added: ${data.Description}" as Any) Logger.info("Soundbank added: ${data.Description}" as Any)
return true return true
} else { } else {
Add_Log("AAS", "No soundbank entry added for: ${data.Description}") logDB.Add("AAS", "No soundbank entry added for: ${data.Description}")
Logger.warn("No soundbank entry added for: ${data.Description}" as Any) Logger.warn("No soundbank entry added for: ${data.Description}" as Any)
} }
} catch (e: Exception) { } catch (e: Exception) {
Add_Log("AAS", "Failed to add Soundbank: ${data.Description}. Error: ${e.message}") logDB.Add("AAS", "Failed to add Soundbank: ${data.Description}. Error: ${e.message}")
Logger.error("Error adding soundbank entry: ${e.message}" as Any) Logger.error("Error adding soundbank entry: ${e.message}" as Any)
} }
return false return false
@@ -200,11 +197,11 @@ class MariaDB(
statement.executeBatch() statement.executeBatch()
connection.commit() connection.commit()
Logger.info("Bulk soundbank insert successful: ${data.size} entries" as Any) Logger.info("Bulk soundbank insert successful: ${data.size} entries" as Any)
Add_Log("AAS","Successfully Import Sound Bank Table: ${data.size} entries.") logDB.Add("AAS","Successfully Import Sound Bank Table: ${data.size} entries.")
connection.autoCommit = true connection.autoCommit = true
return true return true
} catch (e: Exception) { } catch (e: Exception) {
Add_Log("AAS","Failed to Import Sound Bank. Error: ${e.message}") logDB.Add("AAS","Failed to Import Sound Bank. Error: ${e.message}")
Logger.error("Error adding soundbank entries: ${e.message}" as Any) Logger.error("Error adding soundbank entries: ${e.message}" as Any)
} }
return false return false
@@ -224,14 +221,14 @@ class MariaDB(
val rowsAffected = statement?.executeUpdate() val rowsAffected = statement?.executeUpdate()
if (rowsAffected != null && rowsAffected > 0) { if (rowsAffected != null && rowsAffected > 0) {
Logger.info("Soundbank updated at index $index: ${data.Description}" as Any) Logger.info("Soundbank updated at index $index: ${data.Description}" as Any)
Add_Log("AAS", "Soundbank updated at index $index: ${data.Description}; TAG: ${data.TAG}; Category: ${data.Category}; Language: ${data.Language}; VoiceType: ${data.VoiceType}; Path: ${data.Path}") logDB.Add("AAS", "Soundbank updated at index $index: ${data.Description}; TAG: ${data.TAG}; Category: ${data.Category}; Language: ${data.Language}; VoiceType: ${data.VoiceType}; Path: ${data.Path}")
return true return true
} else { } else {
Add_Log("AAS", "Failed updating Sound Bank at index $index for: ${data.Description}") logDB.Add("AAS", "Failed updating Sound Bank at index $index for: ${data.Description}")
Logger.warn("No soundbank entry updated at index $index for: ${data.Description}" as Any) Logger.warn("No soundbank entry updated at index $index for: ${data.Description}" as Any)
} }
} catch (e: Exception) { } catch (e: Exception) {
Add_Log("AAS", "Failed updating Sound Bank at index $index. Error: ${e.message}") logDB.Add("AAS", "Failed updating Sound Bank at index $index. Error: ${e.message}")
Logger.error("Error updating soundbank entry at index $index: ${e.message}" as Any) Logger.error("Error updating soundbank entry at index $index: ${e.message}" as Any)
} }
return false return false
@@ -381,14 +378,14 @@ class MariaDB(
val rowsAffected = statement?.executeUpdate() val rowsAffected = statement?.executeUpdate()
if (rowsAffected != null && rowsAffected > 0) { if (rowsAffected != null && rowsAffected > 0) {
Logger.info("Messagebank added: ${data.Description}" as Any) Logger.info("Messagebank added: ${data.Description}" as Any)
Add_Log("AAS", "Messagebank added: ${data.Description}; Language: ${data.Language}; ANN_ID: ${data.ANN_ID}; Voice_Type: ${data.Voice_Type}") logDB.Add("AAS", "Messagebank added: ${data.Description}; Language: ${data.Language}; ANN_ID: ${data.ANN_ID}; Voice_Type: ${data.Voice_Type}")
return true return true
} else { } else {
Add_Log("AAS","Failed adding Message Bank for: ${data.Description}") logDB.Add("AAS","Failed adding Message Bank for: ${data.Description}")
Logger.warn("No messagebank entry added for: ${data.Description}" as Any) Logger.warn("No messagebank entry added for: ${data.Description}" as Any)
} }
} catch (e: Exception) { } catch (e: Exception) {
Add_Log("AAS","Failed adding Message Bank for: ${data.Description}. Error: ${e.message}") logDB.Add("AAS","Failed adding Message Bank for: ${data.Description}. Error: ${e.message}")
Logger.error("Error adding messagebank entry: ${e.message}" as Any) Logger.error("Error adding messagebank entry: ${e.message}" as Any)
} }
return false return false
@@ -412,11 +409,11 @@ class MariaDB(
statement.executeBatch() statement.executeBatch()
connection.commit() connection.commit()
Logger.info("Bulk messagebank insert successful: ${data.size} entries" as Any) Logger.info("Bulk messagebank insert successful: ${data.size} entries" as Any)
Add_Log("AAS","Successfully Import Message Bank Table: ${data.size} entries.") logDB.Add("AAS","Successfully Import Message Bank Table: ${data.size} entries.")
connection.autoCommit = true connection.autoCommit = true
return true return true
} catch (e: Exception) { } catch (e: Exception) {
Add_Log("AAS","Failed to Import Message Bank. Error: ${e.message}") logDB.Add("AAS","Failed to Import Message Bank. Error: ${e.message}")
Logger.error("Error adding messagebank entries: ${e.message}" as Any) Logger.error("Error adding messagebank entries: ${e.message}" as Any)
} }
return false return false
@@ -594,14 +591,14 @@ class MariaDB(
val rowsAffected = statement.executeUpdate() val rowsAffected = statement.executeUpdate()
if (rowsAffected > 0) { if (rowsAffected > 0) {
Logger.info("Language link added: ${data.TAG} -> ${data.Language}" as Any) Logger.info("Language link added: ${data.TAG} -> ${data.Language}" as Any)
Add_Log("AAS", "Language link added: ${data.TAG} -> ${data.Language}") logDB.Add("AAS", "Language link added: ${data.TAG} -> ${data.Language}")
return true return true
} else { } else {
Add_Log("AAS","Failed adding Language Link for: ${data.TAG} -> ${data.Language}.") logDB.Add("AAS","Failed adding Language Link for: ${data.TAG} -> ${data.Language}.")
Logger.warn("No language link entry added for: ${data.TAG} -> ${data.Language}" as Any) Logger.warn("No language link entry added for: ${data.TAG} -> ${data.Language}" as Any)
} }
} catch (e: Exception) { } catch (e: Exception) {
Add_Log("AAS","Failed adding Language Link for: ${data.TAG} -> ${data.Language}. Error: ${e.message}") logDB.Add("AAS","Failed adding Language Link for: ${data.TAG} -> ${data.Language}. Error: ${e.message}")
Logger.error("Error adding language link entry: ${e.message}" as Any) Logger.error("Error adding language link entry: ${e.message}" as Any)
} }
return false return false
@@ -622,11 +619,11 @@ class MariaDB(
statement.executeBatch() statement.executeBatch()
connection.commit() connection.commit()
Logger.info("Bulk languagelinking insert successful: ${List.size} entries" as Any) Logger.info("Bulk languagelinking insert successful: ${List.size} entries" as Any)
Add_Log("AAS","Successfully Import Language Link Table: ${data.size} entries.") logDB.Add("AAS","Successfully Import Language Link Table: ${data.size} entries.")
connection.autoCommit = true connection.autoCommit = true
return true return true
} catch (e: Exception) { } catch (e: Exception) {
Add_Log("AAS","Failed to Import Language Link. Error: ${e.message}") logDB.Add("AAS","Failed to Import Language Link. Error: ${e.message}")
Logger.error("Error adding languagelinking entries: ${e.message}" as Any) Logger.error("Error adding languagelinking entries: ${e.message}" as Any)
} }
return false return false
@@ -642,14 +639,15 @@ class MariaDB(
val rowsAffected = statement?.executeUpdate() val rowsAffected = statement?.executeUpdate()
if (rowsAffected != null && rowsAffected > 0) { if (rowsAffected != null && rowsAffected > 0) {
Logger.info("Language link updated at index $index: ${data.TAG} -> ${data.Language}" as Any) Logger.info("Language link updated at index $index: ${data.TAG} -> ${data.Language}" as Any)
Add_Log("AAS", "Language link updated at index $index: ${data.TAG} -> ${data.Language}")
logDB.Add("AAS", "Language link updated at index $index: ${data.TAG} -> ${data.Language}")
return true return true
} else { } else {
Add_Log("AAS", "Failed updating Language Link at index $index for: ${data.TAG} -> ${data.Language}") logDB.Add("AAS", "Failed updating Language Link at index $index for: ${data.TAG} -> ${data.Language}")
Logger.warn("No language link entry updated at index $index for: ${data.TAG} -> ${data.Language}" as Any) Logger.warn("No language link entry updated at index $index for: ${data.TAG} -> ${data.Language}" as Any)
} }
} catch (e: Exception) { } catch (e: Exception) {
Add_Log("AAS", "Failed updating Language Link at index $index. Error: ${e.message}") logDB.Add("AAS", "Failed updating Language Link at index $index. Error: ${e.message}")
Logger.error("Error updating language link entry at index $index: ${e.message}" as Any) Logger.error("Error updating language link entry at index $index: ${e.message}" as Any)
} }
return false return false
@@ -800,14 +798,14 @@ class MariaDB(
val rowsAffected = statement?.executeUpdate() val rowsAffected = statement?.executeUpdate()
if (rowsAffected != null && rowsAffected > 0) { if (rowsAffected != null && rowsAffected > 0) {
Logger.info("Schedulebank added: ${data.Description}" as Any) Logger.info("Schedulebank added: ${data.Description}" as Any)
Add_Log("AAS", "Schedulebank added: ${data.Description}; Day: ${data.Day}; Time: ${data.Time}; Soundpath: ${data.Soundpath}; Repeat: ${data.Repeat}; Enable: ${data.Enable}; BroadcastZones: ${data.BroadcastZones}; Language: ${data.Language}") logDB.Add("AAS", "Schedulebank added: ${data.Description}; Day: ${data.Day}; Time: ${data.Time}; Soundpath: ${data.Soundpath}; Repeat: ${data.Repeat}; Enable: ${data.Enable}; BroadcastZones: ${data.BroadcastZones}; Language: ${data.Language}")
return true return true
} else { } else {
Add_Log("AAS","Failed adding Schedule Bank for: ${data.Description}.") logDB.Add("AAS","Failed adding Schedule Bank for: ${data.Description}.")
Logger.warn("No schedulebank entry added for: ${data.Description}" as Any) Logger.warn("No schedulebank entry added for: ${data.Description}" as Any)
} }
} catch (e: Exception) { } catch (e: Exception) {
Add_Log("AAS","Failed adding Schedule Bank for: ${data.Description}. Error: ${e.message}") logDB.Add("AAS","Failed adding Schedule Bank for: ${data.Description}. Error: ${e.message}")
Logger.error("Error adding schedulebank entry: ${e.message}" as Any) Logger.error("Error adding schedulebank entry: ${e.message}" as Any)
} }
return false return false
@@ -837,11 +835,11 @@ class MariaDB(
statement.executeBatch() statement.executeBatch()
connection.commit() connection.commit()
Logger.info("Bulk schedulebank insert successful: ${data.size} entries" as Any) Logger.info("Bulk schedulebank insert successful: ${data.size} entries" as Any)
Add_Log("AAS","Successfully Import Schedule Bank Table: ${data.size} entries.") logDB.Add("AAS","Successfully Import Schedule Bank Table: ${data.size} entries.")
connection.autoCommit = true connection.autoCommit = true
return true return true
} catch (e: Exception) { } catch (e: Exception) {
Add_Log("AAS","Failed to Import Schedule Bank. Error: ${e.message}") logDB.Add("AAS","Failed to Import Schedule Bank. Error: ${e.message}")
Logger.error("Error adding schedulebank entries: ${e.message}" as Any) Logger.error("Error adding schedulebank entries: ${e.message}" as Any)
} }
return false return false
@@ -872,14 +870,14 @@ class MariaDB(
val rowsAffected = statement?.executeUpdate() val rowsAffected = statement?.executeUpdate()
if (rowsAffected != null && rowsAffected > 0) { if (rowsAffected != null && rowsAffected > 0) {
Logger.info("Schedulebank updated at index $index: ${data.Description}" as Any) Logger.info("Schedulebank updated at index $index: ${data.Description}" as Any)
Add_Log("AAS", "Schedulebank updated at index $index: ${data.Description}; Day: ${data.Day}; Time: ${data.Time}; Soundpath: ${data.Soundpath}; Repeat: ${data.Repeat}; Enable: ${data.Enable}; BroadcastZones: ${data.BroadcastZones}; Language: ${data.Language}") logDB.Add("AAS", "Schedulebank updated at index $index: ${data.Description}; Day: ${data.Day}; Time: ${data.Time}; Soundpath: ${data.Soundpath}; Repeat: ${data.Repeat}; Enable: ${data.Enable}; BroadcastZones: ${data.BroadcastZones}; Language: ${data.Language}")
return true return true
} else { } else {
Add_Log("AAS", "Failed updating Schedule Bank at index $index for: ${data.Description}.") logDB.Add("AAS", "Failed updating Schedule Bank at index $index for: ${data.Description}.")
Logger.warn("No schedulebank entry updated at index $index for: ${data.Description}" as Any) Logger.warn("No schedulebank entry updated at index $index for: ${data.Description}" as Any)
} }
} catch (e: Exception) { } catch (e: Exception) {
Add_Log("AAS", "Failed updating Schedule Bank at index $index. Error: ${e.message}") logDB.Add("AAS", "Failed updating Schedule Bank at index $index. Error: ${e.message}")
Logger.error("Error updating schedulebank entry at index $index: ${e.message}" as Any) Logger.error("Error updating schedulebank entry at index $index: ${e.message}" as Any)
} }
return false return false
@@ -1066,14 +1064,14 @@ class MariaDB(
val rowsAffected = statement?.executeUpdate() val rowsAffected = statement?.executeUpdate()
if (rowsAffected != null && rowsAffected > 0) { if (rowsAffected != null && rowsAffected > 0) {
Logger.info("Broadcast zone added: ${data.description}" as Any) Logger.info("Broadcast zone added: ${data.description}" as Any)
Add_Log("AAS", "Broadcast zone added: ${data.description}; SoundChannel: ${data.SoundChannel}; id: ${data.id}; bp: ${data.bp}") logDB.Add("AAS", "Broadcast zone added: ${data.description}; SoundChannel: ${data.SoundChannel}; id: ${data.id}; bp: ${data.bp}")
return true return true
} else { } else {
Add_Log("AAS","Failed adding Broadcast Zone for: ${data.description}.") logDB.Add("AAS","Failed adding Broadcast Zone for: ${data.description}.")
Logger.warn("No broadcast zone entry added for: ${data.description}" as Any) Logger.warn("No broadcast zone entry added for: ${data.description}" as Any)
} }
} catch (e: Exception) { } catch (e: Exception) {
Add_Log("AAS","Failed adding Broadcast Zone for: ${data.description}. Error: ${e.message}") logDB.Add("AAS","Failed adding Broadcast Zone for: ${data.description}. Error: ${e.message}")
Logger.error("Error adding broadcast zone entry: ${e.message}" as Any) Logger.error("Error adding broadcast zone entry: ${e.message}" as Any)
} }
return false return false
@@ -1095,11 +1093,11 @@ class MariaDB(
statement.executeBatch() statement.executeBatch()
connection.commit() connection.commit()
Logger.info("Bulk ${super.dbName} insert successful: ${data.size} entries" as Any) Logger.info("Bulk ${super.dbName} insert successful: ${data.size} entries" as Any)
Add_Log("AAS","Successfully Import Broadcast Zones Table: ${data.size} entries.") logDB.Add("AAS","Successfully Import Broadcast Zones Table: ${data.size} entries.")
connection.autoCommit = true connection.autoCommit = true
return true return true
} catch (e: Exception) { } catch (e: Exception) {
Add_Log("AAS","Failed to Import Broadcast Zones. Error: ${e.message}") logDB.Add("AAS","Failed to Import Broadcast Zones. Error: ${e.message}")
Logger.error("Error adding ${super.dbName} entries: ${e.message}" as Any) Logger.error("Error adding ${super.dbName} entries: ${e.message}" as Any)
} }
return false return false
@@ -1117,14 +1115,14 @@ class MariaDB(
val rowsAffected = statement?.executeUpdate() val rowsAffected = statement?.executeUpdate()
if (rowsAffected != null && rowsAffected > 0) { if (rowsAffected != null && rowsAffected > 0) {
Logger.info("Broadcast zone updated at index $index: ${data.description}" as Any) Logger.info("Broadcast zone updated at index $index: ${data.description}" as Any)
Add_Log("AAS", "Broadcast zone updated at index $index: ${data.description}; SoundChannel: ${data.SoundChannel}; id: ${data.id}; bp: ${data.bp}") logDB.Add("AAS", "Broadcast zone updated at index $index: ${data.description}; SoundChannel: ${data.SoundChannel}; id: ${data.id}; bp: ${data.bp}")
return true return true
} else { } else {
Add_Log("AAS", "Failed updating Broadcast Zone at index $index for: ${data.description}.") logDB.Add("AAS", "Failed updating Broadcast Zone at index $index for: ${data.description}.")
Logger.warn("No broadcast zone entry updated at index $index for: ${data.description}" as Any) Logger.warn("No broadcast zone entry updated at index $index for: ${data.description}" as Any)
} }
} catch (e: Exception) { } catch (e: Exception) {
Add_Log("AAS", "Failed updating Broadcast Zone at index $index. Error: ${e.message}") logDB.Add("AAS", "Failed updating Broadcast Zone at index $index. Error: ${e.message}")
Logger.error("Error updating broadcast zone entry at index $index: ${e.message}" as Any) Logger.error("Error updating broadcast zone entry at index $index: ${e.message}" as Any)
} }
return false return false
@@ -1304,11 +1302,11 @@ class MariaDB(
statement.executeBatch() statement.executeBatch()
connection.commit() connection.commit()
Logger.info("Bulk QueueTable insert successful: ${data.size} entries" as Any) Logger.info("Bulk QueueTable insert successful: ${data.size} entries" as Any)
Add_Log("AAS","Successfully Import Queue Table: ${data.size} entries.") logDB.Add("AAS","Successfully Import Queue Table: ${data.size} entries.")
connection.autoCommit = true connection.autoCommit = true
return true return true
} catch (e: Exception) { } catch (e: Exception) {
Add_Log("AAS","Failed to Import Queue Table. Error: ${e.message}") logDB.Add("AAS","Failed to Import Queue Table. Error: ${e.message}")
Logger.error("Error adding QueueTable entries: ${e.message}" as Any) Logger.error("Error adding QueueTable entries: ${e.message}" as Any)
} }
return false return false
@@ -1468,11 +1466,11 @@ class MariaDB(
statement.executeBatch() statement.executeBatch()
connection.commit() connection.commit()
Logger.info("Bulk QueuePaging insert successful: ${data.size} entries" as Any) Logger.info("Bulk QueuePaging insert successful: ${data.size} entries" as Any)
Add_Log("AAS","Successfully Import Queue Paging Table: ${data.size} entries.") logDB.Add("AAS","Successfully Import Queue Paging Table: ${data.size} entries.")
connection.autoCommit = true connection.autoCommit = true
true true
} catch (e: Exception) { } catch (e: Exception) {
Add_Log("AAS","Failed to Import Queue Paging Table. Error: ${e.message}") logDB.Add("AAS","Failed to Import Queue Paging Table. Error: ${e.message}")
Logger.error("Error adding QueuePaging entries: ${e.message}" as Any) Logger.error("Error adding QueuePaging entries: ${e.message}" as Any)
false false
} }
@@ -1595,14 +1593,14 @@ class MariaDB(
val rowsAffected = statement?.executeUpdate() val rowsAffected = statement?.executeUpdate()
if (rowsAffected != null && rowsAffected > 0) { if (rowsAffected != null && rowsAffected > 0) {
Logger.info("SoundChannel updated: ${data.channel} -> ${data.ip}" as Any) Logger.info("SoundChannel updated: ${data.channel} -> ${data.ip}" as Any)
Add_Log("AAS", "Sound Channel updated: ${data.channel} -> ${data.ip}") logDB.Add("AAS", "Sound Channel updated: ${data.channel} -> ${data.ip}")
return true return true
} else { } else {
Add_Log("AAS", "Failed updating Sound Channel for: ${data.channel} -> ${data.ip}.") logDB.Add("AAS", "Failed updating Sound Channel for: ${data.channel} -> ${data.ip}.")
Logger.warn("No SoundChannel entry updated for: ${data.channel} -> ${data.ip}" as Any) Logger.warn("No SoundChannel entry updated for: ${data.channel} -> ${data.ip}" as Any)
} }
} catch (e: Exception) { } catch (e: Exception) {
Add_Log("AAS", "Failed updating Sound Channel for: ${data.channel} -> ${data.ip}. Error: ${e.message}") logDB.Add("AAS", "Failed updating Sound Channel for: ${data.channel} -> ${data.ip}. Error: ${e.message}")
Logger.error("Error updating SoundChannel entry: ${e.message}" as Any) Logger.error("Error updating SoundChannel entry: ${e.message}" as Any)
} }
return false return false
@@ -1621,11 +1619,11 @@ class MariaDB(
statement.executeBatch() statement.executeBatch()
connection.commit() connection.commit()
Logger.info("Bulk SoundChannel update successful: ${data.size} entries" as Any) Logger.info("Bulk SoundChannel update successful: ${data.size} entries" as Any)
Add_Log("AAS","Successfully Import Sound Channels Table: ${data.size} entries.") logDB.Add("AAS","Successfully Import Sound Channels Table: ${data.size} entries.")
connection.autoCommit = true connection.autoCommit = true
true true
} catch (e: Exception) { } catch (e: Exception) {
Add_Log("AAS","Failed to Import Sound Channels. Error: ${e.message}") logDB.Add("AAS","Failed to Import Sound Channels. Error: ${e.message}")
Logger.error("Error updating SoundChannel entries: ${e.message}" as Any) Logger.error("Error updating SoundChannel entries: ${e.message}" as Any)
false false
} }
@@ -1641,14 +1639,14 @@ class MariaDB(
val rowsAffected = statement?.executeUpdate() val rowsAffected = statement?.executeUpdate()
if (rowsAffected != null && rowsAffected > 0) { if (rowsAffected != null && rowsAffected > 0) {
Logger.info("SoundChannel updated at index $index: ${data.channel} -> ${data.ip}" as Any) Logger.info("SoundChannel updated at index $index: ${data.channel} -> ${data.ip}" as Any)
Add_Log("AAS", "Sound Channel updated at index $index: ${data.channel} -> ${data.ip}") logDB.Add("AAS", "Sound Channel updated at index $index: ${data.channel} -> ${data.ip}")
return true return true
} else { } else {
Add_Log("AAS", "Failed updating Sound Channel at index $index for: ${data.channel} -> ${data.ip}.") logDB.Add("AAS", "Failed updating Sound Channel at index $index for: ${data.channel} -> ${data.ip}.")
Logger.warn("No Sound Channel entry updated at index $index for: ${data.channel} -> ${data.ip}" as Any) Logger.warn("No Sound Channel entry updated at index $index for: ${data.channel} -> ${data.ip}" as Any)
} }
} catch (e: Exception) { } catch (e: Exception) {
Add_Log("AAS", "Failed updating Sound Channel at index $index. Error: ${e.message}") logDB.Add("AAS", "Failed updating Sound Channel at index $index. Error: ${e.message}")
Logger.error("Error updating SoundChannel entry at index $index: ${e.message}" as Any) Logger.error("Error updating SoundChannel entry at index $index: ${e.message}" as Any)
} }
return false return false
@@ -1774,14 +1772,14 @@ class MariaDB(
val rowsAffected = statement?.executeUpdate() val rowsAffected = statement?.executeUpdate()
if (rowsAffected != null && rowsAffected > 0) { if (rowsAffected != null && rowsAffected > 0) {
Logger.info("${super.dbName} IP cleared for index $index" as Any) Logger.info("${super.dbName} IP cleared for index $index" as Any)
Add_Log("AAS", "${super.dbName} IP cleared for index $index") logDB.Add("AAS", "${super.dbName} IP cleared for index $index")
return true return true
} else { } else {
Add_Log("AAS","Failed clearing ${super.dbName} IP for index $index.") logDB.Add("AAS","Failed clearing ${super.dbName} IP for index $index.")
Logger.warn("No ${super.dbName} entry cleared for index $index" as Any) Logger.warn("No ${super.dbName} entry cleared for index $index" as Any)
} }
} catch (e: Exception) { } catch (e: Exception) {
Add_Log("AAS","Failed clearing ${super.dbName} IP for index $index. Error: ${e.message}") logDB.Add("AAS","Failed clearing ${super.dbName} IP for index $index. Error: ${e.message}")
Logger.error("Error clearing ${super.dbName} entry for index $index: ${e.message}" as Any) Logger.error("Error clearing ${super.dbName} entry for index $index: ${e.message}" as Any)
} }
return false return false
@@ -1789,160 +1787,10 @@ class MariaDB(
} }
logDB = object : dbFunctions<Log>("logs", connection, listOf("index", "datenya", "timenya", "machine", "description")) { logSemiAuto = Table_LogSemiAuto(connection)
override fun Create() {
val tabledefinition = "CREATE TABLE IF NOT EXISTS ${super.dbName} (" +
"`index` INT AUTO_INCREMENT PRIMARY KEY," +
"datenya VARCHAR(20) NOT NULL," + // format DD/MM/YYYY
"timenya VARCHAR(20) NOT NULL," + // format HH:MM:SS
"machine VARCHAR(45) NOT NULL," +
"description TEXT NOT NULL" +
")"
super.Create(tabledefinition) logDB = Table_Logs(connection)
}
override fun Get(cbOK: Consumer<Unit>?, cbFail: Consumer<String>?) {
List.clear()
try {
val statement = connection.createStatement()
val resultSet = statement?.executeQuery("SELECT * FROM ${super.dbName}")
while (resultSet?.next() == true) {
val log = Log(
resultSet.getLong("index").toULong(),
resultSet.getString("datenya"),
resultSet.getString("timenya"),
resultSet.getString("machine"),
resultSet.getString("description")
)
List.add(log)
}
cbOK?.accept(Unit)
} catch (e: Exception) {
cbFail?.accept("Error fetching ${super.dbName}: ${e.message}")
Logger.error("Error fetching ${super.dbName}: ${e.message}" as Any)
}
}
override fun Add(data: Log): Boolean {
try {
val statement =
connection.prepareStatement("INSERT INTO logs (datenya, timenya, machine, description) VALUES (?, ?, ?, ?)")
statement?.setString(1, data.datenya)
statement?.setString(2, data.timenya)
statement?.setString(3, data.machine)
statement?.setString(4, data.description)
val rowsAffected = statement?.executeUpdate()
if (rowsAffected != null && rowsAffected > 0) {
return true
} else {
Logger.warn{"Failed to add log entry : $data"}
}
} catch (e: Exception) {
Logger.error{"Error adding log entry: ${e.message}"}
}
return false
}
override fun AddAll(data: ArrayList<Log>): Boolean {
return try {
connection.autoCommit = false
val sql = "INSERT INTO logs (datenya, timenya, machine, description) VALUES (?, ?, ?, ?)"
val statement = connection.prepareStatement(sql)
for (log in data) {
statement.setString(1, log.datenya)
statement.setString(2, log.timenya)
statement.setString(3, log.machine)
statement.setString(4, log.description)
statement.addBatch()
}
statement.executeBatch()
connection.commit()
Logger.info("Bulk log insert successful: ${data.size} entries" as Any)
Add_Log("AAS","Successfully Import Log Table: ${data.size} entries.")
connection.autoCommit = true
true
} catch (e: Exception) {
Add_Log("AAS","Failed to Import Log Table. Error: ${e.message}")
Logger.error("Error adding log entries: ${e.message}" as Any)
false
}
}
override fun UpdateByIndex(index: Int, data: Log): Boolean {
throw Exception("Update not supported")
}
override fun Resort(): Boolean {
try {
val statement = connection.createStatement()
val tempdb_name = "temp_${super.dbName}"
// use a temporary table to reorder the index
statement?.executeUpdate("CREATE TABLE IF NOT EXISTS $tempdb_name LIKE ${super.dbName}")
statement?.executeUpdate("TRUNCATE TABLE $tempdb_name")
statement?.executeUpdate(
"INSERT INTO $tempdb_name (datenya, timenya, machine, description) " +
"SELECT datenya, timenya, machine, description FROM ${super.dbName} " +
"ORDER BY datenya , timenya , machine "
)
statement?.executeUpdate("TRUNCATE TABLE ${super.dbName}")
statement?.executeUpdate(
"INSERT INTO ${super.dbName} (datenya, timenya, machine, description) " +
"SELECT datenya, timenya, machine, description FROM $tempdb_name"
)
statement?.executeUpdate("DROP TABLE $tempdb_name")
Logger.info("${super.dbName} table resorted by datenya, timenya, machine" as Any)
// reload the local list
Get()
return true
} catch (e: Exception) {
Logger.error("Error resorting ${super.dbName} table by datenya, timenya, machine: ${e.message}" as Any)
}
return false
}
override fun Import_XLSX(workbook: XSSFWorkbook): Boolean {
throw Exception("Importing Logs from XLSX is not supported")
}
override fun Export_XLSX(): XSSFWorkbook? {
try {
val statement = connection.createStatement()
val resultSet = statement?.executeQuery("SELECT * FROM ${super.dbName}")
val workbook = XSSFWorkbook()
val sheet = workbook.createSheet("Log")
val headerRow = sheet.createRow(0)
val headers = arrayOf("Index", "datenya", "timenya", "machine", "description")
for ((colIndex, header) in headers.withIndex()) {
val cell = headerRow.createCell(colIndex)
cell.setCellValue(header)
}
var rowIndex = 1
while (resultSet?.next() == true) {
val row = sheet.createRow(rowIndex++)
row.createCell(0).setCellValue(resultSet.getString("index"))
row.createCell(1).setCellValue(resultSet.getString("datenya"))
row.createCell(2).setCellValue(resultSet.getString("timenya"))
row.createCell(3).setCellValue(resultSet.getString("machine"))
row.createCell(4).setCellValue(resultSet.getString("description"))
}
for (i in headers.indices) {
sheet.autoSizeColumn(i)
}
return workbook
} catch (e: Exception) {
Logger.error { "Error exporting Log, Msg: ${e.message}" }
}
return null
}
}
userDB = object : dbFunctions<UserDB>("newuser", connection, listOf("index", "username", "password", "location", "airline_tags", "city_tags", "messagebank_ann_id", "broadcastzones")) { userDB = object : dbFunctions<UserDB>("newuser", connection, listOf("index", "username", "password", "location", "airline_tags", "city_tags", "messagebank_ann_id", "broadcastzones")) {
override fun Create() { override fun Create() {
@@ -1997,14 +1845,14 @@ class MariaDB(
val rowsAffected = statement?.executeUpdate() val rowsAffected = statement?.executeUpdate()
if (rowsAffected != null && rowsAffected > 0) { if (rowsAffected != null && rowsAffected > 0) {
Logger.info("User added: ${data.username}" as Any) Logger.info("User added: ${data.username}" as Any)
Add_Log("AAS", "User added: ${data.username}") logDB.Add("AAS", "User added: ${data.username}")
return true return true
} else { } else {
Add_Log("AAS","Failed adding User entry for: ${data.username}.") logDB.Add("AAS","Failed adding User entry for: ${data.username}.")
Logger.warn("No user entry added for: ${data.username}" as Any) Logger.warn("No user entry added for: ${data.username}" as Any)
} }
} catch (e: Exception) { } catch (e: Exception) {
Add_Log("AAS","Failed adding User entry for: ${data.username}. Error: ${e.message}") logDB.Add("AAS","Failed adding User entry for: ${data.username}. Error: ${e.message}")
Logger.error("Error adding user entry: ${e.message}" as Any) Logger.error("Error adding user entry: ${e.message}" as Any)
} }
return false return false
@@ -2028,11 +1876,11 @@ class MariaDB(
statement.executeBatch() statement.executeBatch()
connection.commit() connection.commit()
Logger.info("Bulk user insert successful: ${data.size} entries" as Any) Logger.info("Bulk user insert successful: ${data.size} entries" as Any)
Add_Log("AAS","Successfully Import User Table: ${data.size} entries.") logDB.Add("AAS","Successfully Import User Table: ${data.size} entries.")
connection.autoCommit = true connection.autoCommit = true
true true
} catch (e: Exception) { } catch (e: Exception) {
Add_Log("AAS","Failed to Import User Table. Error: ${e.message}") logDB.Add("AAS","Failed to Import User Table. Error: ${e.message}")
Logger.error("Error adding user entries: ${e.message}" as Any) Logger.error("Error adding user entries: ${e.message}" as Any)
false false
} }
@@ -2052,14 +1900,14 @@ class MariaDB(
val rowsAffected = statement?.executeUpdate() val rowsAffected = statement?.executeUpdate()
if (rowsAffected != null && rowsAffected > 0) { if (rowsAffected != null && rowsAffected > 0) {
Logger.info("User updated at index $index: ${data.username}" as Any) Logger.info("User updated at index $index: ${data.username}" as Any)
Add_Log("AAS", "User updated at index $index: ${data.username}") logDB.Add("AAS", "User updated at index $index: ${data.username}")
return true return true
} else { } else {
Add_Log("AAS", "Failed updating User at index $index for: ${data.username}.") logDB.Add("AAS", "Failed updating User at index $index for: ${data.username}.")
Logger.warn("No user entry updated at index $index for: ${data.username}" as Any) Logger.warn("No user entry updated at index $index for: ${data.username}" as Any)
} }
} catch (e: Exception) { } catch (e: Exception) {
Add_Log("AAS", "Failed updating User at index $index. Error: ${e.message}") logDB.Add("AAS", "Failed updating User at index $index. Error: ${e.message}")
Logger.error("Error updating user entry at index $index: ${e.message}" as Any) Logger.error("Error updating user entry at index $index: ${e.message}" as Any)
} }
return false return false
@@ -2166,6 +2014,7 @@ class MariaDB(
queuetableDB.Create() queuetableDB.Create()
queuepagingDB.Create() queuepagingDB.Create()
userDB.Create() userDB.Create()
logSemiAuto.Create()
messageDB.Get() messageDB.Get()
soundDB.Get() soundDB.Get()
@@ -2189,6 +2038,7 @@ class MariaDB(
Logger.info { "User count: ${userDB.List.size}" } Logger.info { "User count: ${userDB.List.size}" }
} catch (e: Exception) { } catch (e: Exception) {
Logger.error("Failed to connect to MariaDB: ${e.message}" as Any) Logger.error("Failed to connect to MariaDB: ${e.message}" as Any)
} }
@@ -2208,121 +2058,28 @@ class MariaDB(
connected = false connected = false
} }
fun GetSemiAutoLogForHTML(date: String, consumer: Consumer<ArrayList<LogSemiauto>>) {
/** val logList = ArrayList<LogSemiauto>()
* Adds a new log entry to the database with the current date and time.
* @param machine The machine name or identifier.
* @param description The log description.
* @return true if the log was added successfully, false otherwise.
*/
fun Add_Log(machine: String, description: String): Boolean {
val current = java.time.LocalDateTime.now()
val date = current.toLocalDate().toString() // format YYYY-MM-DD
val time = current.toLocalTime().withNano(0).toString() // format HH:MM:SS
val datenya = date.split("-").reversed().joinToString("/") // convert to DD/MM/YYYY
val log = Log(0u, datenya, time, machine, description)
return logDB.Add(log)
}
/**
* Get All Log from database
* @param consumer A Consumer that will receive the list of logs
*/
fun GetLog(consumer: Consumer<ArrayList<Log>>) {
val logList = ArrayList<Log>()
try { try {
val statement = connection.createStatement() val statement = connection.prepareStatement("SELECT * FROM logsemiauto WHERE date = ?")
val resultSet = statement?.executeQuery("SELECT * FROM logs") statement?.setString(1, date)
val resultSet = statement?.executeQuery()
while (resultSet?.next() == true) { while (resultSet?.next() == true) {
val log = Log( val log = LogSemiauto(
resultSet.getLong("index").toULong(), resultSet.getLong("index").toULong(),
resultSet.getString("datenya"), resultSet.getString("date"),
resultSet.getString("timenya"), resultSet.getString("time"),
resultSet.getString("machine"), resultSet.getString("source"),
resultSet.getString("description") resultSet.getString("description")
) )
logList.add(log) logList.add(log)
} }
} catch (e: Exception) { } catch (e: Exception) {
Logger.error("Error fetching logs table: ${e.message}" as Any) Logger.error("Error fetching logsemiauto table for date $date: ${e.message}" as Any)
} }
consumer.accept(logList) consumer.accept(logList)
} }
/**
* Get Log from database by date for HTML usage
* @param date The date to filter logs by (format: DD-MM-YYYY)
* @param consumer A Consumer that will receive the list of logs for the specified date
*/
fun GetLogForHtml(date: String, consumer: Consumer<ArrayList<Log>>) {
val logList = ArrayList<Log>()
//println("GetLogForHtml Date: $date" )
if (ValiDateForLogHtml(date)) {
try {
// must convert from DD-MM-YYYY to DD/MM/YYYY, because in database we use DD/MM/YYYY
val adjusteddate = date.replace("-", "/")
val statement = connection.prepareStatement("SELECT * FROM logs WHERE datenya = ?")
statement?.setString(1, adjusteddate)
//println("GetLogForHtml Date: $adjusteddate" )
// println("GetLogForHtml SQL: " +statement?.toString())
val resultSet = statement?.executeQuery()
while (resultSet?.next() == true) {
val log = Log(
resultSet.getLong("index").toULong(),
resultSet.getString("datenya"),
resultSet.getString("timenya"),
resultSet.getString("machine"),
resultSet.getString("description")
)
logList.add(log)
}
} catch (e: Exception) {
Logger.error("Error fetching logs table for date $date: ${e.message}" as Any)
}
}
consumer.accept(logList)
}
/**
* Get Log from database by date and filter for HTML usage
* @param date The date to filter logs by (format: DD-MM-YYYY)
* @param filter The filter string to search in description or machine
* @param consumer A Consumer that will receive the list of logs for the specified date and filter
*/
fun GetLogForHtml(date: String, filter: String, consumer: Consumer<ArrayList<Log>>) {
val logList = ArrayList<Log>()
//println("GetLogForHtml Date: $date Filter: $filter" )
if (ValiDateForLogHtml(date)) {
try {
// must convert from DD-MM-YYYY to DD/MM/YYYY, because in database we use DD/MM/YYYY
val adjusteddate = date.replace("-", "/")
val statement =
connection.prepareStatement("SELECT * FROM logs WHERE datenya = ? AND description LIKE ?")
statement?.setString(1, adjusteddate)
statement?.setString(2, "%$filter%")
//println("GetLogForHtml Date: $adjusteddate , Filter=$filter" )
//println("GetLogForHtml SQL: " +statement?.toString())
val resultSet = statement?.executeQuery()
while (resultSet?.next() == true) {
val log = Log(
resultSet.getLong("index").toULong(),
resultSet.getString("datenya"),
resultSet.getString("timenya"),
resultSet.getString("machine"),
resultSet.getString("description")
)
logList.add(log)
}
} catch (e: Exception) {
Logger.error("Error fetching logs for date $date with filter $filter: ${e.message}" as Any)
}
}
consumer.accept(logList)
}
/** /**
* Exports the log table to an XLSX workbook for a specific date and optional filter. * Exports the log table to an XLSX workbook for a specific date and optional filter.
* @param logDate The date string in format "dd/MM/yyyy". * @param logDate The date string in format "dd/MM/yyyy".

View File

@@ -0,0 +1,243 @@
package database
import org.apache.poi.xssf.usermodel.XSSFWorkbook
import org.tinylog.Logger
import java.sql.Connection
import java.time.LocalDate
import java.time.format.DateTimeFormatter
import java.util.function.Consumer
class Table_LogSemiAuto(connection: Connection) : dbFunctions<LogSemiauto>("logsemiauto", connection, listOf("index", "date", "time", "source", "description")) {
/**
* dateformat1 is regex for DD/MM/YYYY
*/
val dateformat1 = """^(0[1-9]|[12][0-9]|3[01])/(0[1-9]|1[0-2])/\d{4}$""".toRegex()
/**
* dateformat2 is regex for DD-MM-YYYY
*/
val dateformat2 = """^(0[1-9]|[12][0-9]|3[01])-(0[1-9]|1[0-2])-\d{4}$""".toRegex()
/**
* dateformat3 is regex for YYYY/MM/DD
*/
val dateformat3 = """^\d{4}/(0[1-9]|1[0-2])/(0[1-9]|[12][0-9]|3[01])$""".toRegex()
/**
* dateformat4 is regex for YYYY-MM-DD
*/
val dateformat4 = """^\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$""".toRegex()
override fun Create() {
val tabledefinition = "CREATE TABLE IF NOT EXISTS ${super.dbName} (" +
"`index` INT AUTO_INCREMENT PRIMARY KEY," +
"date VARCHAR(20) NOT NULL," + // format DD/MM/YYYY
"time VARCHAR(20) NOT NULL," + // format HH:MM:SS
"source VARCHAR(45) NOT NULL," +
"description TEXT NOT NULL" +
")"
super.Create(tabledefinition)
}
override fun Get(cbOK: Consumer<Unit>?, cbFail: Consumer<String>?) {
List.clear()
try {
val statement = connection.createStatement()
val resultSet = statement?.executeQuery("SELECT * FROM ${super.dbName}")
while (resultSet?.next() == true) {
val log = LogSemiauto(
resultSet.getLong("index").toULong(),
resultSet.getString("date"),
resultSet.getString("time"),
resultSet.getString("source"),
resultSet.getString("description")
)
List.add(log)
}
cbOK?.accept(Unit)
} catch (e: Exception) {
cbFail?.accept("Error fetching ${super.dbName}: ${e.message}")
Logger.error("Error fetching ${super.dbName}: ${e.message}" as Any)
}
}
fun Add(source: String, description: String){
val log = LogSemiauto.NewLog(source, description)
Add(log)
}
override fun Add(data: LogSemiauto): Boolean {
try{
val statement = connection.prepareStatement("INSERT INTO ${super.dbName} (date, time, source, description) VALUES (?, ?, ?, ?)")
statement?.setString(1, data.date)
statement?.setString(2, data.time)
statement?.setString(3, data.source)
statement?.setString(4, data.description)
val rowsAffected = statement?.executeUpdate()
if (rowsAffected != null && rowsAffected > 0) {
return true
} else throw Exception("Failed to add logsemiauto entry: $data")
} catch (e : Exception){
Logger.error { "Error adding logsemiauto entry: ${e.message}" }
return false
}
}
fun GetLogSemiAutoForHtml(date: String, filter: String?, cbOK: Consumer<ArrayList<LogSemiauto>>?, cbFail: Consumer<String>?){
try{
val valid_date : java.sql.Date? = when{
dateformat1.matches(date) -> {
java.sql.Date.valueOf(LocalDate.parse(date, DateTimeFormatter.ofPattern("dd/MM/yyyy")))
}
dateformat2.matches(date) -> {
java.sql.Date.valueOf(LocalDate.parse(date, DateTimeFormatter.ofPattern("dd-MM-yyyy")))
}
dateformat3.matches(date) -> {
java.sql.Date.valueOf(LocalDate.parse(date, DateTimeFormatter.ofPattern("yyyy/MM/dd")))
}
dateformat4.matches(date) -> {
java.sql.Date.valueOf(LocalDate.parse(date, DateTimeFormatter.ofPattern("yyyy-MM-dd")))
}
else -> null
}
if (valid_date!=null){
val statement = if (filter.isNullOrEmpty()){
connection.prepareStatement("SELECT * FROM ${super.dbName} WHERE COALESCE(STR_TO_DATE(date,'%d/%m/%Y'), STR_TO_DATE(date,'%d-%m-%Y'), STR_TO_DATE(date,'%Y/%m/%d'), STR_TO_DATE(date,'%Y-%m-%d')) = ?")
} else {
connection.prepareStatement("SELECT * FROM ${super.dbName} WHERE COALESCE(STR_TO_DATE(date,'%d/%m/%Y'), STR_TO_DATE(date,'%d-%m-%Y'), STR_TO_DATE(date,'%Y/%m/%d'), STR_TO_DATE(date,'%Y-%m-%d')) = ? AND description LIKE ?")
}
statement?.setDate(1, valid_date)
if (!filter.isNullOrEmpty()){
statement?.setString(2, "%$filter%")
}
val resultSet = statement?.executeQuery()
val tempList = ArrayList<LogSemiauto>()
while (resultSet?.next() == true) {
val log = LogSemiauto(
resultSet.getLong("index").toULong(),
resultSet.getString("date"),
resultSet.getString("time"),
resultSet.getString("source"),
resultSet.getString("description")
)
tempList.add(log)
}
cbOK?.accept(tempList)
} else throw Exception("Invalid date")
} catch (e : Exception){
if (filter.isNullOrEmpty()){
cbFail?.accept("Failed to Get logs for date $date: ${e.message}")
} else {
cbFail?.accept("Failed to Get logs for date $date with filter $filter: ${e.message}")
}
}
}
override fun AddAll(data: ArrayList<LogSemiauto>): Boolean {
try{
val statement = connection.prepareStatement("INSERT INTO ${super.dbName} (date, time, source, description) VALUES (?, ?, ?, ?)")
for (log in data) {
statement.setString(1, log.date)
statement.setString(2, log.time)
statement.setString(3, log.source)
statement.setString(4, log.description)
statement.addBatch()
}
val rowsAffected = statement.executeBatch()
if (rowsAffected.isNotEmpty()) {
return true
} else throw Exception("Failed to add logsemiauto entries: $data")
} catch (e : Exception){
Logger.error { "Error adding logsemiauto entries: ${e.message}" }
return false
}
}
override fun UpdateByIndex(index: Int, data: LogSemiauto): Boolean {
try{
val statement = connection.prepareStatement("UPDATE ${super.dbName} SET date = ?, time = ?, source = ?, description = ? WHERE `index` = ?")
statement.setString(1, data.date)
statement.setString(2, data.time)
statement.setString(3, data.source)
statement.setString(4, data.description)
statement.setInt(5, index)
val rowsAffected = statement.executeUpdate()
if (rowsAffected > 0) {
return true
} else throw Exception("Failed to update logsemiauto entry at index $index: $data")
} catch (e : Exception){
Logger.error { "Error updating logsemiauto entry at index $index: ${e.message}" }
return false
}
}
override fun Resort(): Boolean {
try{
val statement = connection.createStatement()
val tempdb_name = "temp_${super.dbName}"
// use a temporary table to reorder the index
statement?.executeUpdate("CREATE TABLE IF NOT EXISTS $tempdb_name LIKE ${super.dbName}")
statement?.executeUpdate("TRUNCATE TABLE $tempdb_name")
statement?.executeUpdate(
"INSERT INTO $tempdb_name (date, time, source, description) " +
"SELECT date, time, source, description FROM ${super.dbName} " +
"ORDER BY date , time , source "
)
statement?.executeUpdate("TRUNCATE TABLE ${super.dbName}")
statement?.executeUpdate(
"INSERT INTO ${super.dbName} (date, time, source, description) " +
"SELECT date, time, source, description FROM $tempdb_name"
)
statement?.executeUpdate("DROP TABLE $tempdb_name")
Logger.info("${super.dbName} table resorted by date, time, source" as Any)
// reload the local list
Get()
return true
} catch (e : Exception){
Logger.error { "Error resorting logsemiauto table: ${e.message}" }
return false
}
}
override fun Import_XLSX(workbook: XSSFWorkbook): Boolean {
throw Exception("Importing LogSemiauto from XLSX is not supported")
}
override fun Export_XLSX(): XSSFWorkbook? {
try{
val statement = connection.createStatement()
val resultSet = statement?.executeQuery("SELECT * FROM ${super.dbName}")
val workbook = XSSFWorkbook()
val sheet = workbook.createSheet("LogSemiauto")
val headerRow = sheet.createRow(0)
val headers = arrayOf("Index", "date", "time", "source", "description")
for ((colIndex, header) in headers.withIndex()) {
val cell = headerRow.createCell(colIndex)
cell.setCellValue(header)
}
var rowIndex = 1
while (resultSet?.next() == true) {
val row = sheet.createRow(rowIndex++)
row.createCell(0).setCellValue(resultSet.getString("index"))
row.createCell(1).setCellValue(resultSet.getString("date"))
row.createCell(2).setCellValue(resultSet.getString("time"))
row.createCell(3).setCellValue(resultSet.getString("source"))
row.createCell(4).setCellValue(resultSet.getString("description"))
}
for (i in headers.indices) {
sheet.autoSizeColumn(i)
}
return workbook
} catch (e : Exception){
Logger.error { "Error exporting LogSemiauto, Msg: ${e.message}" }
return null
}
}
}

235
src/database/Table_Logs.kt Normal file
View File

@@ -0,0 +1,235 @@
package database
import org.apache.poi.xssf.usermodel.XSSFWorkbook
import org.tinylog.Logger
import java.sql.Connection
import java.time.LocalDate
import java.time.format.DateTimeFormatter
import java.util.function.Consumer
class Table_Logs(connection: Connection) : dbFunctions<Log> ("logs", connection,listOf("index", "datenya", "timenya", "machine", "description")) {
/**
* dateformat1 is regex for DD/MM/YYYY
*/
val dateformat1 = """^(0[1-9]|[12][0-9]|3[01])/(0[1-9]|1[0-2])/\d{4}$""".toRegex()
/**
* dateformat2 is regex for DD-MM-YYYY
*/
val dateformat2 = """^(0[1-9]|[12][0-9]|3[01])-(0[1-9]|1[0-2])-\d{4}$""".toRegex()
/**
* dateformat3 is regex for YYYY/MM/DD
*/
val dateformat3 = """^\d{4}/(0[1-9]|1[0-2])/(0[1-9]|[12][0-9]|3[01])$""".toRegex()
/**
* dateformat4 is regex for YYYY-MM-DD
*/
val dateformat4 = """^\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$""".toRegex()
override fun Create() {
val tabledefinition = "CREATE TABLE IF NOT EXISTS ${super.dbName} (" +
"`index` INT AUTO_INCREMENT PRIMARY KEY," +
"datenya VARCHAR(20) NOT NULL," + // format DD/MM/YYYY
"timenya VARCHAR(20) NOT NULL," + // format HH:MM:SS
"machine VARCHAR(45) NOT NULL," +
"description TEXT NOT NULL" +
")"
super.Create(tabledefinition)
}
fun GetLogForHtml(date: String, filter: String?, cbOK: Consumer<ArrayList<Log>>?, cbFail: Consumer<String>?){
try{
val valid_date : java.sql.Date? = when{
dateformat1.matches(date) -> {
java.sql.Date.valueOf(LocalDate.parse(date, DateTimeFormatter.ofPattern("dd/MM/yyyy")))
}
dateformat2.matches(date) -> {
java.sql.Date.valueOf(LocalDate.parse(date, DateTimeFormatter.ofPattern("dd-MM-yyyy")))
}
dateformat3.matches(date) -> {
java.sql.Date.valueOf(LocalDate.parse(date, DateTimeFormatter.ofPattern("yyyy/MM/dd")))
}
dateformat4.matches(date) -> {
java.sql.Date.valueOf(LocalDate.parse(date, DateTimeFormatter.ofPattern("yyyy-MM-dd")))
}
else -> null
}
if (valid_date!=null){
// use coalescing for different datenya formats
val statement = if (filter.isNullOrEmpty()){
connection.prepareStatement("SELECT * FROM ${super.dbName} WHERE COALESCE(STR_TO_DATE(datenya,'%d/%m/%Y'), STR_TO_DATE(datenya,'%d-%m-%Y'), STR_TO_DATE(datenya,'%Y/%m/%d'), STR_TO_DATE(datenya,'%Y-%m-%d')) = ?")
} else {
connection.prepareStatement("SELECT * FROM ${super.dbName} WHERE COALESCE(STR_TO_DATE(datenya,'%d/%m/%Y'), STR_TO_DATE(datenya,'%d-%m-%Y'), STR_TO_DATE(datenya,'%Y/%m/%d'), STR_TO_DATE(datenya,'%Y-%m-%d')) = ? AND description LIKE ?")
}
statement?.setDate(1, valid_date)
if (!filter.isNullOrEmpty()){
statement?.setString(2, "%$filter%")
}
val resultSet = statement?.executeQuery()
val tempList = ArrayList<Log>()
while (resultSet?.next() == true) {
val log = Log(
resultSet.getLong("index").toULong(),
resultSet.getString("datenya"),
resultSet.getString("timenya"),
resultSet.getString("machine"),
resultSet.getString("description")
)
tempList.add(log)
}
cbOK?.accept(tempList)
} else throw Exception("Invalid date")
} catch (e : Exception){
if (filter.isNullOrEmpty()){
cbFail?.accept("Failed to Get logs for date $date: ${e.message}")
} else {
cbFail?.accept("Failed to Get logs for date $date with filter $filter: ${e.message}")
}
}
}
override fun Get(cbOK: Consumer<Unit>?, cbFail: Consumer<String>?) {
List.clear()
try {
val statement = connection.createStatement()
val resultSet = statement?.executeQuery("SELECT * FROM ${super.dbName}")
while (resultSet?.next() == true) {
val log = Log(
resultSet.getLong("index").toULong(),
resultSet.getString("datenya"),
resultSet.getString("timenya"),
resultSet.getString("machine"),
resultSet.getString("description")
)
List.add(log)
}
cbOK?.accept(Unit)
} catch (e: Exception) {
cbFail?.accept("Error fetching ${super.dbName}: ${e.message}")
Logger.error("Error fetching ${super.dbName}: ${e.message}" as Any)
}
}
fun Add(machine: String, description: String): Boolean {
val log = Log.NewLog(machine, description)
return Add(log)
}
override fun Add(data: Log): Boolean {
try {
val statement =
connection.prepareStatement("INSERT INTO logs (datenya, timenya, machine, description) VALUES (?, ?, ?, ?)")
statement?.setString(1, data.datenya)
statement?.setString(2, data.timenya)
statement?.setString(3, data.machine)
statement?.setString(4, data.description)
val rowsAffected = statement?.executeUpdate()
if (rowsAffected != null && rowsAffected > 0) {
return true
} else {
Logger.warn{"Failed to add log entry : $data"}
}
} catch (e: Exception) {
Logger.error{"Error adding log entry: ${e.message}"}
}
return false
}
override fun AddAll(data: ArrayList<Log>): Boolean {
return try {
connection.autoCommit = false
val sql = "INSERT INTO logs (datenya, timenya, machine, description) VALUES (?, ?, ?, ?)"
val statement = connection.prepareStatement(sql)
for (log in data) {
statement.setString(1, log.datenya)
statement.setString(2, log.timenya)
statement.setString(3, log.machine)
statement.setString(4, log.description)
statement.addBatch()
}
statement.executeBatch()
connection.commit()
Logger.info("Bulk log insert successful: ${data.size} entries" as Any)
connection.autoCommit = true
true
} catch (e: Exception) {
Logger.error("Error adding log entries: ${e.message}" as Any)
false
}
}
override fun UpdateByIndex(index: Int, data: Log): Boolean {
throw Exception("Update not supported")
}
override fun Resort(): Boolean {
try {
val statement = connection.createStatement()
val tempdb_name = "temp_${super.dbName}"
// use a temporary table to reorder the index
statement?.executeUpdate("CREATE TABLE IF NOT EXISTS $tempdb_name LIKE ${super.dbName}")
statement?.executeUpdate("TRUNCATE TABLE $tempdb_name")
statement?.executeUpdate(
"INSERT INTO $tempdb_name (datenya, timenya, machine, description) " +
"SELECT datenya, timenya, machine, description FROM ${super.dbName} " +
"ORDER BY datenya , timenya , machine "
)
statement?.executeUpdate("TRUNCATE TABLE ${super.dbName}")
statement?.executeUpdate(
"INSERT INTO ${super.dbName} (datenya, timenya, machine, description) " +
"SELECT datenya, timenya, machine, description FROM $tempdb_name"
)
statement?.executeUpdate("DROP TABLE $tempdb_name")
Logger.info("${super.dbName} table resorted by datenya, timenya, machine" as Any)
// reload the local list
Get()
return true
} catch (e: Exception) {
Logger.error("Error resorting ${super.dbName} table by datenya, timenya, machine: ${e.message}" as Any)
}
return false
}
override fun Import_XLSX(workbook: XSSFWorkbook): Boolean {
throw Exception("Importing Logs from XLSX is not supported")
}
override fun Export_XLSX(): XSSFWorkbook? {
try {
val statement = connection.createStatement()
val resultSet = statement?.executeQuery("SELECT * FROM ${super.dbName}")
val workbook = XSSFWorkbook()
val sheet = workbook.createSheet("Log")
val headerRow = sheet.createRow(0)
val headers = arrayOf("Index", "datenya", "timenya", "machine", "description")
for ((colIndex, header) in headers.withIndex()) {
val cell = headerRow.createCell(colIndex)
cell.setCellValue(header)
}
var rowIndex = 1
while (resultSet?.next() == true) {
val row = sheet.createRow(rowIndex++)
row.createCell(0).setCellValue(resultSet.getString("index"))
row.createCell(1).setCellValue(resultSet.getString("datenya"))
row.createCell(2).setCellValue(resultSet.getString("timenya"))
row.createCell(3).setCellValue(resultSet.getString("machine"))
row.createCell(4).setCellValue(resultSet.getString("description"))
}
for (i in headers.indices) {
sheet.autoSizeColumn(i)
}
return workbook
} catch (e: Exception) {
Logger.error { "Error exporting Log, Msg: ${e.message}" }
}
return null
}
}

View File

@@ -9,7 +9,6 @@ import codes.Somecodes.Companion.GetUptime
import codes.Somecodes.Companion.ListAudioFiles import codes.Somecodes.Companion.ListAudioFiles
import codes.Somecodes.Companion.String_To_List import codes.Somecodes.Companion.String_To_List
import codes.Somecodes.Companion.ValiDateForLogHtml import codes.Somecodes.Companion.ValiDateForLogHtml
import codes.Somecodes.Companion.ValidDate
import codes.Somecodes.Companion.ValidDirectory import codes.Somecodes.Companion.ValidDirectory
import codes.Somecodes.Companion.ValidFile import codes.Somecodes.Companion.ValidFile
import codes.Somecodes.Companion.ValidIPV4 import codes.Somecodes.Companion.ValidIPV4
@@ -44,6 +43,7 @@ import java.nio.file.Files
import java.time.LocalDateTime import java.time.LocalDateTime
import codes.configKeys import codes.configKeys
import config import config
import database.LogSemiauto
import database.QueueTable import database.QueueTable
import google.GoogleTTS import google.GoogleTTS
import google.autoadd import google.autoadd
@@ -695,7 +695,8 @@ class WebApp(val listenPort: Int, var userlist: List<Pair<String, String>>, val
if (db.soundDB.DeleteByIndex(index.toInt())) { if (db.soundDB.DeleteByIndex(index.toInt())) {
db.soundDB.Resort() db.soundDB.Resort()
it.result(objectmapper.writeValueAsString(resultMessage("OK"))) it.result(objectmapper.writeValueAsString(resultMessage("OK")))
db.Add_Log("AAS", "Deleted sound bank with index $index")
db.logDB.Add("AAS", "Deleted sound bank with index $index")
} else { } else {
it.status(500) it.status(500)
.result(objectmapper.writeValueAsString(resultMessage("Failed to delete soundbank with index $index"))) .result(objectmapper.writeValueAsString(resultMessage("Failed to delete soundbank with index $index")))
@@ -908,7 +909,7 @@ class WebApp(val listenPort: Int, var userlist: List<Pair<String, String>>, val
if (db.messageDB.DeleteByIndex(index.toInt())) { if (db.messageDB.DeleteByIndex(index.toInt())) {
db.messageDB.Resort() db.messageDB.Resort()
it.result(objectmapper.writeValueAsString(resultMessage("OK"))) it.result(objectmapper.writeValueAsString(resultMessage("OK")))
db.Add_Log("AAS", "Deleted message bank with index $index") db.logDB.Add("AAS", "Deleted message bank with index $index")
} else { } else {
it.status(500) it.status(500)
.result(objectmapper.writeValueAsString(resultMessage("Failed to delete messagebank with index $index"))) .result(objectmapper.writeValueAsString(resultMessage("Failed to delete messagebank with index $index")))
@@ -1087,7 +1088,7 @@ class WebApp(val listenPort: Int, var userlist: List<Pair<String, String>>, val
if (db.languageDB.DeleteByIndex(index.toInt())) { if (db.languageDB.DeleteByIndex(index.toInt())) {
db.languageDB.Resort() db.languageDB.Resort()
it.result(objectmapper.writeValueAsString(resultMessage("OK"))) it.result(objectmapper.writeValueAsString(resultMessage("OK")))
db.Add_Log("AAS", "Deleted language link with index $index") db.logDB.Add("AAS", "Deleted language link with index $index")
} else { } else {
it.status(500) it.status(500)
.result(objectmapper.writeValueAsString(resultMessage("Failed to delete language link with index $index"))) .result(objectmapper.writeValueAsString(resultMessage("Failed to delete language link with index $index")))
@@ -1273,7 +1274,7 @@ class WebApp(val listenPort: Int, var userlist: List<Pair<String, String>>, val
if (db.scheduleDB.DeleteByIndex(index.toInt())) { if (db.scheduleDB.DeleteByIndex(index.toInt())) {
db.scheduleDB.Resort() db.scheduleDB.Resort()
it.result(objectmapper.writeValueAsString(resultMessage("OK"))) it.result(objectmapper.writeValueAsString(resultMessage("OK")))
db.Add_Log("AAS", "Deleted schedule bank with index $index") db.logDB.Add("AAS", "Deleted schedule bank with index $index")
} else { } else {
it.status(500) it.status(500)
.result(objectmapper.writeValueAsString(resultMessage("Failed to delete schedule with index $index"))) .result(objectmapper.writeValueAsString(resultMessage("Failed to delete schedule with index $index")))
@@ -1521,7 +1522,7 @@ class WebApp(val listenPort: Int, var userlist: List<Pair<String, String>>, val
if (db.userDB.DeleteByIndex(index.toInt())) { if (db.userDB.DeleteByIndex(index.toInt())) {
db.userDB.Resort() db.userDB.Resort()
it.result(objectmapper.writeValueAsString(resultMessage("OK"))) it.result(objectmapper.writeValueAsString(resultMessage("OK")))
db.Add_Log("AAS", "Deleted user with index $index") db.logDB.Add("AAS", "Deleted user with index $index")
} else it.status(500) } else it.status(500)
.result(objectmapper.writeValueAsString(resultMessage("Failed to delete user with index $index"))) .result(objectmapper.writeValueAsString(resultMessage("Failed to delete user with index $index")))
} }
@@ -1728,23 +1729,12 @@ class WebApp(val listenPort: Int, var userlist: List<Pair<String, String>>, val
path("Log") { path("Log") {
get("List") { get1 -> get("List") { get1 ->
val logdate = get1.queryParam("date") ?: "" val logdate = get1.queryParam("date") ?: ""
val logfilter = get1.queryParam("filter") ?: "" val logfilter = get1.queryParam("filter")
if (ValiDateForLogHtml(logdate)) { db.logDB.GetLogForHtml(logdate, logfilter, { loglist ->
if (ValidString(logfilter)) { get1.result(objectmapper.writeValueAsString(loglist))
// ada log filter }, { msgFail ->
get1.status(500).result(objectmapper.writeValueAsString(resultMessage(msgFail)))
db.GetLogForHtml(logdate, logfilter) { })
get1.result(MariaDB.ArrayListtoString(it))
}
} else {
db.GetLogForHtml(logdate) {
get1.result(MariaDB.ArrayListtoString(it))
}
}
} else {
get1.status(400)
.result(objectmapper.writeValueAsString(resultMessage("Invalid logdate")))
}
} }
get("ExportXLSX") { get1 -> get("ExportXLSX") { get1 ->
val logdate = get1.queryParam("date") ?: "" val logdate = get1.queryParam("date") ?: ""
@@ -1833,7 +1823,7 @@ class WebApp(val listenPort: Int, var userlist: List<Pair<String, String>>, val
if (db.broadcastDB.DeleteByIndex(index.toInt())) { if (db.broadcastDB.DeleteByIndex(index.toInt())) {
db.broadcastDB.Resort() db.broadcastDB.Resort()
it.result(objectmapper.writeValueAsString(resultMessage("OK"))) it.result(objectmapper.writeValueAsString(resultMessage("OK")))
db.Add_Log("AAS", "Deleted broadcast zone with index $index") db.logDB.Add("AAS", "Deleted broadcast zone with index $index")
} else { } else {
it.status(500) it.status(500)
.result(objectmapper.writeValueAsString(resultMessage("Failed to delete broadcast zone with index $index"))) .result(objectmapper.writeValueAsString(resultMessage("Failed to delete broadcast zone with index $index")))
@@ -2096,7 +2086,7 @@ class WebApp(val listenPort: Int, var userlist: List<Pair<String, String>>, val
if (db.queuepagingDB.DeleteByIndex(index.toInt())) { if (db.queuepagingDB.DeleteByIndex(index.toInt())) {
db.queuepagingDB.Resort() db.queuepagingDB.Resort()
it.result(objectmapper.writeValueAsString(resultMessage("OK"))) it.result(objectmapper.writeValueAsString(resultMessage("OK")))
db.Add_Log("AAS", "Deleted queue paging with index $index") db.logDB.Add("AAS", "Deleted queue paging with index $index")
} else { } else {
it.status(500) it.status(500)
.result(objectmapper.writeValueAsString(resultMessage("Failed to delete queue paging with index $index"))) .result(objectmapper.writeValueAsString(resultMessage("Failed to delete queue paging with index $index")))
@@ -2135,7 +2125,7 @@ class WebApp(val listenPort: Int, var userlist: List<Pair<String, String>>, val
if (db.queuetableDB.DeleteByIndex(index.toInt())) { if (db.queuetableDB.DeleteByIndex(index.toInt())) {
db.queuetableDB.Resort() db.queuetableDB.Resort()
it.result(objectmapper.writeValueAsString(resultMessage("OK"))) it.result(objectmapper.writeValueAsString(resultMessage("OK")))
db.Add_Log("AAS", "Deleted queue sound with index $index") db.logDB.Add("AAS", "Deleted queue sound with index $index")
} else { } else {
it.status(500) it.status(500)
@@ -2423,7 +2413,7 @@ class WebApp(val listenPort: Int, var userlist: List<Pair<String, String>>, val
_config.Set(configKeys.DEFAULT_VOICE_TYPE.key, defaultvoice) _config.Set(configKeys.DEFAULT_VOICE_TYPE.key, defaultvoice)
_config.Save() _config.Save()
Logger.info { "Changed FIS Codes" } Logger.info { "Changed FIS Codes" }
db.Add_Log( db.logDB.Add(
"AAS", "AAS",
"Save FIS Codes Message: GOP=$_gop, GBD=$_gbd, GFC=$_gfc, FLD=$_fld, DefaultVoice=$defaultvoice" "Save FIS Codes Message: GOP=$_gop, GBD=$_gbd, GFC=$_gfc, FLD=$_fld, DefaultVoice=$defaultvoice"
) )
@@ -2503,6 +2493,8 @@ class WebApp(val listenPort: Int, var userlist: List<Pair<String, String>>, val
if (user != null) { if (user != null) {
it.cookie("semiauto-user", user.username) it.cookie("semiauto-user", user.username)
it.redirect("index.html") it.redirect("index.html")
db.logSemiAuto.Add(LogSemiauto.NewLog("SEMIAUTOWEB", "User logged in: ${user.username} from ip ${it.ip()}"))
} else ResultMessageString(it, 400, "Invalid username or password") } else ResultMessageString(it, 400, "Invalid username or password")
} else ResultMessageString(it, 400, "Username or password cannot be empty") } else ResultMessageString(it, 400, "Username or password cannot be empty")
} }
@@ -2588,6 +2580,7 @@ class WebApp(val listenPort: Int, var userlist: List<Pair<String, String>>, val
} }
ctx.result(objectmapper.writeValueAsString(result)) ctx.result(objectmapper.writeValueAsString(result))
db.logSemiAuto.Add(LogSemiauto.NewLog("SEMIAUTOWEB", "Initialized Web variables for user: ${user.username}"))
} else ResultMessageString(ctx, 400, "User not found") } else ResultMessageString(ctx, 400, "User not found")
} else ResultMessageString(ctx, 400, "Username is empty") } else ResultMessageString(ctx, 400, "Username is empty")
} }
@@ -2619,6 +2612,7 @@ class WebApp(val listenPort: Int, var userlist: List<Pair<String, String>>, val
db.queuetableDB.Resort() db.queuetableDB.Resort()
Logger.info { "SemiAutoWeb added to queue table: $qt" } Logger.info { "SemiAutoWeb added to queue table: $qt" }
ctx.result(objectmapper.writeValueAsString(resultMessage("OK"))) ctx.result(objectmapper.writeValueAsString(resultMessage("OK")))
db.logSemiAuto.Add(LogSemiauto.NewLog("SEMIAUTOWEB", "Added to queue table: $qt"))
} else ResultMessageString(ctx, 500, "Failed to add to queue table") } else ResultMessageString(ctx, 500, "Failed to add to queue table")
} else ResultMessageString(ctx, 400, "Broadcast zones cannot be empty") } else ResultMessageString(ctx, 400, "Broadcast zones cannot be empty")
} else ResultMessageString(ctx, 400, "Tags cannot be empty") } else ResultMessageString(ctx, 400, "Tags cannot be empty")
@@ -2650,19 +2644,18 @@ class WebApp(val listenPort: Int, var userlist: List<Pair<String, String>>, val
.result(objectmapper.writeValueAsString(resultMessage("Failed to export log to XLSX"))) .result(objectmapper.writeValueAsString(resultMessage("Failed to export log to XLSX")))
} }
} else get1.status(400) } else get1.status(400)
.result(objectmapper.writeValueAsString(resultMessage("Invalid logdate"))) .result(objectmapper.writeValueAsString(resultMessage("Invalid date format must be dd-MM-yyyy")))
} }
path("Log") { path("Log") {
get("/{datelog}") { ctx -> get("/{datelog}") { ctx ->
val datelog = ctx.pathParam("datelog") val datelog = ctx.pathParam("datelog")
println("Request log for date: $datelog") println("Request log for date: $datelog")
if (ValiDateForLogHtml(datelog)) { db.logSemiAuto.GetLogSemiAutoForHtml(datelog, null, {
db.GetLogForHtml(datelog) { loghtml -> ctx.result(MariaDB.ArrayListtoString(it))
val resultstring = objectmapper.writeValueAsString(loghtml) },{ err ->
ctx.result(resultstring) ctx.status(500).result(objectmapper.writeValueAsString(resultMessage(err)))
} })
} else ResultMessageString(ctx, 400, "Invalid date format")
} }
} }
} }