|
1 |
| -use futures::TryStreamExt; |
| 1 | +use futures::{StreamExt, TryStreamExt}; |
2 | 2 | use sqlx::postgres::{
|
3 | 3 | PgConnectOptions, PgConnection, PgDatabaseError, PgErrorPosition, PgSeverity,
|
4 | 4 | };
|
@@ -1104,3 +1104,99 @@ async fn test_pg_server_num() -> anyhow::Result<()> {
|
1104 | 1104 |
|
1105 | 1105 | Ok(())
|
1106 | 1106 | }
|
| 1107 | + |
| 1108 | +#[sqlx_macros::test] |
| 1109 | +async fn it_can_copy_in() -> anyhow::Result<()> { |
| 1110 | + let mut conn = new::<Postgres>().await?; |
| 1111 | + conn.execute( |
| 1112 | + r#" |
| 1113 | + CREATE TEMPORARY TABLE users (id INTEGER NOT NULL); |
| 1114 | + "#, |
| 1115 | + ) |
| 1116 | + .await?; |
| 1117 | + |
| 1118 | + let mut copy = conn |
| 1119 | + .copy_in_raw( |
| 1120 | + r#" |
| 1121 | + COPY users (id) FROM STDIN WITH (FORMAT CSV, HEADER); |
| 1122 | + "#, |
| 1123 | + ) |
| 1124 | + .await?; |
| 1125 | + |
| 1126 | + copy.send("id\n1\n2\n".as_bytes()).await?; |
| 1127 | + let rows = copy.finish().await?; |
| 1128 | + assert_eq!(rows, 2); |
| 1129 | + |
| 1130 | + // conn is safe for reuse |
| 1131 | + let value = sqlx::query("select 1 + 1") |
| 1132 | + .try_map(|row: PgRow| row.try_get::<i32, _>(0)) |
| 1133 | + .fetch_one(&mut conn) |
| 1134 | + .await?; |
| 1135 | + |
| 1136 | + assert_eq!(2i32, value); |
| 1137 | + |
| 1138 | + Ok(()) |
| 1139 | +} |
| 1140 | + |
| 1141 | +#[sqlx_macros::test] |
| 1142 | +async fn it_can_abort_copy_in() -> anyhow::Result<()> { |
| 1143 | + let mut conn = new::<Postgres>().await?; |
| 1144 | + conn.execute( |
| 1145 | + r#" |
| 1146 | + CREATE TEMPORARY TABLE users (id INTEGER NOT NULL); |
| 1147 | + "#, |
| 1148 | + ) |
| 1149 | + .await?; |
| 1150 | + |
| 1151 | + let mut copy = conn |
| 1152 | + .copy_in_raw( |
| 1153 | + r#" |
| 1154 | + COPY users (id) FROM STDIN WITH (FORMAT CSV, HEADER); |
| 1155 | + "#, |
| 1156 | + ) |
| 1157 | + .await?; |
| 1158 | + |
| 1159 | + copy.abort("this is only a test").await?; |
| 1160 | + |
| 1161 | + // conn is safe for reuse |
| 1162 | + let value = sqlx::query("select 1 + 1") |
| 1163 | + .try_map(|row: PgRow| row.try_get::<i32, _>(0)) |
| 1164 | + .fetch_one(&mut conn) |
| 1165 | + .await?; |
| 1166 | + |
| 1167 | + assert_eq!(2i32, value); |
| 1168 | + |
| 1169 | + Ok(()) |
| 1170 | +} |
| 1171 | + |
| 1172 | +#[sqlx_macros::test] |
| 1173 | +async fn it_can_copy_out() -> anyhow::Result<()> { |
| 1174 | + let mut conn = new::<Postgres>().await?; |
| 1175 | + |
| 1176 | + { |
| 1177 | + let mut copy = conn |
| 1178 | + .copy_out_raw( |
| 1179 | + " |
| 1180 | + COPY (SELECT generate_series(1, 2) AS id) TO STDOUT WITH (FORMAT CSV, HEADER); |
| 1181 | + ", |
| 1182 | + ) |
| 1183 | + .await?; |
| 1184 | + |
| 1185 | + assert_eq!(copy.next().await.unwrap().unwrap(), "id\n"); |
| 1186 | + assert_eq!(copy.next().await.unwrap().unwrap(), "1\n"); |
| 1187 | + assert_eq!(copy.next().await.unwrap().unwrap(), "2\n"); |
| 1188 | + if copy.next().await.is_some() { |
| 1189 | + anyhow::bail!("Unexpected data from COPY"); |
| 1190 | + } |
| 1191 | + } |
| 1192 | + |
| 1193 | + // conn is safe for reuse |
| 1194 | + let value = sqlx::query("select 1 + 1") |
| 1195 | + .try_map(|row: PgRow| row.try_get::<i32, _>(0)) |
| 1196 | + .fetch_one(&mut conn) |
| 1197 | + .await?; |
| 1198 | + |
| 1199 | + assert_eq!(2i32, value); |
| 1200 | + |
| 1201 | + Ok(()) |
| 1202 | +} |
0 commit comments