Skip to content

Commit 4d78d80

Browse files
authored
[java-shell] fix "show collections" command (it always uses "test" database) (#374)
1 parent b709e3e commit 4d78d80

File tree

4 files changed

+26
-7
lines changed

4 files changed

+26
-7
lines changed

packages/java-shell/src/main/kotlin/com/mongodb/mongosh/MongoShellContext.kt

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ internal class MongoShellContext(client: MongoClient) {
3535
private var ctx: Context? = Context.create()
3636
private val serviceProvider = JavaServiceProvider(client, this)
3737
private val shellEvaluator: Value
38+
private val shellInternalState: Value
3839
private val bsonTypes: BsonTypes
3940

4041
/** Java functions don't have js methods such as apply, bind, call etc.
@@ -48,7 +49,7 @@ internal class MongoShellContext(client: MongoClient) {
4849
val context = ctx.getBindings("js")
4950
val global = context["_global"]!!
5051
context.removeMember("_global")
51-
val shellInternalState = global.getMember("ShellInternalState").newInstance(serviceProvider)
52+
shellInternalState = global.getMember("ShellInternalState").newInstance(serviceProvider)
5253
shellEvaluator = global.getMember("ShellEvaluator").newInstance(shellInternalState)
5354
val jsSymbol = context["Symbol"]!!
5455
shellInternalState.invokeMember("setCtx", context)
@@ -253,12 +254,23 @@ internal class MongoShellContext(client: MongoClient) {
253254
}
254255

255256
fun eval(@Language("js") script: String, name: String): Value {
257+
updateDatabase()
256258
val originalEval = ProxyExecutable { args ->
257259
evalInner(args[0].asString(), name)
258260
}
259261
return shellEvaluator.invokeMember("customEval", originalEval, script)
260262
}
261263

264+
private fun updateDatabase() {
265+
// graaljs does not allow to define property on top context, so we need to update internal state manually
266+
val currentDb = evalInner("db")
267+
val currentDbName = currentDb.invokeMember("getName").asString()
268+
val stateDbName = shellInternalState["currentDb"]?.invokeMember("getName")?.asString()
269+
if (currentDbName != stateDbName) {
270+
shellInternalState.invokeMember("setDbFunc", currentDb)
271+
}
272+
}
273+
262274
fun <T> toJsPromise(promise: Either<T>): Value {
263275
return when (promise) {
264276
is Right -> evalInner("(v) => new Promise(((resolve) => resolve(v)))", "resolved_promise_script").execute(toJs(promise.value))
Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
1-
ArrayResult
1+
{ "acknowledged": true, "insertedIds": [ ] }
2+
[ "coll" ]
Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,8 @@
1-
// command dontCheckValue
1+
// before
2+
use test_show_collections
3+
// command
4+
db.coll.insert({});
5+
// command
26
show collections
7+
// clear
8+
db.coll.drop();

packages/shell-api/src/shell-internal-state.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import {
1212
} from './index';
1313
import constructShellBson from './shell-bson';
1414
import { EventEmitter } from 'events';
15-
import { Document, ServiceProvider, DEFAULT_DB } from '@mongosh/service-provider-core';
15+
import { Document, ServiceProvider, DEFAULT_DB, ReplPlatform } from '@mongosh/service-provider-core';
1616
import { MongoshInvalidInputError } from '@mongosh/errors';
1717
import AsyncWriter from '@mongosh/async-rewriter';
1818
import { toIgnore } from './decorators';
@@ -137,14 +137,14 @@ export default class ShellInternalState {
137137
return this.setDbFunc(newDb);
138138
};
139139

140-
try {
140+
if (this.initialServiceProvider.platform === ReplPlatform.JavaShell) {
141+
contextObject.db = this.setDbFunc(this.currentDb); // java shell, can't use getters/setters
142+
} else {
141143
Object.defineProperty(contextObject, 'db', {
142144
configurable: true,
143145
set: setFunc,
144146
get: () => (this.currentDb)
145147
});
146-
} catch (e) { // java shell, can't use getters/setters
147-
contextObject.db = this.setDbFunc(this.currentDb);
148148
}
149149

150150
this.messageBus.emit(

0 commit comments

Comments
 (0)