Skip to content

Commit ffd15b9

Browse files
committed
Merge remote-tracking branch 'upstream/pr/757'
2 parents 3a8c712 + b26dafc commit ffd15b9

File tree

2 files changed

+28
-37
lines changed

2 files changed

+28
-37
lines changed

src/tests/version.rs

Lines changed: 18 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
1-
use std::collections::HashMap;
1+
extern crate diesel;
2+
23
use rustc_serialize::json::Json;
34

45
use conduit::{Handler, Method};
5-
use semver;
6+
use self::diesel::prelude::*;
67

7-
use cargo_registry::db::RequestTransaction;
8-
use cargo_registry::version::{EncodableVersion, Version};
8+
use cargo_registry::version::EncodableVersion;
9+
use cargo_registry::schema::versions;
910

1011
#[derive(RustcDecodable)]
1112
struct VersionList {
@@ -16,28 +17,28 @@ struct VersionResponse {
1617
version: EncodableVersion,
1718
}
1819

19-
fn sv(s: &str) -> semver::Version {
20-
semver::Version::parse(s).unwrap()
21-
}
22-
2320
#[test]
2421
fn index() {
2522
let (_b, app, middle) = ::app();
26-
let mut req = ::req(app, Method::Get, "/api/v1/versions");
23+
let mut req = ::req(app.clone(), Method::Get, "/api/v1/versions");
2724
let mut response = ok_resp!(middle.call(&mut req));
2825
let json: VersionList = ::json(&mut response);
2926
assert_eq!(json.versions.len(), 0);
3027

3128
let (v1, v2) = {
32-
::mock_user(&mut req, ::user("foo"));
33-
let (c, _) = ::mock_crate(&mut req, ::krate("foo_vers_index"));
34-
let tx = req.tx().unwrap();
35-
let m = HashMap::new();
36-
let v1 = Version::insert(tx, c.id, &sv("2.0.0"), &m, &[]).unwrap();
37-
let v2 = Version::insert(tx, c.id, &sv("2.0.1"), &m, &[]).unwrap();
38-
(v1, v2)
29+
let conn = app.diesel_database.get().unwrap();
30+
let u = ::new_user("foo").create_or_update(&conn).unwrap();
31+
::CrateBuilder::new("foo_vers_index", u.id)
32+
.version("2.0.0")
33+
.version("2.0.1")
34+
.expect_build(&conn);
35+
let ids = versions::table
36+
.select(versions::id)
37+
.load::<i32>(&*conn)
38+
.unwrap();
39+
(ids[0], ids[1])
3940
};
40-
req.with_query(&format!("ids[]={}&ids[]={}", v1.id, v2.id));
41+
req.with_query(&format!("ids[]={}&ids[]={}", v1, v2));
4142
let mut response = ok_resp!(middle.call(&mut req));
4243
let json: VersionList = ::json(&mut response);
4344
assert_eq!(json.versions.len(), 2);

src/version.rs

Lines changed: 10 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -304,7 +304,8 @@ impl Model for Version {
304304
/// Handles the `GET /versions` route.
305305
// FIXME: where/how is this used?
306306
pub fn index(req: &mut Request) -> CargoResult<Response> {
307-
let conn = req.tx()?;
307+
use diesel::expression::dsl::any;
308+
let conn = req.db_conn()?;
308309

309310
// Extract all ids requested.
310311
let query = url::form_urlencoded::parse(req.query_string().unwrap_or("").as_bytes());
@@ -316,25 +317,14 @@ pub fn index(req: &mut Request) -> CargoResult<Response> {
316317
})
317318
.collect::<Vec<i32>>();
318319

319-
// Load all versions
320-
//
321-
// TODO: can rust-postgres do this for us?
322-
let mut versions = Vec::new();
323-
if !ids.is_empty() {
324-
let stmt = conn.prepare(
325-
"\
326-
SELECT versions.*, crates.name AS crate_name
327-
FROM versions
328-
LEFT JOIN crates ON crates.id = versions.crate_id
329-
WHERE versions.id = ANY($1)
330-
",
331-
)?;
332-
for row in stmt.query(&[&ids])?.iter() {
333-
let v: Version = Model::from_row(&row);
334-
let crate_name: String = row.get("crate_name");
335-
versions.push(v.encodable(&crate_name));
336-
}
337-
}
320+
let versions = versions::table
321+
.inner_join(crates::table)
322+
.select((versions::all_columns, crates::name))
323+
.filter(versions::id.eq(any(ids)))
324+
.load::<(Version, String)>(&*conn)?
325+
.into_iter()
326+
.map(|(version, crate_name)| version.encodable(&crate_name))
327+
.collect();
338328

339329
#[derive(RustcEncodable)]
340330
struct R {

0 commit comments

Comments
 (0)