@@ -5,67 +5,74 @@ use super::DocBuilder;
5
5
use db:: connect_db;
6
6
use error:: Result ;
7
7
use crates_index_diff:: { ChangeKind , Index } ;
8
+ use utils:: add_crate_to_queue;
8
9
9
10
10
11
impl DocBuilder {
11
12
/// Updates crates.io-index repository and adds new crates into build queue.
12
13
/// Returns size of queue
13
- pub fn get_new_crates ( & mut self ) -> Result < i64 > {
14
+ pub fn get_new_crates ( & mut self ) -> Result < usize > {
14
15
let conn = try!( connect_db ( ) ) ;
15
16
let index = try!( Index :: from_path_or_cloned ( & self . options . crates_io_index_path ) ) ;
16
17
let mut changes = try!( index. fetch_changes ( ) ) ;
18
+ let mut add_count: usize = 0 ;
17
19
18
20
// I belive this will fix ordering of queue if we get more than one crate from changes
19
21
changes. reverse ( ) ;
20
22
21
23
for krate in changes. iter ( ) . filter ( |k| k. kind != ChangeKind :: Yanked ) {
22
- conn. execute ( "INSERT INTO queue (name, version) VALUES ($1, $2)" ,
23
- & [ & krate. name , & krate. version ] )
24
- . ok ( ) ;
24
+ add_crate_to_queue ( & conn, & krate. name , & krate. version , 0 ) . ok ( ) ;
25
25
debug ! ( "{}-{} added into build queue" , krate. name, krate. version) ;
26
+ add_count += 1 ;
26
27
}
27
28
28
- let queue_count = conn. query ( "SELECT COUNT(*) FROM queue WHERE attempt < 5" , & [ ] )
29
+ Ok ( add_count)
30
+ }
31
+
32
+ pub fn get_queue_count ( & self ) -> Result < i64 > {
33
+ let conn = try!( connect_db ( ) ) ;
34
+ Ok ( conn. query ( "SELECT COUNT(*) FROM queue WHERE attempt < 5" , & [ ] )
29
35
. unwrap ( )
30
36
. get ( 0 )
31
- . get ( 0 ) ;
32
-
33
- Ok ( queue_count)
37
+ . get ( 0 ) )
34
38
}
35
39
36
-
37
- /// Builds packages from queue
38
- pub fn build_packages_queue ( & mut self ) -> Result < usize > {
40
+ /// Builds the top package from the queue. Returns whether the queue was empty.
41
+ pub fn build_next_queue_package ( & mut self ) -> Result < bool > {
39
42
let conn = try!( connect_db ( ) ) ;
40
- let mut build_count = 0 ;
41
43
42
- for row in & try!( conn. query ( "SELECT id, name, version
44
+ let query = try!( conn. query ( "SELECT id, name, version
43
45
FROM queue
44
46
WHERE attempt < 5
45
- ORDER BY id ASC" ,
46
- & [ ] ) ) {
47
- let id: i32 = row. get ( 0 ) ;
48
- let name: String = row. get ( 1 ) ;
49
- let version: String = row. get ( 2 ) ;
50
-
51
- match self . build_package ( & name[ ..] , & version[ ..] ) {
52
- Ok ( _) => {
53
- build_count += 1 ;
54
- let _ = conn. execute ( "DELETE FROM queue WHERE id = $1" , & [ & id] ) ;
55
- }
56
- Err ( e) => {
57
- // Increase attempt count
58
- let _ = conn. execute ( "UPDATE queue SET attempt = attempt + 1 WHERE id = $1" ,
59
- & [ & id] ) ;
60
- error ! ( "Failed to build package {}-{} from queue: {}" ,
61
- name,
62
- version,
63
- e)
64
- }
47
+ ORDER BY priority ASC, attempt ASC, id ASC
48
+ LIMIT 1" ,
49
+ & [ ] ) ) ;
50
+
51
+ if query. is_empty ( ) {
52
+ // nothing in the queue; bail
53
+ return Ok ( false ) ;
54
+ }
55
+
56
+ let id: i32 = query. get ( 0 ) . get ( 0 ) ;
57
+ let name: String = query. get ( 0 ) . get ( 1 ) ;
58
+ let version: String = query. get ( 0 ) . get ( 2 ) ;
59
+
60
+ match self . build_package ( & name[ ..] , & version[ ..] ) {
61
+ Ok ( _) => {
62
+ let _ = conn. execute ( "DELETE FROM queue WHERE id = $1" , & [ & id] ) ;
63
+ }
64
+ Err ( e) => {
65
+ // Increase attempt count
66
+ let _ = conn. execute ( "UPDATE queue SET attempt = attempt + 1 WHERE id = $1" ,
67
+ & [ & id] ) ;
68
+ error ! ( "Failed to build package {}-{} from queue: {}" ,
69
+ name,
70
+ version,
71
+ e)
65
72
}
66
73
}
67
74
68
- Ok ( build_count )
75
+ Ok ( true )
69
76
}
70
77
}
71
78
@@ -87,14 +94,4 @@ mod test {
87
94
}
88
95
assert ! ( res. is_ok( ) ) ;
89
96
}
90
-
91
-
92
- #[ test]
93
- #[ ignore]
94
- fn test_build_packages_queue ( ) {
95
- let _ = env_logger:: try_init ( ) ;
96
- let options = DocBuilderOptions :: from_prefix ( PathBuf :: from ( "../cratesfyi-prefix" ) ) ;
97
- let mut docbuilder = DocBuilder :: new ( options) ;
98
- assert ! ( docbuilder. build_packages_queue( ) . is_ok( ) ) ;
99
- }
100
97
}
0 commit comments