// Run callback representing the invocation of a chaincode // This chaincode will manage two accounts A and B and will transfer X units from A to B upon invoke func (t *SimpleChaincode) Run(stub *shim.ChaincodeStub, function string, args []string) ([]byte, error) { switch function { case "insertRowTableOne": if len(args) < 3 { return nil, errors.New("insertTableOne failed. Must include 3 column values") } col1Val := args[0] col2Int, err := strconv.ParseInt(args[1], 10, 32) if err != nil { return nil, errors.New("insertTableOne failed. arg[1] must be convertable to int32") } col2Val := int32(col2Int) col3Int, err := strconv.ParseInt(args[2], 10, 32) if err != nil { return nil, errors.New("insertTableOne failed. arg[2] must be convertable to int32") } col3Val := int32(col3Int) var columns []*shim.Column col1 := shim.Column{Value: &shim.Column_String_{String_: col1Val}} col2 := shim.Column{Value: &shim.Column_Int32{Int32: col2Val}} col3 := shim.Column{Value: &shim.Column_Int32{Int32: col3Val}} columns = append(columns, &col1) columns = append(columns, &col2) columns = append(columns, &col3) row := shim.Row{columns} ok, err := stub.InsertRow("tableOne", row) if err != nil { return nil, fmt.Errorf("insertTableOne operation failed. %s", err) } if !ok { return nil, errors.New("insertTableOne operation failed. Row with given key already exists") } case "insertRowTableTwo": if len(args) < 4 { return nil, errors.New("insertRowTableTwo failed. Must include 4 column values") } col1Val := args[0] col2Int, err := strconv.ParseInt(args[1], 10, 32) if err != nil { return nil, errors.New("insertRowTableTwo failed. arg[1] must be convertable to int32") } col2Val := int32(col2Int) col3Int, err := strconv.ParseInt(args[2], 10, 32) if err != nil { return nil, errors.New("insertRowTableTwo failed. arg[2] must be convertable to int32") } col3Val := int32(col3Int) col4Val := args[3] var columns []*shim.Column col1 := shim.Column{Value: &shim.Column_String_{String_: col1Val}} col2 := shim.Column{Value: &shim.Column_Int32{Int32: col2Val}} col3 := shim.Column{Value: &shim.Column_Int32{Int32: col3Val}} col4 := shim.Column{Value: &shim.Column_String_{String_: col4Val}} columns = append(columns, &col1) columns = append(columns, &col2) columns = append(columns, &col3) columns = append(columns, &col4) row := shim.Row{columns} ok, err := stub.InsertRow("tableTwo", row) if err != nil { return nil, fmt.Errorf("insertRowTableTwo operation failed. %s", err) } if !ok { return nil, errors.New("insertRowTableTwo operation failed. Row with given key already exists") } case "insertRowTableThree": if len(args) < 7 { return nil, errors.New("insertRowTableThree failed. Must include 7 column values") } col1Val := args[0] col2Int, err := strconv.ParseInt(args[1], 10, 32) if err != nil { return nil, errors.New("insertRowTableThree failed. arg[1] must be convertable to int32") } col2Val := int32(col2Int) col3Val, err := strconv.ParseInt(args[2], 10, 64) if err != nil { return nil, errors.New("insertRowTableThree failed. arg[2] must be convertable to int64") } col4Uint, err := strconv.ParseUint(args[3], 10, 32) if err != nil { return nil, errors.New("insertRowTableThree failed. arg[3] must be convertable to uint32") } col4Val := uint32(col4Uint) col5Val, err := strconv.ParseUint(args[4], 10, 64) if err != nil { return nil, errors.New("insertRowTableThree failed. arg[4] must be convertable to uint64") } col6Val := []byte(args[5]) col7Val, err := strconv.ParseBool(args[6]) if err != nil { return nil, errors.New("insertRowTableThree failed. arg[6] must be convertable to bool") } var columns []*shim.Column col1 := shim.Column{Value: &shim.Column_String_{String_: col1Val}} col2 := shim.Column{Value: &shim.Column_Int32{Int32: col2Val}} col3 := shim.Column{Value: &shim.Column_Int64{Int64: col3Val}} col4 := shim.Column{Value: &shim.Column_Uint32{Uint32: col4Val}} col5 := shim.Column{Value: &shim.Column_Uint64{Uint64: col5Val}} col6 := shim.Column{Value: &shim.Column_Bytes{Bytes: col6Val}} col7 := shim.Column{Value: &shim.Column_Bool{Bool: col7Val}} columns = append(columns, &col1) columns = append(columns, &col2) columns = append(columns, &col3) columns = append(columns, &col4) columns = append(columns, &col5) columns = append(columns, &col6) columns = append(columns, &col7) row := shim.Row{columns} ok, err := stub.InsertRow("tableThree", row) if err != nil { return nil, fmt.Errorf("insertRowTableThree operation failed. %s", err) } if !ok { return nil, errors.New("insertRowTableThree operation failed. Row with given key already exists") } case "deleteRowTableOne": if len(args) < 1 { return nil, errors.New("deleteRowTableOne failed. Must include 1 key value") } col1Val := args[0] var columns []shim.Column col1 := shim.Column{Value: &shim.Column_String_{String_: col1Val}} columns = append(columns, col1) err := stub.DeleteRow("tableOne", columns) if err != nil { return nil, fmt.Errorf("deleteRowTableOne operation failed. %s", err) } case "replaceRowTableOne": if len(args) < 3 { return nil, errors.New("replaceRowTableOne failed. Must include 3 column values") } col1Val := args[0] col2Int, err := strconv.ParseInt(args[1], 10, 32) if err != nil { return nil, errors.New("replaceRowTableOne failed. arg[1] must be convertable to int32") } col2Val := int32(col2Int) col3Int, err := strconv.ParseInt(args[2], 10, 32) if err != nil { return nil, errors.New("replaceRowTableOne failed. arg[2] must be convertable to int32") } col3Val := int32(col3Int) var columns []*shim.Column col1 := shim.Column{Value: &shim.Column_String_{String_: col1Val}} col2 := shim.Column{Value: &shim.Column_Int32{Int32: col2Val}} col3 := shim.Column{Value: &shim.Column_Int32{Int32: col3Val}} columns = append(columns, &col1) columns = append(columns, &col2) columns = append(columns, &col3) row := shim.Row{columns} ok, err := stub.ReplaceRow("tableOne", row) if err != nil { return nil, fmt.Errorf("replaceRowTableOne operation failed. %s", err) } if !ok { return nil, errors.New("replaceRowTableOne operation failed. Row with given key does not exist") } case "deleteAndRecreateTableOne": err := stub.DeleteTable("tableOne") if err != nil { return nil, fmt.Errorf("deleteAndRecreateTableOne operation failed. Error deleting table. %s", err) } err = createTableOne(stub) if err != nil { return nil, fmt.Errorf("deleteAndRecreateTableOne operation failed. Error creating table. %s", err) } return nil, nil case "init": // Create table one err := createTableOne(stub) if err != nil { return nil, fmt.Errorf("Error creating table one during init. %s", err) } // Create table two err = createTableTwo(stub) if err != nil { return nil, fmt.Errorf("Error creating table two during init. %s", err) } // Create table three err = createTableThree(stub) if err != nil { return nil, fmt.Errorf("Error creating table three during init. %s", err) } default: return nil, errors.New("Unsupported operation") } return nil, nil }