diff --git a/Content.Tests/DMProject/Tests/Database/clear.dm b/Content.Tests/DMProject/Tests/Database/clear.dm index 5790d9d641..749740f782 100644 --- a/Content.Tests/DMProject/Tests/Database/clear.dm +++ b/Content.Tests/DMProject/Tests/Database/clear.dm @@ -8,7 +8,7 @@ query.Add() // Execute without a command does nothing - query.Execute() + query.Execute(db) // and shouldn't report an error ASSERT(!query.Error()) diff --git a/Content.Tests/DMProject/Tests/Database/no_entries.dm b/Content.Tests/DMProject/Tests/Database/no_entries.dm index b8cf21b832..5bdbacaeb7 100644 --- a/Content.Tests/DMProject/Tests/Database/no_entries.dm +++ b/Content.Tests/DMProject/Tests/Database/no_entries.dm @@ -6,11 +6,10 @@ query.Add("SELECT * FROM foobar") query.Execute(db) - query.NextRow() + ASSERT(!query.NextRow()) - query.GetRowData() - - ASSERT(query.Error() && query.ErrorMsg()) + ASSERT(query.GetRowData()["id"] == null) + ASSERT(!query.Error()) del(query) del(db) diff --git a/Content.Tests/DMProject/Tests/Database/read.dm b/Content.Tests/DMProject/Tests/Database/read.dm index 8da6dece5a..65ff1092de 100644 --- a/Content.Tests/DMProject/Tests/Database/read.dm +++ b/Content.Tests/DMProject/Tests/Database/read.dm @@ -20,22 +20,21 @@ ASSERT(assoc["name"] == "foo") ASSERT(assoc["points"] == 1.5) - ASSERT(query.GetColumn(0) == 1) - ASSERT(query.GetColumn(1) == "foo") - ASSERT(query.GetColumn(2) == 1.5) + ASSERT(query.GetColumn(1) == 1) + ASSERT(query.GetColumn(2) == "foo") + ASSERT(query.GetColumn(3) == 1.5) var/list/columns = query.Columns() ASSERT(columns[1] == "id") ASSERT(columns[2] == "name") ASSERT(columns[3] == "points") - ASSERT(query.Columns(0) == "id") - ASSERT(query.Columns(1) == "name") - ASSERT(query.Columns(2) == "points") + ASSERT(query.Columns(1) == "id") + ASSERT(query.Columns(2) == "name") + ASSERT(query.Columns(3) == "points") ASSERT(!query.Columns(10)) - - ASSERT(query.Error() && query.ErrorMsg()) + ASSERT(!query.Error()) query.Close() db.Close() @@ -46,10 +45,10 @@ query.Execute(db) query.NextRow() - ASSERT(query.GetColumn(0) == 1) + ASSERT(query.GetColumn(1) == 1) ASSERT(!query.GetColumn(10)) - ASSERT(query.Error() && query.ErrorMsg()) + ASSERT(!query.Error()) del(query) del(db) diff --git a/OpenDreamRuntime/DreamManager.cs b/OpenDreamRuntime/DreamManager.cs index 2eb1bf7b5b..e527ae76c1 100644 --- a/OpenDreamRuntime/DreamManager.cs +++ b/OpenDreamRuntime/DreamManager.cs @@ -65,6 +65,7 @@ public void PreInitialize(string? jsonPath) { _sawmill = Logger.GetSawmill("opendream"); ListPoolThreshold = _config.GetCVar(OpenDreamCVars.ListPoolThreshold); ListPoolSize = _config.GetCVar(OpenDreamCVars.ListPoolSize); + ByondApi.ByondApi.Initialize(this, _refManager, _atomManager, _dreamMapManager, _objectTree); InitializeConnectionManager(); diff --git a/OpenDreamRuntime/Objects/Types/DreamObjectDatabaseQuery.cs b/OpenDreamRuntime/Objects/Types/DreamObjectDatabaseQuery.cs index 2ab4e3f7ee..4457d2c63e 100644 --- a/OpenDreamRuntime/Objects/Types/DreamObjectDatabaseQuery.cs +++ b/OpenDreamRuntime/Objects/Types/DreamObjectDatabaseQuery.cs @@ -8,6 +8,8 @@ public sealed class DreamObjectDatabaseQuery(DreamObjectDefinition objectDefinit private SqliteCommand? _command; private SqliteDataReader? _reader; + public DreamObjectDatabase? DreamObjectDatabase; + private string? _errorMessage; private int? _errorCode; @@ -29,6 +31,7 @@ protected override void HandleDeletion(bool possiblyThreaded) { ClearCommand(); CloseReader(); + DreamObjectDatabase = null; base.HandleDeletion(possiblyThreaded); } @@ -98,12 +101,13 @@ public DreamValue GetColumn(int id) { return DreamValue.Null; } + id = Math.Max(--id, 0); + try { var name = _reader.GetName(id); return new DreamValue(name); } catch (IndexOutOfRangeException exception) { - _errorCode = 1; - _errorMessage = exception.Message; + // BYOND just ignores this, and doesn't report it to Error() or ErrorMsg() } return DreamValue.Null; @@ -130,12 +134,14 @@ public void CloseReader() { /// /// Executes the currently held query against the SQLite database /// - /// The that this query is being run against. + /// The that this query is being run against. public void ExecuteCommand(DreamObjectDatabase database) { if (!database.TryGetConnection(out var connection)) { throw new DMCrashRuntime("Bad database"); } + DreamObjectDatabase = database; + if (_command == null) { return; } @@ -167,12 +173,13 @@ public bool TryGetColumn(int column, out DreamValue value) { return false; } + column = Math.Max(--column, 0); + try { value = GetDreamValueFromDbObject(_reader.GetValue(column)); return true; } catch (Exception exception) { - _errorCode = 1; - _errorMessage = exception.Message; + // DM ignores any errors here, and just returns null } value = DreamValue.Null; @@ -194,8 +201,8 @@ public bool TryGetColumn(int column, out DreamValue value) { dict[name] = GetDreamValueFromDbObject(value); } } catch (InvalidOperationException exception) { - _errorCode = 1; - _errorMessage = exception.Message; + // DM does not care for "no data" errors + // and does not report if this happens } return dict; diff --git a/OpenDreamRuntime/Procs/Native/DreamProcNativeDatabaseQuery.cs b/OpenDreamRuntime/Procs/Native/DreamProcNativeDatabaseQuery.cs index 85dba06989..428339bf62 100644 --- a/OpenDreamRuntime/Procs/Native/DreamProcNativeDatabaseQuery.cs +++ b/OpenDreamRuntime/Procs/Native/DreamProcNativeDatabaseQuery.cs @@ -81,7 +81,11 @@ public static DreamValue NativeProc_Execute(NativeProc.Bundle bundle, DreamObjec var query = (DreamObjectDatabaseQuery)src!; if (!bundle.GetArgument(0, "database").TryGetValueAsDreamObject(out DreamObjectDatabase? database)) - return DreamValue.Null; + if (query.DreamObjectDatabase != null) { + database = query.DreamObjectDatabase; + } else { + throw new DMCrashRuntime("Bad Database: no database provided"); + } query.ExecuteCommand(database);