nymanjens / facto

Family Accounting Tool
Other
207 stars 2 forks source link

Database initialization doesn't complete on Windows #11

Open drislands opened 1 year ago

drislands commented 1 year ago

Hi,

I'm currently trying to do a first-time setup, and it seems that at least one of the steps is silently failing. These are the issues I've encountered since I started:

Creating the new DB fails, stating it cannot find the database facto. ```D:\Installs\Family Accounting Tool>bin\server -DdropAndCreateNewDb [info] application - Creating Pool for datasource 'default' [error] c.z.h.p.HikariPool - HikariPool-1 - Exception during pool initialization. com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown database 'facto' at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source) at java.lang.reflect.Constructor.newInstance(Unknown Source) at com.mysql.jdbc.Util.handleNewInstance(Util.java:400) at com.mysql.jdbc.Util.getInstance(Util.java:383) at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:980) at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3847) at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3783) at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:871) Oops, cannot start the server. Configuration error: Configuration error[Cannot connect to database [default]] at play.api.Configuration$.configError(Configuration.scala:156) at play.api.Configuration.reportError(Configuration.scala:990) at play.api.db.DefaultDBApi.$anonfun$connect$1(DefaultDBApi.scala:48) at play.api.db.DefaultDBApi.$anonfun$connect$1$adapted(DefaultDBApi.scala:42) at scala.collection.immutable.List.foreach(List.scala:389) at play.api.db.DefaultDBApi.connect(DefaultDBApi.scala:42) at play.api.db.DBApiProvider.get$lzycompute(DBModule.scala:86) at play.api.db.DBApiProvider.get(DBModule.scala:75) at play.api.db.DBApiProvider.get(DBModule.scala:56) at com.google.inject.internal.ProviderInternalFactory.provision(ProviderInternalFactory.java:81) at com.google.inject.internal.BoundProviderFactory.provision(BoundProviderFactory.java:72) at com.google.inject.internal.ProviderInternalFactory.circularGet(ProviderInternalFactory.java:61) at com.google.inject.internal.BoundProviderFactory.get(BoundProviderFactory.java:62) at com.google.inject.internal.SingleFieldInjector.inject(SingleFieldInjector.java:54) at com.google.inject.internal.MembersInjectorImpl.injectMembers(MembersInjectorImpl.java:132) at com.google.inject.internal.MembersInjectorImpl$1.call(MembersInjectorImpl.java:93) at com.google.inject.internal.MembersInjectorImpl$1.call(MembersInjectorImpl.java:80) at com.google.inject.internal.InjectorImpl.callInContext(InjectorImpl.java:1092) at com.google.inject.internal.MembersInjectorImpl.injectAndNotify(MembersInjectorImpl.java:80) at com.google.inject.internal.MembersInjectorImpl.injectMembers(MembersInjectorImpl.java:62) at com.google.inject.internal.InjectorImpl.injectMembers(InjectorImpl.java:987) at com.google.inject.util.Providers$GuicifiedProviderWithDependencies.initialize(Providers.java:149) at com.google.inject.util.Providers$GuicifiedProviderWithDependencies$$FastClassByGuice$$2a7177aa.invoke() at com.google.inject.internal.SingleMethodInjector$1.invoke(SingleMethodInjector.java:54) at com.google.inject.internal.SingleMethodInjector.inject(SingleMethodInjector.java:89) at com.google.inject.internal.MembersInjectorImpl.injectMembers(MembersInjectorImpl.java:132) at com.google.inject.internal.MembersInjectorImpl$1.call(MembersInjectorImpl.java:93) at com.google.inject.internal.MembersInjectorImpl$1.call(MembersInjectorImpl.java:80) at com.google.inject.internal.InjectorImpl.callInContext(InjectorImpl.java:1085) at com.google.inject.internal.MembersInjectorImpl.injectAndNotify(MembersInjectorImpl.java:80) at com.google.inject.internal.Initializer$InjectableReference.get(Initializer.java:223) at com.google.inject.internal.Initializer.injectAll(Initializer.java:132) at com.google.inject.internal.InternalInjectorCreator.injectDynamically(InternalInjectorCreator.java:174) at com.google.inject.internal.InternalInjectorCreator.build(InternalInjectorCreator.java:110) at com.google.inject.Guice.createInjector(Guice.java:99) at com.google.inject.Guice.createInjector(Guice.java:84) at play.api.inject.guice.GuiceBuilder.injector(GuiceInjectorBuilder.scala:185) at play.api.inject.guice.GuiceApplicationBuilder.build(GuiceApplicationBuilder.scala:137) at play.api.inject.guice.GuiceApplicationLoader.load(GuiceApplicationLoader.scala:21) at play.core.server.ProdServerStart$.start(ProdServerStart.scala:51) at play.core.server.ProdServerStart$.main(ProdServerStart.scala:25) at play.core.server.ProdServerStart.main(ProdServerStart.scala) Caused by: Configuration error: Configuration error[Failed to initialize pool: Unknown database 'facto'] at play.api.Configuration$.configError(Configuration.scala:156) at play.api.Configuration.reportError(Configuration.scala:990) at play.api.db.HikariCPConnectionPool.create(HikariCPModule.scala:63) at play.api.db.PooledDatabase.createDataSource(Databases.scala:205) at play.api.db.DefaultDatabase.dataSource$lzycompute(Databases.scala:123) at play.api.db.DefaultDatabase.dataSource(Databases.scala:121) at play.api.db.DefaultDatabase.getConnection(Databases.scala:142) at play.api.db.DefaultDatabase.getConnection(Databases.scala:138) at play.api.db.DefaultDBApi.$anonfun$connect$1(DefaultDBApi.scala:44) ... 39 more Caused by: com.zaxxer.hikari.pool.HikariPool$PoolInitializationException: Failed to initialize pool: Unknown database 'facto' at com.zaxxer.hikari.pool.HikariPool.throwPoolInitializationException(HikariPool.java:569) at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:555) at com.zaxxer.hikari.pool.HikariPool.(HikariPool.java:115) at com.zaxxer.hikari.HikariDataSource.(HikariDataSource.java:81) at play.api.db.HikariCPConnectionPool.$anonfun$create$1(HikariCPModule.scala:51) at scala.util.Try$.apply(Try.scala:209) at play.api.db.HikariCPConnectionPool.create(HikariCPModule.scala:47) ... 45 more Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown database 'facto' at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source) at java.lang.reflect.Constructor.newInstance(Unknown Source) at com.mysql.jdbc.Util.handleNewInstance(Util.java:400) at com.mysql.jdbc.Util.getInstance(Util.java:383) at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:980) at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3847) at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3783) at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:871) at com.mysql.jdbc.MysqlIO.proceedHandshakeWithPluggableAuthentication(MysqlIO.java:1665) at com.mysql.jdbc.MysqlIO.doHandshake(MysqlIO.java:1207) at com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2249) at com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2280) at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2079) at com.mysql.jdbc.ConnectionImpl.(ConnectionImpl.java:794) at com.mysql.jdbc.JDBC4Connection.(JDBC4Connection.java:44) at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source) at java.lang.reflect.Constructor.newInstance(Unknown Source) at com.mysql.jdbc.Util.handleNewInstance(Util.java:400) at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:399) at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:325) at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:117) at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:365) at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:194) at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:460) at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:534) ... 50 more ```
I manually created the facto database, suspecting the command was trying to delete the database first (per the wording of the -D option), and then ran it again. Strangely, it appeared to start the server. ```D:\Installs\Family Accounting Tool>bin\server -DdropAndCreateNewDb [info] application - Creating Pool for datasource 'default' [info] p.a.d.DefaultDBApi - Database [default] connected at jdbc:mysql://localhost/facto?user=root&password=**** [info] play.api.Play - Application started (Prod) [info] p.c.s.AkkaHttpServer - Listening for HTTP on /0:0:0:0:0:0:0:0:9000 ```
I then killed the server and ran the createAdminUser command, and got the same results. ```D:\Installs\Family Accounting Tool>bin\server -DcreateAdminUser [info] application - Creating Pool for datasource 'default' [info] p.a.d.DefaultDBApi - Database [default] connected at jdbc:mysql://localhost/facto?user=root&password=**** [info] play.api.Play - Application started (Prod) [info] p.c.s.AkkaHttpServer - Listening for HTTP on /0:0:0:0:0:0:0:0:9000 ```
Finally, I ran the server without any arguments and attempted to connect via URL, which threw an error in both the UI and the CLI. ```D:\Installs\Family Accounting Tool>bin\server [info] application - Creating Pool for datasource 'default' [info] p.a.d.DefaultDBApi - Database [default] connected at jdbc:mysql://localhost/facto?user=root&password=**** [info] play.api.Play - Application started (Prod) [info] p.c.s.AkkaHttpServer - Listening for HTTP on /0:0:0:0:0:0:0:0:9000 [warn] c.z.h.HikariConfig - The initializationFailFast propery is deprecated, see initializationFailTimeout [error] application - ! @81pb04p62 - Internal server error, for (POST) [/login/?returnTo=%2Fapp%2Fuseradministration] -> play.api.UnexpectedException: Unexpected exception[MySQLSyntaxErrorException: Table 'facto.users' doesn't exist] at play.api.http.HttpErrorHandlerExceptions$.throwableToUsefulException(HttpErrorHandler.scala:247) at play.api.http.DefaultHttpErrorHandler.onServerError(HttpErrorHandler.scala:178) at play.core.server.AkkaHttpServer$$anonfun$1.applyOrElse(AkkaHttpServer.scala:363) at play.core.server.AkkaHttpServer$$anonfun$1.applyOrElse(AkkaHttpServer.scala:361) at scala.concurrent.Future.$anonfun$recoverWith$1(Future.scala:412) at scala.concurrent.impl.Promise.$anonfun$transformWith$1(Promise.scala:37) at scala.concurrent.impl.CallbackRunnable.run(Promise.scala:60) at akka.dispatch.BatchingExecutor$AbstractBatch.processBatch(BatchingExecutor.scala:55) at akka.dispatch.BatchingExecutor$BlockableBatch.$anonfun$run$1(BatchingExecutor.scala:91) at scala.runtime.java8.JFunction0$mcV$sp.apply(JFunction0$mcV$sp.java:12) Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'facto.users' doesn't exist at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source) at java.lang.reflect.Constructor.newInstance(Unknown Source) at com.mysql.jdbc.Util.handleNewInstance(Util.java:400) at com.mysql.jdbc.Util.getInstance(Util.java:383) at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:980) at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3847) at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3783) at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2447) ```

As you can see, the error states the facto.users table doesn't exist. I checked with a SQL client and confirmed the database is indeed empty. From this, and the initial error I saw, it seems like none of the arguments given in the setup were actually executed: the database wasn't made, the tables weren't created, and the admin user wasn't made.

Is there perhaps a different way the Windows implementation needs to have the arguments passed? I know Java but not Scala, so I'm not sure where the breakdown might be.