Skip to content

Commit 04753e6

Browse files
committed
Distributed: fixed issue found by Rob on serialization of parameters for commands
1 parent 86329c9 commit 04753e6

4 files changed

Lines changed: 49 additions & 42 deletions

File tree

core/src/main/java/com/orientechnologies/orient/core/command/OCommandRequest.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,6 @@
2121
* Generic GOF command pattern implementation. Execute a command passing the optional arguments "iArgs" and returns an Object.
2222
*
2323
* @author Luca Garulli
24-
*
25-
* @param <T>
2624
*/
2725
public interface OCommandRequest {
2826
public <RET> RET execute(Object... iArgs);

core/src/main/java/com/orientechnologies/orient/core/sql/OCommandParameters.java

Lines changed: 31 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -25,49 +25,46 @@
2525
*
2626
* @author Luca Garulli
2727
*
28-
* @param <K>
29-
* @param <V>
3028
*/
3129
public class OCommandParameters implements Iterable<Map.Entry<Object, Object>> {
32-
private final Map<Object, Object> parameters;
33-
private int counter = 0;
30+
private final Map<Object, Object> parameters;
31+
private int counter = 0;
3432

35-
public OCommandParameters() {
36-
parameters = new HashMap<Object, Object>();
37-
}
33+
public OCommandParameters() {
34+
parameters = new HashMap<Object, Object>();
35+
}
3836

39-
public OCommandParameters(final Map<Object, Object> iArgs) {
40-
if (iArgs != null)
41-
parameters = iArgs;
42-
else
43-
parameters = new HashMap<Object, Object>();
44-
}
37+
public OCommandParameters(final Map<Object, Object> iArgs) {
38+
if (iArgs != null)
39+
parameters = iArgs;
40+
else
41+
parameters = new HashMap<Object, Object>();
42+
}
4543

46-
public void putArgument(final Object k, final Object v) {
47-
parameters.put(k, v);
48-
}
44+
public void set(final Object k, final Object v) {
45+
parameters.put(k, v);
46+
}
4947

50-
public Object getByName(final Object iName) {
51-
return parameters.get(iName);
52-
}
48+
public Object getByName(final Object iName) {
49+
return parameters.get(iName);
50+
}
5351

54-
public Object getNext() {
55-
if (parameters.size() <= counter)
56-
throw new IndexOutOfBoundsException("No enough parameters are passed. You requested parameter " + counter + " but only "
57-
+ parameters.size() + " was found");
52+
public Object getNext() {
53+
if (parameters.size() <= counter)
54+
throw new IndexOutOfBoundsException("Parameter " + counter + " not found. Total parameters received: " + parameters.size());
5855

59-
return parameters.get(counter++);
60-
}
56+
return parameters.get(counter++);
57+
}
6158

62-
public Iterator<Entry<Object, Object>> iterator() {
63-
return parameters.entrySet().iterator();
64-
}
59+
public Iterator<Entry<Object, Object>> iterator() {
60+
return parameters.entrySet().iterator();
61+
}
6562

66-
public int size() {
67-
return parameters.size();
68-
}
63+
public int size() {
64+
return parameters.size();
65+
}
6966

70-
public void reset() {
71-
counter = 0;
72-
}
67+
public void reset() {
68+
counter = 0;
69+
}
7370
}

server/src/main/java/com/orientechnologies/orient/server/distributed/ODistributedStorage.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -172,7 +172,7 @@ public Object command(final OCommandRequestText iCommand) {
172172
// REPLICATE IT
173173
// final OAbstractRemoteTask task = exec instanceof OCommandExecutorSQLResultsetAbstract ? new OMapReduceCommandTask(
174174
// iCommand.getText()) : new OSQLCommandTask(iCommand.getText());
175-
final OAbstractRemoteTask task = new OSQLCommandTask(iCommand.getText());
175+
final OAbstractRemoteTask task = new OSQLCommandTask(iCommand);
176176

177177
final Object result = sendRequest(getName(), null, task, EXECUTION_MODE.RESPONSE);
178178

server/src/main/java/com/orientechnologies/orient/server/distributed/task/OSQLCommandTask.java

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515
*/
1616
package com.orientechnologies.orient.server.distributed.task;
1717

18+
import com.orientechnologies.orient.core.command.OCommandRequest;
19+
import com.orientechnologies.orient.core.command.OCommandRequestText;
1820
import com.orientechnologies.orient.core.config.OGlobalConfiguration;
1921
import com.orientechnologies.orient.core.db.document.ODatabaseDocumentTx;
2022
import com.orientechnologies.orient.core.sql.OCommandSQL;
@@ -26,6 +28,7 @@
2628
import java.io.IOException;
2729
import java.io.ObjectInput;
2830
import java.io.ObjectOutput;
31+
import java.util.Map;
2932

3033
/**
3134
* Distributed task used for synchronization.
@@ -34,23 +37,30 @@
3437
*
3538
*/
3639
public class OSQLCommandTask extends OAbstractReplicatedTask {
37-
private static final long serialVersionUID = 1L;
40+
private static final long serialVersionUID = 1L;
3841

39-
protected String text;
42+
protected String text;
43+
protected Map<Object, Object> params;
4044

4145
public OSQLCommandTask() {
4246
}
4347

44-
public OSQLCommandTask(final String iCommand) {
45-
text = iCommand;
48+
public OSQLCommandTask(final OCommandRequestText iCommand) {
49+
text = iCommand.getText();
50+
params = iCommand.getParameters();
4651
}
4752

4853
public Object execute(final OServer iServer, ODistributedServerManager iManager, final ODatabaseDocumentTx database)
4954
throws Exception {
5055
ODistributedServerLog.debug(this, iManager.getLocalNodeName(), getNodeSource(), DIRECTION.IN, "execute command=%s db=%s",
5156
text.toString(), database.getName());
5257

53-
return database.command(new OCommandSQL(text)).execute();
58+
final OCommandRequest cmd = database.command(new OCommandSQL(text));
59+
if (params != null)
60+
// EXECUTE WITH PARAMETERS
61+
return cmd.execute(params);
62+
63+
return cmd.execute();
5464
}
5565

5666
public QUORUM_TYPE getQuorumType() {
@@ -65,11 +75,13 @@ public long getTimeout() {
6575
@Override
6676
public void writeExternal(final ObjectOutput out) throws IOException {
6777
out.writeUTF(text);
78+
out.writeObject(params);
6879
}
6980

7081
@Override
7182
public void readExternal(final ObjectInput in) throws IOException, ClassNotFoundException {
7283
text = in.readUTF();
84+
params = (Map<Object, Object>) in.readObject();
7385
}
7486

7587
@Override

0 commit comments

Comments
 (0)