Binary Type Metadata
Operation Codes
Upon a successful handshake with an Ignite server node a client can start performing binary-type related operations by sending a request (see request/response structure below) with a specific operation code:
Operation | OP_CODE |
---|---|
OP_GET_BINARY_TYPE_NAME |
3000 |
OP_REGISTER_BINARY_TYPE_NAME |
3001 |
OP_GET_BINARY_TYPE |
3002 |
OP_PUT_BINARY_TYPE |
3003 |
OP_RESOURCE_CLOSE |
0 |
Note that the above mentioned op_codes are part of the request header, as explained here.
Note
|
Customs Methods Used in Sample Code Snippets ImplementationSome of the code snippets below use |
OP_GET_BINARY_TYPE_NAME
Gets the platform-specific full binary type name by id. For example, .NET and Java can map to the same type Foo, but classes will be Apache.Ignite.Foo in .NET and org.apache.ignite.Foo in Java.
Names are registered with OP_REGISTER_BINARY_TYPE_NAME.
Request Type | Description |
---|---|
Header |
Request header. |
byte |
Platform id: JAVA = 0 DOTNET = 1 |
int |
Type id; Java-style hash code of the type name. |
Response Type | Description |
---|---|
Header |
Response header. |
String |
Binary type name. |
String type = "ignite.myexamples.model.Person";
int typeLen = type.getBytes("UTF-8").length;
DataOutputStream out = new DataOutputStream(socket.getOutputStream());
// Request header
writeRequestHeader(5, OP_GET_BINARY_TYPE_NAME, 1, out);
// Platform id
writeByteLittleEndian(0, out);
// Type id
writeIntLittleEndian(type.hashCode(), out);
// Read result
DataInputStream in = new DataInputStream(socket.getInputStream());
// Response header
readResponseHeader(in);
// Resulting String
int typeCode = readByteLittleEndian(in); // type code
int strLen = readIntLittleEndian(in); // length
byte[] buf = new byte[strLen];
readFully(in, buf, 0, strLen);
String s = new String(buf);
System.out.println(s);
OP_GET_BINARY_TYPE
Gets the binary type information by id.
Request Type | Description |
---|---|
Header |
Request header. |
int |
Type id; Java-style hash code of the type name. |
Response Type | Description |
---|---|
Header |
Response header. |
bool |
False: binary type does not exist, response end. True: binary type exists, response as follows. |
int |
Type id; Java-style hash code of the type name. |
String |
Type name. |
String |
Affinity key field name. |
int |
BinaryField count. |
BinaryField * count |
Structure of BinaryField:
|
bool |
Is Enum or not. If set to true, then you have to pass the following 2 parameters. Otherwise, skip them. |
int |
Pass only if 'is enum' parameter is 'true'. Enum field count. |
String + int |
Pass only if 'is enum' parameter is 'true'. Enum values. An enum value is a pair of a literal value (String) and numerical value (int). Repeat for as many times as the Enum field count that is obtained in the previous parameter. |
int |
Schema count. |
BinarySchema |
Structure of BinarySchema:
Repeat for as many times as the BinarySchema count that is obtained in the previous parameter. |
String type = "ignite.myexamples.model.Person";
DataOutputStream out = new DataOutputStream(socket.getOutputStream());
// Request header
writeRequestHeader(4, OP_BINARY_TYPE_GET, 1, out);
// Type id
writeIntLittleEndian(type.hashCode(), out);
// Read result
DataInputStream in = new DataInputStream(socket.getInputStream());
readResponseHeader(in);
boolean typeExist = readBooleanLittleEndian(in);
int typeId = readIntLittleEndian(in);
String typeName = readString(in);
String affinityFieldName = readString(in);
int fieldCount = readIntLittleEndian(in);
for (int i = 0; i < fieldCount; i++)
readBinaryTypeField(in);
boolean isEnum = readBooleanLittleEndian(in);
int schemaCount = readIntLittleEndian(in);
// Read binary schemas
for (int i = 0; i < schemaCount; i++) {
int schemaId = readIntLittleEndian(in); // Schema Id
int fieldCount = readIntLittleEndian(in); // field count
for (int j = 0; j < fieldCount; j++) {
System.out.println(readIntLittleEndian(in)); // field id
}
}
private static void readBinaryTypeField (DataInputStream in) throws IOException{
String fieldName = readString(in);
int fieldTypeId = readIntLittleEndian(in);
int fieldId = readIntLittleEndian(in);
System.out.println(fieldName);
}
OP_REGISTER_BINARY_TYPE_NAME
Registers the platform-specific full binary type name by id. For example, .NET and Java can map to the same type Foo, but classes will be Apache.Ignite.Foo in .NET and org.apache.ignite.Foo in Java.
Request Type | Description |
---|---|
Header |
Request header. |
byte |
Platform id: JAVA = 0 DOTNET = 1 |
int |
Type id; Java-style hash code of the type name. |
String |
Type name. |
Response Type | Description |
---|---|
Header |
Response header. |
String type = "ignite.myexamples.model.Person";
int typeLen = type.getBytes("UTF-8").length;
DataOutputStream out = new DataOutputStream(socket.getOutputStream());
// Request header
writeRequestHeader(20 + typeLen, OP_PUT_BINARY_TYPE_NAME, 1, out);
//Platform id
writeByteLittleEndian(0, out);
//Type id
writeIntLittleEndian(type.hashCode(), out);
// Type name
writeString(type, out);
// Read result
DataInputStream in = new DataInputStream(socket.getInputStream());
readResponseHeader(in);
OP_PUT_BINARY_TYPE
Registers binary type information in cluster.
Request Type | Description |
---|---|
Header |
Response header. |
int |
Type id; Java-style hash code of the type name. |
String |
Type name. |
String |
Affinity key field name. |
int |
BinaryField count. |
BinaryField |
Structure of BinaryField:
Repeat for as many times as the BinaryField count that is passed in the previous parameter. |
bool |
Is Enum or not. If set to true, then you have to pass the following 2 parameters. Otherwise, skip them. |
int |
Pass only if 'is enum' parameter is 'true'. Enum field count. |
String + int |
Pass only if 'is enum' parameter is 'true'. Enum values. An enum value is a pair of a literal value (String) and numerical value (int). Repeat for as many times as the Enum field count that is passed in the previous parameter. |
int |
BinarySchema count. |
BinarySchema |
Structure of BinarySchema:
Repeat for as many times as the BinarySchema count that is passed in the previous parameter. |
Response Type | Description |
---|---|
Header |
Response header. |
String type = "ignite.myexamples.model.Person";
DataOutputStream out = new DataOutputStream(socket.getOutputStream());
// Request header
writeRequestHeader(120, OP_BINARY_TYPE_PUT, 1, out);
// Type id
writeIntLittleEndian(type.hashCode(), out);
// Type name
writeString(type, out);
// Affinity key field name
writeByteLittleEndian(101, out);
// Field count
writeIntLittleEndian(3, out);
// Field 1
String field1 = "id";
writeBinaryTypeField(field1, "long", out);
// Field 2
String field2 = "name";
writeBinaryTypeField(field2, "String", out);
// Field 3
String field3 = "salary";
writeBinaryTypeField(field3, "int", out);
// isEnum
out.writeBoolean(false);
// Schema count
writeIntLittleEndian(1, out);
// Schema
writeIntLittleEndian(657, out); // Schema id; can be any custom value
writeIntLittleEndian(3, out); // field count
writeIntLittleEndian(field1.hashCode(), out);
writeIntLittleEndian(field2.hashCode(), out);
writeIntLittleEndian(field3.hashCode(), out);
private static void writeBinaryTypeField (String field, String fieldType, DataOutputStream out) throws IOException{
writeString(field, out);
writeIntLittleEndian(fieldType.hashCode(), out);
writeIntLittleEndian(field.hashCode(), out);
}
// Read result
DataInputStream in = new DataInputStream(socket.getInputStream());
readResponseHeader(in);
Apache, Apache Ignite, the Apache feather and the Apache Ignite logo are either registered trademarks or trademarks of The Apache Software Foundation.