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);