rethinkdb-java icon indicating copy to clipboard operation
rethinkdb-java copied to clipboard

Expected type DATUM but found DATABASE after use of conn.use("database_name")

Open jlove-nz opened this issue 9 years ago • 5 comments

Using Groovy, I have a function that performs the following steps (pseudocode):

def conn = r.connection().connect() def validate (Connection conn) { 1 check rethink database list 2 if isn't on the list, create it. 3 conn.use ("my database") 4 check table list 5 if "table a" isn't on the list, create it. }

However, at step 4, where it uses:

r.tableList().run (conn)

I get in my logs:

23:19:16.939 [vert.x-eventloop-thread-1] DEBUG com.rethinkdb.ast.Query - JSON Send: Token: 4 [1,[62,[]],{"db":[14,[[14,["mydb"]]]],"read_mode":"majority","durability":"hard"}] 23:19:16.940 [pool-1-thread-1] DEBUG com.rethinkdb.ast.Query - JSON Recv: Token: 4 {"t":18,"e":3000000,"r":["Expected type DATUM but found DATABASE:\ndb("mydb")"],"b":[]}

It would appear that somehow the 'use' command is causing the database buffer to be set incorrectly. Without the conn.use("my database"), the table creation works, however it creates the table against the test database instead of "my database" (which is expected behavour).

jlove-nz avatar Jul 16 '16 11:07 jlove-nz

Right, I've been doing more testing.

It turns out this occurs if I add OptArgs.of("durability", "hard").with("read_mode", "majority") to the tablesList().run() request.

If I remove that OptArgs line (which is actually a shared object I reuse, it works.

jlove-nz avatar Jul 16 '16 11:07 jlove-nz

@jlove-nz What option do you pass into conn.use exactly? Are you passing a string (conn.use("name")) or an object of the type r.db("name") (conn.use(r.db("name")))? It looks like it needs to be the former.

danielmewes avatar Jul 18 '16 23:07 danielmewes

Hi Daniel, It's definitely a string -

class DatabaseValidator {
    String database_name = "n2ocs"
    ...
    Connection c = ....
    c.use (this.database_name)
}

jlove-nz avatar Jul 18 '16 23:07 jlove-nz

Ok. I wonder if something goes wrong due to the shared OptArgs object then. I think if you call .with, that modifies the object in place. Are you adding a db optarg anywhere in your code?

danielmewes avatar Jul 19 '16 00:07 danielmewes

yes, I have this: public static final OptArgs HARD_MAJORITY = OptArgs.of("durability", "hard").with("read_mode", "majority") defined, and the code as using this when performing actions - e.g: def result = r.tableCreate("audit_table_updates").optArg("durability", "hard").run (conn, HARD_MAJORITY)

jlove-nz avatar Jul 19 '16 00:07 jlove-nz