* ParseGetUserSpec parses the wire * protocol message getUser() which gets user info */
| 1008 | * protocol message getUser() which gets user info |
| 1009 | */ |
| 1010 | static void |
| 1011 | ParseGetUserSpec(pgbson *getSpec, GetUserSpec *spec) |
| 1012 | { |
| 1013 | bson_iter_t getIter; |
| 1014 | PgbsonInitIterator(getSpec, &getIter); |
| 1015 | |
| 1016 | spec->user = (StringView) { |
| 1017 | 0 |
| 1018 | }; |
| 1019 | spec->showAllUsers = false; |
| 1020 | spec->showPrivileges = false; |
| 1021 | bool getUsersFieldFound = false; |
| 1022 | bool dbFound = false; |
| 1023 | while (bson_iter_next(&getIter)) |
| 1024 | { |
| 1025 | const char *key = bson_iter_key(&getIter); |
| 1026 | if (strcmp(key, "usersInfo") == 0) |
| 1027 | { |
| 1028 | getUsersFieldFound = true; |
| 1029 | if (bson_iter_type(&getIter) == BSON_TYPE_INT32) |
| 1030 | { |
| 1031 | if (bson_iter_as_int64(&getIter) != 1) |
| 1032 | { |
| 1033 | ereport(ERROR, (errcode(ERRCODE_DOCUMENTDB_BADVALUE), |
| 1034 | errmsg( |
| 1035 | "The 'usersInfo' field contains an unsupported value."))); |
| 1036 | } |
| 1037 | |
| 1038 | spec->showAllUsers = true; |
| 1039 | } |
| 1040 | else if (bson_iter_type(&getIter) == BSON_TYPE_UTF8) |
| 1041 | { |
| 1042 | uint32_t strLength = 0; |
| 1043 | const char *userString = bson_iter_utf8(&getIter, &strLength); |
| 1044 | spec->user = (StringView) { |
| 1045 | .string = userString, |
| 1046 | .length = strLength |
| 1047 | }; |
| 1048 | } |
| 1049 | else if (BSON_ITER_HOLDS_DOCUMENT(&getIter)) |
| 1050 | { |
| 1051 | const bson_value_t usersInfoBson = *bson_iter_value(&getIter); |
| 1052 | ParseUsersInfoDocument(&usersInfoBson, spec); |
| 1053 | } |
| 1054 | else |
| 1055 | { |
| 1056 | ereport(ERROR, (errcode(ERRCODE_DOCUMENTDB_BADVALUE), |
| 1057 | errmsg("Unsupported value specified for 'usersInfo'."))); |
| 1058 | } |
| 1059 | } |
| 1060 | else if (strcmp(key, "getUser") == 0) |
| 1061 | { |
| 1062 | getUsersFieldFound = true; |
| 1063 | EnsureTopLevelFieldType(key, &getIter, BSON_TYPE_UTF8); |
| 1064 | uint32_t strLength = 0; |
| 1065 | const char *userString = bson_iter_utf8(&getIter, &strLength); |
| 1066 | spec->user = (StringView) { |
| 1067 | .string = userString, |
no test coverage detected