Skip to content

Commit f57ad79

Browse files
committed
Require element ID fields in node/reln constructors
This changes the interface for the constructors neo4j_node(), neo4j_relationship(), neo4j_unbound_relationship(); but these are internal functions, only called from struct_deserialize(). So this change doesn't affect the public API. For Bolt v3/v4, which don't have element IDs, struct_deserialize() generates a replacement string.
1 parent ae82eb6 commit f57ad79

2 files changed

Lines changed: 88 additions & 48 deletions

File tree

lib/src/values.c

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -801,9 +801,9 @@ neo4j_value_t neo4j_node(const neo4j_value_t fields[4])
801801
{
802802
if (neo4j_type(fields[0]) != NEO4J_IDENTITY ||
803803
neo4j_type(fields[1]) != NEO4J_LIST ||
804-
neo4j_type(fields[2]) != NEO4J_MAP
805-
// || neo4j_type(fields[3]) != NEO4J_ELEMENTID
806-
)
804+
neo4j_type(fields[2]) != NEO4J_MAP ||
805+
neo4j_type(fields[3]) != NEO4J_ELEMENTID
806+
)
807807
{
808808
errno = EINVAL;
809809
return neo4j_null;
@@ -875,11 +875,11 @@ neo4j_value_t neo4j_relationship(const neo4j_value_t fields[8])
875875
(neo4j_type(fields[2]) != NEO4J_IDENTITY &&
876876
!neo4j_is_null(fields[1])) ||
877877
neo4j_type(fields[3]) != NEO4J_STRING ||
878-
neo4j_type(fields[4]) != NEO4J_MAP
879-
// || neo4j_type(fields[5]) != NEO4J_ELEMENTID ||
880-
// neo4j_type(fields[6]) != NEO4J_ELEMENTID ||
881-
// neo4j_type(fields[7]) != NEO4J_ELEMENTID
882-
)
878+
neo4j_type(fields[4]) != NEO4J_MAP ||
879+
neo4j_type(fields[5]) != NEO4J_ELEMENTID ||
880+
neo4j_type(fields[6]) != NEO4J_ELEMENTID ||
881+
neo4j_type(fields[7]) != NEO4J_ELEMENTID
882+
)
883883
{
884884
errno = EINVAL;
885885
return neo4j_null;
@@ -897,9 +897,9 @@ neo4j_value_t neo4j_unbound_relationship(const neo4j_value_t fields[4])
897897
{
898898
if (neo4j_type(fields[0]) != NEO4J_IDENTITY ||
899899
neo4j_type(fields[1]) != NEO4J_STRING ||
900-
neo4j_type(fields[2]) != NEO4J_MAP
901-
// // neo4j_type(fields[3]) != NEO4J_ELEMENTID
902-
)
900+
neo4j_type(fields[2]) != NEO4J_MAP ||
901+
neo4j_type(fields[3]) != NEO4J_ELEMENTID
902+
)
903903
{
904904
errno = EINVAL;
905905
return neo4j_null;

lib/test/check_values.c

Lines changed: 77 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -486,11 +486,13 @@ START_TEST (node_value)
486486
{ .key = neo4j_string("sanders"), .value = neo4j_int(2) } };
487487

488488
neo4j_value_t field_values[] =
489-
{ neo4j_identity(1), neo4j_list(labels, 2), neo4j_map(props, 2) };
489+
{ neo4j_identity(1), neo4j_list(labels, 2), neo4j_map(props, 2),
490+
neo4j_elementid("I-VT") };
490491
neo4j_value_t value = neo4j_node(field_values);
491492
ck_assert(neo4j_type(value) == NEO4J_NODE);
492493

493494
ck_assert(neo4j_eq(neo4j_node_identity(value), neo4j_identity(1)));
495+
ck_assert(neo4j_eq(neo4j_node_elementid(value), neo4j_elementid("I-VT")));
494496

495497
char *str = neo4j_tostring(value, buf, sizeof(buf));
496498
ck_assert(str == buf);
@@ -517,7 +519,8 @@ START_TEST (invalid_node_label_value)
517519
{ .key = neo4j_string("sanders"), .value = neo4j_int(2) } };
518520

519521
neo4j_value_t field_values[] =
520-
{ neo4j_identity(1), neo4j_list(labels, 2), neo4j_map(props, 2) };
522+
{ neo4j_identity(1), neo4j_list(labels, 2), neo4j_map(props, 2),
523+
neo4j_elementid("I-VT") };
521524
neo4j_value_t value = neo4j_node(field_values);
522525
ck_assert(neo4j_is_null(value));
523526
ck_assert_int_eq(errno, NEO4J_INVALID_LABEL_TYPE);
@@ -575,14 +578,17 @@ START_TEST (unbound_relationship_value)
575578
{ { .key = neo4j_string("year"), .value = neo4j_int(2016) } };
576579

577580
neo4j_value_t field_values[] =
578-
{ neo4j_identity(1), type, neo4j_map(props, 1) };
581+
{ neo4j_identity(1), type, neo4j_map(props, 1),
582+
neo4j_elementid("A Future To Believe In") };
579583
neo4j_value_t value = neo4j_unbound_relationship(field_values);
580584
ck_assert(neo4j_type(value) == NEO4J_RELATIONSHIP);
581585

582586
ck_assert(neo4j_eq(neo4j_relationship_identity(value),
583587
neo4j_identity(1)));
584588
ck_assert(neo4j_is_null(neo4j_relationship_start_node_identity(value)));
585589
ck_assert(neo4j_is_null(neo4j_relationship_end_node_identity(value)));
590+
ck_assert(neo4j_eq(neo4j_relationship_elementid(value),
591+
neo4j_elementid("A Future To Believe In")));
586592

587593
char *str = neo4j_tostring(value, buf, sizeof(buf));
588594
ck_assert(str == buf);
@@ -712,20 +718,24 @@ START_TEST (invalid_path_relationship_value)
712718
neo4j_value_t rel1_type = neo4j_string("Senator");
713719

714720
neo4j_value_t node1_fields[] =
715-
{ neo4j_identity(1), neo4j_list(NULL, 0), neo4j_map(NULL, 0) };
721+
{ neo4j_identity(1), neo4j_list(NULL, 0), neo4j_map(NULL, 0),
722+
neo4j_elementid("1") };
716723
neo4j_value_t node1 = neo4j_node(node1_fields);
717724

718725
neo4j_value_t rel1_fields[] =
719726
{ neo4j_identity(8), neo4j_identity(2), neo4j_identity(1),
720-
rel1_type, neo4j_map(NULL, 0) };
727+
rel1_type, neo4j_map(NULL, 0),
728+
neo4j_elementid("8"), neo4j_elementid("2"), neo4j_elementid("1") };
721729
neo4j_value_t rel1 = neo4j_relationship(rel1_fields);
722730

723731
neo4j_value_t node2_fields[] =
724-
{ neo4j_identity(2), neo4j_list(NULL, 0), neo4j_map(NULL, 0) };
732+
{ neo4j_identity(2), neo4j_list(NULL, 0), neo4j_map(NULL, 0),
733+
neo4j_elementid("2") };
725734
neo4j_value_t node2 = neo4j_node(node2_fields);
726735

727736
neo4j_value_t node3_fields[] =
728-
{ neo4j_identity(3), neo4j_list(NULL, 0), neo4j_map(NULL, 0) };
737+
{ neo4j_identity(3), neo4j_list(NULL, 0), neo4j_map(NULL, 0),
738+
neo4j_elementid("3") };
729739
neo4j_value_t node3 = neo4j_node(node3_fields);
730740

731741
neo4j_value_t path_nodes[] = { node1, node2, node3 };
@@ -751,25 +761,30 @@ START_TEST (invalid_path_seq_length)
751761
neo4j_value_t rel2_type = neo4j_string("Candidate");
752762

753763
neo4j_value_t node1_fields[] =
754-
{ neo4j_identity(1), neo4j_list(NULL, 0), neo4j_map(NULL, 0) };
764+
{ neo4j_identity(1), neo4j_list(NULL, 0), neo4j_map(NULL, 0),
765+
neo4j_elementid("1") };
755766
neo4j_value_t node1 = neo4j_node(node1_fields);
756767

757768
neo4j_value_t rel1_fields[] =
758769
{ neo4j_identity(8), neo4j_identity(2), neo4j_identity(1),
759-
rel1_type, neo4j_map(NULL, 0) };
770+
rel1_type, neo4j_map(NULL, 0),
771+
neo4j_elementid("8"), neo4j_elementid("2"), neo4j_elementid("1") };
760772
neo4j_value_t rel1 = neo4j_relationship(rel1_fields);
761773

762774
neo4j_value_t node2_fields[] =
763-
{ neo4j_identity(2), neo4j_list(NULL, 0), neo4j_map(NULL, 0) };
775+
{ neo4j_identity(2), neo4j_list(NULL, 0), neo4j_map(NULL, 0),
776+
neo4j_elementid("2") };
764777
neo4j_value_t node2 = neo4j_node(node2_fields);
765778

766779
neo4j_value_t rel2_fields[] =
767780
{ neo4j_identity(9), neo4j_identity(2), neo4j_identity(3),
768-
rel2_type, neo4j_map(NULL, 0) };
781+
rel2_type, neo4j_map(NULL, 0),
782+
neo4j_elementid("9"), neo4j_elementid("2"), neo4j_elementid("3") };
769783
neo4j_value_t rel2 = neo4j_relationship(rel2_fields);
770784

771785
neo4j_value_t node3_fields[] =
772-
{ neo4j_identity(3), neo4j_list(NULL, 0), neo4j_map(NULL, 0) };
786+
{ neo4j_identity(3), neo4j_list(NULL, 0), neo4j_map(NULL, 0),
787+
neo4j_elementid("3") };
773788
neo4j_value_t node3 = neo4j_node(node3_fields);
774789

775790
neo4j_value_t path_nodes[] = { node1, node2, node3 };
@@ -795,25 +810,30 @@ START_TEST (invalid_path_seq_rel_index_type)
795810
neo4j_value_t rel2_type = neo4j_string("Candidate");
796811

797812
neo4j_value_t node1_fields[] =
798-
{ neo4j_identity(1), neo4j_list(NULL, 0), neo4j_map(NULL, 0) };
813+
{ neo4j_identity(1), neo4j_list(NULL, 0), neo4j_map(NULL, 0),
814+
neo4j_elementid("1") };
799815
neo4j_value_t node1 = neo4j_node(node1_fields);
800816

801817
neo4j_value_t rel1_fields[] =
802818
{ neo4j_identity(8), neo4j_identity(2), neo4j_identity(1),
803-
rel1_type, neo4j_map(NULL, 0) };
819+
rel1_type, neo4j_map(NULL, 0),
820+
neo4j_elementid("8"), neo4j_elementid("2"), neo4j_elementid("1") };
804821
neo4j_value_t rel1 = neo4j_relationship(rel1_fields);
805822

806823
neo4j_value_t node2_fields[] =
807-
{ neo4j_identity(2), neo4j_list(NULL, 0), neo4j_map(NULL, 0) };
824+
{ neo4j_identity(2), neo4j_list(NULL, 0), neo4j_map(NULL, 0),
825+
neo4j_elementid("2") };
808826
neo4j_value_t node2 = neo4j_node(node2_fields);
809827

810828
neo4j_value_t rel2_fields[] =
811829
{ neo4j_identity(9), neo4j_identity(2), neo4j_identity(3),
812-
rel2_type, neo4j_map(NULL, 0) };
830+
rel2_type, neo4j_map(NULL, 0),
831+
neo4j_elementid("9"), neo4j_elementid("2"), neo4j_elementid("3") };
813832
neo4j_value_t rel2 = neo4j_relationship(rel2_fields);
814833

815834
neo4j_value_t node3_fields[] =
816-
{ neo4j_identity(3), neo4j_list(NULL, 0), neo4j_map(NULL, 0) };
835+
{ neo4j_identity(3), neo4j_list(NULL, 0), neo4j_map(NULL, 0),
836+
neo4j_elementid("3") };
817837
neo4j_value_t node3 = neo4j_node(node3_fields);
818838

819839
neo4j_value_t path_nodes[] = { node1, node2, node3 };
@@ -839,25 +859,30 @@ START_TEST (invalid_path_seq_node_index_type)
839859
neo4j_value_t rel2_type = neo4j_string("Candidate");
840860

841861
neo4j_value_t node1_fields[] =
842-
{ neo4j_identity(1), neo4j_list(NULL, 0), neo4j_map(NULL, 0) };
862+
{ neo4j_identity(1), neo4j_list(NULL, 0), neo4j_map(NULL, 0),
863+
neo4j_elementid("1") };
843864
neo4j_value_t node1 = neo4j_node(node1_fields);
844865

845866
neo4j_value_t rel1_fields[] =
846867
{ neo4j_identity(8), neo4j_identity(2), neo4j_identity(1),
847-
rel1_type, neo4j_map(NULL, 0) };
868+
rel1_type, neo4j_map(NULL, 0),
869+
neo4j_elementid("8"), neo4j_elementid("2"), neo4j_elementid("1") };
848870
neo4j_value_t rel1 = neo4j_relationship(rel1_fields);
849871

850872
neo4j_value_t node2_fields[] =
851-
{ neo4j_identity(2), neo4j_list(NULL, 0), neo4j_map(NULL, 0) };
873+
{ neo4j_identity(2), neo4j_list(NULL, 0), neo4j_map(NULL, 0),
874+
neo4j_elementid("2") };
852875
neo4j_value_t node2 = neo4j_node(node2_fields);
853876

854877
neo4j_value_t rel2_fields[] =
855878
{ neo4j_identity(9), neo4j_identity(2), neo4j_identity(3),
856-
rel2_type, neo4j_map(NULL, 0) };
879+
rel2_type, neo4j_map(NULL, 0),
880+
neo4j_elementid("9"), neo4j_elementid("2"), neo4j_elementid("3") };
857881
neo4j_value_t rel2 = neo4j_relationship(rel2_fields);
858882

859883
neo4j_value_t node3_fields[] =
860-
{ neo4j_identity(3), neo4j_list(NULL, 0), neo4j_map(NULL, 0) };
884+
{ neo4j_identity(3), neo4j_list(NULL, 0), neo4j_map(NULL, 0),
885+
neo4j_elementid("3") };
861886
neo4j_value_t node3 = neo4j_node(node3_fields);
862887

863888
neo4j_value_t path_nodes[] = { node1, node2, node3 };
@@ -883,25 +908,30 @@ START_TEST (invalid_path_seq_rel_index_range)
883908
neo4j_value_t rel2_type = neo4j_string("Candidate");
884909

885910
neo4j_value_t node1_fields[] =
886-
{ neo4j_identity(1), neo4j_list(NULL, 0), neo4j_map(NULL, 0) };
911+
{ neo4j_identity(1), neo4j_list(NULL, 0), neo4j_map(NULL, 0),
912+
neo4j_elementid("1") };
887913
neo4j_value_t node1 = neo4j_node(node1_fields);
888914

889915
neo4j_value_t rel1_fields[] =
890916
{ neo4j_identity(8), neo4j_identity(2), neo4j_identity(1),
891-
rel1_type, neo4j_map(NULL, 0) };
917+
rel1_type, neo4j_map(NULL, 0),
918+
neo4j_elementid("8"), neo4j_elementid("2"), neo4j_elementid("1") };
892919
neo4j_value_t rel1 = neo4j_relationship(rel1_fields);
893920

894921
neo4j_value_t node2_fields[] =
895-
{ neo4j_identity(2), neo4j_list(NULL, 0), neo4j_map(NULL, 0) };
922+
{ neo4j_identity(2), neo4j_list(NULL, 0), neo4j_map(NULL, 0),
923+
neo4j_elementid("2") };
896924
neo4j_value_t node2 = neo4j_node(node2_fields);
897925

898926
neo4j_value_t rel2_fields[] =
899927
{ neo4j_identity(9), neo4j_identity(2), neo4j_identity(3),
900-
rel2_type, neo4j_map(NULL, 0) };
928+
rel2_type, neo4j_map(NULL, 0),
929+
neo4j_elementid("9"), neo4j_elementid("2"), neo4j_elementid("3") };
901930
neo4j_value_t rel2 = neo4j_relationship(rel2_fields);
902931

903932
neo4j_value_t node3_fields[] =
904-
{ neo4j_identity(3), neo4j_list(NULL, 0), neo4j_map(NULL, 0) };
933+
{ neo4j_identity(3), neo4j_list(NULL, 0), neo4j_map(NULL, 0),
934+
neo4j_elementid("3") };
905935
neo4j_value_t node3 = neo4j_node(node3_fields);
906936

907937
neo4j_value_t path_nodes[] = { node1, node2, node3 };
@@ -927,25 +957,30 @@ START_TEST (invalid_path_seq_rel_zero_index_range)
927957
neo4j_value_t rel2_type = neo4j_string("Candidate");
928958

929959
neo4j_value_t node1_fields[] =
930-
{ neo4j_identity(1), neo4j_list(NULL, 0), neo4j_map(NULL, 0) };
960+
{ neo4j_identity(1), neo4j_list(NULL, 0), neo4j_map(NULL, 0),
961+
neo4j_elementid("1") };
931962
neo4j_value_t node1 = neo4j_node(node1_fields);
932963

933964
neo4j_value_t rel1_fields[] =
934965
{ neo4j_identity(8), neo4j_identity(2), neo4j_identity(1),
935-
rel1_type, neo4j_map(NULL, 0) };
966+
rel1_type, neo4j_map(NULL, 0),
967+
neo4j_elementid("8"), neo4j_elementid("2"), neo4j_elementid("1") };
936968
neo4j_value_t rel1 = neo4j_relationship(rel1_fields);
937969

938970
neo4j_value_t node2_fields[] =
939-
{ neo4j_identity(2), neo4j_list(NULL, 0), neo4j_map(NULL, 0) };
971+
{ neo4j_identity(2), neo4j_list(NULL, 0), neo4j_map(NULL, 0),
972+
neo4j_elementid("2") };
940973
neo4j_value_t node2 = neo4j_node(node2_fields);
941974

942975
neo4j_value_t rel2_fields[] =
943976
{ neo4j_identity(9), neo4j_identity(2), neo4j_identity(3),
944-
rel2_type, neo4j_map(NULL, 0) };
977+
rel2_type, neo4j_map(NULL, 0),
978+
neo4j_elementid("9"), neo4j_elementid("2"), neo4j_elementid("3") };
945979
neo4j_value_t rel2 = neo4j_relationship(rel2_fields);
946980

947981
neo4j_value_t node3_fields[] =
948-
{ neo4j_identity(3), neo4j_list(NULL, 0), neo4j_map(NULL, 0) };
982+
{ neo4j_identity(3), neo4j_list(NULL, 0), neo4j_map(NULL, 0),
983+
neo4j_elementid("3") };
949984
neo4j_value_t node3 = neo4j_node(node3_fields);
950985

951986
neo4j_value_t path_nodes[] = { node1, node2, node3 };
@@ -971,25 +1006,30 @@ START_TEST (invalid_path_seq_rel_neg_index_range)
9711006
neo4j_value_t rel2_type = neo4j_string("Candidate");
9721007

9731008
neo4j_value_t node1_fields[] =
974-
{ neo4j_identity(1), neo4j_list(NULL, 0), neo4j_map(NULL, 0) };
1009+
{ neo4j_identity(1), neo4j_list(NULL, 0), neo4j_map(NULL, 0),
1010+
neo4j_elementid("1") };
9751011
neo4j_value_t node1 = neo4j_node(node1_fields);
9761012

9771013
neo4j_value_t rel1_fields[] =
9781014
{ neo4j_identity(8), neo4j_identity(2), neo4j_identity(1),
979-
rel1_type, neo4j_map(NULL, 0) };
1015+
rel1_type, neo4j_map(NULL, 0),
1016+
neo4j_elementid("8"), neo4j_elementid("2"), neo4j_elementid("1") };
9801017
neo4j_value_t rel1 = neo4j_relationship(rel1_fields);
9811018

9821019
neo4j_value_t node2_fields[] =
983-
{ neo4j_identity(2), neo4j_list(NULL, 0), neo4j_map(NULL, 0) };
1020+
{ neo4j_identity(2), neo4j_list(NULL, 0), neo4j_map(NULL, 0),
1021+
neo4j_elementid("2") };
9841022
neo4j_value_t node2 = neo4j_node(node2_fields);
9851023

9861024
neo4j_value_t rel2_fields[] =
9871025
{ neo4j_identity(9), neo4j_identity(2), neo4j_identity(3),
988-
rel2_type, neo4j_map(NULL, 0) };
1026+
rel2_type, neo4j_map(NULL, 0),
1027+
neo4j_elementid("9"), neo4j_elementid("2"), neo4j_elementid("3") };
9891028
neo4j_value_t rel2 = neo4j_relationship(rel2_fields);
9901029

9911030
neo4j_value_t node3_fields[] =
992-
{ neo4j_identity(3), neo4j_list(NULL, 0), neo4j_map(NULL, 0) };
1031+
{ neo4j_identity(3), neo4j_list(NULL, 0), neo4j_map(NULL, 0),
1032+
neo4j_elementid("3") };
9931033
neo4j_value_t node3 = neo4j_node(node3_fields);
9941034

9951035
neo4j_value_t path_nodes[] = { node1, node2, node3 };

0 commit comments

Comments
 (0)