11use std:: fmt:: Display ;
2+ use std:: sync:: { Arc , Mutex } ;
23
34use pyo3:: prelude:: * ;
45
@@ -10,17 +11,17 @@ use crate::stack_graphs_wrapper::{
1011 get_status, get_status_all, index_all, new_loader, query_definition,
1112} ;
1213
13- #[ pyclass]
14- #[ derive( Clone ) ]
14+ #[ pyclass( eq , eq_int ) ]
15+ #[ derive( Clone , PartialEq ) ]
1516pub enum Language {
1617 Python ,
1718 JavaScript ,
1819 TypeScript ,
1920 Java ,
2021}
2122
22- #[ pyclass]
23- #[ derive( Clone ) ]
23+ #[ pyclass( eq , eq_int ) ]
24+ #[ derive( Clone , PartialEq ) ]
2425pub enum FileStatus {
2526 Missing ,
2627 Indexed ,
@@ -103,7 +104,7 @@ pub struct Position {
103104
104105#[ pyclass]
105106pub struct Querier {
106- db_reader : SQLiteReader ,
107+ db_reader : Arc < Mutex < SQLiteReader > > ,
107108 db_path : String ,
108109}
109110
@@ -113,13 +114,15 @@ impl Querier {
113114 pub fn new ( db_path : String ) -> Self {
114115 println ! ( "Opening database: {}" , db_path) ;
115116 Querier {
116- db_reader : SQLiteReader :: open ( db_path. clone ( ) ) . unwrap ( ) ,
117+ db_reader : Arc :: new ( Mutex :: new (
118+ SQLiteReader :: open ( db_path. clone ( ) ) . unwrap ( ) . into ( ) ,
119+ ) ) ,
117120 db_path : db_path,
118121 }
119122 }
120123
121124 pub fn definitions ( & mut self , reference : Position ) -> PyResult < Vec < Position > > {
122- let result = query_definition ( reference. into ( ) , & mut self . db_reader ) ?;
125+ let result = query_definition ( reference. into ( ) , & mut * self . db_reader . lock ( ) . unwrap ( ) ) ?;
123126
124127 let positions: Vec < Position > = result
125128 . into_iter ( )
@@ -138,8 +141,8 @@ impl Querier {
138141
139142#[ pyclass]
140143pub struct Indexer {
141- db_writer : SQLiteWriter ,
142- db_reader : SQLiteReader ,
144+ db_writer : Arc < Mutex < SQLiteWriter > > ,
145+ db_reader : Arc < Mutex < SQLiteReader > > ,
143146 db_path : String ,
144147 loader : Loader ,
145148}
@@ -149,8 +152,8 @@ impl Indexer {
149152 #[ new]
150153 pub fn new ( db_path : String , languages : Vec < Language > ) -> Self {
151154 Indexer {
152- db_writer : SQLiteWriter :: open ( db_path. clone ( ) ) . unwrap ( ) ,
153- db_reader : SQLiteReader :: open ( db_path. clone ( ) ) . unwrap ( ) ,
155+ db_writer : Arc :: new ( Mutex :: new ( SQLiteWriter :: open ( db_path. clone ( ) ) . unwrap ( ) ) ) ,
156+ db_reader : Arc :: new ( Mutex :: new ( SQLiteReader :: open ( db_path. clone ( ) ) . unwrap ( ) ) ) ,
154157 db_path : db_path,
155158 loader : new_loader ( languages) ,
156159 }
@@ -160,7 +163,11 @@ impl Indexer {
160163 let paths: Vec < std:: path:: PathBuf > =
161164 paths. iter ( ) . map ( |p| std:: path:: PathBuf :: from ( p) ) . collect ( ) ;
162165
163- match index_all ( paths, & mut self . loader , & mut self . db_writer ) {
166+ match index_all (
167+ paths,
168+ & mut self . loader ,
169+ & mut * self . db_writer . lock ( ) . unwrap ( ) ,
170+ ) {
164171 Ok ( _) => Ok ( ( ) ) ,
165172 Err ( e) => Err ( e. into ( ) ) ,
166173 }
@@ -170,14 +177,14 @@ impl Indexer {
170177 let paths: Vec < std:: path:: PathBuf > =
171178 paths. iter ( ) . map ( |p| std:: path:: PathBuf :: from ( p) ) . collect ( ) ;
172179
173- get_status ( paths, & mut self . db_reader ) ?
180+ get_status ( paths, & mut * self . db_reader . lock ( ) . unwrap ( ) ) ?
174181 . into_iter ( )
175182 . map ( |e| Ok ( e. into ( ) ) )
176183 . collect ( )
177184 }
178185
179186 pub fn status_all ( & mut self ) -> PyResult < Vec < FileEntry > > {
180- get_status_all ( & mut self . db_reader ) ?
187+ get_status_all ( & mut * self . db_reader . lock ( ) . unwrap ( ) ) ?
181188 . into_iter ( )
182189 . map ( |e| Ok ( e. into ( ) ) )
183190 . collect ( )
0 commit comments