in server/src/lsifServer.ts [103:146]
async function createDatabase(folder: WorkspaceFolder): Promise<Database | undefined> {
let uri: URI = URI.parse(folder.uri);
const fsPath = uri.fsPath;
const extName = path.extname(fsPath);
if (fs.existsSync(fsPath)) {
try {
let database: Database | undefined;
if (extName === '.db') {
const Sqlite = await import('better-sqlite3');
const db = new Sqlite(fsPath, { readonly: true });
let format = 'graph';
try {
format = db.prepare('Select * from format f').get().format;
} catch (err) {
// Old DBs have no format. Treat is as graph
} finally {
db.close();
}
if (format === 'blob') {
const module = await import('./blobStore');
database = new module.BlobStore();
} else {
const module = await import ('./graphStore');
database = new module.GraphStore();
}
} else if (extName === '.lsif') {
const module = await import('./jsonStore');
database = new module.JsonStore();
}
if (database !== undefined) {
let promise = database.load(fsPath, (workspaceRoot: string) => {
return new Transformer(uri, workspaceRoot);
}).then(() => {
return database!;
});
databases.set(getDatabaseKey(folder.uri), promise);
return promise;
}
} catch (error) {
throw error;
}
}
return Promise.reject(new Error(`Can't create database for ${folder.uri}`));
}