@@ -338,19 +338,33 @@ impl Crate {
338
338
}
339
339
340
340
/// Returns (dependency, dependent crate name)
341
- pub fn reverse_dependencies ( & self , conn : & Connection ) -> CargoResult < Vec < ( Dependency , String ) > > {
342
- let stmt = try!( conn. prepare ( "SELECT dependencies.*,
343
- crates.name AS crate_name
344
- FROM dependencies
345
- INNER JOIN versions
346
- ON versions.id = dependencies.version_id
347
- INNER JOIN crates
348
- ON crates.id = versions.crate_id
349
- WHERE dependencies.crate_id = $1
350
- AND versions.num = crates.max_version" ) ) ;
351
- Ok ( try!( stmt. query ( & [ & self . id ] ) ) . map ( |r| {
341
+ pub fn reverse_dependencies ( & self , conn : & Connection , offset : i64 , limit : i64 )
342
+ -> CargoResult < ( Vec < ( Dependency , String ) > , i64 ) > {
343
+ let select_sql = "
344
+ FROM dependencies
345
+ INNER JOIN versions
346
+ ON versions.id = dependencies.version_id
347
+ INNER JOIN crates
348
+ ON crates.id = versions.crate_id
349
+ WHERE dependencies.crate_id = $1
350
+ AND versions.num = crates.max_version
351
+ " ;
352
+ let fetch_sql = format ! ( "SELECT dependencies.*,
353
+ crates.name AS crate_name
354
+ {}
355
+ ORDER BY crate_name ASC
356
+ OFFSET $2
357
+ LIMIT $3" , select_sql) ;
358
+ let count_sql = format ! ( "SELECT COUNT(dependencies.*) {}" , select_sql) ;
359
+
360
+ let stmt = try!( conn. prepare ( fetch_sql. as_slice ( ) ) ) ;
361
+ let vec: Vec < _ > = try!( stmt. query ( & [ & self . id , & offset, & limit] ) ) . map ( |r| {
352
362
( Model :: from_row ( & r) , r. get ( "crate_name" ) )
353
- } ) . collect ( ) )
363
+ } ) . collect ( ) ;
364
+ let stmt = try!( conn. prepare ( count_sql. as_slice ( ) ) ) ;
365
+ let cnt: i64 = try!( stmt. query ( & [ & self . id ] ) ) . next ( ) . unwrap ( ) . get ( 0 ) ;
366
+
367
+ Ok ( ( vec, cnt) )
354
368
}
355
369
}
356
370
@@ -885,12 +899,16 @@ pub fn reverse_dependencies(req: &mut Request) -> CargoResult<Response> {
885
899
let conn = try!( req. tx ( ) ) ;
886
900
let krate = try!( Crate :: find_by_name ( conn, name. as_slice ( ) ) ) ;
887
901
let tx = try!( req. tx ( ) ) ;
888
- let rev_deps = try!( krate. reverse_dependencies ( tx) ) ;
902
+ let ( offset, limit) = try!( req. pagination ( 10 , 100 ) ) ;
903
+ let ( rev_deps, total) = try!( krate. reverse_dependencies ( tx, offset, limit) ) ;
889
904
let rev_deps = rev_deps. into_iter ( ) . map ( |( dep, crate_name) | {
890
905
dep. encodable ( crate_name. as_slice ( ) )
891
906
} ) . collect ( ) ;
892
907
893
908
#[ deriving( Encodable ) ]
894
- struct R { dependencies : Vec < EncodableDependency > }
895
- Ok ( req. json ( & R { dependencies : rev_deps } ) )
909
+ struct R { dependencies : Vec < EncodableDependency > , meta : Meta }
910
+ #[ deriving( Encodable ) ]
911
+ struct Meta { total : i64 }
912
+ Ok ( req. json ( & R { dependencies : rev_deps, meta : Meta { total : total } } ) )
896
913
}
914
+
0 commit comments