@@ -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,10 @@ 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 ( "INSERT INTO aliases (project, alias) VALUES (?1, ?2);" , params ! [ pkg. project, display_name] ) ?;
63+ }
64+
5665 for dep in pkg. deps {
5766 tx. execute (
5867 "INSERT INTO dependencies (project, pkgspec) VALUES (?1, ?2);" ,
@@ -103,6 +112,19 @@ pub fn which(cmd: &String, conn: &Connection) -> Result<Vec<String>, rusqlite::E
103112 Ok ( rv)
104113}
105114
115+ pub fn projects_for_symbol ( symbol : & String , conn : & Connection ) -> Result < Vec < String > , rusqlite:: Error > {
116+ let mut stmt = conn. prepare ( "
117+ SELECT project FROM provides WHERE program = ?1
118+ UNION
119+ SELECT project FROM aliases WHERE alias = ?1;" ) ?;
120+ let mut rv = Vec :: new ( ) ;
121+ let mut rows = stmt. query ( params ! [ symbol] ) ?;
122+ while let Some ( row) = rows. next ( ) ? {
123+ rv. push ( row. get ( 0 ) ?) ;
124+ }
125+ Ok ( rv)
126+ }
127+
106128pub fn runtime_env_for_project (
107129 project : & String ,
108130 conn : & Connection ,
0 commit comments