package org.mercury_im.messenger.cli.di.module; import org.h2.jdbcx.JdbcDataSource; import org.mercury_im.messenger.core.util.ThreadUtils; import org.mercury_im.messenger.data.model.Models; import java.util.concurrent.Executors; import javax.inject.Named; import javax.inject.Singleton; import dagger.Module; import dagger.Provides; import io.reactivex.Scheduler; import io.reactivex.schedulers.Schedulers; import io.requery.Persistable; import io.requery.cache.EmptyEntityCache; import io.requery.reactivex.ReactiveEntityStore; import io.requery.reactivex.ReactiveSupport; import io.requery.sql.Configuration; import io.requery.sql.ConfigurationBuilder; import io.requery.sql.EntityDataStore; import io.requery.sql.SchemaModifier; import io.requery.sql.TableCreationMode; @Module public class CliPersistenceModule { private static Scheduler scheduler = Schedulers.newThread(); @Provides @Singleton static ReactiveEntityStore provideDatabase() { JdbcDataSource dataSource = new JdbcDataSource(); dataSource.setUrl("jdbc:h2:~/mercury_req_db"); dataSource.setUser("sa"); dataSource.setPassword("sa"); // override onUpgrade to handle migrating to a new version Configuration configuration = new ConfigurationBuilder(dataSource, Models.DEFAULT) .useDefaultLogging() .setEntityCache(new EmptyEntityCache()) .setWriteExecutor(Executors.newSingleThreadExecutor()) .build(); SchemaModifier tables = new SchemaModifier(configuration); tables.createTables(TableCreationMode.DROP_CREATE); System.out.println(tables.createTablesString(TableCreationMode.DROP_CREATE)); return ReactiveSupport.toReactiveStore(new EntityDataStore<>(configuration)); } @Provides @Named(value = ThreadUtils.SCHEDULER_IO) @Singleton static Scheduler provideDatabaseThread() { return Schedulers.io(); } @Provides @Named(value = ThreadUtils.SCHEDULER_UI) @Singleton static Scheduler providerUIThread() { return scheduler; } }