Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ internal class MongoShellContext(client: MongoClient) {
private var ctx: Context? = Context.create()
private val serviceProvider = JavaServiceProvider(client, this)
private val shellEvaluator: Value
private val shellInternalState: Value
private val bsonTypes: BsonTypes

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

fun eval(@Language("js") script: String, name: String): Value {
updateDatabase()
val originalEval = ProxyExecutable { args ->
evalInner(args[0].asString(), name)
}
return shellEvaluator.invokeMember("customEval", originalEval, script)
}

private fun updateDatabase() {
// graaljs does not allow to define property on top context, so we need to update internal state manually
val currentDb = evalInner("db")
val currentDbName = currentDb.invokeMember("getName").asString()
val stateDbName = shellInternalState["currentDb"]?.invokeMember("getName")?.asString()
if (currentDbName != stateDbName) {
shellInternalState.invokeMember("setDbFunc", currentDb)
}
}

fun <T> toJsPromise(promise: Either<T>): Value {
return when (promise) {
is Right -> evalInner("(v) => new Promise(((resolve) => resolve(v)))", "resolved_promise_script").execute(toJs(promise.value))
Expand Down
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
ArrayResult
{ "acknowledged": true, "insertedIds": [ ] }
[ "coll" ]
8 changes: 7 additions & 1 deletion packages/java-shell/src/test/resources/db/showCollections.js
Original file line number Diff line number Diff line change
@@ -1,2 +1,8 @@
// command dontCheckValue
// before
use test_show_collections
// command
db.coll.insert({});
// command
show collections
// clear
db.coll.drop();
8 changes: 4 additions & 4 deletions packages/shell-api/src/shell-internal-state.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ import {
} from './index';
import constructShellBson from './shell-bson';
import { EventEmitter } from 'events';
import { Document, ServiceProvider, DEFAULT_DB } from '@mongosh/service-provider-core';
import { Document, ServiceProvider, DEFAULT_DB, ReplPlatform } from '@mongosh/service-provider-core';
import { MongoshInvalidInputError } from '@mongosh/errors';
import AsyncWriter from '@mongosh/async-rewriter';
import { toIgnore } from './decorators';
Expand Down Expand Up @@ -137,14 +137,14 @@ export default class ShellInternalState {
return this.setDbFunc(newDb);
};

try {
if (this.initialServiceProvider.platform === ReplPlatform.JavaShell) {
contextObject.db = this.setDbFunc(this.currentDb); // java shell, can't use getters/setters
} else {
Object.defineProperty(contextObject, 'db', {
configurable: true,
set: setFunc,
get: () => (this.currentDb)
});
} catch (e) { // java shell, can't use getters/setters
contextObject.db = this.setDbFunc(this.currentDb);
}

this.messageBus.emit(
Expand Down