Skip to content

Commit 60e4647

Browse files
committed
Refactor queries to use the more semantic postgres::Client methods
1 parent 5c7f288 commit 60e4647

File tree

17 files changed

+157
-181
lines changed

17 files changed

+157
-181
lines changed

src/bin/cratesfyi.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -372,9 +372,9 @@ impl BuildSubcommand {
372372
.get()
373373
.context("failed to get a database connection")?;
374374
let res =
375-
conn.query("SELECT * FROM config WHERE name = 'rustc_version';", &[])?;
375+
conn.query_one("SELECT COUNT(*) > 1 FROM config WHERE name = 'rustc_version';", &[])?;
376376

377-
if !res.is_empty() {
377+
if res.get(0) {
378378
println!("update-toolchain was already called in the past, exiting");
379379
return Ok(());
380380
}

src/build_queue.rs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -35,27 +35,27 @@ impl BuildQueue {
3535
}
3636

3737
pub(crate) fn pending_count(&self) -> Result<usize> {
38-
let res = self.db.get()?.query(
38+
let res = self.db.get()?.query_one(
3939
"SELECT COUNT(*) FROM queue WHERE attempt < $1;",
4040
&[&self.max_attempts],
4141
)?;
42-
Ok(res[0].get::<_, i64>(0) as usize)
42+
Ok(res.get::<_, i64>(0) as usize)
4343
}
4444

4545
pub(crate) fn prioritized_count(&self) -> Result<usize> {
46-
let res = self.db.get()?.query(
46+
let res = self.db.get()?.query_one(
4747
"SELECT COUNT(*) FROM queue WHERE attempt < $1 AND priority <= 0;",
4848
&[&self.max_attempts],
4949
)?;
50-
Ok(res[0].get::<_, i64>(0) as usize)
50+
Ok(res.get::<_, i64>(0) as usize)
5151
}
5252

5353
pub(crate) fn failed_count(&self) -> Result<usize> {
54-
let res = self.db.get()?.query(
54+
let res = self.db.get()?.query_one(
5555
"SELECT COUNT(*) FROM queue WHERE attempt >= $1;",
5656
&[&self.max_attempts],
5757
)?;
58-
Ok(res[0].get::<_, i64>(0) as usize)
58+
Ok(res.get::<_, i64>(0) as usize)
5959
}
6060

6161
pub(crate) fn queued_crates(&self) -> Result<Vec<QueuedCrate>> {
@@ -98,11 +98,11 @@ impl BuildQueue {
9898
}
9999
Err(e) => {
100100
// Increase attempt count
101-
let rows = conn.query(
101+
let rows = conn.query_one(
102102
"UPDATE queue SET attempt = attempt + 1 WHERE id = $1 RETURNING attempt;",
103103
&[&to_process.id],
104104
)?;
105-
let attempt: i32 = rows[0].get(0);
105+
let attempt: i32 = rows.get(0);
106106

107107
if attempt >= self.max_attempts {
108108
crate::web::metrics::FAILED_BUILDS.inc();

src/db/add_package.rs

Lines changed: 55 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,7 @@ pub(crate) fn add_build_into_database(
137137
res: &BuildResult,
138138
) -> Result<i32> {
139139
debug!("Adding build into database");
140-
let rows = conn.query(
140+
let row = conn.query_one(
141141
"INSERT INTO builds (rid, rustc_version,
142142
cratesfyi_version,
143143
build_status, output)
@@ -151,19 +151,20 @@ pub(crate) fn add_build_into_database(
151151
&res.build_log,
152152
],
153153
)?;
154-
Ok(rows[0].get(0))
154+
Ok(row.get(0))
155155
}
156156

157157
fn initialize_package_in_database(conn: &mut Client, pkg: &MetadataPackage) -> Result<i32> {
158-
let mut rows = conn.query("SELECT id FROM crates WHERE name = $1", &[&pkg.name])?;
159158
// insert crate into database if it is not exists
160-
if rows.is_empty() {
161-
rows = conn.query(
162-
"INSERT INTO crates (name) VALUES ($1) RETURNING id",
159+
let row = conn.query_opt("SELECT id FROM crates WHERE name = $1", &[&pkg.name])
160+
.transpose()
161+
.unwrap_or_else(|| conn.query_one(
162+
"INSERT INTO crates (name)
163+
VALUES ($1)
164+
RETURNING id",
163165
&[&pkg.name],
164-
)?;
165-
}
166-
Ok(rows[0].get(0))
166+
))?;
167+
Ok(row.get(0))
167168
}
168169

169170
/// Convert dependencies into Vec<(String, String, String)>
@@ -257,23 +258,23 @@ fn add_keywords_into_database(
257258
for keyword in &pkg.keywords {
258259
let slug = slugify(&keyword);
259260
let keyword_id: i32 = {
260-
let rows = conn.query("SELECT id FROM keywords WHERE slug = $1", &[&slug])?;
261-
if !rows.is_empty() {
262-
rows[0].get(0)
263-
} else {
264-
conn.query(
265-
"INSERT INTO keywords (name, slug) VALUES ($1, $2) RETURNING id",
261+
conn.query_opt("SELECT id FROM keywords WHERE slug = $1", &[&slug])
262+
.transpose()
263+
.unwrap_or_else(|| conn.query_one(
264+
"INSERT INTO keywords (name, slug)
265+
VALUES ($1, $2)
266+
RETURNING id",
266267
&[&keyword, &slug],
267-
)?[0]
268-
.get(0)
269-
}
268+
))?.get(0)
270269
};
271270

272-
// add releationship
273-
let _ = conn.query(
274-
"INSERT INTO keyword_rels (rid, kid) VALUES ($1, $2)",
271+
// add relationship
272+
conn.execute(
273+
"INSERT INTO keyword_rels (rid, kid)
274+
VALUES ($1, $2)
275+
ON CONFLICT DO NOTHING",
275276
&[&release_id, &keyword_id],
276-
);
277+
)?;
277278
}
278279

279280
Ok(())
@@ -301,24 +302,31 @@ fn add_authors_into_database(
301302
let slug = slugify(&author);
302303

303304
let author_id: i32 = {
304-
let rows = conn.query("SELECT id FROM authors WHERE slug = $1", &[&slug])?;
305-
if !rows.is_empty() {
306-
rows[0].get(0)
307-
} else {
308-
conn.query(
309-
"INSERT INTO authors (name, email, slug) VALUES ($1, $2, $3)
310-
RETURNING id",
311-
&[&author, &email, &slug],
312-
)?[0]
313-
.get(0)
314-
}
305+
// TODO: If an author uses different email addresses per crate, or multiple authors
306+
// have the same slugified name, this will flip-flop their name and email address
307+
// on each crate publish.
308+
//
309+
// But, at least doing an upsert will result in their email/exact name rendering
310+
// being updated if they change it in a new release.
311+
conn.query_one(
312+
"INSERT INTO authors (name, email, slug)
313+
VALUES ($1, $2, $3)
314+
ON CONFLICT (slug) DO UPDATE
315+
SET
316+
name = $1,
317+
email = $2
318+
RETURNING id",
319+
&[&author, &email, &slug],
320+
)?.get(0)
315321
};
316322

317323
// add relationship
318-
let _ = conn.query(
319-
"INSERT INTO author_rels (rid, aid) VALUES ($1, $2)",
324+
conn.execute(
325+
"INSERT INTO author_rels (rid, aid)
326+
VALUES ($1, $2)
327+
ON CONFLICT DO NOTHING",
320328
&[&release_id, &author_id],
321-
);
329+
)?;
322330
}
323331
}
324332

@@ -331,7 +339,12 @@ pub fn update_crate_data_in_database(
331339
registry_data: &CrateData,
332340
) -> Result<()> {
333341
info!("Updating crate data for {}", name);
334-
let crate_id = conn.query("SELECT id FROM crates WHERE crates.name = $1", &[&name])?[0].get(0);
342+
let crate_id = conn.query_one(
343+
"SELECT id
344+
FROM crates
345+
WHERE crates.name = $1",
346+
&[&name],
347+
)?.get(0);
335348

336349
update_owners_in_database(conn, &registry_data.owners, crate_id)?;
337350

@@ -362,7 +375,7 @@ fn update_owners_in_database(
362375
// Update any existing owner data since it is mutable and could have changed since last
363376
// time we pulled it
364377
let owner_id: i32 = {
365-
conn.query(
378+
conn.query_one(
366379
"
367380
INSERT INTO owners (login, avatar, name, email)
368381
VALUES ($1, $2, $3, $4)
@@ -374,12 +387,11 @@ fn update_owners_in_database(
374387
RETURNING id
375388
",
376389
&[&owner.login, &owner.avatar, &owner.name, &owner.email],
377-
)?[0]
378-
.get(0)
390+
)?.get(0)
379391
};
380392

381393
// add relationship
382-
conn.query(
394+
conn.execute(
383395
"INSERT INTO owner_rels (cid, oid) VALUES ($1, $2) ON CONFLICT DO NOTHING",
384396
&[&crate_id, &owner_id],
385397
)?;
@@ -391,7 +403,7 @@ fn update_owners_in_database(
391403
for login in to_remove {
392404
debug!("Removing owner relationship {}", login);
393405
// remove relationship
394-
conn.query(
406+
conn.execute(
395407
"
396408
DELETE FROM owner_rels
397409
USING owners
@@ -417,7 +429,7 @@ where
417429
ON CONFLICT DO NOTHING;";
418430
let prepared = conn.prepare(sql)?;
419431
for alg in algorithms {
420-
conn.query(&prepared, &[&release_id, &(alg as i32)])?;
432+
conn.execute(&prepared, &[&release_id, &(alg as i32)])?;
421433
}
422434
Ok(())
423435
}

src/db/blacklist.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,11 @@ enum BlacklistError {
1212

1313
/// Returns whether the given name is blacklisted.
1414
pub fn is_blacklisted(conn: &mut Client, name: &str) -> Result<bool, Error> {
15-
let rows = conn.query(
15+
let row = conn.query_one(
1616
"SELECT COUNT(*) FROM blacklisted_crates WHERE crate_name = $1;",
1717
&[&name],
1818
)?;
19-
let count: i64 = rows[0].get(0);
19+
let count: i64 = row.get(0);
2020

2121
Ok(count != 0)
2222
}

src/db/delete.rs

Lines changed: 10 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,8 @@ pub fn delete_version(
3939
}
4040

4141
fn get_id(conn: &mut Client, name: &str) -> Result<i32, Error> {
42-
let crate_id_res = conn.query("SELECT id FROM crates WHERE name = $1", &[&name])?;
43-
if let Some(row) = crate_id_res.into_iter().next() {
42+
let row = conn.query_opt("SELECT id FROM crates WHERE name = $1", &[&name])?;
43+
if let Some(row) = row {
4444
Ok(row.get("id"))
4545
} else {
4646
Err(CrateDeletionError::MissingCrate(name.into()).into())
@@ -123,15 +123,15 @@ mod tests {
123123
use postgres::Client;
124124

125125
fn crate_exists(conn: &mut Client, name: &str) -> Result<bool, Error> {
126-
Ok(!conn
127-
.query("SELECT * FROM crates WHERE name = $1;", &[&name])?
128-
.is_empty())
126+
Ok(conn
127+
.query_one("SELECT COUNT(*) > 0 FROM crates WHERE name = $1;", &[&name])?
128+
.get(0))
129129
}
130130

131131
fn release_exists(conn: &mut Client, id: i32) -> Result<bool, Error> {
132-
Ok(!conn
133-
.query("SELECT * FROM releases WHERE id = $1;", &[&id])?
134-
.is_empty())
132+
Ok(conn
133+
.query_one("SELECT COUNT(*) > 0 FROM releases WHERE id = $1;", &[&id])?
134+
.get(0))
135135
}
136136

137137
#[test]
@@ -160,7 +160,7 @@ mod tests {
160160

161161
let pkg1_id = &db
162162
.conn()
163-
.query("SELECT id FROM crates WHERE name = 'package-1';", &[])?[0]
163+
.query_one("SELECT id FROM crates WHERE name = 'package-1';", &[])?
164164
.get("id");
165165

166166
delete_crate_from_database(&mut db.conn(), "package-1", *pkg1_id)?;
@@ -209,10 +209,7 @@ mod tests {
209209
assert!(release_exists(&mut db.conn(), v2)?);
210210
let crate_id = db
211211
.conn()
212-
.query("SELECT crate_id FROM releases WHERE id = $1", &[&v1])?
213-
.into_iter()
214-
.next()
215-
.unwrap()
212+
.query_one("SELECT crate_id FROM releases WHERE id = $1", &[&v1])?
216213
.get(0);
217214
assert_eq!(
218215
authors(&mut db.conn(), crate_id)?,

src/docbuilder/limits.rs

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -28,12 +28,11 @@ impl Limits {
2828
pub(crate) fn for_crate(conn: &mut Client, name: &str) -> Result<Self> {
2929
let mut limits = Self::default();
3030

31-
let res = conn.query(
31+
let res = conn.query_opt(
3232
"SELECT * FROM sandbox_overrides WHERE crate_name = $1;",
3333
&[&name],
3434
)?;
35-
if !res.is_empty() {
36-
let row = &res[0];
35+
if let Some(row) = res {
3736
if let Some(memory) = row.get::<_, Option<i64>>("max_memory_bytes") {
3837
limits.memory = memory as usize;
3938
}
@@ -84,7 +83,7 @@ mod test {
8483
let hexponent = Limits::for_crate(&mut db.conn(), krate)?;
8584
assert_eq!(hexponent, Limits::default());
8685

87-
db.conn().query(
86+
db.conn().execute(
8887
"INSERT INTO sandbox_overrides (crate_name, max_targets) VALUES ($1, 15)",
8988
&[&krate],
9089
)?;
@@ -106,7 +105,7 @@ mod test {
106105
targets: 1,
107106
..Limits::default()
108107
};
109-
db.conn().query(
108+
db.conn().execute(
110109
"INSERT INTO sandbox_overrides (crate_name, max_memory_bytes, timeout_seconds, max_targets)
111110
VALUES ($1, $2, $3, $4)",
112111
&[&krate, &(limits.memory as i64), &(limits.timeout.as_secs() as i32), &(limits.targets as i32)]

src/docbuilder/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ impl DocBuilder {
6868
debug!("Loading database cache");
6969

7070
let mut conn = self.db.get()?;
71-
for row in &mut conn.query(
71+
for row in conn.query(
7272
"SELECT name, version FROM crates, releases \
7373
WHERE crates.id = releases.crate_id",
7474
&[],

src/docbuilder/rustwide_builder.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -260,7 +260,7 @@ impl RustwideBuilder {
260260
}
261261

262262
add_path_into_database(&self.storage, "", &dest)?;
263-
conn.query(
263+
conn.execute(
264264
"INSERT INTO config (name, value) VALUES ('rustc_version', $1) \
265265
ON CONFLICT (name) DO UPDATE SET value = $1;",
266266
&[&Value::String(self.rustc_version.clone())],

0 commit comments

Comments
 (0)