@@ -30,10 +30,15 @@ pub fn cache(config: &Config, conn: &mut Connection) -> Result<(), Box<dyn Error
3030 project TEXT,
3131 envline TEXT
3232 );
33+ CREATE TABLE aliases (
34+ project TEXT,
35+ alias TEXT
36+ );
3337 CREATE INDEX idx_project ON provides(project);
3438 CREATE INDEX idx_program ON provides(program);
3539 CREATE INDEX idx_project_dependencies ON dependencies(project);
3640 CREATE INDEX idx_project_companions ON companions(project);
41+ CREATE INDEX idx_alias_project ON aliases(alias);
3742 " ,
3843 ) ?;
3944
@@ -53,6 +58,13 @@ pub fn cache(config: &Config, conn: &mut Connection) -> Result<(), Box<dyn Error
5358 ) ?;
5459 }
5560
61+ if let Some ( display_name) = pkg. display_name {
62+ tx. execute (
63+ "INSERT INTO aliases (project, alias) VALUES (?1, ?2);" ,
64+ params ! [ pkg. project, display_name] ,
65+ ) ?;
66+ }
67+
5668 for dep in pkg. deps {
5769 tx. execute (
5870 "INSERT INTO dependencies (project, pkgspec) VALUES (?1, ?2);" ,
@@ -103,6 +115,24 @@ pub fn which(cmd: &String, conn: &Connection) -> Result<Vec<String>, rusqlite::E
103115 Ok ( rv)
104116}
105117
118+ pub fn projects_for_symbol (
119+ symbol : & String ,
120+ conn : & Connection ,
121+ ) -> Result < Vec < String > , rusqlite:: Error > {
122+ let mut stmt = conn. prepare (
123+ "
124+ SELECT project FROM provides WHERE program = ?1
125+ UNION
126+ SELECT project FROM aliases WHERE LOWER(alias) = LOWER(?1);" ,
127+ ) ?;
128+ let mut rv = Vec :: new ( ) ;
129+ let mut rows = stmt. query ( params ! [ symbol] ) ?;
130+ while let Some ( row) = rows. next ( ) ? {
131+ rv. push ( row. get ( 0 ) ?) ;
132+ }
133+ Ok ( rv)
134+ }
135+
106136pub fn runtime_env_for_project (
107137 project : & String ,
108138 conn : & Connection ,
0 commit comments