MCPcopy Create free account
hub / github.com/NodeDB-Lab/nodedb / parse_fetch

Function parse_fetch

nodedb/src/control/server/pgwire/handler/cursor_cmds.rs:86–149  ·  view source on GitHub ↗

Parse FETCH [ALL | FORWARD n | BACKWARD n | n] FROM cursor_name.

(upper: &str, parts: &[&str])

Source from the content-addressed store, hash-verified

84
85/// Parse FETCH [ALL | FORWARD n | BACKWARD n | n] FROM cursor_name.
86fn parse_fetch(upper: &str, parts: &[&str]) -> PgWireResult<(FetchDirection, usize, String)> {
87 // FETCH ALL FROM cursor_name
88 if upper.contains(" ALL ") {
89 let from_idx = parts
90 .iter()
91 .position(|p| p.eq_ignore_ascii_case("FROM"))
92 .unwrap_or(parts.len() - 1);
93 let cursor_name = parts.get(from_idx + 1).unwrap_or(&"default").to_lowercase();
94 return Ok((FetchDirection::All, 0, cursor_name));
95 }
96
97 // FETCH BACKWARD n FROM cursor_name
98 if upper.contains("BACKWARD") {
99 let bw_idx = parts
100 .iter()
101 .position(|p| p.eq_ignore_ascii_case("BACKWARD"))
102 .unwrap_or(1);
103 let count = parts
104 .get(bw_idx + 1)
105 .and_then(|s| s.parse::<usize>().ok())
106 .unwrap_or(1);
107 let from_idx = parts
108 .iter()
109 .position(|p| p.eq_ignore_ascii_case("FROM"))
110 .unwrap_or(parts.len() - 1);
111 let cursor_name = parts.get(from_idx + 1).unwrap_or(&"default").to_lowercase();
112 return Ok((FetchDirection::Backward, count, cursor_name));
113 }
114
115 // FETCH FORWARD n FROM cursor_name
116 if upper.contains("FORWARD") {
117 let fw_idx = parts
118 .iter()
119 .position(|p| p.eq_ignore_ascii_case("FORWARD"))
120 .unwrap_or(1);
121 let count = parts
122 .get(fw_idx + 1)
123 .and_then(|s| s.parse::<usize>().ok())
124 .unwrap_or(1);
125 let from_idx = parts
126 .iter()
127 .position(|p| p.eq_ignore_ascii_case("FROM"))
128 .unwrap_or(parts.len() - 1);
129 let cursor_name = parts.get(from_idx + 1).unwrap_or(&"default").to_lowercase();
130 return Ok((FetchDirection::Forward, count, cursor_name));
131 }
132
133 // FETCH n FROM cursor_name (default: forward)
134 if parts.len() >= 4 && parts[2].eq_ignore_ascii_case("FROM") {
135 let count = parts[1].parse::<usize>().unwrap_or(1);
136 let cursor_name = parts[3].to_lowercase();
137 return Ok((FetchDirection::Forward, count, cursor_name));
138 }
139
140 // FETCH FROM cursor_name (1 row forward)
141 if parts.len() >= 3 && parts[1].eq_ignore_ascii_case("FROM") {
142 let cursor_name = parts[2].to_lowercase();
143 return Ok((FetchDirection::Forward, 1, cursor_name));

Callers 1

handle_fetchMethod · 0.85

Calls 5

containsMethod · 0.45
iterMethod · 0.45
lenMethod · 0.45
getMethod · 0.45
okMethod · 0.45

Tested by

no test coverage detected